# HG changeset patch # User Christian Kamm # Date 1242846821 -7200 # Node ID 1311dabc6a1f01b986d99b90c16bba01001695d3 # Parent e2cf1f67ca339fb2cb02166d1fc05622e991a5e6 Merged xfBuild patch for dependency tree generation. See #286. diff -r e2cf1f67ca33 -r 1311dabc6a1f dmd/import.c --- a/dmd/import.c Wed May 20 16:20:59 2009 +0200 +++ b/dmd/import.c Wed May 20 21:13:41 2009 +0200 @@ -116,6 +116,25 @@ //printf("-Import::load('%s'), pkg = %p\n", toChars(), pkg); } +char* escapePath(char* fname, char* buffer, int bufLen) { + char* res = buffer; + bufLen -= 2; // for \0 and an occasional escape char + int dst = 0; + for (; dst < bufLen && *fname; ++dst, ++fname) { + switch (*fname) { + case '(': + case ')': + case '\\': + buffer[dst++] = '\\'; + // fall through + + default: + buffer[dst] = *fname; + } + } + buffer[dst] = '\0'; + return buffer; +} void Import::semantic(Scope *sc) { @@ -169,6 +188,68 @@ sc = sc->pop(); } //printf("-Import::semantic('%s'), pkg = %p\n", toChars(), pkg); + + + if (global.params.moduleDeps != NULL) { + char fnameBuf[262]; // MAX_PATH+2 + + OutBuffer *const ob = global.params.moduleDeps; + ob->printf("%s (%s) : ", + sc->module->toPrettyChars(), + escapePath(sc->module->srcfile->toChars(), fnameBuf, sizeof(fnameBuf) / sizeof(*fnameBuf)) + ); + + char* protStr = ""; + switch (sc->protection) { + case PROTpublic: protStr = "public"; break; + case PROTprivate: protStr = "private"; break; + case PROTpackage: protStr = "package"; break; + default: break; + } + ob->writestring(protStr); + if (isstatic) { + ob->writestring(" static"); + } + ob->writestring(" : "); + + if (this->packages) { + for (size_t i = 0; i < this->packages->dim; i++) { + Identifier *pid = (Identifier *)this->packages->data[i]; + ob->printf("%s.", pid->toChars()); + } + } + + ob->printf("%s (%s)", + this->id->toChars(), + mod ? escapePath(mod->srcfile->toChars(), fnameBuf, sizeof(fnameBuf) / sizeof(*fnameBuf)) : "???" + ); + + if (aliasId) { + ob->printf(" -> %s", aliasId->toChars()); + } else { + if (names.dim > 0) { + ob->writestring(" : "); + for (size_t i = 0; i < names.dim; i++) + { + if (i > 0) { + ob->writebyte(','); + } + + Identifier *name = (Identifier *)names.data[i]; + Identifier *alias = (Identifier *)aliases.data[i]; + + if (!alias) { + ob->printf("%s", name->toChars()); + alias = name; + } else { + ob->printf("%s=%s", alias->toChars(), name->toChars()); + } + } + } + } + + ob->writenl(); + } } void Import::semantic2(Scope *sc) @@ -260,7 +341,27 @@ buf->printf("%s.", pid->toChars()); } } - buf->printf("%s;", id->toChars()); + buf->printf("%s", id->toChars()); + if (names.dim > 0) { + buf->writebyte(':'); + for (size_t i = 0; i < names.dim; i++) + { + if (i > 0) { + buf->writebyte(','); + } + + Identifier *name = (Identifier *)names.data[i]; + Identifier *alias = (Identifier *)aliases.data[i]; + + if (!alias) { + buf->printf("%s", name->toChars()); + alias = name; + } else { + buf->printf("%s=%s", alias->toChars(), name->toChars()); + } + } + } + buf->writebyte(';'); buf->writenl(); } diff -r e2cf1f67ca33 -r 1311dabc6a1f dmd/mars.h --- a/dmd/mars.h Wed May 20 16:20:59 2009 +0200 +++ b/dmd/mars.h Wed May 20 21:13:41 2009 +0200 @@ -117,6 +117,7 @@ struct Array; +struct OutBuffer; // LDC enum ARCH @@ -204,7 +205,10 @@ Array *debuglibnames; // default libraries for debug builds const char *xmlname; // filename for XML output - + + OutBuffer *moduleDeps; // buffer and filename for emitting module deps + char *moduleDepsFile; + // Hidden debug switches bool debuga; bool debugb; diff -r e2cf1f67ca33 -r 1311dabc6a1f gen/cl_options.cpp --- a/gen/cl_options.cpp Wed May 20 16:20:59 2009 +0200 +++ b/gen/cl_options.cpp Wed May 20 21:13:41 2009 +0200 @@ -200,6 +200,11 @@ cl::Prefix); +cl::opt moduleDepsFile("deps", + cl::desc("Write module dependencies to filename"), + cl::value_desc("filename")); + + cl::opt > mArch("march", cl::desc("Architecture to generate code for:")); diff -r e2cf1f67ca33 -r 1311dabc6a1f gen/cl_options.h --- a/gen/cl_options.h Wed May 20 16:20:59 2009 +0200 +++ b/gen/cl_options.h Wed May 20 21:13:41 2009 +0200 @@ -35,6 +35,7 @@ extern cl::opt hdrFile; #endif extern cl::list versions; + extern cl::opt moduleDepsFile; extern cl::opt > mArch; diff -r e2cf1f67ca33 -r 1311dabc6a1f gen/main.cpp --- a/gen/main.cpp Wed May 20 16:20:59 2009 +0200 +++ b/gen/main.cpp Wed May 20 21:13:41 2009 +0200 @@ -143,7 +143,9 @@ global.params.libfiles = new Array(); global.params.objfiles = new Array(); global.params.ddocfiles = new Array(); - + + global.params.moduleDeps = NULL; + global.params.moduleDepsFile = NULL; // Set predefined version identifiers VersionCondition::addPredefinedGlobalIdent("LLVM"); @@ -222,6 +224,12 @@ global.params.hdrdir || global.params.hdrname; #endif + initFromString(global.params.moduleDepsFile, moduleDepsFile); + if (global.params.moduleDepsFile != NULL) + { + global.params.moduleDeps = new OutBuffer; + } + processVersions(debugArgs, "debug", DebugCondition::setGlobalLevel, DebugCondition::addGlobalIdent); @@ -830,6 +838,17 @@ if (global.errors) fatal(); + // write module dependencies to file if requested + if (global.params.moduleDepsFile != NULL) + { + assert (global.params.moduleDepsFile != NULL); + + File deps(global.params.moduleDepsFile); + OutBuffer* ob = global.params.moduleDeps; + deps.setbuffer((void*)ob->data, ob->offset); + deps.write(); + } + // collects llvm modules to be linked if singleobj is passed std::vector llvmModules;