void createStaticLibrary() { Logger::println("*** Creating static library ***"); // error string std::string errstr; // find archiver llvm::sys::Path ar = getArchiver(); // build arguments std::vector<const char*> args; // first the program name ?? args.push_back(ar.c_str()); // ask ar to create a new library args.push_back("rcs"); // output filename std::string libName; if (global.params.objname) { // explicit libName = global.params.objname; } else { // inferred // try root module name if (Module::rootModule) libName = Module::rootModule->toChars(); else if (global.params.objfiles->dim) libName = FileName::removeExt((char*)global.params.objfiles->data[0]); else libName = "a.out"; } std::string libExt = std::string(".") + global.lib_ext; if (!endsWith(libName, libExt)) { if (global.params.os != OSWindows) libName = "lib" + libName + libExt; else libName.append(libExt); } args.push_back(libName.c_str()); // object files for (unsigned i = 0; i < global.params.objfiles->dim; i++) { char *p = (char *)global.params.objfiles->data[i]; args.push_back(p); } // create path to the library llvm::sys::Path libdir(llvm::sys::path::parent_path(libName.c_str())); if (!libdir.empty() && !llvm::sys::fs::exists(libdir.str())) { libdir.createDirectoryOnDisk(true, &errstr); if (!errstr.empty()) { error("failed to create path to linking output: %s\n%s", libdir.c_str(), errstr.c_str()); fatal(); } } // print the command? if (!quiet || global.params.verbose) { // Print it for (int i = 0; i < args.size(); i++) printf("%s ", args[i]); printf("\n"); fflush(stdout); } // terminate args list args.push_back(NULL); // try to call archiver if (int status = llvm::sys::Program::ExecuteAndWait(ar, &args[0], NULL, NULL, 0,0, &errstr)) { error("archiver failed:\nstatus: %d", status); if (!errstr.empty()) error("message: %s", errstr.c_str()); } }
void createStaticLibrary() { Logger::println("*** Creating static library ***"); #if LDC_LLVM_VER >= 305 const bool isTargetWindows = global.params.targetTriple.isWindowsMSVCEnvironment(); #else const bool isTargetWindows = global.params.targetTriple.getOS() == llvm::Triple::Win32; #endif // find archiver std::string tool(isTargetWindows ? getLib() : getArchiver()); // build arguments std::vector<std::string> args; // ask ar to create a new library if (!isTargetWindows) args.push_back("rcs"); // ask lib to be quiet if (isTargetWindows) args.push_back("/NOLOGO"); // output filename std::string libName; if (global.params.objname) { // explicit libName = global.params.objname; } else { // inferred // try root module name if (Module::rootModule) libName = Module::rootModule->toChars(); else if (global.params.objfiles->dim) libName = FileName::removeExt(static_cast<const char*>(global.params.objfiles->data[0])); else libName = "a.out"; } std::string libExt = std::string(".") + global.lib_ext; if (!endsWith(libName, libExt)) { if (!isTargetWindows) { libName = llvm::sys::path::parent_path(libName).str() + "/lib" + llvm::sys::path::filename(libName).str() + libExt; } else libName.append(libExt); } if (isTargetWindows) args.push_back("/OUT:" + libName); else args.push_back(libName); // object files for (unsigned i = 0; i < global.params.objfiles->dim; i++) { const char *p = static_cast<const char *>(global.params.objfiles->data[i]); args.push_back(p); } // create path to the library CreateDirectoryOnDisk(libName); // try to call archiver executeToolAndWait(tool, args, global.params.verbose); }
void createStaticLibrary() { Logger::println("*** Creating static library ***"); #if LDC_LLVM_VER >= 305 const bool isTargetWindows = global.params.targetTriple.isWindowsMSVCEnvironment(); #else const bool isTargetWindows = global.params.targetTriple.getOS() == llvm::Triple::Win32; #endif // find archiver std::string tool(isTargetWindows ? getLib() : getArchiver()); // build arguments std::vector<std::string> args; // ask ar to create a new library if (!isTargetWindows) args.push_back("rcs"); // ask lib to be quiet if (isTargetWindows) args.push_back("/NOLOGO"); // output filename std::string libName; if (global.params.objname) { // explicit libName = global.params.objname; } else { // inferred // try root module name if (Module::rootModule) libName = Module::rootModule->toChars(); else if (global.params.objfiles->dim) libName = FileName::removeExt(static_cast<const char*>(global.params.objfiles->data[0])); else libName = "a.out"; } // KN: The following lines were added to fix a test case failure (runnable/test13774.sh). // Root cause is that dmd handles it in this why. // As a side effect this change broke compiling with dub. // if (!FileName::absolute(libName.c_str())) // libName = FileName::combine(global.params.objdir, libName.c_str()); std::string libExt = std::string(".") + global.lib_ext; if (!endsWith(libName, libExt)) libName.append(libExt); if (isTargetWindows) args.push_back("/OUT:" + libName); else args.push_back(libName); // object files for (unsigned i = 0; i < global.params.objfiles->dim; i++) { const char *p = static_cast<const char *>(global.params.objfiles->data[i]); args.push_back(p); } // create path to the library CreateDirectoryOnDisk(libName); // try to call archiver executeToolAndWait(tool, args, global.params.verbose); }
int createStaticLibrary() { Logger::println("*** Creating static library ***"); const bool isTargetWindows = global.params.targetTriple.isWindowsMSVCEnvironment(); // find archiver std::string tool(isTargetWindows ? "lib.exe" : getArchiver()); // build arguments std::vector<std::string> args; // ask ar to create a new library if (!isTargetWindows) { args.push_back("rcs"); } // ask lib to be quiet if (isTargetWindows) { args.push_back("/NOLOGO"); } // enable Link-time Code Generation (aka. whole program optimization) if (isTargetWindows && global.params.optimize) { args.push_back("/LTCG"); } // output filename std::string libName; if (global.params.objname) { // explicit libName = global.params.objname; } else { // inferred // try root module name if (Module::rootModule) { libName = Module::rootModule->toChars(); } else if (global.params.objfiles->dim) { libName = FileName::removeExt( static_cast<const char *>(global.params.objfiles->data[0])); } else { libName = "a.out"; } } // KN: The following lines were added to fix a test case failure // (runnable/test13774.sh). // Root cause is that dmd handles it in this why. // As a side effect this change broke compiling with dub. // if (!FileName::absolute(libName.c_str())) // libName = FileName::combine(global.params.objdir, libName.c_str()); if (llvm::sys::path::extension(libName).empty()) { libName.append(std::string(".") + global.lib_ext); } if (isTargetWindows) { args.push_back("/OUT:" + libName); } else { args.push_back(libName); } // object files for (unsigned i = 0; i < global.params.objfiles->dim; i++) { const char *p = static_cast<const char *>(global.params.objfiles->data[i]); args.push_back(p); } // create path to the library CreateDirectoryOnDisk(libName); // try to call archiver int exitCode; if (isTargetWindows) { exitCode = executeMsvcToolAndWait(tool, args, global.params.verbose); } else { exitCode = executeToolAndWait(tool, args, global.params.verbose); } return exitCode; }