digitalmars.D - Package module not working properly
- Jacob Carlborg (51/51) Aug 14 2013 I'm trying to the get the "package modules" working in the new package
- Andrej Mitrovic (2/4) Aug 14 2013 I think that should be 'module std.serialization.archives'.
- Dejan Lekic (3/8) Aug 14 2013 Good catch Andrej! :)
- Dejan Lekic (10/63) Aug 14 2013 Looks to me like you are trying to import the package. It never
- Dejan Lekic (2/86) Aug 14 2013 Ignore this, I did not see your package.d file there...
- Kapps (5/14) Aug 14 2013 Package imports work now with 'import std.serialization' actually
- Dejan Lekic (3/18) Aug 14 2013 Yeah, I was too fast, did not see the package.d, as I said in my
I'm trying to the get the "package modules" working in the new package std.serialization I'm working on. I have a sample file I'm compiling, looking like this: import std.serialization; import std.serialization.archives; class Foo { int a; } void main () { auto archive = new XmlArchive!(); auto serializer = new Serializer(archive); auto foo = new Foo; foo.a = 3; serializer.serialize(foo); auto foo2 = serializer.deserialize!(Foo)(archive.untypedData); assert(foo2.a == 3); assert(foo.a == foo2.a); } When I compile it I get these linker errors: Undefined symbols for architecture x86_64: "_D3std13serialization12__ModuleInfoZ", referenced from: _D4main12__ModuleInfoZ in main.o "_D3std13serialization8archives12__ModuleInfoZ", referenced from: _D4main12__ModuleInfoZ in main.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status --- errorlevel 1 If I instead only import the exact modules that are needed, like this: import std.serialization.serializer; import std.serialization.archives.xmlarchive; Everything works as expected. I have a module declaration in std/serialization/package.d, like this: module std.serialization; And in std/serialization/archives/package.d module std.archives; First, I don't know if I should have any module declarations at all in these "package modules". Or if they should be like above or something like "module std.archives.package;". If I remove the module declarations in the package modules I get this assertion in the compiler: Assertion failed: (p->isPkgMod == PKGmodule), function load, file import.c, line 136. Abort trap: I don't know if I'm doing something wrong of if this new feature isn't working properly. The code is available there: https://github.com/jacob-carlborg/phobos/tree/serialization -- /Jacob Carlborg
Aug 14 2013
On 8/14/13, Jacob Carlborg <doob me.com> wrote:And in std/serialization/archives/package.d module std.archives;I think that should be 'module std.serialization.archives'.
Aug 14 2013
On Wednesday, 14 August 2013 at 15:32:25 UTC, Andrej Mitrovic wrote:On 8/14/13, Jacob Carlborg <doob me.com> wrote:Good catch Andrej! :)And in std/serialization/archives/package.d module std.archives;I think that should be 'module std.serialization.archives'.
Aug 14 2013
On Wednesday, 14 August 2013 at 14:43:47 UTC, Jacob Carlborg wrote:I'm trying to the get the "package modules" working in the new package std.serialization I'm working on. I have a sample file I'm compiling, looking like this: import std.serialization; import std.serialization.archives; class Foo { int a; } void main () { auto archive = new XmlArchive!(); auto serializer = new Serializer(archive); auto foo = new Foo; foo.a = 3; serializer.serialize(foo); auto foo2 = serializer.deserialize!(Foo)(archive.untypedData); assert(foo2.a == 3); assert(foo.a == foo2.a); } When I compile it I get these linker errors: Undefined symbols for architecture x86_64: "_D3std13serialization12__ModuleInfoZ", referenced from: _D4main12__ModuleInfoZ in main.o "_D3std13serialization8archives12__ModuleInfoZ", referenced from: _D4main12__ModuleInfoZ in main.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status --- errorlevel 1 If I instead only import the exact modules that are needed, like this: import std.serialization.serializer; import std.serialization.archives.xmlarchive; Everything works as expected. I have a module declaration in std/serialization/package.d, like this: module std.serialization; And in std/serialization/archives/package.d module std.archives; First, I don't know if I should have any module declarations at all in these "package modules". Or if they should be like above or something like "module std.archives.package;". If I remove the module declarations in the package modules I get this assertion in the compiler: Assertion failed: (p->isPkgMod == PKGmodule), function load, file import.c, line 136. Abort trap: I don't know if I'm doing something wrong of if this new feature isn't working properly. The code is available there: https://github.com/jacob-carlborg/phobos/tree/serializationLooks to me like you are trying to import the package. It never worked. That is why over the time two groups of D developers emerged. Those who use the /path/to/package/all.d and those who use /path/to/package/_.d ... I belong to the first group, and would expect something like: import std.serialization.all; or import std.serialization._; Some guys rightfully argued about not being able to be more selective, but so far I think the approach above works perfectly.
Aug 14 2013
On Wednesday, 14 August 2013 at 15:35:37 UTC, Dejan Lekic wrote:On Wednesday, 14 August 2013 at 14:43:47 UTC, Jacob Carlborg wrote:Ignore this, I did not see your package.d file there...I'm trying to the get the "package modules" working in the new package std.serialization I'm working on. I have a sample file I'm compiling, looking like this: import std.serialization; import std.serialization.archives; class Foo { int a; } void main () { auto archive = new XmlArchive!(); auto serializer = new Serializer(archive); auto foo = new Foo; foo.a = 3; serializer.serialize(foo); auto foo2 = serializer.deserialize!(Foo)(archive.untypedData); assert(foo2.a == 3); assert(foo.a == foo2.a); } When I compile it I get these linker errors: Undefined symbols for architecture x86_64: "_D3std13serialization12__ModuleInfoZ", referenced from: _D4main12__ModuleInfoZ in main.o "_D3std13serialization8archives12__ModuleInfoZ", referenced from: _D4main12__ModuleInfoZ in main.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status --- errorlevel 1 If I instead only import the exact modules that are needed, like this: import std.serialization.serializer; import std.serialization.archives.xmlarchive; Everything works as expected. I have a module declaration in std/serialization/package.d, like this: module std.serialization; And in std/serialization/archives/package.d module std.archives; First, I don't know if I should have any module declarations at all in these "package modules". Or if they should be like above or something like "module std.archives.package;". If I remove the module declarations in the package modules I get this assertion in the compiler: Assertion failed: (p->isPkgMod == PKGmodule), function load, file import.c, line 136. Abort trap: I don't know if I'm doing something wrong of if this new feature isn't working properly. The code is available there: https://github.com/jacob-carlborg/phobos/tree/serializationLooks to me like you are trying to import the package. It never worked. That is why over the time two groups of D developers emerged. Those who use the /path/to/package/all.d and those who use /path/to/package/_.d ... I belong to the first group, and would expect something like: import std.serialization.all; or import std.serialization._; Some guys rightfully argued about not being able to be more selective, but so far I think the approach above works perfectly.
Aug 14 2013
On Wednesday, 14 August 2013 at 15:35:37 UTC, Dejan Lekic wrote:Looks to me like you are trying to import the package. It never worked. That is why over the time two groups of D developers emerged. Those who use the /path/to/package/all.d and those who use /path/to/package/_.d ... I belong to the first group, and would expect something like: import std.serialization.all; or import std.serialization._; Some guys rightfully argued about not being able to be more selective, but so far I think the approach above works perfectly.Package imports work now with 'import std.serialization' actually importing std.serialization.package which then publicly imports what it needs. I don't remember which version this feature is in but I think it was 2.063(?) or perhaps master.
Aug 14 2013
On Wednesday, 14 August 2013 at 15:45:58 UTC, Kapps wrote:On Wednesday, 14 August 2013 at 15:35:37 UTC, Dejan Lekic wrote:Yeah, I was too fast, did not see the package.d, as I said in my previous post... Sorry... :)Looks to me like you are trying to import the package. It never worked. That is why over the time two groups of D developers emerged. Those who use the /path/to/package/all.d and those who use /path/to/package/_.d ... I belong to the first group, and would expect something like: import std.serialization.all; or import std.serialization._; Some guys rightfully argued about not being able to be more selective, but so far I think the approach above works perfectly.Package imports work now with 'import std.serialization' actually importing std.serialization.package which then publicly imports what it needs. I don't remember which version this feature is in but I think it was 2.063(?) or perhaps master.
Aug 14 2013