Commit Graph

127 Commits

Author SHA1 Message Date
Brad King
776929b3c4 VS: Fix .vcxproj ProjectGuid element case
The `.vcxproj` file format expects `ProjectGuid`, not `ProjectGUID`.
The latter is expected by `.vcproj` files from VS 2008, so this was
likely a typo when the VS 2010 generator was first introduced.

Fixes: #11968
2017-05-09 10:12:12 -04:00
Daniel Pfeifer
1d829c862c Use quotes for non-system includes
Automate with:

git grep -l '#include <cm_' -- Source \
  | xargs sed -i 's/#include <\(cm_.*\)>/#include "\1"/g'

git grep -l '#include <cmsys/' -- Source \
  | xargs sed -i 's/#include <\(cmsys\/.*\)>/#include "\1"/g'

git grep -l '#include <cm[A-Z]' -- Source \
  | xargs sed -i 's/#include <\(cm[A-Z].*\)>/#include "\1"/g'
2017-04-11 22:35:21 +02:00
Brad King
041ebda25b VS: Add placeholder CUDA flag tables
The CUDA Toolkit's VS integration defines abstractions for both options
to `nvcc` and options to pass through `-Xcompiler` to the host MSVC.
We need a separate flag table to parse each set of flags into the
corresponding abstractions.  Add empty placeholders for these tables.
2017-03-10 10:19:55 -05:00
Brad King
13433b1357 VS: Record in global generator whether CUDA is enabled 2017-03-10 10:19:55 -05:00
Brad King
62b308515a VS: Select highest available CUDA toolset by default
If `CMAKE_GENERATOR_TOOLSET` does not have a `cuda=...` field then
find available CUDA toolsets and choose the highest version.
2017-03-10 10:19:53 -05:00
Brad King
5164e9a651 VS: Provide an option to specify CUDA toolset version
The NVIDIA CUDA Toolkit provides MSBuild toolset files for integration
with Visual Studio.  Multiple versions may be installed so we need a way
to tell our VS generators which CUDA toolset to use.  Extend the
`CMAKE_GENERATOR_TOOLSET` specification to provide a `cuda=...` field
specifying the version number.
2017-03-10 10:19:53 -05:00
Brad King
83bf980c96 VS: Find the MSBuild value for VCTargetsPath
Run MSBuild on a simple `.vcxproj` file to extract the location of the
toolset definitions.  This will later be useful for looking at available
BuildCustomizations.
2017-03-10 10:19:52 -05:00
Brad King
f773933f26 VS: Refactor generator toolset parsing
We parse `CMAKE_GENERATOR_TOOLSET` values of the forms:

* `toolset`
* `toolset,host=x64`
* `host=x64`

Generalize the parsing to support the forms:

* `toolset`
* `toolset[,key=value]*`
* `key=value[,key=value]*`

Disallow duplicate keys.  Require all but the first field to
be of `key=value` form.
2017-02-15 08:15:37 -05:00
Evgeny Fimochkin
5ba2c9e5e0 VS: Add support for ASM_NASM language
Fixes: #16469
2017-02-07 13:20:52 -05:00
Iyyappa Murugandi
c93e85d87e VS: Use Visual Studio Installer to locate VS 2017
VS 2017 and later may no longer populate the Windows Registry entries
CMake has traditionally used to find the VS installations.  This is
because VS now supports having multiple installations of the same
version.  The Visual Studio Installer tool provides a COM interface we
can query to locate installations.
2016-12-16 09:58:43 -05:00
Brad King
d42d3780ac Merge branch 'vs-fix-standalone-Windows7.1SDK-toolset' into vs-fix-standalone-Windows7.1SDK-toolset-for-master 2016-12-07 11:10:28 -05:00
Brad King
27431de162 VS: Fix standalone Windows7.1SDK toolset selection
Since commit v3.7.0-rc1~142^2~1 (VS: Explicitly default to v100 toolset
in Visual Studio 2010, 2016-07-21) we prefer to always set a platform
toolset explicitly so that `CMAKE_VS_PLATFORM_TOOLSET` can be reported.
However, the `v100` default for the VS 10 generator is not appropriate
for all environments.  We fixed support for VS 2010 Express Edition in
commit v3.7.0-rc1~142^2 (VS: Do not default to missing v100 64-bit
toolset on VS 2010 Express, 2016-09-09).

Fix support for the standalone Windows7.1SDK toolset environment by
recognizing the `PlatformToolset` environment variable that it sets to
`Windows7.1SDK` and using this as our default toolset instead.

Closes: #16483
2016-12-07 11:02:54 -05:00
Michael Stürmer
9b06c22648 VS: Add flag tables for C#
Add these (currently unused) tables in preparation for `.csproj`
generation support.  Populate the tables for every version with a set of
initial values that work well for me with VS 12 and VS 14.  Later we may
need to generate them more thoroughly from MSBuild `.xml` files.
2016-12-01 16:45:34 +01:00
Daniel Pfeifer
66a7099993 iwyu: Fix VisualStudio specific issues 2016-11-28 14:06:40 -05:00
Brad King
fe03a86eb3 Merge topic 'vs-fix-no-toolset'
0caca40f VS: Fix use of `Windows7.1SDK` 64-bit toolset with VS 2010 Express
2016-10-27 11:17:01 -04:00
Brad King
0caca40fcc VS: Fix use of Windows7.1SDK 64-bit toolset with VS 2010 Express
Refactoring in commit 584ab528 (VS: Add internal API to get platform
toolset as string, 2016-10-18) accidentally changed the semantics of the
original `cmGlobalVisualStudio10Generator::GetPlatformToolset`
implementation to return a pointer to an empty string instead of
`nullptr` when no toolset is configured.  This broke cases that tested
for `nullptr` to detect the lack of any specific toolset, such as the
call in `Find64BitTools`.  Restore the `nullptr` return in this case.
2016-10-27 10:42:36 -04:00
Don Olmstead
69fc7bf87d VS: Choose flag map based on the toolset name
MSBuild interprets the `.vcxproj` content based on the `PlatformToolset`
setting, so our reverse mapping needs to be based on that setting too.
For VS 2010 and above, choose the flag map to match the toolset name
rather than the generator VS version.

Issue: #16153
2016-10-25 09:46:21 -04:00
Brad King
584ab5285b VS: Add internal API to get platform toolset as string 2016-10-25 09:19:49 -04:00
Don Olmstead
e2ed9a7092 VS: Move toolset flag table lookup to global generator
Move `Get*FlagTable` methods to the global generator and have each VS
generator version pre-populate its default flag table.
2016-10-25 09:19:49 -04:00
Brad King
2d3aa94225 cmGlobalGenerator: Allow FindMakeProgram to fail
Revise its signature to return `bool` so that it can fail and abort
configuration early.
2016-10-20 10:37:27 -04:00
Brad King
d079e71c29 VS: Provide an option to use x64 host tools
Visual Studio provides toolchains that are themselves built for 32-bit
or 64-bit host architectures.  By default it uses the 32-bit tools, but
it can be told to prefer the 64-bit tools on 64-bit hosts.  Extend the
`CMAKE_GENERATOR_TOOLSET` specification to provide a way to request
use of the 64-bit host tools.

Closes: #15622
2016-10-14 09:22:26 -04:00
Brad King
86578eccf2 Simplify CMake per-source license notices
Per-source copyright/license notice headers that spell out copyright holder
names and years are hard to maintain and often out-of-date or plain wrong.
Precise contributor information is already maintained automatically by the
version control tool.  Ultimately it is the receiver of a file who is
responsible for determining its licensing status, and per-source notices are
merely a convenience.  Therefore it is simpler and more accurate for
each source to have a generic notice of the license name and references to
more detailed information on copyright holders and full license terms.

Our `Copyright.txt` file now contains a list of Contributors whose names
appeared source-level copyright notices.  It also references version control
history for more precise information.  Therefore we no longer need to spell
out the list of Contributors in each source file notice.

Replace CMake per-source copyright/license notice headers with a short
description of the license and links to `Copyright.txt` and online information
available from "https://cmake.org/licensing".  The online URL also handles
cases of modules being copied out of our source into other projects, so we
can drop our notices about replacing links with full license text.

Run the `Utilities/Scripts/filter-notices.bash` script to perform the majority
of the replacements mechanically.  Manually fix up shebang lines and trailing
newlines in a few files.  Manually update the notices in a few files that the
script does not handle.
2016-09-27 15:14:44 -04:00
Brad King
58e56607c1 Merge topic 'vs-default-v100'
861f1b3d VS: Do not default to missing v100 64-bit toolset on VS 2010 Express
2016-09-12 09:31:32 -04:00
Brad King
861f1b3da6 VS: Do not default to missing v100 64-bit toolset on VS 2010 Express
Since commit 059c230d (VS: Explicitly default to v100 toolset in Visual
Studio 2010, 2016-07-21) the VS 2010 generator now correctly defaults to
the v100 toolset instead of no toolset.  However, this broke our logic
for defaulting to the `Windows7.1SDK` toolset for 64-bit builds on VS
2010 Express.  Fix the logic by ignoring the `v100` default in the case.
2016-09-09 10:17:23 -04:00
Brad King
bdc679a8ae VS15: Add Visual Studio 15 generator
Call the generator "Visual Studio 15" without any year because the
preview version of VS 15 does not provide a year in the product name.

Copy cmGlobalVisualStudio14Generator to cmGlobalVisualStudio15Generator
and update version numbers accordingly.  Add the VS15 enumeration value.
Note that we do not need to add a MSVC15 variable or v150 toolset
because Visual Studio 15 comes with an updated version of the v140
toolset and remains ABI-compatible.

Teach tests VSExternalInclude, RunCMake.GeneratorPlatform, and
RunCMake.GeneratorToolset to treat VS 15 as they do VS 10-14.

Closes: #16143
2016-09-07 15:49:08 -04:00
Brad King
042aca557d VS: Verify that MSBuild.exe and devenv.com exist before using them 2016-09-06 10:22:39 -04:00
Daniel Pfeifer
efed6468ed fix a load of include-what-you-use violations 2016-09-03 08:04:56 -04:00
Benjamin Ballet
059c230d89 VS: Explicitly default to v100 toolset in Visual Studio 2010
Otherwise `CMAKE_VS_PLATFORM_TOOLSET` is not set even though the `v100`
toolset is chosen.
2016-07-21 11:13:16 -04:00
Tobias Hunger
4db08807db CMake: Report whether generators support platforms 2016-07-14 10:35:58 -04:00
Tobias Hunger
43a68a6dca cmGlobalGeneratorFactory: Use CM_OVERRIDE for all derived classes 2016-07-14 10:35:58 -04:00
Kitware Robot
d9fd2f5402 Revise C++ coding style using clang-format
Run the `Utilities/Scripts/clang-format.bash` script to update
all our C++ code to a new style defined by `.clang-format`.
Use `clang-format` version 3.8.

* If you reached this commit for a line in `git blame`, re-run the blame
  operation starting at the parent of this commit to see older history
  for the content.

* See the parent commit for instructions to rebase a change across this
  style transition commit.
2016-05-16 16:05:19 -04:00
Brad King
0ac18d40c8 Remove //------... horizontal separator comments
Modern editors provide plenty of ways to visually separate functions.
Drop the explicit comments that previously served this purpose.
Use the following command to automate the change:

    $ git ls-files -z -- \
        "*.c" "*.cc" "*.cpp" "*.cxx" "*.h" "*.hh" "*.hpp" "*.hxx" |
      egrep -z -v "^Source/cmCommandArgumentLexer\." |
      egrep -z -v "^Source/cmCommandArgumentParser(\.y|\.cxx|Tokens\.h)" |
      egrep -z -v "^Source/cmDependsJavaLexer\." |
      egrep -z -v "^Source/cmDependsJavaParser(\.y|\.cxx|Tokens\.h)" |
      egrep -z -v "^Source/cmExprLexer\." |
      egrep -z -v "^Source/cmExprParser(\.y|\.cxx|Tokens\.h)" |
      egrep -z -v "^Source/cmFortranLexer\." |
      egrep -z -v "^Source/cmFortranParser(\.y|\.cxx|Tokens\.h)" |
      egrep -z -v "^Source/cmListFileLexer\." |
      egrep -z -v "^Source/cm_sha2" |
      egrep -z -v "^Source/(kwsys|CursesDialog/form)/" |
      egrep -z -v "^Utilities/(KW|cm).*/" |
      xargs -0 sed -i '/^\(\/\/---*\|\/\*---*\*\/\)$/ {d;}'

This avoids modifying third-party sources and generated sources.
2016-05-09 09:41:43 -04:00
Brad King
64b5520346 Isolate formatted streaming blocks with clang-format off/on
The clang-format tool can do a good job formatting most code, but
well-organized streaming blocks are best left manually formatted.

Find blocks of the form

    os <<
      "...\n"
      "...\n"
      ;

using the command

    $ git ls-files -z -- Source |
      egrep -v -z '^Source/kwsys/' |
      xargs -0 pcregrep -M --color=always -B 1 -A 1 -n \
        '<<[^\n]*\n(^ *("[^\n]*("|<<|;)$|;)\n){2,}'

Find blocks of the form

    os << "...\n"
       << "...\n"
       << "...\n";

using the command

    $ git ls-files -z -- Source |
      egrep -v -z '^Source/kwsys/' |
      xargs -0 pcregrep -M --color=always -B 1 -A 1 -n \
        '<<[^\n]*\n(^ *<<[^\n]*(\\n"|<<|;)$\n){2,}'

Surround such blocks with the pair

    /* clang-format off */
    ...
    /* clang-format on */

in order to protect them from update by clang-format.  Use the C-style
`/*...*/` comments instead of C++-style `//...` comments in order to
prevent them from ever being swallowed by re-formatting of surrounding
comments.
2016-05-06 14:25:55 -04:00
Brad King
e1c7747253 Format include directive blocks and ordering with clang-format
Sort include directives within each block (separated by a blank line) in
lexicographic order (except to prioritize `sys/types.h` first).  First
run `clang-format` with the config file:

    ---
    SortIncludes: false
    ...

Commit the result temporarily.  Then run `clang-format` again with:

    ---
    SortIncludes: true
    IncludeCategories:
      - Regex:    'sys/types.h'
        Priority: -1
    ...

Commit the result temporarily.  Start a new branch and cherry-pick the
second commit.  Manually resolve conflicts to preserve indentation of
re-ordered includes.  This cleans up the include ordering without
changing any other style.

Use the following command to run `clang-format`:

    $ git ls-files -z -- \
        '*.c' '*.cc' '*.cpp' '*.cxx' '*.h' '*.hh' '*.hpp' '*.hxx' |
      egrep -z -v '(Lexer|Parser|ParserHelper)\.' |
      egrep -z -v '^Source/cm_sha2' |
      egrep -z -v '^Source/(kwsys|CursesDialog/form)/' |
      egrep -z -v '^Utilities/(KW|cm).*/' |
      egrep -z -v '^Tests/Module/GenerateExportHeader' |
      egrep -z -v '^Tests/RunCMake/CommandLine/cmake_depends/test_UTF-16LE.h' |
      xargs -0 clang-format -i

This selects source files that do not come from a third-party.

Inspired-by: Daniel Pfeifer <daniel@pfeifer-mail.de>
2016-04-29 13:58:54 -04:00
Brad King
180538c706 Source: Stabilize include order
Each source file has a logical first include file.  Include it in an
isolated block so that tools that sort includes do not move them.
2016-04-29 13:58:31 -04:00
Brad King
571bedec29 VS: Ignore USE_FOLDER property on VS versions that do not support it
Solution folders are supported on VS 8 and above in the full versions
and on VS 11 and above in the express versions.
2016-04-26 08:22:27 -04:00
Robert Dailey
2b958a2027 cmake-gui: Add option to specify generator toolset
The -T parameter to CMake may now be specified through cmake-gui via a
new text field in the first-time configure wizard (below the generator
chooser).

The generator factories specify whether or not they support toolsets.
This information is propagated to the Qt code and used to determine if
the selected generator should also display the optional Toolset widgets.
2015-11-17 10:03:10 -05:00
Stephen Kelly
459c891088 VS10: Port to cmGeneratorTarget. 2015-10-24 09:19:55 +02:00
Stephen Kelly
a9588e90bb VisualStudio10: Initialize the LongestSource at generate time.
There is no need to initialize it at compute time.
2015-10-05 18:43:17 +02:00
Gilles Khouzam
5dfc4c5f50 VS: Add hook to initialize Windows platform settings
Give VS 10+ generators a chance to choose Windows platform settings just
as they already can for WindowsCE, WindowsStore, and WindowsPhone.
2015-10-02 09:43:24 -04:00
Stephen Kelly
ff8ac8ee6a cmLocalGenerator: Create from already-constructed cmMakefile.
Don't manage the lifetime of the cmMakefile with cmLocalGenerator.
2015-08-28 18:44:39 +02:00
Stephen Kelly
9b6a743b80 cmLocalGenerator: Remove Parent pointer. 2015-08-28 18:44:38 +02:00
Stephen Kelly
5edb335485 cmGlobalGenerator: Virtualize the Compute step and override it. 2015-07-30 08:28:31 +02:00
Stephen Kelly
3b880a0741 cmLocalGenerator: Require a valid cmState::Snapshot in the ctor.
Refactor the local generator creation API to accept a
cmState::Snapshot.  Adjust MakeLocalGenerator to use the 'current'
snapshot in cases where there is no parent.  Create the snapshot
for subdirectories in cmMakefile::AddSubdirectory.

This means that snapshots are now created at the point of extending the tree,
as appropriate, and independently of the cmLocalGenerator and cmMakefile they
represent the state for.
2015-05-27 09:18:32 -04:00
Stephen Kelly
c7b79aa16a cmGlobalGenerator: Require a cmake instance in ctor.
It is required anyway, so this makes it explicit.
2015-05-27 09:18:31 -04:00
Stephen Kelly
e435f875ec VS: Move version information to global generator. 2015-05-19 11:02:33 -04:00
Stephen Kelly
34c9ee2ed7 cmLocalGenerator: Require a global generator in the constructor.
Port generator factory methods to pass it.
2015-05-14 20:36:27 +02:00
Stephen Kelly
a48aebcb67 cmLocalGenerator: Require a parent in the constructor.
Pass the parent though cmGlobalGenerator::CreateLocalGenerator.

This will make it easy to initialize state scopes independent of
cmMakefile.
2015-04-28 07:50:52 +02:00
Stephen Kelly
54d6a9187f cmMakefile: Rename GetCurrent{Output,Binary}Directory.
Match names used in CMake code.
2015-04-21 00:12:52 +02:00
Brad King
885ab9ab37 VS: Drop reload macros for VS >= 10 (#11258,#14680)
We never implemented them for VS 11 (2012), 12 (2013), or 14 (2015).
For VS 10 (2010) the reload macro does not work correctly when run from
inside a build launched through the IDE because stopping the build kills
the CMake that is driving the reload.  Fortunately VS >= 10 know how to
reload the whole solution anyway.
2015-04-15 09:58:42 -04:00