blob: b3d95523ce17d42e8be4dbeddcf81946dc0aca07 [file] [log] [blame]
Brad King86578ec2016-09-27 15:01:08 -04001/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
Kitware Robotbdca8b02020-08-29 16:27:37 -04003#pragma once
Bill Hoffman7491f522009-06-25 16:41:57 -04004
NAKAMURA Takumi0e58a5e2021-11-14 19:58:11 +09005#include <cstddef>
Marc Chevrier36c8cae2019-12-09 18:13:42 +01006#include <memory>
Kyle Edwards6051a492020-06-12 15:11:04 -04007#include <set>
NAKAMURA Takumi0e58a5e2021-11-14 19:58:11 +09008#include <string>
9#include <vector>
Marc Chevrier36c8cae2019-12-09 18:13:42 +010010
Brad King1b331502021-03-04 16:23:52 -050011#include <cm/optional>
12#include <cm/string_view>
13
Bill Hoffman7491f522009-06-25 16:41:57 -040014#include "cmGlobalVisualStudio8Generator.h"
15
NAKAMURA Takumi0e58a5e2021-11-14 19:58:11 +090016class cmGeneratorTarget;
NAKAMURA Takumi0e58a5e2021-11-14 19:58:11 +090017class cmLocalGenerator;
18class cmMakefile;
19class cmSourceFile;
20class cmake;
21struct cmIDEFlagTable;
22
Bill Hoffman7491f522009-06-25 16:41:57 -040023/** \class cmGlobalVisualStudio10Generator
24 * \brief Write a Unix makefiles.
25 *
26 * cmGlobalVisualStudio10Generator manages UNIX build process for a tree
27 */
Kitware Robotd9fd2f52016-05-16 10:34:04 -040028class cmGlobalVisualStudio10Generator : public cmGlobalVisualStudio8Generator
Bill Hoffman7491f522009-06-25 16:41:57 -040029{
30public:
Brad King7f730462021-10-20 11:59:44 -040031 bool IsVisualStudioAtLeast10() const override { return true; }
32
Vitaly Stakhovskycfe4e2d2017-12-15 21:17:49 -050033 bool SetSystemName(std::string const& s, cmMakefile* mf) override;
Alexander Boczar99e83d42019-09-13 17:32:13 -070034 bool SetGeneratorToolset(std::string const& ts, bool build,
35 cmMakefile* mf) override;
Brad King650c6472012-12-10 10:52:10 -050036
Bartosz Kosiorek324d18b2019-02-08 14:28:49 +010037 std::vector<GeneratedMakeCommand> GenerateBuildCommand(
38 const std::string& makeProgram, const std::string& projectName,
39 const std::string& projectDir, std::vector<std::string> const& targetNames,
Carsten Rudolph193b8fc2022-01-21 17:43:17 +010040 const std::string& config, int jobs, bool verbose,
41 const cmBuildOptions& buildOptions = cmBuildOptions(),
Bartosz Kosiorek324d18b2019-02-08 14:28:49 +010042 std::vector<std::string> const& makeOptions =
43 std::vector<std::string>()) override;
Kitware Robot7bbaa422012-08-13 13:42:58 -040044
Sebastian Holtermann735c6f32019-03-31 11:27:12 +020045 //! create the correct local generator
Marc Chevrier36c8cae2019-12-09 18:13:42 +010046 std::unique_ptr<cmLocalGenerator> CreateLocalGenerator(
47 cmMakefile* mf) override;
Bill Hoffman7491f522009-06-25 16:41:57 -040048
49 /**
Geoff Violabef23e82014-10-09 17:22:45 -060050 * Try to determine system information such as shared library
Kitware Robot7bbaa422012-08-13 13:42:58 -040051 * extension, pthreads, byte order etc.
Bill Hoffman7491f522009-06-25 16:41:57 -040052 */
Vitaly Stakhovskycfe4e2d2017-12-15 21:17:49 -050053 void EnableLanguage(std::vector<std::string> const& languages, cmMakefile*,
54 bool optional) override;
Bill Hoffman7491f522009-06-25 16:41:57 -040055
Kyle Edwards6051a492020-06-12 15:11:04 -040056 void AddAndroidExecutableWarning(const std::string& name)
57 {
58 this->AndroidExecutableWarnings.insert(name);
59 }
60
Brad King13433b12017-03-07 15:44:43 -050061 bool IsCudaEnabled() const { return this->CudaEnabled; }
62
Brad King2f071462014-07-18 11:12:11 -040063 /** Generating for Nsight Tegra VS plugin? */
64 bool IsNsightTegra() const;
Brad King69e198d2014-09-26 14:57:30 -040065 std::string GetNsightTegraVersion() const;
Brad King2f071462014-07-18 11:12:11 -040066
Alexander Boczar548e9052019-09-16 14:14:20 -070067 /** The vctargets path for the target platform. */
68 const char* GetCustomVCTargetsPath() const;
69
Brad Kingfb97ba62010-12-01 12:48:32 -050070 /** The toolset name for the target platform. */
Brad King98afb452014-06-04 13:09:35 -040071 const char* GetPlatformToolset() const;
Brad King584ab522016-10-18 10:09:57 -040072 std::string const& GetPlatformToolsetString() const;
Brad Kingfb97ba62010-12-01 12:48:32 -050073
Brad King58a50a32021-03-11 16:59:20 -050074 /** The toolset version props file, if any. */
75 std::string const& GetPlatformToolsetVersionProps() const;
Basil Fierz5f131682018-05-19 13:23:21 +020076
Brad Kingd079e712016-10-07 15:57:04 -040077 /** The toolset host architecture name (e.g. x64 for 64-bit host tools). */
78 const char* GetPlatformToolsetHostArchitecture() const;
Brad King0fd742a2019-01-28 10:49:16 -050079 std::string const& GetPlatformToolsetHostArchitectureString() const;
Brad Kingd079e712016-10-07 15:57:04 -040080
Brad King5164e9a2017-02-08 16:05:08 -050081 /** The cuda toolset version. */
82 const char* GetPlatformToolsetCuda() const;
83 std::string const& GetPlatformToolsetCudaString() const;
84
Benjamin Wozniakdf0247a2019-08-21 15:27:42 +020085 /** The custom cuda install directory */
86 const char* GetPlatformToolsetCudaCustomDir() const;
87 std::string const& GetPlatformToolsetCudaCustomDirString() const;
88
Marcel Ritzschkec73b8472021-03-14 18:14:19 +010089 /** The nvcc subdirectory of a custom cuda install directory */
90 std::string const& GetPlatformToolsetCudaNvccSubdirString() const;
91
92 /** The visual studio integration subdirectory of a custom cuda install
93 * directory */
94 std::string const& GetPlatformToolsetCudaVSIntegrationSubdirString() const;
95
Brad Kingae444962017-06-27 15:58:39 -040096 /** Return whether we need to use No/Debug instead of false/true
97 for GenerateDebugInformation. */
98 bool GetPlatformToolsetNeedsDebugEnum() const
99 {
100 return this->PlatformToolsetNeedsDebugEnum;
101 }
102
Brad King0a5fe272014-07-30 14:06:07 -0400103 /** Return the CMAKE_SYSTEM_NAME. */
104 std::string const& GetSystemName() const { return this->SystemName; }
105
106 /** Return the CMAKE_SYSTEM_VERSION. */
107 std::string const& GetSystemVersion() const { return this->SystemVersion; }
108
Gilles Khouzam3f077992015-09-30 13:22:43 -0700109 /** Return the Windows version targeted on VS 2015 and above. */
110 std::string const& GetWindowsTargetPlatformVersion() const
Kitware Robotd9fd2f52016-05-16 10:34:04 -0400111 {
112 return this->WindowsTargetPlatformVersion;
113 }
Gilles Khouzam3f077992015-09-30 13:22:43 -0700114
Pascal Bacha3298f72014-09-15 15:46:43 +0200115 /** Return true if building for WindowsCE */
Vitaly Stakhovsky94632082018-12-30 12:32:55 -0500116 bool TargetsWindowsCE() const override { return this->SystemIsWindowsCE; }
Pascal Bacha3298f72014-09-15 15:46:43 +0200117
Brad King3abd1502014-07-29 11:42:30 -0400118 /** Return true if building for WindowsPhone */
Kitware Robotd9fd2f52016-05-16 10:34:04 -0400119 bool TargetsWindowsPhone() const { return this->SystemIsWindowsPhone; }
Brad King3abd1502014-07-29 11:42:30 -0400120
121 /** Return true if building for WindowsStore */
Kitware Robotd9fd2f52016-05-16 10:34:04 -0400122 bool TargetsWindowsStore() const { return this->SystemIsWindowsStore; }
Brad King3abd1502014-07-29 11:42:30 -0400123
Kyle Edwards6051a492020-06-12 15:11:04 -0400124 /** Return true if building for Android */
125 bool TargetsAndroid() const { return this->SystemIsAndroid; }
126
Vitaly Stakhovskycfe4e2d2017-12-15 21:17:49 -0500127 const char* GetCMakeCFGIntDir() const override { return "$(Configuration)"; }
Brad King72333a42012-04-18 15:50:49 -0400128
129 /** Generate an <output>.rule file path for a given command output. */
Vitaly Stakhovskycfe4e2d2017-12-15 21:17:49 -0500130 std::string GenerateRuleFile(std::string const& output) const override;
Brad King72333a42012-04-18 15:50:49 -0400131
Stephen Kelly459c8912015-10-22 18:27:57 +0200132 void PathTooLong(cmGeneratorTarget* target, cmSourceFile const* sf,
Brad Kingd931ce92012-04-27 14:13:02 -0400133 std::string const& sfRel);
Robert Maynard3064f802013-08-20 14:59:59 -0400134
Vitaly Stakhovsky907bc352017-12-13 19:16:54 -0500135 std::string Encoding() override;
Brad Kingd07f4532019-01-09 11:21:20 -0500136 const char* GetToolsVersion() const;
Robert Maynard3064f802013-08-20 14:59:59 -0400137
Brad King3fd65f52021-06-17 07:30:48 -0400138 virtual cm::optional<std::string> GetVSInstanceVersion() const { return {}; }
Brad Kingaabc3ca2021-06-16 10:53:22 -0400139
Brad King91359542020-02-04 11:37:22 -0500140 bool GetSupportsUnityBuilds() const { return this->SupportsUnityBuilds; }
141
Brad King6999b872021-10-20 12:01:53 -0400142 virtual cm::optional<std::string> FindMSBuildCommandEarly(cmMakefile* mf);
143
Brad King0b33aee2017-09-15 09:56:26 -0400144 bool FindMakeProgram(cmMakefile* mf) override;
Brad King0c557292013-12-04 10:35:04 -0500145
Niels Dekker567fabe2018-09-09 23:04:59 +0200146 bool IsIPOSupported() const override { return true; }
147
Justin Goshie2195272020-06-02 12:46:07 -0700148 virtual bool IsStdOutEncodingSupported() const { return false; }
149
Gustavo Varo9ba99a12021-06-16 18:05:55 -0400150 virtual bool IsUtf8EncodingSupported() const { return false; }
151
Brad King2f071462014-07-18 11:12:11 -0400152 static std::string GetInstalledNsightTegraVersion();
153
Brad King639e14d2019-05-21 08:45:20 -0400154 /** Return the first two components of CMAKE_SYSTEM_VERSION. */
155 std::string GetApplicationTypeRevision() const;
156
Kyle Edwards6051a492020-06-12 15:11:04 -0400157 virtual const char* GetAndroidApplicationTypeRevision() const { return ""; }
158
Don Olmsteade2ed9a72016-10-17 17:50:34 -0700159 cmIDEFlagTable const* GetClFlagTable() const;
Michael Stürmer9b06c222016-12-01 12:52:57 +0100160 cmIDEFlagTable const* GetCSharpFlagTable() const;
Don Olmsteade2ed9a72016-10-17 17:50:34 -0700161 cmIDEFlagTable const* GetRcFlagTable() const;
162 cmIDEFlagTable const* GetLibFlagTable() const;
163 cmIDEFlagTable const* GetLinkFlagTable() const;
Brad King041ebda2017-03-07 15:47:50 -0500164 cmIDEFlagTable const* GetCudaFlagTable() const;
165 cmIDEFlagTable const* GetCudaHostFlagTable() const;
Ilia K31665472022-10-14 13:24:47 +0200166 cmIDEFlagTable const* GetMarmasmFlagTable() const;
Don Olmsteade2ed9a72016-10-17 17:50:34 -0700167 cmIDEFlagTable const* GetMasmFlagTable() const;
Evgeny Fimochkin5ba2c9e2017-01-27 19:31:50 +0700168 cmIDEFlagTable const* GetNasmFlagTable() const;
Don Olmsteade2ed9a72016-10-17 17:50:34 -0700169
Carsten Rudolphb2f8f0b2022-01-22 10:29:46 +0100170 bool IsMsBuildRestoreSupported() const;
171
Brad King09e398f2009-09-16 11:44:08 -0400172protected:
Brad King40a73282019-01-10 08:37:40 -0500173 cmGlobalVisualStudio10Generator(cmake* cm, const std::string& name,
174 std::string const& platformInGeneratorName);
175
Vitaly Stakhovskycfe4e2d2017-12-15 21:17:49 -0500176 void Generate() override;
Brad Kinge58f9752014-07-28 15:37:15 -0400177 virtual bool InitializeSystem(cmMakefile* mf);
Gilles Khouzam5dfc4c52015-09-23 14:27:07 -0700178 virtual bool InitializeWindows(cmMakefile* mf);
Pascal Bacha3298f72014-09-15 15:46:43 +0200179 virtual bool InitializeWindowsCE(cmMakefile* mf);
Brad Kingd7938bf2014-07-28 16:15:43 -0400180 virtual bool InitializeWindowsPhone(cmMakefile* mf);
181 virtual bool InitializeWindowsStore(cmMakefile* mf);
Kyle Edwards6051a492020-06-12 15:11:04 -0400182 virtual bool InitializeTegraAndroid(cmMakefile* mf);
183 virtual bool InitializeAndroid(cmMakefile* mf);
Gilles Khouzamb20a32a2014-11-13 11:47:01 -0800184
Brad Kingf7739332017-02-08 15:25:23 -0500185 virtual bool ProcessGeneratorToolsetField(std::string const& key,
186 std::string const& value);
187
Pascal Bacha3298f72014-09-15 15:46:43 +0200188 virtual std::string SelectWindowsCEToolset() const;
Gilles Khouzamb20a32a2014-11-13 11:47:01 -0800189 virtual bool SelectWindowsPhoneToolset(std::string& toolset) const;
190 virtual bool SelectWindowsStoreToolset(std::string& toolset) const;
Brad Kingf5c0efd2014-07-22 15:01:05 -0400191
Brad King58a50a32021-03-11 16:59:20 -0500192 enum class AuxToolset
193 {
194 None,
195 Default,
196 PropsExist,
Nicholas Sinlockf972e4f2022-09-01 14:43:19 -0700197 PropsMissing,
198 PropsIndeterminate
Brad King58a50a32021-03-11 16:59:20 -0500199 };
200 virtual AuxToolset FindAuxToolset(std::string& version,
201 std::string& props) const;
202
Brad King5f5c92b2013-11-13 14:27:51 -0500203 std::string const& GetMSBuildCommand();
204
Brad King414b5e02021-03-04 15:34:34 -0500205 cmIDEFlagTable const* LoadFlagTable(std::string const& toolSpecificName,
Stephan Szaboc8ba7772019-01-03 12:54:24 -0800206 std::string const& defaultName,
Stephan Szabo6d855fb2018-11-28 07:32:14 -0800207 std::string const& table) const;
208
Brad King98afb452014-06-04 13:09:35 -0400209 std::string GeneratorToolset;
Brad King58a50a32021-03-11 16:59:20 -0500210 std::string GeneratorToolsetVersionProps;
Brad Kingd079e712016-10-07 15:57:04 -0400211 std::string GeneratorToolsetHostArchitecture;
Alexander Boczar548e9052019-09-16 14:14:20 -0700212 std::string GeneratorToolsetCustomVCTargetsDir;
Brad King5164e9a2017-02-08 16:05:08 -0500213 std::string GeneratorToolsetCuda;
Benjamin Wozniakdf0247a2019-08-21 15:27:42 +0200214 std::string GeneratorToolsetCudaCustomDir;
Marcel Ritzschkec73b8472021-03-14 18:14:19 +0100215 std::string GeneratorToolsetCudaNvccSubdir;
216 std::string GeneratorToolsetCudaVSIntegrationSubdir;
Brad King98afb452014-06-04 13:09:35 -0400217 std::string DefaultPlatformToolset;
Brad King0fd742a2019-01-28 10:49:16 -0500218 std::string DefaultPlatformToolsetHostArchitecture;
Kyle Edwards6051a492020-06-12 15:11:04 -0400219 std::string DefaultAndroidToolset;
Gilles Khouzam3f077992015-09-30 13:22:43 -0700220 std::string WindowsTargetPlatformVersion;
Brad Kingd0dd28f2014-07-28 15:33:40 -0400221 std::string SystemName;
222 std::string SystemVersion;
Brad King2f071462014-07-18 11:12:11 -0400223 std::string NsightTegraVersion;
Stephan Szabo6d855fb2018-11-28 07:32:14 -0800224 std::string DefaultCLFlagTableName;
225 std::string DefaultCSharpFlagTableName;
226 std::string DefaultLibFlagTableName;
227 std::string DefaultLinkFlagTableName;
228 std::string DefaultCudaFlagTableName;
229 std::string DefaultCudaHostFlagTableName;
Ilia K31665472022-10-14 13:24:47 +0200230 std::string DefaultMarmasmFlagTableName;
Stephan Szabo6d855fb2018-11-28 07:32:14 -0800231 std::string DefaultMasmFlagTableName;
232 std::string DefaultNasmFlagTableName;
233 std::string DefaultRCFlagTableName;
Brad King91359542020-02-04 11:37:22 -0500234 bool SupportsUnityBuilds = false;
Kyle Edwards14456922020-06-15 17:02:02 -0400235 bool SystemIsWindowsCE = false;
236 bool SystemIsWindowsPhone = false;
237 bool SystemIsWindowsStore = false;
Kyle Edwards6051a492020-06-12 15:11:04 -0400238 bool SystemIsAndroid = false;
Brad King65116542021-10-20 11:56:42 -0400239 bool MSBuildCommandInitialized = false;
Peter Kuemmela0700ba2012-06-02 19:58:03 +0200240
Brad Kingd931ce92012-04-27 14:13:02 -0400241private:
242 struct LongestSourcePath
243 {
Kitware Robotd9fd2f52016-05-16 10:34:04 -0400244 LongestSourcePath()
245 : Length(0)
246 , Target(0)
247 , SourceFile(0)
248 {
249 }
Brad Kingd931ce92012-04-27 14:13:02 -0400250 size_t Length;
Stephen Kelly459c8912015-10-22 18:27:57 +0200251 cmGeneratorTarget* Target;
Stephen Kellyc725bb32014-03-12 23:50:42 +0100252 cmSourceFile const* SourceFile;
Brad Kingd931ce92012-04-27 14:13:02 -0400253 std::string SourceRel;
254 };
255 LongestSourcePath LongestSource;
Brad King5f5c92b2013-11-13 14:27:51 -0500256
257 std::string MSBuildCommand;
Kyle Edwards6051a492020-06-12 15:11:04 -0400258 std::set<std::string> AndroidExecutableWarnings;
Brad King5f5c92b2013-11-13 14:27:51 -0500259 virtual std::string FindMSBuildCommand();
Vitaly Stakhovskycfe4e2d2017-12-15 21:17:49 -0500260 std::string FindDevEnvCommand() override;
261 std::string GetVSMakeProgram() override { return this->GetMSBuildCommand(); }
Brad King885ab9a2015-04-15 09:30:14 -0400262
Brad King58a50a32021-03-11 16:59:20 -0500263 std::string GeneratorToolsetVersion;
264
Brad King8d6f0152022-09-26 11:49:17 -0400265 bool PlatformToolsetNeedsDebugEnum = false;
Brad Kingae444962017-06-27 15:58:39 -0400266
Brad Kingf7739332017-02-08 15:25:23 -0500267 bool ParseGeneratorToolset(std::string const& ts, cmMakefile* mf);
268
Brad King1b774e12021-03-04 13:50:43 -0500269 std::string GetClFlagTableName() const;
270 std::string GetCSharpFlagTableName() const;
271 std::string GetRcFlagTableName() const;
272 std::string GetLibFlagTableName() const;
273 std::string GetLinkFlagTableName() const;
274 std::string GetMasmFlagTableName() const;
Brad Kinga1c07582021-03-04 13:42:52 -0500275 std::string CanonicalToolsetName(std::string const& toolset) const;
Brad Kingfe176852021-03-04 13:10:53 -0500276
Brad King1b331502021-03-04 16:23:52 -0500277 cm::optional<std::string> FindFlagTable(cm::string_view toolsetName,
278 cm::string_view table) const;
279
Brad King608ef8a2021-03-04 16:47:49 -0500280 std::string CustomFlagTableDir;
281
Alexander Boczar548e9052019-09-16 14:14:20 -0700282 std::string CustomVCTargetsPath;
Brad King83bf9802017-02-08 16:28:39 -0500283 std::string VCTargetsPath;
284 bool FindVCTargetsPath(cmMakefile* mf);
285
Brad King8d6f0152022-09-26 11:49:17 -0400286 bool CudaEnabled = false;
Brad King13433b12017-03-07 15:44:43 -0500287
Brad King885ab9a2015-04-15 09:30:14 -0400288 // We do not use the reload macros for VS >= 10.
Vitaly Stakhovskycfe4e2d2017-12-15 21:17:49 -0500289 std::string GetUserMacrosDirectory() override { return ""; }
Bill Hoffman7491f522009-06-25 16:41:57 -0400290};