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