diff --git a/devtools/create_project/cmake.cpp b/devtools/create_project/cmake.cpp index b91232d0ef3..8569df91e66 100644 --- a/devtools/create_project/cmake.cpp +++ b/devtools/create_project/cmake.cpp @@ -121,8 +121,12 @@ void CMakeProvider::createWorkspace(const BuildSetup &setup) { workspace << "# Generate options for the engines\n"; writeEngineOptions(workspace); + std::string includeDirsList; + for (StringList::const_iterator i = setup.includeDirs.begin(); i != setup.includeDirs.end(); ++i) + includeDirsList += *i + ' '; + workspace << "include_directories(${" << setup.projectDescription << "_SOURCE_DIR}/" << setup.filePrefix << " ${" << setup.projectDescription << "_SOURCE_DIR}/" << setup.filePrefix << "/engines " - "$ENV{"<librariesVar << "} ${SCUMMVM_LIBS})\n"; + std::string libraryDirsList; + for (StringList::const_iterator i = setup.libraryDirs.begin(); i != setup.libraryDirs.end(); ++i) + libraryDirsList += *i + ' '; + project << "target_link_libraries(" << name << " " << libraryDirsList << "${" << sdlLibrary->librariesVar << "} ${SCUMMVM_LIBS})\n"; project << "if (WIN32)\n"; project << "\ttarget_sources(" << name << " PUBLIC " << setup.filePrefix << "/dists/" << name << ".rc)\n"; diff --git a/devtools/create_project/codeblocks.cpp b/devtools/create_project/codeblocks.cpp index a0d7d20156f..31f29b64b03 100644 --- a/devtools/create_project/codeblocks.cpp +++ b/devtools/create_project/codeblocks.cpp @@ -135,6 +135,9 @@ void CodeBlocksProvider::createProjectFile(const std::string &name, const std::s writeWarnings(name, project); writeDefines(setup.defines, project); + for (StringList::const_iterator i = setup.includeDirs.begin(); i != setup.includeDirs.end(); ++i) + project << "\t\t\t\t\t\n"; + project << "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\t\n" @@ -154,6 +157,9 @@ void CodeBlocksProvider::createProjectFile(const std::string &name, const std::s project << "\t\t\t\t\tfirst << "\\lib" << i->first << ".a\" />\n"; } + for (StringList::const_iterator i = setup.libraryDirs.begin(); i != setup.libraryDirs.end(); ++i) + project << "\t\t\t\t\t\n"; + project << "\t\t\t\t\t\n" "\t\t\t\t\t\n" "\t\t\t\t\n"; diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index 1dbe5066555..c9ff76b8399 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -74,6 +74,13 @@ namespace { */ std::string unifyPath(const std::string &path); +/** + * Removes trailing slash from path if it exists + * + * @param path Path string. + */ +void removeTrailingSlash(std::string& path); + /** * Display the help text for the program. * @@ -114,9 +121,7 @@ int main(int argc, char *argv[]) { BuildSetup setup; setup.srcDir = unifyPath(srcDir); - - if (setup.srcDir.at(setup.srcDir.size() - 1) == '/') - setup.srcDir.erase(setup.srcDir.size() - 1); + removeTrailingSlash(setup.srcDir); setup.filePrefix = setup.srcDir; setup.outputDir = '.'; @@ -258,8 +263,7 @@ int main(int argc, char *argv[]) { } setup.filePrefix = unifyPath(argv[++i]); - if (setup.filePrefix.at(setup.filePrefix.size() - 1) == '/') - setup.filePrefix.erase(setup.filePrefix.size() - 1); + removeTrailingSlash(setup.filePrefix); } else if (!std::strcmp(argv[i], "--output-dir")) { if (i + 1 >= argc) { std::cerr << "ERROR: Missing \"path\" parameter for \"--output-dir\"!\n"; @@ -267,9 +271,23 @@ int main(int argc, char *argv[]) { } setup.outputDir = unifyPath(argv[++i]); - if (setup.outputDir.at(setup.outputDir.size() - 1) == '/') - setup.outputDir.erase(setup.outputDir.size() - 1); - + removeTrailingSlash(setup.outputDir); + } else if (!std::strcmp(argv[i], "--include-dir")) { + if (i + 1 >= argc) { + std::cerr << "ERROR: Missing \"path\" parameter for \"--include-dir\"!\n"; + return -1; + } + std::string includeDir = unifyPath(argv[++i]); + removeTrailingSlash(includeDir); + setup.includeDirs.push_back(includeDir); + } else if (!std::strcmp(argv[i], "--library-dir")) { + if (i + 1 >= argc) { + std::cerr << "ERROR: Missing \"path\" parameter for \"--library-dir\"!\n"; + return -1; + } + std::string libraryDir = unifyPath(argv[++i]); + removeTrailingSlash(libraryDir); + setup.libraryDirs.push_back(libraryDir); } else if (!std::strcmp(argv[i], "--build-events")) { setup.runBuildEvents = true; } else if (!std::strcmp(argv[i], "--installer")) { @@ -678,6 +696,11 @@ std::string unifyPath(const std::string &path) { return result; } +void removeTrailingSlash(std::string& path) { + if (path.size() > 0 && path.at(path.size() - 1) == '/') + path.erase(path.size() - 1); +} + void displayHelp(const char *exe) { using std::cout; @@ -702,6 +725,8 @@ void displayHelp(const char *exe) { " --output-dir path overwrite path, where the project files are placed\n" " By default this is \".\", i.e. the current working\n" " directory\n" + " --include-dir path add a path to the include search path" + " --library-dir path add a path to the library search path" "\n" "MSVC specific settings:\n" " --msvc-version version set the targeted MSVC version. Possible values:\n"; diff --git a/devtools/create_project/create_project.h b/devtools/create_project/create_project.h index 102c9ea9e56..9acace6d02f 100644 --- a/devtools/create_project/create_project.h +++ b/devtools/create_project/create_project.h @@ -232,6 +232,9 @@ struct BuildSetup { std::string filePrefix; ///< Prefix for the relative path arguments in the project files. std::string outputDir; ///< Path where to put the MSVC project files. + StringList includeDirs; ///< List of additional include paths + StringList libraryDirs; ///< List of additional library paths + EngineDescList engines; ///< Engine list for the build (this may contain engines, which are *not* enabled!). FeatureList features; ///< Feature list for the build (this may contain features, which are *not* enabled!). diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp index 84126946c47..293ccca05fc 100644 --- a/devtools/create_project/msbuild.cpp +++ b/devtools/create_project/msbuild.cpp @@ -358,13 +358,21 @@ void MSBuildProvider::outputGlobalPropFile(const BuildSetup &setup, std::ofstrea if (runBuildEvents) definesList += REVISION_DEFINE ";"; + std::string includeDirsList; + for (StringList::const_iterator i = setup.includeDirs.begin(); i != setup.includeDirs.end(); ++i) + includeDirsList += convertPathToWin(*i) + ';'; + + std::string libraryDirsList; + for (StringList::const_iterator i = setup.libraryDirs.begin(); i != setup.libraryDirs.end(); ++i) + libraryDirsList += convertPathToWin(*i) + ';'; + properties << "\n" << "\n" << "\t\n" << "\t\t<_PropertySheetDisplayName>" << setup.projectDescription << "_Global\n" << "\t\t$(" << LIBS_DEFINE << ")\\bin;$(" << LIBS_DEFINE << ")\\bin\\" << getMSVCArchName(arch) << ";$(" << LIBS_DEFINE << ")\\$(Configuration)\\bin;$(ExecutablePath)\n" - << "\t\t$(" << LIBS_DEFINE << ")\\lib\\" << getMSVCArchName(arch) << ";$(" << LIBS_DEFINE << ")\\lib\\" << getMSVCArchName(arch) << "\\$(Configuration);$(" << LIBS_DEFINE << ")\\lib;$(" << LIBS_DEFINE << ")\\$(Configuration)\\lib;$(LibraryPath)\n" - << "\t\t$(" << LIBS_DEFINE << ")\\include;$(" << LIBS_DEFINE << ")\\include\\" << (setup.useSDL2 ? "SDL2" : "SDL") << ";$(IncludePath)\n" + << "\t\t" << libraryDirsList << "$(" << LIBS_DEFINE << ")\\lib\\" << getMSVCArchName(arch) << ";$(" << LIBS_DEFINE << ")\\lib\\" << getMSVCArchName(arch) << "\\$(Configuration);$(" << LIBS_DEFINE << ")\\lib;$(" << LIBS_DEFINE << ")\\$(Configuration)\\lib;$(LibraryPath)\n" + << "\t\t" << includeDirsList << "$(" << LIBS_DEFINE << ")\\include;$(" << LIBS_DEFINE << ")\\include\\" << (setup.useSDL2 ? "SDL2" : "SDL") << ";$(IncludePath)\n" << "\t\t$(Configuration)" << getMSVCArchName(arch) << "\\\n" << "\t\t$(Configuration)" << getMSVCArchName(arch) << "\\$(ProjectName)\\\n" << "\t\n" diff --git a/devtools/create_project/visualstudio.cpp b/devtools/create_project/visualstudio.cpp index f8196d65e44..459e0fdacec 100644 --- a/devtools/create_project/visualstudio.cpp +++ b/devtools/create_project/visualstudio.cpp @@ -187,6 +187,10 @@ void VisualStudioProvider::outputGlobalPropFile(const BuildSetup &setup, std::of for (StringList::const_iterator i = _globalWarnings.begin(); i != _globalWarnings.end(); ++i) warnings += *i + ';'; + std::string includeDirsList; + for (StringList::const_iterator i = setup.includeDirs.begin(); i != setup.includeDirs.end(); ++i) + includeDirsList += convertPathToWin(*i) + ';'; + std::string definesList; for (StringList::const_iterator i = defines.begin(); i != defines.end(); ++i) { if (i != defines.begin()) @@ -210,7 +214,7 @@ void VisualStudioProvider::outputGlobalPropFile(const BuildSetup &setup, std::of << "\t\tName=\"VCCLCompilerTool\"\n" << "\t\tDisableLanguageExtensions=\"" << (setup.devTools ? "false" : "true") << "\"\n" << "\t\tDisableSpecificWarnings=\"" << warnings << "\"\n" - << "\t\tAdditionalIncludeDirectories=\".\\;" << prefix << ";" << prefix << "\\engines;$(" << LIBS_DEFINE << ")\\include;$(" << LIBS_DEFINE << ")\\include\\SDL;" << (setup.tests ? prefix + "\\test\\cxxtest;" : "") << "\"\n" + << "\t\tAdditionalIncludeDirectories=\".\\;" << prefix << ";" << prefix << "\\engines;" << includeDirsList << "$(" << LIBS_DEFINE << ")\\include;$(" << LIBS_DEFINE << ")\\include\\SDL;" << (setup.tests ? prefix + "\\test\\cxxtest;" : "") << "\"\n" << "\t\tPreprocessorDefinitions=\"" << definesList << "\"\n" << "\t\tExceptionHandling=\"" << ((setup.devTools || setup.tests || _version == 14) ? "1" : "0") << "\"\n"; @@ -241,7 +245,11 @@ void VisualStudioProvider::outputGlobalPropFile(const BuildSetup &setup, std::of if (!setup.devTools && !setup.tests) properties << "\t\tEntryPointSymbol=\"WinMainCRTStartup\"\n"; - properties << "\t\tAdditionalLibraryDirectories=\"$(" << LIBS_DEFINE << ")\\lib\\" << getMSVCArchName(arch) << "\"\n" + std::string libraryDirsList; + for (StringList::const_iterator i = setup.libraryDirs.begin(); i != setup.libraryDirs.end(); ++i) + libraryDirsList += convertPathToWin(*i) + ';'; + + properties << "\t\tAdditionalLibraryDirectories=\"" << libraryDirsList << "$(" << LIBS_DEFINE << ")\\lib\\" << getMSVCArchName(arch) << "\"\n" << "\t/>\n" << "\t