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