X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=buildtool.cpp;h=39ae5be6ef87214665a371ed77809106453d419a;hb=0e2a2cc7bb4f35dbc5150de387b2e651714b6d5b;hp=747e9577ef09d9f6b604e199ec8622d310f7b572;hpb=8eb1790ab4546ca69fd6f95a9ab5c36c9e7defad;p=inkscape.git diff --git a/buildtool.cpp b/buildtool.cpp index 747e9577e..39ae5be6e 100644 --- a/buildtool.cpp +++ b/buildtool.cpp @@ -4,7 +4,7 @@ * Authors: * Bob Jamison * - * Copyright (C) 2006 Bob Jamison + * Copyright (C) 2006-2007 Bob Jamison * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -30,16 +30,24 @@ * btool * or * btool {target} + * + * Note: if you are using MinGW, and a not very recent version of it, + * gettimeofday() might be missing. If so, just build this file with + * this command: + * g++ -O3 -DNEED_GETTIMEOFDAY buildtool.cpp -o btool.exe + * */ - +#define BUILDTOOL_VERSION "BuildTool v0.6.13, 2007 Bob Jamison" #include +#include #include #include #include #include #include +#include #include #include @@ -58,8 +66,9 @@ //######################################################################## //# Definition of gettimeofday() for those who don't have it //######################################################################## -#ifdef __WIN32__ +#ifdef NEED_GETTIMEOFDAY #include + struct timezone { int tz_minuteswest; /* minutes west of Greenwich */ int tz_dsttime; /* type of dst correction */ @@ -82,6 +91,7 @@ static int gettimeofday (struct timeval *tv, struct timezone *tz) } return 0; } + #endif @@ -952,18 +962,18 @@ friend class Parser; public: Element() { - parent = NULL; + init(); } Element(const String &nameArg) { - parent = NULL; + init(); name = nameArg; } Element(const String &nameArg, const String &valueArg) { - parent = NULL; + init(); name = nameArg; value = valueArg; } @@ -1031,9 +1041,18 @@ public: * @param elem the element to output */ void print(); + + int getLine() + { return line; } protected: + void init() + { + parent = NULL; + line = 0; + } + void assign(const Element &other) { parent = other.parent; @@ -1042,6 +1061,7 @@ protected: namespaces = other.namespaces; name = other.name; value = other.value; + line = other.line; } void findElementsRecursive(std::vector&res, const String &name); @@ -1057,7 +1077,8 @@ protected: String name; String value; - + + int line; }; @@ -1125,15 +1146,17 @@ private: currentPosition = 0; } - void getLineAndColumn(long pos, long *lineNr, long *colNr); + int countLines(int begin, int end); + + void getLineAndColumn(int pos, int *lineNr, int *colNr); void error(char *fmt, ...); - int peek(long pos); + int peek(int pos); - int match(long pos, const char *text); + int match(int pos, const char *text); - int skipwhite(long p); + int skipwhite(int p); int getWord(int p0, String &buf); @@ -1149,12 +1172,10 @@ private: bool keepGoing; Element *currentNode; - long parselen; + int parselen; XMLCh *parsebuf; - String cdatabuf; - long currentPosition; - int colNr; - + String cdatabuf; + int currentPosition; }; @@ -1170,6 +1191,7 @@ Element *Element::clone() elem->parent = parent; elem->attributes = attributes; elem->namespaces = namespaces; + elem->line = line; std::vector::iterator iter; for (iter = children.begin(); iter != children.end() ; iter++) @@ -1348,10 +1370,24 @@ String Parser::trim(const String &s) return res; } -void Parser::getLineAndColumn(long pos, long *lineNr, long *colNr) + +int Parser::countLines(int begin, int end) +{ + int count = 0; + for (int i=begin ; i= parselen) return -1; @@ -1420,7 +1456,7 @@ String Parser::encode(const String &str) } -int Parser::match(long p0, const char *text) +int Parser::match(int p0, const char *text) { int p = p0; while (*text) @@ -1434,7 +1470,7 @@ int Parser::match(long p0, const char *text) -int Parser::skipwhite(long p) +int Parser::skipwhite(int p) { while (pline = lineNr + countLines(p0, p); n->parent = par; par->addChild(n); @@ -1709,7 +1751,7 @@ int Parser::parseElement(int p0, Element *par,int depth) //# CHILD ELEMENT if (ch == '<') { - p2 = parseElement(p, n, depth+1); + p2 = parseElement(p, n, lineNr + countLines(p0, p)); if (p2 == p) { /* @@ -1801,7 +1843,7 @@ Element *Parser::parse(XMLCh *buf,int pos,int len) Element *rootNode = new Element("root"); pos = parseVersion(pos); pos = parseDoctype(pos); - pos = parseElement(pos, rootNode, 0); + pos = parseElement(pos, rootNode, 1); return rootNode; } @@ -1868,8 +1910,6 @@ Element *Parser::parseFile(const String &fileName) return n; } - - //######################################################################## //######################################################################## //## E N D X M L @@ -1877,6 +1917,10 @@ Element *Parser::parseFile(const String &fileName) //######################################################################## + + + + //######################################################################## //######################################################################## //## U R I @@ -2322,6 +2366,7 @@ URI URI::resolve(const URI &other) const } + /** * This follows the Java URI algorithm: * 1. All "." segments are removed. @@ -2440,6 +2485,7 @@ void URI::trace(const char *fmt, ...) + //######################################################################### //# P A R S I N G //######################################################################### @@ -2827,8 +2873,9 @@ private: class MakeBase { public: + MakeBase() - {} + { line = 0; } virtual ~MakeBase() {} @@ -2858,6 +2905,18 @@ public: * Get an element value, performing substitutions if necessary */ bool getValue(Element *elem, String &result); + + /** + * Set the current line number in the file + */ + void setLine(int val) + { line = val; } + + /** + * Get the current line number in the file + */ + int getLine() + { return line; } protected: @@ -3030,6 +3089,7 @@ private: */ bool getSubstitutions(const String &s, String &result); + int line; }; @@ -3044,7 +3104,7 @@ void MakeBase::error(char *fmt, ...) { va_list args; va_start(args,fmt); - fprintf(stderr, "Make error: "); + fprintf(stderr, "Make error line %d: ", line); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); va_end(args) ; @@ -3386,6 +3446,9 @@ bool MakeBase::executeCommand(const String &command, } strcpy(paramBuf, (char *)command.c_str()); + //# Go to http://msdn2.microsoft.com/en-us/library/ms682499.aspx + //# to see how Win32 pipes work + //# Create pipes SECURITY_ATTRIBUTES saAttr; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); @@ -3436,6 +3499,8 @@ bool MakeBase::executeCommand(const String &command, ret = false; } + delete[] paramBuf; + DWORD bytesWritten; if (inbuf.size()>0 && !WriteFile(stdinWrite, inbuf.c_str(), inbuf.size(), @@ -3459,46 +3524,52 @@ bool MakeBase::executeCommand(const String &command, error("executeCommand: could not close read pipe"); return false; } + + bool lastLoop = false; while (true) { - //trace("## stderr"); DWORD avail; - if (!PeekNamedPipe(stderrRead, NULL, 0, NULL, &avail, NULL)) - break; + DWORD bytesRead; + char readBuf[4096]; + + //trace("## stderr"); + PeekNamedPipe(stderrRead, NULL, 0, NULL, &avail, NULL); if (avail > 0) { - DWORD bytesRead = 0; - char readBuf[1025]; - if (avail>1024) avail = 1024; - if (!ReadFile(stderrRead, readBuf, avail, &bytesRead, NULL) - || bytesRead == 0) + bytesRead = 0; + if (avail>4096) avail = 4096; + ReadFile(stderrRead, readBuf, avail, &bytesRead, NULL); + if (bytesRead > 0) { - break; + for (unsigned int i=0 ; i 0) { - DWORD bytesRead = 0; - char readBuf[1025]; - if (avail>1024) avail = 1024; - if (!ReadFile(stdoutRead, readBuf, avail, &bytesRead, NULL) - || bytesRead==0) + bytesRead = 0; + if (avail>4096) avail = 4096; + ReadFile(stdoutRead, readBuf, avail, &bytesRead, NULL); + if (bytesRead > 0) { - break; + for (unsigned int i=0 ; i allFiles; @@ -5021,7 +5087,7 @@ private: * The list of .o files, and the * dependencies upon them. */ - std::map depFiles; + std::map oFiles; int depFileSize; char *depFileBuf; @@ -5046,13 +5112,15 @@ void DepTool::init() fileList.clear(); directories.clear(); - //clear refs - depFiles.clear(); - //clear records + //clear output file list std::map::iterator iter; - for (iter=allFiles.begin() ; iter!=allFiles.end() ; iter++) - delete iter->second; + for (iter=oFiles.begin(); iter!=oFiles.end() ; iter++) + delete iter->second; + oFiles.clear(); + //allFiles actually contains the master copies. delete them + for (iter= allFiles.begin(); iter!=allFiles.end() ; iter++) + delete iter->second; allFiles.clear(); } @@ -5217,7 +5285,8 @@ bool DepTool::sequ(int pos, char *key) */ bool DepTool::addIncludeFile(FileRec *frec, const String &iname) { - + //# if the name is an exact match to a path name + //# in allFiles, like "myinc.h" std::map::iterator iter = allFiles.find(iname); if (iter != allFiles.end()) //already exists @@ -5230,6 +5299,7 @@ bool DepTool::addIncludeFile(FileRec *frec, const String &iname) } else { + //## Ok, it was not found directly //look in other dirs std::vector::iterator diter; for (diter=directories.begin() ; @@ -5238,12 +5308,17 @@ bool DepTool::addIncludeFile(FileRec *frec, const String &iname) String dfname = *diter; dfname.append("/"); dfname.append(iname); - iter = allFiles.find(dfname); + URI fullPathURI(dfname); //normalize path name + String fullPath = fullPathURI.getPath(); + if (fullPath[0] == '/') + fullPath = fullPath.substr(1); + //trace("Normalized %s to %s", dfname.c_str(), fullPath.c_str()); + iter = allFiles.find(fullPath); if (iter != allFiles.end()) { FileRec *other = iter->second; //trace("other: '%s'", iname.c_str()); - frec->files[dfname] = other; + frec->files[fullPath] = other; return true; } } @@ -5350,9 +5425,7 @@ bool DepTool::scanFile(const String &fname, FileRec *frec) * Recursively check include lists to find all files in allFiles to which * a given file is dependent. */ -bool DepTool::processDependency(FileRec *ofile, - FileRec *include, - int depth) +bool DepTool::processDependency(FileRec *ofile, FileRec *include) { std::map::iterator iter; for (iter=include->files.begin() ; iter!=include->files.end() ; iter++) @@ -5366,7 +5439,7 @@ bool DepTool::processDependency(FileRec *ofile, FileRec *child = iter->second; ofile->files[fname] = child; - processDependency(ofile, child, depth+1); + processDependency(ofile, child); } @@ -5399,23 +5472,23 @@ bool DepTool::generateDependencies() FileRec *include = iter->second; if (include->type == FileRec::CFILE) { - String cFileName = iter->first; - FileRec *ofile = new FileRec(FileRec::OFILE); - ofile->path = include->path; - ofile->baseName = include->baseName; - ofile->suffix = include->suffix; - String fname = include->path; + String cFileName = iter->first; + FileRec *ofile = new FileRec(FileRec::OFILE); + ofile->path = include->path; + ofile->baseName = include->baseName; + ofile->suffix = include->suffix; + String fname = include->path; if (fname.size()>0) fname.append("/"); fname.append(include->baseName); fname.append(".o"); - depFiles[fname] = ofile; + oFiles[fname] = ofile; //add the .c file first? no, don't //ofile->files[cFileName] = include; //trace("ofile:%s", fname.c_str()); - processDependency(ofile, include, 0); + processDependency(ofile, include); } } @@ -5463,7 +5536,7 @@ bool DepTool::saveDepFile(const String &fileName) fprintf(f, "\n\n", sourceDir.c_str()); std::map::iterator iter; - for (iter=depFiles.begin() ; iter!=depFiles.end() ; iter++) + for (iter=oFiles.begin() ; iter!=oFiles.end() ; iter++) { FileRec *frec = iter->second; if (frec->type == FileRec::OFILE) @@ -5514,7 +5587,7 @@ std::vector DepTool::loadDepFile(const String &depFile) if (root->getChildren().size()==0 || root->getChildren()[0]->getName()!="dependencies") { - error("Main xml element should be "); + error("loadDepFile: main xml element should be "); delete root; return result; } @@ -5527,47 +5600,53 @@ std::vector DepTool::loadDepFile(const String &depFile) { Element *objectElem = objects[i]; String tagName = objectElem->getName(); - if (tagName == "object") - { - String objName = objectElem->getAttribute("name"); - //trace("object:%s", objName.c_str()); - DepRec depObject(objName); - depObject.path = objectElem->getAttribute("path"); - depObject.suffix = objectElem->getAttribute("suffix"); - //########## DESCRIPTION - std::vector depElems = objectElem->getChildren(); - for (unsigned int i=0 ; i should have only children"); + return result; + } + + String objName = objectElem->getAttribute("name"); + //trace("object:%s", objName.c_str()); + DepRec depObject(objName); + depObject.path = objectElem->getAttribute("path"); + depObject.suffix = objectElem->getAttribute("suffix"); + //########## DESCRIPTION + std::vector depElems = objectElem->getChildren(); + for (unsigned int i=0 ; igetName(); + if (tagName != "dep") { - Element *depElem = depElems[i]; - tagName = depElem->getName(); - if (tagName == "dep") - { - String depName = depElem->getAttribute("name"); - //trace(" dep:%s", depName.c_str()); - depObject.files.push_back(depName); - } + error("loadDepFile: should have only children"); + return result; } - //Insert into the result list, in a sorted manner - bool inserted = false; - std::vector::iterator iter; - for (iter = result.begin() ; iter != result.end() ; iter++) + String depName = depElem->getAttribute("name"); + //trace(" dep:%s", depName.c_str()); + depObject.files.push_back(depName); + } + + //Insert into the result list, in a sorted manner + bool inserted = false; + std::vector::iterator iter; + for (iter = result.begin() ; iter != result.end() ; iter++) + { + String vpath = iter->path; + vpath.append("/"); + vpath.append(iter->name); + String opath = depObject.path; + opath.append("/"); + opath.append(depObject.name); + if (vpath > opath) { - String vpath = iter->path; - vpath.append("/"); - vpath.append(iter->name); - String opath = depObject.path; - opath.append("/"); - opath.append(depObject.name); - if (vpath > opath) - { - inserted = true; - iter = result.insert(iter, depObject); - break; - } + inserted = true; + iter = result.insert(iter, depObject); + break; } - if (!inserted) - result.push_back(depObject); } + if (!inserted) + result.push_back(depObject); } delete root; @@ -5637,6 +5716,7 @@ public: TASK_SHAREDLIB, TASK_STATICLIB, TASK_STRIP, + TASK_TOUCH, TASK_TSTAMP } TaskType; @@ -5705,7 +5785,7 @@ public: /** * */ - Task *createTask(Element *elem); + Task *createTask(Element *elem, int lineNr); protected: @@ -5762,7 +5842,7 @@ public: virtual ~TaskCC() {} - virtual bool needsCompiling(const DepRec &depRec, + virtual bool needsCompiling(const FileRec &depRec, const String &src, const String &dest) { return false; @@ -5772,6 +5852,9 @@ public: { if (!listFiles(parent, fileSet)) return false; + + FILE *f = NULL; + f = fopen("compile.lst", "w"); bool refreshCache = false; String fullName = parent.resolve("build.dep"); @@ -5831,8 +5914,8 @@ public: //## Select command String sfx = dep.suffix; String command = ccCommand; - if (sfx == "cpp" || sfx == "c++" || sfx == "cc" - || sfx == "CC") + if (sfx == "cpp" || sfx == "cxx" || sfx == "c++" || + sfx == "cc" || sfx == "CC") command = cxxCommand; //## Make paths @@ -5870,6 +5953,7 @@ public: srcName.append(dep.suffix); String srcFullName = parent.resolve(srcName); bool compileMe = false; + //# First we check if the source is newer than the .o if (isNewerThan(srcFullName, destFullName)) { status(" : compile of %s required by %s", @@ -5878,17 +5962,22 @@ public: } else { + //# secondly, we check if any of the included dependencies + //# of the .c/.cpp is newer than the .o for (unsigned int i=0 ; i0) + if (source.size()>0) { - depName.append(srcPath); + depName.append(source); depName.append("/"); } depName.append(dep.files[i]); String depFullName = parent.resolve(depName); - if (isNewerThan(depFullName, destFullName)) + bool depRequires = isNewerThan(depFullName, destFullName); + //trace("%d %s %s\n", depRequires, + // destFullName.c_str(), depFullName.c_str()); + if (depRequires) { status(" : compile of %s required by %s", destFullName.c_str(), depFullName.c_str()); @@ -5918,11 +6007,48 @@ public: //## Execute the command String outString, errString; - if (!executeCommand(cmd.c_str(), "", outString, errString)) + bool ret = executeCommand(cmd.c_str(), "", outString, errString); + + if (f) + { + fprintf(f, "########################### File : %s\n", + srcFullName.c_str()); + fprintf(f, "#### COMMAND ###\n"); + int col = 0; + for (int i = 0 ; i < cmd.size() ; i++) + { + char ch = cmd[i]; + if (isspace(ch) && col > 63) + { + fputc('\n', f); + col = 0; + } + else + { + fputc(ch, f); + col++; + } + if (col > 76) + { + fputc('\n', f); + col = 0; + } + } + fprintf(f, "\n"); + fprintf(f, "#### STDOUT ###\n%s\n", outString.c_str()); + fprintf(f, "#### STDERR ###\n%s\n\n", errString.c_str()); + } + if (!ret) { error("problem compiling: %s", errString.c_str()); return false; } + + } + + if (f) + { + fclose(f); } return true; @@ -6039,6 +6165,7 @@ public: } if (!isNewerThan(fullSource, fullDest)) { + status(" : skipped"); return true; } if (!copyFile(fullSource, fullDest)) @@ -6136,6 +6263,7 @@ public: } if (!isNewerThan(fullSource, fullDest)) { + status(" : skipped"); return true; } if (!copyFile(fullSource, fullDest)) @@ -6305,7 +6433,12 @@ public: delType = DEL_DIR; if (fileName.size()>0 && dirName.size()>0) { - error(" can only have one attribute of file= or dir="); + error(" can have one attribute of file= or dir="); + return false; + } + if (fileName.size()==0 && dirName.size()==0) + { + error(" must have one attribute of file= or dir="); return false; } String ret; @@ -6428,7 +6561,8 @@ public: } obj.append(fileSet[i]); String fullObj = parent.resolve(obj); - cmd.append(fullObj); + String nativeFullObj = getNativePath(fullObj); + cmd.append(nativeFullObj); //trace("link: tgt:%s obj:%s", fullTarget.c_str(), // fullObj.c_str()); if (isNewerThan(fullObj, fullTarget)) @@ -6500,7 +6634,7 @@ public: return false; if (!parent.getAttribute(elem, "strip", s)) return false; - if (!getBool(s, doStrip)) + if (s.size()>0 && !getBool(s, doStrip)) return false; if (!parent.getAttribute(elem, "symfile", symFileName)) return false; @@ -6663,6 +6797,7 @@ public: name = "msgfmt"; command = "msgfmt"; owndir = false; + outName = ""; } virtual ~TaskMsgFmt() @@ -6704,8 +6839,17 @@ public: destPath.append(subdir); destPath.append("/"); } - destPath.append(fileName); - destPath[destPath.size()-2] = 'm'; + //Pick the output file name + if (outName.size() > 0) + { + destPath.append(outName); + } + else + { + destPath.append(fileName); + destPath[destPath.size()-2] = 'm'; + } + String fullDest = parent.resolve(destPath); if (!isNewerThan(fullSource, fullDest)) @@ -6750,9 +6894,11 @@ public: command = s; if (!parent.getAttribute(elem, "todir", toDirName)) return false; + if (!parent.getAttribute(elem, "out", outName)) + return false; if (!parent.getAttribute(elem, "owndir", s)) return false; - if (!getBool(s, owndir)) + if (s.size()>0 && !getBool(s, owndir)) return false; std::vector children = elem->getChildren(); @@ -6771,10 +6917,11 @@ public: private: - String command; - String toDirName; + String command; + String toDirName; + String outName; FileSet fileSet; - bool owndir; + bool owndir; }; @@ -6918,7 +7065,7 @@ public: TaskSharedLib(MakeBase &par) : Task(par) { type = TASK_SHAREDLIB; name = "dll"; - command = "ar crv"; + command = "dllwrap"; } virtual ~TaskSharedLib() @@ -7039,6 +7186,7 @@ private: }; + /** * Run the "ar" command to archive .o's into a .a */ @@ -7115,6 +7263,7 @@ public: return true; } + virtual bool parse(Element *elem) { String s; @@ -7148,6 +7297,8 @@ private: }; + + /** * Strip an executable */ @@ -7213,6 +7364,62 @@ private: }; +/** + * + */ +class TaskTouch : public Task +{ +public: + + TaskTouch(MakeBase &par) : Task(par) + { type = TASK_TOUCH; name = "touch"; } + + virtual ~TaskTouch() + {} + + virtual bool execute() + { + String fullName = parent.resolve(fileName); + String nativeFile = getNativePath(fullName); + if (!isRegularFile(fullName) && !isDirectory(fullName)) + { + // S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH + int ret = creat(nativeFile.c_str(), 0666); + if (ret != 0) + { + error(" could not create '%s' : %s", + nativeFile.c_str(), strerror(ret)); + return false; + } + return true; + } + int ret = utime(nativeFile.c_str(), (struct utimbuf *)0); + if (ret != 0) + { + error(" could not update the modification time for '%s' : %s", + nativeFile.c_str(), strerror(ret)); + return false; + } + return true; + } + + virtual bool parse(Element *elem) + { + //trace("touch parse"); + if (!parent.getAttribute(elem, "file", fileName)) + return false; + if (fileName.size() == 0) + { + error(" requires 'file=\"fileName\"' attribute"); + return false; + } + return true; + } + + String fileName; +}; + + /** * */ @@ -7243,7 +7450,7 @@ public: /** * */ -Task *Task::createTask(Element *elem) +Task *Task::createTask(Element *elem, int lineNr) { String tagName = elem->getName(); //trace("task:%s", tagName.c_str()); @@ -7276,6 +7483,8 @@ Task *Task::createTask(Element *elem) task = new TaskStaticLib(parent); else if (tagName == "strip") task = new TaskStrip(parent); + else if (tagName == "touch") + task = new TaskTouch(parent); else if (tagName == "tstamp") task = new TaskTstamp(parent); else @@ -7284,6 +7493,8 @@ Task *Task::createTask(Element *elem) return NULL; } + task->setLine(lineNr); + if (!task->parse(elem)) { delete task; @@ -7508,7 +7719,7 @@ public: * */ virtual String version() - { return "BuildTool v0.6, 2006 Bob Jamison"; } + { return BUILDTOOL_VERSION; } /** * Overload a @@ -7580,11 +7791,6 @@ private: */ bool parseProperty(Element *elem); - /** - * - */ - bool parseTask(Task &task, Element *elem); - /** * */ @@ -8043,6 +8249,8 @@ bool Make::parseFile() { status("######## PARSE : %s", uri.getPath().c_str()); + setLine(0); + Parser parser; Element *root = parser.parseFile(uri.getNativePath()); if (!root) @@ -8051,6 +8259,8 @@ bool Make::parseFile() uri.getNativePath().c_str()); return false; } + + setLine(root->getLine()); if (root->getChildren().size()==0 || root->getChildren()[0]->getName()!="project") @@ -8077,6 +8287,7 @@ bool Make::parseFile() for (unsigned int i=0 ; igetLine()); String tagName = elem->getName(); //########## DESCRIPTION @@ -8111,7 +8322,7 @@ bool Make::parseFile() { Element *telem = telems[i]; Task breeder(*this); - Task *task = breeder.createTask(telem); + Task *task = breeder.createTask(telem, telem->getLine()); if (!task) return false; allTasks.push_back(task); @@ -8133,6 +8344,12 @@ bool Make::parseFile() //more work than targets[tname]=target, but avoids default allocator targets.insert(std::make_pair(tname, target)); } + //######### none of the above + else + { + error("unknown toplevel tag: <%s>", tagName.c_str()); + return false; + } } @@ -8426,7 +8643,7 @@ static bool depTest() deptool.setSourceDirectory("/dev/ink/inkscape/src"); if (!deptool.generateDependencies("build.dep")) return false; - std::vector res = + std::vector res = deptool.loadDepFile("build.dep"); if (res.size() == 0) return false;