diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp index 6b44176e93f..73af8ba7fb1 100644 --- a/devtools/create_project/msbuild.cpp +++ b/devtools/create_project/msbuild.cpp @@ -303,10 +303,14 @@ void MSBuildProvider::outputProjectSettings(std::ofstream &project, const std::s // Link configuration for main project if (name == setup.projectName || setup.devTools || setup.tests) { - std::string libraries; + std::string libraries = outputLibraryDependencies(setup, isRelease); - for (StringList::const_iterator i = setup.libraries.begin(); i != setup.libraries.end(); ++i) - libraries += *i + ".lib;"; + // MSBuild uses ; for separators instead of spaces + for (std::string::iterator i = libraries.begin(); i != libraries.end(); ++i) { + if (*i == ' ') { + *i = ';'; + } + } project << "\t\t\n" << "\t\t\t$(OutDir)" << ((setup.devTools || setup.tests) ? name : setup.projectName) << ".exe\n" diff --git a/devtools/create_project/msvc.cpp b/devtools/create_project/msvc.cpp index 701173aee66..75c53bfc105 100644 --- a/devtools/create_project/msvc.cpp +++ b/devtools/create_project/msvc.cpp @@ -53,6 +53,94 @@ MSVCProvider::MSVCProvider(StringList &global_warnings, std::mapdepends) { + libs += library->depends; + libs += " "; + } + + const char *basename = library->release; + if (setup.useCanonicalLibNames) { + // Debug name takes priority + if (!isRelease && library->debug) { + basename = library->debug; + } + } else { + // Legacy name ignores configuration + if (library->legacy) { + basename = library->legacy; + } + } + if (basename) { + libs += basename; + } + } + + return libs; +} + +std::string MSVCProvider::outputLibraryDependencies(const BuildSetup &setup, bool isRelease) const { + std::string libs; + + if (setup.useSDL2) { + libs += getLibraryFromFeature("sdl2", setup, isRelease); + } else { + libs += getLibraryFromFeature("sdl", setup, isRelease); + } + libs += " "; + for (FeatureList::const_iterator i = setup.features.begin(); i != setup.features.end(); ++i) { + if (i->enable) { + std::string lib = getLibraryFromFeature(i->name, setup, isRelease); + if (!lib.empty()) + libs += lib + " "; + } + } + + return libs; +} + void MSVCProvider::createWorkspace(const BuildSetup &setup) { UUIDMap::const_iterator svmUUID = _uuidMap.find(setup.projectName); if (svmUUID == _uuidMap.end()) diff --git a/devtools/create_project/msvc.h b/devtools/create_project/msvc.h index f711f165f49..8b9804f8ccb 100644 --- a/devtools/create_project/msvc.h +++ b/devtools/create_project/msvc.h @@ -38,7 +38,21 @@ protected: StringList _disableEditAndContinue; std::list _archs; - std::map _arch_disabled_features; + std::map _arch_disabled_features; + + /** + * MSVC properties for a library required by a feature + */ + struct MSVCLibrary { + const char *feature; ///< Feature ID. + const char *release; ///< Filename of the Release build of the library. + const char *debug; ///< Filename of the Debug build of the library. + const char *depends; ///< Win32 libs this library must be linked against. + const char *legacy; ///< Legacy name for old precompiled libraries (deprecated). + }; + + std::string getLibraryFromFeature(const char *feature, const BuildSetup &setup, bool isRelease) const; + std::string outputLibraryDependencies(const BuildSetup &setup, bool isRelease) const; void createWorkspace(const BuildSetup &setup); diff --git a/devtools/create_project/visualstudio.cpp b/devtools/create_project/visualstudio.cpp index 53dc8117962..9ce8b66a878 100644 --- a/devtools/create_project/visualstudio.cpp +++ b/devtools/create_project/visualstudio.cpp @@ -79,19 +79,11 @@ void VisualStudioProvider::createProjectFile(const std::string &name, const std: std::map >::iterator warningsIterator = _projectWarnings.find(name); if (setup.devTools || setup.tests || name == setup.projectName) { - std::string libraries; - - for (StringList::const_iterator i = setup.libraries.begin(); i != setup.libraries.end(); ++i) - libraries += ' ' + *i + ".lib"; - - // For 'x64' we must disable NASM support. Usually we would need to disable the "nasm" feature for that and - // re-create the library list, BUT since NASM doesn't link any additional libraries, we can just use the - // libraries list created for IA-32. If that changes in the future, we need to adjust this part! for (std::list::const_iterator arch = _archs.begin(); arch != _archs.end(); ++arch) { - outputConfiguration(project, setup, libraries, "Debug", *arch); - outputConfiguration(project, setup, libraries, "Analysis", *arch); - outputConfiguration(project, setup, libraries, "LLVM", *arch); - outputConfiguration(project, setup, libraries, "Release", *arch); + outputConfiguration(project, setup, false, "Debug", *arch); + outputConfiguration(project, setup, false, "Analysis", *arch); + outputConfiguration(project, setup, false, "LLVM", *arch); + outputConfiguration(project, setup, true, "Release", *arch); } } else { @@ -140,7 +132,9 @@ void VisualStudioProvider::createProjectFile(const std::string &name, const std: << "\n"; } -void VisualStudioProvider::outputConfiguration(std::ostream &project, const BuildSetup &setup, const std::string &libraries, const std::string &config, const MSVC_Architecture arch) { +void VisualStudioProvider::outputConfiguration(std::ostream &project, const BuildSetup &setup, bool isRelease, const std::string &config, const MSVC_Architecture arch) { + std::string libraries = outputLibraryDependencies(setup, isRelease); + project << "\t\t\n" << "\t\t\t\n" << "\t\t\t