Module Info error
Johnson Jones via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Aug 18 19:20:40 PDT 2017
On Saturday, 19 August 2017 at 02:07:25 UTC, Johnson Jones wrote:
> Still getting this!
>
> What I don't understand is why I can import certain libraries
> and they compile fine while others don't!
>
> So, moduleInfo is a "function" per module that is created at
> compilation, right?
>
> If one doesn't compile the module then the error results, just
> like standard extern functions. When I don't include the file
> in the project, it doesn't get compiled, even though it gets
> "imported"? Why? Why can't D just know, hey, module X imports
> module Y, module Y needs to be compiled to add moduleInfo?
>
>
>
> For example, I am trying to get ffmpeg to work. I downloaded
> from
>
> https://github.com/complistic-gaff/ffmpeg-d
>
> extracted, put that path in my includes(sc.ini). created a
> module to import the standard modules, tried to compile my
> project and I get a bunch of ModuleInfo errors relating to the
> imports I added.
>
> I use GtkD exactly the same, yet no errors.
>
> Now, the only difference is that I import the gtkD.lib. I'm
> assuming that all the moduleInfo's of the 1000+ gtk files are
> in that lib and so That is the reason I don't have the compile
> them all, is that correct?
>
> If so, how can I generate such a lib of moduleInfo's
> recursively for a directory so I can pick up all the files and
> just import it once?
>
> ffmpeg doesn't require compiling but I don't wanna have to
> include ever file in to my project just to be able to get it to
> work because of the moduleInfo's are missing.
>
> Looking at the build.d for gtkD, it looks like it builds a list
> of all the files to compile and does it recursively.
>
> I imagine it can be modified for ffmpeg too to create a utility
> to solve this problem. Dmd should have a mode to do this
> automatically, it's quite an annoying problem ;/
So, I was able to hack the build script and solve my problem. I
simply replaced the dir entries and such for ffmpeg instead.
module Build;
import core.stdc.stdlib: exit;
import std.algorithm;
import std.array;
import std.file;
import std.getopt;
import std.path;
import std.process;
import std.stdio;
import std.string;
string dcflags;
string ldflags;
int main(string[] args)
{
build("ffmpeg", "ffmpeg");
return(0);
}
void build(string dir, string lib)
{
version(Win64)
{
std.file.write("build.rf", format("-m64 -c -lib %s %s
-Igenerated/gtkd -of%s.lib %s", dcflags, ldflags, lib,
dFiles(dir)));
auto pid = spawnProcess(["dmd", "@build.rf"]);
if ( wait(pid) != 0 )
exit(1);
}
else
{
if (lib == "gtkd")
{
string[] subDirs = ["libavcodec", "libavdevice",
"libavfilter", "libavformat", "libavutil", "libswscale"];
foreach(directory; subDirs)
buildObj(dFiles(directory), directory);
string objects;
foreach(directory; subDirs)
objects ~= directory ~".obj ";
executeShell(format("dmd -lib %s -of%s.lib %s", ldflags, lib,
objects));
foreach(directory; subDirs)
std.file.remove(directory ~".obj");
}
else
{
buildObj(dFiles(dir), lib);
executeShell(format("dmd -lib %s -of%s.lib %s.obj", ldflags,
lib, lib));
std.file.remove(lib ~".obj");
}
}
std.file.remove("build.rf");
}
void buildObj(string files, string objName)
{
std.file.write("build.rf", format("-c %s -Igenerated/gtkd
-of%s.obj %s", dcflags, objName, files));
auto pid = spawnProcess(["dmd", "@build.rf"]);
if ( wait(pid) != 0 )
exit(1);
}
string dFiles(string sourceDir)
{
string files;
auto entries = dirEntries(sourceDir, SpanMode.breadth);
foreach ( DirEntry entry; entries )
{
if ( entry.isDir == false && entry.name.extension == ".d" )
{
files ~= entry.name ~ " ";
}
}
return files;
}
So the question is, is there a direct way to do this? e.g., have
dmd do it recursively for us, or rdmd, or a tool that is designed
to do stuff like this for the general case? (the above code could
be made more general, which I might do in the future)
More information about the Digitalmars-d-learn
mailing list