From 32218da8a3d5efab73cf57330d390ea96ed660a7 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 17 Mar 2021 14:58:55 -0700 Subject: [PATCH 01/82] drafting new content --- docs/build/cpp-header-units.md | 45 +++++++++ docs/build/header-unit-json-reference.md | 61 ++++++++++++ docs/build/header-unit-strategies.md | 29 ++++++ docs/build/reference/y-precompiled-headers.md | 23 +++-- docs/build/toc.yml | 5 + .../walkthrough-build-import-header-units.md | 92 +++++++++++++++++++ .../walkthrough-import-stl-header-units.md | 68 ++++++++++++++ 7 files changed, 311 insertions(+), 12 deletions(-) create mode 100644 docs/build/cpp-header-units.md create mode 100644 docs/build/header-unit-json-reference.md create mode 100644 docs/build/header-unit-strategies.md create mode 100644 docs/build/walkthrough-build-import-header-units.md create mode 100644 docs/build/walkthrough-import-stl-header-units.md diff --git a/docs/build/cpp-header-units.md b/docs/build/cpp-header-units.md new file mode 100644 index 00000000000..782cf0dc7b5 --- /dev/null +++ b/docs/build/cpp-header-units.md @@ -0,0 +1,45 @@ +--- +description: "Learn more about C++ header units" +title: "C++ header units" +ms.date: "3/11/2021" +f1_keywords: ["header unit"] +helpviewer_keywords: ["header unit"] +--- + +# C++ header units + +This section is about C++ building and importing header units. If you want to learn about C++ 20 modules, see [](). +See [Speed up your compilation with Standard Template Library (STL) header units]() to learn how to import STL libraries for faster compilation throughput. + +## What is a header unit + +A header unit is an interpretation of a header file as if it was a self-contained translation unit that exports all declarations contained therein. They are used to provide some “module-like” feel to header files even though they lack the level of isolation and one definition rule (ODR) guarantees provided by named modules. Their essential use is to save on repeated processing of the same content of a header file in order to improve on compilation time. That requires ability to refer to the saved work, for re-use. Unfortunately, the semantics provided by a header file is really its content – not the filepath of the header file -- whereas a module is identified uniquely by its name. This document specifies the MSVC compiler switches recommended for producing the IFC files for header units, and how to consume them. In the process, it addresses a few weaknesses in the current IFC production. Consequently, the MSVC compiler needs to be modified to comply. + +### IFC files + +Want to describe what these are briefly? Also from Header Units: production and consumption by Gabriel Reis + + An IFC file is a binary format that stores the definition of a named module interface file or a header unit. This is the thing the compiler brings in when an *import* statement is processed. + +Brought in with /reference M=/path/to/some-file.ifc which establishes a mapping between the module name and where to find the corresponding IFC file. + +/exportHeader requests the generation of the .IFC file. + +Contrast with Shared PCH usage sample in Visual Studio (see https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/ + +See the following topics to help you with the way you'd like to use header units. + + + +## In this section + +[Compile faster with Standard Template Library (STL) header units](walkthrough-import-stl-header-units.md) +[Build and import header units](walkthrough-build-import-header-units.md) +[Strategies for reusing header units](header-unit-strategies.md) maybe this folds into the article above JTW +[header-unit.json reference](header-unit-json-reference.md) + +## See also + +[Modules docs]() +[Precompiled header docs]() +[ISO papers?]() \ No newline at end of file diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md new file mode 100644 index 00000000000..879dcd2ec3c --- /dev/null +++ b/docs/build/header-unit-json-reference.md @@ -0,0 +1,61 @@ +--- +description: "Reference for header_units.json format" +title: "C++ header unit.json reference" +ms.date: "3/15/2021" +f1_keywords: ["header unit"] +helpviewer_keywords: ["header unit"] +--- + +# C++ header_units.json reference + +## Format + +The format of the header_units.json (as well as file name and location) is up to the compilers and libraries, build system will not “know” about it as it does not know upfront which headers and from which directories will be used. + + + +At minimum (vcpkg feedback was to avoid wildcards), it can be something like this + + + +{ + + "Version": "1.0", + + "BuildAsHeaderUnits": [ + +“relative\path\to\header1.h”, + +“relative\path\to\header2.h” + +] + +} + + + +Or, if we allow wildcards: + + + +{ + + "Version": "1.0", + + "BuildAsHeaderUnits": [*] <- can contain wildcards + + "Exclude": [foo.h] <- can contain wildcards + +} + +## Search rules + +Header directory + +If the header directory is not on include path, the directory on the include path which was used to find this header. + +## See also + +[Modules docs]() +[Precompiled header docs]() +[ISO papers?]() \ No newline at end of file diff --git a/docs/build/header-unit-strategies.md b/docs/build/header-unit-strategies.md new file mode 100644 index 00000000000..9f35f10cd31 --- /dev/null +++ b/docs/build/header-unit-strategies.md @@ -0,0 +1,29 @@ +--- +description: "Learn strategies for sharing C++ header units" +title: "Strategies for sharing C++ header units" +ms.date: "3/15/2021" +f1_keywords: ["header unit"] +helpviewer_keywords: ["header unit"] +--- + +# Strategies for sharing C++ header units + +Header units that are built as a part of a static library project, are automatically available to all directly and indirectly referencing projects. + +To use modules and header units built as a part of a dll project, their symbols have to be exported from the dll as any other C/C++ symbols and “All Modules arePublic” property should be set to true. + +If you build header units for the headers in your codebase, you might want to control which ones should be automatically available to all referencing projects and which ones should be “private” by specifying “Public C++ Modules Directories”. + +You might also want to specify “Public Include Directories” for your public headers to be automatically added to Include Directories (/I) in the referencing projects. + +[Picture of header unit property pages]( see Building and using header units in VC projects.docx under Reusing built header units between different projects) + +Ensure that projects that share header units are built with compatible compilation options, just as you would with shared pre-compiled headers. The compiler will issue warnings if it detects different compilation options in how the module or header unit was produced and how it is used. + +If you reference two or more projects that built two or more modules with the same name or two or more header unit for the same header file, you can use C/C++ > Additional Module dependencies & Additional Header Unit Dependencies to resolve those collisions by specifying which module or header unit should be used for this project. Otherwise the one that is chosen is undefined. + + + + +## See also + diff --git a/docs/build/reference/y-precompiled-headers.md b/docs/build/reference/y-precompiled-headers.md index f218371a2a1..1dd5938fb80 100644 --- a/docs/build/reference/y-precompiled-headers.md +++ b/docs/build/reference/y-precompiled-headers.md @@ -1,28 +1,27 @@ --- -description: "Learn more about: /Y (Precompiled Headers)" -title: "/Y (Precompiled Headers)" +description: "Learn more about: /Y (precompiled headers)" +title: "/Y (precompiled headers)" ms.date: "11/04/2016" f1_keywords: ["/Y"] helpviewer_keywords: ["/Y compiler options [C++]"] -ms.assetid: 1df5726a-8ebe-42c3-b618-d2f5e1ce8673 --- -# /Y (Precompiled Headers) +# /Y (precompiled headers) The following compiler options affect the generation and use of precompiled headers: -- [/Y- (Ignore Precompiled Header Options)](y-ignore-precompiled-header-options.md) +- [/Y- (Ignore precompiled header options)](y-ignore-precompiled-header-options.md) -- [/Yc (Create Precompiled Header File)](yc-create-precompiled-header-file.md) +- [/Yc (Create precompiled header file)](yc-create-precompiled-header-file.md) -- [/Yd (Place Debug Information in Object File)](yd-place-debug-information-in-object-file.md) +- [/Yd (Place Debug Information in Object file)](yd-place-debug-information-in-object-file.md) -- [/Yl (Inject PCH Reference for Debug Library)](yl-inject-pch-reference-for-debug-library.md) +- [/Yl (Inject PCH reference for debug library)](yl-inject-pch-reference-for-debug-library.md) -- [/Yu (Use Precompiled Header File)](yu-use-precompiled-header-file.md) +- [/Yu (Use precompiled header file)](yu-use-precompiled-header-file.md) -For details on working with precompiled headers, see [Precompiled Header Files](../creating-precompiled-header-files.md). +For details on working with precompiled headers, see [precompiled header files](../creating-precompiled-header-files.md). ## See also -[MSVC Compiler Options](compiler-options.md)
-[MSVC Compiler Command-Line Syntax](compiler-command-line-syntax.md) +[MSVC compiler options](compiler-options.md)\ +[MSVC compiler command-line syntax](compiler-command-line-syntax.md) diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 1f730724a73..576fe7abddf 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -84,6 +84,11 @@ href: ../build/vcpkg-command-line-reference.md - name: "C++ Build Insights" href: ../build-insights/get-started-with-cpp-build-insights.md +-name: Build C++ header units for STL headers and other libraries + expanded: false + items: + name: Header units + href: ../build/cpp-header-units.md - name: Precompiled header files href: ../build/creating-precompiled-header-files.md - name: C++ release builds diff --git a/docs/build/walkthrough-build-import-header-units.md b/docs/build/walkthrough-build-import-header-units.md new file mode 100644 index 00000000000..4db6d891304 --- /dev/null +++ b/docs/build/walkthrough-build-import-header-units.md @@ -0,0 +1,92 @@ +--- +description: "Learn more about: Walkthrough: Compiling a C++/CX Program on the Command Line" +title: "Walkthrough: Build and import header units in Visual C++ projects" +ms.date: "3/11/2021" +f1_keywords: ["__vectorcall_cpp", "__vectorcall", "_vectorcall"] +helpviewer_keywords: ["__vectorcall keyword", "__vectorcall"] +--- +# Walkthrough: Build and import header units in your Visual C++ projects + +## Prerequisites + +Maybe list version + +## ? + +Before a header unit can be imported, it must be built. You can either tell the IDE which header units need to be built, or you can have the IDE scan for them. When a header file or module interface file (*.ixx) is built, it is also scanned for dependencies. + +### Automatic + +Perf issues with scanning for them (build throughput, intellisense init) that might not be desirable in large codebases that only make use of a few header units. + +set “Scan Sources for Module Dependencies” to “Yes” in C/C++ - General tab + +### Set properties + +To build as a header unit: + +.h files marked c/c++ compile will be compiled as header units +any file marked 'compile as header unit' + + +- right-click on the file in Solution Explorer, select Properties. Change Item Type to be C/C++ Compile (.h files are “C/C++ Include” by default), hit Apply. +- If the header file extension is different from “.h”, set “Compile As” to “Compile As Header Unit” in the C/C++ Advanced + +### Provide a list *.json thing + +## Building a header unit project + +This section about creating a project that builds your header units + +[this from](https://microsoft-my.sharepoint.com/:w:/p/gdr/Ea5Jy1oVuwxJpsiLYuem9FgBYioxSLmGER2QVPp4muq7vQ?e=4%3AW1atMJ&at=9&CID=AAA917D6-FC4D-41F0-9803-4DD2BD0B63CF&wdLOR=c6BFFEDA4-B56F-4FE8-AEFA-2F6A29107415) +cl /exportHeader /headerName:angle vector=/path/to/source/file + +for requesting the generation of an IFC file for header-name resolving to /path/to/source/file, and + +cl /exportHeader /headerName:quote my/header.h=/path/to/source/file + +for requesting the generation of an IFC file for header-name “my/header.h” resolving to /path/to/source/file. + +## Consuming header units + +If you want to use modules or header units built outside of your solution/codebase, you can use C/C++ > Additional Module dependencies & perhaps Additional Header Unit Dependencies. + + +[this from](https://microsoft-my.sharepoint.com/:w:/p/gdr/Ea5Jy1oVuwxJpsiLYuem9FgBYioxSLmGER2QVPp4muq7vQ?e=4%3AW1atMJ&at=9&CID=AAA917D6-FC4D-41F0-9803-4DD2BD0B63CF&wdLOR=c6BFFEDA4-B56F-4FE8-AEFA-2F6A29107415) +Using ifc search path: + +Using ifc search path: + +cl /ifcSearchDir [Dir1] /ifcSearchDir [Dir2] source.cpp + +In this case ifcs for header units (as well as named modules) will be found in the ifc search path by the names stored in the ifc. + +Using explicit /headerUnit reference + +/headerUnit:angle vector=/path/to/some-file.ifc + +The header file will be resolved by searching on the include path + +/headerUnit:quote my/header.h=/path/to/some-file.ifc + +The header file will be resolved by searching “my/header.h “ on the include path + +/headerUnit /path/to/header=/path/to/some-file.ifc + +The header file is explicitly specified by the path. + +In this case the resolved header path for import
or import “header” will be compared with the resolved header paths specified by /headerUnit* and the matching ifc will be used (without comparing the name stored in the ifc). + +## 3rd party + +IDE usage + +People can create header_units.json in their headers directories. + +To translate 3rd party library headers, they will need to use /headerUnit:* switches. + +In VC projects they will be able to specify headers to translate as Additional Header Units Dependencies + +## See also + +[MSVC Compiler Options](reference/compiler-options.md) diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md new file mode 100644 index 00000000000..24401f3b497 --- /dev/null +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -0,0 +1,68 @@ +--- +description: "Learn more about: Walkthrough: Compiling a C++/CX Program on the Command Line" +title: "Walkthrough: Import STL header units" +ms.date: "3/11/2021" +f1_keywords: ["__vectorcall_cpp", "__vectorcall", "_vectorcall"] +helpviewer_keywords: ["__vectorcall keyword", "__vectorcall"] +--- +# Walkthrough: Import STL header units + + +## Prerequisites + +Visual Studio 19.10 Preview x + +## Building and using header units for STL headers + +### Option 1 + +Enable “Scan All Sources for Module Dependencies” in all projects that use header units. This will make build system to scan all files for imported header units (by which I presume they mean stuff following *import* JTW) and build them (in the correct dependency order) before building the sources which use them if they have not been already built by referenced projects. + +This option is convenient if you just want to try header units or for codebases with extensive use of different header units where modularization is more important than build throughput as scanning all sources will take additional build time, especially in big codebases. This option also does not guarantee that a header unit for a particular header will be built only once, though header units that are built by referenced static libraries projects will be re-used. + +### Option 2 + +Create a special project (or projects) to build common header units and reference this project (or projects) in all other projects that use STL header units. +This option ensures that header units for a particular common header will be built only once during the build and then used everywhere. It is similar to using shared precompiled header file, though it is much simpler and more flexible. + +To create this special project, you can do the following: +1. Create an Empty C++ project. +2. Open project properties (make sure All Configurations and All Platforms are selected in the Project Properties UI) and set the following properties: +Configuration Properties - General +Configuration type = Static Library (.lib) +C++ Language Standard = ISO C++ 20 (or c++latest) + +[Picture headerunit property pages](See doc building and using header units in VC projects.docx, search "to create this special project") Might just cut and paste that picture into our system + +Configuration Properties - C/C++ - General +Scan Sources for Module Dependencies = Yes According to Building header units for STL headers and other libraries doc, scan creates the .json file containing module and header units and their dependencies, which is then built into .ifc files. JTW That is read by the compiler option /sourceDependencies:directives:”the .json file” This .json file lists which headers can be built as header units and which can't be. +/headerUnit specifies which headers to translate to .ifc +If you plan to build header units for STL headers (or other libraries which support header-units.json, see below), it is also recommended to set +Translate Includes = Yes. If “Translate Includes to Imports” is enabled, the build will produce header units not only for the specified headers, but also for all headers that are included there and listed in STL library’s header-unit.json file (in the same directory as the header files). (JTW This is still somewhat mysterious to me) + +[Picture headerunit property pages](See doc building and using header units in VC projects.docx, search "translate includes") <-- might use screen shot from doc> + +3. Add a cpp file to it, say, HeaderUnits.cpp. +4. Edit HeaderUnits.cpp and add imports to all header that you want to use as header units. +For Instance, +Import ; +Import ; + +If “Translate Includes to Imports” is enabled, the build will produce header units not only for the specified headers, but also for all headers that are included there and listed in STL library’s header-unit.json file (in the same directory as the header files). This ensures minimal symbols duplication in the header units and best build throughput. + +## command line switches (need a better place or maybe no place?) + +/headerUnit - specifies headers to translate + can be direct path, "", or <> + /headerUnit:bracketed:"vector=c:\vector.ifc" + /headerUnit:quoted:"MyHeader.h=c:\MyHeader.ifc" + /headerUnit:c:\a.h=c:\a.ifc + + /exportHeader + /moduleOutput:path\filename.ifc + +/translateInclude + +## See also + +[MSVC Compiler Options](reference/compiler-options.md) From 8369a194dfc61a858824c2c53d016516a223a253 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 24 Mar 2021 14:23:18 -0700 Subject: [PATCH 02/82] 1st draft --- docs/build/cpp-header-units.md | 45 ---- docs/build/header-unit-strategies.md | 29 --- docs/build/media/empty-project-option.png | Bin 0 -> 21949 bytes docs/build/media/set-cpp-language-latest.png | Bin 0 -> 31462 bytes .../set-header-unit-library-settings.png | Bin 0 -> 30686 bytes .../media/vs2019-scan-module-dependencies.png | Bin 0 -> 44409 bytes docs/build/reference/headerunit.md | 13 ++ docs/build/toc.yml | 7 +- .../walkthrough-build-import-header-units.md | 92 -------- docs/build/walkthrough-header-units.md | 175 +++++++++++++++ .../walkthrough-import-stl-header-units.md | 202 ++++++++++++++---- 11 files changed, 352 insertions(+), 211 deletions(-) delete mode 100644 docs/build/cpp-header-units.md delete mode 100644 docs/build/header-unit-strategies.md create mode 100644 docs/build/media/empty-project-option.png create mode 100644 docs/build/media/set-cpp-language-latest.png create mode 100644 docs/build/media/set-header-unit-library-settings.png create mode 100644 docs/build/media/vs2019-scan-module-dependencies.png delete mode 100644 docs/build/walkthrough-build-import-header-units.md create mode 100644 docs/build/walkthrough-header-units.md diff --git a/docs/build/cpp-header-units.md b/docs/build/cpp-header-units.md deleted file mode 100644 index 782cf0dc7b5..00000000000 --- a/docs/build/cpp-header-units.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -description: "Learn more about C++ header units" -title: "C++ header units" -ms.date: "3/11/2021" -f1_keywords: ["header unit"] -helpviewer_keywords: ["header unit"] ---- - -# C++ header units - -This section is about C++ building and importing header units. If you want to learn about C++ 20 modules, see [](). -See [Speed up your compilation with Standard Template Library (STL) header units]() to learn how to import STL libraries for faster compilation throughput. - -## What is a header unit - -A header unit is an interpretation of a header file as if it was a self-contained translation unit that exports all declarations contained therein. They are used to provide some “module-like” feel to header files even though they lack the level of isolation and one definition rule (ODR) guarantees provided by named modules. Their essential use is to save on repeated processing of the same content of a header file in order to improve on compilation time. That requires ability to refer to the saved work, for re-use. Unfortunately, the semantics provided by a header file is really its content – not the filepath of the header file -- whereas a module is identified uniquely by its name. This document specifies the MSVC compiler switches recommended for producing the IFC files for header units, and how to consume them. In the process, it addresses a few weaknesses in the current IFC production. Consequently, the MSVC compiler needs to be modified to comply. - -### IFC files - -Want to describe what these are briefly? Also from Header Units: production and consumption by Gabriel Reis - - An IFC file is a binary format that stores the definition of a named module interface file or a header unit. This is the thing the compiler brings in when an *import* statement is processed. - -Brought in with /reference M=/path/to/some-file.ifc which establishes a mapping between the module name and where to find the corresponding IFC file. - -/exportHeader requests the generation of the .IFC file. - -Contrast with Shared PCH usage sample in Visual Studio (see https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/ - -See the following topics to help you with the way you'd like to use header units. - - - -## In this section - -[Compile faster with Standard Template Library (STL) header units](walkthrough-import-stl-header-units.md) -[Build and import header units](walkthrough-build-import-header-units.md) -[Strategies for reusing header units](header-unit-strategies.md) maybe this folds into the article above JTW -[header-unit.json reference](header-unit-json-reference.md) - -## See also - -[Modules docs]() -[Precompiled header docs]() -[ISO papers?]() \ No newline at end of file diff --git a/docs/build/header-unit-strategies.md b/docs/build/header-unit-strategies.md deleted file mode 100644 index 9f35f10cd31..00000000000 --- a/docs/build/header-unit-strategies.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: "Learn strategies for sharing C++ header units" -title: "Strategies for sharing C++ header units" -ms.date: "3/15/2021" -f1_keywords: ["header unit"] -helpviewer_keywords: ["header unit"] ---- - -# Strategies for sharing C++ header units - -Header units that are built as a part of a static library project, are automatically available to all directly and indirectly referencing projects. - -To use modules and header units built as a part of a dll project, their symbols have to be exported from the dll as any other C/C++ symbols and “All Modules arePublic” property should be set to true. - -If you build header units for the headers in your codebase, you might want to control which ones should be automatically available to all referencing projects and which ones should be “private” by specifying “Public C++ Modules Directories”. - -You might also want to specify “Public Include Directories” for your public headers to be automatically added to Include Directories (/I) in the referencing projects. - -[Picture of header unit property pages]( see Building and using header units in VC projects.docx under Reusing built header units between different projects) - -Ensure that projects that share header units are built with compatible compilation options, just as you would with shared pre-compiled headers. The compiler will issue warnings if it detects different compilation options in how the module or header unit was produced and how it is used. - -If you reference two or more projects that built two or more modules with the same name or two or more header unit for the same header file, you can use C/C++ > Additional Module dependencies & Additional Header Unit Dependencies to resolve those collisions by specifying which module or header unit should be used for this project. Otherwise the one that is chosen is undefined. - - - - -## See also - diff --git a/docs/build/media/empty-project-option.png b/docs/build/media/empty-project-option.png new file mode 100644 index 0000000000000000000000000000000000000000..42326545402cc4a84ccbbaf69190d5bd888c53e0 GIT binary patch literal 21949 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 EAD`7rDgXcg literal 0 HcmV?d00001 diff --git a/docs/build/media/vs2019-scan-module-dependencies.png b/docs/build/media/vs2019-scan-module-dependencies.png new file mode 100644 index 0000000000000000000000000000000000000000..db90ca9f4a7b2840e3b7ddab12db4dbcb3e6cf3d GIT binary patch literal 44409 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 literal 0 HcmV?d00001 diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index 73a599f5f11..81a3c85d0f6 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -58,3 +58,16 @@ cl ... /experimental:module /translateInclude /headerUnit C:\utils\util.h=C:\uti [`/module:exportHeader` (Create header units)](module-exportheader.md)\ [`/module:reference` (Use named module IFC)](module-reference.md)\ [`/translateInclude` (Translate include directives into import directives)](translateinclude.md)\ + +---- + +When a project has the ever the project system scans a file and finds an `import` determines that a header unit should be produced, it first consults this file + +Scan Sources for Module Dependencies = Yes According to Building header units for STL headers and other libraries doc, scan creates the .json file containing module and header units and their dependencies, which is then built into .ifc files. JTW That is read by the compiler option /sourceDependencies:directives:”the .json file” This .json file lists which headers can be built as header units and which can't be. +/headerUnit specifies which headers to translate to .ifc +If you plan to build header units for STL headers (or other libraries which support header-units.json, see below), it is also recommended to set +Translate Includes = Yes. If “Translate Includes to Imports” is enabled, the build will produce header units not only for the specified headers, but also for all headers that are included there and listed in STL library’s header-unit.json file (in the same directory as the header files). (JTW This is still somewhat mysterious to me) + + + +If “Translate Includes to Imports” is enabled, the build will produce header units not only for the specified headers, but also for all headers that are included there and listed in STL library’s header-unit.json file (in the same directory as the header files). This ensures minimal symbols duplication in the header units and best build throughput. diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 576fe7abddf..4d334ff2513 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -87,8 +87,11 @@ -name: Build C++ header units for STL headers and other libraries expanded: false items: - name: Header units - href: ../build/cpp-header-units.md + - name: Walkthrough: Build and import header units + href: ../build/walkthrough-header-units.md + - name: Walkthrough: Import STL libraries using header units + href: ../build/walkthrough-import-stl-header-units.md + - name: Precompiled header files href: ../build/creating-precompiled-header-files.md - name: C++ release builds diff --git a/docs/build/walkthrough-build-import-header-units.md b/docs/build/walkthrough-build-import-header-units.md deleted file mode 100644 index 4db6d891304..00000000000 --- a/docs/build/walkthrough-build-import-header-units.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -description: "Learn more about: Walkthrough: Compiling a C++/CX Program on the Command Line" -title: "Walkthrough: Build and import header units in Visual C++ projects" -ms.date: "3/11/2021" -f1_keywords: ["__vectorcall_cpp", "__vectorcall", "_vectorcall"] -helpviewer_keywords: ["__vectorcall keyword", "__vectorcall"] ---- -# Walkthrough: Build and import header units in your Visual C++ projects - -## Prerequisites - -Maybe list version - -## ? - -Before a header unit can be imported, it must be built. You can either tell the IDE which header units need to be built, or you can have the IDE scan for them. When a header file or module interface file (*.ixx) is built, it is also scanned for dependencies. - -### Automatic - -Perf issues with scanning for them (build throughput, intellisense init) that might not be desirable in large codebases that only make use of a few header units. - -set “Scan Sources for Module Dependencies” to “Yes” in C/C++ - General tab - -### Set properties - -To build as a header unit: - -.h files marked c/c++ compile will be compiled as header units -any file marked 'compile as header unit' - - -- right-click on the file in Solution Explorer, select Properties. Change Item Type to be C/C++ Compile (.h files are “C/C++ Include” by default), hit Apply. -- If the header file extension is different from “.h”, set “Compile As” to “Compile As Header Unit” in the C/C++ Advanced - -### Provide a list *.json thing - -## Building a header unit project - -This section about creating a project that builds your header units - -[this from](https://microsoft-my.sharepoint.com/:w:/p/gdr/Ea5Jy1oVuwxJpsiLYuem9FgBYioxSLmGER2QVPp4muq7vQ?e=4%3AW1atMJ&at=9&CID=AAA917D6-FC4D-41F0-9803-4DD2BD0B63CF&wdLOR=c6BFFEDA4-B56F-4FE8-AEFA-2F6A29107415) -cl /exportHeader /headerName:angle vector=/path/to/source/file - -for requesting the generation of an IFC file for header-name resolving to /path/to/source/file, and - -cl /exportHeader /headerName:quote my/header.h=/path/to/source/file - -for requesting the generation of an IFC file for header-name “my/header.h” resolving to /path/to/source/file. - -## Consuming header units - -If you want to use modules or header units built outside of your solution/codebase, you can use C/C++ > Additional Module dependencies & perhaps Additional Header Unit Dependencies. - - -[this from](https://microsoft-my.sharepoint.com/:w:/p/gdr/Ea5Jy1oVuwxJpsiLYuem9FgBYioxSLmGER2QVPp4muq7vQ?e=4%3AW1atMJ&at=9&CID=AAA917D6-FC4D-41F0-9803-4DD2BD0B63CF&wdLOR=c6BFFEDA4-B56F-4FE8-AEFA-2F6A29107415) -Using ifc search path: - -Using ifc search path: - -cl /ifcSearchDir [Dir1] /ifcSearchDir [Dir2] source.cpp - -In this case ifcs for header units (as well as named modules) will be found in the ifc search path by the names stored in the ifc. - -Using explicit /headerUnit reference - -/headerUnit:angle vector=/path/to/some-file.ifc - -The header file will be resolved by searching on the include path - -/headerUnit:quote my/header.h=/path/to/some-file.ifc - -The header file will be resolved by searching “my/header.h “ on the include path - -/headerUnit /path/to/header=/path/to/some-file.ifc - -The header file is explicitly specified by the path. - -In this case the resolved header path for import
or import “header” will be compared with the resolved header paths specified by /headerUnit* and the matching ifc will be used (without comparing the name stored in the ifc). - -## 3rd party - -IDE usage - -People can create header_units.json in their headers directories. - -To translate 3rd party library headers, they will need to use /headerUnit:* switches. - -In VC projects they will be able to specify headers to translate as Additional Header Units Dependencies - -## See also - -[MSVC Compiler Options](reference/compiler-options.md) diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md new file mode 100644 index 00000000000..73b1ca054bf --- /dev/null +++ b/docs/build/walkthrough-header-units.md @@ -0,0 +1,175 @@ +--- +description: "Learn more about C++ header units by converting a project to use header units instead of header includes" +title: "Walkthrough: Build and import header units in Visual C++ projects" +ms.date: "3/26/2021" +ms.custom: "conceptual" +f1_keywords: ["stl header unit", "stl module", "header unit"] +helpviewer_keywords: ["import"] +--- +# Walkthrough: Build and import header units in your Visual C++ projects + +## Prerequisites + +Support for header units requires Visual Studio 19.10 Preview 2. + +--- + +title: "C++ header units" +ms.date: "3/11/2021" +f1_keywords: ["header unit"] +helpviewer_keywords: ["header unit"] +--- + +# C++ header units + +This section is about C++ building and importing header units. If you want to learn about C++ 20 modules, see [](). +See [Speed up your compilation with Standard Template Library (STL) header units]() to learn how to import STL libraries for faster compilation throughput. + +## What is a header unit + +A header unit is an interpretation of a header file as if it was a self-contained translation unit that exports all declarations contained therein. They are used to provide some “module-like” feel to header files even though they lack the level of isolation and one definition rule (ODR) guarantees provided by named modules. Their essential use is to save on repeated processing of the same content of a header file in order to improve on compilation time. That requires ability to refer to the saved work, for re-use. Unfortunately, the semantics provided by a header file is really its content – not the filepath of the header file -- whereas a module is identified uniquely by its name. This document specifies the MSVC compiler switches recommended for producing the IFC files for header units, and how to consume them. In the process, it addresses a few weaknesses in the current IFC production. Consequently, the MSVC compiler needs to be modified to comply. + +### IFC files + +Want to describe what these are briefly? Also from Header Units: production and consumption by Gabriel Reis + + An IFC file is a binary format that stores the definition of a named module interface file or a header unit. This is the thing the compiler brings in when an *import* statement is processed. + +Brought in with /reference M=/path/to/some-file.ifc which establishes a mapping between the module name and where to find the corresponding IFC file. + +/exportHeader requests the generation of the .IFC file. + +Contrast with Shared PCH usage sample in Visual Studio (see https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/ + +See the following topics to help you with the way you'd like to use header units. + + + +## In this section + +[Compile faster with Standard Template Library (STL) header units](walkthrough-import-stl-header-units.md) +[Build and import header units](walkthrough-build-import-header-units.md) +[Strategies for reusing header units](header-unit-strategies.md) maybe this folds into the article above JTW +[header-unit.json reference](header-unit-json-reference.md) + +## See also + +[Modules docs]()\ +[Precompiled header docs]()\ +[ISO papers?]()\ +[/translateInclude]()\ +[/headerUnit]()\ +[/headerName]() + + +## ? + +Before a header unit can be imported, it must be built. You can either tell the IDE which header units need to be built, or you can have the IDE scan for them. When a header file or module interface file (*.ixx) is built, it is also scanned for dependencies. + +### Automatic + +Perf issues with scanning for them (build throughput, intellisense init) that might not be desirable in large codebases that only make use of a few header units. + +set “Scan Sources for Module Dependencies” to “Yes” in C/C++ - General tab + +### Set properties + +To build as a header unit: + +.h files marked c/c++ compile will be compiled as header units +any file marked 'compile as header unit' + + +- right-click on the file in Solution Explorer, select Properties. Change Item Type to be C/C++ Compile (.h files are “C/C++ Include” by default), hit Apply. +- If the header file extension is different from “.h”, set “Compile As” to “Compile As Header Unit” in the C/C++ Advanced + +### Provide a list *.json thing + +## Building a header unit project + +This section about creating a project that builds your header units + +[this from](https://microsoft-my.sharepoint.com/:w:/p/gdr/Ea5Jy1oVuwxJpsiLYuem9FgBYioxSLmGER2QVPp4muq7vQ?e=4%3AW1atMJ&at=9&CID=AAA917D6-FC4D-41F0-9803-4DD2BD0B63CF&wdLOR=c6BFFEDA4-B56F-4FE8-AEFA-2F6A29107415) +cl /exportHeader /headerName:angle vector=/path/to/source/file + +for requesting the generation of an IFC file for header-name resolving to /path/to/source/file, and + +cl /exportHeader /headerName:quote my/header.h=/path/to/source/file + +for requesting the generation of an IFC file for header-name “my/header.h” resolving to /path/to/source/file. + +## Consuming header units + +If you want to use modules or header units built outside of your solution/codebase, you can use C/C++ > Additional Module dependencies & perhaps Additional Header Unit Dependencies. + + +[this from](https://microsoft-my.sharepoint.com/:w:/p/gdr/Ea5Jy1oVuwxJpsiLYuem9FgBYioxSLmGER2QVPp4muq7vQ?e=4%3AW1atMJ&at=9&CID=AAA917D6-FC4D-41F0-9803-4DD2BD0B63CF&wdLOR=c6BFFEDA4-B56F-4FE8-AEFA-2F6A29107415) +Using ifc search path: + +Using ifc search path: + +cl /ifcSearchDir [Dir1] /ifcSearchDir [Dir2] source.cpp + +In this case ifcs for header units (as well as named modules) will be found in the ifc search path by the names stored in the ifc. + +Using explicit /headerUnit reference + +/headerUnit:angle vector=/path/to/some-file.ifc + +The header file will be resolved by searching on the include path + +/headerUnit:quote my/header.h=/path/to/some-file.ifc + +The header file will be resolved by searching “my/header.h “ on the include path + +/headerUnit /path/to/header=/path/to/some-file.ifc + +The header file is explicitly specified by the path. + +In this case the resolved header path for import
or import “header” will be compared with the resolved header paths specified by /headerUnit* and the matching ifc will be used (without comparing the name stored in the ifc). + +## Strategies for sharing C++ header units + +Header units that are built as a part of a static library project, are automatically available to all directly and indirectly referencing projects. + +To use modules and header units built as a part of a dll project, their symbols have to be exported from the dll as any other C/C++ symbols and “All Modules arePublic” property should be set to true. + +If you build header units for the headers in your codebase, you might want to control which ones should be automatically available to all referencing projects and which ones should be “private” by specifying “Public C++ Modules Directories”. + +You might also want to specify “Public Include Directories” for your public headers to be automatically added to Include Directories (/I) in the referencing projects. + +[Picture of header unit property pages]( see Building and using header units in VC projects.docx under Reusing built header units between different projects) + +Ensure that projects that share header units are built with compatible compilation options, just as you would with shared pre-compiled headers. The compiler will issue warnings if it detects different compilation options in how the module or header unit was produced and how it is used. + +If you reference two or more projects that built two or more modules with the same name or two or more header unit for the same header file, you can use C/C++ > Additional Module dependencies & Additional Header Unit Dependencies to resolve those collisions by specifying which module or header unit should be used for this project. Otherwise the one that is chosen is undefined. + + + +## 3rd party + +IDE usage + +People can create header_units.json in their headers directories. + +To translate 3rd party library headers, they will need to use /headerUnit:* switches. + +In VC projects they will be able to specify headers to translate as Additional Header Units Dependencies + +## command line switches (need a better place or maybe no place?) + +/headerUnit - specifies headers to translate + can be direct path, "", or <> + /headerUnit:bracketed:"vector=c:\vector.ifc" + /headerUnit:quoted:"MyHeader.h=c:\MyHeader.ifc" + /headerUnit:c:\a.h=c:\a.ifc + + /exportHeader + /moduleOutput:path\filename.ifc + +/translateInclude + + +## See also + +[MSVC Compiler Options](reference/compiler-options.md) diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 24401f3b497..b63f63a6723 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -1,68 +1,184 @@ --- -description: "Learn more about: Walkthrough: Compiling a C++/CX Program on the Command Line" -title: "Walkthrough: Import STL header units" -ms.date: "3/11/2021" -f1_keywords: ["__vectorcall_cpp", "__vectorcall", "_vectorcall"] -helpviewer_keywords: ["__vectorcall keyword", "__vectorcall"] +description: "Learn to use header units to import C++ Standard Template Library libraries faster." +title: "Walkthrough: Import STL libraries using header units" +ms.date: "3/26/2021" +ms.custom: "conceptual" +f1_keywords: ["stl header unit", "stl module", "header unit"] +helpviewer_keywords: ["import"] --- -# Walkthrough: Import STL header units +# Walkthrough: Import STL libraries using header units +This walkthrough shows two different ways to import C++ Standard Template Library (STL) libraries faster in Visual Studio. Importing a STL library as a header unit can be faster in situations where the library is repeatedly used in different files in your project. + +Before you can import a STL library this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a “module-like” experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module are not. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. + +An advantage of header units is that they can reduce compilation times, sometimes significantly, in cases where a library header is used by many files in a project. ## Prerequisites -Visual Studio 19.10 Preview x +Support for header units requires Visual Studio 19.10 Preview 2. + +## Two different approaches -## Building and using header units for STL headers +Before an STL header can be imported, it needs to be compiled into a header unit. There are two main approaches to doing this, which are demonstrated below. -### Option 1 +**Scan for module dependencies** -Enable “Scan All Sources for Module Dependencies” in all projects that use header units. This will make build system to scan all files for imported header units (by which I presume they mean stuff following *import* JTW) and build them (in the correct dependency order) before building the sources which use them if they have not been already built by referenced projects. +One approach requires minimal effort on your part and puts the burden on the build system. At a high level, it works by scanning your sources for `#include` statements, and tries to compile those header files and their dependencies into header units. It then imports the header unit instead of running the header file through the preprocessor. You don't even have to change your code from `#include ` to `import library;` This may be a good approach for you if your codebase isn't large, or you just want to try out header units without changing your code. -This option is convenient if you just want to try header units or for codebases with extensive use of different header units where modularization is more important than build throughput as scanning all sources will take additional build time, especially in big codebases. This option also does not guarantee that a header unit for a particular header will be built only once, though header units that are built by referenced static libraries projects will be re-used. +It may not be the optimal approach for larger projects because it can be time consuming to scan through the files looking for files to build into header units. And it may result in reprocessing the same header files repeatedly, thus negating the speed benefits of importing header units. Also, not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. -### Option 2 +See [Approach 1: Scan for headers](#approach1), in this article, for a walkthrough of this approach. -Create a special project (or projects) to build common header units and reference this project (or projects) in all other projects that use STL header units. -This option ensures that header units for a particular common header will be built only once during the build and then used everywhere. It is similar to using shared precompiled header file, though it is much simpler and more flexible. +**Create a shared library** -To create this special project, you can do the following: -1. Create an Empty C++ project. -2. Open project properties (make sure All Configurations and All Platforms are selected in the Project Properties UI) and set the following properties: -Configuration Properties - General -Configuration type = Static Library (.lib) -C++ Language Standard = ISO C++ 20 (or c++latest) +The recommended approach, particularly for larger projects, or for cases where you want to share a common set of header units across multiple projects, is to create a shared library that includes the STL libraries that you want to use. This library is then shared with projects that want to import those header units. It's somewhat similar to using shared [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but easier. -[Picture headerunit property pages](See doc building and using header units in VC projects.docx, search "to create this special project") Might just cut and paste that picture into our system +See [Approach 2: Build a shared library](#approach2), in this article, for a walkthrough of this approach. -Configuration Properties - C/C++ - General -Scan Sources for Module Dependencies = Yes According to Building header units for STL headers and other libraries doc, scan creates the .json file containing module and header units and their dependencies, which is then built into .ifc files. JTW That is read by the compiler option /sourceDependencies:directives:”the .json file” This .json file lists which headers can be built as header units and which can't be. -/headerUnit specifies which headers to translate to .ifc -If you plan to build header units for STL headers (or other libraries which support header-units.json, see below), it is also recommended to set -Translate Includes = Yes. If “Translate Includes to Imports” is enabled, the build will produce header units not only for the specified headers, but also for all headers that are included there and listed in STL library’s header-unit.json file (in the same directory as the header files). (JTW This is still somewhat mysterious to me) +## Approach 1: Scan for headers -[Picture headerunit property pages](See doc building and using header units in VC projects.docx, search "translate includes") <-- might use screen shot from doc> +We will begin with the easiest way to import STL libraries as header units, with the caveat that this approach may not be appropriate for larger projects because scanning the sources will take additional build time, especially in large projects. + +This option is convenient for codebases with extensive use of different header units, and where build throughput is not critical. This option also does not guarantee that a header unit for a particular header will be built only once; though header units that are built by referenced static libraries projects will be re-used. + +You can import your STL libraries as header units without modifying your code by setting two Visual C++ project options: +- **Scan Sources for Module Dependencies** +- **Translate Includes to Imports** -3. Add a cpp file to it, say, HeaderUnits.cpp. -4. Edit HeaderUnits.cpp and add imports to all header that you want to use as header units. -For Instance, -Import ; -Import ; +These settings cause the build system to scan your source code and look for `#include` statements to compile into header units. For each successfully compiled header unit, the compiler then treats it's corresponding `#include` as an `import` and reads in the compiled header header unit instead. There are additional ways to indicate that a header file should be treated as a header unit, which are covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). + +To demonstrate this approach, we'll create a simple project that imports a couple STL libraries, and then change the project properties so that it treats the library includes as header imports. + +### Create a C++ console app project + +This step creates a project that includes two libraries: `` and ``. The project settings will be modified so that the library headers are compiled into to header units, and `#include`is treated as `import`. +1. With Visual Studio, create a new C++ console app project. +1. Modify the source file as follows: +```cpp +#include +#include + +int main() +{ + std::vector numbers = {0, 1, 2}; + std::cout << numbers[1]; +} +``` + +### Set project options and run the project + +Using the following steps, set the option that cause the build system to scan for headers to compile into header units, and also the option that causes the compiler to treat `#include` as if you had written `import`: + +1. From the main menu, choose **Project** > **Properties**. The project properties window appears. +![Scan sources for module dependencies property](media/vs2019-scan-module-dependencies.png) + +1. Ensure that the **Configuration** dropdown is set to **All Configurations** +1. In the left-hand pane of the project property page, select **C/C++** > **General** +1. Set **Scan Sources for Module Dependencies** to **Yes** +1. Set **Translate Includes to Imports** to **Yes** + +Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: + +1. In the left-hand pane of the project property pages, select **C/C++** > **General** +1. Change the **C++ Language Standard** dropdown to **Preview - Features from the Latest C++ Working Draft** + +![Set language standard to preview version](media/set-cpp-language-latest.png) + +1. Click **OK** to close the project properties pages, and then build the solution (**Build** > **Build Solution** from the main menu, or press `F6`). + +You can run the solution to verify that it produces the expected output: `1` + +If you are updating an existing solution to use **Scan Sources for Module Dependencies**, set this property, as well as **Translate Includes to Imports**, in all of the projects in your solution where you want this behavior. + +The primary consideration of this approach is the balance between convenience, faster build times by using header units, and the cost of scanning all of your files to determine which header files to build as header units. + +You can fine tune this balance by not scanning for module dependencies, and instead explicitly marking which files should be built as header units. This is explored in more detail in [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) + +## Approach 2: Build a shared library -If “Translate Includes to Imports” is enabled, the build will produce header units not only for the specified headers, but also for all headers that are included there and listed in STL library’s header-unit.json file (in the same directory as the header files). This ensures minimal symbols duplication in the header units and best build throughput. +The preferred way to consume STL headers is to create a project, or projects, that build common header units from the STL headers you want to use. Then reference this project, or projects, from projects that need to import those STL headers. -## command line switches (need a better place or maybe no place?) +This option ensures that header units for a particular header will be built only once. It is similar to using shared precompiled header file, but easier. -/headerUnit - specifies headers to translate - can be direct path, "", or <> - /headerUnit:bracketed:"vector=c:\vector.ifc" - /headerUnit:quoted:"MyHeader.h=c:\MyHeader.ifc" - /headerUnit:c:\a.h=c:\a.ifc +In this example, you'll create a project that imports `` and ``. Once built, you'll be able to reference this shared project from another C++ project. Then, in the referencing project, everywhere `import ` or `import ` is encountered, it will import the built header unit for that library instead of running the contents of the library heder through the preprocessor. In projects that include the the same library header from multiple files, this will improve build performance because the header won't have to be processed repeatedly. Instead, the compiled header unit will be imported. - /exportHeader - /moduleOutput:path\filename.ifc +### Create the shared project -/translateInclude +Begin by creating the project that will build the shared units as follows: +1. Create an Empty C++ project. Call it, for the sake of this example, **SharedPrj**. **Empty C++ project** is one of the project types available on the **Create a new project** window: + +![Create a new empty C++ project](media/empty-project-option.png) + +2. Add a new (empty) C++ file to the project. Change the file's contents to the following: + +```cpp +import ; +import ; +``` + +### Set project properties + +Next, set project properties to share the header units from this project: + +1. From the Visual Studio main menu choose **Project** > **Properties**. The project properties window appears. +![Scan sources for module dependencies property](media/set-header-unit-library-settings.png) +1. Ensure that the **Configuration** dropdown is set to **All Configurations** +1. In the left-hand pane of the project property page, select **General** +1. Change the **Configuration Type** option to **Static library (.lib)** +1. Change **C++ Language Standard** to **Preview - Features from the Latest C++ Working Draft** +1. In the left-hand pane of the project property page, select **C/C++** > **General** +1. ![Scan sources for module dependencies property](media/vs2019-scan-module-dependencies.png) +1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** +1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the STL library’s header-unit.json file (see [Advanced](#advanced), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. +1. Click **OK** to close the project properties pages and then build the solution (**Build** > **Build Solution** from the main menu, or press `F6`). + +## Consume the STL header unit project + +Next, create a project that will use the built `` and `` STL header units: + +1. With the current solution still open, from the Visual Studio menu select **File** > **Add** > **New Project**. +1. Add a C++ Console app project. Call it **Walkthrough**, for this example. +1. Change the contents of its source file as follows: + +```cpp +import ; +import ; + +int main() +{ + std::vector numbers = {0, 1, 2}; + std::cout << numbers[1]; +} +``` + +Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: +1. In the **Solution Explorer**, select right-click the **Walkthrough** project and select **Properties**. The project properties window appears. +![Set language standard to preview version](media/set-cpp-language-latest.png) +1. In the left-hand pane of the **Walkthrough** project property pages, select **Configuration Properties** > **General** +1. Change **C++ Language Standard** to **Preview - Features from the Latest C++ Working Draft** +1. Click **OK** to close the project properties pages. +1. Add a reference from the **Walkthrough** project to the **SharedPrj** project. To do so, under the **Walkthrough** project, click on the **References** node, and select **Add Reference**. Select **SharedPrj** from the list of projects. What this reference accomplishes is that the build system will use the header units built by **SharedPrj** whenever an `import` in the **Walkthrough** project matches one of the built header units in **SharedPrj**. +1. Click **OK** to close the **Add Reference** dialog +1. Right-click the **Walkthrough** project and select **Set as Startup Project**. + +Then you can build the solution (**Build** > **Build Solution** from the main menu, or press `F6`) and run it to see that it produces the expected output: `1` + +The advantage of this approach is that you can reference the static library from any project and reuse the header units from it. In this example, that's `` and ``. + +You could make a monolithic library containing all the commonly used STL headers that you want to import from your various projects, or you could produce multiple shared libraries that have different groupings of STL libraries that you want to import as header units. Then reference those projects as needed. + +The result should be increased build throughput because the header units are only built once, and then imported without having to reprocess them, as would be the case if you brought them in via `#include`. + +It is important when you do this with your own projects that you build the shared library using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the shared library. + +## Advanced + +Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There is an allow-list, for the STL headers, that the build system consults to determine which STL libraries can be compiled into a header unit. + +The file `header-units.json` is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. + ## See also -[MSVC Compiler Options](reference/compiler-options.md) +[Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) \ No newline at end of file From 7c6e265bd22e26a375fc5ca18c19d80581e47eb4 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 24 Mar 2021 15:49:24 -0700 Subject: [PATCH 03/82] acrolinx --- docs/build/header-unit-json-reference.md | 64 +++++++------------ docs/build/toc.yml | 9 +-- docs/build/walkthrough-header-units.md | 55 +++++++--------- .../walkthrough-import-stl-header-units.md | 42 ++++++------ 4 files changed, 73 insertions(+), 97 deletions(-) diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index 879dcd2ec3c..1811f6c44d7 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -1,61 +1,45 @@ --- description: "Reference for header_units.json format" title: "C++ header unit.json reference" -ms.date: "3/15/2021" -f1_keywords: ["header unit"] -helpviewer_keywords: ["header unit"] +ms.date: "3/21/2021" +f1_keywords: ["header_units.json"] +helpviewer_keywords: ["header_units.json", "header unit"] --- # C++ header_units.json reference ## Format -The format of the header_units.json (as well as file name and location) is up to the compilers and libraries, build system will not “know” about it as it does not know upfront which headers and from which directories will be used. - +The `header-units.json` file lists which header files can be compiled into header units. +Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. In that case, it is either not listed, or commented out. -At minimum (vcpkg feedback was to avoid wildcards), it can be something like this +The C++ Standard Template Library (STL) `header-units.json` file is located at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include` - +The format of the `header_units.json` file is a version, followed by an array of headers that can be built into header units. For example, +```json { - - "Version": "1.0", - - "BuildAsHeaderUnits": [ - -“relative\path\to\header1.h”, - -“relative\path\to\header2.h” - -] - -} - - - -Or, if we allow wildcards: - - - -{ - - "Version": "1.0", - - "BuildAsHeaderUnits": [*] <- can contain wildcards - - "Exclude": [foo.h] <- can contain wildcards - + "Version": "1.0", + "BuildAsHeaderUnits": [ + "__msvc_system_error_abi.hpp", + "algorithm", + "any", + "array", + "atomic", + "barrier", + "bit", + "bitset", + // "cassert", // design is permanently incompatible with header units + ... } +``` ## Search rules -Header directory - -If the header directory is not on include path, the directory on the include path which was used to find this header. +The build system looks for this file on the include path. ## See also -[Modules docs]() -[Precompiled header docs]() -[ISO papers?]() \ No newline at end of file +[Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) +[Build faster using Standard Template Library (STL) header units]() to learn how to import STL libraries for faster compilation throughput. \ No newline at end of file diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 4d334ff2513..353b3009945 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -48,6 +48,8 @@ href: ../build/tasks-vs-json-schema-reference-cpp.md - name: Launch.vs.json schema reference (C++) href: ../build/launch-vs-schema-reference-cpp.md + - name: header-unit-json schema reference (C++) + - href: ../build/header-unit-json-reference.md - name: CMake projects expanded: false items: @@ -84,14 +86,13 @@ href: ../build/vcpkg-command-line-reference.md - name: "C++ Build Insights" href: ../build-insights/get-started-with-cpp-build-insights.md --name: Build C++ header units for STL headers and other libraries +- name: Build C++ header units for STL and other headers expanded: false items: - - name: Walkthrough: Build and import header units + - name: Walkthrough: Build and import header units in Visual C++ projects href: ../build/walkthrough-header-units.md - - name: Walkthrough: Import STL libraries using header units + - name: Walkthrough: Build faster using Standard Template Library (STL) header units href: ../build/walkthrough-import-stl-header-units.md - - name: Precompiled header files href: ../build/creating-precompiled-header-files.md - name: C++ release builds diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 73b1ca054bf..815898f373f 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -1,33 +1,25 @@ --- -description: "Learn more about C++ header units by converting a project to use header units instead of header includes" +description: "Learn more about C++ header units by converting a project to use header units" title: "Walkthrough: Build and import header units in Visual C++ projects" ms.date: "3/26/2021" ms.custom: "conceptual" -f1_keywords: ["stl header unit", "stl module", "header unit"] -helpviewer_keywords: ["import"] +f1_keywords: [] +helpviewer_keywords: ["import", "header unit", "ifc", "stl"] --- -# Walkthrough: Build and import header units in your Visual C++ projects -## Prerequisites - -Support for header units requires Visual Studio 19.10 Preview 2. +# Walkthrough: Build faster with header units ---- +This section is about building and importing header units in Microsoft Visual C++ in general. -title: "C++ header units" -ms.date: "3/11/2021" -f1_keywords: ["header unit"] -helpviewer_keywords: ["header unit"] ---- +See [Walkthrough: Import STL libraries using header units]() to learn how to increase build time for projects that use STL libraries by importing them as header units. -# C++ header units +## Prerequisites -This section is about C++ building and importing header units. If you want to learn about C++ 20 modules, see [](). -See [Speed up your compilation with Standard Template Library (STL) header units]() to learn how to import STL libraries for faster compilation throughput. +Support for header units requires Visual Studio 19.10 Preview 2. ## What is a header unit -A header unit is an interpretation of a header file as if it was a self-contained translation unit that exports all declarations contained therein. They are used to provide some “module-like” feel to header files even though they lack the level of isolation and one definition rule (ODR) guarantees provided by named modules. Their essential use is to save on repeated processing of the same content of a header file in order to improve on compilation time. That requires ability to refer to the saved work, for re-use. Unfortunately, the semantics provided by a header file is really its content – not the filepath of the header file -- whereas a module is identified uniquely by its name. This document specifies the MSVC compiler switches recommended for producing the IFC files for header units, and how to consume them. In the process, it addresses a few weaknesses in the current IFC production. Consequently, the MSVC compiler needs to be modified to comply. +A header unit is an interpretation of a header file as if it was a self-contained translation unit that exports all declarations contained therein. They are used to provide some “module-like” feel to header files even though they lack the level of isolation and one definition rule (ODR) guarantees provided by named modules. Their essential use is to save on repeated processing of the same content of a header file in order to improve on compilation time. That requires ability to refer to the saved work, for re-use. Unfortunately, the semantics provided by a header file is really its content – not the filepath of the header file -- whereas a module is identified uniquely by its name. This document specifies the MSVC compiler switches recommended for producing the IFC files for header units, and how to consume them. In the process, it addresses a few weaknesses in the current IFC production. Consequently, the MSVC compiler needs to be modified to comply. ### IFC files @@ -43,8 +35,6 @@ Contrast with Shared PCH usage sample in Visual Studio (see https://devblogs.mic See the following topics to help you with the way you'd like to use header units. - - ## In this section [Compile faster with Standard Template Library (STL) header units](walkthrough-import-stl-header-units.md) @@ -108,25 +98,25 @@ Using ifc search path: Using ifc search path: -cl /ifcSearchDir [Dir1] /ifcSearchDir [Dir2] source.cpp +`cl /ifcSearchDir [Dir1] /ifcSearchDir [Dir2] source.cpp ` -In this case ifcs for header units (as well as named modules) will be found in the ifc search path by the names stored in the ifc. +In this case `ifcs` for header units (as well as named modules) will be found in the ifc search path by the names stored in the ifc. -Using explicit /headerUnit reference +Using explicit `/headerUnit` reference -/headerUnit:angle vector=/path/to/some-file.ifc +`/headerUnit:angle vector=/path/to/some-file.ifc` -The header file will be resolved by searching on the include path +The header file will be resolved by searching `` on the include path -/headerUnit:quote my/header.h=/path/to/some-file.ifc +`/headerUnit:quote my/header.h=/path/to/some-file.ifc ` -The header file will be resolved by searching “my/header.h “ on the include path +The header file will be resolved by searching `"my/header.h"` on the include path: -/headerUnit /path/to/header=/path/to/some-file.ifc +`/headerUnit /path/to/header=/path/to/some-file.ifc` The header file is explicitly specified by the path. -In this case the resolved header path for import
or import “header” will be compared with the resolved header paths specified by /headerUnit* and the matching ifc will be used (without comparing the name stored in the ifc). +In this case the resolved header path for import `
` or `import "header"` will be compared with the resolved header paths specified by `/headerUnit*` and the matching `.ifc` will be used (without comparing the name stored in the `.ifc`). ## Strategies for sharing C++ header units @@ -144,8 +134,6 @@ Ensure that projects that share header units are built with compatible compilati If you reference two or more projects that built two or more modules with the same name or two or more header unit for the same header file, you can use C/C++ > Additional Module dependencies & Additional Header Unit Dependencies to resolve those collisions by specifying which module or header unit should be used for this project. Otherwise the one that is chosen is undefined. - - ## 3rd party IDE usage @@ -169,7 +157,10 @@ In VC projects they will be able to specify headers to translate as Additional H /translateInclude - ## See also -[MSVC Compiler Options](reference/compiler-options.md) +[Overview of modules in C++](../cpp/modules-cpp.md) +[`/translateInclude`](./reference/translateinclude.md) +[`/exportHeader`](./reference/module-exportheader.md) +[`/headerUnit`](./reference/headerunit.md) +[Build faster using Standard Template Library (STL) header units]() to learn how to import STL libraries for faster compilation throughput. \ No newline at end of file diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index b63f63a6723..a27bc397ffb 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -1,16 +1,16 @@ --- -description: "Learn to use header units to import C++ Standard Template Library libraries faster." +description: "Learn to use header units to import C++ Standard Template Library (STL) libraries faster." title: "Walkthrough: Import STL libraries using header units" ms.date: "3/26/2021" ms.custom: "conceptual" f1_keywords: ["stl header unit", "stl module", "header unit"] helpviewer_keywords: ["import"] --- -# Walkthrough: Import STL libraries using header units +# Walkthrough: Build faster using Standard Template Library (STL) header units This walkthrough shows two different ways to import C++ Standard Template Library (STL) libraries faster in Visual Studio. Importing a STL library as a header unit can be faster in situations where the library is repeatedly used in different files in your project. -Before you can import a STL library this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a “module-like” experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module are not. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. +Before you can import a STL library this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a “module-like” experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. An advantage of header units is that they can reduce compilation times, sometimes significantly, in cases where a library header is used by many files in a project. @@ -24,31 +24,31 @@ Before an STL header can be imported, it needs to be compiled into a header unit **Scan for module dependencies** -One approach requires minimal effort on your part and puts the burden on the build system. At a high level, it works by scanning your sources for `#include` statements, and tries to compile those header files and their dependencies into header units. It then imports the header unit instead of running the header file through the preprocessor. You don't even have to change your code from `#include ` to `import library;` This may be a good approach for you if your codebase isn't large, or you just want to try out header units without changing your code. +One approach requires minimal effort on your part and puts the burden on the build system. At a high level, it works by scanning your sources for `#include` statements, and tries to compile those header files and their dependencies into header units. It then imports the header unit instead of running the header file through the preprocessor. You don't even have to change your code from `#include ` to `import library;`. This may be a good approach for you if your codebase isn't large, or you just want to try out header units without changing your code. -It may not be the optimal approach for larger projects because it can be time consuming to scan through the files looking for files to build into header units. And it may result in reprocessing the same header files repeatedly, thus negating the speed benefits of importing header units. Also, not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. +It may not be the optimal approach for larger projects because it can be time consuming to scan through the files looking for files to build into header units. And it may result in reprocessing the same header files repeatedly, negating the speed benefits of importing header units. Also, not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. See [Approach 1: Scan for headers](#approach1), in this article, for a walkthrough of this approach. **Create a shared library** -The recommended approach, particularly for larger projects, or for cases where you want to share a common set of header units across multiple projects, is to create a shared library that includes the STL libraries that you want to use. This library is then shared with projects that want to import those header units. It's somewhat similar to using shared [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but easier. +The recommended approach, particularly for larger projects, or for cases where you want to share a common set of header units across multiple projects, is to create a shared library that includes the STL libraries that you want to use. This library is then shared with projects that want to import those header units. It's like using shared [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but easier. See [Approach 2: Build a shared library](#approach2), in this article, for a walkthrough of this approach. ## Approach 1: Scan for headers -We will begin with the easiest way to import STL libraries as header units, with the caveat that this approach may not be appropriate for larger projects because scanning the sources will take additional build time, especially in large projects. +We'll begin with the easiest way to import STL libraries as header units, with the caveat that this approach may not be appropriate for larger projects because scanning the sources will take additional build time, especially in large projects. -This option is convenient for codebases with extensive use of different header units, and where build throughput is not critical. This option also does not guarantee that a header unit for a particular header will be built only once; though header units that are built by referenced static libraries projects will be re-used. +This option is convenient for codebases with extensive use of different header units, and where build throughput isn't critical. This option also doesn't guarantee that a header unit for a particular header will be built only once; though header units that are built by referenced static libraries projects will be reused. You can import your STL libraries as header units without modifying your code by setting two Visual C++ project options: - **Scan Sources for Module Dependencies** - **Translate Includes to Imports** -These settings cause the build system to scan your source code and look for `#include` statements to compile into header units. For each successfully compiled header unit, the compiler then treats it's corresponding `#include` as an `import` and reads in the compiled header header unit instead. There are additional ways to indicate that a header file should be treated as a header unit, which are covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). +These settings cause the build system to scan your source code and look for `#include` statements to compile into header units. For each successfully compiled header unit, the compiler then treats its corresponding `#include` as an `import` and reads in the compiled header unit instead. There are additional ways to indicate that a header file should be treated as a header unit, which are covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). -To demonstrate this approach, we'll create a simple project that imports a couple STL libraries, and then change the project properties so that it treats the library includes as header imports. +To demonstrate this approach, we'll create a project that imports a couple STL libraries, and then change the project properties so that it treats the library includes as header imports. ### Create a C++ console app project @@ -68,10 +68,10 @@ int main() ### Set project options and run the project -Using the following steps, set the option that cause the build system to scan for headers to compile into header units, and also the option that causes the compiler to treat `#include` as if you had written `import`: +Using the following steps, set the options that cause the build system to scan for headers to compile into header units, and also the option that causes the compiler to treat `#include` as if you had written `import`: 1. From the main menu, choose **Project** > **Properties**. The project properties window appears. -![Scan sources for module dependencies property](media/vs2019-scan-module-dependencies.png) +![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Ensure that the **Configuration** dropdown is set to **All Configurations** 1. In the left-hand pane of the project property page, select **C/C++** > **General** @@ -89,19 +89,19 @@ Change the C++ language standard for the compiler. The latest preview setting is You can run the solution to verify that it produces the expected output: `1` -If you are updating an existing solution to use **Scan Sources for Module Dependencies**, set this property, as well as **Translate Includes to Imports**, in all of the projects in your solution where you want this behavior. +If you are updating an existing solution to use **Scan Sources for Module Dependencies**, set this property, and **Translate Includes to Imports**, in all of the projects in your solution where you want this behavior. The primary consideration of this approach is the balance between convenience, faster build times by using header units, and the cost of scanning all of your files to determine which header files to build as header units. -You can fine tune this balance by not scanning for module dependencies, and instead explicitly marking which files should be built as header units. This is explored in more detail in [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) +You can fine-tune this balance by not scanning for module dependencies, and instead explicitly marking which files should be built as header units. This is explored in more detail in [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) ## Approach 2: Build a shared library The preferred way to consume STL headers is to create a project, or projects, that build common header units from the STL headers you want to use. Then reference this project, or projects, from projects that need to import those STL headers. -This option ensures that header units for a particular header will be built only once. It is similar to using shared precompiled header file, but easier. +This option ensures that header units for a particular header will be built only once. It's similar to using shared precompiled header file, but easier. -In this example, you'll create a project that imports `` and ``. Once built, you'll be able to reference this shared project from another C++ project. Then, in the referencing project, everywhere `import ` or `import ` is encountered, it will import the built header unit for that library instead of running the contents of the library heder through the preprocessor. In projects that include the the same library header from multiple files, this will improve build performance because the header won't have to be processed repeatedly. Instead, the compiled header unit will be imported. +In this example, you'll create a project that imports `` and ``. Once built, you'll reference this shared project from another C++ project. Then, in the referencing project, everywhere `import ` or `import ` is found, it will import the built header unit for that library instead of running the contents of the library header through the preprocessor. In projects that include the same library header from multiple files, this will improve build performance because the header won't have to be processed repeatedly. Instead, the compiled header unit will be imported. ### Create the shared project @@ -122,14 +122,14 @@ import ; Next, set project properties to share the header units from this project: -1. From the Visual Studio main menu choose **Project** > **Properties**. The project properties window appears. -![Scan sources for module dependencies property](media/set-header-unit-library-settings.png) +1. From the Visual Studio main menu, choose **Project** > **Properties**. The project properties window appears. +![Settings for Configuration type and C++ language standard](media/set-header-unit-library-settings.png) 1. Ensure that the **Configuration** dropdown is set to **All Configurations** 1. In the left-hand pane of the project property page, select **General** 1. Change the **Configuration Type** option to **Static library (.lib)** 1. Change **C++ Language Standard** to **Preview - Features from the Latest C++ Working Draft** 1. In the left-hand pane of the project property page, select **C/C++** > **General** -1. ![Scan sources for module dependencies property](media/vs2019-scan-module-dependencies.png) +1. ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** 1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the STL library’s header-unit.json file (see [Advanced](#advanced), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. 1. Click **OK** to close the project properties pages and then build the solution (**Build** > **Build Solution** from the main menu, or press `F6`). @@ -171,11 +171,11 @@ You could make a monolithic library containing all the commonly used STL headers The result should be increased build throughput because the header units are only built once, and then imported without having to reprocess them, as would be the case if you brought them in via `#include`. -It is important when you do this with your own projects that you build the shared library using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the shared library. +It's important when you do this with your own projects that you build the shared library using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the shared library. ## Advanced -Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There is an allow-list, for the STL headers, that the build system consults to determine which STL libraries can be compiled into a header unit. +Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist, for the STL headers, that the build system consults to determine which STL libraries can be compiled into a header unit. The file `header-units.json` is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. From b6446b17958ae61cdd0f5cfc29ae38ce1ff01cb4 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 24 Mar 2021 15:55:50 -0700 Subject: [PATCH 04/82] fix toc --- docs/build/toc.yml | 2 +- docs/build/walkthrough-header-units.md | 17 ----------------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 353b3009945..1881492e461 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -86,7 +86,7 @@ href: ../build/vcpkg-command-line-reference.md - name: "C++ Build Insights" href: ../build-insights/get-started-with-cpp-build-insights.md -- name: Build C++ header units for STL and other headers +- name: "Build C++ header units for STL and other headers" expanded: false items: - name: Walkthrough: Build and import header units in Visual C++ projects diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 815898f373f..770235806b8 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -37,23 +37,6 @@ See the following topics to help you with the way you'd like to use header units ## In this section -[Compile faster with Standard Template Library (STL) header units](walkthrough-import-stl-header-units.md) -[Build and import header units](walkthrough-build-import-header-units.md) -[Strategies for reusing header units](header-unit-strategies.md) maybe this folds into the article above JTW -[header-unit.json reference](header-unit-json-reference.md) - -## See also - -[Modules docs]()\ -[Precompiled header docs]()\ -[ISO papers?]()\ -[/translateInclude]()\ -[/headerUnit]()\ -[/headerName]() - - -## ? - Before a header unit can be imported, it must be built. You can either tell the IDE which header units need to be built, or you can have the IDE scan for them. When a header file or module interface file (*.ixx) is built, it is also scanned for dependencies. ### Automatic From ad42c9c65ec3729a1c08d833d5fbc331e412b224 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 24 Mar 2021 16:16:11 -0700 Subject: [PATCH 05/82] fix toc --- docs/build/toc.yml | 4 ++-- .../walkthrough-import-stl-header-units.md | 22 ++++++++++--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 1881492e461..e93c309cf5a 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -89,9 +89,9 @@ - name: "Build C++ header units for STL and other headers" expanded: false items: - - name: Walkthrough: Build and import header units in Visual C++ projects + - name: "Walkthrough: Build and import header units in Visual C++ projects" href: ../build/walkthrough-header-units.md - - name: Walkthrough: Build faster using Standard Template Library (STL) header units + - name: "Walkthrough: Build faster using Standard Template Library (STL) header units" href: ../build/walkthrough-import-stl-header-units.md - name: Precompiled header files href: ../build/creating-precompiled-header-files.md diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index a27bc397ffb..27fdbca4239 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -8,11 +8,11 @@ helpviewer_keywords: ["import"] --- # Walkthrough: Build faster using Standard Template Library (STL) header units -This walkthrough shows two different ways to import C++ Standard Template Library (STL) libraries faster in Visual Studio. Importing a STL library as a header unit can be faster in situations where the library is repeatedly used in different files in your project. +This walkthrough shows two different ways to import C++ Standard Template Library (STL) libraries faster in Visual Studio. Importing an STL library as a header unit can be faster in situations where the library is repeatedly used in different files in your project. -Before you can import a STL library this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a “module-like” experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. +Before you can import an STL library this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a “module-like” experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. -An advantage of header units is that they can reduce compilation times, sometimes significantly, in cases where a library header is used by many files in a project. +An advantage of header units is that they can reduce compilation times. Sometimes significantly, in cases where a library header is used by many files in a project. ## Prerequisites @@ -38,15 +38,15 @@ See [Approach 2: Build a shared library](#approach2), in this article, for a wal ## Approach 1: Scan for headers -We'll begin with the easiest way to import STL libraries as header units, with the caveat that this approach may not be appropriate for larger projects because scanning the sources will take additional build time, especially in large projects. +We'll begin with the easiest way to import STL libraries as header units. This approach may not be appropriate for larger projects because scanning the sources will take additional build time, especially in large projects. -This option is convenient for codebases with extensive use of different header units, and where build throughput isn't critical. This option also doesn't guarantee that a header unit for a particular header will be built only once; though header units that are built by referenced static libraries projects will be reused. +This option is convenient for codebases with extensive use of different header units, and where build throughput isn't critical. This option also doesn't guarantee that a header unit for a particular header will be built only once. Although, header units that are built by referenced static libraries projects will be reused. You can import your STL libraries as header units without modifying your code by setting two Visual C++ project options: - **Scan Sources for Module Dependencies** - **Translate Includes to Imports** -These settings cause the build system to scan your source code and look for `#include` statements to compile into header units. For each successfully compiled header unit, the compiler then treats its corresponding `#include` as an `import` and reads in the compiled header unit instead. There are additional ways to indicate that a header file should be treated as a header unit, which are covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). +These settings cause the build system to scan your source code and look for `#include` statements to compile into header units. For each successfully compiled header unit, the compiler then treats its corresponding `#include` as an `import` and reads in the compiled header unit instead. There are other ways to indicate that a header file should be treated as a header unit, which are covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). To demonstrate this approach, we'll create a project that imports a couple STL libraries, and then change the project properties so that it treats the library includes as header imports. @@ -89,9 +89,11 @@ Change the C++ language standard for the compiler. The latest preview setting is You can run the solution to verify that it produces the expected output: `1` -If you are updating an existing solution to use **Scan Sources for Module Dependencies**, set this property, and **Translate Includes to Imports**, in all of the projects in your solution where you want this behavior. +If you are updating an existing solution to use **Scan Sources for Module Dependencies**, set this property, and **Translate Includes to Imports**, in all of the projects in your solution that should have this behavior. -The primary consideration of this approach is the balance between convenience, faster build times by using header units, and the cost of scanning all of your files to determine which header files to build as header units. +The primary considerations of this approach are the balance between convenience and: +- faster build times by using header units +- the cost of scanning all of your files to determine which header files to build as header units. You can fine-tune this balance by not scanning for module dependencies, and instead explicitly marking which files should be built as header units. This is explored in more detail in [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) @@ -167,7 +169,7 @@ Then you can build the solution (**Build** > **Build Solution** from the main me The advantage of this approach is that you can reference the static library from any project and reuse the header units from it. In this example, that's `` and ``. -You could make a monolithic library containing all the commonly used STL headers that you want to import from your various projects, or you could produce multiple shared libraries that have different groupings of STL libraries that you want to import as header units. Then reference those projects as needed. +You could make a monolithic library containing all the commonly used STL headers that you want to import from your various projects. Or, you could produce multiple shared libraries that have different groupings of STL libraries that you want to import as header units. Then reference those projects as needed. The result should be increased build throughput because the header units are only built once, and then imported without having to reprocess them, as would be the case if you brought them in via `#include`. @@ -175,7 +177,7 @@ It's important when you do this with your own projects that you build the shared ## Advanced -Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist, for the STL headers, that the build system consults to determine which STL libraries can be compiled into a header unit. +Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers. The build system consults it to determine which STL libraries can be compiled into header units. The file `header-units.json` is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. From 704c46c60fc639c05229b3d8b78d841ae4dc00d5 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 24 Mar 2021 16:31:52 -0700 Subject: [PATCH 06/82] fix toc --- docs/build/toc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/toc.yml b/docs/build/toc.yml index e93c309cf5a..3fe3f787c38 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -49,7 +49,7 @@ - name: Launch.vs.json schema reference (C++) href: ../build/launch-vs-schema-reference-cpp.md - name: header-unit-json schema reference (C++) - - href: ../build/header-unit-json-reference.md + href: ../build/header-unit-json-reference.md - name: CMake projects expanded: false items: From 47176c1935d7117a8a44e2e4d270580daa8d95cd Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 25 Mar 2021 10:44:06 -0700 Subject: [PATCH 07/82] draft --- docs/build/toc.yml | 2 +- docs/build/walkthrough-header-units.md | 24 ++---- .../walkthrough-import-stl-header-units.md | 73 +++++++++---------- 3 files changed, 42 insertions(+), 57 deletions(-) diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 3fe3f787c38..ffebfdf1dac 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -91,7 +91,7 @@ items: - name: "Walkthrough: Build and import header units in Visual C++ projects" href: ../build/walkthrough-header-units.md - - name: "Walkthrough: Build faster using Standard Template Library (STL) header units" + - name: "Walkthrough: Import STL libraries as header units" href: ../build/walkthrough-import-stl-header-units.md - name: Precompiled header files href: ../build/creating-precompiled-header-files.md diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 770235806b8..de811b7dccf 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -1,17 +1,17 @@ --- description: "Learn more about C++ header units by converting a project to use header units" title: "Walkthrough: Build and import header units in Visual C++ projects" -ms.date: "3/26/2021" +ms.date: "4/13/2021" ms.custom: "conceptual" f1_keywords: [] helpviewer_keywords: ["import", "header unit", "ifc", "stl"] --- -# Walkthrough: Build faster with header units +# Walkthrough: Build and import header units in Visual C++ projects -This section is about building and importing header units in Microsoft Visual C++ in general. +This section is about building and importing header units in Microsoft Visual C++. -See [Walkthrough: Import STL libraries using header units]() to learn how to increase build time for projects that use STL libraries by importing them as header units. +See [Walkthrough: Import STL libraries using header units]() to learn specifically how to import STL libraries as header units. ## Prerequisites @@ -19,21 +19,11 @@ Support for header units requires Visual Studio 19.10 Preview 2. ## What is a header unit -A header unit is an interpretation of a header file as if it was a self-contained translation unit that exports all declarations contained therein. They are used to provide some “module-like” feel to header files even though they lack the level of isolation and one definition rule (ODR) guarantees provided by named modules. Their essential use is to save on repeated processing of the same content of a header file in order to improve on compilation time. That requires ability to refer to the saved work, for re-use. Unfortunately, the semantics provided by a header file is really its content – not the filepath of the header file -- whereas a module is identified uniquely by its name. This document specifies the MSVC compiler switches recommended for producing the IFC files for header units, and how to consume them. In the process, it addresses a few weaknesses in the current IFC production. Consequently, the MSVC compiler needs to be modified to comply. +Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a “module-like” experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. Also, unlike `#include` files, header units are not affected by the order they are imported in. -### IFC files +Header units are a simpler alternative to using [precompiled header files](creating-precompiled-header-files.md) Header units are easier to setup and easier to use than a [shared PCH](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio), while providing similar performance benefits. Also, unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. -Want to describe what these are briefly? Also from Header Units: production and consumption by Gabriel Reis - - An IFC file is a binary format that stores the definition of a named module interface file or a header unit. This is the thing the compiler brings in when an *import* statement is processed. - -Brought in with /reference M=/path/to/some-file.ifc which establishes a mapping between the module name and where to find the corresponding IFC file. - -/exportHeader requests the generation of the .IFC file. - -Contrast with Shared PCH usage sample in Visual Studio (see https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/ - -See the following topics to help you with the way you'd like to use header units. +<< under construction >> ## In this section diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 27fdbca4239..747cec92768 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -1,18 +1,18 @@ --- -description: "Learn to use header units to import C++ Standard Template Library (STL) libraries faster." -title: "Walkthrough: Import STL libraries using header units" -ms.date: "3/26/2021" +description: "Learn to use header units to import C++ Standard Template Library (STL) libraries." +title: "Walkthrough: Import Standard Template Library (STL) libraries using header units" +ms.date: "4/13/2021" ms.custom: "conceptual" f1_keywords: ["stl header unit", "stl module", "header unit"] helpviewer_keywords: ["import"] --- -# Walkthrough: Build faster using Standard Template Library (STL) header units +# Walkthrough: Import STL libraries as header units -This walkthrough shows two different ways to import C++ Standard Template Library (STL) libraries faster in Visual Studio. Importing an STL library as a header unit can be faster in situations where the library is repeatedly used in different files in your project. +This walkthrough shows two different ways to import C++ Standard Template Library (STL) libraries as header units in Visual Studio. -Before you can import an STL library this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a “module-like” experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. +Importing an STL library as a header unit is a simpler alternative to using [precompiled header files](creating-precompiled-header-files.md) Header units are easier to setup and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Also, unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. -An advantage of header units is that they can reduce compilation times. Sometimes significantly, in cases where a library header is used by many files in a project. +Before you can import an STL library this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a “module-like” experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. Also, unlike `#include` files, header units are not affected by the order they are imported in. ## Prerequisites @@ -26,19 +26,19 @@ Before an STL header can be imported, it needs to be compiled into a header unit One approach requires minimal effort on your part and puts the burden on the build system. At a high level, it works by scanning your sources for `#include` statements, and tries to compile those header files and their dependencies into header units. It then imports the header unit instead of running the header file through the preprocessor. You don't even have to change your code from `#include ` to `import library;`. This may be a good approach for you if your codebase isn't large, or you just want to try out header units without changing your code. -It may not be the optimal approach for larger projects because it can be time consuming to scan through the files looking for files to build into header units. And it may result in reprocessing the same header files repeatedly, negating the speed benefits of importing header units. Also, not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. +It may not be the optimal approach for larger projects because it can be time consuming to scan through the files looking for files to build into header units. And it may result in reprocessing the same header files repeatedly, increasing build time. Not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. See [Approach 1: Scan for headers](#approach1), in this article, for a walkthrough of this approach. **Create a shared library** -The recommended approach, particularly for larger projects, or for cases where you want to share a common set of header units across multiple projects, is to create a shared library that includes the STL libraries that you want to use. This library is then shared with projects that want to import those header units. It's like using shared [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but easier. +The recommended approach, particularly for larger projects, or for cases where you want to share a common set of header units across multiple projects, is to create a shared library that includes the STL libraries that you want to use. This library is then shared with projects that want to import those header units. It's like using [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but much easier. See [Approach 2: Build a shared library](#approach2), in this article, for a walkthrough of this approach. ## Approach 1: Scan for headers -We'll begin with the easiest way to import STL libraries as header units. This approach may not be appropriate for larger projects because scanning the sources will take additional build time, especially in large projects. +We'll begin with the easiest way to import STL libraries as header units. As was said earlier, this approach may not be appropriate for larger projects because scanning the sources will take additional build time, especially in large projects. This option is convenient for codebases with extensive use of different header units, and where build throughput isn't critical. This option also doesn't guarantee that a header unit for a particular header will be built only once. Although, header units that are built by referenced static libraries projects will be reused. @@ -46,13 +46,13 @@ You can import your STL libraries as header units without modifying your code by - **Scan Sources for Module Dependencies** - **Translate Includes to Imports** -These settings cause the build system to scan your source code and look for `#include` statements to compile into header units. For each successfully compiled header unit, the compiler then treats its corresponding `#include` as an `import` and reads in the compiled header unit instead. There are other ways to indicate that a header file should be treated as a header unit, which are covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). +These settings cause the build system to scan your source code and look for `#include` statements to compile into header units. For each successfully compiled header unit, the compiler then treats its corresponding `#include` as an `import` and reads in the compiled header unit instead. There are other ways to indicate that a header file should be treated as a header unit besides scanning your entire project. That is covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). To demonstrate this approach, we'll create a project that imports a couple STL libraries, and then change the project properties so that it treats the library includes as header imports. ### Create a C++ console app project -This step creates a project that includes two libraries: `` and ``. The project settings will be modified so that the library headers are compiled into to header units, and `#include`is treated as `import`. +This step creates a project that includes two libraries: `` and ``. You'll modify the project settings so that the project is scanned for potential header headers that can be compiled into to header units, and the compiler will also treat `#include`as if you had written `import`. 1. With Visual Studio, create a new C++ console app project. 1. Modify the source file as follows: ```cpp @@ -68,11 +68,10 @@ int main() ### Set project options and run the project -Using the following steps, set the options that cause the build system to scan for headers to compile into header units, and also the option that causes the compiler to treat `#include` as if you had written `import`: +Use the following steps to set the options that cause the build system to scan for headers to compile into header units, and also the option that causes the compiler to treat `#include` as if you had written `import`: 1. From the main menu, choose **Project** > **Properties**. The project properties window appears. ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) - 1. Ensure that the **Configuration** dropdown is set to **All Configurations** 1. In the left-hand pane of the project property page, select **C/C++** > **General** 1. Set **Scan Sources for Module Dependencies** to **Yes** @@ -85,35 +84,31 @@ Change the C++ language standard for the compiler. The latest preview setting is ![Set language standard to preview version](media/set-cpp-language-latest.png) -1. Click **OK** to close the project properties pages, and then build the solution (**Build** > **Build Solution** from the main menu, or press `F6`). +1. Click **OK** to close the project properties pages, and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. You can run the solution to verify that it produces the expected output: `1` -If you are updating an existing solution to use **Scan Sources for Module Dependencies**, set this property, and **Translate Includes to Imports**, in all of the projects in your solution that should have this behavior. +If you are updating an existing solution to use **Scan Sources for Module Dependencies**, set this property, and **Translate Includes to Imports**, in all of the projects in your solution where you want to use header units. -The primary considerations of this approach are the balance between convenience and: -- faster build times by using header units -- the cost of scanning all of your files to determine which header files to build as header units. +The primary considerations of this approach are the balance between convenience and the cost of scanning all of your files to determine which header files to build as header units. You can fine-tune this balance by not scanning for module dependencies, and instead explicitly marking which files should be built as header units. This is explored in more detail in [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) ## Approach 2: Build a shared library -The preferred way to consume STL headers is to create a project, or projects, that build common header units from the STL headers you want to use. Then reference this project, or projects, from projects that need to import those STL headers. +The more flexible and more performant way to consume STL headers is to create a project, or projects, that build common header units from the STL headers you want to use. Then reference that project, or projects, from the projects that need those STL headers. -This option ensures that header units for a particular header will be built only once. It's similar to using shared precompiled header file, but easier. +This option ensures that header units for a particular header will be built only once. It's similar to using a shared precompiled header file, but is much easier. -In this example, you'll create a project that imports `` and ``. Once built, you'll reference this shared project from another C++ project. Then, in the referencing project, everywhere `import ` or `import ` is found, it will import the built header unit for that library instead of running the contents of the library header through the preprocessor. In projects that include the same library header from multiple files, this will improve build performance because the header won't have to be processed repeatedly. Instead, the compiled header unit will be imported. +In this example, you'll create a project that imports `` and ``. Once built, you'll reference this shared project from another C++ project. Then, in the referencing project, everywhere `import ` or `import ` is found, it will import the built header unit for that library instead of running the contents of the library header through the preprocessor. In projects that include the same library header in multiple files, this will improve build performance similar to the way PCH files do because the header won't have to be processed repeatedly. Instead, the compiled header unit will be imported. ### Create the shared project -Begin by creating the project that will build the shared units as follows: +Begin by creating the project for the shared header units as follows: 1. Create an Empty C++ project. Call it, for the sake of this example, **SharedPrj**. **Empty C++ project** is one of the project types available on the **Create a new project** window: - ![Create a new empty C++ project](media/empty-project-option.png) - -2. Add a new (empty) C++ file to the project. Change the file's contents to the following: +1. Add a new (empty) C++ file to the project. Change the file's contents to the following: ```cpp import ; @@ -124,24 +119,24 @@ import ; Next, set project properties to share the header units from this project: -1. From the Visual Studio main menu, choose **Project** > **Properties**. The project properties window appears. +1. From the Visual Studio main menu, choose **Project** > **Properties**. The project properties window appears: ![Settings for Configuration type and C++ language standard](media/set-header-unit-library-settings.png) 1. Ensure that the **Configuration** dropdown is set to **All Configurations** 1. In the left-hand pane of the project property page, select **General** 1. Change the **Configuration Type** option to **Static library (.lib)** 1. Change **C++ Language Standard** to **Preview - Features from the Latest C++ Working Draft** 1. In the left-hand pane of the project property page, select **C/C++** > **General** -1. ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) +![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** 1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the STL library’s header-unit.json file (see [Advanced](#advanced), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. -1. Click **OK** to close the project properties pages and then build the solution (**Build** > **Build Solution** from the main menu, or press `F6`). +1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. ## Consume the STL header unit project Next, create a project that will use the built `` and `` STL header units: -1. With the current solution still open, from the Visual Studio menu select **File** > **Add** > **New Project**. -1. Add a C++ Console app project. Call it **Walkthrough**, for this example. +1. With the current solution still open, from the Visual Studio menu select **File** > **Add** > **New Project** +1. Add a C++ Console app project. Call it **Walkthrough**, for this example 1. Change the contents of its source file as follows: ```cpp @@ -160,26 +155,26 @@ Change the C++ language standard for the compiler. The latest preview setting is ![Set language standard to preview version](media/set-cpp-language-latest.png) 1. In the left-hand pane of the **Walkthrough** project property pages, select **Configuration Properties** > **General** 1. Change **C++ Language Standard** to **Preview - Features from the Latest C++ Working Draft** -1. Click **OK** to close the project properties pages. -1. Add a reference from the **Walkthrough** project to the **SharedPrj** project. To do so, under the **Walkthrough** project, click on the **References** node, and select **Add Reference**. Select **SharedPrj** from the list of projects. What this reference accomplishes is that the build system will use the header units built by **SharedPrj** whenever an `import` in the **Walkthrough** project matches one of the built header units in **SharedPrj**. +1. Click **OK** to close the project properties pages +1. Add a reference from the **Walkthrough** project to the **SharedPrj** project. To do so, under the **Walkthrough** project, click on the **References** node, and select **Add Reference**. Select **SharedPrj** from the list of projects. What this reference accomplishes is that the build system will use the header units built by **SharedPrj** whenever an `import` in the **Walkthrough** project matches one of the built header units in **SharedPrj** 1. Click **OK** to close the **Add Reference** dialog -1. Right-click the **Walkthrough** project and select **Set as Startup Project**. +1. Right-click the **Walkthrough** project and select **Set as Startup Project** Then you can build the solution (**Build** > **Build Solution** from the main menu, or press `F6`) and run it to see that it produces the expected output: `1` -The advantage of this approach is that you can reference the static library from any project and reuse the header units from it. In this example, that's `` and ``. +The advantage of this approach is that you can reference the static library from any project to reuse the header units in it. In this example, that's `` and ``. -You could make a monolithic library containing all the commonly used STL headers that you want to import from your various projects. Or, you could produce multiple shared libraries that have different groupings of STL libraries that you want to import as header units. Then reference those projects as needed. +You could make a monolithic library containing all the commonly used STL headers that you want to import from your various projects. Or, you could produce multiple shared libraries that have different groupings of STL libraries that you want to import as header units. Then reference those shared projects as needed. -The result should be increased build throughput because the header units are only built once, and then imported without having to reprocess them, as would be the case if you brought them in via `#include`. +The result should be increased build throughput because the header units are only built once, and then imported without having to run them through the preprocessor repeatedly. Again, it's the benefits of a PCH, but much easier to build, maintain, and use. It's important when you do this with your own projects that you build the shared library using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the shared library. ## Advanced -Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers. The build system consults it to determine which STL libraries can be compiled into header units. +Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults it to determine which STL libraries can be compiled into header units. -The file `header-units.json` is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. +The [header-units.json](header-unit-json-reference.md) file is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. ## See also From 96d91b44122673bc0597007c3d20d7343b356f44 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 25 Mar 2021 17:17:13 -0700 Subject: [PATCH 08/82] draft --- docs/build/media/change-header-item-type.png | Bin 0 -> 7619 bytes docs/build/walkthrough-header-units.md | 87 +++++++++++------- .../walkthrough-import-stl-header-units.md | 19 ++-- 3 files changed, 61 insertions(+), 45 deletions(-) create mode 100644 docs/build/media/change-header-item-type.png diff --git a/docs/build/media/change-header-item-type.png b/docs/build/media/change-header-item-type.png new file mode 100644 index 0000000000000000000000000000000000000000..7cfcd3709eeda114358c2a2a8f3e1da3edad97ce GIT binary patch literal 7619 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 literal 0 HcmV?d00001 diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index de811b7dccf..cafc079aaa0 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -3,15 +3,14 @@ description: "Learn more about C++ header units by converting a project to use h title: "Walkthrough: Build and import header units in Visual C++ projects" ms.date: "4/13/2021" ms.custom: "conceptual" -f1_keywords: [] helpviewer_keywords: ["import", "header unit", "ifc", "stl"] --- # Walkthrough: Build and import header units in Visual C++ projects -This section is about building and importing header units in Microsoft Visual C++. +This section is about building and importing header units in Microsoft Visual C++. See [Walkthrough: Import STL libraries using header units]() to learn specifically how to import STL libraries as header units. -See [Walkthrough: Import STL libraries using header units]() to learn specifically how to import STL libraries as header units. +Header units are a simpler alternative to [precompiled header files](creating-precompiled-header-files.md). They are easier to setup and easier to use than a [shared PCH](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. ## Prerequisites @@ -19,47 +18,65 @@ Support for header units requires Visual Studio 19.10 Preview 2. ## What is a header unit -Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a “module-like” experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. Also, unlike `#include` files, header units are not affected by the order they are imported in. +Before you can import a header unit, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, everything in a header unit (including macro definitions) are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. Also, unlike `#include` files, header units are not affected by the order they are imported in. -Header units are a simpler alternative to using [precompiled header files](creating-precompiled-header-files.md) Header units are easier to setup and easier to use than a [shared PCH](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio), while providing similar performance benefits. Also, unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. +There are several ways to compile a file into a header unit: -<< under construction >> +1-Automatically scan for header units: This approach is best suited to smaller projects that include many different headers. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a walkthrough of this approach. -## In this section +2-Build a shared header units project: This approach is best suited for larger projects and when you want more control over the modularization of the imported header units. You create a static library that contains the header units, and then reference it from projects that consume the header units. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a walkthrough of this approach. -Before a header unit can be imported, it must be built. You can either tell the IDE which header units need to be built, or you can have the IDE scan for them. When a header file or module interface file (*.ixx) is built, it is also scanned for dependencies. +3-Change the compilation action for a file. That's the approach demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's a way to quickly and selectively try out header units. + +## Convert a simple project to use header units -### Automatic +In this example you'll compile a header file as a header unit. Begin by creating the following project in Visual Studio: -Perf issues with scanning for them (build throughput, intellisense init) that might not be desirable in large codebases that only make use of a few header units. +1. Create a new C++ console app project. +1. Replace the source file contents as follows: +```cpp +#include "Pythagorean.h" -set “Scan Sources for Module Dependencies” to “Yes” in C/C++ - General tab +int main() +{ + PrintPythogoreanTriple(2,3); + return 0; +} +``` +1. Add a header file called `Pythagorean.h`, and modify it as follows: +```cpp +#pragma once +#include -### Set properties +void PrintPythogoreanTriple(int a, int b) +{ + std::cout << "Pythagorean triple a:" << a << " b:" << b << " c: " << a*a + b*b << std::endl; +} +``` -To build as a header unit: +Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: -.h files marked c/c++ compile will be compiled as header units -any file marked 'compile as header unit' +1. In the left-hand pane of the project property pages, select **C/C++** > **General** +1. Change the **C++ Language Standard** dropdown to **Preview - Features from the Latest C++ Working Draft** +![Set language standard to preview version](media/set-cpp-language-latest.png) -- right-click on the file in Solution Explorer, select Properties. Change Item Type to be C/C++ Compile (.h files are “C/C++ Include” by default), hit Apply. -- If the header file extension is different from “.h”, set “Compile As” to “Compile As Header Unit” in the C/C++ Advanced +### Set the header file to compile as a header unit -### Provide a list *.json thing - -## Building a header unit project +Change a header file to compile as a header unit as follows: -This section about creating a project that builds your header units +1. In the **Solution Explorer**, right-click the header file (`Pythagorean.h`) and select **Properties**. +1. Change the **Item Type** to **C/C++ compiler** +![Changing the item type to c/c++ compiler](media/change-header-item-type.png) +1. Click **OK** -[this from](https://microsoft-my.sharepoint.com/:w:/p/gdr/Ea5Jy1oVuwxJpsiLYuem9FgBYioxSLmGER2QVPp4muq7vQ?e=4%3AW1atMJ&at=9&CID=AAA917D6-FC4D-41F0-9803-4DD2BD0B63CF&wdLOR=c6BFFEDA4-B56F-4FE8-AEFA-2F6A29107415) -cl /exportHeader /headerName:angle vector=/path/to/source/file +You can also change the +- For header files, set its **Item Type** to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header** +- If the header file extension is different from ".h", set the project-wide **Compile As** option to **Compile as C++ Header Unit (/exportHeader)**. This will cause #included files to be exported as header units. -for requesting the generation of an IFC file for header-name resolving to /path/to/source/file, and +### Provide a list *.json thing -cl /exportHeader /headerName:quote my/header.h=/path/to/source/file -for requesting the generation of an IFC file for header-name “my/header.h” resolving to /path/to/source/file. ## Consuming header units @@ -117,18 +134,18 @@ To translate 3rd party library headers, they will need to use /headerUnit:* swit In VC projects they will be able to specify headers to translate as Additional Header Units Dependencies -## command line switches (need a better place or maybe no place?) +## Project settings -/headerUnit - specifies headers to translate - can be direct path, "", or <> - /headerUnit:bracketed:"vector=c:\vector.ifc" - /headerUnit:quoted:"MyHeader.h=c:\MyHeader.ifc" - /headerUnit:c:\a.h=c:\a.ifc +project > properties - /exportHeader - /moduleOutput:path\filename.ifc +advanced > msvc toolset version ** +or general > platform toolset -/translateInclude +c/c++ > general > additional BMI directories (may be moved in newer versions?) + also additional header unit dependencies, additional module dependencies +c/c++ > advanced + has compile as + has scan all source for module dependencies ## See also diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 747cec92768..670f944bc8d 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -1,18 +1,17 @@ --- description: "Learn to use header units to import C++ Standard Template Library (STL) libraries." -title: "Walkthrough: Import Standard Template Library (STL) libraries using header units" +title: "Walkthrough: Import Standard Template Library (STL) libraries as header units" ms.date: "4/13/2021" ms.custom: "conceptual" -f1_keywords: ["stl header unit", "stl module", "header unit"] helpviewer_keywords: ["import"] --- # Walkthrough: Import STL libraries as header units This walkthrough shows two different ways to import C++ Standard Template Library (STL) libraries as header units in Visual Studio. -Importing an STL library as a header unit is a simpler alternative to using [precompiled header files](creating-precompiled-header-files.md) Header units are easier to setup and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Also, unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. +Importing an STL library as a header unit is a simpler alternative to [precompiled header files](creating-precompiled-header-files.md) Header units are easier to setup and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. -Before you can import an STL library this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a “module-like” experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. Also, unlike `#include` files, header units are not affected by the order they are imported in. +Before you can import an STL library this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. Also, unlike `#include` files, header units are not affected by the order they are imported in. ## Prerequisites @@ -20,11 +19,11 @@ Support for header units requires Visual Studio 19.10 Preview 2. ## Two different approaches -Before an STL header can be imported, it needs to be compiled into a header unit. There are two main approaches to doing this, which are demonstrated below. +Before an STL header can be imported, it needs to be compiled into a header unit. There are two main approaches to doing this, demonstrated below. **Scan for module dependencies** -One approach requires minimal effort on your part and puts the burden on the build system. At a high level, it works by scanning your sources for `#include` statements, and tries to compile those header files and their dependencies into header units. It then imports the header unit instead of running the header file through the preprocessor. You don't even have to change your code from `#include ` to `import library;`. This may be a good approach for you if your codebase isn't large, or you just want to try out header units without changing your code. +One approach, that requires minimal effort on your part, puts the burden on the build system. At a high level, it works by scanning your sources for `#include` statements, and tries to compile those header files and their dependencies into header units. It then imports the header unit instead of running the header file through the preprocessor. You don't even have to change your code from `#include ` to `import library;`. This may be a good approach for you if your codebase isn't large, or you just want to try out header units without changing your code. It may not be the optimal approach for larger projects because it can be time consuming to scan through the files looking for files to build into header units. And it may result in reprocessing the same header files repeatedly, increasing build time. Not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. @@ -38,9 +37,9 @@ See [Approach 2: Build a shared library](#approach2), in this article, for a wal ## Approach 1: Scan for headers -We'll begin with the easiest way to import STL libraries as header units. As was said earlier, this approach may not be appropriate for larger projects because scanning the sources will take additional build time, especially in large projects. +We'll begin with the easiest way to import STL libraries as header units. As was said earlier, this approach may not be appropriate for larger projects because scanning the sources takes additional build time, especially in large projects. -This option is convenient for codebases with extensive use of different header units, and where build throughput isn't critical. This option also doesn't guarantee that a header unit for a particular header will be built only once. Although, header units that are built by referenced static libraries projects will be reused. +This option is convenient for codebases with extensive use of different header units, and where build throughput isn't critical. This option doesn't guarantee that a header unit for a particular header will be built only once. Although, header units built by referenced static libraries projects are reused. You can import your STL libraries as header units without modifying your code by setting two Visual C++ project options: - **Scan Sources for Module Dependencies** @@ -53,7 +52,7 @@ To demonstrate this approach, we'll create a project that imports a couple STL l ### Create a C++ console app project This step creates a project that includes two libraries: `` and ``. You'll modify the project settings so that the project is scanned for potential header headers that can be compiled into to header units, and the compiler will also treat `#include`as if you had written `import`. -1. With Visual Studio, create a new C++ console app project. +1. With Visual Studio, create a new C++ console app project. 1. Modify the source file as follows: ```cpp #include @@ -174,7 +173,7 @@ It's important when you do this with your own projects that you build the shared Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults it to determine which STL libraries can be compiled into header units. -The [header-units.json](header-unit-json-reference.md) file is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. +The [header-units.json](header-unit-json-reference.md) file is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. ## See also From 29adbeeb2ed9b2833593f5480e54a5fb685db44f Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 26 Mar 2021 08:41:34 -0700 Subject: [PATCH 09/82] stefan fixes --- docs/build/walkthrough-header-units.md | 8 ++++---- .../walkthrough-import-stl-header-units.md | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index cafc079aaa0..fdae4aa82fa 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -8,7 +8,7 @@ helpviewer_keywords: ["import", "header unit", "ifc", "stl"] # Walkthrough: Build and import header units in Visual C++ projects -This section is about building and importing header units in Microsoft Visual C++. See [Walkthrough: Import STL libraries using header units]() to learn specifically how to import STL libraries as header units. +This section is about building and importing header units in Microsoft Visual C++. See [Walkthrough: Import STL libraries using header units]() to learn how to import STL libraries, specifically, as header units. Header units are a simpler alternative to [precompiled header files](creating-precompiled-header-files.md). They are easier to setup and easier to use than a [shared PCH](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. @@ -22,9 +22,9 @@ Before you can import a header unit, it must first be compiled into a header uni There are several ways to compile a file into a header unit: -1-Automatically scan for header units: This approach is best suited to smaller projects that include many different headers. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a walkthrough of this approach. +1-Automatically scan for header units: This approach is best suited to smaller projects that include many different headers. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. -2-Build a shared header units project: This approach is best suited for larger projects and when you want more control over the modularization of the imported header units. You create a static library that contains the header units, and then reference it from projects that consume the header units. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a walkthrough of this approach. +2-Build a shared header units project: This approach is best suited for larger projects and when you want more control over the modularization of the imported header units. You create a static library (or libraries) that contain the header units, and then reference it from projects that need to consume them. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. 3-Change the compilation action for a file. That's the approach demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's a way to quickly and selectively try out header units. @@ -50,7 +50,7 @@ int main() void PrintPythogoreanTriple(int a, int b) { - std::cout << "Pythagorean triple a:" << a << " b:" << b << " c: " << a*a + b*b << std::endl; + std::cout << "Pythagorean triple a:" << a << " b:" << b << " c:" << a*a + b*b << std::endl; } ``` diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 670f944bc8d..b5445b1553b 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -9,13 +9,13 @@ helpviewer_keywords: ["import"] This walkthrough shows two different ways to import C++ Standard Template Library (STL) libraries as header units in Visual Studio. -Importing an STL library as a header unit is a simpler alternative to [precompiled header files](creating-precompiled-header-files.md) Header units are easier to setup and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. +Importing an STL library as a header unit is a simpler alternative to [precompiled header files](creating-precompiled-header-files.md). Header units are easier to setup and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. Before you can import an STL library this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. Also, unlike `#include` files, header units are not affected by the order they are imported in. ## Prerequisites -Support for header units requires Visual Studio 19.10 Preview 2. +Support for header units requires Visual Studio 2019 19.10 Preview 2. ## Two different approaches @@ -23,7 +23,7 @@ Before an STL header can be imported, it needs to be compiled into a header unit **Scan for module dependencies** -One approach, that requires minimal effort on your part, puts the burden on the build system. At a high level, it works by scanning your sources for `#include` statements, and tries to compile those header files and their dependencies into header units. It then imports the header unit instead of running the header file through the preprocessor. You don't even have to change your code from `#include ` to `import library;`. This may be a good approach for you if your codebase isn't large, or you just want to try out header units without changing your code. +One approach, that requires minimal effort on your part, puts the burden on the build system. At a high level, it works by scanning your sources for `#include` directives, and tries to compile those header files and their dependencies into header units. It then imports the header unit instead of running the header file through the preprocessor. You don't even have to change your code from `#include ` to `import ;`. This may be a good approach for you if your codebase isn't large, or you just want to try out header units without changing your code. It may not be the optimal approach for larger projects because it can be time consuming to scan through the files looking for files to build into header units. And it may result in reprocessing the same header files repeatedly, increasing build time. Not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. @@ -39,19 +39,19 @@ See [Approach 2: Build a shared library](#approach2), in this article, for a wal We'll begin with the easiest way to import STL libraries as header units. As was said earlier, this approach may not be appropriate for larger projects because scanning the sources takes additional build time, especially in large projects. -This option is convenient for codebases with extensive use of different header units, and where build throughput isn't critical. This option doesn't guarantee that a header unit for a particular header will be built only once. Although, header units built by referenced static libraries projects are reused. +This option is convenient for codebases with extensive use of different header units, and where build throughput isn't critical. This option doesn't guarantee that a header unit for a particular header will be built only once. However, header units built by referenced static libraries projects are reused. You can import your STL libraries as header units without modifying your code by setting two Visual C++ project options: - **Scan Sources for Module Dependencies** - **Translate Includes to Imports** -These settings cause the build system to scan your source code and look for `#include` statements to compile into header units. For each successfully compiled header unit, the compiler then treats its corresponding `#include` as an `import` and reads in the compiled header unit instead. There are other ways to indicate that a header file should be treated as a header unit besides scanning your entire project. That is covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). +These settings cause the build system to scan your source code and look for `#include` directives to compile into header units. For each successfully compiled header unit, the compiler then treats its corresponding `#include` as an `import` and reads in the compiled header unit instead. There are other ways to indicate that a header file should be treated as a header unit besides scanning your entire project. That is covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). To demonstrate this approach, we'll create a project that imports a couple STL libraries, and then change the project properties so that it treats the library includes as header imports. ### Create a C++ console app project -This step creates a project that includes two libraries: `` and ``. You'll modify the project settings so that the project is scanned for potential header headers that can be compiled into to header units, and the compiler will also treat `#include`as if you had written `import`. +This step creates a project that includes two libraries: `` and ``. You'll modify the project settings so that the project is scanned for potential header headers that can be compiled into header units, and the compiler will also treat `#include` as if you had written `import`. 1. With Visual Studio, create a new C++ console app project. 1. Modify the source file as follows: ```cpp @@ -78,7 +78,7 @@ Use the following steps to set the options that cause the build system to scan f Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: -1. In the left-hand pane of the project property pages, select **C/C++** > **General** +1. In the left-hand pane of the project property pages, select **General** 1. Change the **C++ Language Standard** dropdown to **Preview - Features from the Latest C++ Working Draft** ![Set language standard to preview version](media/set-cpp-language-latest.png) @@ -127,7 +127,7 @@ Next, set project properties to share the header units from this project: 1. In the left-hand pane of the project property page, select **C/C++** > **General** ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** -1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the STL library’s header-unit.json file (see [Advanced](#advanced), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. +1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the STL library’s `header-units.json` file (see [Advanced](#advanced)), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. 1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. ## Consume the STL header unit project @@ -171,7 +171,7 @@ It's important when you do this with your own projects that you build the shared ## Advanced -Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults it to determine which STL libraries can be compiled into header units. +Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults to determine which STL libraries can be compiled into header units. The [header-units.json](header-unit-json-reference.md) file is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. From 63b7bf008b9a2167316ffd7456798d5c9094fdec Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 26 Mar 2021 10:08:02 -0700 Subject: [PATCH 10/82] typos --- docs/build/walkthrough-import-stl-header-units.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index b5445b1553b..b20c4151882 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -15,7 +15,7 @@ Before you can import an STL library this way, it must first be compiled into a ## Prerequisites -Support for header units requires Visual Studio 2019 19.10 Preview 2. +Support for header units requires Visual Studio 2019 16.10.0 Preview 2. ## Two different approaches @@ -51,7 +51,7 @@ To demonstrate this approach, we'll create a project that imports a couple STL l ### Create a C++ console app project -This step creates a project that includes two libraries: `` and ``. You'll modify the project settings so that the project is scanned for potential header headers that can be compiled into header units, and the compiler will also treat `#include` as if you had written `import`. +This step creates a project that includes two libraries: `` and ``. You'll modify the project settings so that the project is scanned for potential header files that can be compiled into header units, and the compiler will also treat `#include` as if you had written `import`. 1. With Visual Studio, create a new C++ console app project. 1. Modify the source file as follows: ```cpp @@ -99,7 +99,7 @@ The more flexible and more performant way to consume STL headers is to create a This option ensures that header units for a particular header will be built only once. It's similar to using a shared precompiled header file, but is much easier. -In this example, you'll create a project that imports `` and ``. Once built, you'll reference this shared project from another C++ project. Then, in the referencing project, everywhere `import ` or `import ` is found, it will import the built header unit for that library instead of running the contents of the library header through the preprocessor. In projects that include the same library header in multiple files, this will improve build performance similar to the way PCH files do because the header won't have to be processed repeatedly. Instead, the compiled header unit will be imported. +In this example, you'll create a project that imports `` and ``. Once built, you'll reference this shared project from another C++ project. Then, in the referencing project, everywhere `import ;` or `import ;` is found, it will import the built header unit for that library instead of running the contents of the library header through the preprocessor. In projects that include the same library header in multiple files, this will improve build performance similar to the way PCH files do because the header won't have to be processed repeatedly. Instead, the compiled header unit will be imported. ### Create the shared project From cc4b3f6d65f131d708f0485f089705a855d1ccbb Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 26 Mar 2021 20:37:23 -0700 Subject: [PATCH 11/82] draft --- ...ional-header-unit-dependencies-setting.png | Bin 0 -> 14759 bytes docs/build/media/change-compile-as.png | Bin 0 -> 21731 bytes docs/build/media/change-header-item-type.png | Bin 7619 -> 0 bytes docs/build/media/change-item-type.png | Bin 0 -> 10832 bytes ...lic-include-module-directories-setting.png | Bin 0 -> 54762 bytes docs/build/media/set-cpp-language-latest.png | Bin 31462 -> 27930 bytes docs/build/walkthrough-header-units.md | 124 +++++------------- .../walkthrough-import-stl-header-units.md | 45 +++++-- 8 files changed, 69 insertions(+), 100 deletions(-) create mode 100644 docs/build/media/additional-header-unit-dependencies-setting.png create mode 100644 docs/build/media/change-compile-as.png delete mode 100644 docs/build/media/change-header-item-type.png create mode 100644 docs/build/media/change-item-type.png create mode 100644 docs/build/media/public-include-module-directories-setting.png diff --git a/docs/build/media/additional-header-unit-dependencies-setting.png b/docs/build/media/additional-header-unit-dependencies-setting.png new file mode 100644 index 0000000000000000000000000000000000000000..50c0689d04673fa1f553c157387047bf5bea3bf8 GIT binary patch literal 14759 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 literal 0 HcmV?d00001 diff --git a/docs/build/media/change-compile-as.png b/docs/build/media/change-compile-as.png new file mode 100644 index 0000000000000000000000000000000000000000..0787006e0792291eb463092a0efc83882159f26d GIT binary patch literal 21731 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

l-C`p-KoV5j+mSli^ZfXW#WwfBfQ@zk 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 literal 0 HcmV?d00001 diff --git a/docs/build/media/change-header-item-type.png b/docs/build/media/change-header-item-type.png deleted file mode 100644 index 7cfcd3709eeda114358c2a2a8f3e1da3edad97ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7619 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 diff --git a/docs/build/media/change-item-type.png b/docs/build/media/change-item-type.png new file mode 100644 index 0000000000000000000000000000000000000000..4d64944b2c329776d705685bac52b5fadb6c9a5c GIT binary patch literal 10832 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 W%aCvToA7@r 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 z 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�VQDC zJ@L4p`4|in)IEBYEgmhpSt&KgH))fq;Rzt_x$xQr{Yr8f5tGV>MLAK7X@s}^5e<%c zaW}NiA0dBGjC_YOKWnV|5!zxOfULN5EpYYG9J?@wHd&htQ5~yo9Qeh&MUNuc;2H#xE}7F zC~9KI_x5{*m0f8_uvTI!MT?KcnQx#{7G*v;VUyR@@$tjmmE+bRZn}uy3he9-z@YyJ zHFrTr7dppqSZ%W(P2K5_qx$ma7sB80q{_9!JvCacRBz#!>UeSv%Zv@uPktTVltC^L zfb02c2c$%aEb{|e?XIP?f~7h5pk+p}X{7zX$Dr%f>qbVLM;9x%2y~Y@FcqFvQa3@W z;))HwNXB63v;M*UuEm$_qcSsj4rG(D;1VL-l#wN&^Y+7dN4z%pag6yy>dX$%bltGo zPZJL7_Hz}52kJL3Tb%rpoIAClLnBw_;K39uAf)^up!~Xs@x5BhKklDdD5nf1%0DXy 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 n9;oRh?6g1OP=C5xaCSDUg @@ -54,98 +64,30 @@ void PrintPythogoreanTriple(int a, int b) } ``` -Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: +To enable header units, set the project C++ language standard: -1. In the left-hand pane of the project property pages, select **C/C++** > **General** +1. In the left-hand pane of the project property pages, select **General** 1. Change the **C++ Language Standard** dropdown to **Preview - Features from the Latest C++ Working Draft** - ![Set language standard to preview version](media/set-cpp-language-latest.png) -### Set the header file to compile as a header unit - -Change a header file to compile as a header unit as follows: - -1. In the **Solution Explorer**, right-click the header file (`Pythagorean.h`) and select **Properties**. -1. Change the **Item Type** to **C/C++ compiler** -![Changing the item type to c/c++ compiler](media/change-header-item-type.png) -1. Click **OK** - -You can also change the -- For header files, set its **Item Type** to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header** -- If the header file extension is different from ".h", set the project-wide **Compile As** option to **Compile as C++ Header Unit (/exportHeader)**. This will cause #included files to be exported as header units. - -### Provide a list *.json thing - - - -## Consuming header units - -If you want to use modules or header units built outside of your solution/codebase, you can use C/C++ > Additional Module dependencies & perhaps Additional Header Unit Dependencies. - - -[this from](https://microsoft-my.sharepoint.com/:w:/p/gdr/Ea5Jy1oVuwxJpsiLYuem9FgBYioxSLmGER2QVPp4muq7vQ?e=4%3AW1atMJ&at=9&CID=AAA917D6-FC4D-41F0-9803-4DD2BD0B63CF&wdLOR=c6BFFEDA4-B56F-4FE8-AEFA-2F6A29107415) -Using ifc search path: - -Using ifc search path: - -`cl /ifcSearchDir [Dir1] /ifcSearchDir [Dir2] source.cpp ` - -In this case `ifcs` for header units (as well as named modules) will be found in the ifc search path by the names stored in the ifc. - -Using explicit `/headerUnit` reference - -`/headerUnit:angle vector=/path/to/some-file.ifc` - -The header file will be resolved by searching `` on the include path - -`/headerUnit:quote my/header.h=/path/to/some-file.ifc ` - -The header file will be resolved by searching `"my/header.h"` on the include path: - -`/headerUnit /path/to/header=/path/to/some-file.ifc` - -The header file is explicitly specified by the path. - -In this case the resolved header path for import `

` or `import "header"` will be compared with the resolved header paths specified by `/headerUnit*` and the matching `.ifc` will be used (without comparing the name stored in the `.ifc`). - -## Strategies for sharing C++ header units - -Header units that are built as a part of a static library project, are automatically available to all directly and indirectly referencing projects. - -To use modules and header units built as a part of a dll project, their symbols have to be exported from the dll as any other C/C++ symbols and “All Modules arePublic” property should be set to true. - -If you build header units for the headers in your codebase, you might want to control which ones should be automatically available to all referencing projects and which ones should be “private” by specifying “Public C++ Modules Directories”. - -You might also want to specify “Public Include Directories” for your public headers to be automatically added to Include Directories (/I) in the referencing projects. - -[Picture of header unit property pages]( see Building and using header units in VC projects.docx under Reusing built header units between different projects) - -Ensure that projects that share header units are built with compatible compilation options, just as you would with shared pre-compiled headers. The compiler will issue warnings if it detects different compilation options in how the module or header unit was produced and how it is used. - -If you reference two or more projects that built two or more modules with the same name or two or more header unit for the same header file, you can use C/C++ > Additional Module dependencies & Additional Header Unit Dependencies to resolve those collisions by specifying which module or header unit should be used for this project. Otherwise the one that is chosen is undefined. - -## 3rd party - -IDE usage +### Compile a header file as a header unit -People can create header_units.json in their headers directories. +To compile a file (and what it imports) as a header unit, open the file's properties by selecting it in the **Solution Explorer**, right-click it, and select **Properties**. Then do one of the following depending on the file type: +- For header files, set its **Item Type** property to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header**. Note, setting this property also sets **C/C++** > **Advanced** > **Compile As** to **Compile as C++ Header Unit (/exportHeader)** for you. +![Changing the item type to c/c++ compiler](media/change-item-type.png.png) -To translate 3rd party library headers, they will need to use /headerUnit:* switches. +- For source files, set its **Compile As** property to **Compile as C++ Header Unit (/exportHeader)**. +![Changeing Compile As to Compile as C++ Header Unit ](media/change-compile-as.png) -In VC projects they will be able to specify headers to translate as Additional Header Units Dependencies +### Change your code to import the header unit -## Project settings +In the source file for the example project, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements) If the include file you are converting to a header unit is on the system path, that is `#include `, use `import ;` -project > properties +After making that change, build the solution (**Build** > **Build Solution** from the main menu, or press `F6`) and run it to see that it produces the expected output: `Pythagorean triple a:2 b:3 c:13` -advanced > msvc toolset version ** -or general > platform toolset +In your own projects, this process can be repeated to compile other header files to header units. If you only want to convert a few header files to header units, this is a good approach. -c/c++ > general > additional BMI directories (may be moved in newer versions?) - also additional header unit dependencies, additional module dependencies -c/c++ > advanced - has compile as - has scan all source for module dependencies +If you have many header files that you want to compile, and the convenience of having the build system automatically take care of it at the expense of reduced build performance, see [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of the approach that you can use with your own project. ## See also @@ -153,4 +95,4 @@ c/c++ > advanced [`/translateInclude`](./reference/translateinclude.md) [`/exportHeader`](./reference/module-exportheader.md) [`/headerUnit`](./reference/headerunit.md) -[Build faster using Standard Template Library (STL) header units]() to learn how to import STL libraries for faster compilation throughput. \ No newline at end of file +[Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) \ No newline at end of file diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index b20c4151882..6b9b3795471 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -9,17 +9,17 @@ helpviewer_keywords: ["import"] This walkthrough shows two different ways to import C++ Standard Template Library (STL) libraries as header units in Visual Studio. -Importing an STL library as a header unit is a simpler alternative to [precompiled header files](creating-precompiled-header-files.md). Header units are easier to setup and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. +Importing a STL header as a header unit is a simpler alternative to [precompiled header files](creating-precompiled-header-files.md). Header units are easier to setup and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. -Before you can import an STL library this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. Also, unlike `#include` files, header units are not affected by the order they are imported in. +Before you can import an STL header this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. ## Prerequisites -Support for header units requires Visual Studio 2019 16.10.0 Preview 2. +Support for header units requires at least Visual Studio 2019 16.10.0 Preview 2. ## Two different approaches -Before an STL header can be imported, it needs to be compiled into a header unit. There are two main approaches to doing this, demonstrated below. +Before an STL header can be imported, it must be compiled into a header unit. There are two main approaches to doing this, demonstrated below. **Scan for module dependencies** @@ -127,7 +127,7 @@ Next, set project properties to share the header units from this project: 1. In the left-hand pane of the project property page, select **C/C++** > **General** ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** -1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the STL library’s `header-units.json` file (see [Advanced](#advanced)), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. +1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the STL `header-units.json` file (see [Advanced](#advanced)), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. 1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. ## Consume the STL header unit project @@ -165,16 +165,43 @@ The advantage of this approach is that you can reference the static library from You could make a monolithic library containing all the commonly used STL headers that you want to import from your various projects. Or, you could produce multiple shared libraries that have different groupings of STL libraries that you want to import as header units. Then reference those shared projects as needed. -The result should be increased build throughput because the header units are only built once, and then imported without having to run them through the preprocessor repeatedly. Again, it's the benefits of a PCH, but much easier to build, maintain, and use. +The result should be increased build throughput because importing a header unit significantly reduces the work the compiler must do. It's important when you do this with your own projects that you build the shared library using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the shared library. -## Advanced +## Reuse built header units between projects -Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults to determine which STL libraries can be compiled into header units. +Header units built as part of a static library project are automatically available to all directly and indirectly referencing projects. There are project settings you can use to control which header units should be automatically available to all referencing projects. The settings are in project settings under **VC++ Directories**: +1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. +1. In the left-hand pane of the project properties window, select **VC++ Directories** +![Public project content properties such as public include directories, all header files are public, etc.](media/public-include-module-directories-setting.png) + +The following settings control the visibility of header units to the build system: + +- **Public Include Directories** - specify project directories for header units that should be automatically added to the include path in referencing projects. +- **Public C++ Module directories** - specify project directories containing header units that should be available to referencing projects. +- **All Modules are Public** - a fast way to make all header units in the project automatically available to referencing projects. + +### Handle duplicate symbols + +If you reference two or more projects that built two or more header units with the same name, or that built two or more header unit for the same header file, you'll get duplicate symbols. You can use C/C++ > Additional Module dependencies & Additional Header Unit Dependencies to resolve those collisions by specifying which module or header unit should be used for this project. Otherwise the one that is chosen is undefined. + +To access these settings: +1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. +1. In the left-hand pane of the project properties window, select **C/C++** > **General**. +1. Use **Additional Header Unit Dependencies** to resolve collisions by specifying explicitly which module or header unit should be used for this project: +![Additional Header Unit Dependencies setting in the project properties dialog](media/additional-header-unit-dependencies-setting.png) + +> [!IMPORTANT] +> Ensure that projects that share header units are built with compatible compilation options. The compiler will issue warnings if it detects different compilation options used for how the header unit was produced versus how it is used. + +> [!NOTE] +> To use header units built as a part of a **DLL** project, the project property setting **All Modules arePublic** should be set to **Yes**. + +Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults to determine which STL libraries can be compiled into header units. It is consulted when the build system attempts to create a header unit for an STL header file, and as dependencies are resolved for an STL header file. If the STL header file is not on the list, it is treated as a normal `#include` instead of importing it as a header unit. The [header-units.json](header-unit-json-reference.md) file is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. - + ## See also [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) \ No newline at end of file From 46c1f8fe8365354cb6b737f8a9f53b3ccd2e0482 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 29 Mar 2021 13:50:43 -0700 Subject: [PATCH 12/82] draft --- docs/build/header-unit-json-reference.md | 4 +- docs/build/reference/headerunit.md | 4 +- docs/build/walkthrough-header-units.md | 65 ++++++++++--------- .../walkthrough-import-stl-header-units.md | 8 ++- 4 files changed, 44 insertions(+), 37 deletions(-) diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index 1811f6c44d7..0c09115cb9e 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -12,11 +12,11 @@ helpviewer_keywords: ["header_units.json", "header unit"] The `header-units.json` file lists which header files can be compiled into header units. -Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. In that case, it is either not listed, or commented out. +Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior. Using `#define` can't be used to change the behavior of a header unit. In that case, it's either not listed, or commented out. The C++ Standard Template Library (STL) `header-units.json` file is located at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include` -The format of the `header_units.json` file is a version, followed by an array of headers that can be built into header units. For example, +The format of the `header_units.json` file starts with the schema version, followed by an array of header filenames that can be built into header units. For example: ```json { diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index 81a3c85d0f6..d77c74e92b0 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -1,7 +1,7 @@ --- title: "/headerUnit (Use header unit IFC)" description: "Use the /headerUnit compiler option to specify an existing IFC header unit to import in the current compilation." -ms.date: 09/13/2020 +ms.date: 04/13/2021 f1_keywords: ["/headerUnit"] helpviewer_keywords: ["/headerUnit", "Use header unit IFC"] --- @@ -61,7 +61,7 @@ cl ... /experimental:module /translateInclude /headerUnit C:\utils\util.h=C:\uti ---- -When a project has the ever the project system scans a file and finds an `import` determines that a header unit should be produced, it first consults this file +When a project scans a file and finds an `import` determines that a header unit should be produced, it first consults this file Scan Sources for Module Dependencies = Yes According to Building header units for STL headers and other libraries doc, scan creates the .json file containing module and header units and their dependencies, which is then built into .ifc files. JTW That is read by the compiler option /sourceDependencies:directives:”the .json file” This .json file lists which headers can be built as header units and which can't be. /headerUnit specifies which headers to translate to .ifc diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index c22db377672..9241c18f801 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -8,9 +8,9 @@ helpviewer_keywords: ["import", "header unit", "ifc", "stl"] # Walkthrough: Build and import header units in Microsoft Visual C++ -This article is about building and importing header units using Visual Studio 2019. See [Walkthrough: Import STL libraries using header units](walkthrough-import-stl-header-units.md) to learn how to import STL libraries, specifically, as header units. +This article is about building and importing header units using Visual Studio 2019. See [Walkthrough: Import STL libraries using header units](walkthrough-import-stl-header-units.md) to learn specifically how to import Standard Template Library headers as header units. -Header units are a simpler alternative to [precompiled header files](creating-precompiled-header-files.md). They are easier to setup and easier to use than a [shared PCH](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. +Header units are a recommended alternative to [precompiled header files](creating-precompiled-header-files.md). They're easier to set up and easier to use than a [shared PCH](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. ## Prerequisites @@ -18,29 +18,31 @@ Support for header units requires at least Visual Studio 2019 16.10.0 Preview 2. ## What is a header unit -Before you can import a header unit, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. A header unit must stand alone. That is, it can include other headers, but must be able to compile on its own. +Before you can import a header unit, it must first be compiled. Header units are a binary representation of a header file, and end with an `.ifc` extension. -An important feature of header units is that they are portable. A header unit is defined by the C++ standard, and can be used cross-platform. +An important feature of header units is that they're defined by the C++ standard, and can be used cross-platform. -Header units are also independent of the machine they are built on. You can use them with distributed builds across machines. One machine can produce all of the IFCs and another machine consume them. A PCH can't do this because the persisted data structures are largely tied to the memory layout of the machine they are compiled on. Ideally, you should use the same compiler flags to compile the header unit and the program that imports them because some flags, like /EHsc, /MD[d], etc. have an impact on the semantics of the program which are captured in a header unit. +Header units are also independent of the machine they're built on. One machine can produce IFCs and another machine consume them. A PCH can't do that because the persisted data structures are largely tied to the memory layout of the machine where they're compiled. -Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, everything in a header unit (including macro definitions) are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. +Ideally, you should use the same compiler flags to compile the header unit and the program that imports it. Some flags, like `/EHsc`, `/MD[d]`, etc. have an impact on the semantics of the program that are captured in a header unit. + +Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, everything in a header unit (including macro definitions) are visible, while those in a module aren't. Another difference is that header units aren't affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. ## Ways to compile a header unit There are several ways to compile a file into a header unit: -1-Automatically scan for header units: This approach is best suited to smaller projects that include many different headers. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. +-Automatically scan for header units: This approach is best suited to smaller projects, that include many different headers. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it is better suited to smaller projects, or for those where build time is not a crucial consideration, is because it takes extra time for the build system to scan all of the files to find what should be built into header units. -2-Build a shared header units project: This approach is best suited for larger projects, and for when you want more control over the modularization of the imported header units. You create a static library (or libraries) that contain the header units, and then reference it from the projects that need to import them. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. +-Build a shared header units project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You can build individual libraries containing the headers units you want, factored the way that makes the most sense for consumption in your project. You create a static library (or libraries) that contain the header units that you want, and then reference it from the projects that need its header imports. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. -3-Tell the build system which header units to build by changing the compilation action for a file. That approach is demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's another way to quickly and selectively try out header units. +Tell the build system which header units to build by changing the compilation action for a file. That approach is demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's also a good way to quickly and selectively try out header units in your project. -To build header units from the headers in your codebase, you can use any of the methods above. To build and use header units for library headers, which are not part of your codebase, use the technique described in [Walkthrough: Import STL libraries using header units](walkthrough-import-stl-header-units.md). +To build header units from the headers in your codebase, you can use any of the methods above. To build and use header units for library headers, which aren't part of your codebase, use the technique described in [Walkthrough: Import STL libraries using header units](walkthrough-import-stl-header-units.md). -## Convert a simple project to use header units +## Convert a project to use header units -In this example you'll compile a header file as a header unit. Begin by creating the following project in Visual Studio: +In this example, you'll compile a header file as a header unit. Begin by creating the following project in Visual Studio: 1. Create a new C++ console app project. 1. Replace the source file contents as follows: @@ -64,35 +66,38 @@ void PrintPythogoreanTriple(int a, int b) } ``` -To enable header units, set the project C++ language standard: +To enable header units, set the project C++ language standard to use the latest features: -1. In the left-hand pane of the project property pages, select **General** -1. Change the **C++ Language Standard** dropdown to **Preview - Features from the Latest C++ Working Draft** +1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** +1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft** ![Set language standard to preview version](media/set-cpp-language-latest.png) ### Compile a header file as a header unit -To compile a file (and what it imports) as a header unit, open the file's properties by selecting it in the **Solution Explorer**, right-click it, and select **Properties**. Then do one of the following depending on the file type: -- For header files, set its **Item Type** property to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header**. Note, setting this property also sets **C/C++** > **Advanced** > **Compile As** to **Compile as C++ Header Unit (/exportHeader)** for you. -![Changing the item type to c/c++ compiler](media/change-item-type.png.png) +To compile a file as a header unit, open the file's properties by selecting it in the **Solution Explorer**. Right-click the file, and select **Properties**. Then do one of the following depending on the file type: + +For header files: +- Set its **Item Type** property to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header**. Setting this property also sets **C/C++** > **Advanced** > **Compile As** to **Compile as C++ Header Unit (/exportHeader)** for you. +![Changing the item type to c/c++ compiler](media/change-item-type.png) -- For source files, set its **Compile As** property to **Compile as C++ Header Unit (/exportHeader)**. -![Changeing Compile As to Compile as C++ Header Unit ](media/change-compile-as.png) +For source files: +- Set its **Compile As** property to **Compile as C++ Header Unit (/exportHeader)**. +![Changing Compile As to Compile as C++ Header Unit ](media/change-compile-as.png) -### Change your code to import the header unit +### Change your code to import a header unit -In the source file for the example project, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements) If the include file you are converting to a header unit is on the system path, that is `#include `, use `import ;` +In the source file for the example project, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). If the include file you are converting to a header unit is on the system include path, `#include `, use `import ;` -After making that change, build the solution (**Build** > **Build Solution** from the main menu, or press `F6`) and run it to see that it produces the expected output: `Pythagorean triple a:2 b:3 c:13` +Build the solution (**Build** > **Build Solution** from the main menu, or press `F6`) and run it to see that it produces the expected output: `Pythagorean triple a:2 b:3 c:13` -In your own projects, this process can be repeated to compile other header files to header units. If you only want to convert a few header files to header units, this is a good approach. +In your own projects, repeat this process to compile header files to header units. -If you have many header files that you want to compile, and the convenience of having the build system automatically take care of it at the expense of reduced build performance, see [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of the approach that you can use with your own project. +If you only want to convert a few header files to header units, this is a good approach. But if you have many header files that you want to compile, and the convenience of having the build system automatically take care of it outweighs the impact on build performance, see [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1). ## See also -[Overview of modules in C++](../cpp/modules-cpp.md) -[`/translateInclude`](./reference/translateinclude.md) -[`/exportHeader`](./reference/module-exportheader.md) -[`/headerUnit`](./reference/headerunit.md) -[Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) \ No newline at end of file +[Walkthrough: Import STL libraries as header units] \(walkthrough-import-stl-header-units.md#approach1) +[Overview of modules in C++](../cpp/modules-cpp.md) \ +[`/translateInclude`](./reference/translateinclude.md) \ +[`/exportHeader`](./reference/module-exportheader.md) \ +[`/headerUnit`](./reference/headerunit.md) \ \ No newline at end of file diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 6b9b3795471..b088c79813f 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -69,7 +69,7 @@ int main() Use the following steps to set the options that cause the build system to scan for headers to compile into header units, and also the option that causes the compiler to treat `#include` as if you had written `import`: -1. From the main menu, choose **Project** > **Properties**. The project properties window appears. +1. From the main menu, choose **Project** > **Properties**. The project properties window appears: ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Ensure that the **Configuration** dropdown is set to **All Configurations** 1. In the left-hand pane of the project property page, select **C/C++** > **General** @@ -78,7 +78,7 @@ Use the following steps to set the options that cause the build system to scan f Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: -1. In the left-hand pane of the project property pages, select **General** +1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** 1. Change the **C++ Language Standard** dropdown to **Preview - Features from the Latest C++ Working Draft** ![Set language standard to preview version](media/set-cpp-language-latest.png) @@ -127,7 +127,7 @@ Next, set project properties to share the header units from this project: 1. In the left-hand pane of the project property page, select **C/C++** > **General** ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** -1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the STL `header-units.json` file (see [Advanced](#advanced)), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. +1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the `header-units.json` file. See [header-units.json](#header-units.json)), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. 1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. ## Consume the STL header unit project @@ -198,6 +198,8 @@ To access these settings: > [!NOTE] > To use header units built as a part of a **DLL** project, the project property setting **All Modules arePublic** should be set to **Yes**. +### `header-units.json` + Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults to determine which STL libraries can be compiled into header units. It is consulted when the build system attempts to create a header unit for an STL header file, and as dependencies are resolved for an STL header file. If the STL header file is not on the list, it is treated as a normal `#include` instead of importing it as a header unit. The [header-units.json](header-unit-json-reference.md) file is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. From e13dc88116c2855e1edb5a9e592c2433498b0d27 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 29 Mar 2021 17:12:12 -0700 Subject: [PATCH 13/82] draft --- docs/build/header-unit-json-reference.md | 22 ++++++++++++------- docs/build/reference/headerunit.md | 19 +++------------- docs/build/reference/sourcedependencies.md | 9 +++++--- docs/build/walkthrough-header-units.md | 10 ++++----- .../walkthrough-import-stl-header-units.md | 12 +++++----- 5 files changed, 34 insertions(+), 38 deletions(-) diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index 0c09115cb9e..1d6e8408ca1 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -8,13 +8,19 @@ helpviewer_keywords: ["header_units.json", "header unit"] # C++ header_units.json reference -## Format - The `header-units.json` file lists which header files can be compiled into header units. - -Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior. Using `#define` can't be used to change the behavior of a header unit. In that case, it's either not listed, or commented out. -The C++ Standard Template Library (STL) `header-units.json` file is located at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include` +Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to determine its behavior. Using `#define` can't be used to change the behavior of a header unit. + +When the project build setting `Scan Sources for Module Dependencies` is turned on, the build system looks for `#include` files that can be compiled as header units. If the build system can find a `header-units.json` file in the directory of files being scanned, it consults it to determine whether the header file it has found should be compiled into a header unit `.ifc` file. + +The reason for this file is that not all header files can be compiled into a header unit. One reason is that header units don't do conditional compilation based on the presence of `#define` symbols. If a header file relies on this mechanism, it can't be compiled into a header unit. + +The switch [`/sourceDependencies:directives`](./reference/sourcedependencies.md) specifies the JSON file which lists which headers can be built as header units and which can't be. For example, you can see the C++ Standard Template Library (STL) `header-units.json` file located at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include` + +We also recommended that you set [`/translateInclude`](./reference/translateinclude.md) when you use the `/sourceDependencies:directives` option because the build will then produce header units not only for the specified headers, but also for all headers that are included by those headers. This ensures minimal symbol duplication in the header units and best build throughput. For information about setting this the Microsoft Visual Studio, see [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#set-project-properties). + +## Schema The format of the `header_units.json` file starts with the schema version, followed by an array of header filenames that can be built into header units. For example: @@ -30,7 +36,7 @@ The format of the `header_units.json` file starts with the schema version, follo "barrier", "bit", "bitset", - // "cassert", // design is permanently incompatible with header units + // "cassert", // design is not compatible with header units ... } ``` @@ -41,5 +47,5 @@ The build system looks for this file on the include path. ## See also -[Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) -[Build faster using Standard Template Library (STL) header units]() to learn how to import STL libraries for faster compilation throughput. \ No newline at end of file +[Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md)\ +[Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1)\ \ No newline at end of file diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index d77c74e92b0..381151823e0 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -16,10 +16,10 @@ Tells the compiler to translate `#include` directives for an importable header-n ### Arguments *`header-filename`*\ -The name of a file that the compiler resolves a `header-name` to. During `import header-name ;` the compiler resolves `header-name` to some file on disk. Use *`header-filename`* to specify that file. Once matched, the compiler opens the corresponding IFC named by *`ifc-filename`* for import. +The name of a file that the compiler resolves a `header-name` to. During `import header-name ;` the compiler resolves `header-name` to a file on disk. Use *`header-filename`* to specify that file. Once matched, the compiler opens the corresponding IFC named by *`ifc-filename`* for import. *`ifc-filename`*\ -The name of a file that contains *IFC data*, prebuilt module information. To import more than one header unit, include a separate **`/headerUnit`** option for each file. +The name of a file that contains prebuilt module information. To import more than one header unit, include a separate **`/headerUnit`** option for each file. ## Remarks @@ -57,17 +57,4 @@ cl ... /experimental:module /translateInclude /headerUnit C:\utils\util.h=C:\uti [`/experimental:module` (Enable module support)](experimental-module.md)\ [`/module:exportHeader` (Create header units)](module-exportheader.md)\ [`/module:reference` (Use named module IFC)](module-reference.md)\ -[`/translateInclude` (Translate include directives into import directives)](translateinclude.md)\ - ----- - -When a project scans a file and finds an `import` determines that a header unit should be produced, it first consults this file - -Scan Sources for Module Dependencies = Yes According to Building header units for STL headers and other libraries doc, scan creates the .json file containing module and header units and their dependencies, which is then built into .ifc files. JTW That is read by the compiler option /sourceDependencies:directives:”the .json file” This .json file lists which headers can be built as header units and which can't be. -/headerUnit specifies which headers to translate to .ifc -If you plan to build header units for STL headers (or other libraries which support header-units.json, see below), it is also recommended to set -Translate Includes = Yes. If “Translate Includes to Imports” is enabled, the build will produce header units not only for the specified headers, but also for all headers that are included there and listed in STL library’s header-unit.json file (in the same directory as the header files). (JTW This is still somewhat mysterious to me) - - - -If “Translate Includes to Imports” is enabled, the build will produce header units not only for the specified headers, but also for all headers that are included there and listed in STL library’s header-unit.json file (in the same directory as the header files). This ensures minimal symbols duplication in the header units and best build throughput. +[`/translateInclude` (Translate include directives into import directives)](translateinclude.md) \ No newline at end of file diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index 071ee81dcab..22bbdc662e0 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -1,7 +1,7 @@ --- title: "/sourceDependencies (Report source-level dependencies)" description: "Reference guide to the /sourceDependencies compiler option in Microsoft C++." -ms.date: 07/29/2020 +ms.date: 04/13/2020 f1_keywords: ["/sourceDependencies"] helpviewer_keywords: ["/sourceDependencies compiler option", "/sourceDependencies"] --- @@ -18,12 +18,14 @@ The JSON file contains a list of the source dependencies, which include: ## Syntax > **`/sourceDependencies`** *filename*\ -> **`/sourceDependencies`** *directory* +> **`/sourceDependencies`** *directory*\ +> **`/sourceDependencies:directives`** *filename*\ ## Arguments *filename*\ -The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path. +The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path.\ +In the `/sourceDependencies:directives` case, this refers to a JSON file that lists which header files can be compiled into a header unit. See [C++ header_units.json reference](..\header-unit-json-reference.md) for an example. *directory*\ If the argument is a directory, the compiler generates source dependency files in the specified directory. The output file name is based on the full name of the input file, with an appended *`.json`* extension. For example, if the file provided to the compiler is *`main.cpp`*, the generated output filename is *`main.cpp.json`*. @@ -38,6 +40,7 @@ When a non-fatal compiler error occurs, the dependency information still gets wr All file paths appear as absolute paths in the output. + ### Examples Given the following sample code: diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 9241c18f801..749ebddfab7 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -18,7 +18,7 @@ Support for header units requires at least Visual Studio 2019 16.10.0 Preview 2. ## What is a header unit -Before you can import a header unit, it must first be compiled. Header units are a binary representation of a header file, and end with an `.ifc` extension. +Before you can import a header unit, it must first be compiled. Header units are a binary representation of a header file, and end with an `.ifc` extension. This is also the format used to store named modules. An important feature of header units is that they're defined by the C++ standard, and can be used cross-platform. @@ -77,11 +77,11 @@ To enable header units, set the project C++ language standard to use the latest To compile a file as a header unit, open the file's properties by selecting it in the **Solution Explorer**. Right-click the file, and select **Properties**. Then do one of the following depending on the file type: For header files: -- Set its **Item Type** property to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header**. Setting this property also sets **C/C++** > **Advanced** > **Compile As** to **Compile as C++ Header Unit (/exportHeader)** for you. +- Set the **Item Type** property to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header**. Setting this property also sets **C/C++** > **Advanced** > **Compile As** to **Compile as C++ Header Unit (/exportHeader)** for you. ![Changing the item type to c/c++ compiler](media/change-item-type.png) -For source files: -- Set its **Compile As** property to **Compile as C++ Header Unit (/exportHeader)**. +For source files (or header files that don't have a `.h` or `.hpp` extension): +- Set the **Compile As** property to **Compile as C++ Header Unit (/exportHeader)**. ![Changing Compile As to Compile as C++ Header Unit ](media/change-compile-as.png) ### Change your code to import a header unit @@ -96,7 +96,7 @@ If you only want to convert a few header files to header units, this is a good a ## See also -[Walkthrough: Import STL libraries as header units] \(walkthrough-import-stl-header-units.md#approach1) +[Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1)\ [Overview of modules in C++](../cpp/modules-cpp.md) \ [`/translateInclude`](./reference/translateinclude.md) \ [`/exportHeader`](./reference/module-exportheader.md) \ diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index b088c79813f..e571f3c4027 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -95,7 +95,7 @@ You can fine-tune this balance by not scanning for module dependencies, and inst ## Approach 2: Build a shared library -The more flexible and more performant way to consume STL headers is to create a project, or projects, that build common header units from the STL headers you want to use. Then reference that project, or projects, from the projects that need those STL headers. +The more flexible and more performant way to consume STL headers is to create a library, or libararies, that build common header units from the STL headers you want to use. Then reference that library, or libraries, from the projects that need those STL headers. Adding a reference establishes a mapping between the `import` statement for the header unit, and and its `.ifc` file. This option ensures that header units for a particular header will be built only once. It's similar to using a shared precompiled header file, but is much easier. @@ -130,7 +130,7 @@ Next, set project properties to share the header units from this project: 1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the `header-units.json` file. See [header-units.json](#header-units.json)), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. 1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. -## Consume the STL header unit project +## Reference the STL header unit project Next, create a project that will use the built `` and `` STL header units: @@ -179,12 +179,12 @@ Header units built as part of a static library project are automatically availab The following settings control the visibility of header units to the build system: - **Public Include Directories** - specify project directories for header units that should be automatically added to the include path in referencing projects. -- **Public C++ Module directories** - specify project directories containing header units that should be available to referencing projects. -- **All Modules are Public** - a fast way to make all header units in the project automatically available to referencing projects. +- **Public C++ Module directories** - specify which project directories contain header units that should be available to referencing projects. This is a way of making some header units public, by putting those that should be public in their own directory. If you set this, you may also want to specify **Public Include Directories** so your public headers are automatically added to the include path in referencing projects. +- **All Modules are Public** - To use header units built as a part of a DLL project, the symbols have to be exported from the DLL. To do so, set this property to **Yes**. -### Handle duplicate symbols +### Duplicate symbols -If you reference two or more projects that built two or more header units with the same name, or that built two or more header unit for the same header file, you'll get duplicate symbols. You can use C/C++ > Additional Module dependencies & Additional Header Unit Dependencies to resolve those collisions by specifying which module or header unit should be used for this project. Otherwise the one that is chosen is undefined. +If you reference two or more projects that built two or more header units with the same name, or that built two or more header unit for the same header file, you'll get duplicate symbols. You can use the project properties **C/C++** > **Additional Module dependencies** & **Additional Header Unit Dependencies** to resolve those collisions by specifying which module or header unit should be used. Otherwise, you won't be able to predict which one gets used. To access these settings: 1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. From d10281af919b907f71ffa8b1dce6d6e9b1d7f301 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 29 Mar 2021 17:25:03 -0700 Subject: [PATCH 14/82] fix link --- docs/build/walkthrough-import-stl-header-units.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index e571f3c4027..ec968a75f74 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -127,7 +127,7 @@ Next, set project properties to share the header units from this project: 1. In the left-hand pane of the project property page, select **C/C++** > **General** ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** -1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the `header-units.json` file. See [header-units.json](#header-units.json)), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. +1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the `header-units.json` file. See [header-units.json](#header-unitsjson), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. 1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. ## Reference the STL header unit project From c9b8b1f90921c10c1a54842a7fcb8a326f00393d Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 30 Mar 2021 13:23:46 -0700 Subject: [PATCH 15/82] draft --- docs/build/header-unit-json-reference.md | 12 ++-- .../media/add-reference-to-walkthrough.png | Bin 0 -> 30500 bytes docs/build/media/change-compile-as.png | Bin 21731 -> 26286 bytes ...lic-include-module-directories-setting.png | Bin 54762 -> 54819 bytes docs/build/media/set-cpp-language-latest.png | Bin 27930 -> 27983 bytes .../set-header-unit-library-settings.png | Bin 30686 -> 43315 bytes .../media/vs2019-scan-module-dependencies.png | Bin 44409 -> 53960 bytes docs/build/walkthrough-header-units.md | 30 ++++---- .../walkthrough-import-stl-header-units.md | 67 ++++++++++-------- 9 files changed, 58 insertions(+), 51 deletions(-) create mode 100644 docs/build/media/add-reference-to-walkthrough.png diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index 1d6e8408ca1..45edd71cc96 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -1,7 +1,7 @@ --- description: "Reference for header_units.json format" title: "C++ header unit.json reference" -ms.date: "3/21/2021" +ms.date: "4/13/2021" f1_keywords: ["header_units.json"] helpviewer_keywords: ["header_units.json", "header unit"] --- @@ -10,19 +10,17 @@ helpviewer_keywords: ["header_units.json", "header unit"] The `header-units.json` file lists which header files can be compiled into header units. -Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to determine its behavior. Using `#define` can't be used to change the behavior of a header unit. +Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` at compile time to determine its behavior. Using `#define` can't be used to change the behavior of a header unit, so `` shouldn't be compiled into a header unit because it wouldn't reflect this behavior. -When the project build setting `Scan Sources for Module Dependencies` is turned on, the build system looks for `#include` files that can be compiled as header units. If the build system can find a `header-units.json` file in the directory of files being scanned, it consults it to determine whether the header file it has found should be compiled into a header unit `.ifc` file. - -The reason for this file is that not all header files can be compiled into a header unit. One reason is that header units don't do conditional compilation based on the presence of `#define` symbols. If a header file relies on this mechanism, it can't be compiled into a header unit. +When the project build setting `Translate Includes to Imports (/translateInclude)` is on, the build system looks for `#include` files that can be compiled as header units. There's an allowlist for the Standard Template Library headers that the build system consults when `/TranslateInclude ` is specified to determine which STL headers can be compiled into header units. It is consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file is not on the list, it is treated as a normal `#include` instead of importing it as a header unit. The switch [`/sourceDependencies:directives`](./reference/sourcedependencies.md) specifies the JSON file which lists which headers can be built as header units and which can't be. For example, you can see the C++ Standard Template Library (STL) `header-units.json` file located at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include` -We also recommended that you set [`/translateInclude`](./reference/translateinclude.md) when you use the `/sourceDependencies:directives` option because the build will then produce header units not only for the specified headers, but also for all headers that are included by those headers. This ensures minimal symbol duplication in the header units and best build throughput. For information about setting this the Microsoft Visual Studio, see [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#set-project-properties). +You should also set [`/translateInclude`](./reference/translateinclude.md) when you use the `/sourceDependencies:directives` option because the build system will then produce header units not only for the specified headers, but also for all headers that are included by those headers. This ensures minimal symbol duplication in the header units and best build throughput. For information about setting this the Microsoft Visual Studio, see [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#set-project-properties). ## Schema -The format of the `header_units.json` file starts with the schema version, followed by an array of header filenames that can be built into header units. For example: +The format of the `header_units.json` file starts with the schema version, followed by an array of header filenames that can be allowed to be built into header units. For example: ```json { diff --git a/docs/build/media/add-reference-to-walkthrough.png b/docs/build/media/add-reference-to-walkthrough.png new file mode 100644 index 0000000000000000000000000000000000000000..e158d40b48579d22bb9bd12d93b62ae88ec8b5f1 GIT binary patch literal 30500 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 literal 0 HcmV?d00001 diff --git a/docs/build/media/change-compile-as.png b/docs/build/media/change-compile-as.png index 0787006e0792291eb463092a0efc83882159f26d..7ef1fa2696209c978da104f1716d07c6356b13ed 100644 GIT binary patch literal 26286 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 EKZTy6H~;_u literal 21731 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

l-C`p-KoV5j+mSli^ZfXW#WwfBfQ@zk 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 diff --git a/docs/build/media/public-include-module-directories-setting.png b/docs/build/media/public-include-module-directories-setting.png index 345c98251ae0db350d688508ddcfaf1b550575f0..fe8ec07ac391924cce3df0d0fed18219bf22b199 100644 GIT binary patch literal 54819 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∈W0NvUKNIXeZqg7WXfrEkfbf?&93)5 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

NoR`e?jd=?2c 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 z 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 literal 27930 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�VQDC zJ@L4p`4|in)IEBYEgmhpSt&KgH))fq;Rzt_x$xQr{Yr8f5tGV>MLAK7X@s}^5e<%c zaW}NiA0dBGjC_YOKWnV|5!zxOfULN5EpYYG9J?@wHd&htQ5~yo9Qeh&MUNuc;2H#xE}7F zC~9KI_x5{*m0f8_uvTI!MT?KcnQx#{7G*v;VUyR@@$tjmmE+bRZn}uy3he9-z@YyJ zHFrTr7dppqSZ%W(P2K5_qx$ma7sB80q{_9!JvCacRBz#!>UeSv%Zv@uPktTVltC^L zfb02c2c$%aEb{|e?XIP?f~7h5pk+p}X{7zX$Dr%f>qbVLM;9x%2y~Y@FcqFvQa3@W z;))HwNXB63v;M*UuEm$_qcSsj4rG(D;1VL-l#wN&^Y+7dN4z%pag6yy>dX$%bltGo zPZJL7_Hz}52kJL3Tb%rpoIAClLnBw_;K39uAf)^up!~Xs@x5BhKklDdD5nf1%0DXy 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 literal 30686 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 EAD`7rDgXcg diff --git a/docs/build/media/vs2019-scan-module-dependencies.png b/docs/build/media/vs2019-scan-module-dependencies.png index db90ca9f4a7b2840e3b7ddab12db4dbcb3e6cf3d..30133ba59739c8c04e02f8ec31dafb0d50700c40 100644 GIT binary patch literal 53960 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 literal 44409 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 diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 749ebddfab7..157b5b16dd5 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -10,7 +10,7 @@ helpviewer_keywords: ["import", "header unit", "ifc", "stl"] This article is about building and importing header units using Visual Studio 2019. See [Walkthrough: Import STL libraries using header units](walkthrough-import-stl-header-units.md) to learn specifically how to import Standard Template Library headers as header units. -Header units are a recommended alternative to [precompiled header files](creating-precompiled-header-files.md). They're easier to set up and easier to use than a [shared PCH](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. +Header units are the recommended alternative to [precompiled header files](creating-precompiled-header-files.md). They're easier to set up and easier to use than a [shared PCH](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. ## Prerequisites @@ -18,27 +18,27 @@ Support for header units requires at least Visual Studio 2019 16.10.0 Preview 2. ## What is a header unit -Before you can import a header unit, it must first be compiled. Header units are a binary representation of a header file, and end with an `.ifc` extension. This is also the format used to store named modules. +Header units are a binary representation of a header file, and end with an `.ifc` extension. This is also the format used to store named modules. -An important feature of header units is that they're defined by the C++ standard, and can be used cross-platform. +Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, everything in a header unit (including macro definitions) are visible, while those in a module aren't. Another difference is that header units aren't affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. -Header units are also independent of the machine they're built on. One machine can produce IFCs and another machine consume them. A PCH can't do that because the persisted data structures are largely tied to the memory layout of the machine where they're compiled. +Header units are defined by the C++ standard, and can be used cross-platform. -Ideally, you should use the same compiler flags to compile the header unit and the program that imports it. Some flags, like `/EHsc`, `/MD[d]`, etc. have an impact on the semantics of the program that are captured in a header unit. +Before you can import a header unit, a header file must be compiled into a header unit. Header units are independent of the machine they're built on. One machine can produce IFCs and another machine consume them. A PCH can't do that because the persisted data structures are largely tied to the memory layout of the machine where they're compiled. -Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, everything in a header unit (including macro definitions) are visible, while those in a module aren't. Another difference is that header units aren't affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. +Ideally, you should use the same compiler flags to compile a header unit and the program that imports it. Flags, like `/EHsc`, `/MD[d]`, and others, have an impact on the semantics of the program that are captured in a header unit. ## Ways to compile a header unit There are several ways to compile a file into a header unit: --Automatically scan for header units: This approach is best suited to smaller projects, that include many different headers. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it is better suited to smaller projects, or for those where build time is not a crucial consideration, is because it takes extra time for the build system to scan all of the files to find what should be built into header units. +-Automatically scan for header units: This approach is best suited to smaller projects that include many different header files. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it is better suited to smaller projects, or for those where build time is not a crucial consideration, is because it takes extra time for the build system to scan all of the files to find what should be built into header units. --Build a shared header units project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You can build individual libraries containing the headers units you want, factored the way that makes the most sense for consumption in your project. You create a static library (or libraries) that contain the header units that you want, and then reference it from the projects that need its header imports. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. +-Build a shared header units project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library (or libraries) that contain the header units that you want, and then reference it from the projects that then import the header units they need. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. -Tell the build system which header units to build by changing the compilation action for a file. That approach is demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's also a good way to quickly and selectively try out header units in your project. +- Choose individual header units to build by changing the compilation action for a file. This approach is demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's also a good way to quickly and selectively try out header units in your project. -To build header units from the headers in your codebase, you can use any of the methods above. To build and use header units for library headers, which aren't part of your codebase, use the technique described in [Walkthrough: Import STL libraries using header units](walkthrough-import-stl-header-units.md). +To build header units from the headers in your codebase, you can use any of the methods above. To build and use header units for library headers that aren't part of your codebase, use the technique described in [Walkthrough: Import STL libraries using header units](walkthrough-import-stl-header-units.md). ## Convert a project to use header units @@ -55,7 +55,7 @@ int main() return 0; } ``` -1. Add a header file called `Pythagorean.h`, and replace its contents as follows: +1. Add a header file called `Pythagorean.h`, and replace its contents with the following: ```cpp #pragma once #include @@ -74,7 +74,7 @@ To enable header units, set the project C++ language standard to use the latest ### Compile a header file as a header unit -To compile a file as a header unit, open the file's properties by selecting it in the **Solution Explorer**. Right-click the file, and select **Properties**. Then do one of the following depending on the file type: +In the **Solution Explorer**, select the file you want to compile as a header unit. Right-click the file, and select **Properties**. Then do one of the following depending on the file type: For header files: - Set the **Item Type** property to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header**. Setting this property also sets **C/C++** > **Advanced** > **Compile As** to **Compile as C++ Header Unit (/exportHeader)** for you. @@ -86,13 +86,13 @@ For source files (or header files that don't have a `.h` or `.hpp` extension): ### Change your code to import a header unit -In the source file for the example project, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). If the include file you are converting to a header unit is on the system include path, `#include `, use `import ;` +In the source file for the example project, the file that contains `main()`, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). When you are compiling a header unit from a system header, use angle brackets (`#include ;`). If it's a project header, use `import "file";` Build the solution (**Build** > **Build Solution** from the main menu, or press `F6`) and run it to see that it produces the expected output: `Pythagorean triple a:2 b:3 c:13` -In your own projects, repeat this process to compile header files to header units. +In your own projects, repeat this process to compile the header files you want to import as header units. -If you only want to convert a few header files to header units, this is a good approach. But if you have many header files that you want to compile, and the convenience of having the build system automatically take care of it outweighs the impact on build performance, see [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1). +If you only want to convert a few header files to header units, this is a good approach. But if you have many header files that you want to compile, and the convenience of having the build system automatically handle it outweighs the impact on build performance, you can have the build system scan for, and build, header units for you. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1). ## See also diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index ec968a75f74..e95d95c123f 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -9,9 +9,13 @@ helpviewer_keywords: ["import"] This walkthrough shows two different ways to import C++ Standard Template Library (STL) libraries as header units in Visual Studio. +The [first way](#approach1) has the build system automatically scan for, and build, header units based on what STL headers you include in your project. + +The [second way](#approach2) demonstrates how to build a static library containing header units for the STL headers you want to use, and then reference that project to import the header units. + Importing a STL header as a header unit is a simpler alternative to [precompiled header files](creating-precompiled-header-files.md). Header units are easier to setup and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. -Before you can import an STL header this way, it must first be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. +Before you can import an STL header, it must be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally compile the way you can with a header file. ## Prerequisites @@ -23,31 +27,33 @@ Before an STL header can be imported, it must be compiled into a header unit. Th **Scan for module dependencies** -One approach, that requires minimal effort on your part, puts the burden on the build system. At a high level, it works by scanning your sources for `#include` directives, and tries to compile those header files and their dependencies into header units. It then imports the header unit instead of running the header file through the preprocessor. You don't even have to change your code from `#include ` to `import ;`. This may be a good approach for you if your codebase isn't large, or you just want to try out header units without changing your code. +This approach requires minimal effort on your part by putting the burden on the build system. At a high level, it works by scanning your sources for `#include` directives, and tries to compile those header files and their dependencies into header units. It then imports the header unit instead of running the header file through the preprocessor. You don't even have to change your code from `#include ` to `import ;`. This may be a good approach for you if your codebase isn't large, or you just want to try out header units without changing your code. -It may not be the optimal approach for larger projects because it can be time consuming to scan through the files looking for files to build into header units. And it may result in reprocessing the same header files repeatedly, increasing build time. Not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. +It may not be the optimal approach for larger projects because it can be time consuming to scan through the files to find the headers to build into header units. And it may result in reprocessing the same header files repeatedly, increasing build time. Also, not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. If a header file can't be compiled into a header unit, it will be treated as a normal `#include` file. See [Approach 1: Scan for headers](#approach1), in this article, for a walkthrough of this approach. **Create a shared library** -The recommended approach, particularly for larger projects, or for cases where you want to share a common set of header units across multiple projects, is to create a shared library that includes the STL libraries that you want to use. This library is then shared with projects that want to import those header units. It's like using [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but much easier. +The recommended approach, particularly for larger projects, or in cases where you want to share a common set of header units across multiple projects, is to create a shared library containing header units you want to use. This library is then shared with projects that import those header units. It's like using [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but significantly easier. See [Approach 2: Build a shared library](#approach2), in this article, for a walkthrough of this approach. ## Approach 1: Scan for headers -We'll begin with the easiest way to import STL libraries as header units. As was said earlier, this approach may not be appropriate for larger projects because scanning the sources takes additional build time, especially in large projects. +We'll begin with the easiest way to import STL libraries as header units. This approach may not be appropriate for larger projects because scanning the sources takes additional build time. -This option is convenient for codebases with extensive use of different header units, and where build throughput isn't critical. This option doesn't guarantee that a header unit for a particular header will be built only once. However, header units built by referenced static libraries projects are reused. +This option is convenient for codebases that use a lot of different headers, and where build throughput isn't critical. This option doesn't guarantee that a header unit for a particular header will be built only once. Header units built by referenced static libraries projects are reused. You can import your STL libraries as header units without modifying your code by setting two Visual C++ project options: - **Scan Sources for Module Dependencies** - **Translate Includes to Imports** - -These settings cause the build system to scan your source code and look for `#include` directives to compile into header units. For each successfully compiled header unit, the compiler then treats its corresponding `#include` as an `import` and reads in the compiled header unit instead. There are other ways to indicate that a header file should be treated as a header unit besides scanning your entire project. That is covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). -To demonstrate this approach, we'll create a project that imports a couple STL libraries, and then change the project properties so that it treats the library includes as header imports. +These settings cause the build system to scan your source code for `#include` directives to compile into header units. For each successfully compiled header unit, the compiler then treats its corresponding `#include` as an `import` and reads in the compiled header unit. There are other ways to indicate that a header file should be treated as a header unit besides scanning your entire project. That is covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). + +Not all headers can be converted to a header unit. One issue is `#define` symbols that cause a header file to compile differently. If a header file relies on this mechanism, it won't be converted to a header unit, and will instead be treated as an `#include` instead of an `import`. + +To demonstrate this approach, we'll create a project that imports two STL libraries, and then change the project properties so that it treats the library includes as header imports. ### Create a C++ console app project @@ -67,7 +73,7 @@ int main() ### Set project options and run the project -Use the following steps to set the options that cause the build system to scan for headers to compile into header units, and also the option that causes the compiler to treat `#include` as if you had written `import`: +Follow these steps to set the options that cause the build system to scan for headers to compile into header units. And the option that causes the compiler to treat `#include` as if you had written `import`: 1. From the main menu, choose **Project** > **Properties**. The project properties window appears: ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) @@ -79,7 +85,7 @@ Use the following steps to set the options that cause the build system to scan f Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: 1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** -1. Change the **C++ Language Standard** dropdown to **Preview - Features from the Latest C++ Working Draft** +1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft** ![Set language standard to preview version](media/set-cpp-language-latest.png) @@ -87,25 +93,26 @@ Change the C++ language standard for the compiler. The latest preview setting is You can run the solution to verify that it produces the expected output: `1` -If you are updating an existing solution to use **Scan Sources for Module Dependencies**, set this property, and **Translate Includes to Imports**, in all of the projects in your solution where you want to use header units. +When you update an existing solution to use **Scan Sources for Module Dependencies**, also set **Translate Includes to Imports** for all of the projects in your solution where you want to use header units. -The primary considerations of this approach are the balance between convenience and the cost of scanning all of your files to determine which header files to build as header units. +The primary consideration of this approach is the balance between convenience and the cost of scanning all of your files to determine which header files to build as header units. -You can fine-tune this balance by not scanning for module dependencies, and instead explicitly marking which files should be built as header units. This is explored in more detail in [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) +You can fine-tune this balance by not scanning for module dependencies, and instead explicitly marking which files should be built as header units. That approach is shown in [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) ## Approach 2: Build a shared library -The more flexible and more performant way to consume STL headers is to create a library, or libararies, that build common header units from the STL headers you want to use. Then reference that library, or libraries, from the projects that need those STL headers. Adding a reference establishes a mapping between the `import` statement for the header unit, and and its `.ifc` file. +The more flexible and more build performant way to consume STL headers is to create a library, or libararies, that build common header units from the STL headers you want to use. Then reference that library, or libraries, from the projects that need those STL headers. Adding a reference establishes a mapping between the `import` statement for the header unit, and its `.ifc` file. This option ensures that header units for a particular header will be built only once. It's similar to using a shared precompiled header file, but is much easier. -In this example, you'll create a project that imports `` and ``. Once built, you'll reference this shared project from another C++ project. Then, in the referencing project, everywhere `import ;` or `import ;` is found, it will import the built header unit for that library instead of running the contents of the library header through the preprocessor. In projects that include the same library header in multiple files, this will improve build performance similar to the way PCH files do because the header won't have to be processed repeatedly. Instead, the compiled header unit will be imported. +In this example, you'll create a project that imports `` and ``. Once built, you'll reference this shared project from another C++ project. Then, in the referencing project, everywhere `import ;` or `import ;` is found, it will import the built header unit for that library instead of running the contents of the library header through the preprocessor. In projects that include the same library header in multiple files, this will improve build performance similarly to how PCH files do because the header won't have to be processed over and over by the files that include it. Instead, the already processed compiled header unit will be imported. ### Create the shared project Begin by creating the project for the shared header units as follows: -1. Create an Empty C++ project. Call it, for the sake of this example, **SharedPrj**. **Empty C++ project** is one of the project types available on the **Create a new project** window: +1. Create an Empty C++ project. Call it, for the sake of this example, **SharedPrj**.\ + **Empty C++ project** is one of the project types available on the **Create a new project** window: ![Create a new empty C++ project](media/empty-project-option.png) 1. Add a new (empty) C++ file to the project. Change the file's contents to the following: @@ -116,18 +123,18 @@ import ; ### Set project properties -Next, set project properties to share the header units from this project: +Set project properties to share the header units from this project: 1. From the Visual Studio main menu, choose **Project** > **Properties**. The project properties window appears: ![Settings for Configuration type and C++ language standard](media/set-header-unit-library-settings.png) 1. Ensure that the **Configuration** dropdown is set to **All Configurations** 1. In the left-hand pane of the project property page, select **General** 1. Change the **Configuration Type** option to **Static library (.lib)** -1. Change **C++ Language Standard** to **Preview - Features from the Latest C++ Working Draft** +1. Change **C++ Language Standard** to **Preview-Features from the Latest C++ Working Draft** 1. In the left-hand pane of the project property page, select **C/C++** > **General** ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** -1. Set the **Translate Includes to Imports** dropdown to **Yes**. Setting this causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers. And also those listed in the `header-units.json` file. See [header-units.json](#header-unitsjson), below, for details about this file. This ensures minimal symbols duplication in the header units and the best build throughput. +1. Set the **Translate Includes to Imports** dropdown to **Yes**. This setting causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers and those listed in the `header-units.json` file. See [header-units.json](#header-unitsjson), below, for more details about this file. This setting ensures minimal symbols duplication in the header units and the best build throughput. 1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. ## Reference the STL header unit project @@ -153,9 +160,11 @@ Change the C++ language standard for the compiler. The latest preview setting is 1. In the **Solution Explorer**, select right-click the **Walkthrough** project and select **Properties**. The project properties window appears. ![Set language standard to preview version](media/set-cpp-language-latest.png) 1. In the left-hand pane of the **Walkthrough** project property pages, select **Configuration Properties** > **General** -1. Change **C++ Language Standard** to **Preview - Features from the Latest C++ Working Draft** +1. Change **C++ Language Standard** to **Preview-Features from the Latest C++ Working Draft** 1. Click **OK** to close the project properties pages -1. Add a reference from the **Walkthrough** project to the **SharedPrj** project. To do so, under the **Walkthrough** project, click on the **References** node, and select **Add Reference**. Select **SharedPrj** from the list of projects. What this reference accomplishes is that the build system will use the header units built by **SharedPrj** whenever an `import` in the **Walkthrough** project matches one of the built header units in **SharedPrj** +1. Add a reference from the **Walkthrough** project to the **SharedPrj** project. To do so, under the **Walkthrough** project, click on the **References** node, and select **Add Reference**. Select **SharedPrj** from the list of projects. +![Add reference dialog. Used to add a reference to the Walkthough project](./media/add-reference-to-walkthrough.png) +What this reference accomplishes is that the build system will use the header units built into **SharedPrj** whenever an `import` in the **Walkthrough** project matches one of the built header units in **SharedPrj** 1. Click **OK** to close the **Add Reference** dialog 1. Right-click the **Walkthrough** project and select **Set as Startup Project** @@ -163,13 +172,13 @@ Then you can build the solution (**Build** > **Build Solution** from the main me The advantage of this approach is that you can reference the static library from any project to reuse the header units in it. In this example, that's `` and ``. -You could make a monolithic library containing all the commonly used STL headers that you want to import from your various projects. Or, you could produce multiple shared libraries that have different groupings of STL libraries that you want to import as header units. Then reference those shared projects as needed. +You can make a monolithic library containing all the commonly used STL headers that you want to import from your various projects. Or, you can produce smaller shared libraries that have different groupings of STL libraries that you want to import as header units. Then reference those shared projects as needed. The result should be increased build throughput because importing a header unit significantly reduces the work the compiler must do. It's important when you do this with your own projects that you build the shared library using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the shared library. -## Reuse built header units between projects +## Reuse header units between projects Header units built as part of a static library project are automatically available to all directly and indirectly referencing projects. There are project settings you can use to control which header units should be automatically available to all referencing projects. The settings are in project settings under **VC++ Directories**: 1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. @@ -178,18 +187,18 @@ Header units built as part of a static library project are automatically availab The following settings control the visibility of header units to the build system: -- **Public Include Directories** - specify project directories for header units that should be automatically added to the include path in referencing projects. -- **Public C++ Module directories** - specify which project directories contain header units that should be available to referencing projects. This is a way of making some header units public, by putting those that should be public in their own directory. If you set this, you may also want to specify **Public Include Directories** so your public headers are automatically added to the include path in referencing projects. +- **Public Include Directories**: specify project directories for header units that should be automatically added to the include path in referencing projects. +- **Public C++ Module directories**: specify which project directories contain header units that should be available to referencing projects. This is a way of making some header units public, by putting those that should be public in a directory that will be made visible to other projects. If you set this, you may also want to specify **Public Include Directories** so your public headers are automatically added to the include path in referencing projects. - **All Modules are Public** - To use header units built as a part of a DLL project, the symbols have to be exported from the DLL. To do so, set this property to **Yes**. ### Duplicate symbols -If you reference two or more projects that built two or more header units with the same name, or that built two or more header unit for the same header file, you'll get duplicate symbols. You can use the project properties **C/C++** > **Additional Module dependencies** & **Additional Header Unit Dependencies** to resolve those collisions by specifying which module or header unit should be used. Otherwise, you won't be able to predict which one gets used. +If you reference two or more projects that built two or more header units with the same name, or that built two or more header unit for the same header file, you'll get duplicate symbols. You can use the project properties **C/C++** > **Additional Header Unit Dependencies** to resolve collisions by specifying which header unit should be used. Otherwise, you won't be able to predict which one gets picked. To access these settings: 1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. 1. In the left-hand pane of the project properties window, select **C/C++** > **General**. -1. Use **Additional Header Unit Dependencies** to resolve collisions by specifying explicitly which module or header unit should be used for this project: +1. Use **Additional Header Unit Dependencies** to resolve collisions by specifying which module or header unit should be used for this project: ![Additional Header Unit Dependencies setting in the project properties dialog](media/additional-header-unit-dependencies-setting.png) > [!IMPORTANT] @@ -200,7 +209,7 @@ To access these settings: ### `header-units.json` -Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults to determine which STL libraries can be compiled into header units. It is consulted when the build system attempts to create a header unit for an STL header file, and as dependencies are resolved for an STL header file. If the STL header file is not on the list, it is treated as a normal `#include` instead of importing it as a header unit. +Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults when `/TranslateInclude ` is specified to determine which STL headers can be compiled into header units. It is consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file is not on the list, it is treated as a normal `#include` instead of importing it as a header unit. The [header-units.json](header-unit-json-reference.md) file is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. From ac94615f7c004abb899e2db7cf7417e791d373ef Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 30 Mar 2021 13:43:03 -0700 Subject: [PATCH 16/82] draft --- docs/build/header-unit-json-reference.md | 10 +++++----- docs/build/walkthrough-header-units.md | 6 +++--- .../walkthrough-import-stl-header-units.md | 18 +++++++++--------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index 45edd71cc96..4e17ba56d59 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -1,5 +1,5 @@ --- -description: "Reference for header_units.json format" +description: "Reference for header_units.json file" title: "C++ header unit.json reference" ms.date: "4/13/2021" f1_keywords: ["header_units.json"] @@ -12,15 +12,15 @@ The `header-units.json` file lists which header files can be compiled into heade Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` at compile time to determine its behavior. Using `#define` can't be used to change the behavior of a header unit, so `` shouldn't be compiled into a header unit because it wouldn't reflect this behavior. -When the project build setting `Translate Includes to Imports (/translateInclude)` is on, the build system looks for `#include` files that can be compiled as header units. There's an allowlist for the Standard Template Library headers that the build system consults when `/TranslateInclude ` is specified to determine which STL headers can be compiled into header units. It is consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file is not on the list, it is treated as a normal `#include` instead of importing it as a header unit. +When the project build setting `Translate Includes to Imports (/translateInclude)` is on, the build system looks for `#include` files that can be compiled as header units. There's an allowlist for the Standard Template Library headers that the build system consults when `/TranslateInclude ` is specified to determine which Standard Template Library (STL) headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. -The switch [`/sourceDependencies:directives`](./reference/sourcedependencies.md) specifies the JSON file which lists which headers can be built as header units and which can't be. For example, you can see the C++ Standard Template Library (STL) `header-units.json` file located at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include` +The switch [`/sourceDependencies:directives`](./reference/sourcedependencies.md) specifies the JSON file, which lists which headers can be built as header units and which can't be. For example, you can see the C++ Standard Template Library (STL) `header-units.json` file located at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include` -You should also set [`/translateInclude`](./reference/translateinclude.md) when you use the `/sourceDependencies:directives` option because the build system will then produce header units not only for the specified headers, but also for all headers that are included by those headers. This ensures minimal symbol duplication in the header units and best build throughput. For information about setting this the Microsoft Visual Studio, see [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#set-project-properties). +Set [`/translateInclude`](./reference/translateinclude.md) when you use the `/sourceDependencies:directives` option because the build system will then produce header units not only for the specified headers, but also for all headers that are included by those headers. This ensures minimal symbol duplication in the header units and best build throughput. For information about using this setting in Microsoft Visual Studio, see [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#set-project-properties). ## Schema -The format of the `header_units.json` file starts with the schema version, followed by an array of header filenames that can be allowed to be built into header units. For example: +The format of the `header_units.json` file starts with the schema version, followed by an array of filenames for headers that can be built into header units. For example: ```json { diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 157b5b16dd5..ebf200e6417 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -24,7 +24,7 @@ Header units provide a "module-like" experience for header files even though the Header units are defined by the C++ standard, and can be used cross-platform. -Before you can import a header unit, a header file must be compiled into a header unit. Header units are independent of the machine they're built on. One machine can produce IFCs and another machine consume them. A PCH can't do that because the persisted data structures are largely tied to the memory layout of the machine where they're compiled. +Before you can import a header unit, a header file must be compiled into a header unit. Header units are independent of the machine they're built on. One machine could produce IFCs and another machine consume them. A PCH can't do that because the persisted data structures are largely tied to the memory layout of the machine where they're compiled. Ideally, you should use the same compiler flags to compile a header unit and the program that imports it. Flags, like `/EHsc`, `/MD[d]`, and others, have an impact on the semantics of the program that are captured in a header unit. @@ -32,7 +32,7 @@ Ideally, you should use the same compiler flags to compile a header unit and the There are several ways to compile a file into a header unit: --Automatically scan for header units: This approach is best suited to smaller projects that include many different header files. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it is better suited to smaller projects, or for those where build time is not a crucial consideration, is because it takes extra time for the build system to scan all of the files to find what should be built into header units. +-Automatically scan for header units: This approach is best suited to smaller projects that include many different header files. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it's better suited to smaller projects, or for those where build time isn't a crucial consideration, is because it takes extra time for the build system to scan all of the files to find what should be built into header units. -Build a shared header units project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library (or libraries) that contain the header units that you want, and then reference it from the projects that then import the header units they need. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. @@ -86,7 +86,7 @@ For source files (or header files that don't have a `.h` or `.hpp` extension): ### Change your code to import a header unit -In the source file for the example project, the file that contains `main()`, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). When you are compiling a header unit from a system header, use angle brackets (`#include ;`). If it's a project header, use `import "file";` +In the source file for the example project, the file that contains `main()`, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). When you're compiling a header unit from a system header, use angle brackets (`#include ;`). If it's a project header, use `import "file";` Build the solution (**Build** > **Build Solution** from the main menu, or press `F6`) and run it to see that it produces the expected output: `Pythagorean triple a:2 b:3 c:13` diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index e95d95c123f..f383436e788 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -13,7 +13,7 @@ The [first way](#approach1) has the build system automatically scan for, and bui The [second way](#approach2) demonstrates how to build a static library containing header units for the STL headers you want to use, and then reference that project to import the header units. -Importing a STL header as a header unit is a simpler alternative to [precompiled header files](creating-precompiled-header-files.md). Header units are easier to setup and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. +Importing a STL header as a header unit is a simpler alternative to [precompiled header files](creating-precompiled-header-files.md). Header units are easier to set up and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. Before you can import an STL header, it must be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally compile the way you can with a header file. @@ -35,15 +35,15 @@ See [Approach 1: Scan for headers](#approach1), in this article, for a walkthrou **Create a shared library** -The recommended approach, particularly for larger projects, or in cases where you want to share a common set of header units across multiple projects, is to create a shared library containing header units you want to use. This library is then shared with projects that import those header units. It's like using [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but significantly easier. +The recommended approach, particularly for larger projects, or in cases where you want to share a common set of header units across multiple projects, is to create a shared library containing header units you want to use. This library is then shared with projects that import those header units. It's like using [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but easier. See [Approach 2: Build a shared library](#approach2), in this article, for a walkthrough of this approach. ## Approach 1: Scan for headers -We'll begin with the easiest way to import STL libraries as header units. This approach may not be appropriate for larger projects because scanning the sources takes additional build time. +We'll begin with the easiest way to import STL libraries as header units. This approach may not be appropriate for larger projects because scanning the sources takes more build time. -This option is convenient for codebases that use a lot of different headers, and where build throughput isn't critical. This option doesn't guarantee that a header unit for a particular header will be built only once. Header units built by referenced static libraries projects are reused. +This option is convenient for codebases that use many different headers, and where build throughput isn't critical. This option doesn't guarantee a header unit for a particular header will be built only once. Header units built by referenced static libraries projects are reused. You can import your STL libraries as header units without modifying your code by setting two Visual C++ project options: - **Scan Sources for Module Dependencies** @@ -101,7 +101,7 @@ You can fine-tune this balance by not scanning for module dependencies, and inst ## Approach 2: Build a shared library -The more flexible and more build performant way to consume STL headers is to create a library, or libararies, that build common header units from the STL headers you want to use. Then reference that library, or libraries, from the projects that need those STL headers. Adding a reference establishes a mapping between the `import` statement for the header unit, and its `.ifc` file. +The more flexible and more build performant way to consume STL headers is to create a library, or libraries, that build common header units from the STL headers you want to use. Then reference that library, or libraries, from the projects that need those STL headers. Adding a reference establishes a mapping between the `import` statement for the header unit, and its `.ifc` file. This option ensures that header units for a particular header will be built only once. It's similar to using a shared precompiled header file, but is much easier. @@ -134,7 +134,7 @@ Set project properties to share the header units from this project: 1. In the left-hand pane of the project property page, select **C/C++** > **General** ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** -1. Set the **Translate Includes to Imports** dropdown to **Yes**. This setting causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers and those listed in the `header-units.json` file. See [header-units.json](#header-unitsjson), below, for more details about this file. This setting ensures minimal symbols duplication in the header units and the best build throughput. +1. Set the **Translate Includes to Imports** dropdown to **Yes**. This setting causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers and those listed in the `header-units.json` file. For more details about this file, see [header-units.json](#header-unitsjson), below. This setting ensures minimal symbols duplication in the header units and the best build throughput. 1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. ## Reference the STL header unit project @@ -193,7 +193,7 @@ The following settings control the visibility of header units to the build syste ### Duplicate symbols -If you reference two or more projects that built two or more header units with the same name, or that built two or more header unit for the same header file, you'll get duplicate symbols. You can use the project properties **C/C++** > **Additional Header Unit Dependencies** to resolve collisions by specifying which header unit should be used. Otherwise, you won't be able to predict which one gets picked. +If you reference two or more projects that built two or more header units with the same name, or that built two or more header units for the same header file, you'll get duplicate symbols. You can use the project properties **C/C++** > **Additional Header Unit Dependencies** to resolve collisions by specifying which header unit should be used. Otherwise, you can't predict which one gets picked. To access these settings: 1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. @@ -202,14 +202,14 @@ To access these settings: ![Additional Header Unit Dependencies setting in the project properties dialog](media/additional-header-unit-dependencies-setting.png) > [!IMPORTANT] -> Ensure that projects that share header units are built with compatible compilation options. The compiler will issue warnings if it detects different compilation options used for how the header unit was produced versus how it is used. +> Ensure that projects that share header units are built with compatible compilation options. The compiler will issue warnings if it detects different compilation options used for how the header unit was produced versus how it's used. > [!NOTE] > To use header units built as a part of a **DLL** project, the project property setting **All Modules arePublic** should be set to **Yes**. ### `header-units.json` -Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults when `/TranslateInclude ` is specified to determine which STL headers can be compiled into header units. It is consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file is not on the list, it is treated as a normal `#include` instead of importing it as a header unit. +Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults when `/TranslateInclude ` is specified to determine which STL headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. The [header-units.json](header-unit-json-reference.md) file is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. From 0e77c5fdd0a64b7d315d624ccb39fdcb0477b6ba Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 31 Mar 2021 17:39:40 -0700 Subject: [PATCH 17/82] tech review feedback and command line switch topic updates --- docs/build/header-unit-json-reference.md | 10 +--- .../compiler-options-listed-alphabetically.md | 5 ++ .../compiler-options-listed-by-category.md | 9 +++ docs/build/reference/headername.md | 57 +++++++++++++++++++ docs/build/reference/headerunit.md | 35 ++++++++---- docs/build/reference/module-exportheader.md | 45 ++++++++------- docs/build/reference/module-reference.md | 33 ++++++----- docs/build/reference/sourcedependencies.md | 15 +++-- docs/build/reference/translateinclude.md | 21 ++++--- docs/build/toc.yml | 16 +++--- docs/build/walkthrough-header-units.md | 17 +++--- .../walkthrough-import-stl-header-units.md | 6 +- 12 files changed, 184 insertions(+), 85 deletions(-) create mode 100644 docs/build/reference/headername.md diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index 4e17ba56d59..9f78db873b4 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -8,15 +8,11 @@ helpviewer_keywords: ["header_units.json", "header unit"] # C++ header_units.json reference -The `header-units.json` file lists which header files can be compiled into header units. +The `header-units.json` file lists which header files in the directory it is located in can be automatically built by the build system as header units, and then be treated as `import` instead of `#include`. -Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` at compile time to determine its behavior. Using `#define` can't be used to change the behavior of a header unit, so `` shouldn't be compiled into a header unit because it wouldn't reflect this behavior. +Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` at compile time to determine its behavior. Using `#define` can't be used to change the behavior of a header unit, so `` shouldn't be compiled into a header unit because it wouldn't provide the expected behavior. -When the project build setting `Translate Includes to Imports (/translateInclude)` is on, the build system looks for `#include` files that can be compiled as header units. There's an allowlist for the Standard Template Library headers that the build system consults when `/TranslateInclude ` is specified to determine which Standard Template Library (STL) headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. - -The switch [`/sourceDependencies:directives`](./reference/sourcedependencies.md) specifies the JSON file, which lists which headers can be built as header units and which can't be. For example, you can see the C++ Standard Template Library (STL) `header-units.json` file located at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include` - -Set [`/translateInclude`](./reference/translateinclude.md) when you use the `/sourceDependencies:directives` option because the build system will then produce header units not only for the specified headers, but also for all headers that are included by those headers. This ensures minimal symbol duplication in the header units and best build throughput. For information about using this setting in Microsoft Visual Studio, see [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#set-project-properties). +When the project build setting `Translate Includes to Imports (/translateInclude)` is on, the build system looks for `#include` files that can be compiled as header units. For example, there's an allowlist for the Standard Template Library headers that the build system consults when `/TranslateInclude ` is specified to determine which Standard Template Library (STL) headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. ## Schema diff --git a/docs/build/reference/compiler-options-listed-alphabetically.md b/docs/build/reference/compiler-options-listed-alphabetically.md index 60c27b941f1..480534d9e73 100644 --- a/docs/build/reference/compiler-options-listed-alphabetically.md +++ b/docs/build/reference/compiler-options-listed-alphabetically.md @@ -34,6 +34,7 @@ This table contains an alphabetical list of compiler options. For a list of comp | [`/execution-charset`](execution-charset-set-execution-character-set.md) | Set the execution character set. | | [`/experimental:module`](experimental-module.md) | Enables experimental module support. | | [`/experimental:preprocessor`](experimental-preprocessor.md) | Deprecated. Enables experimental conforming preprocessor support. Use [`/Zc:preprocessor`](zc-preprocessor.md) | +| [`/exportHeader`](module-exportheader.md) Create the header units (*`.ifc`*) files specified by the input arguments. | | [`/F`](f-set-stack-size.md) | Sets stack size. | | [`/favor`](favor-optimize-for-architecture-specifics.md) | Produces code optimized for a specific x64 architecture. Or, for the specific micro-architectures in both the AMD64 and EM64T architectures. | | [`/FA`](fa-fa-listing-file.md) | Creates a listing file. | @@ -74,6 +75,8 @@ This table contains an alphabetical list of compiler options. For a list of comp | [`/GZ`](gz-enable-stack-frame-run-time-error-checking.md) | Deprecated. Same as [`/RTC1`](rtc-run-time-error-checks.md). | | [`/Gz`](gd-gr-gv-gz-calling-convention.md) | Uses the **`__stdcall`** calling convention (x86 only). | | [`/H`](h-restrict-length-of-external-names.md) | Deprecated. Restricts the length of external (public) names. | +| [`/headerName`](headername.md) | Build a header unit from the specified header. | +| [`/headerUnit`](headerunit.md) | Tells the compiler where to find the header unit file (`.ifc`) for the specified header. | | [`/HELP`](help-compiler-command-line-help.md) | Lists the compiler options. | | [`/homeparams`](homeparams-copy-register-parameters-to-stack.md) | Forces parameters passed in registers to be written to their locations on the stack upon function entry. This compiler option is only for the x64 compilers (native and cross compile). | | [`/hotpatch`](hotpatch-create-hotpatchable-image.md) | Creates a hot-patchable image. | @@ -114,6 +117,7 @@ This table contains an alphabetical list of compiler options. For a list of comp | [`/Qspectre-load`](qspectre-load.md) | Specifies compiler generation of serializing instructions to mitigate Spectre security vulnerabilities based on load instructions. | | [`/Qspectre-load-cf`](qspectre-load-cf.md) | Specifies compiler generation of serializing instructions to mitigate Spectre security vulnerabilities based on control flow instructions that load memory. | | [`/Qvec-report` (Auto-vectorizer reporting level)](qvec-report-auto-vectorizer-reporting-level.md) | Enables reporting levels for automatic vectorization. | +| [`/reference`](module-reference.md.md) | Use named module IFC. | | [`/RTC`](rtc-run-time-error-checks.md) | Enables run-time error checking. | | [`/sdl`](sdl-enable-additional-security-checks.md) | Enables additional security features and warnings. | | [`/showIncludes`](showincludes-list-include-files.md) | Displays a list of include files during compilation. | @@ -124,6 +128,7 @@ This table contains an alphabetical list of compiler options. For a list of comp | [`/TC`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies all source files are C. | | [`/Tp`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies a C++ source file. | | [`/TP`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies all source files are C++. | +| [`/translateInclude`](translateinclude.md) | Treat `#include` as `import`. | | [`/U`](u-u-undefine-symbols.md) | Removes a predefined macro. | | [`/u`](u-u-undefine-symbols.md) | Removes all predefined macros. | | [`/utf-8`](utf-8-set-source-and-executable-character-sets-to-utf-8.md) | Set source and execution character sets to UTF-8. | diff --git a/docs/build/reference/compiler-options-listed-by-category.md b/docs/build/reference/compiler-options-listed-by-category.md index fccd2139f6c..d5346ac0a1c 100644 --- a/docs/build/reference/compiler-options-listed-by-category.md +++ b/docs/build/reference/compiler-options-listed-by-category.md @@ -103,6 +103,15 @@ This article contains a categorical list of compiler options. For an alphabetica | [`/u`](u-u-undefine-symbols.md) | Removes all predefined macros. | | [`/X`](x-ignore-standard-include-paths.md) | Ignores the standard include directory. | +## Header units + +| [`/exportHeader`](module-exportheader.md) Create the header units (*`.ifc`*) files specified by the input arguments.| +| [`/headerUnit`](headerunit.md) | Tells the compiler where to find the header unit file (`.ifc`) for the specified header. | +| [`/headerName`](headername.md) | Build a header unit from the specified header. | +| [`/reference`](module-reference.md.md) | Use named module IFC. | +| [`/sourceDependencies:directives`](sourcedependencies.md) | Read a list of headers that can be converted to header units. | +| [`/translateInclude`](translateinclude.md) | Treat `#include` as `import`. | + ## Language | Option | Purpose | diff --git a/docs/build/reference/headername.md b/docs/build/reference/headername.md new file mode 100644 index 00000000000..e37b9f78567 --- /dev/null +++ b/docs/build/reference/headername.md @@ -0,0 +1,57 @@ +--- +title: "/headerName (Use header unit IFC)" +description: "Use the /headerName compiler option to establish a mapping between a header file and the header unit to build." +ms.date: 04/13/2021 +f1_keywords: ["/headerName"] +helpviewer_keywords: ["/headerName", "Use header unit IFC"] +--- +# `/headerName` (Build a header unit from the specified header) + +Build the specified header file into a header unit (*`.ifc`* file). + +## Syntax + +> **`/headerName:quote`** *`header-filename` +> **`/headerName:angle`** *`header-filename` + +### Arguments + +*`header-filename`*\ +The name of a header file that the compiler should compile into a header unit (an *`.ifc`* file). + +## Remarks + +The **`/headerName`** compiler option requires the [/std:c++latest](std-specify-language-standard-version.md) option. The **`/headerName`** compiler option is available starting in Visual Studio 2019 version 16.10 preview 2. + +**`/headerName:quote`** Lookup *`header-filename`* using the same rules as `#include "header-name"` and build it as a header unit (*`.ifc`* file). + +**`/headerName:angle`** Lookup *`header-filename`* using the same rules as `#include ` and build it as a header unit (*`.ifc`* file). + +### Examples + +Given a project that references a header file it defines called `m.h`, the compiler option to compile it into a header unit might look like this: + +```CMD +cl /std:c++latest /exportHeader /headerName:quote m.h /Fom.h.obj + +``` + +### To set this compiler option in the Visual Studio development environment + +> [!NOTE] +> This command line switch is typically set by the build system. + +1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). + +1. Set the **Configuration** drop-down to **All Configurations**. + +1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. + +1. Modify the **Additional Options** property to add the *`/headerName`* options and arguments. Then, choose **OK** or **Apply** to save your changes. + +## See also + +[`/exportHeader` (Create header units)](module-exportheader.md)\ +[`/headerUnit` (Create header units)](headerunit.md)\ +[`/reference` (Use named module IFC)](module-reference.md)\ +[`/translateInclude` (Translate include directives into import directives)](translateinclude.md) \ No newline at end of file diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index 381151823e0..e2fbaed5f67 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -1,29 +1,39 @@ --- title: "/headerUnit (Use header unit IFC)" -description: "Use the /headerUnit compiler option to specify an existing IFC header unit to import in the current compilation." +description: "Use the /headerUnit compiler option to associate a header file with the header unit to import in its place." ms.date: 04/13/2021 f1_keywords: ["/headerUnit"] helpviewer_keywords: ["/headerUnit", "Use header unit IFC"] --- # `/headerUnit` (Use header unit IFC) -Tells the compiler to translate `#include` directives for an importable header-name into an `import header-name;` directive, rather than use textual inclusion. +Tells the compiler where to find the *`.ifc`* file (the binary representation of the header unit) for the specified header. Used to import a header unit. ## Syntax > **`/headerUnit`** *`header-filename`*=*`ifc-filename`* +> **`/headerUnit:quote`** *`header-filename`*=*`ifc-filename`* +> **`/headerUnit:angle`** *`header-filename`*=*`ifc-filename`* ### Arguments *`header-filename`*\ -The name of a file that the compiler resolves a `header-name` to. During `import header-name ;` the compiler resolves `header-name` to a file on disk. Use *`header-filename`* to specify that file. Once matched, the compiler opens the corresponding IFC named by *`ifc-filename`* for import. +The name of a header file that the compiler resolves to a `ifc-filename` during import. During `import header-name;` the compiler resolves `header-name` to a file on disk. Use *`header-filename`* to specify that file. Once matched, the compiler opens the corresponding IFC named by *`ifc-filename`* for import. *`ifc-filename`*\ -The name of a file that contains prebuilt module information. To import more than one header unit, include a separate **`/headerUnit`** option for each file. +The name of a file that contains compiled header unit information. To import more than one header unit, include a separate **`/headerUnit`** option for each file. ## Remarks -The **`/headerUnit`** compiler option requires you enable experimental modules support by use of the [`/experimental:module`](experimental-module.md) compiler option, along with the [/std:c++latest](std-specify-language-standard-version.md) option. This option is available starting in Visual Studio 2019 version 16.8. +The **`/headerUnit`** compiler option requires the [/std:c++latest](std-specify-language-standard-version.md) option. The **`/headerUnit`** compiler option is available starting in Visual Studio 2019 version 16.10 preview 2. + +When the compiler encounters `import "file";` or `import `, this compiler switch helps the compiler find the compiled header unit (*`.ifc`*) for the specified header file. The path to this file can be expressed in three ways: + +**`/headerUnit`** looks up the compiled header unit in the current directory, or at the location specified in *`ifc-filename`*. + +**`/headerUnit:quote`** looks up the the compiled header unit file using the same rules as `#include "file"`. + +**`/headerUnit:angle`** looks up the the compiled header unit file using the same rules as `#include `. The compiler can't map a single *`header-name`* to multiple IFC files. While mapping multiple *`header-name`* arguments to a single IFC is possible, we don't recommend it. The contents of the IFC get imported as if it was only the header specified by *`header-name`*. @@ -34,16 +44,19 @@ Given a project that references two header files and their header units, listed | Header file | IFC file | |--|--| | *`C:\utils\util.h`* | *`C:\util.h.ifc`* | -| *`C:\app\app.h`* | *`C:\app.h.ifc`* | +| *`C:\app\app.h`* | *`C:\app\app.h.ifc`* | -The compiler options to reference the header units for these particular header files might look like this example: +The compiler options to reference the header units for these particular header files might look like this: ```CMD -cl ... /experimental:module /translateInclude /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit C:\app\app.h=C:\app.h.ifc +cl ... /std:c++latest /translateInclude /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit:quote app.h=app.h.ifc ``` ### To set this compiler option in the Visual Studio development environment +> [!NOTE] +> This command line switch is typically set by the build system. + 1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). 1. Set the **Configuration** drop-down to **All Configurations**. @@ -54,7 +67,7 @@ cl ... /experimental:module /translateInclude /headerUnit C:\utils\util.h=C:\uti ## See also -[`/experimental:module` (Enable module support)](experimental-module.md)\ -[`/module:exportHeader` (Create header units)](module-exportheader.md)\ -[`/module:reference` (Use named module IFC)](module-reference.md)\ +[`/exportHeader` (Create header units)](module-exportheader.md)\ +[`/headerName` (Create a header unit from the specified header)](headerunit.md)\ +[`/reference` (Use named module IFC)](module-reference.md)\ [`/translateInclude` (Translate include directives into import directives)](translateinclude.md) \ No newline at end of file diff --git a/docs/build/reference/module-exportheader.md b/docs/build/reference/module-exportheader.md index 3f94795279f..6f895bedfda 100644 --- a/docs/build/reference/module-exportheader.md +++ b/docs/build/reference/module-exportheader.md @@ -1,32 +1,35 @@ --- -title: "/module:exportHeader (Create header units)" -description: "Use the /module:exportHeader compiler option to create module header units for the header-name or include files specified." -ms.date: 09/13/2020 -f1_keywords: ["/module:exportHeader"] -helpviewer_keywords: ["/module:exportHeader", "Create header units"] +title: "/exportHeader (Create header units)" +description: "Use the /exportHeader compiler option to create module header units for the header-name or include files specified." +ms.date: 04/13/2020 +f1_keywords: ["/exportHeader"] +helpviewer_keywords: ["/exportHeader", "Create header units"] --- -# `/module:exportHeader` (Create header units) +# `/exportHeader` (Create header units) -Tells the compiler to create the header units specified by the input arguments. The compiler generates output in IFC (*`.ifc`*) files. +Tells the compiler to create the header units specified by the input arguments. The compiler generates header units as IFC (*`.ifc`*) files. ## Syntax -> **`/module:exportHeader`** *`header-name`* \[...]\ -> **`/module:exportHeader`** *`filename`* \[...] +> **`/exportHeader`** *`header-name`* \[...]\ +> **`/exportHeader`** *`filename`* \[...] +> **`/exportHeader /headerName:angle`** *`filename`* +> **`/exportHeader /headerName:quote`** *`filename`* + ### Arguments *`header-name`*\ -The header file to export. The *`header-name`* argument must take the same form as an argument to an `#include` directive. +The header file to export. Must take the same form as an argument to an `#include` directive. *`filename`*\ The relative or absolute path to the header file to create a header unit from. ## Remarks -The **`/module:exportHeader`** compiler option requires you enable experimental modules support by use of the [`/experimental:module`](experimental-module.md) compiler option, along with the [/std:c++latest](std-specify-language-standard-version.md) option. This option is available starting in Visual Studio 2019 version 16.8. +The **`/exportHeader`** compiler option requires you enable the [/std:c++latest](std-specify-language-standard-version.md) option. **`/exportHeader`** is available starting in Visual Studio 2019 version 16.10 Preview 2. -One **`/module:exportHeader`** compiler option can specify as many header-name arguments as your build requires. You don't need to specify them separately. +One **`/exportHeader`** compiler option can specify as many header-name arguments as your build requires. You don't need to specify them separately. By default, the compiler doesn't produce an object file when a header unit is compiled. To produce an object file, specify the **`/Fo`** compiler option. For more information, see [`/Fo` (Object File Name)](fo-object-file-name.md). @@ -35,48 +38,50 @@ The compiler resolves a *`header-name`* based on the include directory search or The argument *`header-name`* must be specified the same way it would appear in source. The argument is sensitive to quoting rules and to `<` and `>` operators on the command line. The properly escaped command to build a header unit such as `` using the VS2019 command prompt might look like: ```cmd -cl ... /experimental:module /module:exportHeader "" +cl ... /std:c++latest /exportHeader "" ``` Building a local project header such as `"utils/util.h"` might look like: ```cmd -cl ... /experimental:module /module:exportHeader """util/util.h""" +cl ... /std:c++latest /exportHeader """util/util.h""" ``` The quoting rules in other command-line processors may differ. -When using the *`header-name`* form of **`/module:exportHeader`**, you may find it's helpful to use the complementary option **`/module:showResolvedHeader`**. The **`/module:showResolvedHeader`** option prints an absolute path to the file the *`header-name`* argument resolves to. +When using the *`header-name`* form of **`/exportHeader`**, you may find it's helpful to use the complementary option **`/module:showResolvedHeader`**. The **`/module:showResolvedHeader`** option prints an absolute path to the file the *`header-name`* argument resolves to. -**`/module:exportHeader`** can handle multiple inputs at once even under **`/MP`**. We recommended you use **`/module:output `** to create a separate IFC file for each compilation. +**`/exportHeader`** can handle multiple inputs at once even under **`/MP`**. We recommended you use **`/module:output `** to create a separate IFC file for each compilation. ### Examples Given headers `"C:\util\util.h"` and `"C:\app\app.h"`, you can export them as *`header-name`* arguments by using this command: ```cmd -cl /IC:\ /experimental:module /module:exportHeader """util/util.h""" """app/app.h""" /FoC:\obj +cl /std:c++latest /IC:\ /exportHeader """util/util.h""" """app/app.h""" /FoC:\obj ``` You can export them as *`filename`* arguments by using this command: ```cmd -cl /IC:\ /experimental:module /module:exportHeader C:\util\util.h C:\app\app.h /FoC:\obj +cl /std:c++latest /IC:\ /exportHeader C:\util\util.h C:\app\app.h /FoC:\obj ``` ### To set this compiler option in the Visual Studio development environment +> [!NOTE] +> This command line switch is typically set by the build system. + 1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). 1. Set the **Configuration** drop-down to **All Configurations**. 1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. -1. Modify the **Additional Options** property to add the *`/module:exportHeader`* option and any arguments. Then, choose **OK** or **Apply** to save your changes. +1. Modify the **Additional Options** property to add the *`/exportHeader`* option and any arguments. Then, choose **OK** or **Apply** to save your changes. ## See also -[`/experimental:module` (Enable module support)](experimental-module.md)\ [`/headerUnit` (Use header unit IFC)](headerunit.md)\ [`/module:reference` (Use named module IFC)](module-reference.md)\ [`/translateInclude` (Translate include directives into import directives)](translateinclude.md) diff --git a/docs/build/reference/module-reference.md b/docs/build/reference/module-reference.md index 347c85d52d0..9f8bb1f6f87 100644 --- a/docs/build/reference/module-reference.md +++ b/docs/build/reference/module-reference.md @@ -1,32 +1,32 @@ --- -title: "/module:reference (Use named module IFC)" -description: "Use the /module:reference compiler option to create module header units for the header-name or include files specified." -ms.date: 09/13/2020 -f1_keywords: ["/module:reference"] -helpviewer_keywords: ["/module:reference", "Use named module IFC"] +title: "/reference (Use named module IFC)" +description: "Use the /reference compiler option to create module header units for the header-name or include files specified." +ms.date: 04/13/2020 +f1_keywords: ["/reference"] +helpviewer_keywords: ["/reference", "Use named module IFC"] --- -# `/module:reference` (Use named module IFC) +# `/reference` (Use named module IFC) Tells the compiler to use an existing IFC (*`.ifc`*) for the current compilation. ## Syntax -> **`/module:reference`** *`module-name=filename`*\ -> **`/module:reference`** *`filename`* +> **`/reference`** *`module-name=filename`*\ +> **`/reference`** *`filename`* ### Arguments *`filename`*\ -The name of a file that contains *IFC data*, prebuilt module information. To import more than one module, include a separate **`/module:reference`** option for each file. +The name of a file that contains *IFC data*, prebuilt module information. To import more than one module, include a separate **`/reference`** option for each file. *`module-name`*\ A valid name of an exported primary module interface unit name or full module partition name. ## Remarks -The **`/module:reference`** compiler option requires you enable experimental modules support by use of the [`/experimental:module`](experimental-module.md) compiler option, along with the [/std:c++latest](std-specify-language-standard-version.md) option. This option is available starting in Visual Studio 2019 version 16.8. +The **`/reference`** compiler option requires you enable experimental modules support by use of the [`/experimental:module`](experimental-module.md) compiler option, along with the [/std:c++latest](std-specify-language-standard-version.md) option. This option is available starting in Visual Studio 2019 version 16.10 Preview 2. -If the **`/module:reference`** argument is a *`filename`* without a *`module-name`*, the file gets opened at runtime to verify the *`filename`* argument names a specific import. It can result in slower runtime performance in scenarios that have many **`/module:reference`** arguments. +If the **`/reference`** argument is a *`filename`* without a *`module-name`*, the file gets opened at runtime to verify the *`filename`* argument names a specific import. It can result in slower runtime performance in scenarios that have many **`/reference`** arguments. The *`module-name`* must be a valid primary module interface unit name or full module partition name. Examples of primary module interface names include: @@ -45,7 +45,7 @@ Examples of full module partition names include: If a module reference is created using a *`module-name`*, other modules on the command line don't get searched if the compiler encounters an import of that name. For example, given this command line: ```cmd -cl ... /experimental:module /module:reference m.ifc /module:reference m=n.ifc +cl ... /std:c++latest /experimental:module /reference m.ifc /reference m=n.ifc ``` In the case above, if the compiler sees `import m;` then *`m.ifc`* doesn't get searched. @@ -63,24 +63,27 @@ Given three modules as listed in this table: The reference options using a *`filename`* argument could look like: ```cmd -cl ... /experimental:module /module:reference m.ifc /module:reference m-part.ifc /module:reference Networking.ifc +cl ... /std:c++latest /experimental:module /reference m.ifc /reference m-part.ifc /reference Networking.ifc ``` The reference options using *`module-name=filename`* could look like: ```cmd -cl ... /experimental:module /module:reference m=m.ifc /module:reference M:Part1=m-part.ifc /module:reference Core.Networking=Networking.ifc +cl ... /std:c++latest /experimental:module /reference m=m.ifc /reference M:Part1=m-part.ifc /reference Core.Networking=Networking.ifc ``` ### To set this compiler option in the Visual Studio development environment +> [!NOTE] +> This command line switch is typically set by the build system. + 1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). 1. Set the **Configuration** drop-down to **All Configurations**. 1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. -1. Modify the **Additional Options** property to add the *`/module:reference`* option and its arguments. Then, choose **OK** or **Apply** to save your changes. +1. Modify the **Additional Options** property to add the *`/reference`* option and its arguments. Then, choose **OK** or **Apply** to save your changes. ## See also diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index 22bbdc662e0..ed98d5aba5d 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -7,9 +7,11 @@ helpviewer_keywords: ["/sourceDependencies compiler option", "/sourceDependencie --- # `/sourceDependencies` (Report source-level dependencies) -Instructs the compiler to generate a JSON file that details the source-level dependencies consumed during compilation. +This command-line option comes in two forms: -The JSON file contains a list of the source dependencies, which include: +- `/sourceDependencies:directives` is used in conjunction with `/translateIncludes` to specify a JSON file that contains an allow list of header files that can be allowed to be compiled into header units. + +The `/sourceDependencies` form generate a JSON file that details the source-level dependencies consumed during compilation. The JSON file contains a list of the source dependencies, which include: - Header files (both transitive and directly included headers). - The PCH used (if **`/Yu`** is specified). @@ -25,7 +27,7 @@ The JSON file contains a list of the source dependencies, which include: *filename*\ The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path.\ -In the `/sourceDependencies:directives` case, this refers to a JSON file that lists which header files can be compiled into a header unit. See [C++ header_units.json reference](..\header-unit-json-reference.md) for an example. +In the `/sourceDependencies:directives` case, *filename* refers to a JSON file that lists which header files can be compiled into a header unit. See [C++ header_units.json reference](..\header-unit-json-reference.md) for an example. *directory*\ If the argument is a directory, the compiler generates source dependency files in the specified directory. The output file name is based on the full name of the input file, with an appended *`.json`* extension. For example, if the file provided to the compiler is *`main.cpp`*, the generated output filename is *`main.cpp.json`*. @@ -33,6 +35,9 @@ If the argument is a directory, the compiler generates source dependency files i ## Remarks The **`/sourceDependencies`** compiler option is available starting in Visual Studio 2019 version 16.7. It's not enabled by default. +The **`/sourceDependencies:directives`** compiler option is available starting in Visual Studio 2019 version 16.10 Preview 2. It's not enabled by default. + +The `/sourceDependencies:directives` form refers to a JSON file that is used as allow list used in conjunction with the build system's **Scan Sources for Module Dependencies**`to determine which header files can be compiled into a header unit. When this switch is specified, header files encountered in the scanned source files, that are also listed in the specified JSON file, are compiled into header units. Files not in the list aren't compiled to header units and instead are treated as a normal `#include`. When you specify the **`/MP`** compiler option, we recommend you use **`/sourceDependencies`** with a directory argument. If you provide a single filename argument, two instances of the compiler may attempt to open the output file simultaneously and cause an error. For more information on **`/MP`**, see [`/MP` (Build with multiple processes)](mp-build-with-multiple-processes.md). @@ -40,7 +45,6 @@ When a non-fatal compiler error occurs, the dependency information still gets wr All file paths appear as absolute paths in the output. - ### Examples Given the following sample code: @@ -81,6 +85,9 @@ We've used `...` to abbreviate the reported paths; the report contains the absol ### To set the /sourceDependencies compiler option in Visual Studio +> [!NOTE] +> This command line switch is typically set by the build system. + 1. Open the **Property Pages** dialog box for the project. For more information, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). 1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. diff --git a/docs/build/reference/translateinclude.md b/docs/build/reference/translateinclude.md index 2b187744ec9..ba860690513 100644 --- a/docs/build/reference/translateinclude.md +++ b/docs/build/reference/translateinclude.md @@ -1,13 +1,13 @@ --- title: "/translateInclude (Translate include directives into import directives)" -description: "Use the /translateInclude compiler option to translate #include directives for an importable header-name into an import header-name directive." -ms.date: 09/13/2020 +description: "Use the /translateInclude compiler option to treat #include directives as import statements when an importable header unit is available." +ms.date: 4/13/2021 f1_keywords: ["/translateInclude"] helpviewer_keywords: ["/translateInclude", "Translate include directives into import directives"] --- # `/translateInclude` (Translate include directives into import directives) -Tells the compiler to translate `#include` directives for an importable header-name into an `import header-name;` directive, rather than use textual inclusion. +Instructs the compiler to treat `#include` as `import` for headers that have been prebuilt into a header unit (`.ifc`) file. ## Syntax @@ -15,7 +15,7 @@ Tells the compiler to translate `#include` directives for an importable header-n ## Remarks -The **`/translateInclude`** compiler option requires you enable experimental modules support by use of the [`/experimental:module`](experimental-module.md) compiler option, along with the [/std:c++latest](std-specify-language-standard-version.md) option. This option is available starting in Visual Studio 2019 version 16.8. +The **`/translateInclude`** compiler option requires you enable the [/std:c++latest](std-specify-language-standard-version.md) option. `/translateInclude` is available starting in Visual Studio 2019 version 16.10 Preview 2. The **`/translateInclude`** option effectively makes the following transformation, where the example `` is an importable header unit: @@ -26,10 +26,10 @@ The **`/translateInclude`** option effectively makes the following transformatio The compiler replaces this directive with: ```cpp -import ; +import ; ``` -In MSVC an importable header unit is one named by a **`/headerUnit`** reference. For more information, see [`/headerUnit` (Use header unit IFC)](headerunit.md). +In MSVC, available header units are made available by the **`/headerUnit`** option which maps a header file to its importable header unit. For more information, see [`/headerUnit` (Use header unit IFC)](headerunit.md). ### Examples @@ -49,10 +49,10 @@ And a source *`.cpp`* file that includes the headers, int main() { } ``` -The **`/translateInclude`** option allows the compiler to import the header units instead of compile the headers again. Here's an example command line that translates the include directives for *`util.h`* and *`app.h`* into imports of the header units instead: +The **`/translateInclude`** option allows the compiler to import the header units instead of compiling the headers again. Here's an example command line that translates the include directives for *`util.h`* and *`app.h`* into imports of the header units instead: ```CMD -cl /IC:\ /experimental:module /translateInclude /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit C:\app\app.h=C:\app.h.ifc +cl /IC:\ /translateInclude /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit C:\app\app.h=C:\app.h.ifc ``` ### To set this compiler option in the Visual Studio development environment @@ -67,7 +67,6 @@ cl /IC:\ /experimental:module /translateInclude /headerUnit C:\utils\util.h=C:\u ## See also -[`/experimental:module` (Enable module support)](experimental-module.md)\ [`/headerUnit` (Use header unit IFC)](headerunit.md).\ -[`/module:exportHeader` (Create header units)](module-exportheader.md)\ -[`/module:reference` (Use named module IFC)](module-reference.md) +[`/exportHeader` (Create header units)](module-exportheader.md)\ +[`/reference` (Use named module IFC)](module-reference.md) diff --git a/docs/build/toc.yml b/docs/build/toc.yml index ffebfdf1dac..c3269d2a32a 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -48,8 +48,6 @@ href: ../build/tasks-vs-json-schema-reference-cpp.md - name: Launch.vs.json schema reference (C++) href: ../build/launch-vs-schema-reference-cpp.md - - name: header-unit-json schema reference (C++) - href: ../build/header-unit-json-reference.md - name: CMake projects expanded: false items: @@ -86,13 +84,15 @@ href: ../build/vcpkg-command-line-reference.md - name: "C++ Build Insights" href: ../build-insights/get-started-with-cpp-build-insights.md -- name: "Build C++ header units for STL and other headers" +- name: "Build and import header units" expanded: false items: - name: "Walkthrough: Build and import header units in Visual C++ projects" href: ../build/walkthrough-header-units.md - name: "Walkthrough: Import STL libraries as header units" href: ../build/walkthrough-import-stl-header-units.md + - name: header-unit-json schema reference (C++) + href: ../build/header-unit-json-reference.md - name: Precompiled header files href: ../build/creating-precompiled-header-files.md - name: C++ release builds @@ -611,6 +611,8 @@ href: ../build/reference/gz-enable-stack-frame-run-time-error-checking.md - name: /H (Restrict length of external names) href: ../build/reference/h-restrict-length-of-external-names.md + - name: /headerName (Build a header unit from the specified header) + href: ../build/reference/headername.md - name: /headerUnit (Use header unit IFC) href: ../build/reference/headerunit.md - name: /HELP (Compiler command-line help) @@ -633,10 +635,10 @@ href: ../build/reference/ln-create-msil-module.md - name: /MD, /MT, /LD (Use Run-time library) href: ../build/reference/md-mt-ld-use-run-time-library.md - - name: /module:exportHeader (Create header units) - href: ../build/reference/module-exportheader.md - - name: /module:reference (Use named module IFC) - href: ../build/reference/module-reference.md + - name: /exportHeader (Create header units) + href: ../build/reference/exportheader.md + - name: /reference (Use named module IFC) + href: ../build/reference/reference.md - name: /MP (Build with multiple processes) href: ../build/reference/mp-build-with-multiple-processes.md - name: /nologo (Suppress startup banner) (C/C++) diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index ebf200e6417..9e42af8a484 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -10,7 +10,7 @@ helpviewer_keywords: ["import", "header unit", "ifc", "stl"] This article is about building and importing header units using Visual Studio 2019. See [Walkthrough: Import STL libraries using header units](walkthrough-import-stl-header-units.md) to learn specifically how to import Standard Template Library headers as header units. -Header units are the recommended alternative to [precompiled header files](creating-precompiled-header-files.md). They're easier to set up and easier to use than a [shared PCH](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. +Header units are the recommended alternative to [precompiled header files](creating-precompiled-header-files.md) (PCH). They're easier to set up and easier to use than a [shared PCH](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. ## Prerequisites @@ -18,21 +18,22 @@ Support for header units requires at least Visual Studio 2019 16.10.0 Preview 2. ## What is a header unit -Header units are a binary representation of a header file, and end with an `.ifc` extension. This is also the format used to store named modules. +Header units are a binary representation of a header file, and end with an *`.ifc`* extension. This is also the format used to store named modules. -Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, everything in a header unit (including macro definitions) are visible, while those in a module aren't. Another difference is that header units aren't affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally turn on and off functionality the way you can with a header file. +One important difference between a header unit and a header file is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to behave differently when you import it the way you can with a header file. Everything visible from a header file is also visible from a header unit. -Header units are defined by the C++ standard, and can be used cross-platform. +Before you can import a header unit, a header file must be compiled into a header unit. An advantage of header units (*`.ifc`* files) over a PCH is that it can be used in distributed builds. For example, as long as you are using the same compiler to compile the *`.ifc`* and the program that imports it, and are targeting the same platform and architecture, a header unit produced on one machine can be used on another. -Before you can import a header unit, a header file must be compiled into a header unit. Header units are independent of the machine they're built on. One machine could produce IFCs and another machine consume them. A PCH can't do that because the persisted data structures are largely tied to the memory layout of the machine where they're compiled. - -Ideally, you should use the same compiler flags to compile a header unit and the program that imports it. Flags, like `/EHsc`, `/MD[d]`, and others, have an impact on the semantics of the program that are captured in a header unit. +Another advantage of header units over a PCH is that there is more flexibility when it comes to the compiler flags used to compile the header unit and the program that imports it. With a PCH, more compiler flags must be the same. But with header units, the primary flags that should be the same include: + - Exception handling switches such as `/EHsc` + - `/MD[d]` or `MT[d]` + - `/D` You can define additional macros when building the program that imports the header unit, but those used to build the header unit should also be present and defined the same way when building the program that imports the header unit. ## Ways to compile a header unit There are several ways to compile a file into a header unit: --Automatically scan for header units: This approach is best suited to smaller projects that include many different header files. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it's better suited to smaller projects, or for those where build time isn't a crucial consideration, is because it takes extra time for the build system to scan all of the files to find what should be built into header units. +-Automatically scan for header units: This approach is best suited to smaller projects that include many different header files. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it's better suited to smaller projects, or for those where build time isn't a crucial consideration, is because it takes extra time for the build system to scan all of the files to find what should be built into header units. This scanning can be done at the project level for all source files, or at the individual file level. -Build a shared header units project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library (or libraries) that contain the header units that you want, and then reference it from the projects that then import the header units they need. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index f383436e788..fd59fb03222 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -15,7 +15,9 @@ The [second way](#approach2) demonstrates how to build a static library containi Importing a STL header as a header unit is a simpler alternative to [precompiled header files](creating-precompiled-header-files.md). Header units are easier to set up and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. -Before you can import an STL header, it must be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. Header units provide a "module-like" experience for header files even though they lack the level of isolation provided by named modules. For example, macros in a header unit are visible, while those in a module aren't. Another difference is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to conditionally compile the way you can with a header file. +Before you can import an STL header, it must be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. + +One important difference between a header unit and a header file is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to behave differently when you import it the way you can with a header file. Everything visible from a header file is also visible from a header unit. ## Prerequisites @@ -79,7 +81,7 @@ Follow these steps to set the options that cause the build system to scan for he ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Ensure that the **Configuration** dropdown is set to **All Configurations** 1. In the left-hand pane of the project property page, select **C/C++** > **General** -1. Set **Scan Sources for Module Dependencies** to **Yes** +1. Set **Scan Sources for Module Dependencies** to **Yes** Because we are setting the project property, all sources in this project will be scanned. This could be set at the file level, but here we scan the entire project. 1. Set **Translate Includes to Imports** to **Yes** Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: From e0aa5b9e0d3c9812dda70c837dddfbf97288f2be Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 31 Mar 2021 17:48:27 -0700 Subject: [PATCH 18/82] fix links --- .../build/reference/compiler-options-listed-alphabetically.md | 2 +- docs/build/reference/compiler-options-listed-by-category.md | 2 +- docs/build/toc.yml | 4 ++-- docs/build/walkthrough-header-units.md | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/build/reference/compiler-options-listed-alphabetically.md b/docs/build/reference/compiler-options-listed-alphabetically.md index 480534d9e73..6af08920600 100644 --- a/docs/build/reference/compiler-options-listed-alphabetically.md +++ b/docs/build/reference/compiler-options-listed-alphabetically.md @@ -117,7 +117,7 @@ This table contains an alphabetical list of compiler options. For a list of comp | [`/Qspectre-load`](qspectre-load.md) | Specifies compiler generation of serializing instructions to mitigate Spectre security vulnerabilities based on load instructions. | | [`/Qspectre-load-cf`](qspectre-load-cf.md) | Specifies compiler generation of serializing instructions to mitigate Spectre security vulnerabilities based on control flow instructions that load memory. | | [`/Qvec-report` (Auto-vectorizer reporting level)](qvec-report-auto-vectorizer-reporting-level.md) | Enables reporting levels for automatic vectorization. | -| [`/reference`](module-reference.md.md) | Use named module IFC. | +| [`/reference`](module-reference.md) | Use named module IFC. | | [`/RTC`](rtc-run-time-error-checks.md) | Enables run-time error checking. | | [`/sdl`](sdl-enable-additional-security-checks.md) | Enables additional security features and warnings. | | [`/showIncludes`](showincludes-list-include-files.md) | Displays a list of include files during compilation. | diff --git a/docs/build/reference/compiler-options-listed-by-category.md b/docs/build/reference/compiler-options-listed-by-category.md index d5346ac0a1c..62f68f87d90 100644 --- a/docs/build/reference/compiler-options-listed-by-category.md +++ b/docs/build/reference/compiler-options-listed-by-category.md @@ -108,7 +108,7 @@ This article contains a categorical list of compiler options. For an alphabetica | [`/exportHeader`](module-exportheader.md) Create the header units (*`.ifc`*) files specified by the input arguments.| | [`/headerUnit`](headerunit.md) | Tells the compiler where to find the header unit file (`.ifc`) for the specified header. | | [`/headerName`](headername.md) | Build a header unit from the specified header. | -| [`/reference`](module-reference.md.md) | Use named module IFC. | +| [`/reference`](module-reference.md) | Use named module IFC. | | [`/sourceDependencies:directives`](sourcedependencies.md) | Read a list of headers that can be converted to header units. | | [`/translateInclude`](translateinclude.md) | Treat `#include` as `import`. | diff --git a/docs/build/toc.yml b/docs/build/toc.yml index c3269d2a32a..f02c568b6cc 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -636,9 +636,9 @@ - name: /MD, /MT, /LD (Use Run-time library) href: ../build/reference/md-mt-ld-use-run-time-library.md - name: /exportHeader (Create header units) - href: ../build/reference/exportheader.md + href: ../build/reference/module-exportheader.md - name: /reference (Use named module IFC) - href: ../build/reference/reference.md + href: ../build/reference/module-reference.md - name: /MP (Build with multiple processes) href: ../build/reference/mp-build-with-multiple-processes.md - name: /nologo (Suppress startup banner) (C/C++) diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 9e42af8a484..b5312d2eea5 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -22,9 +22,9 @@ Header units are a binary representation of a header file, and end with an *`.if One important difference between a header unit and a header file is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to behave differently when you import it the way you can with a header file. Everything visible from a header file is also visible from a header unit. -Before you can import a header unit, a header file must be compiled into a header unit. An advantage of header units (*`.ifc`* files) over a PCH is that it can be used in distributed builds. For example, as long as you are using the same compiler to compile the *`.ifc`* and the program that imports it, and are targeting the same platform and architecture, a header unit produced on one machine can be used on another. +Before you can import a header unit, a header file must be compiled into a header unit. An advantage of header units (*`.ifc`* files) over a PCH is that it can be used in distributed builds. For example, as long as you're using the same compiler to compile the *`.ifc`* and the program that imports it, and are targeting the same platform and architecture, a header unit produced on one machine can be used on another. -Another advantage of header units over a PCH is that there is more flexibility when it comes to the compiler flags used to compile the header unit and the program that imports it. With a PCH, more compiler flags must be the same. But with header units, the primary flags that should be the same include: +Another advantage of header units over a PCH is that there's more flexibility when it comes to the compiler flags used to compile the header unit and the program that imports it. With a PCH, more compiler flags must be the same. But with header units, the primary flags that should be the same include: - Exception handling switches such as `/EHsc` - `/MD[d]` or `MT[d]` - `/D` You can define additional macros when building the program that imports the header unit, but those used to build the header unit should also be present and defined the same way when building the program that imports the header unit. From d95c064175b62c17b3f7454d555322db883c9446 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 31 Mar 2021 17:52:02 -0700 Subject: [PATCH 19/82] fix table --- docs/build/reference/compiler-options-listed-by-category.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/reference/compiler-options-listed-by-category.md b/docs/build/reference/compiler-options-listed-by-category.md index 62f68f87d90..f5fb38e2f4a 100644 --- a/docs/build/reference/compiler-options-listed-by-category.md +++ b/docs/build/reference/compiler-options-listed-by-category.md @@ -105,8 +105,8 @@ This article contains a categorical list of compiler options. For an alphabetica ## Header units -| [`/exportHeader`](module-exportheader.md) Create the header units (*`.ifc`*) files specified by the input arguments.| -| [`/headerUnit`](headerunit.md) | Tells the compiler where to find the header unit file (`.ifc`) for the specified header. | +| [`/exportHeader`](module-exportheader.md) | Create the header units (*`.ifc`*) files specified by the input arguments. | +| [`/headerUnit`](headerunit.md) | Indicate where to find the header unit file (`.ifc`) for the specified header. | | [`/headerName`](headername.md) | Build a header unit from the specified header. | | [`/reference`](module-reference.md) | Use named module IFC. | | [`/sourceDependencies:directives`](sourcedependencies.md) | Read a list of headers that can be converted to header units. | From e95585a4469974eca2b51e3184e8b22ed03b0078 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 31 Mar 2021 17:56:49 -0700 Subject: [PATCH 20/82] fix table --- docs/build/reference/compiler-options-listed-by-category.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/build/reference/compiler-options-listed-by-category.md b/docs/build/reference/compiler-options-listed-by-category.md index f5fb38e2f4a..6e4afd43250 100644 --- a/docs/build/reference/compiler-options-listed-by-category.md +++ b/docs/build/reference/compiler-options-listed-by-category.md @@ -105,6 +105,8 @@ This article contains a categorical list of compiler options. For an alphabetica ## Header units +| Option | Purpose | +|--|--| | [`/exportHeader`](module-exportheader.md) | Create the header units (*`.ifc`*) files specified by the input arguments. | | [`/headerUnit`](headerunit.md) | Indicate where to find the header unit file (`.ifc`) for the specified header. | | [`/headerName`](headername.md) | Build a header unit from the specified header. | From c3b20da6784a908856c19e4bb68030b84a9dd3e4 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 1 Apr 2021 13:07:07 -0700 Subject: [PATCH 21/82] tech review --- docs/build/header-unit-json-reference.md | 21 +++++++++++-------- docs/build/reference/headername.md | 2 +- docs/build/reference/headerunit.md | 2 +- docs/build/reference/module-exportheader.md | 2 +- docs/build/reference/sourcedependencies.md | 4 ++-- docs/build/walkthrough-header-units.md | 2 +- .../walkthrough-import-stl-header-units.md | 14 ++++++------- 7 files changed, 25 insertions(+), 22 deletions(-) diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index 9f78db873b4..1eded41a549 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -1,22 +1,25 @@ --- -description: "Reference for header_units.json file" +description: "Reference for header-units.json file" title: "C++ header unit.json reference" ms.date: "4/13/2021" -f1_keywords: ["header_units.json"] -helpviewer_keywords: ["header_units.json", "header unit"] +f1_keywords: ["header-units.json"] +helpviewer_keywords: ["header-units.json", "header unit"] --- -# C++ header_units.json reference +# C++ header-units.json reference -The `header-units.json` file lists which header files in the directory it is located in can be automatically built by the build system as header units, and then be treated as `import` instead of `#include`. +The `header-units.json` file lists which header files in the directory it is located in can be automatically built by the build system as header units, and then treated as an `import` instead of an `#include`. Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` at compile time to determine its behavior. Using `#define` can't be used to change the behavior of a header unit, so `` shouldn't be compiled into a header unit because it wouldn't provide the expected behavior. -When the project build setting `Translate Includes to Imports (/translateInclude)` is on, the build system looks for `#include` files that can be compiled as header units. For example, there's an allowlist for the Standard Template Library headers that the build system consults when `/TranslateInclude ` is specified to determine which Standard Template Library (STL) headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. +When the command-line switch [`/translateInclude` (Translate include directives into import directives)](translateinclude.md) is provided, the build system looks for `#include` files that can be compiled as header units. For example, there's an allowlist for the Standard Template Library headers that the build system consults when `/translateInclude ` is specified to determine which Standard Template Library (STL) headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. ## Schema -The format of the `header_units.json` file starts with the schema version, followed by an array of filenames for headers that can be built into header units. For example: +The format of the `header-units.json` file starts with the schema version, followed by an array of filenames for headers that can be built into header units. + +The schema also supports comments, as shown below: +For example: ```json { @@ -37,9 +40,9 @@ The format of the `header_units.json` file starts with the schema version, follo ## Search rules -The build system looks for this file on the include path. +The build system looks for this file in the same directory as the header file. If your library is organized into subdirectories, each subdirectory will need it's own `header-units.json` file. ## See also [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md)\ -[Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1)\ \ No newline at end of file +[Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) \ No newline at end of file diff --git a/docs/build/reference/headername.md b/docs/build/reference/headername.md index e37b9f78567..bc0d26b6a04 100644 --- a/docs/build/reference/headername.md +++ b/docs/build/reference/headername.md @@ -1,5 +1,5 @@ --- -title: "/headerName (Use header unit IFC)" +title: "/headerName (Build a header unit from the specified header)" description: "Use the /headerName compiler option to establish a mapping between a header file and the header unit to build." ms.date: 04/13/2021 f1_keywords: ["/headerName"] diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index e2fbaed5f67..a2f1b49466a 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -68,6 +68,6 @@ cl ... /std:c++latest /translateInclude /headerUnit C:\utils\util.h=C:\util.h.if ## See also [`/exportHeader` (Create header units)](module-exportheader.md)\ -[`/headerName` (Create a header unit from the specified header)](headerunit.md)\ +[`/headerName` (Create a header unit from the specified header)](headername.md)\ [`/reference` (Use named module IFC)](module-reference.md)\ [`/translateInclude` (Translate include directives into import directives)](translateinclude.md) \ No newline at end of file diff --git a/docs/build/reference/module-exportheader.md b/docs/build/reference/module-exportheader.md index 6f895bedfda..e3081425d6c 100644 --- a/docs/build/reference/module-exportheader.md +++ b/docs/build/reference/module-exportheader.md @@ -83,5 +83,5 @@ cl /std:c++latest /IC:\ /exportHeader C:\util\util.h C:\app\app.h /FoC:\obj ## See also [`/headerUnit` (Use header unit IFC)](headerunit.md)\ -[`/module:reference` (Use named module IFC)](module-reference.md)\ +[`/reference` (Use named module IFC)](module-reference.md)\ [`/translateInclude` (Translate include directives into import directives)](translateinclude.md) diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index ed98d5aba5d..c2cbad2f289 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -9,7 +9,7 @@ helpviewer_keywords: ["/sourceDependencies compiler option", "/sourceDependencie This command-line option comes in two forms: -- `/sourceDependencies:directives` is used in conjunction with `/translateIncludes` to specify a JSON file that contains an allow list of header files that can be allowed to be compiled into header units. +- `/sourceDependencies:directives` is used in conjunction with `/translateInclude` to specify a JSON file that contains an allow list of header files that can be allowed to be compiled into header units. The `/sourceDependencies` form generate a JSON file that details the source-level dependencies consumed during compilation. The JSON file contains a list of the source dependencies, which include: @@ -27,7 +27,7 @@ The `/sourceDependencies` form generate a JSON file that details the source-leve *filename*\ The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path.\ -In the `/sourceDependencies:directives` case, *filename* refers to a JSON file that lists which header files can be compiled into a header unit. See [C++ header_units.json reference](..\header-unit-json-reference.md) for an example. +In the `/sourceDependencies:directives` case, *filename* refers to a JSON file that lists which header files can be compiled into a header unit. See [C++ header-units.json reference](..\header-unit-json-reference.md) for an example. *directory*\ If the argument is a directory, the compiler generates source dependency files in the specified directory. The output file name is based on the full name of the input file, with an appended *`.json`* extension. For example, if the file provided to the compiler is *`main.cpp`*, the generated output filename is *`main.cpp.json`*. diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index b5312d2eea5..b23225cde84 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -87,7 +87,7 @@ For source files (or header files that don't have a `.h` or `.hpp` extension): ### Change your code to import a header unit -In the source file for the example project, the file that contains `main()`, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). When you're compiling a header unit from a system header, use angle brackets (`#include ;`). If it's a project header, use `import "file";` +In the source file for the example project, the file that contains `main()`, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). When you're compiling a header unit from a system header, use angle brackets (`#import ;`). If it's a project header, use `import "file";` Build the solution (**Build** > **Build Solution** from the main menu, or press `F6`) and run it to see that it produces the expected output: `Pythagorean triple a:2 b:3 c:13` diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index fd59fb03222..9a9eb9f9ab4 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -35,11 +35,11 @@ It may not be the optimal approach for larger projects because it can be time co See [Approach 1: Scan for headers](#approach1), in this article, for a walkthrough of this approach. -**Create a shared library** +**Create a static library** -The recommended approach, particularly for larger projects, or in cases where you want to share a common set of header units across multiple projects, is to create a shared library containing header units you want to use. This library is then shared with projects that import those header units. It's like using [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but easier. +The recommended approach, particularly for larger projects, or in cases where you want to share a common set of header units across multiple projects, is to create a static library containing the header units you want to use. This library is then shared with projects that import those header units. It's like using [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but easier. -See [Approach 2: Build a shared library](#approach2), in this article, for a walkthrough of this approach. +See [Approach 2: Build a static library](#approach2), in this article, for a walkthrough of this approach. ## Approach 1: Scan for headers @@ -101,9 +101,9 @@ The primary consideration of this approach is the balance between convenience an You can fine-tune this balance by not scanning for module dependencies, and instead explicitly marking which files should be built as header units. That approach is shown in [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) -## Approach 2: Build a shared library +## Approach 2: Build a static library -The more flexible and more build performant way to consume STL headers is to create a library, or libraries, that build common header units from the STL headers you want to use. Then reference that library, or libraries, from the projects that need those STL headers. Adding a reference establishes a mapping between the `import` statement for the header unit, and its `.ifc` file. +The more flexible and more build performant way to consume STL headers is to create a static library, or static libraries, that build common header units from the STL headers you want to use. Then reference that library, or libraries, from the projects that need those STL headers. Adding a reference establishes a mapping between the `import` statement for the header unit, and its `.ifc` file. This option ensures that header units for a particular header will be built only once. It's similar to using a shared precompiled header file, but is much easier. @@ -178,7 +178,7 @@ You can make a monolithic library containing all the commonly used STL headers t The result should be increased build throughput because importing a header unit significantly reduces the work the compiler must do. -It's important when you do this with your own projects that you build the shared library using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the shared library. +It's important when you do this with your own projects that you build the static library using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the static library. ## Reuse header units between projects @@ -211,7 +211,7 @@ To access these settings: ### `header-units.json` -Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults when `/TranslateInclude ` is specified to determine which STL headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. +Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults when `/translateInclude` is specified to determine which STL headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. The [header-units.json](header-unit-json-reference.md) file is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. From 93e9c4c0865d78ad1f1bb3a2194b92863efc4fcc Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 1 Apr 2021 13:50:31 -0700 Subject: [PATCH 22/82] acrolinx --- docs/build/header-unit-json-reference.md | 6 +++--- docs/build/reference/headerunit.md | 6 +++--- docs/build/reference/sourcedependencies.md | 6 +++--- docs/build/reference/translateinclude.md | 2 +- docs/build/walkthrough-import-stl-header-units.md | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index 1eded41a549..8118b80c84f 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -8,11 +8,11 @@ helpviewer_keywords: ["header-units.json", "header unit"] # C++ header-units.json reference -The `header-units.json` file lists which header files in the directory it is located in can be automatically built by the build system as header units, and then treated as an `import` instead of an `#include`. +The `header-units.json` file lists which header files in the directory it's located in can be automatically built by the build system as header units, and then treated as an `import` instead of an `#include`. Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` at compile time to determine its behavior. Using `#define` can't be used to change the behavior of a header unit, so `` shouldn't be compiled into a header unit because it wouldn't provide the expected behavior. -When the command-line switch [`/translateInclude` (Translate include directives into import directives)](translateinclude.md) is provided, the build system looks for `#include` files that can be compiled as header units. For example, there's an allowlist for the Standard Template Library headers that the build system consults when `/translateInclude ` is specified to determine which Standard Template Library (STL) headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. +When the command-line switch [`/translateInclude` (Translate include directives into import directives)](./reference/translateinclude.md) is provided, the build system looks for `#include` files that can be compiled as header units. For example, there's an allowlist for the Standard Template Library headers that the build system consults when `/translateInclude ` is specified to determine which Standard Template Library (STL) headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. ## Schema @@ -40,7 +40,7 @@ For example: ## Search rules -The build system looks for this file in the same directory as the header file. If your library is organized into subdirectories, each subdirectory will need it's own `header-units.json` file. +The build system looks for this file in the same directory as the header file. If your library is organized into subdirectories, each subdirectory will need its own `header-units.json` file. ## See also diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index a2f1b49466a..0364a0b6af0 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -27,13 +27,13 @@ The name of a file that contains compiled header unit information. To import mor The **`/headerUnit`** compiler option requires the [/std:c++latest](std-specify-language-standard-version.md) option. The **`/headerUnit`** compiler option is available starting in Visual Studio 2019 version 16.10 preview 2. -When the compiler encounters `import "file";` or `import `, this compiler switch helps the compiler find the compiled header unit (*`.ifc`*) for the specified header file. The path to this file can be expressed in three ways: +When the compiler comes across `import "file";` or `import `, this compiler switch helps the compiler find the compiled header unit (*`.ifc`*) for the specified header file. The path to this file can be expressed in three ways: **`/headerUnit`** looks up the compiled header unit in the current directory, or at the location specified in *`ifc-filename`*. -**`/headerUnit:quote`** looks up the the compiled header unit file using the same rules as `#include "file"`. +**`/headerUnit:quote`** looks up the compiled header unit file using the same rules as `#include "file"`. -**`/headerUnit:angle`** looks up the the compiled header unit file using the same rules as `#include `. +**`/headerUnit:angle`** looks up the compiled header unit file using the same rules as `#include `. The compiler can't map a single *`header-name`* to multiple IFC files. While mapping multiple *`header-name`* arguments to a single IFC is possible, we don't recommend it. The contents of the IFC get imported as if it was only the header specified by *`header-name`*. diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index c2cbad2f289..a8150036c3e 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -9,9 +9,9 @@ helpviewer_keywords: ["/sourceDependencies compiler option", "/sourceDependencie This command-line option comes in two forms: -- `/sourceDependencies:directives` is used in conjunction with `/translateInclude` to specify a JSON file that contains an allow list of header files that can be allowed to be compiled into header units. +- `/sourceDependencies:directives` is used with `/translateInclude` to specify a JSON file that contains an allowlist of header files that can be compiled into header units. -The `/sourceDependencies` form generate a JSON file that details the source-level dependencies consumed during compilation. The JSON file contains a list of the source dependencies, which include: +The `/sourceDependencies` form generates a JSON file that details the source-level dependencies consumed during compilation. The JSON file contains a list of the source dependencies, which include: - Header files (both transitive and directly included headers). - The PCH used (if **`/Yu`** is specified). @@ -37,7 +37,7 @@ If the argument is a directory, the compiler generates source dependency files i The **`/sourceDependencies`** compiler option is available starting in Visual Studio 2019 version 16.7. It's not enabled by default. The **`/sourceDependencies:directives`** compiler option is available starting in Visual Studio 2019 version 16.10 Preview 2. It's not enabled by default. -The `/sourceDependencies:directives` form refers to a JSON file that is used as allow list used in conjunction with the build system's **Scan Sources for Module Dependencies**`to determine which header files can be compiled into a header unit. When this switch is specified, header files encountered in the scanned source files, that are also listed in the specified JSON file, are compiled into header units. Files not in the list aren't compiled to header units and instead are treated as a normal `#include`. +The `/sourceDependencies:directives` form refers to a JSON file that is used as allowlist used with the build system's **Scan Sources for Module Dependencies**`to determine which header files can be compiled into a header unit. When this switch is specified, header files encountered in the scanned source files, that are also listed in the specified JSON file, are compiled into header units. Files not in the list aren't compiled to header units and instead are treated as a normal `#include`. When you specify the **`/MP`** compiler option, we recommend you use **`/sourceDependencies`** with a directory argument. If you provide a single filename argument, two instances of the compiler may attempt to open the output file simultaneously and cause an error. For more information on **`/MP`**, see [`/MP` (Build with multiple processes)](mp-build-with-multiple-processes.md). diff --git a/docs/build/reference/translateinclude.md b/docs/build/reference/translateinclude.md index ba860690513..c978c082910 100644 --- a/docs/build/reference/translateinclude.md +++ b/docs/build/reference/translateinclude.md @@ -29,7 +29,7 @@ The compiler replaces this directive with: import ; ``` -In MSVC, available header units are made available by the **`/headerUnit`** option which maps a header file to its importable header unit. For more information, see [`/headerUnit` (Use header unit IFC)](headerunit.md). +In MSVC, available header units are made available by the **`/headerUnit`** option, which maps a header file to its importable header unit. For more information, see [`/headerUnit` (Use header unit IFC)](headerunit.md). ### Examples diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 9a9eb9f9ab4..522b75edce1 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -25,7 +25,7 @@ Support for header units requires at least Visual Studio 2019 16.10.0 Preview 2. ## Two different approaches -Before an STL header can be imported, it must be compiled into a header unit. There are two main approaches to doing this, demonstrated below. +Before an STL header can be imported, it must be compiled into a header unit. There are two main approaches, demonstrated below. **Scan for module dependencies** @@ -81,7 +81,7 @@ Follow these steps to set the options that cause the build system to scan for he ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Ensure that the **Configuration** dropdown is set to **All Configurations** 1. In the left-hand pane of the project property page, select **C/C++** > **General** -1. Set **Scan Sources for Module Dependencies** to **Yes** Because we are setting the project property, all sources in this project will be scanned. This could be set at the file level, but here we scan the entire project. +1. Set **Scan Sources for Module Dependencies** to **Yes** Because we're setting the project property, all sources in this project will be scanned. This could be set at the file level, but here we scan the entire project. 1. Set **Translate Includes to Imports** to **Yes** Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: @@ -136,7 +136,7 @@ Set project properties to share the header units from this project: 1. In the left-hand pane of the project property page, select **C/C++** > **General** ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** -1. Set the **Translate Includes to Imports** dropdown to **Yes**. This setting causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers and those listed in the `header-units.json` file. For more details about this file, see [header-units.json](#header-unitsjson), below. This setting ensures minimal symbols duplication in the header units and the best build throughput. +1. Set the **Translate Includes to Imports** dropdown to **Yes**. This setting causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers and those listed in the `header-units.json` file. For more information about this file, see [header-units.json](#header-unitsjson), below. This setting ensures minimal symbols duplication in the header units and the best build throughput. 1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. ## Reference the STL header unit project From 8df0b6929a5a1570d4d10a5af4c0c572e58a78e0 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 2 Apr 2021 19:18:37 -0700 Subject: [PATCH 23/82] draft --- docs/standard-library/ranges-functions.md | 99 +++++++++++++++++++++++ docs/standard-library/ranges.md | 79 ++++++++++++++++++ docs/standard-library/toc.yml | 9 +++ 3 files changed, 187 insertions(+) create mode 100644 docs/standard-library/ranges-functions.md create mode 100644 docs/standard-library/ranges.md diff --git a/docs/standard-library/ranges-functions.md b/docs/standard-library/ranges-functions.md new file mode 100644 index 00000000000..953f6998ed4 --- /dev/null +++ b/docs/standard-library/ranges-functions.md @@ -0,0 +1,99 @@ +--- +description: "Learn more about: ; functions" +title: " functions" +ms.date: "04/13/2021" +f1_keywords: ["ranges/std::span::as_bytes", "span/std::as_writable_bytes"] +helpviewer_keywords: ["std::span [C++], as_writable_bytes", "std::as_bytes [C++]"] +--- +# ` functions + +The `` header includes the following non-member functions that operate on **span** objects. + +| **Non-member functions** | **Description** | +|-|-| +|[as_bytes](#as_bytes) | Get a read-only view of the object representation of the elements in the span. | +|[as_writable_bytes](#as_writable_bytes) | Get a read/write view of the object representation of the elements in the span. | + +## `as_bytes` + +Get a read-only view of the object representation of the elements in the span. + +```cpp +template +auto as_bytes(span s) noexcept; +``` + +### Parameters + +*T*\ +The type of the elements in the span. + +*Extent*\ +The number of elements in the span (if known at compile time), otherwise `dynamic_extent` indicating that the number of elements isn't known until runtime. + +*s*\ +The span to get the raw representation of. + +### Return Value + +A `span` to the first item stored in the span where `S` is `{reinterpret_cast(s.data()), s.size_bytes()}` + +### Example + +```cpp +#include +#include + +using namespace std; + +void main() +{ + int a[] = { 0,1,2 }; + span mySpan(a); + auto bytes = std::as_bytes(mySpan); +} +``` + +## `as_writable_bytes` + +If `T` isn't **`const`**, gets a read/write view of the raw byte representation of the elements in the span. + +```cpp +template +auto as_writable_bytes(span s) noexcept; +``` + +### Parameters + +*T*\ +The type of the elements in the span. + +*Extent*\ +The number of elements in the span (if known at compile time), otherwise `dynamic_extent` indicating that the number of elements isn't known until runtime. + +*s*\ +The span to get the raw representation of. + +### Return Value + +A `span` to the first item stored in the span where `S` is `{reinterpret_cast(s.data()), s.size_bytes()}` + +### Example + +```cpp +#include +#include + +using namespace std; + +void main() +{ + int a[] = { 0,1,2 }; + span mySpan(a); + auto bytes = as_writable_bytes(mySpan); +} +``` + +## See also + +[\](span.md) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md new file mode 100644 index 00000000000..4172b3d7d80 --- /dev/null +++ b/docs/standard-library/ranges.md @@ -0,0 +1,79 @@ +--- +title: "<ranges>" +description: "API reference for the Standard Template Library (STL) ranges namespace, which provides ... JTW" +ms.date: "04/13/2021" +f1_keywords: [""] +helpviewer_keywords: ["ranges header"] +--- + +# <ranges> + +A `range` is a ... + +See [span class](span-class.md) for detailed information. Here's an example of how a span can be used: + +```cpp +#include +#include + +void Show(std::span someValues) +{ + // show values in reverse + for (auto rIt = someValues.rbegin(); rIt != someValues.rend(); ++rIt) + { + std::cout << *rIt; + } + + // show a subspan + for (auto& i : someValues.subspan(1, 2)) + { + std::cout << i; + } +} + +int main() +{ + int numbers[]{ 0,1,2,3,4 }; + Show(numbers); // note conversion from array to span +} +``` + +## Requirements + +**Header:** `` + +**Namespace:** std + +**Compiler option:** [/std:c++latest](../build/reference/std-specify-language-standard-version.md) + +## Members + +### Classes + +|Name|Description| +|-|:-| +|[ranges](span-class.md)| Provides a view over a contiguous sequence of objects. | + +### Operators + +|Name|Description| +|-|:-| +|[operator=](span-class.md#op_eq)| Span assignment | +|[operator\[\]](span-class.md#op_at)| Element access | + +### Functions + +|Name|Description| +|-|:-| +| [as_bytes](span-functions.md#as_bytes)| Get the underlying read-only bytes of the span. | +| [as_writable_bytes](span-functions.md#as_writable_bytes) | Get the underlying bytes of the span. | + +### Constants + +|Name|Description| +|-|:-| +| **dynamic_extent** | Indicates that the span size is determined at runtime rather than compile time. When the number of elements in the span is known at compile time, it's specified as the `Extent` template parameter. When the number isn't known until runtime, specify `dynamic_extent` instead. | + +## See also + +[Header Files Reference](../standard-library/cpp-standard-library-header-files.md) diff --git a/docs/standard-library/toc.yml b/docs/standard-library/toc.yml index 84f61cc2cf8..a3ef6345d28 100644 --- a/docs/standard-library/toc.yml +++ b/docs/standard-library/toc.yml @@ -844,6 +844,15 @@ href: ../standard-library/uniform-real-distribution-class.md - name: weibull_distribution class href: ../standard-library/weibull-distribution-class.md + - name: + expanded: false + items: + - name: + href: ../standard-library/ranges.md + - name: functions + href: ../standard-library/ranges-functions.md + - name: ranges class + href: ../standard-library/ranges-class.md - name: href: ../standard-library/ratio.md - name: From db764c3f38314a244b815b697ea9832f64e36313 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 2 Apr 2021 22:01:36 -0700 Subject: [PATCH 24/82] port docs from erika sweet --- docs/build/cmake-presets-vs.md | 410 ++++++++++++++++++ .../add-configure-preset-to-cmakepresets.PNG | Bin 0 -> 8450 bytes docs/build/media/enable-cmakepresets.PNG | Bin 0 -> 38981 bytes docs/build/media/target-system-dropdown.PNG | Bin 0 -> 4601 bytes docs/build/media/target-system-selections.PNG | Bin 0 -> 4127 bytes docs/build/toc.yml | 2 + 6 files changed, 412 insertions(+) create mode 100644 docs/build/cmake-presets-vs.md create mode 100644 docs/build/media/add-configure-preset-to-cmakepresets.PNG create mode 100644 docs/build/media/enable-cmakepresets.PNG create mode 100644 docs/build/media/target-system-dropdown.PNG create mode 100644 docs/build/media/target-system-selections.PNG diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md new file mode 100644 index 00000000000..540e5841234 --- /dev/null +++ b/docs/build/cmake-presets-vs.md @@ -0,0 +1,410 @@ +quote:CMakePresets.json, CMakeSettings.json, `launch.vs.json` and `task.vs.json` +replace “ +replace ” +Fix JTW links + +--- +title: Configure and build with CMake presets +description: "Reference for using CMake presets to configure and build CMake projects." +ms.topic: reference +ms.date: "04/13/2020" +--- +# Configure and build with CMake presets + +CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. + +`CMakePresets.json` and `CMakeUserPresets.json` can be used to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. + +This article contains information about `CMakePresets.json` integration in Visual Studio. For more information on the format of `CMakePresets.json`, see the official [CMake Tools documentation](README.md). For more information on the Microsoft vendor maps and macro expansion, see . For more information on how to use `CMakePresets.json` in Visual Studio Code, see . + +`CMakePresets.json` is a recommended alternative to `CMakeSettings.json`. Visual Studio will never read from both CMakePresets.json and CMakeSettings.json at the same time. See to enable or disable CMakePresets.json integration in Visual Studio. + +## Supported CMake and `CMakePresets.json` versions + +The CMake Tools extension supports `CMakePresets.json` and `CMakeUserPresets.json` files version 2 or higher. You can update your file version by incrementing the version field in the root object. For an example and more information, see [`CMakePresets.json`](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#format). + +CMake version 3.20 or higher is required when invoking CMake with `CMakePresets.json` (version 2 or higher) from the command line. However, Visual Studio reads and evaluates CMakePresets.json and CMakeUserPresets.json itself and does not invoke CMake directly with the `--preset` option. This means CMake version 3.20 or higher is not strictly required when building with CMakePresets.json inside Visual Studio. Use at least CMake version 3.14 or higher. + +## Enable `CMakePresets.json` in Visual Studio 2019 + +CMakePresets.json integration is not enabled by default in Visual Studio 2019. You can enable CMakePresets.json integration for all CMake projects in Tools > Options > CMake > General: + +![Enable CMakePresets.json in CMake options > General](./media/enable-cmakepresets.PNG) + +> [!Important] You must close and reopen the folder in Visual Studio to activate the integration. + +If you do not want to enable CMakePresets.json integration for all CMake projects, then you can enable CMakePresets.json integration for a single CMake project by adding a CMakePresets.json file to the root of the open folder. You must close and reopen the folder in Visual Studio to activate the integration. + +The following table indicates when CMakePresets.json will be used instead of CMakeSettings.json to drive CMake configuration and build. **Tools** > **Options** enabled means **Use CMakePresets.json to drive CMake configure, build, and test**” is selected in **Tools** > **Options** > **CMake** > **General**. + +If no configuration file is present, then default Configure Presets are used. + +| Configuration files | Tools > Options disabled | Tools > Options enabled | +|--|--|--| +| No configuration file present | CMakeSettings.json | CMakePresets.json | +| CMakeSettings.json present | CMakeSettings.json | CMakePresets.json | +| CMakePresets.json present | CMakeSettings.json | CMakePresets.json | +| Both configuration files present | CMakeSettings.json | CMakePresets.json | + +## Auto-configuration and cache notifications + +By default, Visual Studio will automatically invoke configure each time the active Target System or Configure Preset changes. You can modify this behavior by selecting **Never run configure step automatically** in **Tools** > **Options** > **CMake** > **General**. You can also disable all CMake cache notifications (gold bars) by deselecting **Show CMake cache notifications**. + +## Default Configure Presets + +If no CMakePresets.json or CMakeUserPresets.json file exists, or if CMakePresets.json or CMakeUserPresets.json are invalid, then Visual Studio will fall back on the following default Configure Presets: + +```json +{ + "name": "windows-default", + "displayName": "Windows x64 Debug", + "description": "Sets Ninja generator, compilers, x64 architecture, build and install directory, debug build type", + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "architecture": { + "value": "x64", + "strategy": "external" + }, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ "Windows" ] + } + } +}, + +{ + "name": "linux-default", + "displayName": "Linux Debug", + "description": "Sets Ninja generator, compilers, build and install directory, debug build type", + "generator": "Ninja", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}" + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ "Linux" ] + }, + "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { + "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" + } + } +} +``` +A CMakePresets.json file with the default Configure Presets is automatically created by Visual Studio at the root of your project if you attempt to open or modify a CMakePresets.json file that does not exist. + +## Configure and build + +Visual Studio provides 3 dropdowns when CMakePresets.json integration is enabled: + +![Target system dropdown](./media/target-system-dropdown.PNG) + +## Select a Target System + +The dropdown on the left indicates the active **Target System**. This is the system on which CMake will be invoked to configure and build the project. This dropdown lists your local machine, all SSH connections in the **Connection Manager** by host name, and all Windows Subsystem for Linux (WSL) installations that Visual Studio can find: + +![Target system dropdown selection examples for local machine, a SSH connection, and WSL ubuntu and WSL debian](./media/target-system-selections.PNG) + +In the example above, **192.168.0.5** is a remote Linux system that was added to the **Connection Manager**. **ubuntu2004** and **debian** are WSL installations. Select **Manage Connections…** to open the **Connection Manager**. + +## Select a Configure Preset + +The dropdown in the middle indicates the active **Configure Preset**. This is the `configurePreset` that will be used when CMake is invoked to generate the project build system. This dropdown lists the union of non-hidden Configure Presets defined in CMakePresets.json and CMakeUserPresets.json. + +Visual Studio will use the value of `hostOS` in the Microsoft Visual Studio Settings vendor map to hide Configure Presets that do not apply to the active Target System. See the for more information. + +Select **Manage Configurations…** to open the CMakePresets.json file located at the root of the project. CMakePresets.json is created if it does not already exist. + +## Select a Build Preset + +The dropdown on the right indicates the active **Build Preset**. This is the `buildPreset` that will be used when CMake is invoked to build the project. This dropdown lists the union of non-hidden Build Presets defined in CMakePresets.json and CMakeUserPresets.json. + +All Build Presets are required to specify an associated `configurePreset`. Visual Studio hides Build Presets that do not apply to the active Configure Preset. For more information, see [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset). If there are no Build Presets associated with the active Configure Preset, then Visual Studio will list the Default Build Preset. The Default Build Preset is equivalent to passing `cmake --build` with no other arguments from the command line. + +## Configure + +Visual Studio automatically tries to configure the project when it detects that the CMake Cache is out of date. To manually invoke configure, select **Project** > **Configure** from the main menu. This is the same as running `cmake --preset ` from the command line, where `` is the name of the active Configure Preset. To disable automatic cache generation, see . + +## Build + +To build the entire project, select **Build** > **Build All** from the main menu. This is the same as running `cmake --build --preset ` from the command line, where `` is the name of the active `Build Preset`. + +To build a single target, switch to `CMake Targets View` in the `Solution Explorer`. Then right-click any target and select **Build** from the context menu. + +> [!NOTE] Visual Studio 2019 does not support the `buildPresets.targets` option to build a subset of targets specified in CMakePresets.json. + +## Run CTest + +There are two menu options supported by CMakePresets.json in Visual Studio 2019. + +- **Test** > **Run CTests** for invokes CTest and runs all tests associated with the active Configure Preset and Build Preset, with no additional arguments passed to CTest. +- **Test** > **Run Test Preset** for will expand to show all Test Presets associated with the active Configure Preset. Selecting a single Test Preset is the same as running `ctest --preset ` from the command line, where `` is the name of the selected Test Preset. This option will be grayed out if no Test Presets are defined for the active Configure Preset. + +In Visual Studio 2019 the Test Explorer is not integrated with CMakePresets.json. + +## Add new presets + +In Visual Studio 2019, all commands and preset templates modify `CMakePresets.json`. You can add new user-level presets by directly editing `CMakeUserPresets.json` + +Use forward slashes (`/`) for paths in `CMakePresets.json` and `CMakeUserPresets.json`. + +## Add new Configure Presets + +To add a new Configure Preset to CMakePresets.json in the **Solution Explorer**, right-click CMakePresets.json from **Folder View** and select **Add Configure Preset…** from the context menu. The dialog to select a Configure Preset template opens: + +![Add configure preset to CMakePresets.json dialog](./media/add-configure-preset-to-cmakepresets.PNG) + +Choose the **Windows x64 Debug** template to configure on Windows systems. Choose the **Linux Debug** template to configure on WSL and remote Linux systems. See for more information on editing CMakePresets.json. + +The selected template will be added to CMakePresets.json if it exists. Otherwise, the template will be copied into a new CMakePresets.json. + +## Add new Build Presets and Test Presets + +Visual Studio 2019 does not offer templates for new Build Presets and Test Presets. Build Presets and Test Presets can be added by directly editing CMakePresets.json. See [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset), [Test Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#test-preset), or an for more information. + +## Edit presets + +The official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1) is the best resource for editing Configure Presets, Build Presets, and Test Presets. The following information is a subset of the CMake documentation that is especially relevant to Visual Studio developers. + +**Select your compilers** +C and C++ compilers can be set with `cacheVariables.CMAKE_C_COMPILER` and `cacheVariables.CMAKE_CXX_COMPILER` in a Configure Preset. This is equivalent to passing `-D CMAKE_C_COMPILER= and -D CMAKE_CXX_COMPILER=` to CMake from the command line. For more information, see [CMAKE__COMPILER](https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html#cmake-lang-compiler). + +Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual Studio. The C++ Clang tools for Windows component must be installed to build with `clang-cl`. + +```json +"cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", + "CMAKE_C_COMPILER": "cl", + "CMAKE_CXX_COMPILER": "cl" +}, + +"cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", + "CMAKE_C_COMPILER": "clang-cl", + "CMAKE_CXX_COMPILER": "clang-cl" +}, +"vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "intelliSenseMode": "windows-clang-x64" + } +} +``` + +> [!IMPORTANT] In Visual Studio 2019 you must explicitly specify a Clang IntelliSense mode when building with `clang` or `clang-cl`. + +See to reproduce these builds outside of Visual Studio. + +To build on Linux or without the Visual C++ toolset, specify the name of a compiler on your `PATH`, or an environment variable that evaluates to the full path of a compiler. Full paths are discouraged to so that the file can remain shareable. A preset that builds with GCC version 8 might look like this: + +```json +"cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", + "CMAKE_C_COMPILER": "gcc-8", + "CMAKE_CXX_COMPILER": "g++-8" +}, +``` + +You can also set compilers with a CMake toolchain file. Toolchain files can be set with `cacheVariables.CMAKE_TOOLCHAIN_FILE`, which is equivalent to passing` -D CMAKE_TOOLCHAIN_FILE=` to CMake from the command line. A CMake toolchain file is most often used for cross-compilation. See [CMake toolchains](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html) for more information on authoring CMake toolchain files. + +## Select your generator + +The Windows and Linux Configure Preset templates both specify Ninja as the default generator. Other common generators are the [Visual Studio Generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html?highlight=visual%20studio%20generators#visual-studio-generators) on Windows and Unix Makefiles on Linux and macOS. You can specify a new generator with the generator option in a Configure Preset. This is equivalent to passing `-G` to CMake from the command line. See CMake generators for more information. Make sure to set architecture.strategy and toolset.strategy to set when building with a Visual Studio Generator. See [CMake generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#:~:text=A%20CMake%20Generator%20is%20responsible%20for%20writing%20the,what%20native%20build%20system%20is%20to%20be%20used) for more information. + +Make sure to set `architecture.strategy` and `toolset.strategy` to `set` when building with a Visual Studio Generator. + +## Select your configuration type + +The configuration type (**Debug/Release**) for single configuration generators can be set with `cacheVariables.CMAKE_BUILD_TYPE`. This is equivalent to passing `-D CMAKE_BUILD_TYPE=` to CMake from the command line. See[ CMAKE_BUILD_TYPE](https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html) for more information. + +Select your target and host architecture when building with the Visual C++ toolset +The target architecture (x64, Win32, ARM64, or ARM) can be set with `architecture.value`. This is equivalent to passing` -A` to CMake from the command line. See [Platform Selection](https://cmake.org/cmake/help/latest/generator/Visual Studio 16 2019.html#platform-selection) for more information. + +> [!NOTE] Currently Visual Studio Generators expect the Win32 syntax and command line generators (like Ninja) expect the x86 syntax when building for x86. + +The host architecture (x64 or x86) and toolset can be set with `toolset.value`. This is equivalent to passing `-T` to CMake from the command line. See [Toolset Selection](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2016%202019.html#toolset-selection) for more information. + +`architecture.strategy` and `toolset.strategy` tell CMake how to handle the architecture and toolset fields. set means CMake will set the respective value, and external means CMake will not set the respective value. + + `set` should be used with IDE generators like the Visual Studio Generator. `external` should be used with command line generators like Ninja. This allows vendors like Visual Studio to source the required environment before CMake is invoked. See Configure Presets for more information on the architecture and toolset fields. + +For a full list of IDE generators that support the architecture field, see [CMAKE_GENERATOR_PLATFORM](https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_PLATFORM.html). For a full list of IDE generators that support the toolset field, see [CMAKE_GENERATOR_TOOLSET](https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_TOOLSET.html). + +Use the examples below to target ARM64 with the Ninja generator, or Win32 (x86) with the Visual Studio 16 2019 generator: + +```json +"generator": "Ninja", +"architecture": { + "strategy": "external", + "value": "arm64" +}, + +"generator": "Visual Studio 16 2019", +"architecture": { + "strategy": "set", + "value": "Win32" +}, +``` + +## Set and reference environment variables + +You can set environment variables using the environment map. Environment variables are inherited through the `inherits` field, but you can override them as desired. A preset’s environment will be the union of its own environment and the environment from all its parents. If multiple `inherits` presets provide conflicting values for the same variable, the earlier preset in the `inherits` list will be preferred. You can unset a variable inherited from another preset by setting it to `null`. Environment variables set in a Configure Preset also automatically flow through to associated Build Presets and Test Presets unless `inheritConfigureEnvironment` is set to `false`. See [Configure Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#configure-preset) for more information. + +You can reference environment variables using the `$env{}` and `$penv{}` syntax. See [Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. + +## Configure IntelliSense for a cross-compiler + +By default, Visual Studio will use the IntelliSense mode that matches your specified toolset and target architecture. If you are cross-compiling, then you may need to manually specify the correct IntelliSense mode with the `intelliSenseMode` option in the Visual Studio Settings vendor map. See for more information. + +## Configure and build on a remote system or the Windows Subsystem for Linux (WSL) + +With CMakePresets.json support in Visual Studio you can easily configure and build your project on Windows, WSL, and remote systems. The steps to your project on Windows, a remote system, or WSL are the same. However, there are a few behaviors that are specific to remote development. + +## `${sourceDir}` behavior in remote copy scenarios + +In local scenarios (including WSL1), `${sourceDir}` evaluates to the path to the project source directory that is open in Visual Studio. In remote copy scenarios, `${sourceDir}` evaluates to the path to the project source directory on the target system and not the project source directory on the local machine. The project source directory on the target system is determined by the value of `sourceDir` in the Visual Studio Remote Settings vendor map (defaults to `$env{HOME}/.vs/$ms{projectDirName}`). See for more information. + +## Local folder for remote output + +Remote copy scenarios require a local directory to copy some remote files like CMake File-API response files or build files if `copyBuildOutput` in the Visual Studio Remote Settings vendor map is set to `true`. These files are automatically copied to `/out//build/${presetName}`. + +## Invoke the same Configure Preset on Windows and WSL1 + +You will see an error if you try to use the same Configure Preset on Windows and WSL1. Windows and WSL1 both use the Windows file system, so CMake will try and use the same output directory (`binaryDir`) for both the Windows and WSL1 build tree. If you want to use the same Configure Preset with both Windows and the WSL1 toolset, create a second Configure Preset that inherits from the original preset and specifies a new `binaryDir`. In the following example, windows-preset can be used on Windows and base-preset can be used on WSL1: + +```json +{ + "name": "windows-preset", + "inherits": "base-preset" + "binaryDir": "${sourceDir}/out/build/${presetName}", + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": "Windows" + } + } +} +``` + +> [!NOTE] In Visual Studio 2019, only the WSL1 toolset is supported. You will see this behavior anytime you invoke configure on both Windows and WSL. + +## Vcpkg integration + +Vcpkg helps you manage C and C++ libraries on Windows, Linux, and macOS. A vcpkg toolchain file (`vcpkg.cmake`) must be passed to CMake to enable vcpkg integration. See the [vcpkg documentation](https://github.com/microsoft/vcpkg#vcpkg-overview) for more information. + +Visual Studio no longer passes your vcpkg toolchain file to CMake automatically when CMakePresets.json integration is enabled. This eliminates Visual Studio specific behavior and ensures that your build can be reproduced from the command line. + +Instead, set the path to `vcpkg.cmake` with the `VCPKG_ROOT` environment variable in CMakePresets.json: + +```json +"cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": { + "value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", + "type": "FILEPATH" + } + }, +``` + +`VCPKG_ROOT` should be set to the root of your vcpkg installation. See [vcpkg environment variables](https://github.com/microsoft/vcpkg/blob/master/docs/users/config-environment.md) for more information. + +If you're already using a CMake toolchain file and want to enable vcpkg integration, then see [Using multiple toolchain files](https://github.com/microsoft/vcpkg/blob/master/docs/users/integration.md#using-multiple-toolchain-files) and follow those instructions to use an external toolchain file with a project using vcpkg. + +## Variable substitution in launch.vs.json and tasks.vs.jso + +CMakePresets.json supports variable substitution in launch.vs.json and tasks.vs.json. + +* Environment variables set in the active Configure Preset will automatically flow through to launch.vs.json and tasks.vs.json configurations. You can unset individual environment variables in launch.vs.json and tasks.json by setting them to `null`. The following example sets the variable `DEBUG_LOGGING_LEVEL` to `null` in launch.vs.json: `"env": { "DEBUG_LOGGING_LEVEL": null }` + +* Key-values set in the active Configure Preset are available for consumption in launch.vs.json and tasks.vs.json with the syntax `${cmake.}`. For example, use ` ${cmake.binaryDir}` to reference the output directory of the active Configure Preset. +* Individual environment variables set in the environment map of the active Configure Preset are available for consumption in launch.vs.json and tasks.vs.json using the syntax `${env.}`. + +Update your `launch.vs.json` and `task.vs.json` files to reference CMakePresets.json syntax instead of `CMakeSettings.json` syntax. Macros that reference the old `CMakeSettings.json` syntax when CMakePresets.json is the active configuration file will be deprecated in a future release. For example, reference the output directory of the active Configure Preset with `${cmake.binaryDir}` instead of `${cmake.buildRoot}`, because CMakePresets.json uses the `binaryDir` syntax. + +## Troubleshooting + +If things aren’t working as expected, there are a few troubleshooting steps that you can take. + +If either `CMakePresets.json` or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you are referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run `cmake --list-presets` from the command line at the root of your project directory (CMake 3.20 or higher is required). If either file is invalid, then you'll see the following error: + +```DOS +CMake Error: Could not read presets from +C:/Users//source/repos/: JSON parse error +``` + +Other troubleshooting steps include: +* Delete the cache and reconfigure the project (**CMake: Delete Cache** and **Project** > **Configure **) +* Close and reopen the folder in Visual Studio (**File** > **Close Folder**) +* Delete the `.vs` folder at the root your project + +If you have identified a problem, the best way to report it is by clicking the **Send Feedback** button in the top right-hand corner of Visual Studio. + +## Logging for remote connections + +You can enable logging for remote connections if you are having trouble connecting or copying files to a remote system. See [logging for remote connections](https://docs.microsoft.com/cpp/linux/connect-to-your-remote-linux-computer?view=msvc-160#logging-for-remote-connections) for more information. + +## Enable AddressSanitizer for Windows and Linux + +AddressSanitizer (ASan) is a runtime memory error detector for C and C++ that is supported in Visual Studio for both Windows and Linux development. AddressSanitizer was enabled with an option (`addressSanitizerEnabled`) in CMakeSettings.json. This behavior is not supported by CMakePresets.json. + +Instead, enable and disable AddressSanitizer by setting the required compiler and linker flags yourself. This removes Visual Studio specific behavior and ensures that the same CMakePresets.json file can reproduce your build from the command line. The following sample can be added to a CMakeLists.txt to enable or disable AddressSanitizer for a target. + +``` +option(ASAN_ENABLED "Build this target with AddressSanitizer" ON) + +if(ASAN_ENABLED) + if(MSVC) + target_compile_options( PUBLIC /fsanitize=address) + else() + target_compile_options( PUBLIC -fsanitize=address ) + target_link_options( PUBLIC -fsanitize=address) + endif() +endif() +``` + +`` are other compilation flags like `"-fno-omit-frame-pointer"`. See [Using AddressSanitizer](https://docs.microsoft.com/cpp/sanitizers/asan?view=msvc-160#command-prompt) for more information on ASan for Linux, and Use the AddressSanitizer from a Developer Command Prompt for more information on ASan with MSVC. + +Pass additional runtime flags to AddressSanitizer with the `ASAN_OPTIONS` field in launch.vs.json. `ASAN_OPTIONS` defaults to `detect_leaks=0` when no other runtime options are specified because LeakSanitizer is not supported in Visual Studio. + +## Run CMake from the command line or a Continuous Integration (CI) pipeline + +You can use the same `CMakePresets.json` and `CMakeUserPresets.json` files to invoke CMake in Visual Studio and from the command line. The [CMake](https://cmake.org/cmake/help/latest/manual/cmake.1.html) and [CTest](https://cmake.org/cmake/help/latest/manual/ctest.1.html) documentation are the best resources for invoking CMake and CTest with `--preset`. CMake version 3.20 or higher is required. + +## Sourcing the environment when building with command line generators on Windows + +It’s up to the user to configure the environment before CMake is invoked when building with a command line generator. If you’re building with Ninja and the Visual C++ toolset on Windows, then you will need to source the environment before CMake is called to generate the build system. You can do this by calling vcvarsall.bat with the architecture argument. architecture specifies the host and target architecture to use. See [vcvarsall syntax](https://docs.microsoft.com/cpp/build/building-on-the-command-line?view=msvc-160#vcvarsall-syntax) for more information. If you build on Linux or on Windows with a Visual Studio Generator, then you don't need to take this step. + +This is the same step that Visual Studio takes for you when CMake is invoked by the IDE. Visual Studio parses the active Configure Preset for the host and target architecture specified by toolset and architecture and then sources the specified environment from `vcvarsall.bat`. When you build from the Windows command line with Ninja, you will need to take this step yourself. + +`vcvarsall.bat` is installed with the Build Tools for Visual Studio. By default, `vcvarsall.bat` is installed in `C:\Program Files (x86)\Microsoft Visual Studio\2019\\VC\Auxiliary\Build`. You can add `vcvarsall.bat` to your `PATH` if you use the command line workflow frequently. + +## Example command line workflow + +The following commands can be used to configure and build a CMake project that uses Ninja to target arm64 with x64 build tools. CMake version 3.20 or higher is required. Run these commands from the directory where your CMakePresets.json is located: + +```DOS +/path/to/vcvarsall.bat x64_arm64 +cmake --list-presets=all . +cmake --preset +cmake --build --preset +``` + +## Example `CMakePresets.json` file + +See the `CMakePresets.json` file checked in the [box2d-lite](https://github.com/esweet431/box2d-lite/blob/main/`CMakePresets.json`) code sample. It contains examples of Configure Presets, Build Presets, and Test Presets. + +## Next steps + +Learn more about configuring and debugging CMake projects in Visual Studio: + +> [!div class="nextstepaction"] +> [CMake Projects in Visual Studio](cmake-projects-in-visual-studio.md)

+> [Customize CMake build settings](customize-cmake-settings.md)

+> [Configure CMake debugging sessions](configure-cmake-debugging-sessions.md)

+> [CMake predefined configuration reference](cmake-predefined-configuration-reference.md) +> \ No newline at end of file diff --git a/docs/build/media/add-configure-preset-to-cmakepresets.PNG b/docs/build/media/add-configure-preset-to-cmakepresets.PNG new file mode 100644 index 0000000000000000000000000000000000000000..343e8a85ed6ceb5f29599c20ac18ddbf9d82e994 GIT binary patch literal 8450 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 az+;;~YR(x9+DVr*fQxolY-`S3PyRP74q65P literal 0 HcmV?d00001 diff --git a/docs/build/media/enable-cmakepresets.PNG b/docs/build/media/enable-cmakepresets.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f2b46318ff0daf3753e508246920184016f32f96 GIT binary patch literal 38981 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 JTxNMD;a}4RPcr}j literal 0 HcmV?d00001 diff --git a/docs/build/media/target-system-dropdown.PNG b/docs/build/media/target-system-dropdown.PNG new file mode 100644 index 0000000000000000000000000000000000000000..a09eead210a237e40f84213450067854fe5619a8 GIT binary patch literal 4601 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 literal 0 HcmV?d00001 diff --git a/docs/build/media/target-system-selections.PNG b/docs/build/media/target-system-selections.PNG new file mode 100644 index 0000000000000000000000000000000000000000..2c9a0a8ad0d7c354d7fd439ecadc64d1243b6471 GIT binary patch literal 4127 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 JRp7_b{{wt_(@p>Y literal 0 HcmV?d00001 diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 1f730724a73..199f67cca20 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -61,6 +61,8 @@ href: ../build/clang-support-cmake.md - name: Configure a Linux CMake project href: ../build/../linux/cmake-linux-project.md + - name: Configure and build with CMake presets + href: ../build/cmake-presets.md - name: Customize CMake build settings href: ../build/customize-cmake-settings.md - name: Configure CMake debugging sessions From 33784590a2aab4a1cbd974c6232fd87cf72c0734 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 2 Apr 2021 22:06:36 -0700 Subject: [PATCH 25/82] fix filename quoting --- docs/build/cmake-presets-vs.md | 103 ++++++++++++++++----------------- 1 file changed, 49 insertions(+), 54 deletions(-) diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index 540e5841234..b2e75e6c6c6 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -1,8 +1,3 @@ -quote:CMakePresets.json, CMakeSettings.json, `launch.vs.json` and `task.vs.json` -replace “ -replace ” -Fix JTW links - --- title: Configure and build with CMake presets description: "Reference for using CMake presets to configure and build CMake projects." @@ -11,40 +6,40 @@ ms.date: "04/13/2020" --- # Configure and build with CMake presets -CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. +CMake supports two files, and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. -`CMakePresets.json` and `CMakeUserPresets.json` can be used to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. + and `CMakeUserPresets.json` can be used to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. -This article contains information about `CMakePresets.json` integration in Visual Studio. For more information on the format of `CMakePresets.json`, see the official [CMake Tools documentation](README.md). For more information on the Microsoft vendor maps and macro expansion, see . For more information on how to use `CMakePresets.json` in Visual Studio Code, see . +This article contains information about integration in Visual Studio. For more information on the format of , see the official [CMake Tools documentation](README.md). For more information on the Microsoft vendor maps and macro expansion, see . For more information on how to use in Visual Studio Code, see . -`CMakePresets.json` is a recommended alternative to `CMakeSettings.json`. Visual Studio will never read from both CMakePresets.json and CMakeSettings.json at the same time. See to enable or disable CMakePresets.json integration in Visual Studio. + is a recommended alternative to `CMakeSettings.json`. Visual Studio will never read from both `CMakePresets.json` and `CMakeSettings.json` at the same time. See to enable or disable `CMakePresets.json` integration in Visual Studio. -## Supported CMake and `CMakePresets.json` versions +## Supported CMake and versions -The CMake Tools extension supports `CMakePresets.json` and `CMakeUserPresets.json` files version 2 or higher. You can update your file version by incrementing the version field in the root object. For an example and more information, see [`CMakePresets.json`](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#format). +The CMake Tools extension supports and `CMakeUserPresets.json` files version 2 or higher. You can update your file version by incrementing the version field in the root object. For an example and more information, see [](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#format). -CMake version 3.20 or higher is required when invoking CMake with `CMakePresets.json` (version 2 or higher) from the command line. However, Visual Studio reads and evaluates CMakePresets.json and CMakeUserPresets.json itself and does not invoke CMake directly with the `--preset` option. This means CMake version 3.20 or higher is not strictly required when building with CMakePresets.json inside Visual Studio. Use at least CMake version 3.14 or higher. +CMake version 3.20 or higher is required when invoking CMake with (version 2 or higher) from the command line. However, Visual Studio reads and evaluates `CMakePresets.json` and CMakeUserPresets.json itself and does not invoke CMake directly with the `--preset` option. This means CMake version 3.20 or higher is not strictly required when building with `CMakePresets.json` inside Visual Studio. Use at least CMake version 3.14 or higher. -## Enable `CMakePresets.json` in Visual Studio 2019 +## Enable in Visual Studio 2019 -CMakePresets.json integration is not enabled by default in Visual Studio 2019. You can enable CMakePresets.json integration for all CMake projects in Tools > Options > CMake > General: +`CMakePresets.json` integration is not enabled by default in Visual Studio 2019. You can enable `CMakePresets.json` integration for all CMake projects in Tools > Options > CMake > General: -![Enable CMakePresets.json in CMake options > General](./media/enable-cmakepresets.PNG) +![Enable `CMakePresets.json` in CMake options > General](./media/enable-cmakepresets.PNG) > [!Important] You must close and reopen the folder in Visual Studio to activate the integration. -If you do not want to enable CMakePresets.json integration for all CMake projects, then you can enable CMakePresets.json integration for a single CMake project by adding a CMakePresets.json file to the root of the open folder. You must close and reopen the folder in Visual Studio to activate the integration. +If you do not want to enable `CMakePresets.json` integration for all CMake projects, then you can enable `CMakePresets.json` integration for a single CMake project by adding a `CMakePresets.json` file to the root of the open folder. You must close and reopen the folder in Visual Studio to activate the integration. -The following table indicates when CMakePresets.json will be used instead of CMakeSettings.json to drive CMake configuration and build. **Tools** > **Options** enabled means **Use CMakePresets.json to drive CMake configure, build, and test**” is selected in **Tools** > **Options** > **CMake** > **General**. +The following table indicates when `CMakePresets.json` will be used instead of `CMakeSettings.json` to drive CMake configuration and build. **Tools** > **Options** enabled means **Use `CMakePresets.json` to drive CMake configure, build, and test** is selected in **Tools** > **Options** > **CMake** > **General**. If no configuration file is present, then default Configure Presets are used. | Configuration files | Tools > Options disabled | Tools > Options enabled | |--|--|--| -| No configuration file present | CMakeSettings.json | CMakePresets.json | -| CMakeSettings.json present | CMakeSettings.json | CMakePresets.json | -| CMakePresets.json present | CMakeSettings.json | CMakePresets.json | -| Both configuration files present | CMakeSettings.json | CMakePresets.json | +| No configuration file present | `CMakeSettings.json` | `CMakePresets.json` | +| `CMakeSettings.json` present | `CMakeSettings.json` | `CMakePresets.json` | +| `CMakePresets.json` present | `CMakeSettings.json` | `CMakePresets.json` | +| Both configuration files present | `CMakeSettings.json` | `CMakePresets.json` | ## Auto-configuration and cache notifications @@ -52,7 +47,7 @@ By default, Visual Studio will automatically invoke configure each time the acti ## Default Configure Presets -If no CMakePresets.json or CMakeUserPresets.json file exists, or if CMakePresets.json or CMakeUserPresets.json are invalid, then Visual Studio will fall back on the following default Configure Presets: +If no `CMakePresets.json` or CMakeUserPresets.json file exists, or if `CMakePresets.json` or CMakeUserPresets.json are invalid, then Visual Studio will fall back on the following default Configure Presets: ```json { @@ -96,11 +91,11 @@ If no CMakePresets.json or CMakeUserPresets.json file exists, or if CMakePresets } } ``` -A CMakePresets.json file with the default Configure Presets is automatically created by Visual Studio at the root of your project if you attempt to open or modify a CMakePresets.json file that does not exist. +A `CMakePresets.json` file with the default Configure Presets is automatically created by Visual Studio at the root of your project if you attempt to open or modify a `CMakePresets.json` file that does not exist. ## Configure and build -Visual Studio provides 3 dropdowns when CMakePresets.json integration is enabled: +Visual Studio provides 3 dropdowns when `CMakePresets.json` integration is enabled: ![Target system dropdown](./media/target-system-dropdown.PNG) @@ -114,15 +109,15 @@ In the example above, **192.168.0.5** is a remote Linux system that was added to ## Select a Configure Preset -The dropdown in the middle indicates the active **Configure Preset**. This is the `configurePreset` that will be used when CMake is invoked to generate the project build system. This dropdown lists the union of non-hidden Configure Presets defined in CMakePresets.json and CMakeUserPresets.json. +The dropdown in the middle indicates the active **Configure Preset**. This is the `configurePreset` that will be used when CMake is invoked to generate the project build system. This dropdown lists the union of non-hidden Configure Presets defined in `CMakePresets.json` and CMakeUserPresets.json. Visual Studio will use the value of `hostOS` in the Microsoft Visual Studio Settings vendor map to hide Configure Presets that do not apply to the active Target System. See the for more information. -Select **Manage Configurations…** to open the CMakePresets.json file located at the root of the project. CMakePresets.json is created if it does not already exist. +Select **Manage Configurations…** to open the `CMakePresets.json` file located at the root of the project. `CMakePresets.json` is created if it does not already exist. ## Select a Build Preset -The dropdown on the right indicates the active **Build Preset**. This is the `buildPreset` that will be used when CMake is invoked to build the project. This dropdown lists the union of non-hidden Build Presets defined in CMakePresets.json and CMakeUserPresets.json. +The dropdown on the right indicates the active **Build Preset**. This is the `buildPreset` that will be used when CMake is invoked to build the project. This dropdown lists the union of non-hidden Build Presets defined in `CMakePresets.json` and CMakeUserPresets.json. All Build Presets are required to specify an associated `configurePreset`. Visual Studio hides Build Presets that do not apply to the active Configure Preset. For more information, see [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset). If there are no Build Presets associated with the active Configure Preset, then Visual Studio will list the Default Build Preset. The Default Build Preset is equivalent to passing `cmake --build` with no other arguments from the command line. @@ -136,36 +131,36 @@ To build the entire project, select **Build** > **Build All** from the main menu To build a single target, switch to `CMake Targets View` in the `Solution Explorer`. Then right-click any target and select **Build** from the context menu. -> [!NOTE] Visual Studio 2019 does not support the `buildPresets.targets` option to build a subset of targets specified in CMakePresets.json. +> [!NOTE] Visual Studio 2019 does not support the `buildPresets.targets` option to build a subset of targets specified in `CMakePresets.json`. ## Run CTest -There are two menu options supported by CMakePresets.json in Visual Studio 2019. +There are two menu options supported by `CMakePresets.json` in Visual Studio 2019. - **Test** > **Run CTests** for invokes CTest and runs all tests associated with the active Configure Preset and Build Preset, with no additional arguments passed to CTest. - **Test** > **Run Test Preset** for will expand to show all Test Presets associated with the active Configure Preset. Selecting a single Test Preset is the same as running `ctest --preset ` from the command line, where `` is the name of the selected Test Preset. This option will be grayed out if no Test Presets are defined for the active Configure Preset. -In Visual Studio 2019 the Test Explorer is not integrated with CMakePresets.json. +In Visual Studio 2019 the Test Explorer is not integrated with `CMakePresets.json`. ## Add new presets -In Visual Studio 2019, all commands and preset templates modify `CMakePresets.json`. You can add new user-level presets by directly editing `CMakeUserPresets.json` +In Visual Studio 2019, all commands and preset templates modify . You can add new user-level presets by directly editing `CMakeUserPresets.json` -Use forward slashes (`/`) for paths in `CMakePresets.json` and `CMakeUserPresets.json`. +Use forward slashes (`/`) for paths in and `CMakeUserPresets.json`. ## Add new Configure Presets -To add a new Configure Preset to CMakePresets.json in the **Solution Explorer**, right-click CMakePresets.json from **Folder View** and select **Add Configure Preset…** from the context menu. The dialog to select a Configure Preset template opens: +To add a new Configure Preset to `CMakePresets.json` in the **Solution Explorer**, right-click `CMakePresets.json` from **Folder View** and select **Add Configure Preset…** from the context menu. The dialog to select a Configure Preset template opens: -![Add configure preset to CMakePresets.json dialog](./media/add-configure-preset-to-cmakepresets.PNG) +![Add configure preset to `CMakePresets.json` dialog](./media/add-configure-preset-to-cmakepresets.PNG) -Choose the **Windows x64 Debug** template to configure on Windows systems. Choose the **Linux Debug** template to configure on WSL and remote Linux systems. See for more information on editing CMakePresets.json. +Choose the **Windows x64 Debug** template to configure on Windows systems. Choose the **Linux Debug** template to configure on WSL and remote Linux systems. See for more information on editing `CMakePresets.json`. -The selected template will be added to CMakePresets.json if it exists. Otherwise, the template will be copied into a new CMakePresets.json. +The selected template will be added to `CMakePresets.json` if it exists. Otherwise, the template will be copied into a new `CMakePresets.json`. ## Add new Build Presets and Test Presets -Visual Studio 2019 does not offer templates for new Build Presets and Test Presets. Build Presets and Test Presets can be added by directly editing CMakePresets.json. See [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset), [Test Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#test-preset), or an for more information. +Visual Studio 2019 does not offer templates for new Build Presets and Test Presets. Build Presets and Test Presets can be added by directly editing `CMakePresets.json`. See [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset), [Test Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#test-preset), or an for more information. ## Edit presets @@ -265,7 +260,7 @@ By default, Visual Studio will use the IntelliSense mode that matches your speci ## Configure and build on a remote system or the Windows Subsystem for Linux (WSL) -With CMakePresets.json support in Visual Studio you can easily configure and build your project on Windows, WSL, and remote systems. The steps to your project on Windows, a remote system, or WSL are the same. However, there are a few behaviors that are specific to remote development. +With `CMakePresets.json` support in Visual Studio you can easily configure and build your project on Windows, WSL, and remote systems. The steps to your project on Windows, a remote system, or WSL are the same. However, there are a few behaviors that are specific to remote development. ## `${sourceDir}` behavior in remote copy scenarios @@ -298,9 +293,9 @@ You will see an error if you try to use the same Configure Preset on Windows and Vcpkg helps you manage C and C++ libraries on Windows, Linux, and macOS. A vcpkg toolchain file (`vcpkg.cmake`) must be passed to CMake to enable vcpkg integration. See the [vcpkg documentation](https://github.com/microsoft/vcpkg#vcpkg-overview) for more information. -Visual Studio no longer passes your vcpkg toolchain file to CMake automatically when CMakePresets.json integration is enabled. This eliminates Visual Studio specific behavior and ensures that your build can be reproduced from the command line. +Visual Studio no longer passes your vcpkg toolchain file to CMake automatically when `CMakePresets.json` integration is enabled. This eliminates Visual Studio specific behavior and ensures that your build can be reproduced from the command line. -Instead, set the path to `vcpkg.cmake` with the `VCPKG_ROOT` environment variable in CMakePresets.json: +Instead, set the path to `vcpkg.cmake` with the `VCPKG_ROOT` environment variable in `CMakePresets.json`: ```json "cacheVariables": { @@ -315,22 +310,22 @@ Instead, set the path to `vcpkg.cmake` with the `VCPKG_ROOT` environment variabl If you're already using a CMake toolchain file and want to enable vcpkg integration, then see [Using multiple toolchain files](https://github.com/microsoft/vcpkg/blob/master/docs/users/integration.md#using-multiple-toolchain-files) and follow those instructions to use an external toolchain file with a project using vcpkg. -## Variable substitution in launch.vs.json and tasks.vs.jso +## Variable substitution in `launch.vs.json` and tasks.vs.jso -CMakePresets.json supports variable substitution in launch.vs.json and tasks.vs.json. +`CMakePresets.json` supports variable substitution in `launch.vs.json` and tasks.vs.json. -* Environment variables set in the active Configure Preset will automatically flow through to launch.vs.json and tasks.vs.json configurations. You can unset individual environment variables in launch.vs.json and tasks.json by setting them to `null`. The following example sets the variable `DEBUG_LOGGING_LEVEL` to `null` in launch.vs.json: `"env": { "DEBUG_LOGGING_LEVEL": null }` +* Environment variables set in the active Configure Preset will automatically flow through to `launch.vs.json` and tasks.vs.json configurations. You can unset individual environment variables in `launch.vs.json` and tasks.json by setting them to `null`. The following example sets the variable `DEBUG_LOGGING_LEVEL` to `null` in `launch.vs.json`: `"env": { "DEBUG_LOGGING_LEVEL": null }` -* Key-values set in the active Configure Preset are available for consumption in launch.vs.json and tasks.vs.json with the syntax `${cmake.}`. For example, use ` ${cmake.binaryDir}` to reference the output directory of the active Configure Preset. -* Individual environment variables set in the environment map of the active Configure Preset are available for consumption in launch.vs.json and tasks.vs.json using the syntax `${env.}`. +* Key-values set in the active Configure Preset are available for consumption in `launch.vs.json` and tasks.vs.json with the syntax `${cmake.}`. For example, use ` ${cmake.binaryDir}` to reference the output directory of the active Configure Preset. +* Individual environment variables set in the environment map of the active Configure Preset are available for consumption in `launch.vs.json` and tasks.vs.json using the syntax `${env.}`. -Update your `launch.vs.json` and `task.vs.json` files to reference CMakePresets.json syntax instead of `CMakeSettings.json` syntax. Macros that reference the old `CMakeSettings.json` syntax when CMakePresets.json is the active configuration file will be deprecated in a future release. For example, reference the output directory of the active Configure Preset with `${cmake.binaryDir}` instead of `${cmake.buildRoot}`, because CMakePresets.json uses the `binaryDir` syntax. +Update your `launch.vs.json` and `task.vs.json` files to reference `CMakePresets.json` syntax instead of `CMakeSettings.json` syntax. Macros that reference the old `CMakeSettings.json` syntax when `CMakePresets.json` is the active configuration file will be deprecated in a future release. For example, reference the output directory of the active Configure Preset with `${cmake.binaryDir}` instead of `${cmake.buildRoot}`, because `CMakePresets.json` uses the `binaryDir` syntax. ## Troubleshooting If things aren’t working as expected, there are a few troubleshooting steps that you can take. -If either `CMakePresets.json` or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you are referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run `cmake --list-presets` from the command line at the root of your project directory (CMake 3.20 or higher is required). If either file is invalid, then you'll see the following error: +If either or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you are referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run `cmake --list-presets` from the command line at the root of your project directory (CMake 3.20 or higher is required). If either file is invalid, then you'll see the following error: ```DOS CMake Error: Could not read presets from @@ -350,9 +345,9 @@ You can enable logging for remote connections if you are having trouble connecti ## Enable AddressSanitizer for Windows and Linux -AddressSanitizer (ASan) is a runtime memory error detector for C and C++ that is supported in Visual Studio for both Windows and Linux development. AddressSanitizer was enabled with an option (`addressSanitizerEnabled`) in CMakeSettings.json. This behavior is not supported by CMakePresets.json. +AddressSanitizer (ASan) is a runtime memory error detector for C and C++ that is supported in Visual Studio for both Windows and Linux development. AddressSanitizer was enabled with an option (`addressSanitizerEnabled`) in `CMakeSettings.json`. This behavior is not supported by `CMakePresets.json`. -Instead, enable and disable AddressSanitizer by setting the required compiler and linker flags yourself. This removes Visual Studio specific behavior and ensures that the same CMakePresets.json file can reproduce your build from the command line. The following sample can be added to a CMakeLists.txt to enable or disable AddressSanitizer for a target. +Instead, enable and disable AddressSanitizer by setting the required compiler and linker flags yourself. This removes Visual Studio specific behavior and ensures that the same `CMakePresets.json` file can reproduce your build from the command line. The following sample can be added to a CMakeLists.txt to enable or disable AddressSanitizer for a target. ``` option(ASAN_ENABLED "Build this target with AddressSanitizer" ON) @@ -369,11 +364,11 @@ endif() `` are other compilation flags like `"-fno-omit-frame-pointer"`. See [Using AddressSanitizer](https://docs.microsoft.com/cpp/sanitizers/asan?view=msvc-160#command-prompt) for more information on ASan for Linux, and Use the AddressSanitizer from a Developer Command Prompt for more information on ASan with MSVC. -Pass additional runtime flags to AddressSanitizer with the `ASAN_OPTIONS` field in launch.vs.json. `ASAN_OPTIONS` defaults to `detect_leaks=0` when no other runtime options are specified because LeakSanitizer is not supported in Visual Studio. +Pass additional runtime flags to AddressSanitizer with the `ASAN_OPTIONS` field in `launch.vs.json`. `ASAN_OPTIONS` defaults to `detect_leaks=0` when no other runtime options are specified because LeakSanitizer is not supported in Visual Studio. ## Run CMake from the command line or a Continuous Integration (CI) pipeline -You can use the same `CMakePresets.json` and `CMakeUserPresets.json` files to invoke CMake in Visual Studio and from the command line. The [CMake](https://cmake.org/cmake/help/latest/manual/cmake.1.html) and [CTest](https://cmake.org/cmake/help/latest/manual/ctest.1.html) documentation are the best resources for invoking CMake and CTest with `--preset`. CMake version 3.20 or higher is required. +You can use the same and `CMakeUserPresets.json` files to invoke CMake in Visual Studio and from the command line. The [CMake](https://cmake.org/cmake/help/latest/manual/cmake.1.html) and [CTest](https://cmake.org/cmake/help/latest/manual/ctest.1.html) documentation are the best resources for invoking CMake and CTest with `--preset`. CMake version 3.20 or higher is required. ## Sourcing the environment when building with command line generators on Windows @@ -385,7 +380,7 @@ This is the same step that Visual Studio takes for you when CMake is invoked by ## Example command line workflow -The following commands can be used to configure and build a CMake project that uses Ninja to target arm64 with x64 build tools. CMake version 3.20 or higher is required. Run these commands from the directory where your CMakePresets.json is located: +The following commands can be used to configure and build a CMake project that uses Ninja to target arm64 with x64 build tools. CMake version 3.20 or higher is required. Run these commands from the directory where your `CMakePresets.json` is located: ```DOS /path/to/vcvarsall.bat x64_arm64 @@ -394,9 +389,9 @@ cmake --preset cmake --build --preset ``` -## Example `CMakePresets.json` file +## Example file -See the `CMakePresets.json` file checked in the [box2d-lite](https://github.com/esweet431/box2d-lite/blob/main/`CMakePresets.json`) code sample. It contains examples of Configure Presets, Build Presets, and Test Presets. +See the file checked in the [box2d-lite](https://github.com/esweet431/box2d-lite/blob/main/) code sample. It contains examples of Configure Presets, Build Presets, and Test Presets. ## Next steps From 2c17dff9068d1cba994cddc0ba89ef72fda5e3ad Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Sat, 3 Apr 2021 12:51:13 -0700 Subject: [PATCH 26/82] add cmake presets json reference draft --- docs/build/cmake-presets-json-reference.md | 110 +++++++++++++++++++++ docs/build/toc.yml | 2 + 2 files changed, 112 insertions(+) create mode 100644 docs/build/cmake-presets-json-reference.md diff --git a/docs/build/cmake-presets-json-reference.md b/docs/build/cmake-presets-json-reference.md new file mode 100644 index 00000000000..883aab5c50b --- /dev/null +++ b/docs/build/cmake-presets-json-reference.md @@ -0,0 +1,110 @@ +--- +description: "Schema reference for `CMakePresets.json` and `CMakeUserPresets.json` vendor maps" +title: "`CMakeUserPresets.json` " +ms.date: "4/13/2021" +helpviewer_keywords: ["CMake in Visual C++"] +--- +# `CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps + +CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. `CMakePresets.json` and `CMakeUserPresets.json` can be used to drive CMake in Visual Studio, in Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. + +This article contains information on the Microsoft vendor maps and macro expansion. For more information Configure Presets, Build Presets, and Test Presets, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). For more information on how to use `CMakePresets.json` in Visual Studio and Visual Studio Code, see and . + +## Visual Studio Settings vendor map + +One vendor map with the vendor URI` microsoft.com/VisualStudioSettings/CMake/` is allowed per Configure Preset and contains options specific to CMake integration in Visual Studio and Visual Studio Code. All options in the vendor map apply to Visual Studio. Options that apply to both Visual Studio and Visual Studio Code have been explicitly marked. + +All settings in the Visual Studio Settings vendor map are optional and inherited from Configure Presets specified by the inherits key. Only options that have been modified are written to the file. The Visual Studio Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. + +None of the options in the Visual Studio Settings vendor map impact the construction of the CMake or CTest command line. This ensures that the same `CMakePresets.json` file can be used to drive CMake with Visual Studio, Visual Studio Code, and from the command line. The exceptions to this are the cacheRoot and cmakeGenerateCommand options. These options are specific to the[ Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio and cannot be reproduced from the command line. + +| Setting | Description | +|--|--| +| `hostOS` | An array of supported operating systems (OS). Accepted values are `Windows`, `Linux`, and `macOS`.

    The value of `hostOS` is used by Visual Studio and Visual Studio Code to hide Configure Presets that do not apply to the OS of the target system and provide a better user experience.

    If `hostOS` is unspecified, then Visual Studio and Visual Studio Code will always show all Configure Presets for selection. This field can also be a string, which is equivalent to an array containing one string

    This option is supported by both Visual Studio and Visual Studio Code. | +| `intelliSenseMode` | Specifies the mode used for computing IntelliSense information in Visual Studio with the format `--`.

    Accepted values:

    android-clang-arm
    android-clang-arm64
    android-clang-x6
    android-clang-x86
    ios-clang-ar
    ios-clang-arm64
    ios-clang-x6
    ios-clang-x86
    linux-gcc-arm
    linux-gcc-x64
    linux-gcc-x86
    windows-clang-arm
    windows-clang-arm64
    windows-clang-x64
    windows-clang-x86
    windows-msvc-arm
    windows-msvc-arm64
    windows-msvc-x64
    windows-msvc-x86

    If `intelliSenseMode` is unspecified, then Visual Studio will use the IntelliSense mode that matches your specified compilers and target architecture.

    `intelliSenseMode` is generally used to provide accurate IntelliSense for cross-compilation.

    In Visual Studio 2019 you must explicitly specify a clang IntelliSense mode when building with clang or clang-cl. | +| `intelliSenseOptions` | A map of additional IntelliSense configuration options.

    `useCompilerDefaults`: A `bool` that specifies whether to use the compilers’ default defines and include paths for IntelliSense. Should only be `false` if the compilers in use do not support gcc-style arguments. Defaults to `true`.

    `additionalCompilerArgs`: An array of additional options to control IntelliSense in Visual Studio. This option supports macro expansion. | +| `enableMicrosoftCodeAnalysis` | A `bool` that enables Microsoft code analysis in Visual Studio when building with `cl` or `clang-cl`. Defaults to `false`. | +| `codeAnalysisRulset` | Specifies the ruleset to use when running Microsoft code analysis in Visual Studio. This can be a path to a ruleset file, or the name of a ruleset file installed with Visual Studio. This option supports macro expansion. | +| `disableExternalAnalysis` | A `bool` that specifies whether code analysis should run on external headers in Visual Studio. | +| `codeAnalysisExternalRuleset` | Specifies the ruleset to use when running Microsoft code analysis on external header in Visual Studio. This can be a path to a ruleset file, or the name of a ruleset file installed with Visual Studio. This option supports macro expansion. | +| `enableClangTidyCodeAnalysis` | A bool that enables clang-tidy code analysis in Visual Studio when building with `clang-cl`. Defaults to `false`. | +| `clangTidyChecks` | A comma separated list of warnings passed to clang-tidy when running clang-tidy code analysis in Visual Studio. Wildcards are allowed, and the `–` prefix will remove checks. | +| `cacheRoot` | Specifies the path to a CMake cache. This directory should contain an existing `CMakeCache.txt` file. This key is only supported by the Open Existing Cache scenario in Visual Studio. This option supports macro expansion. | +| `cmakeGenerateCommand` | A command line tool (specified as a command line program + arguments, e.g., “gencache.bat debug”) to generate the CMake cache. This command will run from the shell in the preset’s specified environment when CMake configure is invoked. This key is only supported by the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio. This option supports macro expansion | + +## Visual Studio Remote Settings vendor map + +One vendor map with the vendor URI` microsoft.com/VisualStudioRemoteSettings/CMake/` is allowed per Configure Preset and contains options specific to remote development in Visual Studio. Remote development means you are invoking CMake on a remote SSH connection or WSL. None of the options in the Visual Studio Remote Settings vendor map apply to Visual Studio Code. + +All settings in the Visual Studio Remote Settings vendor map are optional and inherited from Configure Presets specified by the inherits key. Only options that have been modified are written to the file. The Visual Studio Remote Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. + +None of the options in the Visual Studio Settings vendor map impact the construction of the CMake or CTest command line. This ensures that the same `CMakePresets.json` file can be used to drive CMake with Visual Studio, Visual Studio Code, and from the command line. + +Many of the options in the Visual Studio Remote Settings vendor map are ignored when targeting WSL1. This is because the WSL1 toolset executes all commands locally and relies on Windows drives mounted under the /mnt folder to access local source files from WSL1. No source file copy is required. Options that are ignored when targeting WSL1 have been explicitly marked. + +| Setting | Description | +|--|--| +|`sourceDir` | Path to the directory on the remote system where the project will be copied. Defaults to `$env{HOME}/.vs/$ms{projectDirName}`. This option supports macro expansion.
    In remote copy scenarios, the macro` ${sourceDir}` evaluates to the project source directory on the remote system and not the project source directory on the Windows machine. Remote copy scenarios include targeting a remote SSH connection. In these cases, the project source directory on the remote system will be determined by the value of sourceDir in the Visual Studio Remote Settings vendor map. This option is ignored when targeting WSL1. | +|copySources | If `true`, Visual Studio will copy sources from Windows to the remote system. Set to false if you manage file synchronization yourself. Defaults to true. This option is ignored when targeting WSL1. | +|copySourcesOptions | An object of options related to the source copy from Windows to the remote system. This object is ignored when targeting WSL1.

    `copySourcesOptions.exclusionList`: A list of paths to be excluded when copying source files to the remote system. A path can be the name of a file or directory, or a path relative to the root of the copy. Defaults to `[ “.vs”, “.git”, “out” ]`. This option supports macro expansion.

    `copySourcesOptions.method`: The method used to copy source files to the remote system. Accepted values are `rsync` and `sftp`. Defaults to `rsync`.

    `copySourcesOptions.concurrentCopies`: The number of concurrent copies used during the synchronization of sources to the remote system. Defaults to 5.

    `copySourcesOptions.outputVerbosity`: The verbosity level of source copy operations to the remote system. Accepted levels are `Normal`, `Verbose`, and `Diagnostic`. Defaults to `Normal`.| +|`rsyncCommandArgs` | A list of additional command line arguments passed to `rsync`. Defaults to `[ “-t”, “--delete", “--delete-excluded” ]`. This option supports macro expansion and is ignored when targeting WSL1. | +|`copyBuildOutput` | Specifies whether to copy build output from the remote system back to Windows. Defaults to `false`. This option is ignored when targeting WSL1. | +|copyOptimizations | An object of options related to source copy optimizations. These options are ignored when targeting WSL1.

    `copyOptimizations.maxSmallChange`: The maximum number of files to copy using sftp instead of rsync. Defaults to 10.

    `copyOptimizations.useOptimizations`: Specifies the copy optimizations in use. Accepted values are no copy optimizations (`None`), rsync only optimizations (`RsyncOnly`), or rsync and sftp optimizations (`RsyncAndSftp`). Defaults to `RsyncAndSftp`.

    `copyOptimizations.rsyncSingleDirectoryCommandArgs`: A list of additional command line arguments passed to rsync when copying the contents of a single directory to the remote system. Defaults to `[ “-t”, “-d” ]`. This option supports macro expansion. | +|`copyAdditionalIncludeDirectoriesList` | A list of paths to remote header directories to be copied locally for IntelliSense. This option supports macro expansion. | +|`copyExcludeDirectoriesList` | A list of paths to remote header directories to not be copied locally for IntelliSense. This option supports macro expansion. | +|`forceWSL1Toolset` | If `true`, Visual Studio will always use the WSL1 toolset when targeting WSL from Visual Studio. The WSL1 toolset executes all commands locally and relies on Windows drives mounted under the /mnt folder to access local source files from WSL. These options may be slower with WSL2. Defaults to `false`.
    The WSL1 toolset will always be used in Visual Studio 2019 version 16.10. This option will be relevant once native support for WSL2 is available. | + +## Remote pre-build and post-build events + +Options for a `remotePrebuildEvent` and `remotePostbuildEvent` have been deprecated with the adoption of `CMakePresets.json`. + + Encode pre-build, pre-link, and post-build events in your CMakeLists.txt using [add_custom_command](https://cmake.org/cmake/help/latest/command/add_custom_command.html#build-events). This will ensure the same behavior when building with Visual Studio and from the command line. + +Alternatively, if you need behavior that is specific to Visual Studio, you can add a custom remote task in` tasks.vs.json`. To get started, right-click on your root `CMakeLists.txt` in the **Solution Explorer** from**Folder View**and select **Configure Tasks**. You can then [add a new remote task](https://docs.microsoft.com/cpp/build/tasks-vs-json-schema-reference-cpp?view=msvc-160#remote-properties) to your `tasks.vs.json` file. + +The following remote task creates a directory called test on the remote Linux system: + +```json +{ + "taskLabel": "mkdir", + "appliesTo": "CMakeLists.txt", + "type": "remote", + "command": "mkdir test", + "remoteMachineName": "localhost" + } +``` + +Right-click on any `CMakeLists.txt` and select the **mkdir** option to execute this task. + +The value of `remoteMachineName` must match the Host Name of a connection in the **Connection Manager**. + +## Microsoft vendor macros + +Our vendor maps support all the macros defined by CMake. See [cmake-presets Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. All macros and environment variables are expanded before being passed to cmake.exe. + +Visual Studio supports vendor macros with the prefix ms. Microsoft vendor macros can only be used in Microsoft vendor maps. CMake will not be able to use presets that have vendor macros outside of a vendor map. + +|Macro |Description | +|---------|---------| +|`$ms{projectDirName}`| Evaluates to the name of the open folder in Visual Studio. This macro is used to set the default value of `sourceDir` in remote copy scenarios. This macro is not supported by Visual Studio Code. Use `${sourceDirName}` instead. | + +## Environment variables + +|Macro |Description | +|---------|---------| +| `$env{}`
    `$penv{}`| Reference environment variables using this syntax supported by CMake. | + +## Deprecated macros + +A few macros that were supported by CMakeSettings.json have been deprecated with the adoption of `CMakePresets.json`. + +Use the macros supported by CMake to construct your file paths. This will ensure that the same `CMakePresets.json` file works inside Visual Studio and from the command line. + +| Deprecated macro | Recommendation | +|---------|---------| +|`${projectFile} ` | `${sourceDir}/CMakeLists.txt` | +| `${thisFile}` | ` ${sourceDir}/`CMakePresets.json` ` | + +## Accepted shell syntax + +Use the `$env{HOME}` syntax to reference `$HOME` when constructing Linux paths in the Microsoft vendor maps. \ No newline at end of file diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 199f67cca20..b62334c2653 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -63,6 +63,8 @@ href: ../build/../linux/cmake-linux-project.md - name: Configure and build with CMake presets href: ../build/cmake-presets.md + - name: CMakePresets.json reference + href: ../build/cmake-presets-json-reference.md - name: Customize CMake build settings href: ../build/customize-cmake-settings.md - name: Configure CMake debugging sessions From d436120f2d87ee58b9b12f6f535745b0383ac346 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 5 Apr 2021 13:20:08 -0700 Subject: [PATCH 27/82] draft --- docs/build/cmake-presets-json-reference.md | 38 +++++---- docs/build/cmake-presets-vs.md | 95 ++++++++++++---------- docs/build/toc.yml | 2 +- 3 files changed, 76 insertions(+), 59 deletions(-) diff --git a/docs/build/cmake-presets-json-reference.md b/docs/build/cmake-presets-json-reference.md index 883aab5c50b..3c05330a757 100644 --- a/docs/build/cmake-presets-json-reference.md +++ b/docs/build/cmake-presets-json-reference.md @@ -1,42 +1,48 @@ --- -description: "Schema reference for `CMakePresets.json` and `CMakeUserPresets.json` vendor maps" +description: "Schema reference for `CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps" title: "`CMakeUserPresets.json` " ms.date: "4/13/2021" helpviewer_keywords: ["CMake in Visual C++"] --- # `CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps -CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. `CMakePresets.json` and `CMakeUserPresets.json` can be used to drive CMake in Visual Studio, in Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. +CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. -This article contains information on the Microsoft vendor maps and macro expansion. For more information Configure Presets, Build Presets, and Test Presets, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). For more information on how to use `CMakePresets.json` in Visual Studio and Visual Studio Code, see and . +`CMakePresets.json` and `CMakeUserPresets.json` can be used to drive CMake in Visual Studio, in Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. + +`CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. They schema for both files is identical. + +`CMakePresets.json` and `CMakeUserPresets.json` are how Microsoft provides a "vendor map" to add VS/VS Code specific options. Here we document the Microsoft vendor maps and macro expansion. To see documentation for the rest of the schema, and about Configure Presets, Build Presets, and Test Presets, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). + +For more information on how to use `CMakePresets.json` in Visual Studio and Visual Studio Code, see and . ## Visual Studio Settings vendor map One vendor map with the vendor URI` microsoft.com/VisualStudioSettings/CMake/` is allowed per Configure Preset and contains options specific to CMake integration in Visual Studio and Visual Studio Code. All options in the vendor map apply to Visual Studio. Options that apply to both Visual Studio and Visual Studio Code have been explicitly marked. -All settings in the Visual Studio Settings vendor map are optional and inherited from Configure Presets specified by the inherits key. Only options that have been modified are written to the file. The Visual Studio Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. +All settings in the Visual Studio Settings vendor map are optional and inherited from Configure Presets specified by the `inherits` key. Only options that have been modified are written to the file. The Visual Studio Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. None of the options in the Visual Studio Settings vendor map impact the construction of the CMake or CTest command line. This ensures that the same `CMakePresets.json` file can be used to drive CMake with Visual Studio, Visual Studio Code, and from the command line. The exceptions to this are the cacheRoot and cmakeGenerateCommand options. These options are specific to the[ Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio and cannot be reproduced from the command line. | Setting | Description | |--|--| -| `hostOS` | An array of supported operating systems (OS). Accepted values are `Windows`, `Linux`, and `macOS`.

    The value of `hostOS` is used by Visual Studio and Visual Studio Code to hide Configure Presets that do not apply to the OS of the target system and provide a better user experience.

    If `hostOS` is unspecified, then Visual Studio and Visual Studio Code will always show all Configure Presets for selection. This field can also be a string, which is equivalent to an array containing one string

    This option is supported by both Visual Studio and Visual Studio Code. | -| `intelliSenseMode` | Specifies the mode used for computing IntelliSense information in Visual Studio with the format `--`.

    Accepted values:

    android-clang-arm
    android-clang-arm64
    android-clang-x6
    android-clang-x86
    ios-clang-ar
    ios-clang-arm64
    ios-clang-x6
    ios-clang-x86
    linux-gcc-arm
    linux-gcc-x64
    linux-gcc-x86
    windows-clang-arm
    windows-clang-arm64
    windows-clang-x64
    windows-clang-x86
    windows-msvc-arm
    windows-msvc-arm64
    windows-msvc-x64
    windows-msvc-x86

    If `intelliSenseMode` is unspecified, then Visual Studio will use the IntelliSense mode that matches your specified compilers and target architecture.

    `intelliSenseMode` is generally used to provide accurate IntelliSense for cross-compilation.

    In Visual Studio 2019 you must explicitly specify a clang IntelliSense mode when building with clang or clang-cl. | -| `intelliSenseOptions` | A map of additional IntelliSense configuration options.

    `useCompilerDefaults`: A `bool` that specifies whether to use the compilers’ default defines and include paths for IntelliSense. Should only be `false` if the compilers in use do not support gcc-style arguments. Defaults to `true`.

    `additionalCompilerArgs`: An array of additional options to control IntelliSense in Visual Studio. This option supports macro expansion. | +| `hostOS` | An array of supported operating systems (OS). Accepted values are `Windows`, `Linux`, and `macOS`.

    The value of `hostOS` is used by Visual Studio and Visual Studio Code to hide Configure Presets that don't apply to the OS of the target system and provide a better user experience.

    If `hostOS` is unspecified, then Visual Studio and Visual Studio Code will always show all Configure Presets for selection. This field can also be a string, which is equivalent to an array containing one string

    This option is supported by both Visual Studio and Visual Studio Code. | +| `intelliSenseMode` | Specifies the mode used for computing IntelliSense information in Visual Studio with the format `--`.

    Accepted values:

    android-clang-arm
    android-clang-arm64
    android-clang-x6
    android-clang-x86
    ios-clang-ar
    ios-clang-arm64
    ios-clang-x6
    ios-clang-x86
    linux-gcc-arm
    linux-gcc-x64
    linux-gcc-x86
    windows-clang-arm
    windows-clang-arm64
    windows-clang-x64
    windows-clang-x86
    windows-msvc-arm
    windows-msvc-arm64
    windows-msvc-x64
    windows-msvc-x86

    If `intelliSenseMode` is unspecified, then Visual Studio will use the IntelliSense mode that matches your specified compilers and target architecture.

    `intelliSenseMode` is used to provide accurate IntelliSense for cross-compilation.

    In Visual Studio 2019, you must explicitly specify a clang IntelliSense mode when building with clang or clang-cl. | +| `intelliSenseOptions` | A map of additional IntelliSense configuration options.

    `useCompilerDefaults`: A `bool` that specifies whether to use the compilers’ default defines and include paths for IntelliSense. Should only be `false` if the compilers in use don't support gcc-style arguments. Defaults to `true`.

    `additionalCompilerArgs`: An array of additional options to control IntelliSense in Visual Studio. This option supports macro expansion. | | `enableMicrosoftCodeAnalysis` | A `bool` that enables Microsoft code analysis in Visual Studio when building with `cl` or `clang-cl`. Defaults to `false`. | | `codeAnalysisRulset` | Specifies the ruleset to use when running Microsoft code analysis in Visual Studio. This can be a path to a ruleset file, or the name of a ruleset file installed with Visual Studio. This option supports macro expansion. | | `disableExternalAnalysis` | A `bool` that specifies whether code analysis should run on external headers in Visual Studio. | | `codeAnalysisExternalRuleset` | Specifies the ruleset to use when running Microsoft code analysis on external header in Visual Studio. This can be a path to a ruleset file, or the name of a ruleset file installed with Visual Studio. This option supports macro expansion. | | `enableClangTidyCodeAnalysis` | A bool that enables clang-tidy code analysis in Visual Studio when building with `clang-cl`. Defaults to `false`. | -| `clangTidyChecks` | A comma separated list of warnings passed to clang-tidy when running clang-tidy code analysis in Visual Studio. Wildcards are allowed, and the `–` prefix will remove checks. | +| `clangTidyChecks` | A comma-separated list of warnings passed to clang-tidy when running clang-tidy code analysis in Visual Studio. Wildcards are allowed, and the `–` prefix will remove checks. | | `cacheRoot` | Specifies the path to a CMake cache. This directory should contain an existing `CMakeCache.txt` file. This key is only supported by the Open Existing Cache scenario in Visual Studio. This option supports macro expansion. | -| `cmakeGenerateCommand` | A command line tool (specified as a command line program + arguments, e.g., “gencache.bat debug”) to generate the CMake cache. This command will run from the shell in the preset’s specified environment when CMake configure is invoked. This key is only supported by the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio. This option supports macro expansion | +| `cmakeGenerateCommand` | A command-line tool (specified as a command-line program + arguments, for example, “gencache.bat debug”) to generate the CMake cache. This command will run from the shell in the preset’s specified environment when CMake configure is invoked. This key is only supported by the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio. This option supports macro expansion | ## Visual Studio Remote Settings vendor map -One vendor map with the vendor URI` microsoft.com/VisualStudioRemoteSettings/CMake/` is allowed per Configure Preset and contains options specific to remote development in Visual Studio. Remote development means you are invoking CMake on a remote SSH connection or WSL. None of the options in the Visual Studio Remote Settings vendor map apply to Visual Studio Code. +One vendor map with the vendor URI` microsoft.com/VisualStudioRemoteSettings/CMake/` is allowed per Configure Preset and contains options specific to remote development in Visual Studio. Remote development means you're invoking CMake on a remote SSH connection or WSL. None of the options in the Visual Studio Remote Settings vendor map apply to Visual Studio Code. -All settings in the Visual Studio Remote Settings vendor map are optional and inherited from Configure Presets specified by the inherits key. Only options that have been modified are written to the file. The Visual Studio Remote Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. +All settings in the Visual Studio Remote Settings vendor map are optional and inherited from Configure Presets specified by the `inherits` key. Only options that have been modified are written to the file. The Visual Studio Remote Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. None of the options in the Visual Studio Settings vendor map impact the construction of the CMake or CTest command line. This ensures that the same `CMakePresets.json` file can be used to drive CMake with Visual Studio, Visual Studio Code, and from the command line. @@ -47,9 +53,9 @@ Many of the options in the Visual Studio Remote Settings vendor map are ignored |`sourceDir` | Path to the directory on the remote system where the project will be copied. Defaults to `$env{HOME}/.vs/$ms{projectDirName}`. This option supports macro expansion.
    In remote copy scenarios, the macro` ${sourceDir}` evaluates to the project source directory on the remote system and not the project source directory on the Windows machine. Remote copy scenarios include targeting a remote SSH connection. In these cases, the project source directory on the remote system will be determined by the value of sourceDir in the Visual Studio Remote Settings vendor map. This option is ignored when targeting WSL1. | |copySources | If `true`, Visual Studio will copy sources from Windows to the remote system. Set to false if you manage file synchronization yourself. Defaults to true. This option is ignored when targeting WSL1. | |copySourcesOptions | An object of options related to the source copy from Windows to the remote system. This object is ignored when targeting WSL1.

    `copySourcesOptions.exclusionList`: A list of paths to be excluded when copying source files to the remote system. A path can be the name of a file or directory, or a path relative to the root of the copy. Defaults to `[ “.vs”, “.git”, “out” ]`. This option supports macro expansion.

    `copySourcesOptions.method`: The method used to copy source files to the remote system. Accepted values are `rsync` and `sftp`. Defaults to `rsync`.

    `copySourcesOptions.concurrentCopies`: The number of concurrent copies used during the synchronization of sources to the remote system. Defaults to 5.

    `copySourcesOptions.outputVerbosity`: The verbosity level of source copy operations to the remote system. Accepted levels are `Normal`, `Verbose`, and `Diagnostic`. Defaults to `Normal`.| -|`rsyncCommandArgs` | A list of additional command line arguments passed to `rsync`. Defaults to `[ “-t”, “--delete", “--delete-excluded” ]`. This option supports macro expansion and is ignored when targeting WSL1. | +|`rsyncCommandArgs` | A list of additional command-line arguments passed to `rsync`. Defaults to `[ “-t”, “--delete", “--delete-excluded” ]`. This option supports macro expansion and is ignored when targeting WSL1. | |`copyBuildOutput` | Specifies whether to copy build output from the remote system back to Windows. Defaults to `false`. This option is ignored when targeting WSL1. | -|copyOptimizations | An object of options related to source copy optimizations. These options are ignored when targeting WSL1.

    `copyOptimizations.maxSmallChange`: The maximum number of files to copy using sftp instead of rsync. Defaults to 10.

    `copyOptimizations.useOptimizations`: Specifies the copy optimizations in use. Accepted values are no copy optimizations (`None`), rsync only optimizations (`RsyncOnly`), or rsync and sftp optimizations (`RsyncAndSftp`). Defaults to `RsyncAndSftp`.

    `copyOptimizations.rsyncSingleDirectoryCommandArgs`: A list of additional command line arguments passed to rsync when copying the contents of a single directory to the remote system. Defaults to `[ “-t”, “-d” ]`. This option supports macro expansion. | +|copyOptimizations | An object of options related to source copy optimizations. These options are ignored when targeting WSL1.

    `copyOptimizations.maxSmallChange`: The maximum number of files to copy using sftp instead of rsync. Defaults to 10.

    `copyOptimizations.useOptimizations`: Specifies the copy optimizations in use. Accepted values are no copy optimizations (`None`), rsync only optimizations (`RsyncOnly`), or rsync and sftp optimizations (`RsyncAndSftp`). Defaults to `RsyncAndSftp`.

    `copyOptimizations.rsyncSingleDirectoryCommandArgs`: A list of additional command-line arguments passed to rsync when copying the contents of a single directory to the remote system. Defaults to `[ “-t”, “-d” ]`. This option supports macro expansion. | |`copyAdditionalIncludeDirectoriesList` | A list of paths to remote header directories to be copied locally for IntelliSense. This option supports macro expansion. | |`copyExcludeDirectoriesList` | A list of paths to remote header directories to not be copied locally for IntelliSense. This option supports macro expansion. | |`forceWSL1Toolset` | If `true`, Visual Studio will always use the WSL1 toolset when targeting WSL from Visual Studio. The WSL1 toolset executes all commands locally and relies on Windows drives mounted under the /mnt folder to access local source files from WSL. These options may be slower with WSL2. Defaults to `false`.
    The WSL1 toolset will always be used in Visual Studio 2019 version 16.10. This option will be relevant once native support for WSL2 is available. | @@ -60,7 +66,7 @@ Options for a `remotePrebuildEvent` and `remotePostbuildEvent` have been depreca Encode pre-build, pre-link, and post-build events in your CMakeLists.txt using [add_custom_command](https://cmake.org/cmake/help/latest/command/add_custom_command.html#build-events). This will ensure the same behavior when building with Visual Studio and from the command line. -Alternatively, if you need behavior that is specific to Visual Studio, you can add a custom remote task in` tasks.vs.json`. To get started, right-click on your root `CMakeLists.txt` in the **Solution Explorer** from**Folder View**and select **Configure Tasks**. You can then [add a new remote task](https://docs.microsoft.com/cpp/build/tasks-vs-json-schema-reference-cpp?view=msvc-160#remote-properties) to your `tasks.vs.json` file. +Alternatively, if you need behavior that is specific to Visual Studio, you can add a custom remote task in` tasks.vs.json`. To get started, right-click on your root `CMakeLists.txt` in the **Solution Explorer** from**Folder View** and select **Configure Tasks**. You can then [add a new remote task](https://docs.microsoft.com/cpp/build/tasks-vs-json-schema-reference-cpp?view=msvc-160#remote-properties) to your `tasks.vs.json` file. The following remote task creates a directory called test on the remote Linux system: @@ -80,9 +86,9 @@ The value of `remoteMachineName` must match the Host Name of a connection in the ## Microsoft vendor macros -Our vendor maps support all the macros defined by CMake. See [cmake-presets Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. All macros and environment variables are expanded before being passed to cmake.exe. +CMakePresets.json and CMakeUserPresets.json allow “vendor maps” for vendors (like Microsoft) to add VS/VS Code specific options. Our vendor maps support all the macros defined by CMake. See [cmake-presets Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. All macros and environment variables are expanded before being passed to cmake.exe. -Visual Studio supports vendor macros with the prefix ms. Microsoft vendor macros can only be used in Microsoft vendor maps. CMake will not be able to use presets that have vendor macros outside of a vendor map. +Visual Studio supports vendor macros with the prefix ms. Microsoft vendor macros can only be used in Microsoft vendor maps. CMake can't use presets that have vendor macros outside of a vendor map. |Macro |Description | |---------|---------| diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index b2e75e6c6c6..046b4249b76 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -4,35 +4,42 @@ description: "Reference for using CMake presets to configure and build CMake pro ms.topic: reference ms.date: "04/13/2020" --- + # Configure and build with CMake presets CMake supports two files, and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. - and `CMakeUserPresets.json` can be used to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. + Use `CMakePresets.json` and `CMakeUserPresets.json` to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. -This article contains information about integration in Visual Studio. For more information on the format of , see the official [CMake Tools documentation](README.md). For more information on the Microsoft vendor maps and macro expansion, see . For more information on how to use in Visual Studio Code, see . +This article contains information about `CMakePresets.json` integration in Visual Studio. +- For more information on the format of `CMakePresets.json`, see the official [CMake Tools documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1). +- For more information on the Microsoft vendor maps and macro expansion, see [`CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps](cmake-presets-json-reference.md). +- For more information on how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with CMake Preset](https://github.com/microsoft/vscode-cmake-tools/tree/develop/docs/cmake-presets.md). - is a recommended alternative to `CMakeSettings.json`. Visual Studio will never read from both `CMakePresets.json` and `CMakeSettings.json` at the same time. See to enable or disable `CMakePresets.json` integration in Visual Studio. + `CMakePresets.json` is a recommended alternative to `CMakeSettings.json`. Visual Studio will never read from both `CMakePresets.json` and `CMakeSettings.json` at the same time. See [Enable `CMakePresets.json` in Visual Studio 2019](#enable_cmakepresets.json_integration_in_visual_studio_2019) to enable or disable `CMakePresets.json` integration in Visual Studio. -## Supported CMake and versions +## Supported CMake and `CMakePresets.json` versions -The CMake Tools extension supports and `CMakeUserPresets.json` files version 2 or higher. You can update your file version by incrementing the version field in the root object. For an example and more information, see [](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#format). +The CMake Tools extension supports `CMakePresets.json` and `CMakeUserPresets.json` files version 2 or higher. You can update your file version by incrementing the version field in the root object. For an example and more information, see [`CMakePresets.json` format](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#format). -CMake version 3.20 or higher is required when invoking CMake with (version 2 or higher) from the command line. However, Visual Studio reads and evaluates `CMakePresets.json` and CMakeUserPresets.json itself and does not invoke CMake directly with the `--preset` option. This means CMake version 3.20 or higher is not strictly required when building with `CMakePresets.json` inside Visual Studio. Use at least CMake version 3.14 or higher. +CMake version 3.20 or higher is required when invoking CMake with `CMakePresets.json` (version 2 or higher) from the command line. However, Visual Studio reads and evaluates `CMakePresets.json` and `CMakeUserPresets.json` itself and does not invoke CMake directly with the `--preset` option. This means CMake version 3.20 or higher is not strictly required when building with `CMakePresets.json` inside Visual Studio. Use at least CMake version 3.14 or higher. -## Enable in Visual Studio 2019 +## Enable `CMakePresets.json` integration in Visual Studio 2019 `CMakePresets.json` integration is not enabled by default in Visual Studio 2019. You can enable `CMakePresets.json` integration for all CMake projects in Tools > Options > CMake > General: ![Enable `CMakePresets.json` in CMake options > General](./media/enable-cmakepresets.PNG) -> [!Important] You must close and reopen the folder in Visual Studio to activate the integration. +> [!Important] +> You must close and reopen the folder in Visual Studio to activate the integration. If you do not want to enable `CMakePresets.json` integration for all CMake projects, then you can enable `CMakePresets.json` integration for a single CMake project by adding a `CMakePresets.json` file to the root of the open folder. You must close and reopen the folder in Visual Studio to activate the integration. -The following table indicates when `CMakePresets.json` will be used instead of `CMakeSettings.json` to drive CMake configuration and build. **Tools** > **Options** enabled means **Use `CMakePresets.json` to drive CMake configure, build, and test** is selected in **Tools** > **Options** > **CMake** > **General**. +The following table indicates when `CMakePresets.json` is used instead of `CMakeSettings.json` to drive CMake configuration and build. + +Key: **Tools** > **Options** enabled means **Use `CMakePresets.json` to drive CMake configure, build, and test** is selected in **Tools** > **Options** > **CMake** > **General**. -If no configuration file is present, then default Configure Presets are used. +If no configuration file is present, then default Configure Presets are used. | Configuration files | Tools > Options disabled | Tools > Options enabled | |--|--|--| @@ -45,9 +52,9 @@ If no configuration file is present, then default Configure Presets are used. By default, Visual Studio will automatically invoke configure each time the active Target System or Configure Preset changes. You can modify this behavior by selecting **Never run configure step automatically** in **Tools** > **Options** > **CMake** > **General**. You can also disable all CMake cache notifications (gold bars) by deselecting **Show CMake cache notifications**. -## Default Configure Presets +## Default configure presets -If no `CMakePresets.json` or CMakeUserPresets.json file exists, or if `CMakePresets.json` or CMakeUserPresets.json are invalid, then Visual Studio will fall back on the following default Configure Presets: +If no `CMakePresets.json` or `CMakeUserPresets.json` file exists, or if `CMakePresets.json` or `CMakeUserPresets.json` are invalid, then Visual Studio will fall back on the following default Configure Presets: ```json { @@ -91,7 +98,7 @@ If no `CMakePresets.json` or CMakeUserPresets.json file exists, or if `CMakePres } } ``` -A `CMakePresets.json` file with the default Configure Presets is automatically created by Visual Studio at the root of your project if you attempt to open or modify a `CMakePresets.json` file that does not exist. +A `CMakePresets.json` file with the default Configure Presets is automatically created by Visual Studio at the root of your project if you attempt to open or modify a `CMakePresets.json` file that does not exist. ## Configure and build @@ -99,7 +106,7 @@ Visual Studio provides 3 dropdowns when `CMakePresets.json` integration is enabl ![Target system dropdown](./media/target-system-dropdown.PNG) -## Select a Target System +## Select a target system The dropdown on the left indicates the active **Target System**. This is the system on which CMake will be invoked to configure and build the project. This dropdown lists your local machine, all SSH connections in the **Connection Manager** by host name, and all Windows Subsystem for Linux (WSL) installations that Visual Studio can find: @@ -109,7 +116,7 @@ In the example above, **192.168.0.5** is a remote Linux system that was added to ## Select a Configure Preset -The dropdown in the middle indicates the active **Configure Preset**. This is the `configurePreset` that will be used when CMake is invoked to generate the project build system. This dropdown lists the union of non-hidden Configure Presets defined in `CMakePresets.json` and CMakeUserPresets.json. +The dropdown in the middle indicates the active **Configure Preset**. This is the `configurePreset` that will be used when CMake is invoked to generate the project build system. This dropdown lists the union of non-hidden Configure Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. Visual Studio will use the value of `hostOS` in the Microsoft Visual Studio Settings vendor map to hide Configure Presets that do not apply to the active Target System. See the for more information. @@ -117,13 +124,13 @@ Select **Manage Configurations…** to open the `CMakePresets.json` file located ## Select a Build Preset -The dropdown on the right indicates the active **Build Preset**. This is the `buildPreset` that will be used when CMake is invoked to build the project. This dropdown lists the union of non-hidden Build Presets defined in `CMakePresets.json` and CMakeUserPresets.json. +The dropdown on the right indicates the active **Build Preset**. This is the `buildPreset` that will be used when CMake is invoked to build the project. This dropdown lists the union of non-hidden Build Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. All Build Presets are required to specify an associated `configurePreset`. Visual Studio hides Build Presets that do not apply to the active Configure Preset. For more information, see [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset). If there are no Build Presets associated with the active Configure Preset, then Visual Studio will list the Default Build Preset. The Default Build Preset is equivalent to passing `cmake --build` with no other arguments from the command line. -## Configure +## Configure -Visual Studio automatically tries to configure the project when it detects that the CMake Cache is out of date. To manually invoke configure, select **Project** > **Configure** from the main menu. This is the same as running `cmake --preset ` from the command line, where `` is the name of the active Configure Preset. To disable automatic cache generation, see . +Visual Studio automatically tries to configure the project when it detects that the CMake Cache is out of date. To manually invoke configure, select **Project** > **Configure** from the main menu. This is the same as running `cmake --preset ` from the command line, where `` is the name of the active Configure Preset. To disable automatic cache generation, see <`TASKS.VS.JSON` Auto-configuration and cache notifications>. ## Build @@ -131,7 +138,8 @@ To build the entire project, select **Build** > **Build All** from the main menu To build a single target, switch to `CMake Targets View` in the `Solution Explorer`. Then right-click any target and select **Build** from the context menu. -> [!NOTE] Visual Studio 2019 does not support the `buildPresets.targets` option to build a subset of targets specified in `CMakePresets.json`. +> [!NOTE] +> Visual Studio 2019 does not support the `buildPresets.targets` option to build a subset of targets specified in `CMakePresets.json`. ## Run CTest @@ -154,13 +162,13 @@ To add a new Configure Preset to `CMakePresets.json` in the **Solution Explorer* ![Add configure preset to `CMakePresets.json` dialog](./media/add-configure-preset-to-cmakepresets.PNG) -Choose the **Windows x64 Debug** template to configure on Windows systems. Choose the **Linux Debug** template to configure on WSL and remote Linux systems. See for more information on editing `CMakePresets.json`. +Choose the **Windows x64 Debug** template to configure on Windows systems. Choose the **Linux Debug** template to configure on WSL and remote Linux systems. See [Edit presets](#edit_presets) for more information on editing `CMakePresets.json`. The selected template will be added to `CMakePresets.json` if it exists. Otherwise, the template will be copied into a new `CMakePresets.json`. ## Add new Build Presets and Test Presets -Visual Studio 2019 does not offer templates for new Build Presets and Test Presets. Build Presets and Test Presets can be added by directly editing `CMakePresets.json`. See [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset), [Test Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#test-preset), or an for more information. +Visual Studio 2019 does not offer templates for new Build Presets and Test Presets. Build Presets and Test Presets can be added by directly editing `CMakePresets.json`. See [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset), [Test Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#test-preset), or [Example `CMakePresets.json` file](#example_CMakePresets_json) for more information. ## Edit presets @@ -192,9 +200,10 @@ Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual } ``` -> [!IMPORTANT] In Visual Studio 2019 you must explicitly specify a Clang IntelliSense mode when building with `clang` or `clang-cl`. +> [!IMPORTANT] +> In Visual Studio 2019 you must explicitly specify a Clang IntelliSense mode when building with `clang` or `clang-cl`. -See to reproduce these builds outside of Visual Studio. +See [Run CMake from the command line or a continuous integration (CI) pipeline](#run_cmake_from_the_command_line_or_a_continuous_integration_CI_pipeline) to reproduce these builds outside of Visual Studio. To build on Linux or without the Visual C++ toolset, specify the name of a compiler on your `PATH`, or an environment variable that evaluates to the full path of a compiler. Full paths are discouraged to so that the file can remain shareable. A preset that builds with GCC version 8 might look like this: @@ -222,7 +231,8 @@ The configuration type (**Debug/Release**) for single configuration generators c Select your target and host architecture when building with the Visual C++ toolset The target architecture (x64, Win32, ARM64, or ARM) can be set with `architecture.value`. This is equivalent to passing` -A` to CMake from the command line. See [Platform Selection](https://cmake.org/cmake/help/latest/generator/Visual Studio 16 2019.html#platform-selection) for more information. -> [!NOTE] Currently Visual Studio Generators expect the Win32 syntax and command line generators (like Ninja) expect the x86 syntax when building for x86. +> [!NOTE] +> Currently Visual Studio Generators expect the Win32 syntax and command line generators (like Ninja) expect the x86 syntax when building for x86. The host architecture (x64 or x86) and toolset can be set with `toolset.value`. This is equivalent to passing `-T` to CMake from the command line. See [Toolset Selection](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2016%202019.html#toolset-selection) for more information. @@ -260,7 +270,7 @@ By default, Visual Studio will use the IntelliSense mode that matches your speci ## Configure and build on a remote system or the Windows Subsystem for Linux (WSL) -With `CMakePresets.json` support in Visual Studio you can easily configure and build your project on Windows, WSL, and remote systems. The steps to your project on Windows, a remote system, or WSL are the same. However, there are a few behaviors that are specific to remote development. +With `CMakePresets.json` support in Visual Studio you can easily configure and build your project on Windows, WSL, and remote systems. The steps to [Configure and build](#configure_and_build) your project on Windows, a remote system, or WSL are the same. However, there are a few behaviors that are specific to remote development. ## `${sourceDir}` behavior in remote copy scenarios @@ -287,7 +297,8 @@ You will see an error if you try to use the same Configure Preset on Windows and } ``` -> [!NOTE] In Visual Studio 2019, only the WSL1 toolset is supported. You will see this behavior anytime you invoke configure on both Windows and WSL. +> [!NOTE] +> In Visual Studio 2019, only the WSL1 toolset is supported. You will see this behavior anytime you invoke configure on both Windows and WSL. ## Vcpkg integration @@ -310,14 +321,14 @@ Instead, set the path to `vcpkg.cmake` with the `VCPKG_ROOT` environment variabl If you're already using a CMake toolchain file and want to enable vcpkg integration, then see [Using multiple toolchain files](https://github.com/microsoft/vcpkg/blob/master/docs/users/integration.md#using-multiple-toolchain-files) and follow those instructions to use an external toolchain file with a project using vcpkg. -## Variable substitution in `launch.vs.json` and tasks.vs.jso +## Variable substitution in `launch.vs.json` and `tasks.vs.json` -`CMakePresets.json` supports variable substitution in `launch.vs.json` and tasks.vs.json. +`CMakePresets.json` supports variable substitution in `launch.vs.json` and `tasks.vs.json`. -* Environment variables set in the active Configure Preset will automatically flow through to `launch.vs.json` and tasks.vs.json configurations. You can unset individual environment variables in `launch.vs.json` and tasks.json by setting them to `null`. The following example sets the variable `DEBUG_LOGGING_LEVEL` to `null` in `launch.vs.json`: `"env": { "DEBUG_LOGGING_LEVEL": null }` +* Environment variables set in the active Configure Preset will automatically flow through to `launch.vs.json` and `tasks.vs.json` configurations. You can unset individual environment variables in `launch.vs.json` and tasks.json by setting them to `null`. The following example sets the variable `DEBUG_LOGGING_LEVEL` to `null` in `launch.vs.json`: `"env": { "DEBUG_LOGGING_LEVEL": null }` -* Key-values set in the active Configure Preset are available for consumption in `launch.vs.json` and tasks.vs.json with the syntax `${cmake.}`. For example, use ` ${cmake.binaryDir}` to reference the output directory of the active Configure Preset. -* Individual environment variables set in the environment map of the active Configure Preset are available for consumption in `launch.vs.json` and tasks.vs.json using the syntax `${env.}`. +* Key-values set in the active Configure Preset are available for consumption in `launch.vs.json` and `tasks.vs.json` with the syntax `${cmake.}`. For example, use ` ${cmake.binaryDir}` to reference the output directory of the active Configure Preset. +* Individual environment variables set in the environment map of the active Configure Preset are available for consumption in `launch.vs.json` and `tasks.vs.json` using the syntax `${env.}`. Update your `launch.vs.json` and `task.vs.json` files to reference `CMakePresets.json` syntax instead of `CMakeSettings.json` syntax. Macros that reference the old `CMakeSettings.json` syntax when `CMakePresets.json` is the active configuration file will be deprecated in a future release. For example, reference the output directory of the active Configure Preset with `${cmake.binaryDir}` instead of `${cmake.buildRoot}`, because `CMakePresets.json` uses the `binaryDir` syntax. @@ -325,7 +336,7 @@ Update your `launch.vs.json` and `task.vs.json` files to reference `CMakePresets If things aren’t working as expected, there are a few troubleshooting steps that you can take. -If either or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you are referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run `cmake --list-presets` from the command line at the root of your project directory (CMake 3.20 or higher is required). If either file is invalid, then you'll see the following error: +If either `CMakePrests.json` or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you are referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run `cmake --list-presets` from the command line at the root of your project directory (CMake 3.20 or higher is required). If either file is invalid, then you'll see the following error: ```DOS CMake Error: Could not read presets from @@ -339,15 +350,15 @@ Other troubleshooting steps include: If you have identified a problem, the best way to report it is by clicking the **Send Feedback** button in the top right-hand corner of Visual Studio. -## Logging for remote connections +## Logging for remote connections -You can enable logging for remote connections if you are having trouble connecting or copying files to a remote system. See [logging for remote connections](https://docs.microsoft.com/cpp/linux/connect-to-your-remote-linux-computer?view=msvc-160#logging-for-remote-connections) for more information. +You can enable logging for remote connections if you are having trouble connecting or copying files to a remote system. See [logging for remote connections](https://docs.microsoft.com/cpp/linux/connect-to-your-remote-linux-computer#logging-for-remote-connections) for more information. ## Enable AddressSanitizer for Windows and Linux AddressSanitizer (ASan) is a runtime memory error detector for C and C++ that is supported in Visual Studio for both Windows and Linux development. AddressSanitizer was enabled with an option (`addressSanitizerEnabled`) in `CMakeSettings.json`. This behavior is not supported by `CMakePresets.json`. -Instead, enable and disable AddressSanitizer by setting the required compiler and linker flags yourself. This removes Visual Studio specific behavior and ensures that the same `CMakePresets.json` file can reproduce your build from the command line. The following sample can be added to a CMakeLists.txt to enable or disable AddressSanitizer for a target. +Instead, enable and disable AddressSanitizer by setting the required compiler and linker flags yourself. This removes Visual Studio specific behavior and ensures that the same `CMakePresets.json` file can reproduce your build from the command line. The following sample can be added to a `CMakeLists.txt` to enable or disable AddressSanitizer for a target. ``` option(ASAN_ENABLED "Build this target with AddressSanitizer" ON) @@ -362,23 +373,23 @@ if(ASAN_ENABLED) endif() ``` -`` are other compilation flags like `"-fno-omit-frame-pointer"`. See [Using AddressSanitizer](https://docs.microsoft.com/cpp/sanitizers/asan?view=msvc-160#command-prompt) for more information on ASan for Linux, and Use the AddressSanitizer from a Developer Command Prompt for more information on ASan with MSVC. +`` are other compilation flags like `"-fno-omit-frame-pointer"`. See [Using AddressSanitizer](https://docs.microsoft.com/cpp/sanitizers/asan#command-prompt) for more information on ASan for Linux, and Use the AddressSanitizer from a Developer Command Prompt for more information on ASan with MSVC. Pass additional runtime flags to AddressSanitizer with the `ASAN_OPTIONS` field in `launch.vs.json`. `ASAN_OPTIONS` defaults to `detect_leaks=0` when no other runtime options are specified because LeakSanitizer is not supported in Visual Studio. -## Run CMake from the command line or a Continuous Integration (CI) pipeline +## Run CMake from the command line or a continuous integration (CI) pipeline -You can use the same and `CMakeUserPresets.json` files to invoke CMake in Visual Studio and from the command line. The [CMake](https://cmake.org/cmake/help/latest/manual/cmake.1.html) and [CTest](https://cmake.org/cmake/help/latest/manual/ctest.1.html) documentation are the best resources for invoking CMake and CTest with `--preset`. CMake version 3.20 or higher is required. +You can use the same `CMakePresets.json` and `CMakeUserPresets.json` files to invoke CMake in Visual Studio and from the command line. The [CMake](https://cmake.org/cmake/help/latest/manual/cmake.1.html) and [CTest](https://cmake.org/cmake/help/latest/manual/ctest.1.html) documentation are the best resources for invoking CMake and CTest with `--preset`. CMake version 3.20 or higher is required. ## Sourcing the environment when building with command line generators on Windows -It’s up to the user to configure the environment before CMake is invoked when building with a command line generator. If you’re building with Ninja and the Visual C++ toolset on Windows, then you will need to source the environment before CMake is called to generate the build system. You can do this by calling vcvarsall.bat with the architecture argument. architecture specifies the host and target architecture to use. See [vcvarsall syntax](https://docs.microsoft.com/cpp/build/building-on-the-command-line?view=msvc-160#vcvarsall-syntax) for more information. If you build on Linux or on Windows with a Visual Studio Generator, then you don't need to take this step. +It’s up to the user to configure the environment before CMake is invoked when building with a command line generator. If you’re building with Ninja and the Visual C++ toolset on Windows, then you will need to source the environment before CMake is called to generate the build system. You can do this by calling vcvarsall.bat with the architecture argument. architecture specifies the host and target architecture to use. See [vcvarsall syntax](https://docs.microsoft.com/cpp/build/building-on-the-command-line#vcvarsall-syntax) for more information. If you build on Linux or on Windows with a Visual Studio Generator, then you don't need to take this step. This is the same step that Visual Studio takes for you when CMake is invoked by the IDE. Visual Studio parses the active Configure Preset for the host and target architecture specified by toolset and architecture and then sources the specified environment from `vcvarsall.bat`. When you build from the Windows command line with Ninja, you will need to take this step yourself. `vcvarsall.bat` is installed with the Build Tools for Visual Studio. By default, `vcvarsall.bat` is installed in `C:\Program Files (x86)\Microsoft Visual Studio\2019\\VC\Auxiliary\Build`. You can add `vcvarsall.bat` to your `PATH` if you use the command line workflow frequently. -## Example command line workflow +## Example command-line workflow The following commands can be used to configure and build a CMake project that uses Ninja to target arm64 with x64 build tools. CMake version 3.20 or higher is required. Run these commands from the directory where your `CMakePresets.json` is located: @@ -389,9 +400,9 @@ cmake --preset cmake --build --preset ``` -## Example file +## Example `CMakePresets.json` file -See the file checked in the [box2d-lite](https://github.com/esweet431/box2d-lite/blob/main/) code sample. It contains examples of Configure Presets, Build Presets, and Test Presets. +The `CMakePresets.json` file in [box2d-lite](https://github.com/esweet431/box2d-lite/blob/main/) contains examples of Configure Presets, Build Presets, and Test Presets. ## Next steps diff --git a/docs/build/toc.yml b/docs/build/toc.yml index b62334c2653..d54d162ac08 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -62,7 +62,7 @@ - name: Configure a Linux CMake project href: ../build/../linux/cmake-linux-project.md - name: Configure and build with CMake presets - href: ../build/cmake-presets.md + href: ../build/cmake-presets-vs.md - name: CMakePresets.json reference href: ../build/cmake-presets-json-reference.md - name: Customize CMake build settings From 34bf0b043cffff611b3d652334149d26d8aa3842 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 5 Apr 2021 13:51:39 -0700 Subject: [PATCH 28/82] cleanup --- docs/build/cmake-presets-json-reference.md | 2 +- docs/build/cmake-presets-vs.md | 167 +++++++++++---------- 2 files changed, 85 insertions(+), 84 deletions(-) diff --git a/docs/build/cmake-presets-json-reference.md b/docs/build/cmake-presets-json-reference.md index 3c05330a757..8999ec1cc81 100644 --- a/docs/build/cmake-presets-json-reference.md +++ b/docs/build/cmake-presets-json-reference.md @@ -66,7 +66,7 @@ Options for a `remotePrebuildEvent` and `remotePostbuildEvent` have been depreca Encode pre-build, pre-link, and post-build events in your CMakeLists.txt using [add_custom_command](https://cmake.org/cmake/help/latest/command/add_custom_command.html#build-events). This will ensure the same behavior when building with Visual Studio and from the command line. -Alternatively, if you need behavior that is specific to Visual Studio, you can add a custom remote task in` tasks.vs.json`. To get started, right-click on your root `CMakeLists.txt` in the **Solution Explorer** from**Folder View** and select **Configure Tasks**. You can then [add a new remote task](https://docs.microsoft.com/cpp/build/tasks-vs-json-schema-reference-cpp?view=msvc-160#remote-properties) to your `tasks.vs.json` file. +Alternatively, if you need behavior that is specific to Visual Studio, you can add a custom remote task in` tasks.vs.json`. To get started, right-click on your root `CMakeLists.txt` in the **Solution Explorer** from**Folder View** and select **Configure Tasks**. You can then [add a new remote task](https://docs.microsoft.com/cpp/build/tasks-vs-json-schema-reference-cpp?view=#remote-properties) to your `tasks.vs.json` file. The following remote task creates a directory called test on the remote Linux system: diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index 046b4249b76..b9741279c2f 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -1,43 +1,43 @@ --- -title: Configure and build with CMake presets -description: "Reference for using CMake presets to configure and build CMake projects." +title: Configure and build with `CMake` presets +description: "Reference for using `CMake` presets to configure and build `CMake` projects." ms.topic: reference ms.date: "04/13/2020" --- -# Configure and build with CMake presets +# Configure and build with `CMake` presets -CMake supports two files, and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. +`CMake` supports two files, and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. - Use `CMakePresets.json` and `CMakeUserPresets.json` to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. + Use `CMakePresets.json` and `CMakeUserPresets.json` to drive `CMake` in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. This article contains information about `CMakePresets.json` integration in Visual Studio. -- For more information on the format of `CMakePresets.json`, see the official [CMake Tools documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1). -- For more information on the Microsoft vendor maps and macro expansion, see [`CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps](cmake-presets-json-reference.md). -- For more information on how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with CMake Preset](https://github.com/microsoft/vscode-cmake-tools/tree/develop/docs/cmake-presets.md). +- For more information on the format of `CMakePresets.json`, see the official [`CMake` Tools documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1). +- For more information on the Microsoft vendor maps and macro expansion, see [`CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps](`cmake`-presets-json-reference.md). +- For more information on how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with `CMake` Preset](https://github.com/microsoft/vscode-cmake-tools/tree/develop/docs/`cmake`-presets.md). - `CMakePresets.json` is a recommended alternative to `CMakeSettings.json`. Visual Studio will never read from both `CMakePresets.json` and `CMakeSettings.json` at the same time. See [Enable `CMakePresets.json` in Visual Studio 2019](#enable_cmakepresets.json_integration_in_visual_studio_2019) to enable or disable `CMakePresets.json` integration in Visual Studio. + `CMakePresets.json` is a recommended alternative to `CMakeSettings.json`. Visual Studio will never read from both `CMakePresets.json` and `CMakeSettings.json` at the same time. See [Enable `CMakePresets.json` in Visual Studio 2019](#enable-cmakepresetsjson-integration-in-visual-studio-2019) to enable or disable `CMakePresets.json` integration in Visual Studio. -## Supported CMake and `CMakePresets.json` versions +## Supported `CMake` and `CMakePresets.json` versions -The CMake Tools extension supports `CMakePresets.json` and `CMakeUserPresets.json` files version 2 or higher. You can update your file version by incrementing the version field in the root object. For an example and more information, see [`CMakePresets.json` format](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#format). +The `CMake` Tools extension supports `CMakePresets.json` and `CMakeUserPresets.json` files version 2 or higher. You can update your file version by incrementing the version field in the root object. For an example and more information, see [`CMakePresets.json` format](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#format). -CMake version 3.20 or higher is required when invoking CMake with `CMakePresets.json` (version 2 or higher) from the command line. However, Visual Studio reads and evaluates `CMakePresets.json` and `CMakeUserPresets.json` itself and does not invoke CMake directly with the `--preset` option. This means CMake version 3.20 or higher is not strictly required when building with `CMakePresets.json` inside Visual Studio. Use at least CMake version 3.14 or higher. +`CMake` version 3.20 or higher is required when invoking `CMake` with `CMakePresets.json` (version 2 or higher) from the command line. However, Visual Studio reads and evaluates `CMakePresets.json` and `CMakeUserPresets.json` itself and does not invoke `CMake` directly with the `--preset` option. This means `CMake` version 3.20 or higher is not strictly required when building with `CMakePresets.json` inside Visual Studio. Use at least `CMake` version 3.14 or higher. ## Enable `CMakePresets.json` integration in Visual Studio 2019 -`CMakePresets.json` integration is not enabled by default in Visual Studio 2019. You can enable `CMakePresets.json` integration for all CMake projects in Tools > Options > CMake > General: +`CMakePresets.json` integration is not enabled by default in Visual Studio 2019. You can enable `CMakePresets.json` integration for all `CMake` projects in Tools > Options > `CMake` > General: -![Enable `CMakePresets.json` in CMake options > General](./media/enable-cmakepresets.PNG) +![Enable `CMakePresets.json` in `CMake` options > General](./media/enable-cmakepresets.PNG) > [!Important] > You must close and reopen the folder in Visual Studio to activate the integration. -If you do not want to enable `CMakePresets.json` integration for all CMake projects, then you can enable `CMakePresets.json` integration for a single CMake project by adding a `CMakePresets.json` file to the root of the open folder. You must close and reopen the folder in Visual Studio to activate the integration. +If you do not want to enable `CMakePresets.json` integration for all `CMake` projects, then you can enable `CMakePresets.json` integration for a single `CMake` project by adding a `CMakePresets.json` file to the root of the open folder. You must close and reopen the folder in Visual Studio to activate the integration. -The following table indicates when `CMakePresets.json` is used instead of `CMakeSettings.json` to drive CMake configuration and build. +The following table indicates when `CMakePresets.json` is used instead of `CMakeSettings.json` to drive `CMake` configuration and build. -Key: **Tools** > **Options** enabled means **Use `CMakePresets.json` to drive CMake configure, build, and test** is selected in **Tools** > **Options** > **CMake** > **General**. +Key: **Tools** > **Options** enabled means **Use `CMakePresets.json` to drive `CMake` configure, build, and test** is selected in **Tools** > **Options** > **`CMake`** > **General**. If no configuration file is present, then default Configure Presets are used. @@ -48,9 +48,9 @@ If no configuration file is present, then default Configure Presets are used. | `CMakePresets.json` present | `CMakeSettings.json` | `CMakePresets.json` | | Both configuration files present | `CMakeSettings.json` | `CMakePresets.json` | -## Auto-configuration and cache notifications +## Auto configuration and cache notifications -By default, Visual Studio will automatically invoke configure each time the active Target System or Configure Preset changes. You can modify this behavior by selecting **Never run configure step automatically** in **Tools** > **Options** > **CMake** > **General**. You can also disable all CMake cache notifications (gold bars) by deselecting **Show CMake cache notifications**. +By default, Visual Studio automatically invokes configure each time the active Target System or Configure Preset changes. You can modify this behavior by selecting **Never run configure step automatically** in **Tools** > **Options** > **`CMake`** > **General**. You can also disable all `CMake` cache notifications (gold bars) by deselecting **Show `CMake` cache notifications**. ## Default configure presets @@ -72,7 +72,7 @@ If no `CMakePresets.json` or `CMakeUserPresets.json` file exists, or if `CMakePr "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}" }, "vendor": { - "microsoft.com/VisualStudioSettings/CMake/1.0": { + "microsoft.com/VisualStudioSettings/`CMake`/1.0": { "hostOS": [ "Windows" ] } } @@ -89,10 +89,10 @@ If no `CMakePresets.json` or `CMakeUserPresets.json` file exists, or if `CMakePr "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}" }, "vendor": { - "microsoft.com/VisualStudioSettings/CMake/1.0": { + "microsoft.com/VisualStudioSettings/`CMake`/1.0": { "hostOS": [ "Linux" ] }, - "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { + "microsoft.com/VisualStudioRemoteSettings/`CMake`/1.0": { "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" } } @@ -102,13 +102,13 @@ A `CMakePresets.json` file with the default Configure Presets is automatically c ## Configure and build -Visual Studio provides 3 dropdowns when `CMakePresets.json` integration is enabled: +Visual Studio provides three dropdowns when `CMakePresets.json` integration is enabled: ![Target system dropdown](./media/target-system-dropdown.PNG) ## Select a target system -The dropdown on the left indicates the active **Target System**. This is the system on which CMake will be invoked to configure and build the project. This dropdown lists your local machine, all SSH connections in the **Connection Manager** by host name, and all Windows Subsystem for Linux (WSL) installations that Visual Studio can find: +The dropdown on the left indicates the active **Target System**. This is the system on which `CMake` will be invoked to configure and build the project. This dropdown lists your local machine, all SSH connections in the **Connection Manager** by host name, and all Windows Subsystem for Linux (WSL) installations that Visual Studio can find: ![Target system dropdown selection examples for local machine, a SSH connection, and WSL ubuntu and WSL debian](./media/target-system-selections.PNG) @@ -116,7 +116,7 @@ In the example above, **192.168.0.5** is a remote Linux system that was added to ## Select a Configure Preset -The dropdown in the middle indicates the active **Configure Preset**. This is the `configurePreset` that will be used when CMake is invoked to generate the project build system. This dropdown lists the union of non-hidden Configure Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. +The dropdown in the middle indicates the active **Configure Preset**. This is the `configurePreset` that will be used when `CMake` is invoked to generate the project build system. This dropdown lists the union of non-hidden Configure Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. Visual Studio will use the value of `hostOS` in the Microsoft Visual Studio Settings vendor map to hide Configure Presets that do not apply to the active Target System. See the for more information. @@ -124,58 +124,58 @@ Select **Manage Configurations…** to open the `CMakePresets.json` file located ## Select a Build Preset -The dropdown on the right indicates the active **Build Preset**. This is the `buildPreset` that will be used when CMake is invoked to build the project. This dropdown lists the union of non-hidden Build Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. +The dropdown on the right indicates the active **Build Preset**. This is the `buildPreset` that will be used when `CMake` is invoked to build the project. This dropdown lists the union of non-hidden Build Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. All Build Presets are required to specify an associated `configurePreset`. Visual Studio hides Build Presets that do not apply to the active Configure Preset. For more information, see [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset). If there are no Build Presets associated with the active Configure Preset, then Visual Studio will list the Default Build Preset. The Default Build Preset is equivalent to passing `cmake --build` with no other arguments from the command line. ## Configure -Visual Studio automatically tries to configure the project when it detects that the CMake Cache is out of date. To manually invoke configure, select **Project** > **Configure** from the main menu. This is the same as running `cmake --preset ` from the command line, where `` is the name of the active Configure Preset. To disable automatic cache generation, see <`TASKS.VS.JSON` Auto-configuration and cache notifications>. +Visual Studio automatically tries to configure the project when it detects that the `CMake` cache is out of date. To manually invoke configure, select **Project** > **Configure ** from the main menu. This is the same as running `cmake --preset ` from the command line, where `` is the name of the active Configure Preset. To disable automatic cache generation, see [Auto configuration and cache notifications](#auto-configuration-and-cache-notifications). ## Build -To build the entire project, select **Build** > **Build All** from the main menu. This is the same as running `cmake --build --preset ` from the command line, where `` is the name of the active `Build Preset`. +To build the entire project, select **Build** > **Build All** from the main menu. This is the same as running ``cmake` --build --preset ` from the command line, where `` is the name of the active `Build Preset`. -To build a single target, switch to `CMake Targets View` in the `Solution Explorer`. Then right-click any target and select **Build** from the context menu. +To build a single target, switch to ``CMake` Targets View` in the `Solution Explorer`. Then right-click any target and select **Build** from the context menu. > [!NOTE] > Visual Studio 2019 does not support the `buildPresets.targets` option to build a subset of targets specified in `CMakePresets.json`. -## Run CTest +## Run `CTest` There are two menu options supported by `CMakePresets.json` in Visual Studio 2019. -- **Test** > **Run CTests** for invokes CTest and runs all tests associated with the active Configure Preset and Build Preset, with no additional arguments passed to CTest. +- **Test** > **Run CTests** for invokes `CTest` and runs all tests associated with the active Configure Preset and Build Preset, with no additional arguments passed to `CTest`. - **Test** > **Run Test Preset** for will expand to show all Test Presets associated with the active Configure Preset. Selecting a single Test Preset is the same as running `ctest --preset ` from the command line, where `` is the name of the selected Test Preset. This option will be grayed out if no Test Presets are defined for the active Configure Preset. In Visual Studio 2019 the Test Explorer is not integrated with `CMakePresets.json`. ## Add new presets -In Visual Studio 2019, all commands and preset templates modify . You can add new user-level presets by directly editing `CMakeUserPresets.json` +In Visual Studio 2019, all commands and preset templates modify `CMakePresets.json`. You can add new user-level presets by directly editing `CMakeUserPresets.json` -Use forward slashes (`/`) for paths in and `CMakeUserPresets.json`. +Use forward slashes (`/`) for paths in `CMakePresets.json` and `CMakeUserPresets.json`. ## Add new Configure Presets -To add a new Configure Preset to `CMakePresets.json` in the **Solution Explorer**, right-click `CMakePresets.json` from **Folder View** and select **Add Configure Preset…** from the context menu. The dialog to select a Configure Preset template opens: +To add a new Configure Preset to `CMakePresets.json`, from **Solution Explorer** right-click `CMakePresets.json` from **Folder View** and select **Add Configure Preset…** from the context menu. The dialog to select a Configure Preset template opens: ![Add configure preset to `CMakePresets.json` dialog](./media/add-configure-preset-to-cmakepresets.PNG) -Choose the **Windows x64 Debug** template to configure on Windows systems. Choose the **Linux Debug** template to configure on WSL and remote Linux systems. See [Edit presets](#edit_presets) for more information on editing `CMakePresets.json`. +Choose the **Windows x64 Debug** template to configure on Windows systems. Choose the **Linux Debug** template to configure on WSL and remote Linux systems. See [Edit presets](#edit-presets) for more information on editing `CMakePresets.json`. The selected template will be added to `CMakePresets.json` if it exists. Otherwise, the template will be copied into a new `CMakePresets.json`. ## Add new Build Presets and Test Presets -Visual Studio 2019 does not offer templates for new Build Presets and Test Presets. Build Presets and Test Presets can be added by directly editing `CMakePresets.json`. See [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset), [Test Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#test-preset), or [Example `CMakePresets.json` file](#example_CMakePresets_json) for more information. +Visual Studio 2019 does not offer templates for new Build Presets and Test Presets. Build Presets and Test Presets can be added by directly editing `CMakePresets.json`. See [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset), [Test Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#test-preset), or [Example `CMakePresets.json` file](#example-cmakepresetsjson-file) for more information. ## Edit presets -The official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1) is the best resource for editing Configure Presets, Build Presets, and Test Presets. The following information is a subset of the CMake documentation that is especially relevant to Visual Studio developers. +The official [`CMake` documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1) is the best resource for editing Configure Presets, Build Presets, and Test Presets. The following information is a subset of the `CMake` documentation that is especially relevant to Visual Studio developers. **Select your compilers** -C and C++ compilers can be set with `cacheVariables.CMAKE_C_COMPILER` and `cacheVariables.CMAKE_CXX_COMPILER` in a Configure Preset. This is equivalent to passing `-D CMAKE_C_COMPILER= and -D CMAKE_CXX_COMPILER=` to CMake from the command line. For more information, see [CMAKE__COMPILER](https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html#cmake-lang-compiler). +C and C++ compilers can be set with `cacheVariables.CMAKE_C_COMPILER` and `cacheVariables.CMAKE_CXX_COMPILER` in a Configure Preset. This is equivalent to passing `-D CMAKE_C_COMPILER= and -D CMAKE_CXX_COMPILER=` to `CMake` from the command line. For more information, see [CMAKE__COMPILER](https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html#cmake-lang-compiler). Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual Studio. The C++ Clang tools for Windows component must be installed to build with `clang-cl`. @@ -194,7 +194,7 @@ Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual "CMAKE_CXX_COMPILER": "clang-cl" }, "vendor": { - "microsoft.com/VisualStudioSettings/CMake/1.0": { + "microsoft.com/VisualStudioSettings/`CMake`/1.0": { "intelliSenseMode": "windows-clang-x64" } } @@ -203,9 +203,9 @@ Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual > [!IMPORTANT] > In Visual Studio 2019 you must explicitly specify a Clang IntelliSense mode when building with `clang` or `clang-cl`. -See [Run CMake from the command line or a continuous integration (CI) pipeline](#run_cmake_from_the_command_line_or_a_continuous_integration_CI_pipeline) to reproduce these builds outside of Visual Studio. +See [Run `CMake` from the command line or a continuous integration (CI) pipeline](#run-`cmake`-from-the-command-line-or-a-continuous-integration-ci-pipeline) to reproduce these builds outside of Visual Studio. -To build on Linux or without the Visual C++ toolset, specify the name of a compiler on your `PATH`, or an environment variable that evaluates to the full path of a compiler. Full paths are discouraged to so that the file can remain shareable. A preset that builds with GCC version 8 might look like this: +To build on Linux or without the Visual C++ toolset, specify the name of a compiler on your `PATH`, or an environment variable that evaluates to the full path of a compiler. Full paths are discouraged so that the file can remain shareable. A preset that builds with GCC version 8 might look like this: ```json "cacheVariables": { @@ -216,29 +216,30 @@ To build on Linux or without the Visual C++ toolset, specify the name of a compi }, ``` -You can also set compilers with a CMake toolchain file. Toolchain files can be set with `cacheVariables.CMAKE_TOOLCHAIN_FILE`, which is equivalent to passing` -D CMAKE_TOOLCHAIN_FILE=` to CMake from the command line. A CMake toolchain file is most often used for cross-compilation. See [CMake toolchains](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html) for more information on authoring CMake toolchain files. +You can also set compilers with a `CMake` toolchain file. Toolchain files can be set with `cacheVariables.CMAKE_TOOLCHAIN_FILE`, which is equivalent to passing` -D CMAKE_TOOLCHAIN_FILE=` to `CMake` from the command line. A `CMake` toolchain file is most often used for cross-compilation. See [`CMake` toolchains](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html) for more information on authoring `CMake` toolchain files. ## Select your generator -The Windows and Linux Configure Preset templates both specify Ninja as the default generator. Other common generators are the [Visual Studio Generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html?highlight=visual%20studio%20generators#visual-studio-generators) on Windows and Unix Makefiles on Linux and macOS. You can specify a new generator with the generator option in a Configure Preset. This is equivalent to passing `-G` to CMake from the command line. See CMake generators for more information. Make sure to set architecture.strategy and toolset.strategy to set when building with a Visual Studio Generator. See [CMake generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#:~:text=A%20CMake%20Generator%20is%20responsible%20for%20writing%20the,what%20native%20build%20system%20is%20to%20be%20used) for more information. +The Windows and Linux Configure Preset templates both specify Ninja as the default generator. Other common generators are the [Visual Studio Generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html?highlight=visual%20studio%20generators#visual-studio-generators) on Windows and Unix Makefiles on Linux and macOS. You can specify a new generator with the generator option in a Configure Preset. This is equivalent to passing `-G` to `CMake` from the command line. See `CMake` generators for more information. Make sure to set architecture.strategy and toolset.strategy to set when building with a Visual Studio Generator. See [`CMake` generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#:~:text=A%20CMake%20Generator%20is%20responsible%20for%20writing%20the,what%20native%20build%20system%20is%20to%20be%20used) for more information. Make sure to set `architecture.strategy` and `toolset.strategy` to `set` when building with a Visual Studio Generator. ## Select your configuration type -The configuration type (**Debug/Release**) for single configuration generators can be set with `cacheVariables.CMAKE_BUILD_TYPE`. This is equivalent to passing `-D CMAKE_BUILD_TYPE=` to CMake from the command line. See[ CMAKE_BUILD_TYPE](https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html) for more information. +The configuration type (**Debug/Release**) for single configuration generators can be set with `cacheVariables.CMAKE_BUILD_TYPE`. This is equivalent to passing `-D CMAKE_BUILD_TYPE=` to `CMake` from the command line. See[ CMAKE_BUILD_TYPE](https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html) for more information. -Select your target and host architecture when building with the Visual C++ toolset -The target architecture (x64, Win32, ARM64, or ARM) can be set with `architecture.value`. This is equivalent to passing` -A` to CMake from the command line. See [Platform Selection](https://cmake.org/cmake/help/latest/generator/Visual Studio 16 2019.html#platform-selection) for more information. +Select your target and host architecture when building with the Visual C++ toolset. -> [!NOTE] -> Currently Visual Studio Generators expect the Win32 syntax and command line generators (like Ninja) expect the x86 syntax when building for x86. +The target architecture (x64, Win32, ARM64, or ARM) can be set with `architecture.value`. This is equivalent to passing` -A` to `CMake` from the command line. See [Platform Selection](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2016%202019.html#platform-selection) for more information. -The host architecture (x64 or x86) and toolset can be set with `toolset.value`. This is equivalent to passing `-T` to CMake from the command line. See [Toolset Selection](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2016%202019.html#toolset-selection) for more information. +> [!NOTE] +> Currently Visual Studio Generators expect the Win32 syntax and command-line generators (like Ninja) expect the x86 syntax when building for x86. + +The host architecture (x64 or x86) and toolset can be set with `toolset.value`. This is equivalent to passing `-T` to `CMake` from the command line. See [Toolset Selection](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2016%202019.html#toolset-selection) for more information. -`architecture.strategy` and `toolset.strategy` tell CMake how to handle the architecture and toolset fields. set means CMake will set the respective value, and external means CMake will not set the respective value. +`architecture.strategy` and `toolset.strategy` tell `CMake` how to handle the architecture and toolset fields. set means `CMake` will set the respective value, and external means `CMake` will not set the respective value. - `set` should be used with IDE generators like the Visual Studio Generator. `external` should be used with command line generators like Ninja. This allows vendors like Visual Studio to source the required environment before CMake is invoked. See Configure Presets for more information on the architecture and toolset fields. + `set` should be used with IDE generators like the Visual Studio Generator. `external` should be used with command-line generators like Ninja. This allows vendors like Visual Studio to source the required environment before `CMake` is invoked. See Configure Presets for more information on the architecture and toolset fields. For a full list of IDE generators that support the architecture field, see [CMAKE_GENERATOR_PLATFORM](https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_PLATFORM.html). For a full list of IDE generators that support the toolset field, see [CMAKE_GENERATOR_TOOLSET](https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_TOOLSET.html). @@ -262,7 +263,7 @@ Use the examples below to target ARM64 with the Ninja generator, or Win32 (x86) You can set environment variables using the environment map. Environment variables are inherited through the `inherits` field, but you can override them as desired. A preset’s environment will be the union of its own environment and the environment from all its parents. If multiple `inherits` presets provide conflicting values for the same variable, the earlier preset in the `inherits` list will be preferred. You can unset a variable inherited from another preset by setting it to `null`. Environment variables set in a Configure Preset also automatically flow through to associated Build Presets and Test Presets unless `inheritConfigureEnvironment` is set to `false`. See [Configure Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#configure-preset) for more information. -You can reference environment variables using the `$env{}` and `$penv{}` syntax. See [Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. +You can reference environment variables using the `$env{}` and `$penv{}` syntax. See [Macro Expansion](https://cmake`.org/cmake/help/latest/manual/`cmake`-presets.7.html#macro-expansion) for more information. ## Configure IntelliSense for a cross-compiler @@ -270,7 +271,7 @@ By default, Visual Studio will use the IntelliSense mode that matches your speci ## Configure and build on a remote system or the Windows Subsystem for Linux (WSL) -With `CMakePresets.json` support in Visual Studio you can easily configure and build your project on Windows, WSL, and remote systems. The steps to [Configure and build](#configure_and_build) your project on Windows, a remote system, or WSL are the same. However, there are a few behaviors that are specific to remote development. +With `CMakePresets.json` support in Visual Studio you can easily configure and build your project on Windows, WSL, and remote systems. The steps to [Configure and build](#configure-and-build) your project on Windows, a remote system, or WSL are the same. However, there are a few behaviors that are specific to remote development. ## `${sourceDir}` behavior in remote copy scenarios @@ -278,11 +279,11 @@ In local scenarios (including WSL1), `${sourceDir}` evaluates to the path to the ## Local folder for remote output -Remote copy scenarios require a local directory to copy some remote files like CMake File-API response files or build files if `copyBuildOutput` in the Visual Studio Remote Settings vendor map is set to `true`. These files are automatically copied to `/out//build/${presetName}`. +Remote copy scenarios require a local directory to copy some remote files like `CMake` File-API response files or build files if `copyBuildOutput` in the Visual Studio Remote Settings vendor map is set to `true`. These files are automatically copied to `/out//build/${presetName}`. ## Invoke the same Configure Preset on Windows and WSL1 -You will see an error if you try to use the same Configure Preset on Windows and WSL1. Windows and WSL1 both use the Windows file system, so CMake will try and use the same output directory (`binaryDir`) for both the Windows and WSL1 build tree. If you want to use the same Configure Preset with both Windows and the WSL1 toolset, create a second Configure Preset that inherits from the original preset and specifies a new `binaryDir`. In the following example, windows-preset can be used on Windows and base-preset can be used on WSL1: +You will see an error if you try to use the same Configure Preset on Windows and WSL1. Windows and WSL1 both use the Windows file system, so `CMake` will try and use the same output directory (`binaryDir`) for both the Windows and WSL1 build tree. If you want to use the same Configure Preset with both Windows and the WSL1 toolset, create a second Configure Preset that inherits from the original preset and specifies a new `binaryDir`. In the following example, windows-preset can be used on Windows and base-preset can be used on WSL1: ```json { @@ -290,7 +291,7 @@ You will see an error if you try to use the same Configure Preset on Windows and "inherits": "base-preset" "binaryDir": "${sourceDir}/out/build/${presetName}", "vendor": { - "microsoft.com/VisualStudioSettings/CMake/1.0": { + "microsoft.com/VisualStudioSettings/`CMake`/1.0": { "hostOS": "Windows" } } @@ -302,16 +303,16 @@ You will see an error if you try to use the same Configure Preset on Windows and ## Vcpkg integration -Vcpkg helps you manage C and C++ libraries on Windows, Linux, and macOS. A vcpkg toolchain file (`vcpkg.cmake`) must be passed to CMake to enable vcpkg integration. See the [vcpkg documentation](https://github.com/microsoft/vcpkg#vcpkg-overview) for more information. +Vcpkg helps you manage C and C++ libraries on Windows, Linux, and macOS. A vcpkg toolchain file (`vcpkg.`cmake``) must be passed to `CMake` to enable vcpkg integration. See the [vcpkg documentation](https://github.com/microsoft/vcpkg#vcpkg-overview) for more information. -Visual Studio no longer passes your vcpkg toolchain file to CMake automatically when `CMakePresets.json` integration is enabled. This eliminates Visual Studio specific behavior and ensures that your build can be reproduced from the command line. +Visual Studio no longer passes your vcpkg toolchain file to `CMake` automatically when `CMakePresets.json` integration is enabled. This eliminates Visual Studio specific behavior and ensures that your build can be reproduced from the command line. -Instead, set the path to `vcpkg.cmake` with the `VCPKG_ROOT` environment variable in `CMakePresets.json`: +Instead, set the path to `vcpkg.`cmake`` with the `VCPKG_ROOT` environment variable in `CMakePresets.json`: ```json "cacheVariables": { "CMAKE_TOOLCHAIN_FILE": { - "value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", + "value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.`cmake`", "type": "FILEPATH" } }, @@ -319,32 +320,32 @@ Instead, set the path to `vcpkg.cmake` with the `VCPKG_ROOT` environment variabl `VCPKG_ROOT` should be set to the root of your vcpkg installation. See [vcpkg environment variables](https://github.com/microsoft/vcpkg/blob/master/docs/users/config-environment.md) for more information. -If you're already using a CMake toolchain file and want to enable vcpkg integration, then see [Using multiple toolchain files](https://github.com/microsoft/vcpkg/blob/master/docs/users/integration.md#using-multiple-toolchain-files) and follow those instructions to use an external toolchain file with a project using vcpkg. +If you're already using a `CMake` toolchain file and want to enable vcpkg integration, then see [Using multiple toolchain files](https://github.com/microsoft/vcpkg/blob/master/docs/users/integration.md#using-multiple-toolchain-files) and follow those instructions to use an external toolchain file with a project using vcpkg. ## Variable substitution in `launch.vs.json` and `tasks.vs.json` `CMakePresets.json` supports variable substitution in `launch.vs.json` and `tasks.vs.json`. -* Environment variables set in the active Configure Preset will automatically flow through to `launch.vs.json` and `tasks.vs.json` configurations. You can unset individual environment variables in `launch.vs.json` and tasks.json by setting them to `null`. The following example sets the variable `DEBUG_LOGGING_LEVEL` to `null` in `launch.vs.json`: `"env": { "DEBUG_LOGGING_LEVEL": null }` +* Environment variables set in the active Configure Preset automatically flow through to `launch.vs.json` and `tasks.vs.json` configurations. You can unset individual environment variables in `launch.vs.json` and tasks.json by setting them to `null`. The following example sets the variable `DEBUG_LOGGING_LEVEL` to `null` in `launch.vs.json`: `"env": { "DEBUG_LOGGING_LEVEL": null }` -* Key-values set in the active Configure Preset are available for consumption in `launch.vs.json` and `tasks.vs.json` with the syntax `${cmake.}`. For example, use ` ${cmake.binaryDir}` to reference the output directory of the active Configure Preset. +* Key-values set in the active Configure Preset are available for consumption in `launch.vs.json` and `tasks.vs.json` with the syntax `${`cmake`.}`. For example, use ` ${`cmake`.binaryDir}` to reference the output directory of the active Configure Preset. * Individual environment variables set in the environment map of the active Configure Preset are available for consumption in `launch.vs.json` and `tasks.vs.json` using the syntax `${env.}`. -Update your `launch.vs.json` and `task.vs.json` files to reference `CMakePresets.json` syntax instead of `CMakeSettings.json` syntax. Macros that reference the old `CMakeSettings.json` syntax when `CMakePresets.json` is the active configuration file will be deprecated in a future release. For example, reference the output directory of the active Configure Preset with `${cmake.binaryDir}` instead of `${cmake.buildRoot}`, because `CMakePresets.json` uses the `binaryDir` syntax. +Update your `launch.vs.json` and `task.vs.json` files to reference `CMakePresets.json` syntax instead of `CMakeSettings.json` syntax. Macros that reference the old `CMakeSettings.json` syntax when `CMakePresets.json` is the active configuration file will be deprecated in a future release. For example, reference the output directory of the active Configure Preset with `${`cmake`.binaryDir}` instead of `${`cmake`.buildRoot}`, because `CMakePresets.json` uses the `binaryDir` syntax. ## Troubleshooting If things aren’t working as expected, there are a few troubleshooting steps that you can take. -If either `CMakePrests.json` or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you are referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run `cmake --list-presets` from the command line at the root of your project directory (CMake 3.20 or higher is required). If either file is invalid, then you'll see the following error: +If either `CMakePrests.json` or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you are referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run ``cmake` --list-presets` from the command line at the root of your project directory (`CMake` 3.20 or higher is required). If either file is invalid, then you'll see the following error: ```DOS -CMake Error: Could not read presets from +`CMake` Error: Could not read presets from C:/Users//source/repos/: JSON parse error ``` Other troubleshooting steps include: -* Delete the cache and reconfigure the project (**CMake: Delete Cache** and **Project** > **Configure **) +* Delete the cache and reconfigure the project (**`CMake`: Delete Cache** and **Project** > **Configure **) * Close and reopen the folder in Visual Studio (**File** > **Close Folder**) * Delete the `.vs` folder at the root your project @@ -356,7 +357,7 @@ You can enable logging for remote connections if you are having trouble connecti ## Enable AddressSanitizer for Windows and Linux -AddressSanitizer (ASan) is a runtime memory error detector for C and C++ that is supported in Visual Studio for both Windows and Linux development. AddressSanitizer was enabled with an option (`addressSanitizerEnabled`) in `CMakeSettings.json`. This behavior is not supported by `CMakePresets.json`. +AddressSanitizer (`ASan`) is a runtime memory error detector for C and C++ that is supported in Visual Studio for both Windows and Linux development. AddressSanitizer was enabled with an option (`addressSanitizerEnabled`) in `CMakeSettings.json`. This behavior is not supported by `CMakePresets.json`. Instead, enable and disable AddressSanitizer by setting the required compiler and linker flags yourself. This removes Visual Studio specific behavior and ensures that the same `CMakePresets.json` file can reproduce your build from the command line. The following sample can be added to a `CMakeLists.txt` to enable or disable AddressSanitizer for a target. @@ -373,31 +374,31 @@ if(ASAN_ENABLED) endif() ``` -`` are other compilation flags like `"-fno-omit-frame-pointer"`. See [Using AddressSanitizer](https://docs.microsoft.com/cpp/sanitizers/asan#command-prompt) for more information on ASan for Linux, and Use the AddressSanitizer from a Developer Command Prompt for more information on ASan with MSVC. +`` are other compilation flags like `"-fno-omit-frame-pointer"`. See [Using AddressSanitizer](https://docs.microsoft.com/cpp/sanitizers/asan#command-prompt) for more information on `ASan` for Linux, and Use the AddressSanitizer from a Developer Command Prompt for more information on `ASan` with MSVC. Pass additional runtime flags to AddressSanitizer with the `ASAN_OPTIONS` field in `launch.vs.json`. `ASAN_OPTIONS` defaults to `detect_leaks=0` when no other runtime options are specified because LeakSanitizer is not supported in Visual Studio. -## Run CMake from the command line or a continuous integration (CI) pipeline +## Run `CMake` from the command line or a continuous integration (CI) pipeline -You can use the same `CMakePresets.json` and `CMakeUserPresets.json` files to invoke CMake in Visual Studio and from the command line. The [CMake](https://cmake.org/cmake/help/latest/manual/cmake.1.html) and [CTest](https://cmake.org/cmake/help/latest/manual/ctest.1.html) documentation are the best resources for invoking CMake and CTest with `--preset`. CMake version 3.20 or higher is required. +You can use the same `CMakePresets.json` and `CMakeUserPresets.json` files to invoke `CMake` in Visual Studio and from the command line. The [`CMake`](https://cmake.org/cmake/help/latest/manual/cmake.1.html) and [`CTest`](https://cmake.org/cmake/help/latest/manual/ctest.1.html) documentation are the best resources for invoking `CMake` and `CTest` with `--preset`. `CMake` version 3.20 or higher is required. -## Sourcing the environment when building with command line generators on Windows +## Sourcing the environment when building with command-line generators on Windows -It’s up to the user to configure the environment before CMake is invoked when building with a command line generator. If you’re building with Ninja and the Visual C++ toolset on Windows, then you will need to source the environment before CMake is called to generate the build system. You can do this by calling vcvarsall.bat with the architecture argument. architecture specifies the host and target architecture to use. See [vcvarsall syntax](https://docs.microsoft.com/cpp/build/building-on-the-command-line#vcvarsall-syntax) for more information. If you build on Linux or on Windows with a Visual Studio Generator, then you don't need to take this step. +It’s up to the user to configure the environment before `CMake` is invoked when building with a command-line generator. If you’re building with Ninja and the Visual C++ toolset on Windows, then you will need to source the environment before `CMake` is called to generate the build system. You can do this by calling vcvarsall.bat with the architecture argument. architecture specifies the host and target architecture to use. See [vcvarsall syntax](https://docs.microsoft.com/cpp/build/building-on-the-command-line#vcvarsall-syntax) for more information. If you build on Linux or on Windows with a Visual Studio Generator, then you don't need to take this step. -This is the same step that Visual Studio takes for you when CMake is invoked by the IDE. Visual Studio parses the active Configure Preset for the host and target architecture specified by toolset and architecture and then sources the specified environment from `vcvarsall.bat`. When you build from the Windows command line with Ninja, you will need to take this step yourself. +This is the same step that Visual Studio takes for you when `CMake` is invoked by the IDE. Visual Studio parses the active Configure Preset for the host and target architecture specified by toolset and architecture and then sources the specified environment from `vcvarsall.bat`. When you build from the Windows command line with Ninja, you will need to take this step yourself. `vcvarsall.bat` is installed with the Build Tools for Visual Studio. By default, `vcvarsall.bat` is installed in `C:\Program Files (x86)\Microsoft Visual Studio\2019\\VC\Auxiliary\Build`. You can add `vcvarsall.bat` to your `PATH` if you use the command line workflow frequently. ## Example command-line workflow -The following commands can be used to configure and build a CMake project that uses Ninja to target arm64 with x64 build tools. CMake version 3.20 or higher is required. Run these commands from the directory where your `CMakePresets.json` is located: +The following commands can be used to configure and build a `CMake` project that uses Ninja to target arm64 with x64 build tools. `CMake` version 3.20 or higher is required. Run these commands from the directory where your `CMakePresets.json` is located: ```DOS /path/to/vcvarsall.bat x64_arm64 -cmake --list-presets=all . -cmake --preset -cmake --build --preset +`cmake` --list-presets=all . +`cmake` --preset +`cmake` --build --preset ``` ## Example `CMakePresets.json` file @@ -406,11 +407,11 @@ The `CMakePresets.json` file in [box2d-lite](https://github.com/esweet431/box2d- ## Next steps -Learn more about configuring and debugging CMake projects in Visual Studio: +Learn more about configuring and debugging `CMake` projects in Visual Studio: > [!div class="nextstepaction"] -> [CMake Projects in Visual Studio](cmake-projects-in-visual-studio.md)

    -> [Customize CMake build settings](customize-cmake-settings.md)

    -> [Configure CMake debugging sessions](configure-cmake-debugging-sessions.md)

    -> [CMake predefined configuration reference](cmake-predefined-configuration-reference.md) +> [`CMake` Projects in Visual Studio](`cmake`-projects-in-visual-studio.md)

    +> [Customize `CMake` build settings](customize-`cmake`-settings.md)

    +> [Configure `CMake` debugging sessions](configure-`cmake`-debugging-sessions.md)

    +> [`CMake` predefined configuration reference](`cmake`-predefined-configuration-reference.md) > \ No newline at end of file From 92553b0e9a129d556b3140debe75fcf1f5fade5f Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 5 Apr 2021 14:12:14 -0700 Subject: [PATCH 29/82] draft --- docs/build/cmake-presets-vs.md | 56 +++++++++++++++++----------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index b9741279c2f..64a96030efc 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -13,8 +13,8 @@ ms.date: "04/13/2020" This article contains information about `CMakePresets.json` integration in Visual Studio. - For more information on the format of `CMakePresets.json`, see the official [`CMake` Tools documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1). -- For more information on the Microsoft vendor maps and macro expansion, see [`CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps](`cmake`-presets-json-reference.md). -- For more information on how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with `CMake` Preset](https://github.com/microsoft/vscode-cmake-tools/tree/develop/docs/`cmake`-presets.md). +- For more information on the Microsoft vendor maps and macro expansion, see [`CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps](cmake-presets-json-reference.md). +- For more information on how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with `CMake` Preset](https://github.com/microsoft/vscode-cmake-tools/tree/develop/docs/cmake-presets.md). `CMakePresets.json` is a recommended alternative to `CMakeSettings.json`. Visual Studio will never read from both `CMakePresets.json` and `CMakeSettings.json` at the same time. See [Enable `CMakePresets.json` in Visual Studio 2019](#enable-cmakepresetsjson-integration-in-visual-studio-2019) to enable or disable `CMakePresets.json` integration in Visual Studio. @@ -37,7 +37,7 @@ If you do not want to enable `CMakePresets.json` integration for all `CMake` pro The following table indicates when `CMakePresets.json` is used instead of `CMakeSettings.json` to drive `CMake` configuration and build. -Key: **Tools** > **Options** enabled means **Use `CMakePresets.json` to drive `CMake` configure, build, and test** is selected in **Tools** > **Options** > **`CMake`** > **General**. +Key: **Tools** > **Options** enabled means **Use CMakePresets.json to drive CMake configure, build, and test** is selected in **Tools** > **Options** > **CMake** > **General**. If no configuration file is present, then default Configure Presets are used. @@ -50,7 +50,7 @@ If no configuration file is present, then default Configure Presets are used. ## Auto configuration and cache notifications -By default, Visual Studio automatically invokes configure each time the active Target System or Configure Preset changes. You can modify this behavior by selecting **Never run configure step automatically** in **Tools** > **Options** > **`CMake`** > **General**. You can also disable all `CMake` cache notifications (gold bars) by deselecting **Show `CMake` cache notifications**. +By default, Visual Studio automatically invokes configure each time the active Target System or Configure Preset changes. You can modify this behavior by selecting **Never run configure step automatically** in **Tools** > **Options** > **CMake** > **General**. You can also disable all `CMake` cache notifications (gold bars) by deselecting **Show CMake cache notifications**. ## Default configure presets @@ -72,7 +72,7 @@ If no `CMakePresets.json` or `CMakeUserPresets.json` file exists, or if `CMakePr "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}" }, "vendor": { - "microsoft.com/VisualStudioSettings/`CMake`/1.0": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Windows" ] } } @@ -89,10 +89,10 @@ If no `CMakePresets.json` or `CMakeUserPresets.json` file exists, or if `CMakePr "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}" }, "vendor": { - "microsoft.com/VisualStudioSettings/`CMake`/1.0": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Linux" ] }, - "microsoft.com/VisualStudioRemoteSettings/`CMake`/1.0": { + "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" } } @@ -134,9 +134,9 @@ Visual Studio automatically tries to configure the project when it detects that ## Build -To build the entire project, select **Build** > **Build All** from the main menu. This is the same as running ``cmake` --build --preset ` from the command line, where `` is the name of the active `Build Preset`. +To build the entire project, select **Build** > **Build All** from the main menu. This is the same as running `cmake --build --preset ` from the command line, where `` is the name of the active `Build Preset`. -To build a single target, switch to ``CMake` Targets View` in the `Solution Explorer`. Then right-click any target and select **Build** from the context menu. +To build a single target, switch to **CMake Targets View** in the **Solution Explorer**. Then right-click any target and select **Build** from the context menu. > [!NOTE] > Visual Studio 2019 does not support the `buildPresets.targets` option to build a subset of targets specified in `CMakePresets.json`. @@ -194,7 +194,7 @@ Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual "CMAKE_CXX_COMPILER": "clang-cl" }, "vendor": { - "microsoft.com/VisualStudioSettings/`CMake`/1.0": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { "intelliSenseMode": "windows-clang-x64" } } @@ -203,7 +203,7 @@ Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual > [!IMPORTANT] > In Visual Studio 2019 you must explicitly specify a Clang IntelliSense mode when building with `clang` or `clang-cl`. -See [Run `CMake` from the command line or a continuous integration (CI) pipeline](#run-`cmake`-from-the-command-line-or-a-continuous-integration-ci-pipeline) to reproduce these builds outside of Visual Studio. +See [Run `CMake` from the command line or a continuous integration (CI) pipeline](#run-cmake-from-the-command-line-or-a-continuous-integration-ci-pipeline) to reproduce these builds outside of Visual Studio. To build on Linux or without the Visual C++ toolset, specify the name of a compiler on your `PATH`, or an environment variable that evaluates to the full path of a compiler. Full paths are discouraged so that the file can remain shareable. A preset that builds with GCC version 8 might look like this: @@ -239,7 +239,7 @@ The host architecture (x64 or x86) and toolset can be set with `toolset.value`. `architecture.strategy` and `toolset.strategy` tell `CMake` how to handle the architecture and toolset fields. set means `CMake` will set the respective value, and external means `CMake` will not set the respective value. - `set` should be used with IDE generators like the Visual Studio Generator. `external` should be used with command-line generators like Ninja. This allows vendors like Visual Studio to source the required environment before `CMake` is invoked. See Configure Presets for more information on the architecture and toolset fields. + `set` should be used with IDE generators like the Visual Studio Generator. `external` should be used with command-line generators like Ninja. This allows vendors like Visual Studio to source the required environment before `CMake` is invoked. See [Configure Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#configure-preset) for more information on the architecture and toolset fields. For a full list of IDE generators that support the architecture field, see [CMAKE_GENERATOR_PLATFORM](https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_PLATFORM.html). For a full list of IDE generators that support the toolset field, see [CMAKE_GENERATOR_TOOLSET](https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_TOOLSET.html). @@ -263,7 +263,7 @@ Use the examples below to target ARM64 with the Ninja generator, or Win32 (x86) You can set environment variables using the environment map. Environment variables are inherited through the `inherits` field, but you can override them as desired. A preset’s environment will be the union of its own environment and the environment from all its parents. If multiple `inherits` presets provide conflicting values for the same variable, the earlier preset in the `inherits` list will be preferred. You can unset a variable inherited from another preset by setting it to `null`. Environment variables set in a Configure Preset also automatically flow through to associated Build Presets and Test Presets unless `inheritConfigureEnvironment` is set to `false`. See [Configure Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#configure-preset) for more information. -You can reference environment variables using the `$env{}` and `$penv{}` syntax. See [Macro Expansion](https://cmake`.org/cmake/help/latest/manual/`cmake`-presets.7.html#macro-expansion) for more information. +You can reference environment variables using the `$env{}` and `$penv{}` syntax. See [Macro Expansion](https://cmake.org/cmake/help/latest/manual/`cmake`-presets.7.html#macro-expansion) for more information. ## Configure IntelliSense for a cross-compiler @@ -291,7 +291,7 @@ You will see an error if you try to use the same Configure Preset on Windows and "inherits": "base-preset" "binaryDir": "${sourceDir}/out/build/${presetName}", "vendor": { - "microsoft.com/VisualStudioSettings/`CMake`/1.0": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": "Windows" } } @@ -303,16 +303,16 @@ You will see an error if you try to use the same Configure Preset on Windows and ## Vcpkg integration -Vcpkg helps you manage C and C++ libraries on Windows, Linux, and macOS. A vcpkg toolchain file (`vcpkg.`cmake``) must be passed to `CMake` to enable vcpkg integration. See the [vcpkg documentation](https://github.com/microsoft/vcpkg#vcpkg-overview) for more information. +Vcpkg helps you manage C and C++ libraries on Windows, Linux, and macOS. A vcpkg toolchain file (`vcpkg.cmake`) must be passed to `CMake` to enable vcpkg integration. See the [vcpkg documentation](https://github.com/microsoft/vcpkg#vcpkg-overview) for more information. Visual Studio no longer passes your vcpkg toolchain file to `CMake` automatically when `CMakePresets.json` integration is enabled. This eliminates Visual Studio specific behavior and ensures that your build can be reproduced from the command line. -Instead, set the path to `vcpkg.`cmake`` with the `VCPKG_ROOT` environment variable in `CMakePresets.json`: +Instead, set the path to `vcpkg.cmake` with the `VCPKG_ROOT` environment variable in `CMakePresets.json`: ```json "cacheVariables": { "CMAKE_TOOLCHAIN_FILE": { - "value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.`cmake`", + "value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", "type": "FILEPATH" } }, @@ -328,16 +328,16 @@ If you're already using a `CMake` toolchain file and want to enable vcpkg integr * Environment variables set in the active Configure Preset automatically flow through to `launch.vs.json` and `tasks.vs.json` configurations. You can unset individual environment variables in `launch.vs.json` and tasks.json by setting them to `null`. The following example sets the variable `DEBUG_LOGGING_LEVEL` to `null` in `launch.vs.json`: `"env": { "DEBUG_LOGGING_LEVEL": null }` -* Key-values set in the active Configure Preset are available for consumption in `launch.vs.json` and `tasks.vs.json` with the syntax `${`cmake`.}`. For example, use ` ${`cmake`.binaryDir}` to reference the output directory of the active Configure Preset. +* Key-values set in the active Configure Preset are available for consumption in `launch.vs.json` and `tasks.vs.json` with the syntax `${cmake.}`. For example, use ` ${cmake.binaryDir}` to reference the output directory of the active Configure Preset. * Individual environment variables set in the environment map of the active Configure Preset are available for consumption in `launch.vs.json` and `tasks.vs.json` using the syntax `${env.}`. -Update your `launch.vs.json` and `task.vs.json` files to reference `CMakePresets.json` syntax instead of `CMakeSettings.json` syntax. Macros that reference the old `CMakeSettings.json` syntax when `CMakePresets.json` is the active configuration file will be deprecated in a future release. For example, reference the output directory of the active Configure Preset with `${`cmake`.binaryDir}` instead of `${`cmake`.buildRoot}`, because `CMakePresets.json` uses the `binaryDir` syntax. +Update your `launch.vs.json` and `task.vs.json` files to reference `CMakePresets.json` syntax instead of `CMakeSettings.json` syntax. Macros that reference the old `CMakeSettings.json` syntax when `CMakePresets.json` is the active configuration file will be deprecated in a future release. For example, reference the output directory of the active Configure Preset with `${cmake.binaryDir}` instead of `${cmake.buildRoot}`, because `CMakePresets.json` uses the `binaryDir` syntax. ## Troubleshooting If things aren’t working as expected, there are a few troubleshooting steps that you can take. -If either `CMakePrests.json` or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you are referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run ``cmake` --list-presets` from the command line at the root of your project directory (`CMake` 3.20 or higher is required). If either file is invalid, then you'll see the following error: +If either `CMakePrests.json` or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you are referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run `cmake --list-presets` from the command line at the root of your project directory (`CMake` 3.20 or higher is required). If either file is invalid, then you'll see the following error: ```DOS `CMake` Error: Could not read presets from @@ -345,7 +345,7 @@ C:/Users//source/repos/: JSON parse error ``` Other troubleshooting steps include: -* Delete the cache and reconfigure the project (**`CMake`: Delete Cache** and **Project** > **Configure **) +* Delete the cache and reconfigure the project (**CMake: Delete Cache** and **Project** > **Configure **) * Close and reopen the folder in Visual Studio (**File** > **Close Folder**) * Delete the `.vs` folder at the root your project @@ -396,9 +396,9 @@ The following commands can be used to configure and build a `CMake` project that ```DOS /path/to/vcvarsall.bat x64_arm64 -`cmake` --list-presets=all . -`cmake` --preset -`cmake` --build --preset +cmake --list-presets=all . +cmake --preset +cmake --build --preset ``` ## Example `CMakePresets.json` file @@ -410,8 +410,8 @@ The `CMakePresets.json` file in [box2d-lite](https://github.com/esweet431/box2d- Learn more about configuring and debugging `CMake` projects in Visual Studio: > [!div class="nextstepaction"] -> [`CMake` Projects in Visual Studio](`cmake`-projects-in-visual-studio.md)

    -> [Customize `CMake` build settings](customize-`cmake`-settings.md)

    -> [Configure `CMake` debugging sessions](configure-`cmake`-debugging-sessions.md)

    -> [`CMake` predefined configuration reference](`cmake`-predefined-configuration-reference.md) +> [`CMake` Projects in Visual Studio](cmake-projects-in-visual-studio.md)

    +> [Customize `CMake` build settings](customize-cmake-settings.md)

    +> [Configure `CMake` debugging sessions](configure-cmake-debugging-sessions.md)

    +> [`CMake` predefined configuration reference](cmake-predefined-configuration-reference.md) > \ No newline at end of file From 00fdeaf7ed448e47009fad27856975506f986ef5 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 5 Apr 2021 14:30:09 -0700 Subject: [PATCH 30/82] hookup links --- docs/build/cmake-presets-json-reference.md | 7 ++++--- docs/build/cmake-presets-vs.md | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/build/cmake-presets-json-reference.md b/docs/build/cmake-presets-json-reference.md index 8999ec1cc81..8b821ef86c4 100644 --- a/docs/build/cmake-presets-json-reference.md +++ b/docs/build/cmake-presets-json-reference.md @@ -14,15 +14,16 @@ CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that `CMakePresets.json` and `CMakeUserPresets.json` are how Microsoft provides a "vendor map" to add VS/VS Code specific options. Here we document the Microsoft vendor maps and macro expansion. To see documentation for the rest of the schema, and about Configure Presets, Build Presets, and Test Presets, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). -For more information on how to use `CMakePresets.json` in Visual Studio and Visual Studio Code, see and . +For more information about how to use `CMakePresets.json` in Visual Studio, see [Configure and build with `CMake` presets in Visual Studio](cmake-presets-vs.md)\ +For more information about how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with CMake Presets in VS Code](https://github.com/microsoft/vscode-cmake-tools/blob/develop/docs/cmake-presets.md) ## Visual Studio Settings vendor map -One vendor map with the vendor URI` microsoft.com/VisualStudioSettings/CMake/` is allowed per Configure Preset and contains options specific to CMake integration in Visual Studio and Visual Studio Code. All options in the vendor map apply to Visual Studio. Options that apply to both Visual Studio and Visual Studio Code have been explicitly marked. +One vendor map with the vendor URI `microsoft.com/VisualStudioSettings/CMake/` is allowed per Configure Preset and contains options specific to CMake integration in Visual Studio and Visual Studio Code. All options in the vendor map apply to Visual Studio. Options that apply to both Visual Studio and Visual Studio Code have been explicitly marked. All settings in the Visual Studio Settings vendor map are optional and inherited from Configure Presets specified by the `inherits` key. Only options that have been modified are written to the file. The Visual Studio Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. -None of the options in the Visual Studio Settings vendor map impact the construction of the CMake or CTest command line. This ensures that the same `CMakePresets.json` file can be used to drive CMake with Visual Studio, Visual Studio Code, and from the command line. The exceptions to this are the cacheRoot and cmakeGenerateCommand options. These options are specific to the[ Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio and cannot be reproduced from the command line. +None of the options in the Visual Studio Settings vendor map impact the construction of the CMake or CTest command line. This ensures that the same `CMakePresets.json` file can be used to drive CMake with Visual Studio, Visual Studio Code, and from the command line. The exceptions to this are the cacheRoot and cmakeGenerateCommand options. These options are specific to the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio and cannot be reproduced from the command line. | Setting | Description | |--|--| diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index 64a96030efc..0648aae3382 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -5,7 +5,7 @@ ms.topic: reference ms.date: "04/13/2020" --- -# Configure and build with `CMake` presets +# Configure and build with `CMake` presets in Visual Studio `CMake` supports two files, and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. @@ -118,7 +118,7 @@ In the example above, **192.168.0.5** is a remote Linux system that was added to The dropdown in the middle indicates the active **Configure Preset**. This is the `configurePreset` that will be used when `CMake` is invoked to generate the project build system. This dropdown lists the union of non-hidden Configure Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. -Visual Studio will use the value of `hostOS` in the Microsoft Visual Studio Settings vendor map to hide Configure Presets that do not apply to the active Target System. See the for more information. +Visual Studio will use the value of `hostOS` in the Microsoft Visual Studio Settings vendor map to hide Configure Presets that do not apply to the active Target System. See the entry for `hostOS` in the table under [Visual Studio Settings vendor map](cmake-presets-json-reference.md#visual-studio-settings-vendor-map) for more information. Select **Manage Configurations…** to open the `CMakePresets.json` file located at the root of the project. `CMakePresets.json` is created if it does not already exist. @@ -267,7 +267,7 @@ You can reference environment variables using the `$env{}` and `$ ## Configure IntelliSense for a cross-compiler -By default, Visual Studio will use the IntelliSense mode that matches your specified toolset and target architecture. If you are cross-compiling, then you may need to manually specify the correct IntelliSense mode with the `intelliSenseMode` option in the Visual Studio Settings vendor map. See for more information. +By default, Visual Studio will use the IntelliSense mode that matches your specified toolset and target architecture. If you are cross-compiling, then you may need to manually specify the correct IntelliSense mode with the `intelliSenseMode` option in the Visual Studio Settings vendor map. See the entry for `intelliSenseMode` in the table under [Visual Studio Settings vendor map](cmake-presets-json-reference.md#visual-studio-settings-vendor-map) for more information. ## Configure and build on a remote system or the Windows Subsystem for Linux (WSL) @@ -275,7 +275,7 @@ With `CMakePresets.json` support in Visual Studio you can easily configure and b ## `${sourceDir}` behavior in remote copy scenarios -In local scenarios (including WSL1), `${sourceDir}` evaluates to the path to the project source directory that is open in Visual Studio. In remote copy scenarios, `${sourceDir}` evaluates to the path to the project source directory on the target system and not the project source directory on the local machine. The project source directory on the target system is determined by the value of `sourceDir` in the Visual Studio Remote Settings vendor map (defaults to `$env{HOME}/.vs/$ms{projectDirName}`). See for more information. +In local scenarios (including WSL1), `${sourceDir}` evaluates to the path to the project source directory that is open in Visual Studio. In remote copy scenarios, `${sourceDir}` evaluates to the path to the project source directory on the target system and not the project source directory on the local machine. The project source directory on the target system is determined by the value of `sourceDir` in the Visual Studio Remote Settings vendor map (defaults to `$env{HOME}/.vs/$ms{projectDirName}`). See the entry for `sourceDir` in the table under [Visual Studio Settings vendor map](cmake-presets-json-reference.md#visual-studio-settings-vendor-map) for more information. ## Local folder for remote output From 3c44bedbd6e45ecf6bda17b003343777adf39e3f Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 5 Apr 2021 14:33:13 -0700 Subject: [PATCH 31/82] fix links --- docs/build/cmake-presets-json-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/cmake-presets-json-reference.md b/docs/build/cmake-presets-json-reference.md index 8b821ef86c4..243aef6f01f 100644 --- a/docs/build/cmake-presets-json-reference.md +++ b/docs/build/cmake-presets-json-reference.md @@ -67,7 +67,7 @@ Options for a `remotePrebuildEvent` and `remotePostbuildEvent` have been depreca Encode pre-build, pre-link, and post-build events in your CMakeLists.txt using [add_custom_command](https://cmake.org/cmake/help/latest/command/add_custom_command.html#build-events). This will ensure the same behavior when building with Visual Studio and from the command line. -Alternatively, if you need behavior that is specific to Visual Studio, you can add a custom remote task in` tasks.vs.json`. To get started, right-click on your root `CMakeLists.txt` in the **Solution Explorer** from**Folder View** and select **Configure Tasks**. You can then [add a new remote task](https://docs.microsoft.com/cpp/build/tasks-vs-json-schema-reference-cpp?view=#remote-properties) to your `tasks.vs.json` file. +Alternatively, if you need behavior that is specific to Visual Studio, you can add a custom remote task in` tasks.vs.json`. To get started, right-click on your root `CMakeLists.txt` in the **Solution Explorer** from**Folder View** and select **Configure Tasks**. You can then [add a new remote task](https://docs.microsoft.com/en-us/cpp/build/tasks-vs-json-schema-reference-cpp#remote-properties) to your `tasks.vs.json` file. The following remote task creates a directory called test on the remote Linux system: From 62123b8b559ecd3d1e2b12d67ea6416865880187 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 5 Apr 2021 15:22:42 -0700 Subject: [PATCH 32/82] acrolinx, fix link --- docs/build/cmake-presets-json-reference.md | 28 ++++++------- docs/build/cmake-presets-vs.md | 48 +++++++++++----------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/docs/build/cmake-presets-json-reference.md b/docs/build/cmake-presets-json-reference.md index 243aef6f01f..4437861d2f5 100644 --- a/docs/build/cmake-presets-json-reference.md +++ b/docs/build/cmake-presets-json-reference.md @@ -6,24 +6,24 @@ helpviewer_keywords: ["CMake in Visual C++"] --- # `CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps -CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. +`CMake` supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. -`CMakePresets.json` and `CMakeUserPresets.json` can be used to drive CMake in Visual Studio, in Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. +`CMakePresets.json` and `CMakeUserPresets.json` can be used to drive `CMake` in Visual Studio, in Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. They schema for both files is identical. -`CMakePresets.json` and `CMakeUserPresets.json` are how Microsoft provides a "vendor map" to add VS/VS Code specific options. Here we document the Microsoft vendor maps and macro expansion. To see documentation for the rest of the schema, and about Configure Presets, Build Presets, and Test Presets, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). +`CMakePresets.json` and `CMakeUserPresets.json` are how Microsoft provides a "vendor map" to add VS/VS code-specific options. Here we document the Microsoft vendor maps and macro expansion. To see documentation for the rest of the schema, and about Configure Presets, Build Presets, and Test Presets, see the official [`CMake` documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). For more information about how to use `CMakePresets.json` in Visual Studio, see [Configure and build with `CMake` presets in Visual Studio](cmake-presets-vs.md)\ -For more information about how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with CMake Presets in VS Code](https://github.com/microsoft/vscode-cmake-tools/blob/develop/docs/cmake-presets.md) +For more information about how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with `CMake` Presets in VS Code](https://github.com/microsoft/vscode-cmake-tools/blob/develop/docs/cmake-presets.md) ## Visual Studio Settings vendor map -One vendor map with the vendor URI `microsoft.com/VisualStudioSettings/CMake/` is allowed per Configure Preset and contains options specific to CMake integration in Visual Studio and Visual Studio Code. All options in the vendor map apply to Visual Studio. Options that apply to both Visual Studio and Visual Studio Code have been explicitly marked. +One vendor map with the vendor URI `microsoft.com/VisualStudioSettings/CMake/` is allowed per Configure Preset and contains options specific to `CMake` integration in Visual Studio and Visual Studio Code. All options in the vendor map apply to Visual Studio. Options that apply to both Visual Studio and Visual Studio Code have been explicitly marked. All settings in the Visual Studio Settings vendor map are optional and inherited from Configure Presets specified by the `inherits` key. Only options that have been modified are written to the file. The Visual Studio Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. -None of the options in the Visual Studio Settings vendor map impact the construction of the CMake or CTest command line. This ensures that the same `CMakePresets.json` file can be used to drive CMake with Visual Studio, Visual Studio Code, and from the command line. The exceptions to this are the cacheRoot and cmakeGenerateCommand options. These options are specific to the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio and cannot be reproduced from the command line. +None of the options in the Visual Studio Settings vendor map impact the construction of the `CMake` or `CTest` command line. This ensures that the same `CMakePresets.json` file can be used to drive `CMake` with Visual Studio, Visual Studio Code, and from the command line. The exceptions to this are the `cacheRoot` and `cmakeGenerateCommand` options. These options are specific to the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio and cannot be reproduced from the command line. | Setting | Description | |--|--| @@ -36,16 +36,16 @@ None of the options in the Visual Studio Settings vendor map impact the construc | `codeAnalysisExternalRuleset` | Specifies the ruleset to use when running Microsoft code analysis on external header in Visual Studio. This can be a path to a ruleset file, or the name of a ruleset file installed with Visual Studio. This option supports macro expansion. | | `enableClangTidyCodeAnalysis` | A bool that enables clang-tidy code analysis in Visual Studio when building with `clang-cl`. Defaults to `false`. | | `clangTidyChecks` | A comma-separated list of warnings passed to clang-tidy when running clang-tidy code analysis in Visual Studio. Wildcards are allowed, and the `–` prefix will remove checks. | -| `cacheRoot` | Specifies the path to a CMake cache. This directory should contain an existing `CMakeCache.txt` file. This key is only supported by the Open Existing Cache scenario in Visual Studio. This option supports macro expansion. | -| `cmakeGenerateCommand` | A command-line tool (specified as a command-line program + arguments, for example, “gencache.bat debug”) to generate the CMake cache. This command will run from the shell in the preset’s specified environment when CMake configure is invoked. This key is only supported by the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio. This option supports macro expansion | +| `cacheRoot` | Specifies the path to a `CMake` cache. This directory should contain an existing `CMakeCache.txt` file. This key is only supported by the Open Existing Cache scenario in Visual Studio. This option supports macro expansion. | +| `cmakeGenerateCommand` | A command-line tool (specified as a command-line program + arguments, for example, “gencache.bat debug”) to generate the `CMake` cache. This command will run from the shell in the preset’s specified environment when `CMake` configure is invoked. This key is only supported by the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio. This option supports macro expansion | ## Visual Studio Remote Settings vendor map -One vendor map with the vendor URI` microsoft.com/VisualStudioRemoteSettings/CMake/` is allowed per Configure Preset and contains options specific to remote development in Visual Studio. Remote development means you're invoking CMake on a remote SSH connection or WSL. None of the options in the Visual Studio Remote Settings vendor map apply to Visual Studio Code. +One vendor map with the vendor URI` microsoft.com/VisualStudioRemoteSettings/CMake/` is allowed per Configure Preset and contains options specific to remote development in Visual Studio. Remote development means you're invoking `CMake` on a remote SSH connection or WSL. None of the options in the Visual Studio Remote Settings vendor map apply to Visual Studio Code. All settings in the Visual Studio Remote Settings vendor map are optional and inherited from Configure Presets specified by the `inherits` key. Only options that have been modified are written to the file. The Visual Studio Remote Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. -None of the options in the Visual Studio Settings vendor map impact the construction of the CMake or CTest command line. This ensures that the same `CMakePresets.json` file can be used to drive CMake with Visual Studio, Visual Studio Code, and from the command line. +None of the options in the Visual Studio Settings vendor map impact the construction of the `CMake` or `CTest` command line. This ensures that the same `CMakePresets.json` file can be used to drive `CMake` with Visual Studio, Visual Studio Code, and from the command line. Many of the options in the Visual Studio Remote Settings vendor map are ignored when targeting WSL1. This is because the WSL1 toolset executes all commands locally and relies on Windows drives mounted under the /mnt folder to access local source files from WSL1. No source file copy is required. Options that are ignored when targeting WSL1 have been explicitly marked. @@ -67,7 +67,7 @@ Options for a `remotePrebuildEvent` and `remotePostbuildEvent` have been depreca Encode pre-build, pre-link, and post-build events in your CMakeLists.txt using [add_custom_command](https://cmake.org/cmake/help/latest/command/add_custom_command.html#build-events). This will ensure the same behavior when building with Visual Studio and from the command line. -Alternatively, if you need behavior that is specific to Visual Studio, you can add a custom remote task in` tasks.vs.json`. To get started, right-click on your root `CMakeLists.txt` in the **Solution Explorer** from**Folder View** and select **Configure Tasks**. You can then [add a new remote task](https://docs.microsoft.com/en-us/cpp/build/tasks-vs-json-schema-reference-cpp#remote-properties) to your `tasks.vs.json` file. +If you need behavior that is specific to Visual Studio, you can add a custom remote task in` tasks.vs.json`. To get started, right-click on your root `CMakeLists.txt` in the **Solution Explorer** from**Folder View** and select **Configure Tasks**. You can then [add a new remote task](https://docs.microsoft.com/cpp/build/tasks-vs-json-schema-reference-cpp#remote-properties) to your `tasks.vs.json` file. The following remote task creates a directory called test on the remote Linux system: @@ -87,9 +87,9 @@ The value of `remoteMachineName` must match the Host Name of a connection in the ## Microsoft vendor macros -CMakePresets.json and CMakeUserPresets.json allow “vendor maps” for vendors (like Microsoft) to add VS/VS Code specific options. Our vendor maps support all the macros defined by CMake. See [cmake-presets Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. All macros and environment variables are expanded before being passed to cmake.exe. +CMakePresets.json and CMakeUserPresets.json allow “vendor maps” for vendors (like Microsoft) to add VS/VS code-specific options. Our vendor maps support all the macros defined by `CMake`. See [cmake-presets Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. All macros and environment variables are expanded before being passed to `cmake.exe`. -Visual Studio supports vendor macros with the prefix ms. Microsoft vendor macros can only be used in Microsoft vendor maps. CMake can't use presets that have vendor macros outside of a vendor map. +Visual Studio supports vendor macros with the prefix ms. Microsoft vendor macros can only be used in Microsoft vendor maps. `CMake` can't use presets that have vendor macros outside of a vendor map. |Macro |Description | |---------|---------| @@ -99,7 +99,7 @@ Visual Studio supports vendor macros with the prefix ms. Microsoft vendor macros |Macro |Description | |---------|---------| -| `$env{}`
    `$penv{}`| Reference environment variables using this syntax supported by CMake. | +| `$env{}`
    `$penv{}`| Reference environment variables using this syntax supported by `CMake`. | ## Deprecated macros diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index 0648aae3382..1f2c1b7687e 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -22,18 +22,18 @@ This article contains information about `CMakePresets.json` integration in Visua The `CMake` Tools extension supports `CMakePresets.json` and `CMakeUserPresets.json` files version 2 or higher. You can update your file version by incrementing the version field in the root object. For an example and more information, see [`CMakePresets.json` format](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#format). -`CMake` version 3.20 or higher is required when invoking `CMake` with `CMakePresets.json` (version 2 or higher) from the command line. However, Visual Studio reads and evaluates `CMakePresets.json` and `CMakeUserPresets.json` itself and does not invoke `CMake` directly with the `--preset` option. This means `CMake` version 3.20 or higher is not strictly required when building with `CMakePresets.json` inside Visual Studio. Use at least `CMake` version 3.14 or higher. +`CMake` version 3.20 or higher is required when invoking `CMake` with `CMakePresets.json` (version 2 or higher) from the command line. However, Visual Studio reads and evaluates `CMakePresets.json` and `CMakeUserPresets.json` itself and doesn't invoke `CMake` directly with the `--preset` option. This means `CMake` version 3.20 or higher isn't strictly required when building with `CMakePresets.json` inside Visual Studio. Use at least `CMake` version 3.14 or higher. ## Enable `CMakePresets.json` integration in Visual Studio 2019 -`CMakePresets.json` integration is not enabled by default in Visual Studio 2019. You can enable `CMakePresets.json` integration for all `CMake` projects in Tools > Options > `CMake` > General: +`CMakePresets.json` integration isn't enabled by default in Visual Studio 2019. You can enable `CMakePresets.json` integration for all `CMake` projects in Tools > Options > `CMake` > General: ![Enable `CMakePresets.json` in `CMake` options > General](./media/enable-cmakepresets.PNG) > [!Important] -> You must close and reopen the folder in Visual Studio to activate the integration. +> Close and reopen the folder in Visual Studio to activate the integration. -If you do not want to enable `CMakePresets.json` integration for all `CMake` projects, then you can enable `CMakePresets.json` integration for a single `CMake` project by adding a `CMakePresets.json` file to the root of the open folder. You must close and reopen the folder in Visual Studio to activate the integration. +If you don't want to enable `CMakePresets.json` integration for all `CMake` projects, then you can enable `CMakePresets.json` integration for a single `CMake` project by adding a `CMakePresets.json` file to the root of the open folder. You must close and reopen the folder in Visual Studio to activate the integration. The following table indicates when `CMakePresets.json` is used instead of `CMakeSettings.json` to drive `CMake` configuration and build. @@ -98,7 +98,7 @@ If no `CMakePresets.json` or `CMakeUserPresets.json` file exists, or if `CMakePr } } ``` -A `CMakePresets.json` file with the default Configure Presets is automatically created by Visual Studio at the root of your project if you attempt to open or modify a `CMakePresets.json` file that does not exist. +A `CMakePresets.json` file with the default Configure Presets is automatically created by Visual Studio at the root of your project if you attempt to open or modify a `CMakePresets.json` file that doesn't exist. ## Configure and build @@ -118,15 +118,15 @@ In the example above, **192.168.0.5** is a remote Linux system that was added to The dropdown in the middle indicates the active **Configure Preset**. This is the `configurePreset` that will be used when `CMake` is invoked to generate the project build system. This dropdown lists the union of non-hidden Configure Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. -Visual Studio will use the value of `hostOS` in the Microsoft Visual Studio Settings vendor map to hide Configure Presets that do not apply to the active Target System. See the entry for `hostOS` in the table under [Visual Studio Settings vendor map](cmake-presets-json-reference.md#visual-studio-settings-vendor-map) for more information. +Visual Studio will use the value of `hostOS` in the Microsoft Visual Studio Settings vendor map to hide Configure Presets that don't apply to the active Target System. See the entry for `hostOS` in the table under [Visual Studio Settings vendor map](cmake-presets-json-reference.md#visual-studio-settings-vendor-map) for more information. -Select **Manage Configurations…** to open the `CMakePresets.json` file located at the root of the project. `CMakePresets.json` is created if it does not already exist. +Select **Manage Configurations…** to open the `CMakePresets.json` file located at the root of the project. `CMakePresets.json` is created if it doesn't already exist. ## Select a Build Preset The dropdown on the right indicates the active **Build Preset**. This is the `buildPreset` that will be used when `CMake` is invoked to build the project. This dropdown lists the union of non-hidden Build Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. -All Build Presets are required to specify an associated `configurePreset`. Visual Studio hides Build Presets that do not apply to the active Configure Preset. For more information, see [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset). If there are no Build Presets associated with the active Configure Preset, then Visual Studio will list the Default Build Preset. The Default Build Preset is equivalent to passing `cmake --build` with no other arguments from the command line. +All Build Presets are required to specify an associated `configurePreset`. Visual Studio hides Build Presets that don't apply to the active Configure Preset. For more information, see [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset). If there are no Build Presets associated with the active Configure Preset, then Visual Studio will list the Default Build Preset. The Default Build Preset is equivalent to passing `cmake --build` with no other arguments from the command line. ## Configure @@ -139,7 +139,7 @@ To build the entire project, select **Build** > **Build All** from the main menu To build a single target, switch to **CMake Targets View** in the **Solution Explorer**. Then right-click any target and select **Build** from the context menu. > [!NOTE] -> Visual Studio 2019 does not support the `buildPresets.targets` option to build a subset of targets specified in `CMakePresets.json`. +> Visual Studio 2019 doesn't support the `buildPresets.targets` option to build a subset of targets specified in `CMakePresets.json`. ## Run `CTest` @@ -148,7 +148,7 @@ There are two menu options supported by `CMakePresets.json` in Visual Studio 201 - **Test** > **Run CTests** for invokes `CTest` and runs all tests associated with the active Configure Preset and Build Preset, with no additional arguments passed to `CTest`. - **Test** > **Run Test Preset** for will expand to show all Test Presets associated with the active Configure Preset. Selecting a single Test Preset is the same as running `ctest --preset ` from the command line, where `` is the name of the selected Test Preset. This option will be grayed out if no Test Presets are defined for the active Configure Preset. -In Visual Studio 2019 the Test Explorer is not integrated with `CMakePresets.json`. +In Visual Studio 2019 the Test Explorer isn't integrated with `CMakePresets.json`. ## Add new presets @@ -168,7 +168,7 @@ The selected template will be added to `CMakePresets.json` if it exists. Otherwi ## Add new Build Presets and Test Presets -Visual Studio 2019 does not offer templates for new Build Presets and Test Presets. Build Presets and Test Presets can be added by directly editing `CMakePresets.json`. See [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset), [Test Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#test-preset), or [Example `CMakePresets.json` file](#example-cmakepresetsjson-file) for more information. +Visual Studio 2019 doesn't offer templates for new Build Presets and Test Presets. Build Presets and Test Presets can be added by directly editing `CMakePresets.json`. See [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset), [Test Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#test-preset), or [Example `CMakePresets.json` file](#example-cmakepresetsjson-file) for more information. ## Edit presets @@ -237,7 +237,7 @@ The target architecture (x64, Win32, ARM64, or ARM) can be set with `architectur The host architecture (x64 or x86) and toolset can be set with `toolset.value`. This is equivalent to passing `-T` to `CMake` from the command line. See [Toolset Selection](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2016%202019.html#toolset-selection) for more information. -`architecture.strategy` and `toolset.strategy` tell `CMake` how to handle the architecture and toolset fields. set means `CMake` will set the respective value, and external means `CMake` will not set the respective value. +`architecture.strategy` and `toolset.strategy` tell `CMake` how to handle the architecture and toolset fields. set means `CMake` will set the respective value, and external means `CMake` won't set the respective value. `set` should be used with IDE generators like the Visual Studio Generator. `external` should be used with command-line generators like Ninja. This allows vendors like Visual Studio to source the required environment before `CMake` is invoked. See [Configure Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#configure-preset) for more information on the architecture and toolset fields. @@ -267,7 +267,7 @@ You can reference environment variables using the `$env{}` and `$ ## Configure IntelliSense for a cross-compiler -By default, Visual Studio will use the IntelliSense mode that matches your specified toolset and target architecture. If you are cross-compiling, then you may need to manually specify the correct IntelliSense mode with the `intelliSenseMode` option in the Visual Studio Settings vendor map. See the entry for `intelliSenseMode` in the table under [Visual Studio Settings vendor map](cmake-presets-json-reference.md#visual-studio-settings-vendor-map) for more information. +By default, Visual Studio will use the IntelliSense mode that matches your specified toolset and target architecture. If you're cross-compiling, then you may need to manually specify the correct IntelliSense mode with the `intelliSenseMode` option in the Visual Studio Settings vendor map. See the entry for `intelliSenseMode` in the table under [Visual Studio Settings vendor map](cmake-presets-json-reference.md#visual-studio-settings-vendor-map) for more information. ## Configure and build on a remote system or the Windows Subsystem for Linux (WSL) @@ -283,7 +283,7 @@ Remote copy scenarios require a local directory to copy some remote files like ` ## Invoke the same Configure Preset on Windows and WSL1 -You will see an error if you try to use the same Configure Preset on Windows and WSL1. Windows and WSL1 both use the Windows file system, so `CMake` will try and use the same output directory (`binaryDir`) for both the Windows and WSL1 build tree. If you want to use the same Configure Preset with both Windows and the WSL1 toolset, create a second Configure Preset that inherits from the original preset and specifies a new `binaryDir`. In the following example, windows-preset can be used on Windows and base-preset can be used on WSL1: +You'll see an error if you try to use the same Configure Preset on Windows and WSL1. Windows and WSL1 both use the Windows file system, so `CMake` will try to use the same output directory (`binaryDir`) for both the Windows and WSL1 build tree. If you want to use the same Configure Preset with both Windows and the WSL1 toolset, create a second Configure Preset that inherits from the original preset and specifies a new `binaryDir`. In the following example, windows-preset can be used on Windows and base-preset can be used on WSL1: ```json { @@ -299,7 +299,7 @@ You will see an error if you try to use the same Configure Preset on Windows and ``` > [!NOTE] -> In Visual Studio 2019, only the WSL1 toolset is supported. You will see this behavior anytime you invoke configure on both Windows and WSL. +> In Visual Studio 2019, only the WSL1 toolset is supported. You'll see this behavior anytime you invoke configure on both Windows and WSL. ## Vcpkg integration @@ -337,7 +337,7 @@ Update your `launch.vs.json` and `task.vs.json` files to reference `CMakePresets If things aren’t working as expected, there are a few troubleshooting steps that you can take. -If either `CMakePrests.json` or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you are referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run `cmake --list-presets` from the command line at the root of your project directory (`CMake` 3.20 or higher is required). If either file is invalid, then you'll see the following error: +If either `CMakePrests.json` or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you're referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run `cmake --list-presets` from the command line at the root of your project directory (`CMake` 3.20 or higher is required). If either file is invalid, then you'll see the following error: ```DOS `CMake` Error: Could not read presets from @@ -347,17 +347,17 @@ C:/Users//source/repos/: JSON parse error Other troubleshooting steps include: * Delete the cache and reconfigure the project (**CMake: Delete Cache** and **Project** > **Configure **) * Close and reopen the folder in Visual Studio (**File** > **Close Folder**) -* Delete the `.vs` folder at the root your project +* Delete the `.vs` folder at the root your project -If you have identified a problem, the best way to report it is by clicking the **Send Feedback** button in the top right-hand corner of Visual Studio. +If you've identified a problem, the best way to report it is by clicking the **Send Feedback** button in the top right-hand corner of Visual Studio. ## Logging for remote connections -You can enable logging for remote connections if you are having trouble connecting or copying files to a remote system. See [logging for remote connections](https://docs.microsoft.com/cpp/linux/connect-to-your-remote-linux-computer#logging-for-remote-connections) for more information. +You can enable logging for remote connections if you're having trouble connecting or copying files to a remote system. See [logging for remote connections](https://docs.microsoft.com/cpp/linux/connect-to-your-remote-linux-computer#logging-for-remote-connections) for more information. ## Enable AddressSanitizer for Windows and Linux -AddressSanitizer (`ASan`) is a runtime memory error detector for C and C++ that is supported in Visual Studio for both Windows and Linux development. AddressSanitizer was enabled with an option (`addressSanitizerEnabled`) in `CMakeSettings.json`. This behavior is not supported by `CMakePresets.json`. +AddressSanitizer (`ASan`) is a runtime memory error detector for C and C++ that is supported in Visual Studio for both Windows and Linux development. AddressSanitizer was enabled with an option (`addressSanitizerEnabled`) in `CMakeSettings.json`. This behavior isn't supported by `CMakePresets.json`. Instead, enable and disable AddressSanitizer by setting the required compiler and linker flags yourself. This removes Visual Studio specific behavior and ensures that the same `CMakePresets.json` file can reproduce your build from the command line. The following sample can be added to a `CMakeLists.txt` to enable or disable AddressSanitizer for a target. @@ -376,7 +376,7 @@ endif() `` are other compilation flags like `"-fno-omit-frame-pointer"`. See [Using AddressSanitizer](https://docs.microsoft.com/cpp/sanitizers/asan#command-prompt) for more information on `ASan` for Linux, and Use the AddressSanitizer from a Developer Command Prompt for more information on `ASan` with MSVC. -Pass additional runtime flags to AddressSanitizer with the `ASAN_OPTIONS` field in `launch.vs.json`. `ASAN_OPTIONS` defaults to `detect_leaks=0` when no other runtime options are specified because LeakSanitizer is not supported in Visual Studio. +Pass additional runtime flags to AddressSanitizer with the `ASAN_OPTIONS` field in `launch.vs.json`. `ASAN_OPTIONS` defaults to `detect_leaks=0` when no other runtime options are specified because LeakSanitizer isn't supported in Visual Studio. ## Run `CMake` from the command line or a continuous integration (CI) pipeline @@ -384,11 +384,11 @@ You can use the same `CMakePresets.json` and `CMakeUserPresets.json` files to in ## Sourcing the environment when building with command-line generators on Windows -It’s up to the user to configure the environment before `CMake` is invoked when building with a command-line generator. If you’re building with Ninja and the Visual C++ toolset on Windows, then you will need to source the environment before `CMake` is called to generate the build system. You can do this by calling vcvarsall.bat with the architecture argument. architecture specifies the host and target architecture to use. See [vcvarsall syntax](https://docs.microsoft.com/cpp/build/building-on-the-command-line#vcvarsall-syntax) for more information. If you build on Linux or on Windows with a Visual Studio Generator, then you don't need to take this step. +It’s up to the user to configure the environment before `CMake` is invoked when building with a command-line generator. If you’re building with Ninja and the Visual C++ toolset on Windows, then you'll need to source the environment before `CMake` is called to generate the build system. You can do this by calling vcvarsall.bat with the architecture argument. architecture specifies the host and target architecture to use. See [vcvarsall syntax](https://docs.microsoft.com/cpp/build/building-on-the-command-line#vcvarsall-syntax) for more information. If you build on Linux or on Windows with a Visual Studio Generator, then you don't need to take this step. -This is the same step that Visual Studio takes for you when `CMake` is invoked by the IDE. Visual Studio parses the active Configure Preset for the host and target architecture specified by toolset and architecture and then sources the specified environment from `vcvarsall.bat`. When you build from the Windows command line with Ninja, you will need to take this step yourself. +This is the same step that Visual Studio takes for you when `CMake` is invoked by the IDE. Visual Studio parses the active Configure Preset for the host and target architecture specified by toolset and architecture and then sources the specified environment from `vcvarsall.bat`. When you build from the Windows command line with Ninja, you'll need to take this step yourself. -`vcvarsall.bat` is installed with the Build Tools for Visual Studio. By default, `vcvarsall.bat` is installed in `C:\Program Files (x86)\Microsoft Visual Studio\2019\\VC\Auxiliary\Build`. You can add `vcvarsall.bat` to your `PATH` if you use the command line workflow frequently. +`vcvarsall.bat` is installed with the Build Tools for Visual Studio. By default, `vcvarsall.bat` is installed in `C:\Program Files (x86)\Microsoft Visual Studio\2019\\VC\Auxiliary\Build`. You can add `vcvarsall.bat` to your `PATH` if you use the command-line workflow frequently. ## Example command-line workflow From 160374566211d5646e67987c49768c638af7dafd Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 6 Apr 2021 17:20:44 -0700 Subject: [PATCH 33/82] tech review --- docs/build/header-unit-json-reference.md | 3 +- docs/build/reference/experimental-module.md | 6 +- docs/build/reference/headername.md | 24 +++- docs/build/reference/headerunit.md | 20 +-- docs/build/reference/module-exportheader.md | 46 +++---- docs/build/reference/module-reference.md | 12 +- .../sourcedependencies-directives.md | 119 ++++++++++++++++++ docs/build/reference/sourcedependencies.md | 30 ++--- docs/build/toc.yml | 2 + 9 files changed, 189 insertions(+), 73 deletions(-) create mode 100644 docs/build/reference/sourcedependencies-directives.md diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index 8118b80c84f..fa0dea8ebde 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -8,7 +8,7 @@ helpviewer_keywords: ["header-units.json", "header unit"] # C++ header-units.json reference -The `header-units.json` file lists which header files in the directory it's located in can be automatically built by the build system as header units, and then treated as an `import` instead of an `#include`. +The `header-units.json` file lists which header files in the directory this file lis located in can be automatically built by the build system into header units, and then treated as an `import` instead of an `#include`. Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` at compile time to determine its behavior. Using `#define` can't be used to change the behavior of a header unit, so `` shouldn't be compiled into a header unit because it wouldn't provide the expected behavior. @@ -35,7 +35,6 @@ For example: "bitset", // "cassert", // design is not compatible with header units ... -} ``` ## Search rules diff --git a/docs/build/reference/experimental-module.md b/docs/build/reference/experimental-module.md index 937b2ceedb5..7d8bdec4278 100644 --- a/docs/build/reference/experimental-module.md +++ b/docs/build/reference/experimental-module.md @@ -24,7 +24,7 @@ For more information on modules and how to use and create them, see [Overview of Here's an example of the compiler command-line options used to create an export module from source file *ModuleName.ixx*: ```cmd -cl /EHsc /MD /experimental:module /module:export /module:name ModuleName /module:wrapper C:\Output\path\ModuleName.h /module:output C:\Output\path\ModuleName.ifc -c ModuleName.ixx +cl /EHsc /MD /experimental:module /export /module:name ModuleName /module:wrapper C:\Output\path\ModuleName.h /module:output C:\Output\path\ModuleName.ifc -c ModuleName.ixx ``` ### To set this compiler option in the Visual Studio development environment @@ -40,7 +40,7 @@ cl /EHsc /MD /experimental:module /module:export /module:name ModuleName /module ## See also [`/headerUnit` (Use header unit IFC)](headerunit.md)\ -[`/module:exportHeader` (Create header units)](module-exportheader.md)\ -[`/module:reference` (Use named module IFC)](module-reference.md)\ +[`/exportHeader` (Create header units)](module-exportheader.md)\ +[`/reference` (Use named module IFC)](module-reference.md)\ [`/translateInclude` (Translate include directives into import directives)](translateinclude.md)\ [/Zc (Conformance)](zc-conformance.md) diff --git a/docs/build/reference/headername.md b/docs/build/reference/headername.md index bc0d26b6a04..42392534c11 100644 --- a/docs/build/reference/headername.md +++ b/docs/build/reference/headername.md @@ -21,19 +21,33 @@ The name of a header file that the compiler should compile into a header unit (a ## Remarks -The **`/headerName`** compiler option requires the [/std:c++latest](std-specify-language-standard-version.md) option. The **`/headerName`** compiler option is available starting in Visual Studio 2019 version 16.10 preview 2. +The **`/headerName`** compiler option is available starting in Visual Studio 2019 version 16.10 preview 2.\ -**`/headerName:quote`** Lookup *`header-filename`* using the same rules as `#include "header-name"` and build it as a header unit (*`.ifc`* file). +The **`/headerName`** compiler option, in all its forms, requires the [/std:c++latest](std-specify-language-standard-version.md) option.\ +If you specify **`/headerName{quote,angle}`**, you must also specify [`/exportHeader`](module-exportheader.md). -**`/headerName:angle`** Lookup *`header-filename`* using the same rules as `#include ` and build it as a header unit (*`.ifc`* file). +**`/headerName:quote`** looks up *`header-filename`* using the same rules as `#include "header-name"` and build it as a header unit (*`.ifc`* file).\ +**`/headerName:angle`** looks up *`header-filename`* using the same rules as `#include ` and build it as a header unit (*`.ifc`* file). ### Examples Given a project that references a header file it defines called `m.h`, the compiler option to compile it into a header unit might look like this: -```CMD -cl /std:c++latest /exportHeader /headerName:quote m.h /Fom.h.obj +```Bash +$ cl /std:c++latest /exportHeader /headerName:quote m.h /Fom.h.obj +``` + +The `/headerName:{quote,angle}`switch acts like a flag and does not explicitly need an argument. The following examples are valid: + +```Bash +$ cl /std:c++latest /exportHeader /headerName:angle /MP /Fo.\ vector iostream algorithm +$ cl /std:c++latest /exportHeader /headerName:quote /MP /Fo.\ my-utilities.h a/b/my-core.h +``` + +You can specify multiple `/headerName` switches on the same command line, and every argument after that switch will be processed with the specified *`header-filename`* lookup rules. The following example processes all the headers as the previous two command line examples in the same way. It looks up the headers using the lookup rules applied as if they had been specified as: `#include `, `#include "my-utilties.h"`, and `#include "a/b/my-core.h"`: +```bash +$ cl /std:c++latest /exportHeader /headerName:angle /MP /Fo.\ vector iostream algorithm /headerName:quote my-utilities.h a/b/my-core.h ``` ### To set this compiler option in the Visual Studio development environment diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index 0364a0b6af0..7b8cd5dbf69 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -11,32 +11,38 @@ Tells the compiler where to find the *`.ifc`* file (the binary representation of ## Syntax -> **`/headerUnit`** *`header-filename`*=*`ifc-filename`* -> **`/headerUnit:quote`** *`header-filename`*=*`ifc-filename`* -> **`/headerUnit:angle`** *`header-filename`*=*`ifc-filename`* +> **`/headerUnit`** *`header-filename`*=*`ifc-filename`*\ +> **`/headerUnit:quote`** \[*`header-filename`*=*`ifc-filename`*\]\ +> **`/headerUnit:angle`** \[*`header-filename`*=*`ifc-filename`*\] ### Arguments *`header-filename`*\ -The name of a header file that the compiler resolves to a `ifc-filename` during import. During `import header-name;` the compiler resolves `header-name` to a file on disk. Use *`header-filename`* to specify that file. Once matched, the compiler opens the corresponding IFC named by *`ifc-filename`* for import. +During `import header-name;` the compiler resolves `header-name` to a file on disk. Use *`header-filename`* to specify that file. Once matched, the compiler opens the corresponding IFC named by *`ifc-filename`* for import. *`ifc-filename`*\ The name of a file that contains compiled header unit information. To import more than one header unit, include a separate **`/headerUnit`** option for each file. ## Remarks -The **`/headerUnit`** compiler option requires the [/std:c++latest](std-specify-language-standard-version.md) option. The **`/headerUnit`** compiler option is available starting in Visual Studio 2019 version 16.10 preview 2. +The **`/headerUnit`** compiler option requires the [/std:c++latest](std-specify-language-standard-version.md) option. + +The **`/headerUnit`** compiler option is available starting in Visual Studio 2019 version 16.10 preview 2. When the compiler comes across `import "file";` or `import `, this compiler switch helps the compiler find the compiled header unit (*`.ifc`*) for the specified header file. The path to this file can be expressed in three ways: **`/headerUnit`** looks up the compiled header unit in the current directory, or at the location specified in *`ifc-filename`*. -**`/headerUnit:quote`** looks up the compiled header unit file using the same rules as `#include "file"`. +**`/headerUnit:quote`** looks up the compiled header unit file using the same rules as `#include "file"`. This switch acts like a flag and can take, but doesn't require, an argument. -**`/headerUnit:angle`** looks up the compiled header unit file using the same rules as `#include `. +**`/headerUnit:angle`** looks up the compiled header unit file using the same rules as `#include `. This switch acts like a flag and can take, but doesn't require, an argument. The compiler can't map a single *`header-name`* to multiple IFC files. While mapping multiple *`header-name`* arguments to a single IFC is possible, we don't recommend it. The contents of the IFC get imported as if it was only the header specified by *`header-name`*. +The compiler implicitly enables the new preprocessor when this switch is used. That is, [`/Zc:preprocessor`](zc-preprocessor.md) is added to the command line by the compiler if any form of `/headerUnit` is specified on the command line. To opt out of the implicit `/Zc:preprocessor`, specify: `/Zc:preprocessor-` + +If you disable the new preprocessor but a file you compile imports a header unit, the compiler will report an error. + ### Examples Given a project that references two header files and their header units, listed in this table: diff --git a/docs/build/reference/module-exportheader.md b/docs/build/reference/module-exportheader.md index e3081425d6c..476bdfce6bb 100644 --- a/docs/build/reference/module-exportheader.md +++ b/docs/build/reference/module-exportheader.md @@ -11,60 +11,42 @@ Tells the compiler to create the header units specified by the input arguments. ## Syntax -> **`/exportHeader`** *`header-name`* \[...]\ -> **`/exportHeader`** *`filename`* \[...] -> **`/exportHeader /headerName:angle`** *`filename`* -> **`/exportHeader /headerName:quote`** *`filename`* +> **`/exportHeader /headerName:angle`** *`header-name`* +> **`/exportHeader /headerName:quote`** *`header-name`* ### Arguments -*`header-name`*\ -The header file to export. Must take the same form as an argument to an `#include` directive. - -*`filename`*\ -The relative or absolute path to the header file to create a header unit from. +The argument to `/exportHeader` is a `/headerName`command-line option that specifies the name, *`header-name`*, of the header file to export. ## Remarks -The **`/exportHeader`** compiler option requires you enable the [/std:c++latest](std-specify-language-standard-version.md) option. **`/exportHeader`** is available starting in Visual Studio 2019 version 16.10 Preview 2. - -One **`/exportHeader`** compiler option can specify as many header-name arguments as your build requires. You don't need to specify them separately. - -By default, the compiler doesn't produce an object file when a header unit is compiled. To produce an object file, specify the **`/Fo`** compiler option. For more information, see [`/Fo` (Object File Name)](fo-object-file-name.md). - -The compiler resolves a *`header-name`* based on the include directory search order, including any you specify. For more information, see [`/I` (Additional include directories)](i-additional-include-directories.md). +**`/exportHeader`** is available starting in Visual Studio 2019 version 16.10 Preview 2. -The argument *`header-name`* must be specified the same way it would appear in source. The argument is sensitive to quoting rules and to `<` and `>` operators on the command line. The properly escaped command to build a header unit such as `` using the VS2019 command prompt might look like: +The **`/exportHeader`** compiler option requires you enable the [/std:c++latest](std-specify-language-standard-version.md) option. -```cmd -cl ... /std:c++latest /exportHeader "" -``` +One **`/exportHeader`** compiler option can specify as many header-name arguments as your build requires. You don't need to specify them separately. -Building a local project header such as `"utils/util.h"` might look like: +The compiler implicitly enables the new preprocessor when this switch is used. That is, [`/Zc:preprocessor`](zc-preprocessor.md) is added to the command line by the compiler if any form of `/exportHeader` is used on the command line. To opt out of the implicit `/Zc:preprocessor`, use: `/Zc:preprocessor-` -```cmd -cl ... /std:c++latest /exportHeader """util/util.h""" -``` - -The quoting rules in other command-line processors may differ. +By default, the compiler doesn't produce an object file when a header unit is compiled. To produce an object file, specify the **`/Fo`** compiler option. For more information, see [`/Fo` (Object File Name)](fo-object-file-name.md). -When using the *`header-name`* form of **`/exportHeader`**, you may find it's helpful to use the complementary option **`/module:showResolvedHeader`**. The **`/module:showResolvedHeader`** option prints an absolute path to the file the *`header-name`* argument resolves to. +You may find it helpful to use the complementary option **`/showResolvedHeader`**. The **`/showResolvedHeader`** option prints an absolute path to the file the *`header-name`* argument resolves to. -**`/exportHeader`** can handle multiple inputs at once even under **`/MP`**. We recommended you use **`/module:output `** to create a separate IFC file for each compilation. +**`/exportHeader`** can handle multiple inputs at once even under **`/MP`**. We recommended you use **`/ifcOutput `** to create a separate *`.ifc`* file for each compilation. ### Examples -Given headers `"C:\util\util.h"` and `"C:\app\app.h"`, you can export them as *`header-name`* arguments by using this command: +To build a header unit such as `` might look like: ```cmd -cl /std:c++latest /IC:\ /exportHeader """util/util.h""" """app/app.h""" /FoC:\obj +cl … /std:c++latest /exportHeader /headerName:angle vector ``` -You can export them as *`filename`* arguments by using this command: +Building a local project header such as `"utils/util.h"` might look like: ```cmd -cl /std:c++latest /IC:\ /exportHeader C:\util\util.h C:\app\app.h /FoC:\obj +cl … /std:c++latest /exportHeader /headerName:quote util/util.h ``` ### To set this compiler option in the Visual Studio development environment diff --git a/docs/build/reference/module-reference.md b/docs/build/reference/module-reference.md index 9f8bb1f6f87..1c8c8e64437 100644 --- a/docs/build/reference/module-reference.md +++ b/docs/build/reference/module-reference.md @@ -24,7 +24,7 @@ A valid name of an exported primary module interface unit name or full module pa ## Remarks -The **`/reference`** compiler option requires you enable experimental modules support by use of the [`/experimental:module`](experimental-module.md) compiler option, along with the [/std:c++latest](std-specify-language-standard-version.md) option. This option is available starting in Visual Studio 2019 version 16.10 Preview 2. +The **`/reference`** compiler option requires you enable the [/std:c++latest](std-specify-language-standard-version.md) option. The **`/reference`** option is available starting in Visual Studio 2019 version 16.10 Preview 2. If the **`/reference`** argument is a *`filename`* without a *`module-name`*, the file gets opened at runtime to verify the *`filename`* argument names a specific import. It can result in slower runtime performance in scenarios that have many **`/reference`** arguments. @@ -45,7 +45,7 @@ Examples of full module partition names include: If a module reference is created using a *`module-name`*, other modules on the command line don't get searched if the compiler encounters an import of that name. For example, given this command line: ```cmd -cl ... /std:c++latest /experimental:module /reference m.ifc /reference m=n.ifc +cl ... /std:c++latest /reference m.ifc /reference m=n.ifc ``` In the case above, if the compiler sees `import m;` then *`m.ifc`* doesn't get searched. @@ -63,13 +63,13 @@ Given three modules as listed in this table: The reference options using a *`filename`* argument could look like: ```cmd -cl ... /std:c++latest /experimental:module /reference m.ifc /reference m-part.ifc /reference Networking.ifc +cl ... /std:c++latest /reference m.ifc /reference m-part.ifc /reference Networking.ifc ``` The reference options using *`module-name=filename`* could look like: ```cmd -cl ... /std:c++latest /experimental:module /reference m=m.ifc /reference M:Part1=m-part.ifc /reference Core.Networking=Networking.ifc +cl ... /std:c++latest /reference m=m.ifc /reference M:Part1=m-part.ifc /reference Core.Networking=Networking.ifc ``` ### To set this compiler option in the Visual Studio development environment @@ -87,7 +87,7 @@ cl ... /std:c++latest /experimental:module /reference m=m.ifc /reference M:Part1 ## See also -[`/experimental:module` (Enable module support)](experimental-module.md)\ +[`/sourcedependencies:directives` (use header file to header unit allow-list)](sourcedependencies-directives.md)\ [`/headerUnit` (Use header unit IFC)](headerunit.md)\ -[`/module:exportHeader` (Create header units)](module-exportheader.md)\ +[`/exportHeader` (Create header units)](module-exportheader.md)\ [`/translateInclude` (Translate include directives into import directives)](translateinclude.md) diff --git a/docs/build/reference/sourcedependencies-directives.md b/docs/build/reference/sourcedependencies-directives.md new file mode 100644 index 00000000000..6ac83772752 --- /dev/null +++ b/docs/build/reference/sourcedependencies-directives.md @@ -0,0 +1,119 @@ +--- +title: "/sourceDependencies:directives (Report source-level dependencies and use an allow-list)" +description: "Reference guide to the /sourceDependencies:directives compiler option in Microsoft C++." +ms.date: 04/13/2020 +f1_keywords: ["/sourceDependencies:directives"] +helpviewer_keywords: ["/sourceDependencies:directives compiler option", "/sourceDependencies:directives"] +--- +# `/sourceDependencies:directives` (Report source-level dependencies and use an allow-list) + +This command-line switch generates a JSON file that details the source-level dependencies consumed during compilation. It also looks for a `header-units.json` file that specifies which header files can be converted to header units. + +This command-line option is similar to [`/sourceDependencies`](sourcedependencies.md), but differs in the following ways: + +- Unlike `/sourceDependencies`, the compiler doesn't produce compiled output. Instead, the files are scanned for module directives, but no compiled code, modules, or header units are produced. +- Unlike `/sourceDependencies`, the output JSON file doesn't list imported modules and imported header units (`.ifc` files) because this switch does a scan of the project files, not a compilation, so there are no built modules or header units to import. +- `/sourceDependencies:directives`is designed to be used before `.ifc` files are built. + +## Syntax + +> **`/sourceDependencies:directives[-]`** *filename*\ +> **`/sourceDependencies:directives[-]`** *directory*\ + +## Arguments + +*`-`*\ +If the single dash is provided then the compiler will emit the source dependencies JSON to `stdout` or where the compiler output is redirected to. + +*`filename`*\ +The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path.\ + +*`directory`*\ +If the argument is a directory, the compiler generates source dependency files in the specified directory. The output file name is based on the full name of the input file, with an appended *`.json`* extension. For example, if the file provided to the compiler is *`main.cpp`*, the generated output filename is *`main.cpp.json`*. + +## Remarks + +**`/sourceDependencies:directives`** is available starting in Visual Studio 2019 version 16.10 Preview 2. It's not enabled by default. + +When you specify the **`/MP`** compiler option, we recommend you use **`/sourceDependencies`** with a directory argument. If you provide a single filename argument, two instances of the compiler may attempt to open the output file simultaneously and cause an error. For more information on **`/MP`**, see [`/MP` (Build with multiple processes)](mp-build-with-multiple-processes.md). + +When a non-fatal compiler error occurs, the dependency information still gets written to the output file. + +All file paths appear as absolute paths in the output. + +This switch is used in combination with [`/translateInclude`](translateinclude.md). + +`header-units.json` is used with the build system's **Scan Sources for Module Dependencies** to determine which header files can be compiled into a header unit. When this switch is specified, header files encountered in the scanned source files, that are also listed in `header-units.json`, are considered eligible to be compiled into header units. Files not in the list are instead treated as a normal `#include`. + +The compiler looks for `header-units.json` where the header being loaded is located. For more information about the format of this file, see [C++ header-units.json reference](..\header-unit-json-reference.md) + +When a non-fatal compiler error occurs, the dependency information still gets written to the output file. + +All file paths appear as absolute paths in the output. + +### Examples + +Given the following sample code: + +```cpp +//main.cpp: +#include + +import m; +import std.core; + +import ; + +import "t.h"; + +int main() {} +``` + +You can use **`/sourceDependencies`** with the rest of your compiler options: + +> `cl /std:c++latest /translateInclude /sourceDependencies:directives deps.json main.cpp` + +This command line produces a JSON file *`deps.json`* with content like: + +```JSON +{ + "Version":"1.1", + "Data":{ + "Source":"C:\\a\\b\\main.cpp", + "ProvidedModule":"", + "ImportedModules":[ + "m", + "std.core" + ], + "ImportedHeaderUnits":[ + "C:\\...\\utility", + "C:\\a\\b\\t.h", + "C:\\...\\vector" + ] + } +} +``` + +We've used `...` to abbreviate the reported paths; the report contains the absolute paths. The paths reported depend on where the compiler finds the dependencies. If the results are unexpected, you may want to check your project's include path settings. + +No *`.ifc`* files are listed in the output because they weren't built. Unlike `/sourceDependencies`, the compiler doesn't produce compiled output when `/sourceDependencies:directives`is specified, so no compiled modules or header units are produced to import. + +### To set the /sourceDependencies compiler option in Visual Studio + +> [!NOTE] +> This command line switch is typically set by the build system. + +1. Open the **Property Pages** dialog box for the project. For more information, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). + +1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. + +1. In the **Additional options** box, add *`/sourceDependencies:directives `* and then choose **OK** or **Apply** to save your changes. + +### To set this compiler option programmatically + +- This option doesn't have a programmatic equivalent. + +## See also + +[MSVC compiler options](compiler-options.md)\ +[MSVC compiler command-line syntax](compiler-command-line-syntax.md) \ No newline at end of file diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index a8150036c3e..75ae0343754 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -7,11 +7,7 @@ helpviewer_keywords: ["/sourceDependencies compiler option", "/sourceDependencie --- # `/sourceDependencies` (Report source-level dependencies) -This command-line option comes in two forms: - -- `/sourceDependencies:directives` is used with `/translateInclude` to specify a JSON file that contains an allowlist of header files that can be compiled into header units. - -The `/sourceDependencies` form generates a JSON file that details the source-level dependencies consumed during compilation. The JSON file contains a list of the source dependencies, which include: +This command-line switch generates a JSON file that details the source-level dependencies consumed during compilation. The JSON file contains a list of the source dependencies, which include: - Header files (both transitive and directly included headers). - The PCH used (if **`/Yu`** is specified). @@ -19,25 +15,23 @@ The `/sourceDependencies` form generates a JSON file that details the source-lev ## Syntax -> **`/sourceDependencies`** *filename*\ -> **`/sourceDependencies`** *directory*\ -> **`/sourceDependencies:directives`** *filename*\ +> **`/sourceDependencies[-]`** *filename*\ +> **`/sourceDependencies[-]`** *directory*\ ## Arguments -*filename*\ +*`-`*\ +If the single dash is provided then the compiler will emit the source dependencies JSON to `stdout` or where the compiler output is redirected to. + +*`filename`*\ The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path.\ -In the `/sourceDependencies:directives` case, *filename* refers to a JSON file that lists which header files can be compiled into a header unit. See [C++ header-units.json reference](..\header-unit-json-reference.md) for an example. -*directory*\ +*`directory`*\ If the argument is a directory, the compiler generates source dependency files in the specified directory. The output file name is based on the full name of the input file, with an appended *`.json`* extension. For example, if the file provided to the compiler is *`main.cpp`*, the generated output filename is *`main.cpp.json`*. ## Remarks The **`/sourceDependencies`** compiler option is available starting in Visual Studio 2019 version 16.7. It's not enabled by default. -The **`/sourceDependencies:directives`** compiler option is available starting in Visual Studio 2019 version 16.10 Preview 2. It's not enabled by default. - -The `/sourceDependencies:directives` form refers to a JSON file that is used as allowlist used with the build system's **Scan Sources for Module Dependencies**`to determine which header files can be compiled into a header unit. When this switch is specified, header files encountered in the scanned source files, that are also listed in the specified JSON file, are compiled into header units. Files not in the list aren't compiled to header units and instead are treated as a normal `#include`. When you specify the **`/MP`** compiler option, we recommend you use **`/sourceDependencies`** with a directory argument. If you provide a single filename argument, two instances of the compiler may attempt to open the output file simultaneously and cause an error. For more information on **`/MP`**, see [`/MP` (Build with multiple processes)](mp-build-with-multiple-processes.md). @@ -58,22 +52,22 @@ import "other.h"; int main() { } ``` -You can use **`/sourceDependencies`** along with the rest of your compiler options: +You can use **`/sourceDependencies`** with the rest of your compiler options: > `cl ... /sourceDependencies output.json ... main.cpp` -where `...` represents your other compiler options. This command line produces a JSON file *`output.json`* with content something like: +where `...` represents your other compiler options. This command line produces a JSON file *`output.json`* with content like: ```JSON { - "Version": "1.0", + "Version": "1.1", "Data": { "Source": "C:\\...\\main.cpp", "PCH": "C:\\...\\pch.pch", "Includes": [ "C:\\...\\header.h" ], - "Modules": [ + "ImportedModules": [ "C:\\...\\m.ifc", "C:\\...\\other.h.ifc" ] diff --git a/docs/build/toc.yml b/docs/build/toc.yml index f02c568b6cc..39baa96a09a 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -707,6 +707,8 @@ href: ../build/reference/source-charset-set-source-character-set.md - name: /sourceDependencies (Report source-level dependencies) href: ../build/reference/sourcedependencies.md + - name: /sourceDependencies:directives (use allow-list) + href: ../build/reference/sourcedependencies-directives.md - name: /std (Specify language standard version) href: ../build/reference/std-specify-language-standard-version.md - name: /Tc, /Tp, /TC, /TP (Specify source file type) From fc4f5266a1033da8b652cbc44316965218f5f11f Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 6 Apr 2021 17:40:21 -0700 Subject: [PATCH 34/82] small edits --- docs/build/header-unit-json-reference.md | 7 +++---- docs/build/toc.yml | 2 +- docs/build/walkthrough-header-units.md | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index fa0dea8ebde..95df674c275 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -8,7 +8,7 @@ helpviewer_keywords: ["header-units.json", "header unit"] # C++ header-units.json reference -The `header-units.json` file lists which header files in the directory this file lis located in can be automatically built by the build system into header units, and then treated as an `import` instead of an `#include`. +The `header-units.json` file lists which header files can be automatically built by the build system into header units, and then treated as an `import` instead of an `#include`. Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` at compile time to determine its behavior. Using `#define` can't be used to change the behavior of a header unit, so `` shouldn't be compiled into a header unit because it wouldn't provide the expected behavior. @@ -16,10 +16,9 @@ When the command-line switch [`/translateInclude` (Translate include directives ## Schema -The format of the `header-units.json` file starts with the schema version, followed by an array of filenames for headers that can be built into header units. +The format of the `header-units.json` file starts with the schema version, followed by an array of filenames for headers that can be built into header units. The schema also supports comments, as shown below: -For example: ```json { @@ -39,7 +38,7 @@ For example: ## Search rules -The build system looks for this file in the same directory as the header file. If your library is organized into subdirectories, each subdirectory will need its own `header-units.json` file. +The build system looks for this file in the same directory as the header file being processed. If your library is organized into subdirectories, each subdirectory will need its own `header-units.json` file. ## See also diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 39baa96a09a..3208452aba4 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -91,7 +91,7 @@ href: ../build/walkthrough-header-units.md - name: "Walkthrough: Import STL libraries as header units" href: ../build/walkthrough-import-stl-header-units.md - - name: header-unit-json schema reference (C++) + - name: header-unit.json schema reference (C++) href: ../build/header-unit-json-reference.md - name: Precompiled header files href: ../build/creating-precompiled-header-files.md diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index b23225cde84..c46995ff25c 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -101,4 +101,4 @@ If you only want to convert a few header files to header units, this is a good a [Overview of modules in C++](../cpp/modules-cpp.md) \ [`/translateInclude`](./reference/translateinclude.md) \ [`/exportHeader`](./reference/module-exportheader.md) \ -[`/headerUnit`](./reference/headerunit.md) \ \ No newline at end of file +[`/headerUnit`](./reference/headerunit.md) \ No newline at end of file From b3fcc7429802062add75ba093e523984c9ec9268 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 6 Apr 2021 17:47:33 -0700 Subject: [PATCH 35/82] acrolinx --- docs/build/reference/experimental-module.md | 8 ++++---- docs/build/reference/sourcedependencies-directives.md | 8 ++++---- docs/build/reference/sourcedependencies.md | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/build/reference/experimental-module.md b/docs/build/reference/experimental-module.md index 7d8bdec4278..40e229e72a6 100644 --- a/docs/build/reference/experimental-module.md +++ b/docs/build/reference/experimental-module.md @@ -15,13 +15,13 @@ Enables experimental compiler support for modules, as specified by the draft C++ ## Remarks -You can enable experimental modules support by use of the **/experimental:module** compiler option along with the [/std:c++latest](std-specify-language-standard-version.md) option. You can use **/experimental:module-** to disable module support explicitly. +You can enable experimental modules support by use of the **`/experimental:module`** compiler option along with the [/std:c++latest](std-specify-language-standard-version.md) option. You can use **`/experimental:module-`** to disable module support explicitly. -This option is available starting in Visual Studio 2015 Update 1. As of Visual Studio 2019 version 16.2, Draft C++20 Standard modules are not fully implemented in the Microsoft C++ compiler. You can use the modules feature to create single-partition modules and to import the Standard Library modules provided by Microsoft. A module and the code that consumes it must be compiled with the same compiler options. +This option is available starting in Visual Studio 2015 Update 1. As of Visual Studio 2019 version 16.2, Draft C++20 Standard modules aren't fully implemented in the Microsoft C++ compiler. You can use the modules feature to create single-partition modules and to import the Standard Library modules provided by Microsoft. A module and the code that consumes it must be compiled with the same compiler options. For more information on modules and how to use and create them, see [Overview of modules in C++](../../cpp/modules-cpp.md). -Here's an example of the compiler command-line options used to create an export module from source file *ModuleName.ixx*: +Here's an example of the compiler command-line options used to create an export module from source file *`ModuleName.ixx`*: ```cmd cl /EHsc /MD /experimental:module /export /module:name ModuleName /module:wrapper C:\Output\path\ModuleName.h /module:output C:\Output\path\ModuleName.ifc -c ModuleName.ixx @@ -43,4 +43,4 @@ cl /EHsc /MD /experimental:module /export /module:name ModuleName /module:wrappe [`/exportHeader` (Create header units)](module-exportheader.md)\ [`/reference` (Use named module IFC)](module-reference.md)\ [`/translateInclude` (Translate include directives into import directives)](translateinclude.md)\ -[/Zc (Conformance)](zc-conformance.md) +[`/Zc` (Conformance)](zc-conformance.md) diff --git a/docs/build/reference/sourcedependencies-directives.md b/docs/build/reference/sourcedependencies-directives.md index 6ac83772752..10a31492133 100644 --- a/docs/build/reference/sourcedependencies-directives.md +++ b/docs/build/reference/sourcedependencies-directives.md @@ -1,11 +1,11 @@ --- -title: "/sourceDependencies:directives (Report source-level dependencies and use an allow-list)" +title: "/sourceDependencies:directives (Report source-level dependencies and use an allowlist)" description: "Reference guide to the /sourceDependencies:directives compiler option in Microsoft C++." ms.date: 04/13/2020 f1_keywords: ["/sourceDependencies:directives"] helpviewer_keywords: ["/sourceDependencies:directives compiler option", "/sourceDependencies:directives"] --- -# `/sourceDependencies:directives` (Report source-level dependencies and use an allow-list) +# `/sourceDependencies:directives` (Report source-level dependencies and use an allowlist) This command-line switch generates a JSON file that details the source-level dependencies consumed during compilation. It also looks for a `header-units.json` file that specifies which header files can be converted to header units. @@ -23,7 +23,7 @@ This command-line option is similar to [`/sourceDependencies`](sourcedependencie ## Arguments *`-`*\ -If the single dash is provided then the compiler will emit the source dependencies JSON to `stdout` or where the compiler output is redirected to. +If the single dash is provided, then the compiler will emit the source dependencies JSON to `stdout` or where the compiler output is redirected to. *`filename`*\ The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path.\ @@ -43,7 +43,7 @@ All file paths appear as absolute paths in the output. This switch is used in combination with [`/translateInclude`](translateinclude.md). -`header-units.json` is used with the build system's **Scan Sources for Module Dependencies** to determine which header files can be compiled into a header unit. When this switch is specified, header files encountered in the scanned source files, that are also listed in `header-units.json`, are considered eligible to be compiled into header units. Files not in the list are instead treated as a normal `#include`. +`header-units.json` is used with the build system's **Scan Sources for Module Dependencies** to determine which header files can be compiled into a header unit. When this switch is specified, header files found in the scanned source files, that are also listed in `header-units.json`, are considered eligible to be compiled into header units. Files not in the list are instead treated as a normal `#include`. The compiler looks for `header-units.json` where the header being loaded is located. For more information about the format of this file, see [C++ header-units.json reference](..\header-unit-json-reference.md) diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index 75ae0343754..d73f51a3092 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -21,7 +21,7 @@ This command-line switch generates a JSON file that details the source-level dep ## Arguments *`-`*\ -If the single dash is provided then the compiler will emit the source dependencies JSON to `stdout` or where the compiler output is redirected to. +If the single dash is provided, then the compiler will emit the source dependencies JSON to `stdout` or where the compiler output is redirected to. *`filename`*\ The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path.\ From a816923380b5079ea07a1bfd458da93fe740f07b Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 6 Apr 2021 18:00:37 -0700 Subject: [PATCH 36/82] add author metadata --- docs/build/header-unit-json-reference.md | 5 +++++ docs/build/reference/headername.md | 2 ++ docs/build/reference/headerunit.md | 4 +++- docs/build/reference/module-exportheader.md | 4 +++- docs/build/reference/sourcedependencies-directives.md | 8 +++++--- docs/build/reference/sourcedependencies.md | 6 ++++-- docs/build/walkthrough-header-units.md | 2 ++ 7 files changed, 24 insertions(+), 7 deletions(-) diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index 95df674c275..b1aab037063 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -2,8 +2,12 @@ description: "Reference for header-units.json file" title: "C++ header unit.json reference" ms.date: "4/13/2021" +author: "tylermsft" +ms.author: "twhitney" f1_keywords: ["header-units.json"] helpviewer_keywords: ["header-units.json", "header unit"] +author: "tylermsft" +ms.author: "twhitney" --- # C++ header-units.json reference @@ -34,6 +38,7 @@ The schema also supports comments, as shown below: "bitset", // "cassert", // design is not compatible with header units ... +} ``` ## Search rules diff --git a/docs/build/reference/headername.md b/docs/build/reference/headername.md index 42392534c11..a2b444ac479 100644 --- a/docs/build/reference/headername.md +++ b/docs/build/reference/headername.md @@ -2,6 +2,8 @@ title: "/headerName (Build a header unit from the specified header)" description: "Use the /headerName compiler option to establish a mapping between a header file and the header unit to build." ms.date: 04/13/2021 +author: "tylermsft" +ms.author: "twhitney" f1_keywords: ["/headerName"] helpviewer_keywords: ["/headerName", "Use header unit IFC"] --- diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index 7b8cd5dbf69..75d42502e34 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -4,6 +4,8 @@ description: "Use the /headerUnit compiler option to associate a header file wit ms.date: 04/13/2021 f1_keywords: ["/headerUnit"] helpviewer_keywords: ["/headerUnit", "Use header unit IFC"] +author: "tylermsft" +ms.author: "twhitney" --- # `/headerUnit` (Use header unit IFC) @@ -41,7 +43,7 @@ The compiler can't map a single *`header-name`* to multiple IFC files. While map The compiler implicitly enables the new preprocessor when this switch is used. That is, [`/Zc:preprocessor`](zc-preprocessor.md) is added to the command line by the compiler if any form of `/headerUnit` is specified on the command line. To opt out of the implicit `/Zc:preprocessor`, specify: `/Zc:preprocessor-` -If you disable the new preprocessor but a file you compile imports a header unit, the compiler will report an error. +If you disable the new preprocessor, but a file you compile imports a header unit, the compiler will report an error. ### Examples diff --git a/docs/build/reference/module-exportheader.md b/docs/build/reference/module-exportheader.md index 476bdfce6bb..b424641eed0 100644 --- a/docs/build/reference/module-exportheader.md +++ b/docs/build/reference/module-exportheader.md @@ -2,6 +2,8 @@ title: "/exportHeader (Create header units)" description: "Use the /exportHeader compiler option to create module header units for the header-name or include files specified." ms.date: 04/13/2020 +author: "tylermsft" +ms.author: "twhitney" f1_keywords: ["/exportHeader"] helpviewer_keywords: ["/exportHeader", "Create header units"] --- @@ -33,7 +35,7 @@ By default, the compiler doesn't produce an object file when a header unit is co You may find it helpful to use the complementary option **`/showResolvedHeader`**. The **`/showResolvedHeader`** option prints an absolute path to the file the *`header-name`* argument resolves to. -**`/exportHeader`** can handle multiple inputs at once even under **`/MP`**. We recommended you use **`/ifcOutput `** to create a separate *`.ifc`* file for each compilation. +**`/exportHeader`** can handle multiple inputs at once, even under **`/MP`**. We recommended you use **`/ifcOutput `** to create a separate *`.ifc`* file for each compilation. ### Examples diff --git a/docs/build/reference/sourcedependencies-directives.md b/docs/build/reference/sourcedependencies-directives.md index 10a31492133..7f3c8318e0a 100644 --- a/docs/build/reference/sourcedependencies-directives.md +++ b/docs/build/reference/sourcedependencies-directives.md @@ -2,6 +2,8 @@ title: "/sourceDependencies:directives (Report source-level dependencies and use an allowlist)" description: "Reference guide to the /sourceDependencies:directives compiler option in Microsoft C++." ms.date: 04/13/2020 +author: "tylermsft" +ms.author: "twhitney" f1_keywords: ["/sourceDependencies:directives"] helpviewer_keywords: ["/sourceDependencies:directives compiler option", "/sourceDependencies:directives"] --- @@ -13,17 +15,17 @@ This command-line option is similar to [`/sourceDependencies`](sourcedependencie - Unlike `/sourceDependencies`, the compiler doesn't produce compiled output. Instead, the files are scanned for module directives, but no compiled code, modules, or header units are produced. - Unlike `/sourceDependencies`, the output JSON file doesn't list imported modules and imported header units (`.ifc` files) because this switch does a scan of the project files, not a compilation, so there are no built modules or header units to import. -- `/sourceDependencies:directives`is designed to be used before `.ifc` files are built. +- `/sourceDependencies:directives`is designed to be used before *`.ifc`* files are built. ## Syntax > **`/sourceDependencies:directives[-]`** *filename*\ -> **`/sourceDependencies:directives[-]`** *directory*\ +> **`/sourceDependencies:directives[-]`** *directory* ## Arguments *`-`*\ -If the single dash is provided, then the compiler will emit the source dependencies JSON to `stdout` or where the compiler output is redirected to. +If the single dash is provided, then the compiler will emit the source dependencies JSON to `stdout`, or to where compiler output is redirected to. *`filename`*\ The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path.\ diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index d73f51a3092..37027080d9c 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -2,6 +2,8 @@ title: "/sourceDependencies (Report source-level dependencies)" description: "Reference guide to the /sourceDependencies compiler option in Microsoft C++." ms.date: 04/13/2020 +author: "tylermsft" +ms.author: "twhitney" f1_keywords: ["/sourceDependencies"] helpviewer_keywords: ["/sourceDependencies compiler option", "/sourceDependencies"] --- @@ -11,7 +13,7 @@ This command-line switch generates a JSON file that details the source-level dep - Header files (both transitive and directly included headers). - The PCH used (if **`/Yu`** is specified). -- Imported modules and imported header units (both transitive and directly imported modules/header units). +- Imported modules and imported header units (both transitive and directly imported module/header units). ## Syntax @@ -21,7 +23,7 @@ This command-line switch generates a JSON file that details the source-level dep ## Arguments *`-`*\ -If the single dash is provided, then the compiler will emit the source dependencies JSON to `stdout` or where the compiler output is redirected to. +If the single dash is provided, then the compiler will emit the source dependencies JSON to `stdout`, or to where compiler output is redirected to. *`filename`*\ The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path.\ diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index c46995ff25c..358d1def85e 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -3,6 +3,8 @@ description: "Learn more about C++ header units by converting a header file to a title: "Walkthrough: Build and import header units in Microsoft Visual C++ projects" ms.date: "4/13/2021" ms.custom: "conceptual" +author: "tylermsft" +ms.author: "twhitney" helpviewer_keywords: ["import", "header unit", "ifc", "stl"] --- From 7eac4ee962f330c5d736792bb4d1eef74b7f39e5 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 6 Apr 2021 18:10:43 -0700 Subject: [PATCH 37/82] update toc entries --- .../reference/compiler-options-listed-alphabetically.md | 3 ++- docs/build/reference/compiler-options-listed-by-category.md | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/build/reference/compiler-options-listed-alphabetically.md b/docs/build/reference/compiler-options-listed-alphabetically.md index 6af08920600..c8f0c8b7eaf 100644 --- a/docs/build/reference/compiler-options-listed-alphabetically.md +++ b/docs/build/reference/compiler-options-listed-alphabetically.md @@ -76,7 +76,7 @@ This table contains an alphabetical list of compiler options. For a list of comp | [`/Gz`](gd-gr-gv-gz-calling-convention.md) | Uses the **`__stdcall`** calling convention (x86 only). | | [`/H`](h-restrict-length-of-external-names.md) | Deprecated. Restricts the length of external (public) names. | | [`/headerName`](headername.md) | Build a header unit from the specified header. | -| [`/headerUnit`](headerunit.md) | Tells the compiler where to find the header unit file (`.ifc`) for the specified header. | +| [`/headerUnit`](headerunit.md) | Specify where to find the header unit file (`.ifc`) for the specified header. | | [`/HELP`](help-compiler-command-line-help.md) | Lists the compiler options. | | [`/homeparams`](homeparams-copy-register-parameters-to-stack.md) | Forces parameters passed in registers to be written to their locations on the stack upon function entry. This compiler option is only for the x64 compilers (native and cross compile). | | [`/hotpatch`](hotpatch-create-hotpatchable-image.md) | Creates a hot-patchable image. | @@ -123,6 +123,7 @@ This table contains an alphabetical list of compiler options. For a list of comp | [`/showIncludes`](showincludes-list-include-files.md) | Displays a list of include files during compilation. | | [`/source-charset`](source-charset-set-source-character-set.md) | Set source character set. | | [`/sourceDependencies`](sourcedependencies.md) | List headers, modules, and other source dependencies. | +| [`/sourceDependencies:directives`](sourcedependencies.md) |List headers, and other source dependencies, and read a list of headers that can be converted to header units. | | [`/std`](std-specify-language-standard-version.md) | C++ standard version compatibility selector. | | [`/Tc`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies a C source file. | | [`/TC`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies all source files are C. | diff --git a/docs/build/reference/compiler-options-listed-by-category.md b/docs/build/reference/compiler-options-listed-by-category.md index 6e4afd43250..107a7f9c4b9 100644 --- a/docs/build/reference/compiler-options-listed-by-category.md +++ b/docs/build/reference/compiler-options-listed-by-category.md @@ -108,10 +108,11 @@ This article contains a categorical list of compiler options. For an alphabetica | Option | Purpose | |--|--| | [`/exportHeader`](module-exportheader.md) | Create the header units (*`.ifc`*) files specified by the input arguments. | -| [`/headerUnit`](headerunit.md) | Indicate where to find the header unit file (`.ifc`) for the specified header. | +| [`/headerUnit`](headerunit.md) | Specify where to find the header unit file (`.ifc`) for the specified header. | | [`/headerName`](headername.md) | Build a header unit from the specified header. | | [`/reference`](module-reference.md) | Use named module IFC. | -| [`/sourceDependencies:directives`](sourcedependencies.md) | Read a list of headers that can be converted to header units. | +| [`/sourceDependencies`](sourcedependencies.md) | List headers, modules, and other source dependencies. | +| [`/sourceDependencies:directives`](sourcedependencies.md) | List headers, and other source dependencies, and read a list of headers that can be converted to header units. | | [`/translateInclude`](translateinclude.md) | Treat `#include` as `import`. | ## Language @@ -176,7 +177,6 @@ This article contains a categorical list of compiler options. For an alphabetica | [`/nologo`](nologo-suppress-startup-banner-c-cpp.md) | Suppresses display of sign-on banner. | | [`/sdl`](sdl-enable-additional-security-checks.md) | Enables additional security features and warnings. | | [`/showIncludes`](showincludes-list-include-files.md) | Displays a list of all include files during compilation. | -| [`/sourceDependencies`](sourcedependencies.md) | List headers, modules, and other source dependencies. | | [`/Tc`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies a C source file. | | [`/TC`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies all source files are C. | | [`/Tp`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies a C++ source file. | From 7292456a19f2963d5a36b1623f3801bbd179d04c Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 6 Apr 2021 18:18:02 -0700 Subject: [PATCH 38/82] fix metadata --- docs/build/header-unit-json-reference.md | 2 -- docs/build/walkthrough-header-units.md | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md index b1aab037063..007b9e65cfb 100644 --- a/docs/build/header-unit-json-reference.md +++ b/docs/build/header-unit-json-reference.md @@ -6,8 +6,6 @@ author: "tylermsft" ms.author: "twhitney" f1_keywords: ["header-units.json"] helpviewer_keywords: ["header-units.json", "header unit"] -author: "tylermsft" -ms.author: "twhitney" --- # C++ header-units.json reference diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 358d1def85e..78ce60812b2 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -22,7 +22,7 @@ Support for header units requires at least Visual Studio 2019 16.10.0 Preview 2. Header units are a binary representation of a header file, and end with an *`.ifc`* extension. This is also the format used to store named modules. -One important difference between a header unit and a header file is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to behave differently when you import it the way you can with a header file. Everything visible from a header file is also visible from a header unit. +One important difference between a header unit and a header file is that header units aren't affected by macro definitions. For example, you can't `#define` a symbol that causes the header unit to behave differently when you import it the way you can with a header file. Everything visible from a header file is also visible from a header unit. Before you can import a header unit, a header file must be compiled into a header unit. An advantage of header units (*`.ifc`* files) over a PCH is that it can be used in distributed builds. For example, as long as you're using the same compiler to compile the *`.ifc`* and the program that imports it, and are targeting the same platform and architecture, a header unit produced on one machine can be used on another. @@ -37,7 +37,7 @@ There are several ways to compile a file into a header unit: -Automatically scan for header units: This approach is best suited to smaller projects that include many different header files. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it's better suited to smaller projects, or for those where build time isn't a crucial consideration, is because it takes extra time for the build system to scan all of the files to find what should be built into header units. This scanning can be done at the project level for all source files, or at the individual file level. --Build a shared header units project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library (or libraries) that contain the header units that you want, and then reference it from the projects that then import the header units they need. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. +-Build a shared header units project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library (or libraries) that contain the header units that you want. Then reference the library (or libraries) from the projects that then import the header units they need. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. - Choose individual header units to build by changing the compilation action for a file. This approach is demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's also a good way to quickly and selectively try out header units in your project. From 3c5be9e5daf1b9bce5d9c0b471c7087a1e9892c7 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 6 Apr 2021 18:49:03 -0700 Subject: [PATCH 39/82] update command line descriptions --- docs/build/reference/compiler-options-listed-alphabetically.md | 2 +- docs/build/reference/compiler-options-listed-by-category.md | 2 +- docs/build/reference/sourcedependencies-directives.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/build/reference/compiler-options-listed-alphabetically.md b/docs/build/reference/compiler-options-listed-alphabetically.md index c8f0c8b7eaf..a2a6ba8c46e 100644 --- a/docs/build/reference/compiler-options-listed-alphabetically.md +++ b/docs/build/reference/compiler-options-listed-alphabetically.md @@ -123,7 +123,7 @@ This table contains an alphabetical list of compiler options. For a list of comp | [`/showIncludes`](showincludes-list-include-files.md) | Displays a list of include files during compilation. | | [`/source-charset`](source-charset-set-source-character-set.md) | Set source character set. | | [`/sourceDependencies`](sourcedependencies.md) | List headers, modules, and other source dependencies. | -| [`/sourceDependencies:directives`](sourcedependencies.md) |List headers, and other source dependencies, and read a list of headers that can be converted to header units. | +| [`/sourceDependencies:directives`](sourcedependencies.md) |List headers, and other source dependencies, using a list of headers that can be converted to header units. | | [`/std`](std-specify-language-standard-version.md) | C++ standard version compatibility selector. | | [`/Tc`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies a C source file. | | [`/TC`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies all source files are C. | diff --git a/docs/build/reference/compiler-options-listed-by-category.md b/docs/build/reference/compiler-options-listed-by-category.md index 107a7f9c4b9..e89bd3bd31e 100644 --- a/docs/build/reference/compiler-options-listed-by-category.md +++ b/docs/build/reference/compiler-options-listed-by-category.md @@ -112,7 +112,7 @@ This article contains a categorical list of compiler options. For an alphabetica | [`/headerName`](headername.md) | Build a header unit from the specified header. | | [`/reference`](module-reference.md) | Use named module IFC. | | [`/sourceDependencies`](sourcedependencies.md) | List headers, modules, and other source dependencies. | -| [`/sourceDependencies:directives`](sourcedependencies.md) | List headers, and other source dependencies, and read a list of headers that can be converted to header units. | +| [`/sourceDependencies:directives`](sourcedependencies.md) | List headers, and other source dependencies, using a list of headers that can be converted to header units. | | [`/translateInclude`](translateinclude.md) | Treat `#include` as `import`. | ## Language diff --git a/docs/build/reference/sourcedependencies-directives.md b/docs/build/reference/sourcedependencies-directives.md index 7f3c8318e0a..b540731122e 100644 --- a/docs/build/reference/sourcedependencies-directives.md +++ b/docs/build/reference/sourcedependencies-directives.md @@ -7,7 +7,7 @@ ms.author: "twhitney" f1_keywords: ["/sourceDependencies:directives"] helpviewer_keywords: ["/sourceDependencies:directives compiler option", "/sourceDependencies:directives"] --- -# `/sourceDependencies:directives` (Report source-level dependencies and use an allowlist) +# `/sourceDependencies:directives` (List headers, and other source dependencies, using a list of headers that can be converted to header units.) This command-line switch generates a JSON file that details the source-level dependencies consumed during compilation. It also looks for a `header-units.json` file that specifies which header files can be converted to header units. From d58d89b8e04b284fb1e125c4c9f550e6f9ef12c4 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 6 Apr 2021 18:55:47 -0700 Subject: [PATCH 40/82] update toc --- docs/build/toc.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 3208452aba4..323621ec454 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -705,9 +705,9 @@ href: ../build/reference/showincludes-list-include-files.md - name: /source-charset (Set source character set) href: ../build/reference/source-charset-set-source-character-set.md - - name: /sourceDependencies (Report source-level dependencies) + - name: /sourceDependencies (List source-level dependencies) href: ../build/reference/sourcedependencies.md - - name: /sourceDependencies:directives (use allow-list) + - name: /sourceDependencies:directives (List source-level dependencies-use allowlist) href: ../build/reference/sourcedependencies-directives.md - name: /std (Specify language standard version) href: ../build/reference/std-specify-language-standard-version.md From ef1f7392ddc07fd2a02477f61ce92d1730f7fd4c Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 7 Apr 2021 09:26:15 -0700 Subject: [PATCH 41/82] edits --- docs/build/cmake-presets-json-reference.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/build/cmake-presets-json-reference.md b/docs/build/cmake-presets-json-reference.md index 4437861d2f5..8b7fb122203 100644 --- a/docs/build/cmake-presets-json-reference.md +++ b/docs/build/cmake-presets-json-reference.md @@ -10,9 +10,9 @@ helpviewer_keywords: ["CMake in Visual C++"] `CMakePresets.json` and `CMakeUserPresets.json` can be used to drive `CMake` in Visual Studio, in Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. -`CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. They schema for both files is identical. +`CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. The schema for both files is identical. -`CMakePresets.json` and `CMakeUserPresets.json` are how Microsoft provides a "vendor map" to add VS/VS code-specific options. Here we document the Microsoft vendor maps and macro expansion. To see documentation for the rest of the schema, and about Configure Presets, Build Presets, and Test Presets, see the official [`CMake` documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). +CMakePresets.json` and `CMakeUserPresets.json` support vendor maps to store vendor-specific information. Microsoft maintains two vendor maps with options specific to Visual Studio and Visual Studio Code. Here we document two Microsoft vendor maps and vendor macros. To see documentation on the rest of the schema including Configure Presets, Build Presets, and Test Presets, see the official [`CMake` documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). For more information about how to use `CMakePresets.json` in Visual Studio, see [Configure and build with `CMake` presets in Visual Studio](cmake-presets-vs.md)\ For more information about how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with `CMake` Presets in VS Code](https://github.com/microsoft/vscode-cmake-tools/blob/develop/docs/cmake-presets.md) @@ -28,7 +28,7 @@ None of the options in the Visual Studio Settings vendor map impact the construc | Setting | Description | |--|--| | `hostOS` | An array of supported operating systems (OS). Accepted values are `Windows`, `Linux`, and `macOS`.

    The value of `hostOS` is used by Visual Studio and Visual Studio Code to hide Configure Presets that don't apply to the OS of the target system and provide a better user experience.

    If `hostOS` is unspecified, then Visual Studio and Visual Studio Code will always show all Configure Presets for selection. This field can also be a string, which is equivalent to an array containing one string

    This option is supported by both Visual Studio and Visual Studio Code. | -| `intelliSenseMode` | Specifies the mode used for computing IntelliSense information in Visual Studio with the format `--`.

    Accepted values:

    android-clang-arm
    android-clang-arm64
    android-clang-x6
    android-clang-x86
    ios-clang-ar
    ios-clang-arm64
    ios-clang-x6
    ios-clang-x86
    linux-gcc-arm
    linux-gcc-x64
    linux-gcc-x86
    windows-clang-arm
    windows-clang-arm64
    windows-clang-x64
    windows-clang-x86
    windows-msvc-arm
    windows-msvc-arm64
    windows-msvc-x64
    windows-msvc-x86

    If `intelliSenseMode` is unspecified, then Visual Studio will use the IntelliSense mode that matches your specified compilers and target architecture.

    `intelliSenseMode` is used to provide accurate IntelliSense for cross-compilation.

    In Visual Studio 2019, you must explicitly specify a clang IntelliSense mode when building with clang or clang-cl. | +| `intelliSenseMode` | Specifies the mode used for computing IntelliSense information in Visual Studio with the format `--`.

    Accepted values:

    android-clang-arm
    android-clang-arm64
    android-clang-x6
    android-clang-x86
    ios-clang-ar
    ios-clang-arm64
    ios-clang-x6
    ios-clang-x86
    linux-gcc-arm
    linux-gcc-x64
    linux-gcc-x86
    windows-clang-arm
    windows-clang-arm64
    windows-clang-x64
    windows-clang-x86
    windows-msvc-arm
    windows-msvc-arm64
    windows-msvc-x64
    windows-msvc-x86

    If `intelliSenseMode` is unspecified, then Visual Studio will use the IntelliSense mode that matches your specified compilers and target architecture. `intelliSenseMode` is usually used to provide accurate IntelliSense for cross-compilation.

    In Visual Studio 2019, you must explicitly specify a clang IntelliSense mode when building with clang or clang-cl. | | `intelliSenseOptions` | A map of additional IntelliSense configuration options.

    `useCompilerDefaults`: A `bool` that specifies whether to use the compilers’ default defines and include paths for IntelliSense. Should only be `false` if the compilers in use don't support gcc-style arguments. Defaults to `true`.

    `additionalCompilerArgs`: An array of additional options to control IntelliSense in Visual Studio. This option supports macro expansion. | | `enableMicrosoftCodeAnalysis` | A `bool` that enables Microsoft code analysis in Visual Studio when building with `cl` or `clang-cl`. Defaults to `false`. | | `codeAnalysisRulset` | Specifies the ruleset to use when running Microsoft code analysis in Visual Studio. This can be a path to a ruleset file, or the name of a ruleset file installed with Visual Studio. This option supports macro expansion. | @@ -51,7 +51,7 @@ Many of the options in the Visual Studio Remote Settings vendor map are ignored | Setting | Description | |--|--| -|`sourceDir` | Path to the directory on the remote system where the project will be copied. Defaults to `$env{HOME}/.vs/$ms{projectDirName}`. This option supports macro expansion.
    In remote copy scenarios, the macro` ${sourceDir}` evaluates to the project source directory on the remote system and not the project source directory on the Windows machine. Remote copy scenarios include targeting a remote SSH connection. In these cases, the project source directory on the remote system will be determined by the value of sourceDir in the Visual Studio Remote Settings vendor map. This option is ignored when targeting WSL1. | +|`sourceDir` | Path to the directory on the remote system where the project will be copied. Defaults to `$env{HOME}/.vs/$ms{projectDirName}`. This option supports macro expansion.

    In remote copy scenarios, the macro` ${sourceDir}` evaluates to the project source directory on the remote system and not the project source directory on the Windows machine. Remote copy scenarios include targeting a remote SSH connection. In these cases, the project source directory on the remote system will be determined by the value of sourceDir in the Visual Studio Remote Settings vendor map. This option is ignored when targeting WSL1. | |copySources | If `true`, Visual Studio will copy sources from Windows to the remote system. Set to false if you manage file synchronization yourself. Defaults to true. This option is ignored when targeting WSL1. | |copySourcesOptions | An object of options related to the source copy from Windows to the remote system. This object is ignored when targeting WSL1.

    `copySourcesOptions.exclusionList`: A list of paths to be excluded when copying source files to the remote system. A path can be the name of a file or directory, or a path relative to the root of the copy. Defaults to `[ “.vs”, “.git”, “out” ]`. This option supports macro expansion.

    `copySourcesOptions.method`: The method used to copy source files to the remote system. Accepted values are `rsync` and `sftp`. Defaults to `rsync`.

    `copySourcesOptions.concurrentCopies`: The number of concurrent copies used during the synchronization of sources to the remote system. Defaults to 5.

    `copySourcesOptions.outputVerbosity`: The verbosity level of source copy operations to the remote system. Accepted levels are `Normal`, `Verbose`, and `Diagnostic`. Defaults to `Normal`.| |`rsyncCommandArgs` | A list of additional command-line arguments passed to `rsync`. Defaults to `[ “-t”, “--delete", “--delete-excluded” ]`. This option supports macro expansion and is ignored when targeting WSL1. | @@ -59,7 +59,7 @@ Many of the options in the Visual Studio Remote Settings vendor map are ignored |copyOptimizations | An object of options related to source copy optimizations. These options are ignored when targeting WSL1.

    `copyOptimizations.maxSmallChange`: The maximum number of files to copy using sftp instead of rsync. Defaults to 10.

    `copyOptimizations.useOptimizations`: Specifies the copy optimizations in use. Accepted values are no copy optimizations (`None`), rsync only optimizations (`RsyncOnly`), or rsync and sftp optimizations (`RsyncAndSftp`). Defaults to `RsyncAndSftp`.

    `copyOptimizations.rsyncSingleDirectoryCommandArgs`: A list of additional command-line arguments passed to rsync when copying the contents of a single directory to the remote system. Defaults to `[ “-t”, “-d” ]`. This option supports macro expansion. | |`copyAdditionalIncludeDirectoriesList` | A list of paths to remote header directories to be copied locally for IntelliSense. This option supports macro expansion. | |`copyExcludeDirectoriesList` | A list of paths to remote header directories to not be copied locally for IntelliSense. This option supports macro expansion. | -|`forceWSL1Toolset` | If `true`, Visual Studio will always use the WSL1 toolset when targeting WSL from Visual Studio. The WSL1 toolset executes all commands locally and relies on Windows drives mounted under the /mnt folder to access local source files from WSL. These options may be slower with WSL2. Defaults to `false`.
    The WSL1 toolset will always be used in Visual Studio 2019 version 16.10. This option will be relevant once native support for WSL2 is available. | +|`forceWSL1Toolset` | If `true`, Visual Studio will always use the WSL1 toolset when targeting WSL from Visual Studio. The WSL1 toolset executes all commands locally and relies on Windows drives mounted under the /mnt folder to access local source files from WSL. These options may be slower with WSL2. Defaults to `false`.

    The WSL1 toolset will always be used in Visual Studio 2019 version 16.10. This option will be relevant once native support for WSL2 is available. | ## Remote pre-build and post-build events @@ -83,13 +83,13 @@ The following remote task creates a directory called test on the remote Linux sy Right-click on any `CMakeLists.txt` and select the **mkdir** option to execute this task. -The value of `remoteMachineName` must match the Host Name of a connection in the **Connection Manager**. +The value of `remoteMachineName` must match the Host Name of a connection in the **Connection Manager**. ## Microsoft vendor macros -CMakePresets.json and CMakeUserPresets.json allow “vendor maps” for vendors (like Microsoft) to add VS/VS code-specific options. Our vendor maps support all the macros defined by `CMake`. See [cmake-presets Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. All macros and environment variables are expanded before being passed to `cmake.exe`. +`CMakePresets.json` and `CMakeUserPresets.json` allow “vendor maps” for vendors (like Microsoft) to add VS/VS code-specific options. Our vendor maps support all the macros defined by `CMake`. See [cmake-presets Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. All macros and environment variables are expanded before being passed to `cmake.exe`. -Visual Studio supports vendor macros with the prefix ms. Microsoft vendor macros can only be used in Microsoft vendor maps. `CMake` can't use presets that have vendor macros outside of a vendor map. +Visual Studio supports vendor macros with the prefix `ms`. Microsoft vendor macros can only be used in Microsoft vendor maps. `CMake` can't use presets that have vendor macros outside of a vendor map. |Macro |Description | |---------|---------| From be39f7209863beb1e46416a5b5d610973f8bb024 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 7 Apr 2021 17:35:50 -0700 Subject: [PATCH 42/82] tech review pass --- docs/build/header-unit-json-reference.md | 49 --------- ...ional-header-unit-dependencies-setting.png | Bin 14759 -> 37682 bytes docs/build/media/change-compile-as.png | Bin 26286 -> 23893 bytes docs/build/media/change-item-type.png | Bin 10832 -> 7796 bytes ...lic-include-module-directories-setting.png | Bin 54819 -> 28733 bytes docs/build/media/set-cpp-language-latest.png | Bin 27983 -> 31690 bytes .../set-header-unit-library-settings.png | Bin 43315 -> 25324 bytes .../vs2019-additional-module-dependencies.png | Bin 0 -> 37505 bytes .../media/vs2019-scan-module-dependencies.png | Bin 53960 -> 37718 bytes .../vs2019-translate-includes-option.png | Bin 0 -> 42008 bytes .../compiler-options-listed-alphabetically.md | 4 +- .../compiler-options-listed-by-category.md | 4 +- docs/build/reference/experimental-module.md | 10 +- docs/build/reference/headerunit.md | 16 +-- docs/build/reference/module-exportheader.md | 13 +-- docs/build/reference/module-reference.md | 18 +--- .../sourcedependencies-directives.md | 45 +++----- docs/build/reference/sourcedependencies.md | 26 ++--- docs/build/reference/translateinclude.md | 23 +++-- docs/build/toc.yml | 6 +- docs/build/walkthrough-header-units.md | 17 ++- .../walkthrough-import-stl-header-units.md | 97 +++++++++--------- 22 files changed, 111 insertions(+), 217 deletions(-) delete mode 100644 docs/build/header-unit-json-reference.md create mode 100644 docs/build/media/vs2019-additional-module-dependencies.png create mode 100644 docs/build/media/vs2019-translate-includes-option.png diff --git a/docs/build/header-unit-json-reference.md b/docs/build/header-unit-json-reference.md deleted file mode 100644 index 007b9e65cfb..00000000000 --- a/docs/build/header-unit-json-reference.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -description: "Reference for header-units.json file" -title: "C++ header unit.json reference" -ms.date: "4/13/2021" -author: "tylermsft" -ms.author: "twhitney" -f1_keywords: ["header-units.json"] -helpviewer_keywords: ["header-units.json", "header unit"] ---- - -# C++ header-units.json reference - -The `header-units.json` file lists which header files can be automatically built by the build system into header units, and then treated as an `import` instead of an `#include`. - -Sometimes a header file can't be compiled into a header unit. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` at compile time to determine its behavior. Using `#define` can't be used to change the behavior of a header unit, so `` shouldn't be compiled into a header unit because it wouldn't provide the expected behavior. - -When the command-line switch [`/translateInclude` (Translate include directives into import directives)](./reference/translateinclude.md) is provided, the build system looks for `#include` files that can be compiled as header units. For example, there's an allowlist for the Standard Template Library headers that the build system consults when `/translateInclude ` is specified to determine which Standard Template Library (STL) headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. - -## Schema - -The format of the `header-units.json` file starts with the schema version, followed by an array of filenames for headers that can be built into header units. - -The schema also supports comments, as shown below: - -```json -{ - "Version": "1.0", - "BuildAsHeaderUnits": [ - "__msvc_system_error_abi.hpp", - "algorithm", - "any", - "array", - "atomic", - "barrier", - "bit", - "bitset", - // "cassert", // design is not compatible with header units - ... -} -``` - -## Search rules - -The build system looks for this file in the same directory as the header file being processed. If your library is organized into subdirectories, each subdirectory will need its own `header-units.json` file. - -## See also - -[Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md)\ -[Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) \ No newline at end of file diff --git a/docs/build/media/additional-header-unit-dependencies-setting.png b/docs/build/media/additional-header-unit-dependencies-setting.png index 50c0689d04673fa1f553c157387047bf5bea3bf8..d2834ce2fa698ee21e2b1b1b0233c4bfc1397729 100644 GIT binary patch literal 37682 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 diff --git a/docs/build/media/change-compile-as.png b/docs/build/media/change-compile-as.png index 7ef1fa2696209c978da104f1716d07c6356b13ed..8d92a9d7d0bc0fa0da3d6d40ae09d301cb0f123f 100644 GIT binary patch literal 23893 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 EKZTy6H~;_u diff --git a/docs/build/media/change-item-type.png b/docs/build/media/change-item-type.png index 4d64944b2c329776d705685bac52b5fadb6c9a5c..3255f44d4ec5fb12427e9b7c1aff0a6832d13872 100644 GIT binary patch literal 7796 zcmcIoXH-+)vJZ+#D59Z@^w4{es+3Se38709klv;DAP_(Wr6Wj_j&!M_6s1ZDy@R0A zn^*zWoSFIkX3lxW41TO?QPXp#j11)hl?5rfWYttaE=hUe9^}T|zjf`%)BZPNyxf~`J#neO_yvcwoW6*wtVbl|_; zeJn#|s9$O@Ug0@t9C-P2esyC&=5(t@OZI$!F;@2CS38;P(YNsKSVq}^{k8AyQDhAF z-iKUXGzT8e2kta~^xbK3YP<@(L6wNaIV((cDeftYwn}dNe8^?+uzHP_%(3Er;!_T7 z1VRiRr>oxJw$S3eIU&8%` zp4uizqBL=`a&Ws)u_Ubj=!~wpPR20T=(##m=cLLB3_po@YAqFV zake$z9Ef|j04z5ImjxEgENSyWdzfj!N4}dAxGuB= z10IT|7GS|yYSC=kiaO^pKkn_{#kisNelK=QRq-voXYs8~v=AL~F3f!S)cT~I@j~z; z5Qy-ctqAIeL!mCrI_qv12Rn}3+?%{A(9xZc%fMtLHNWWtXwH6b@UlhaIZM_?!tw0_ z-xasYU)T!7cV7pmQ#=r8io*PKW>OL1U>7}xuUq~RpCt`-_;JBI1?gFN5@D%eadA+8 z03)Jam_Y&B#oCAkngr7^^L~q@+itIz(qRhMQ((~1&C1r6TJ#5xD)Cv_#d`w{4R+Zg zwEa&=rCGHjy{aMX>B%I4*RTKPoaZ`{tNC`(^1hsvV9n3U<|Cfb$jD9l<8A*f`(>;n zYeQ)74H2h_hT9YHDcLxtRs{AavX*gnM5nF)+JXl4KbCeOk)UN(%@Z*8! zMdR4Ss(iHYEAvT;?A9x%wj`sQfltfK%M`5d)KDLEp?iO~ZCHMAI7!K?uC7QZTYZ-& zROJ%b^V=mu)Sat)*744S& z0s)sxUF6*XEJx0j@4IyTo${Sf!_9gh)1H7O9mZT(YU4$Bbd#S8hfxO+`sqT1&t2YU zm9_N5Dp%Jxv6jTXG#P2-g_d>oCN&jA+ejt`araqp`9eQ_n#+AGE8tsalEw=lxCYX} zk6mfVc3BL!*k*(4UW)QgrXck}C>>!*YTKKY+fZVIt0b7@8oH-Ru>_FSHu}h?D+WB4 z$yXc8qp0JMVBH_RC}o?%Y)Csdjjz&6oWF>MwI(agCkG}Z4U;wNenQIRVbe|r7pNxJ zhG$n7Zpfq+^SLWA$IZ#@8u~7JV`jqMS$(O@=$g!!9+n$r9V@isD9&(yM8~cd=g% zJEXS97PSnOx||NGc^})u00tnn{e^AyOFZk$G{481r{r5Gf_4OhmJ zi9N~9qLljjVD`{+e?bGFh0y97V7AG1{ksYsb9amu9D}Q>(Z&mho@f7>%|#3QN=~>Z z`)o>dp(d>;eWVdjpPq2y%G6KDFgrQqy-xaFHvD(2H4dA);bCb&ZCv&+pojh ze_?Aa4e=yrSL{jW2j;@6Lz$5ew)4VI!kCdd=1UtLocG?c{6CLZu;g6qpCyVc_pDy# z4?IGl6gghoq@|@<56@KcaIPS`3iL96aHnU<`rUhEQ@I; z!qPP-cJ8qmjyhLNyt6w=ZEC%bYN`-ju@bIkMocKVoAG`sV_o8Q*QnFmEhO%Pb9zD^ zZYO=vPOcg5hMdcbCg`b)@ zz8+UAZfGRPu2xZ)W?F9L@whJLb>fH8nu<=0R2}4Qi(U5DrIkr7AY#01IV+r;fxf-p zS+|Z4{expH20MOe2Tf+bIrozOELl_JF)HDq=!WiGF1f!@F2G;AQ!Z@9jHwo~^9z*a zgr~&4#@zWDpBuI;>AjIu4{;m_bJQA@s?F0iR%?Fx5?vozKNer9@^NMGuJQ@svgNh8t<*RA0K$AqJZ zxp~GFI4f`cQ~k}-A3bQe`df~svyL)*d-Z|SnRiYtxk4jk-!FcRwcRu_4^D;`$Hh=; z{BSTx6$Kk@G`r6grt#mJai3y0dc49KKAHG(r6_5e?~UhjwuCmlWw6SxRDCM`)R)WV z>pX)qDd4?|WiJ2Gh`RZRl9OeAX#YS&e>rRJ2wbP^3(mDzD;+fz_s1!R?OibIUBz;t2Wb!V~U9Kdg+lH zO0drG$m2#X`h$s3X2Dz~d2Ut3^8Oa3V z?7g2pkJ(5yQG_)}IXbxSH)5`n?s@7;ZSmc_=d*0scJSJXieV-y;<17VZ(K$FJzN@PpsQEgm!ga$-_0z1 z5qap{rR#DaIKYH2yn7Y@|Wh- z`)rtW^kT>N3FnPcf5965*xzome8L@%6r&%(A2MeU1`N^Yv(--5U7f=B9Dv$j{Hy}( zUw`VdcTVrI2_%Lxh)8cw+0tZ(tOY&TOTKNF>fBSF;=uc6Ns~Gy85t%S8qg*wB(<8Q zyoZ<_>-oO8H0&TdJ(Ka1%t2*6N7r;CbWXSxS47fP0w%~2zDGzrh zFPb~-1+My7;cP;G<3;%8)H0aN>{i0~Vqz0c)I96NgWww3nAVZD#0@#Nq_ceEi#*3z zl3eGN8fm4vb_#>jH5&Qg&o_Y5rSL_cbu2s}Thzp_AcA9D9$tKeW(t~n^o`__q7@MC z`y-4B{>%>upD#N$$xC4aGfaYU!lCmKw}}<*ckUpxLvyNTRJxIy#6HmpCoF~>%HQEY zt%oF$l7zN7GSZJxlZ5{F;|VmWG$#`SfNLNpnFMQem@f`Fm85UnL|O4l{@cn9`agPt zKGot&zY9=1k!B(R&|i2~D51eDMM$P9z7jq=~e&s{O6X=~*D_wN-nNAIMT0Ew}+in2S^&8SAN< z+O@aYn$bPHs>(^yF6bO1MghilkZalV#A;KNg5SJ&9*I>ij(7GW-G}BNg6&d%jcLu7 zU3dP33f8-UU5XVLKL->{5xU%j^xpq4f=H1h>YdN@;5i~JB}1fk`-JHe{TQZMz+P$7 z5+@%^>x~`~dtueRubk>N=h$MnIYCW5bC{CQ|H5UIFv`_z&&!V)rOCLy)3Pq*Q!-L- zDciYkmM=STVuXMNpG{x#@7KOg7OvUJ+RajzJ>iEC0dCr~Jy+-Sji9Q{R^neKZM2N< zYkj!Ay)0w@Qc(sKMDzOFEG?}FFsn{ZbBqM59HaF$sg7HGAn6oH5Lq&P?TMTAWXfm>3d z{J>GUFl&0)yq-4#-6lwq9*O13**D(ScFQX9A>>V=$oa~0J6A51E=_7tzWrKN^CvU*{G7paUOSuO{Akes=1V|&s2${engmt zuxjyNUQ{zu${Fy~N_xLcD<4o)Oa0xoKO`FZVt7g{vG0J&J^($FwDnqsWmC^_Q*;)? z^}OsgwlabZn)KlPp4U;o z5Tg$b!1s_|CZAK};Iq_ya2|2QV9Z?|RYY@$O>mh4J2C!)wrU z-<YfcMjjWXe;MZ#7jS_<3l7IEoyy3Tk}DE0wyI_(+N za(=FRmjhBV9*3+VjzfbIt*=9qhPAXOn*5g5qSx16lY+-F|IF<|HntA4W%lQKUVC~* zqBm?+Ij63v!k)l|y}>rF@^y1QyIO}g9G>XQ%1Ufx9R_b+w_8Qu_g$K;IQ?&G8cvU&4LU&@-pd1lhoEv-e$s^7JRQ|g|TRNmQI|6C)G|7%=6 zLK$-96U7uBcv<#rKb>TQ>U_1*V4KvvIUCojgIu6Ms$x)rdH47m#l1@>&Cbd0Z>+n>I zkG_>iJv!^LsuWBiU~^$?@qIkx)um!LEm%-5^x5y=&?YjI!H~Fbn#*oXVBn^XNpbai zQEya0$B?VoiW?o(s45JUdL{7{a^*NPgqwp3`cl+!a1k(z%4fIuf*P!>9&uEqS{so* zXS4~2UCT(i87n$x7!^;VUl2!5MOlQXf0TF2-*%zC+7eIXc9mrp`Kw=^iC?F=UfAB= zeAli<1F@S@u(zZ0tS60jfHH$LLf6$ftuEZtZ(@h$!8FoD&pF8+rRtN(Ye890Pc`lOx_g=ldLp@cn3GC4DyT9X zU2`UeBY5xndYac;y zLP0oy$9g#=N1otUQ7BW6#V!sn_~1JIQB8#_5F&OmoJ<_jNx^ zuRe+}GYR*pOR~i%EmLIC^8P!8ZiG`Hg2tKTC+zbQGZ>G(hm$Qy^^Qxjg_pJxdnTca z$V%Nvli(DSDrf3FoK>`?Xl?^-Wm+XmJp}@9XIC0$2$VvD0SEDzBYwU3=f<&N&qMWR z&W7;*8GisPcwwNpREsL%I;I(G62t@7$p<7LdlnvkCrkMh=>Ug;Xv7y&kZo5e*;tCU z4@TClwC~nM(6*vJ&E?3upwHHc{4B?d?ghL;*9sNb0eqZkob!*} zb5EN0btLxuV((LhA)}xAfEK>Oy-{Q%2a^~76Do@iNQs=R5rVOFj?JUhagsuIS`cX3 zr>&+g)-?^&@`BdZn*lI4Vu*zRkcMiu6Q*L-3E0PsU;O3{#7-7r=9%Q?(>l$QVY zC}B9?P&m4GflL^tLiti#iT_JUHq#58_1cxn0vW8zE0B&CsuTSwKF5mAP^()SOLVbq>YLYMFt@XD7+44%P0F5R{w0E zkf5Ztz~(VGk6EuDQQ@bT@mhd~C4mMo4XcJ@eeOtrq?`HiV(@|8f#axlLAwC6D>OhI z_}d~5?0>))gv23-MCcNbZ*>#t-*Bk59iywqWj?6_9tC^NN`2z-1LC3ZNsfEf^5}{*^#>^_5Cfir{KMQ;a2V~`8mWkqU*nK!z__T9j zx#i7XgHup2Q^J}paCkW+tIFxT%MLH*ShswFzG5GS4*MO7Zew>#KnEl+5U6rKVOQm( zVKjM#^c@KLJ&fwCN!ZSw+$A>k-!|qWm~{vAE&Z~-Y>V^d2q_s(>?p%CLYkCXU3$e& zKeYGaNGdeo@wM zZSefrrvUv-yNAv14`){Erw=j);KfeY4>hZ#%+J@NPst8T)H~O)tdA1!!ePOslR0nt z?Pt&YJt-u^g2rb}smAZ~+qw;^{M_C-Ei{>UmjBIrwAwc(q5UlnR@8^~kIUlJigk++ z4m>$4iZJ<0l0|;K5fqlS)T3iB0_dK=J#3%gjH3hG46R}K5}LNM>^94K)k*Q1Kjkp2 zGh$*&iBM5Hd-YAsZRt42WQ~{tP42qmX0hj+m>by?QN%vsg=y$U+pkUy$popkQ%-YU zyJ~G4A9Cs4{>JMjG-)lvF3W$V;MGG9vna1lE`=Et*yo!xX!LV&G_Ueiw!HG~u`u)7 zs9=ut5?wt*o0r9SQ~MeT$OZdKg^W+Ca4!{;nBF+FUQxbYp>pG*WYEaHzR@?Yd*97_ zscGI`mtvNXD1AX>>7Hr&H*8GJ#QM70n&$xby$K;;&2cohqx zIWx2scmX$Gc{*jSnSj(9fpIIcOqAvp@+k{BLKWHj_c)x0>5`G_bE@;DxNMeV%!jBE za&wnvr1$a_0vnrHdBilBY9uL>E}~#Juvs*`7=_tX*+)5h00?la&E;-?=li(JYjZc3 zDsh~l6B^y4v#XDdQ=;}2B4*S3!NLLX;uhOeX@4ZM>K%|BqdJ(aJbR@LUq=SUsoAe$?DAIy- zLKO%^2<3+N{l0VVInQ~{eV+RVWbN!(*=w(vH8a28%x4`fWpYwFQUCxzuBxJ-2LKRK zJlp`E$tHAbX3VUa&a5Ke(NRDn*=#o{%1e?WT?-I3%ARgM>(23)&?;jnSeM1EzX@s-c z^SxFC{sO0{bMsmc072@l%HP4r2iN1guHB+X71yJBBpNjNtkBYH4aNqp~>WtjlTI9})Bh zn-Z;BB50qSObzS!;)GrcJ<&h~t+A?MmA3Za^UE6mxf}-&2$FS)DP-&DHyr=b<4jET z(ug3c;x@YImdZt_#RTydtB&qtsxU`%!Yc<(a+QwePT!9uo_da)Qn4c>ThhfMsAFKu zHdsN%1v`P}Xh}UXXlrYe|2kdD%KF;Ete{(_Jg8(br@Uv%5AOXzY&t2;c0=N*NrHHp zfp1;d9}635ZHL5&wYOvZSqbVdoq&G9<#uO_0F9lf#+v4?`SvD{xr$=d3q#B!3=kt z?(ADl`-SjDy9b9v-p-c8_4A+vv-f3fh-;<7u*(bZC$lC zIM-D(0}_Au`%;56MreDYI6pg}EJ10;P?Y=IijOIy)3>=p;q4D_S)B#euD!_07^fmn zZwiK>@_YBq_1}xZvhD?ye}-{+Nr5bKoiKZ{F9+M(Z*F9b@ALLHCMT=<8G94A%HWSc zwQ_7}|8XWMMD$`Homx0u@D}%uzU$F5Q(056p{ghDlizY#mTj!F`Gy03p-N$oK@=uE zC{{h7kq2HP(HtU)?pyNoFgI?QhR5C(mwjy?{ct+PprpNBY$NNy>EVjGVYb)H5$xcb z2X1ksc$et$V{9yrl7?n3f1XOZ;EDfmkMjWHA(`?(Q}h$%*}UCP-64XR{eOz?Kp?8c znOS0wl|N_}&mQQR%FI7?sS9(^bIUL-)Z&S#@--j?YeP0v+aVUB8FaQilCJWE@is(N zJZNw7p?lzo8gY9wnteL`U)$J?6)?@dxjLQpP(!4S(rfSq{jjGo$@-|sZ}q1YGRMHNRaj~cTDziNYH~)SNjn0IhF0?}7ED=306FdFjS6Qi6uc@*2S;jIGScbK^+{096OKO}VMc|IBMTS$x zmvir~hCNMuUjA$VLxC&7eN|5}eId$!bX;FVFxJ2fZvb7!cQ8c6CX53C4Sl z3b)N0yTZc4dIknbYfNO&@o1=ctdLyBT;C5Zd;C9&D_LJZt3#B4>{`C< ze|?gfwTFj?zoVmCQ*-l3)+#wE-Gw>Or63E5r`sS4zK?>y_$v6x_a*JhP9x15Ul;CwYB?@)d+8`G`8KCM&7=a z8y;JP%itNIsoa<480^F$1N%!?wvRqZML)z!2U#Jw@&o7l1HOT;)|*^T{hL`V)<+4& zyUqjJm3!+gl7}F>n4129JBxL9k1tE4xzqh8+G1SdmzQ}wb`Aw*^qfoW4JQHujAB~l zjlM|JuP_NbB>`tuAF1>zTf0A(Xm8UWoFK8m1=XqOM;{RHdng$VRKe#=hx1$?!ed+# zGzAs`9KSvg{;A5#F?ED9K#T*ug;&u*yt_E<c`|30>it^warK zf@~YBYl%w_n!VgLjFNb@RvKvRDg!`)t%|*l;1VvK33ooD*~1~}Drf9nPfe$jHePJ| z&M;x)bD};;pCQ3xzcLitt1an@p5}~rs@z2_vdJpD`|el#ABfj}vw6d-qg1$$I+i=R zJkB+~m#I@Kq%cLhoyqAJ0lQ>cw`+<4jwR1x54}#q5iIt$8&H%WJW&QN!zC#x?Jbab zOKDPA*sx?bZ6blwfi!DcbG`dXEF*7Jkh3&vJCjBJU{%JJ8+vu<33gij;z9rgP<8M6 z(TQ142hBF7-k-EHI}A|Q@AlZVj9ke{WrY)zB3qw;r0Sr>@q(RX9kta zdiCqm)LM2|3AK9`Y6*M1^98}PkwSESJ8q^sHrpJh$K6IR+clGSW!{c<<;-fpV^r0H z@-2LZrIhv4ew$R*>n^vs#(VE=uQ2uD($?;W6zh~GtDcj%ZguTz6)Jb-so>32i5Vku zKKXI$r$pgi{!8&{&-U468He`6go)Xt@E^3|D)G4U7zShJ(P9afZ$oY0>YR*~?=`{} zG9faS+UXLoejBULn;*sn8#8DAy3FRbbds5Q!CbDwlvqO2VSqtj+vJ!lG3Rmd~@@;lXK4>mo+VH!;v+;oip8 z<%5ehRm`Q=RJ1P$UBfEMBeYK9XppVbVzdW=^n38cBMxmlWcC78wk!Ye@)(}b4r_6iz#6Y>Q9;V$LrwI;%P zQUy|Ls)fu`;&hM4X}88r5RXP`?QOYh!p?LST)Fnm3a1#pezuLB#K;)$Qh|jMV}1=6 zSbvrJY2$E&Z#Wv5A?@_GijPFi-!q61Ol>D{)EwSJR6lKxi>_e?x_#5 zN-UtFv%05$9$)@44m5lk4zNmc8g%mt-+-LyA4ZQ(Xs^XtTJeg30O2JBn? zlHP0A8<~RW7HrKdTNjgD)NpgfO4qpumCk=_FMfpikwM@pR;+uYU%)$~(C(ujR5fCd z0!4xKJJo@&qH;%iFZ70Laqv4%d2M#X7$tKFOxc%+cho#R6b9)Zp5?v!qc!0NCXaa%9|zx+Jx7MsZ-iwA-?Fy1ZxG|%m@gwes_0B&OFrJNTq$q_2QcON z+Iqws)Zx$8%r&`0p%KsC^Z5e^X@2vJCT~R|lXU?sDzGQ;Aqu#QYLbi{A_R5& z4MGHKwbQlBu&3UBa-GFGOLBb-`|o|Xa_8$UP6o9aks13bNfDWxDB!lEOVbO5n!J(T z<2==NTH~7jZ4`wWvO^1~^Xo(6=2fq)o}l$jD4fOW50Ub#QU1?eSZdFEl`jvyB`e?jO!O z!CKkyFuq28%hScajMsO;$dV8H1(Y~+)_e>KGE%dewkj@SF$AN^H}mO!Ztu_V_dwa8&&_gN8-{$^8LG7~#!ZY&QPtYOk8^?08vm~C zi3mg?RN`Vb#lm^(vp*x|4Xrs`5iXtzENm2&BfZR!4lugTLYv>eMK6Y6Bo*2}b~;3! zZ5MjGcVY{1ZBsUBEv@&*vFz2mbe=7YhhE)&DV}3i&$m%sl%5&~dq`Zc_HPuVf2C>K zI_8zD%qy;!JKH(?uiSfW0F`+GSD%Ar*QJgw86hr#J_SG$%X$qNdhc@`eSH>1Ma5G_ zlTDa+pqm%0CH`ZGH7AuHm_?OJlwlP>5Y_E*a`|naS%PKYfxdzx68u zoB*6qJ?|-vrD%ItM7u$eIQY2)mrF@#8q-d3^wkJ=zv-D7wLFI=ATDN^=MZzjHzX~d zaG$?MA6wV08c#s_;i!k$bx><}NfYrxC;nXowrS1Ox>A9TcmZUm`WruAVBQU28+$rc zz@REAXceYON=a&2=`6m^7^0{o??{c>PPPvtI(#6?fCmT>G5>-Wrx)LK$mZWMwvev^ zh(W;K>)br`4vKg^GV90OO=|Hk^tbt&Z*ecLToMlR?#Y_4{|kAn|GyIV{}s3VHy}d9 z1_Txs78K+)H_x4`?iuXv?^Jqrbk?@!OpW5f!K1VoW=BWIyrQChE9-;kU5YtY>m@(O z5YcNeBu8+QT8sU@;nAKscUkq+e9TZ{EW0isWKWTxff3$ruLoB`;P)OTv3|b683Y3l-;&aF5O}*W`GdtXr)}Q;(kCa zF5z!bM>)4;noob3*?U~Z(5#V0k}+L!P(?G7tJ&o~>cqT#uOE_m>)7^Z;o8THB%rhlf9$CD zDT_zonLWa2jpsp+IdYGs#QW$gFD z)#=2T)QuF3Z($28V#7CcR~~n`vp8e*VsM%crEEKE_9yTViNVxBqbOlg97wk-PjSrj zm2&yT$qUI=o~u7ZW)%4Sqga=!7$fhg`TAAmJceje=ev*pGmW$fx$2CNZlv2+-5F6` z^n|y}qi?vT3F^|df$@#iunroHrm=BaKk<0nJn$mn%!=dT*CSS(trtesn=*ba;-9e3KWW zK3fT^a&KAeulBrwZBq|%Vw0@6WEuPV5U#31PI$}jKv>QBLj7tNg=`J$-PW?9t7)>u zde&mPxZNMF@v;FgQBpc~LpAsPFdaUouOZi}oXsGnrX`}9-BdU~xB=nq_dCG6r3A%) z|Dl_D%SDGRc6w%T@~h*>k;mh`QSMfFRbS7-aNd3KY7X|qEjKbt;e-WL#D|G@iDee> zA~fq*UpcDYAQQQw;;h*%Uf|IZwMuN(opAa~yCsMcqGGzpLW}8L zO^%g0QyGno9?%Xxyjo>`c_l+>zM1833W;sKs59lWgPrT#EoLrldkGc$lrqofWRtHt z^DJM{sg0o=TcFc3$J=yHL1)X4YP#klMog{a-F0+Zj7o;iZ26gyue{RWEKi{81GrEr z%Qr(C3ckPV<^q-%SsUF@qjb*$Tu#Jjy?MHSek8SyiHRAM@tZ$y9+);L!t>i&m*sZ# z^WM`Tw~1)lFLpsMo=5Or;if|PxAV6;|9m=aY^mu!Z*luIl-YX;S({62@{+6LTYPLk zZ%`axXgAru8^`C$$Ui5>loVp*4XRt<$=#Z@8n-KU2G^gje9~&&N*aWNAc?M=MvGl< zWJ9_d@T4~BRK`teS`sRyO6M86q!n^qa*fHivU!jwNWb2}O{S7_IjaN#+JViWn7u^a zX6;0^)nU#aJ-v0m+z?0pVD0Yw+qB-uhGCO?`e{F%&9$GX#)@)Y>=l9beQBC4#4b1p zRZnzV){5>t3wb^Y+_l;4sG#G1aXdXIj1&^wd-e4}0OT$S-8yb9e(_q=JRVTx%)Gnls!Y>;flwD!HC3W>s z)J<^Y!$bl7ra5v~?{^gA+uKZdj!9>XATco!sjsh(SXkis{{4HMSmOm$`Y?Kz2$3?z zp*i`WO4x}*@pL&!O4mnD?TqYbUrVaC-K6i~N4xl%#GsQ{TRXXMYjdn~YvZ4Z z3&GC|C5uBJzqT^GIH>o;7L!C%pr0>4INTMkA6UFh_Z%*{0S{Ko672h($qWGWQz%;n zK7aRPLYZd!PfkIBQei6ZM=oj&``9@n|)FLFwDcVC&k{;HR-$*Q4Ob9)MWK}EPwhbInAqyj_aKrPCa)H4FQJv}$g3o(6P7z^OTzzMjLda1w zUa}Ws`0yG!Ol4wyuz$!0_Zs5SRyes^Hh-yU>acOm6z0Jy2%^B+L+x5dgA3r9H50Gc zUcxKGDU$uKFqz-l9#fQCUirkQkhT!PHGjuF99ZAx>Cg3<3-X+*Y8=#i*dG_-JVk&I zdUPBXdQ(b2NQu_nUzQ3X@QOx1dBEqOF4d2R3Z13%K`@XJD3SNXi|4atl!he`05~*T z%9jtioEkHUw89Agw3Z_x-`~1Vb;lQx7ySEue^d_OwRzjsCky@CEdQ-;PP04 zX3Y)ioz5EX`@GpdtD0TUZ7C%Te>xY4E|;x58q}U=inZ_R96xK?Ze~(z54j?^e9$@Z zB9dF818QTXpR}$sY~__oJW8L`g?g4GzB+2^UKXzl9tm7a%J&=r0Jt@X@SqZzg%SG% z)Kp7IOva3^gJwXVo6PDMeNAe099=9p!^`yN*UL2zh0)31n=Vs_JjkS}`%}Q??_7PI z3_Wy&cS@nuRXqA^TK(}$5;I@X*`c401ocq7BR(HlqnqPwS$KElQmpCVHfzHS40XPvXQsIO)ZGtbD%lgI5B#6##ZL(n z0xI~aP!Gv=%RwIy$(RXh%$M*#=Fv5b6j#w?!0)O=6n(8$y7aXf2$7H{A&v06zfoAt znL7CQC`*cdpf>^(P9U_lt#X*)T~#?xUxq)7UQ}6#UoPNtMTfT+ zsp0jL63rQvx8Fcz7ATew97an`BUJ)bt}PZ51Mg25`6ab$G}$s%zBFvu_j>yxS_Rkr z7)N9lVDXw5|L(+HCt|>(tDFCcG0d(@Chi_M$$(Y*Ip*a0-g!O{G#~;s*7m21mPf&M zV0Xwhx$p!$bn@Y)S%Qg`RhDy+Uq7!M92i+%?Fpz_6V+!vKoNwB`3D5BKD;xVzv}gG zXqfkRHRm@R97|N8Gj4N(TLWJVmka!-BA#OWZ%{-<`iX@`FXuW}M2yo|^@~wOb`X3D z7ohIw?0!fF_!KMfcVT^<>c5tI@UUq$|L@B3BkRJ*yM}mA%^z}$J2X&e9A9D9qg@c@ zK_Y#&sKf=Vw}k}p4vrN4n+j@cgAZzttngmf&rV)KM0DWr(g9!HjjBmda=`H7>#4&6 zc(9bEkrBtz<$Yh{AErIcAPCR2pRjvPeB9#Hz`o;!CG*na51`?m>tB^w{-Y+% z+z)(Pz@esJYSQdXssUm91bUpGL+{#y?P_Z4kzb8x>rYz&yEI)Kqd3LI7WlmNcz0Jy z=Di{|FBsyZ{b$O!s(>|#23WjbC%qj;6bJgCY&SnT%I|KeWN;)i@l6-O-n{j}?paNk z;~&wv!IJEko(iLVbPryg*aR?p!4OH44nHU2DZjY5 zxU{e^>%zhUVs_RsDsgUchGp^RWrYO+b>_cpsX6ICY$<;|95IK7tCZ!kXMXd#Hh}f# zAQ0?k`19tZjDLgOPuD3F0C4&5GMxeYqnJjGh$i=Q7fBlQe+kAT)mP`p-&QM+sYv^I z{;|OnW4zJ1ugb>~0k{?BuR`a&F+DVbdzE;FE%!%sydHPeyBX@-Jf)|`IU&VDMVi9c z7sFWXncD1s%vr31f394PS)+$tZ=%(|jrKoEigCu5I%n8mt*sq|b4kFaNGeLwlMdE0 zUVej{`vD`>{aZKX^%eWxe;;Sd`z8;W9tt%}aJ!Ha)nRU9+m`}7mBU*x52G!2@(Fyl zhkM(9$>sLW1d`9-#TFrY(=Az@M7F{SK-MQ0B&U}CA-_E2WkKQb1RuQ%RKQ(6=1x>n zy{P)vml{nn0Ln-BLZ;lS^vyVFi!FPLc7_Sva9!5uXjUJ~J}PBflR>)`3B%;hGe6i? z_U#lczC0%a{%!nmX~_%Vay8OSr8l%$7fB7?q<}8NgJ1T(a8P$0Oxm4kU@@N#`KaQz zw)_m4?wWMMI9m4@9H>b(R2}te;$KEPMIAHM`m;!N))iaF3FJyCUM4 zko&PxPpT zL`oEniHxsh)(8NORz^e@YdnQmONJ=%_6$Km96^x?vi(xQ$p(=5Q=s#p-Y>=Yb)6MU zqDM}OBI$>vdWN3qm_fcBf8%`H5$3|NpI35eS|u)!xkpOHW|yk8VyDan@l@_#Vz3HR z^Ulbc`%oJGt6t^f_FopC@i1mAg9!_*H1EDd(}QDQVQn9b!JHM_ZaRebEVgA^rFVyagB# z>_|-s7YIIOMx0dB+ZChiJC6uFdMdv3o=Un92C?m{K9OW!{=R?r(5Kg0#n^iSiL*U^ z~*@w1ER0}h_%rwNOK5Sw(G$1mP@ua z5l3VIN}`{iimA??q~rW$&D;2znwtJnSR36v^G!dCf^Ce%i~>GLvK!}HVo4hk(F6Sj zSUdPwpJwa}zqP_VuhomxXwnrW4%`>0@Ecr9=&&IXRL5^Munc%ixZF+kV+@Jy-iD~G zI23|^U;qu;Coi=36DQ#{few2$2;gXJO4i!$%1O&EC6hD3qmK$CG}W{QZ*Nj}$R7+* z*qY0TZ#yV;fh_fTpt8vpL#*@Lujbje+up`r%*ZBrXSHz#HHq59jFR=67*?y^i_`$p z#odM8x6K@bs0UORE@iyE;3hp**r~L6Shm^0HYvb-aEDp^)k)T1uzV|>rpppja#+l# z2~I#`554*D8=ai%Sh5|2#-)OPpWyUddPUxo*nK4SwolaZJevgOZyE2aBKcfWa|k}c z=XV(D5A+2umz%W)yUn3AaRLibzrM(BmiQo&2*Mo2bLE%sUL0!+=>;r*XD-e=@ahDf z4s1=5ddxC*;i*{?{cVu*7ECBCnit7o*hKPpMT@XGBr%QZK+{;DVIvQDn8%w11}v6>^*I_fxfk1$^o8nFTS3utUE4f}-C7k7OUO zTobu+40tj$T@+NOUc6+c3!voO3z6H~+TC3kIjKZk-{Xh<3ts*=GWXx%>KaG>C(-&p_pkhaOwCfblwGPz W%aCvT1UWPF;P%Zp2^BcsG^`eB1A!XNQ3?m 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 literal 54819 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∈W0NvUKNIXeZqg7WXfrEkfbf?&93)5 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

    NoR`e?jd=?2c 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 diff --git a/docs/build/media/set-header-unit-library-settings.png b/docs/build/media/set-header-unit-library-settings.png index a876fd7ebdbccbaa873b7d435375a5a1733f599f..2a2c423fcdd5e22fe77b28a20d026b2c961c25bb 100644 GIT binary patch literal 25324 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 diff --git a/docs/build/media/vs2019-additional-module-dependencies.png b/docs/build/media/vs2019-additional-module-dependencies.png new file mode 100644 index 0000000000000000000000000000000000000000..73dff3c604db1f6d8960f1b1a4122f8a3762e4ed GIT binary patch literal 37505 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]e=`6pPkCUkg&x0|K|O;-VKhW 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�wcgx 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 literal 0 HcmV?d00001 diff --git a/docs/build/media/vs2019-scan-module-dependencies.png b/docs/build/media/vs2019-scan-module-dependencies.png index 30133ba59739c8c04e02f8ec31dafb0d50700c40..5b207ea85cd49066e9544ed419ae96bf188452f0 100644 GIT binary patch literal 37718 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 diff --git a/docs/build/media/vs2019-translate-includes-option.png b/docs/build/media/vs2019-translate-includes-option.png new file mode 100644 index 0000000000000000000000000000000000000000..782975cd089c4993b60fee3bf26675cb7c9dde4d GIT binary patch literal 42008 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 StBGUO5w~@WwaYc_!~O;EP0Q~9 literal 0 HcmV?d00001 diff --git a/docs/build/reference/compiler-options-listed-alphabetically.md b/docs/build/reference/compiler-options-listed-alphabetically.md index a2a6ba8c46e..ca240849c16 100644 --- a/docs/build/reference/compiler-options-listed-alphabetically.md +++ b/docs/build/reference/compiler-options-listed-alphabetically.md @@ -122,8 +122,8 @@ This table contains an alphabetical list of compiler options. For a list of comp | [`/sdl`](sdl-enable-additional-security-checks.md) | Enables additional security features and warnings. | | [`/showIncludes`](showincludes-list-include-files.md) | Displays a list of include files during compilation. | | [`/source-charset`](source-charset-set-source-character-set.md) | Set source character set. | -| [`/sourceDependencies`](sourcedependencies.md) | List headers, modules, and other source dependencies. | -| [`/sourceDependencies:directives`](sourcedependencies.md) |List headers, and other source dependencies, using a list of headers that can be converted to header units. | +| [`/sourceDependencies`](sourcedependencies.md) | List all source-level dependencies. | +| [`/sourceDependencies:directives`](sourcedependencies-directives.md) |List module and header unit dependencies. | | [`/std`](std-specify-language-standard-version.md) | C++ standard version compatibility selector. | | [`/Tc`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies a C source file. | | [`/TC`](tc-tp-tc-tp-specify-source-file-type.md) | Specifies all source files are C. | diff --git a/docs/build/reference/compiler-options-listed-by-category.md b/docs/build/reference/compiler-options-listed-by-category.md index e89bd3bd31e..4ceee7fbda6 100644 --- a/docs/build/reference/compiler-options-listed-by-category.md +++ b/docs/build/reference/compiler-options-listed-by-category.md @@ -111,8 +111,8 @@ This article contains a categorical list of compiler options. For an alphabetica | [`/headerUnit`](headerunit.md) | Specify where to find the header unit file (`.ifc`) for the specified header. | | [`/headerName`](headername.md) | Build a header unit from the specified header. | | [`/reference`](module-reference.md) | Use named module IFC. | -| [`/sourceDependencies`](sourcedependencies.md) | List headers, modules, and other source dependencies. | -| [`/sourceDependencies:directives`](sourcedependencies.md) | List headers, and other source dependencies, using a list of headers that can be converted to header units. | +| [`/sourceDependencies`](sourcedependencies.md) | List all source-level dependencies. | +| [`/sourceDependencies:directives`](sourcedependencies-directives.md) | List module and header unit dependencies. | | [`/translateInclude`](translateinclude.md) | Treat `#include` as `import`. | ## Language diff --git a/docs/build/reference/experimental-module.md b/docs/build/reference/experimental-module.md index 40e229e72a6..1a22ec887eb 100644 --- a/docs/build/reference/experimental-module.md +++ b/docs/build/reference/experimental-module.md @@ -1,13 +1,13 @@ --- title: "/experimental:module (Enable module support)" description: "Use the /experimental:module compiler option to enable experimental compiler support for modules." -ms.date: "09/03/2019" +ms.date: "04/13/2021" f1_keywords: ["module", "/experimental:module"] helpviewer_keywords: ["module", "/experimental:module", "Enable module support"] --- # /experimental:module (Enable module support) -Enables experimental compiler support for modules, as specified by the draft C++20 standard. +Enables experimental compiler support for Standard Template Library named module usage. ## Syntax @@ -21,12 +21,6 @@ This option is available starting in Visual Studio 2015 Update 1. As of Visual S For more information on modules and how to use and create them, see [Overview of modules in C++](../../cpp/modules-cpp.md). -Here's an example of the compiler command-line options used to create an export module from source file *`ModuleName.ixx`*: - -```cmd -cl /EHsc /MD /experimental:module /export /module:name ModuleName /module:wrapper C:\Output\path\ModuleName.h /module:output C:\Output\path\ModuleName.ifc -c ModuleName.ixx -``` - ### To set this compiler option in the Visual Studio development environment 1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index 75d42502e34..b4815b99a71 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -57,25 +57,15 @@ Given a project that references two header files and their header units, listed The compiler options to reference the header units for these particular header files might look like this: ```CMD -cl ... /std:c++latest /translateInclude /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit:quote app.h=app.h.ifc +cl ... /std:c++latest /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit:quote app.h=app.h.ifc ``` ### To set this compiler option in the Visual Studio development environment -> [!NOTE] -> This command line switch is typically set by the build system. - -1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). - -1. Set the **Configuration** drop-down to **All Configurations**. - -1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. - -1. Modify the **Additional Options** property to add the *`/headerUnit`* options and arguments. Then, choose **OK** or **Apply** to save your changes. +You normally shouldn't set this in the Visual Studio development environment. It is set by the build system. ## See also [`/exportHeader` (Create header units)](module-exportheader.md)\ [`/headerName` (Create a header unit from the specified header)](headername.md)\ -[`/reference` (Use named module IFC)](module-reference.md)\ -[`/translateInclude` (Translate include directives into import directives)](translateinclude.md) \ No newline at end of file +[`/reference` (Use named module IFC)](module-reference.md)\ \ No newline at end of file diff --git a/docs/build/reference/module-exportheader.md b/docs/build/reference/module-exportheader.md index b424641eed0..d0f258f008f 100644 --- a/docs/build/reference/module-exportheader.md +++ b/docs/build/reference/module-exportheader.md @@ -15,7 +15,7 @@ Tells the compiler to create the header units specified by the input arguments. > **`/exportHeader /headerName:angle`** *`header-name`* > **`/exportHeader /headerName:quote`** *`header-name`* - +> **`/exportHeader`** *`header-name-including-path`* Note: this form is deprecated ### Arguments @@ -53,16 +53,7 @@ cl … /std:c++latest /exportHeader /headerName:quote util/util.h ### To set this compiler option in the Visual Studio development environment -> [!NOTE] -> This command line switch is typically set by the build system. - -1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). - -1. Set the **Configuration** drop-down to **All Configurations**. - -1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. - -1. Modify the **Additional Options** property to add the *`/exportHeader`* option and any arguments. Then, choose **OK** or **Apply** to save your changes. +You normally shouldn't set this in the Visual Studio development environment. It is set by the build system. ## See also diff --git a/docs/build/reference/module-reference.md b/docs/build/reference/module-reference.md index 1c8c8e64437..43bb163f67b 100644 --- a/docs/build/reference/module-reference.md +++ b/docs/build/reference/module-reference.md @@ -17,13 +17,15 @@ Tells the compiler to use an existing IFC (*`.ifc`*) for the current compilation ### Arguments *`filename`*\ -The name of a file that contains *IFC data*, prebuilt module information. To import more than one module, include a separate **`/reference`** option for each file. +The name of a file that contains *IFC data*, which is prebuilt module information. To import more than one module, include a separate **`/reference`** option for each file. *`module-name`*\ A valid name of an exported primary module interface unit name or full module partition name. ## Remarks +In most cases you won't need to specify this switch because the project system discovers module dependencies within a solution automatically. + The **`/reference`** compiler option requires you enable the [/std:c++latest](std-specify-language-standard-version.md) option. The **`/reference`** option is available starting in Visual Studio 2019 version 16.10 Preview 2. If the **`/reference`** argument is a *`filename`* without a *`module-name`*, the file gets opened at runtime to verify the *`filename`* argument names a specific import. It can result in slower runtime performance in scenarios that have many **`/reference`** arguments. @@ -72,22 +74,8 @@ The reference options using *`module-name=filename`* could look like: cl ... /std:c++latest /reference m=m.ifc /reference M:Part1=m-part.ifc /reference Core.Networking=Networking.ifc ``` -### To set this compiler option in the Visual Studio development environment - -> [!NOTE] -> This command line switch is typically set by the build system. - -1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). - -1. Set the **Configuration** drop-down to **All Configurations**. - -1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. - -1. Modify the **Additional Options** property to add the *`/reference`* option and its arguments. Then, choose **OK** or **Apply** to save your changes. - ## See also [`/sourcedependencies:directives` (use header file to header unit allow-list)](sourcedependencies-directives.md)\ [`/headerUnit` (Use header unit IFC)](headerunit.md)\ [`/exportHeader` (Create header units)](module-exportheader.md)\ -[`/translateInclude` (Translate include directives into import directives)](translateinclude.md) diff --git a/docs/build/reference/sourcedependencies-directives.md b/docs/build/reference/sourcedependencies-directives.md index b540731122e..9c7716c3adc 100644 --- a/docs/build/reference/sourcedependencies-directives.md +++ b/docs/build/reference/sourcedependencies-directives.md @@ -1,5 +1,5 @@ --- -title: "/sourceDependencies:directives (Report source-level dependencies and use an allowlist)" +title: "/sourceDependencies:directives (List module and header unit dependencies)" description: "Reference guide to the /sourceDependencies:directives compiler option in Microsoft C++." ms.date: 04/13/2020 author: "tylermsft" @@ -7,15 +7,19 @@ ms.author: "twhitney" f1_keywords: ["/sourceDependencies:directives"] helpviewer_keywords: ["/sourceDependencies:directives compiler option", "/sourceDependencies:directives"] --- -# `/sourceDependencies:directives` (List headers, and other source dependencies, using a list of headers that can be converted to header units.) +# `/sourceDependencies:directives` (List module and header unit dependencies) -This command-line switch generates a JSON file that details the source-level dependencies consumed during compilation. It also looks for a `header-units.json` file that specifies which header files can be converted to header units. +This command-line switch generates a JSON file that lists the module and header-unit dependencies in your project. + +It identifies which modules and header units need to be compiled before the project that uses them is compiled. For instance, it will list `import ;` or `import "library"; as a header unit dependency, and `import name;` as a module dependency. This command-line option is similar to [`/sourceDependencies`](sourcedependencies.md), but differs in the following ways: -- Unlike `/sourceDependencies`, the compiler doesn't produce compiled output. Instead, the files are scanned for module directives, but no compiled code, modules, or header units are produced. -- Unlike `/sourceDependencies`, the output JSON file doesn't list imported modules and imported header units (`.ifc` files) because this switch does a scan of the project files, not a compilation, so there are no built modules or header units to import. -- `/sourceDependencies:directives`is designed to be used before *`.ifc`* files are built. +- The compiler doesn't produce compiled output. Instead, the files are scanned for module directives. No compiled code, modules, or header units are produced. +- The output JSON file doesn't list imported modules and imported header units (*`.ifc`* files) because this switch does a scan of the project files, not a compilation, so there are no built modules or header units to list. +- Only directly imported modules or header units are listed. It doesn't list the dependencies of the imported modules or header units themselves. +- Header file dependencies are not listed. That is, `#include ` or `#include "file"` dependencies are not listed. +- `/sourceDependencies:directives`is meant to be used before *`.ifc`* files are built. ## Syntax @@ -43,16 +47,6 @@ When a non-fatal compiler error occurs, the dependency information still gets wr All file paths appear as absolute paths in the output. -This switch is used in combination with [`/translateInclude`](translateinclude.md). - -`header-units.json` is used with the build system's **Scan Sources for Module Dependencies** to determine which header files can be compiled into a header unit. When this switch is specified, header files found in the scanned source files, that are also listed in `header-units.json`, are considered eligible to be compiled into header units. Files not in the list are instead treated as a normal `#include`. - -The compiler looks for `header-units.json` where the header being loaded is located. For more information about the format of this file, see [C++ header-units.json reference](..\header-unit-json-reference.md) - -When a non-fatal compiler error occurs, the dependency information still gets written to the output file. - -All file paths appear as absolute paths in the output. - ### Examples Given the following sample code: @@ -71,9 +65,7 @@ import "t.h"; int main() {} ``` -You can use **`/sourceDependencies`** with the rest of your compiler options: - -> `cl /std:c++latest /translateInclude /sourceDependencies:directives deps.json main.cpp` +> `cl /std:c++latest /sourceDependencies:directives deps.json main.cpp` This command line produces a JSON file *`deps.json`* with content like: @@ -100,20 +92,9 @@ We've used `...` to abbreviate the reported paths; the report contains the absol No *`.ifc`* files are listed in the output because they weren't built. Unlike `/sourceDependencies`, the compiler doesn't produce compiled output when `/sourceDependencies:directives`is specified, so no compiled modules or header units are produced to import. -### To set the /sourceDependencies compiler option in Visual Studio - -> [!NOTE] -> This command line switch is typically set by the build system. - -1. Open the **Property Pages** dialog box for the project. For more information, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). - -1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. - -1. In the **Additional options** box, add *`/sourceDependencies:directives `* and then choose **OK** or **Apply** to save your changes. - -### To set this compiler option programmatically +## To set this compiler option in the Visual Studio development environment -- This option doesn't have a programmatic equivalent. +You normally shouldn't set this yourself in the Visual Studio development environment. It is set by the build system. ## See also diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index 37027080d9c..8657275c63d 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -1,19 +1,22 @@ --- title: "/sourceDependencies (Report source-level dependencies)" -description: "Reference guide to the /sourceDependencies compiler option in Microsoft C++." +description: "Describes the /sourceDependencies compiler option in Microsoft C++." ms.date: 04/13/2020 author: "tylermsft" ms.author: "twhitney" f1_keywords: ["/sourceDependencies"] helpviewer_keywords: ["/sourceDependencies compiler option", "/sourceDependencies"] --- -# `/sourceDependencies` (Report source-level dependencies) +# `/sourceDependencies` (List all source-level dependencies) This command-line switch generates a JSON file that details the source-level dependencies consumed during compilation. The JSON file contains a list of the source dependencies, which include: -- Header files (both transitive and directly included headers). +- Header files (both directly included and the list of headers included by those headers). - The PCH used (if **`/Yu`** is specified). -- Imported modules and imported header units (both transitive and directly imported module/header units). +- Names of imported modules +- File paths and names of imported header units (both directly imported and those imported by those modules and headers units). + +This provides information necessary to build modules and header units in the proper dependency order. ## Syntax @@ -79,20 +82,9 @@ where `...` represents your other compiler options. This command line produces a We've used `...` to abbreviate the reported paths; the report contains the absolute paths. The paths reported depend on where the compiler finds the dependencies. If the results are unexpected, you may want to check your project's include path settings. -### To set the /sourceDependencies compiler option in Visual Studio - -> [!NOTE] -> This command line switch is typically set by the build system. - -1. Open the **Property Pages** dialog box for the project. For more information, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). - -1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. - -1. In the **Additional options** box, add *`/sourceDependencies: `* and then choose **OK** or **Apply** to save your changes. - -### To set this compiler option programmatically +### To set this compiler option in the Visual Studio development environment -- This option doesn't have a programmatic equivalent. +You normally shouldn't set this yourself in the Visual Studio development environment. It is set by the build system. ## See also diff --git a/docs/build/reference/translateinclude.md b/docs/build/reference/translateinclude.md index c978c082910..deaf09a25c2 100644 --- a/docs/build/reference/translateinclude.md +++ b/docs/build/reference/translateinclude.md @@ -2,12 +2,14 @@ title: "/translateInclude (Translate include directives into import directives)" description: "Use the /translateInclude compiler option to treat #include directives as import statements when an importable header unit is available." ms.date: 4/13/2021 +author: "tylermsft" +ms.author: "twhitney" f1_keywords: ["/translateInclude"] helpviewer_keywords: ["/translateInclude", "Translate include directives into import directives"] --- # `/translateInclude` (Translate include directives into import directives) -Instructs the compiler to treat `#include` as `import` for headers that have been prebuilt into a header unit (`.ifc`) file. +Instructs the compiler to treat `#include` as `import` for headers that have been prebuilt into a header unit (`.ifc`) file. ## Syntax @@ -49,24 +51,27 @@ And a source *`.cpp`* file that includes the headers, int main() { } ``` -The **`/translateInclude`** option allows the compiler to import the header units instead of compiling the headers again. Here's an example command line that translates the include directives for *`util.h`* and *`app.h`* into imports of the header units instead: +The **`/translateInclude`** option allows the compiler to treat an `#include` as an `import` for header files that have a corresponding compiled header unit file (*`.ifc`*) and that have been specified on the command line via the `/headerUnit` switch. + +If an `#include` is encountered that doesn't have a corresponding header unit specified via the `/headerUnit` switch, it is processed by the preprocessor as a normal `#include` directive. + + Here's an example command line that translates the include directives for *`util.h`* and *`app.h`* into imports of the header units instead: ```CMD cl /IC:\ /translateInclude /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit C:\app\app.h=C:\app.h.ifc ``` -### To set this compiler option in the Visual Studio development environment - -1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). +## To set this compiler option in the Visual Studio development environment -1. Set the **Configuration** drop-down to **All Configurations**. +To enable `/TranslateInclude`, set the **Translate Includes to Imports** option in project properties: -1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. +1. In the left-hand pane of the project property pages, select **Configuration Properties** > **C/C++** > **General** +1. Change the **Translate Includes to Imports** dropdown to **Yes** +![Project properties dialog set Translate Includes to Imports](../media/vs2019-translate-includes-option.png) -1. Modify the **Additional Options** property to add the *`/translateInclude`* option. Then, choose **OK** or **Apply** to save your changes. ## See also [`/headerUnit` (Use header unit IFC)](headerunit.md).\ [`/exportHeader` (Create header units)](module-exportheader.md)\ -[`/reference` (Use named module IFC)](module-reference.md) +[`/reference` (Use named module IFC)](module-reference.md) \ No newline at end of file diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 323621ec454..e388d567710 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -91,8 +91,6 @@ href: ../build/walkthrough-header-units.md - name: "Walkthrough: Import STL libraries as header units" href: ../build/walkthrough-import-stl-header-units.md - - name: header-unit.json schema reference (C++) - href: ../build/header-unit-json-reference.md - name: Precompiled header files href: ../build/creating-precompiled-header-files.md - name: C++ release builds @@ -705,9 +703,9 @@ href: ../build/reference/showincludes-list-include-files.md - name: /source-charset (Set source character set) href: ../build/reference/source-charset-set-source-character-set.md - - name: /sourceDependencies (List source-level dependencies) + - name: /sourceDependencies (List all source-level dependencies) href: ../build/reference/sourcedependencies.md - - name: /sourceDependencies:directives (List source-level dependencies-use allowlist) + - name: /sourceDependencies:directives (List module and header unit dependencies) href: ../build/reference/sourcedependencies-directives.md - name: /std (Specify language standard version) href: ../build/reference/std-specify-language-standard-version.md diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 78ce60812b2..8c80172e616 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -20,9 +20,9 @@ Support for header units requires at least Visual Studio 2019 16.10.0 Preview 2. ## What is a header unit -Header units are a binary representation of a header file, and end with an *`.ifc`* extension. This is also the format used to store named modules. +Header units are a binary representation of a header file, and end with an *`.ifc`* extension. This is also the format used for named modules. -One important difference between a header unit and a header file is that header units aren't affected by macro definitions. For example, you can't `#define` a symbol that causes the header unit to behave differently when you import it the way you can with a header file. Everything visible from a header file is also visible from a header unit. +One important difference between a header unit and a header file is that header units aren't affected by macro definitions. You can't `#define` a symbol that causes the header unit to behave differently when you import it the way you can with a header file. Everything visible from a header file is also visible from a header unit. Before you can import a header unit, a header file must be compiled into a header unit. An advantage of header units (*`.ifc`* files) over a PCH is that it can be used in distributed builds. For example, as long as you're using the same compiler to compile the *`.ifc`* and the program that imports it, and are targeting the same platform and architecture, a header unit produced on one machine can be used on another. @@ -35,14 +35,12 @@ Another advantage of header units over a PCH is that there's more flexibility wh There are several ways to compile a file into a header unit: --Automatically scan for header units: This approach is best suited to smaller projects that include many different header files. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it's better suited to smaller projects, or for those where build time isn't a crucial consideration, is because it takes extra time for the build system to scan all of the files to find what should be built into header units. This scanning can be done at the project level for all source files, or at the individual file level. +- Automatically scan for header units: This approach is best suited to smaller projects that include many different header files. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it's better suited to smaller projects is because it can't guarantee optimal build throughput since it has to scan all of the files to find what should be built into header units. This scanning can be done at the project level for all source files, or at the individual file level if you want to manually specify which headers to compile into header units. --Build a shared header units project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library (or libraries) that contain the header units that you want. Then reference the library (or libraries) from the projects that then import the header units they need. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. +- Build a shared header units project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library project (or projects) that contain the header units that you want. Then reference the library project (or projects) from the project that then imports the header units it needs. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. - Choose individual header units to build by changing the compilation action for a file. This approach is demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's also a good way to quickly and selectively try out header units in your project. -To build header units from the headers in your codebase, you can use any of the methods above. To build and use header units for library headers that aren't part of your codebase, use the technique described in [Walkthrough: Import STL libraries using header units](walkthrough-import-stl-header-units.md). - ## Convert a project to use header units In this example, you'll compile a header file as a header unit. Begin by creating the following project in Visual Studio: @@ -69,15 +67,16 @@ void PrintPythogoreanTriple(int a, int b) } ``` -To enable header units, set the project C++ language standard to use the latest features: +To enable header units, first set the project C++ language standard to use the latest features: +1. Right-click the project in the **Solution Explorer** and select **Properties**. 1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** 1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft** ![Set language standard to preview version](media/set-cpp-language-latest.png) ### Compile a header file as a header unit -In the **Solution Explorer**, select the file you want to compile as a header unit. Right-click the file, and select **Properties**. Then do one of the following depending on the file type: +In the **Solution Explorer**, select the file you want to compile as a header unit. Right-click the file, and select **Properties**. Then do one of the following, depending on the file type: For header files: - Set the **Item Type** property to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header**. Setting this property also sets **C/C++** > **Advanced** > **Compile As** to **Compile as C++ Header Unit (/exportHeader)** for you. @@ -91,7 +90,7 @@ For source files (or header files that don't have a `.h` or `.hpp` extension): In the source file for the example project, the file that contains `main()`, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). When you're compiling a header unit from a system header, use angle brackets (`#import ;`). If it's a project header, use `import "file";` -Build the solution (**Build** > **Build Solution** from the main menu, or press `F6`) and run it to see that it produces the expected output: `Pythagorean triple a:2 b:3 c:13` +Build the solution (**Build** > **Build Solution** from the main menu) and run it to see that it produces the expected output: `Pythagorean triple a:2 b:3 c:13` In your own projects, repeat this process to compile the header files you want to import as header units. diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 522b75edce1..22f1c2d2af1 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -3,21 +3,25 @@ description: "Learn to use header units to import C++ Standard Template Library title: "Walkthrough: Import Standard Template Library (STL) libraries as header units" ms.date: "4/13/2021" ms.custom: "conceptual" +author: "tylermsft" +ms.author: "twhitney" helpviewer_keywords: ["import"] --- # Walkthrough: Import STL libraries as header units This walkthrough shows two different ways to import C++ Standard Template Library (STL) libraries as header units in Visual Studio. -The [first way](#approach1) has the build system automatically scan for, and build, header units based on what STL headers you include in your project. +The [first way](#approach1) has the build system automatically scan for, and build, header units based on what STL headers you import in your project. -The [second way](#approach2) demonstrates how to build a static library containing header units for the STL headers you want to use, and then reference that project to import the header units. +The [second way](#approach2) demonstrates how to build a static library project containing header units for the STL headers you want to use, and then reference that project to import the header units. Importing a STL header as a header unit is a simpler alternative to [precompiled header files](creating-precompiled-header-files.md). Header units are easier to set up and easier to use than a shared precompiled header file (PCH), while providing similar performance benefits. Unlike a PCH, when a header unit changes, only it and its dependencies are rebuilt. -Before you can import an STL header, it must be compiled into a header unit. Header units are a binary representation of a header file, and end with an `.ifc` extension. +Before you can import an STL header, it must be compiled into a header unit. Header units are a binary representation of a header file, and end with an *`.ifc`* extension. -One important difference between a header unit and a header file is that header units are not affected by macro definitions the way header files are. For example, you can't `#define` a symbol that causes the header unit to behave differently when you import it the way you can with a header file. Everything visible from a header file is also visible from a header unit. +One important difference between a header unit and a header file is that header units are not affected by macro definitions the way header files are. You can't `#define` a symbol that causes the header unit to behave differently when you import it as you can with a header file. + +Everything visible from a header file is also visible from a header unit. ## Prerequisites @@ -29,42 +33,41 @@ Before an STL header can be imported, it must be compiled into a header unit. Th **Scan for module dependencies** -This approach requires minimal effort on your part by putting the burden on the build system. At a high level, it works by scanning your sources for `#include` directives, and tries to compile those header files and their dependencies into header units. It then imports the header unit instead of running the header file through the preprocessor. You don't even have to change your code from `#include ` to `import ;`. This may be a good approach for you if your codebase isn't large, or you just want to try out header units without changing your code. +At a high level, this works by scanning your sources for `import "header";` and `import

    ;` statements, and tries to compile those header files and their dependencies into header units. It then imports the compiled header unit files (*`.ifc`*) instead of running the header file through the preprocessor. -It may not be the optimal approach for larger projects because it can be time consuming to scan through the files to find the headers to build into header units. And it may result in reprocessing the same header files repeatedly, increasing build time. Also, not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. If a header file can't be compiled into a header unit, it will be treated as a normal `#include` file. +It may not be the optimal approach for larger projects because it can't guarantee optimal build times since it needs to scan through the files to find the headers to build into header units. It may result in reprocessing the same header files repeatedly, increasing build time. Also, not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. If a header file can't be compiled into a header unit, it will be treated as a normal `#include` file. See [Approach 1: Scan for headers](#approach1), in this article, for a walkthrough of this approach. -**Create a static library** +**Create a static library project** -The recommended approach, particularly for larger projects, or in cases where you want to share a common set of header units across multiple projects, is to create a static library containing the header units you want to use. This library is then shared with projects that import those header units. It's like using [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but easier. +The recommended approach, particularly for larger projects, or in cases where you want to share a common set of header units across multiple projects, is to create a static library project containing the header units you want to use. This library project is then referenced by projects that import those header units. It's like using [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but easier. -See [Approach 2: Build a static library](#approach2), in this article, for a walkthrough of this approach. +See [Approach 2: Build a static library project](#approach2), in this article, for a walkthrough of this approach. -## Approach 1: Scan for headers +## Approach 1: Scan for imports -We'll begin with the easiest way to import STL libraries as header units. This approach may not be appropriate for larger projects because scanning the sources takes more build time. +We'll begin with the easiest way to import STL libraries as header units. This approach may not be appropriate for larger projects because it can't guarantee the most optimal build time due to scanning the sources for `import` statements. -This option is convenient for codebases that use many different headers, and where build throughput isn't critical. This option doesn't guarantee a header unit for a particular header will be built only once. Header units built by referenced static libraries projects are reused. +This option is convenient for codebases that use many different headers, and where build throughput isn't critical. This option doesn't guarantee a header unit for a particular header will be built only once, whereas header units built into referenced static libraries projects are reused. -You can import your STL libraries as header units without modifying your code by setting two Visual C++ project options: +You can import your STL libraries as header units without modifying your code by setting a Visual C++ project option: - **Scan Sources for Module Dependencies** -- **Translate Includes to Imports** -These settings cause the build system to scan your source code for `#include` directives to compile into header units. For each successfully compiled header unit, the compiler then treats its corresponding `#include` as an `import` and reads in the compiled header unit. There are other ways to indicate that a header file should be treated as a header unit besides scanning your entire project. That is covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). +This setting causes the build system to scan your source code for `import` directives and tries to compile the imported header file into a header unit. There are other ways to indicate that a header file should be treated as a header unit besides scanning your entire project. That is covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). -Not all headers can be converted to a header unit. One issue is `#define` symbols that cause a header file to compile differently. If a header file relies on this mechanism, it won't be converted to a header unit, and will instead be treated as an `#include` instead of an `import`. +Not all headers can be converted to a header unit. One issue is `#define` symbols that cause a header file to compile differently. If a header file relies on this mechanism, it won't be converted to a header unit. Instead, it is treated as an ordinary `#include`. To demonstrate this approach, we'll create a project that imports two STL libraries, and then change the project properties so that it treats the library includes as header imports. ### Create a C++ console app project -This step creates a project that includes two libraries: `` and ``. You'll modify the project settings so that the project is scanned for potential header files that can be compiled into header units, and the compiler will also treat `#include` as if you had written `import`. +This step creates a project that includes two libraries: `` and ``. You'll modify the project settings so that the project is scanned for potential header files that can be compiled into header units. 1. With Visual Studio, create a new C++ console app project. 1. Modify the source file as follows: ```cpp -#include -#include +import ; +import ; int main() { @@ -75,14 +78,13 @@ int main() ### Set project options and run the project -Follow these steps to set the options that cause the build system to scan for headers to compile into header units. And the option that causes the compiler to treat `#include` as if you had written `import`: +Follow these steps to set the options that cause the build system to scan for imported headers to compile into header units: 1. From the main menu, choose **Project** > **Properties**. The project properties window appears: ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) -1. Ensure that the **Configuration** dropdown is set to **All Configurations** +1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings we will change so they apply whether you are building for debug or retail, and so on. 1. In the left-hand pane of the project property page, select **C/C++** > **General** 1. Set **Scan Sources for Module Dependencies** to **Yes** Because we're setting the project property, all sources in this project will be scanned. This could be set at the file level, but here we scan the entire project. -1. Set **Translate Includes to Imports** to **Yes** Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: @@ -91,19 +93,17 @@ Change the C++ language standard for the compiler. The latest preview setting is ![Set language standard to preview version](media/set-cpp-language-latest.png) -1. Click **OK** to close the project properties pages, and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. +1. Click **OK** to close the project properties pages, and then build the solution: **Build** > **Build Solution** from the main menu. You can run the solution to verify that it produces the expected output: `1` -When you update an existing solution to use **Scan Sources for Module Dependencies**, also set **Translate Includes to Imports** for all of the projects in your solution where you want to use header units. +The primary consideration of this approach is the balance between convenience and the build cost of scanning all of your files to determine which header files to build as header units. -The primary consideration of this approach is the balance between convenience and the cost of scanning all of your files to determine which header files to build as header units. +You can fine-tune this balance by not scanning for import dependencies, and instead explicitly marking which files should be built as header units. That approach is shown in [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) -You can fine-tune this balance by not scanning for module dependencies, and instead explicitly marking which files should be built as header units. That approach is shown in [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) +## Approach 2: Build a static library project -## Approach 2: Build a static library - -The more flexible and more build performant way to consume STL headers is to create a static library, or static libraries, that build common header units from the STL headers you want to use. Then reference that library, or libraries, from the projects that need those STL headers. Adding a reference establishes a mapping between the `import` statement for the header unit, and its `.ifc` file. +The more flexible way to consume STL headers is to create one or more static library projects that build header units from the STL headers you want to reuse. Then reference the library project, or library projects, from the projects that need those STL headers. Modules and header units built in a static library project are automatically available to referencing projects. The project system automatically adds the appropriate [`/headerUnit](./reference/headerunit.md) switches to the command line so that the header units can be imported by the referencing projects. This option ensures that header units for a particular header will be built only once. It's similar to using a shared precompiled header file, but is much easier. @@ -129,19 +129,18 @@ Set project properties to share the header units from this project: 1. From the Visual Studio main menu, choose **Project** > **Properties**. The project properties window appears: ![Settings for Configuration type and C++ language standard](media/set-header-unit-library-settings.png) -1. Ensure that the **Configuration** dropdown is set to **All Configurations** +1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings we will change so they apply whether you are building for debug or retail, and so on. 1. In the left-hand pane of the project property page, select **General** 1. Change the **Configuration Type** option to **Static library (.lib)** 1. Change **C++ Language Standard** to **Preview-Features from the Latest C++ Working Draft** 1. In the left-hand pane of the project property page, select **C/C++** > **General** ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** -1. Set the **Translate Includes to Imports** dropdown to **Yes**. This setting causes the build to not only produce header units for the headers you specify in your source code, but also for all headers that are included by those headers and those listed in the `header-units.json` file. For more information about this file, see [header-units.json](#header-unitsjson), below. This setting ensures minimal symbols duplication in the header units and the best build throughput. -1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu, or press `F6`. +1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu. ## Reference the STL header unit project -Next, create a project that will use the built `` and `` STL header units: +Next, create a project that will use the built `` and `` STL header unit project: 1. With the current solution still open, from the Visual Studio menu select **File** > **Add** > **New Project** 1. Add a C++ Console app project. Call it **Walkthrough**, for this example @@ -170,15 +169,15 @@ What this reference accomplishes is that the build system will use the header un 1. Click **OK** to close the **Add Reference** dialog 1. Right-click the **Walkthrough** project and select **Set as Startup Project** -Then you can build the solution (**Build** > **Build Solution** from the main menu, or press `F6`) and run it to see that it produces the expected output: `1` +Then you can build the solution (**Build** > **Build Solution** from the main menu) and run it to see that it produces the expected output: `1` -The advantage of this approach is that you can reference the static library from any project to reuse the header units in it. In this example, that's `` and ``. +The advantage of this approach is that you can reference the static library project from any project to reuse the header units in it. In this example, that's `` and ``. -You can make a monolithic library containing all the commonly used STL headers that you want to import from your various projects. Or, you can produce smaller shared libraries that have different groupings of STL libraries that you want to import as header units. Then reference those shared projects as needed. +You can make a monolithic library project containing all the commonly used STL headers that you want to import from your various projects. Or, you can produce smaller shared library projects that have different groupings of STL libraries that you want to import as header units. Then reference those shared projects as needed. The result should be increased build throughput because importing a header unit significantly reduces the work the compiler must do. -It's important when you do this with your own projects that you build the static library using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the static library. +It's important when you do this with your own projects that you build the static library project using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the static library project. ## Reuse header units between projects @@ -193,11 +192,23 @@ The following settings control the visibility of header units to the build syste - **Public C++ Module directories**: specify which project directories contain header units that should be available to referencing projects. This is a way of making some header units public, by putting those that should be public in a directory that will be made visible to other projects. If you set this, you may also want to specify **Public Include Directories** so your public headers are automatically added to the include path in referencing projects. - **All Modules are Public** - To use header units built as a part of a DLL project, the symbols have to be exported from the DLL. To do so, set this property to **Yes**. -### Duplicate symbols +## Reuse header units between solutions + +If you want to use a header unit built in a different solution, you can specify where the built *`.ifc`* files are so that you can import them. + +To access this setting: +1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. +1. In the left-hand pane of the project properties window, select **C/C++** > **General**. +1. Add the modules to reference in the **Additional Module Dependencies** dropdown. +![Project properties under C/C++, General, which Additional Module Dependencies selected](media/vs2019-additional-module-dependencies.png) + +## Handling multiple copies of a header unit + +If you reference two or more projects that built two or more header units with the same name, or that built two or more header units for the same header file, you'll end up in a situation where there are multiple header units to choose from for the same import. You might have different versions of the header unit that were built with different compiler settings, for instance, and need to tell the compiler which one to use. -If you reference two or more projects that built two or more header units with the same name, or that built two or more header units for the same header file, you'll get duplicate symbols. You can use the project properties **C/C++** > **Additional Header Unit Dependencies** to resolve collisions by specifying which header unit should be used. Otherwise, you can't predict which one gets picked. +Use the project properties **C/C++** > **Additional Header Unit Dependencies** to resolve collisions by specifying which header unit should be used. Otherwise, you can't predict which one gets picked. -To access these settings: +To access this setting: 1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. 1. In the left-hand pane of the project properties window, select **C/C++** > **General**. 1. Use **Additional Header Unit Dependencies** to resolve collisions by specifying which module or header unit should be used for this project: @@ -209,12 +220,6 @@ To access these settings: > [!NOTE] > To use header units built as a part of a **DLL** project, the project property setting **All Modules arePublic** should be set to **Yes**. -### `header-units.json` - -Not all STL libraries, or header files for that matter, can be compiled into a header unit and imported. There's an allowlist for the STL headers that the build system consults when `/translateInclude` is specified to determine which STL headers can be compiled into header units. It's consulted when the build system attempts to create a header unit for an STL header file, and when dependencies are resolved for an STL header file. If the STL header file isn't on the list, it's treated as a normal `#include` instead of importing it as a header unit. - -The [header-units.json](header-unit-json-reference.md) file is at the root of the include directory where your STL header files are installed. For example, `C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.00001\include`. It lists which STL libraries can be compiled into header units. Some can't. For example, `` shouldn't be compiled as a header unit because it depends on a `#define` to modify its behavior, and using `#define` can't be used to change the behavior of a header unit. - ## See also [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) \ No newline at end of file From 59da16886b1b9af62d7c4d94221fe19ceff0308a Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 7 Apr 2021 18:26:50 -0700 Subject: [PATCH 43/82] tech review --- docs/build/reference/module-exportheader.md | 2 +- docs/build/walkthrough-import-stl-header-units.md | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/build/reference/module-exportheader.md b/docs/build/reference/module-exportheader.md index d0f258f008f..a291b6609d5 100644 --- a/docs/build/reference/module-exportheader.md +++ b/docs/build/reference/module-exportheader.md @@ -15,7 +15,7 @@ Tells the compiler to create the header units specified by the input arguments. > **`/exportHeader /headerName:angle`** *`header-name`* > **`/exportHeader /headerName:quote`** *`header-name`* -> **`/exportHeader`** *`header-name-including-path`* Note: this form is deprecated +> **`/exportHeader`** *`full or relative path to header file`* Note: this form is deprecated ### Arguments diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 22f1c2d2af1..2846d561905 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -189,12 +189,12 @@ Header units built as part of a static library project are automatically availab The following settings control the visibility of header units to the build system: - **Public Include Directories**: specify project directories for header units that should be automatically added to the include path in referencing projects. -- **Public C++ Module directories**: specify which project directories contain header units that should be available to referencing projects. This is a way of making some header units public, by putting those that should be public in a directory that will be made visible to other projects. If you set this, you may also want to specify **Public Include Directories** so your public headers are automatically added to the include path in referencing projects. +- **Public C++ Module directories**: specify which project directories contain header units that should be available to referencing projects. This is a way of making some header units public, by putting those that can be shared in a directory that is visible to other projects. If you set this, you may also want to specify **Public Include Directories** so your public headers are automatically added to the include path in referencing projects. - **All Modules are Public** - To use header units built as a part of a DLL project, the symbols have to be exported from the DLL. To do so, set this property to **Yes**. -## Reuse header units between solutions +## Reuse header units between Visual Studio solutions -If you want to use a header unit built in a different solution, you can specify where the built *`.ifc`* files are so that you can import them. +If you want to use a header unit built in a different Visual Studio solution, you can specify where the built *`.ifc`* files are so that you can import them. To access this setting: 1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. @@ -202,6 +202,8 @@ To access this setting: 1. Add the modules to reference in the **Additional Module Dependencies** dropdown. ![Project properties under C/C++, General, which Additional Module Dependencies selected](media/vs2019-additional-module-dependencies.png) +Here's an example of the format to use for **Additional Module Dependencies**: `ModuleName1=Path\To\ModuleName1.ifc; ModuleName2=Path\To\ModuleName2.ifc` + ## Handling multiple copies of a header unit If you reference two or more projects that built two or more header units with the same name, or that built two or more header units for the same header file, you'll end up in a situation where there are multiple header units to choose from for the same import. You might have different versions of the header unit that were built with different compiler settings, for instance, and need to tell the compiler which one to use. @@ -214,6 +216,8 @@ To access this setting: 1. Use **Additional Header Unit Dependencies** to resolve collisions by specifying which module or header unit should be used for this project: ![Additional Header Unit Dependencies setting in the project properties dialog](media/additional-header-unit-dependencies-setting.png) +Here's an example of the format to use for **Additional Header Unit Dependencies**: `Path\To\Header1.h= Path\To\HeaderUnit1.ifc;Path\To\Header2.h= Path\To\ HeaderUnit2.ifc` + > [!IMPORTANT] > Ensure that projects that share header units are built with compatible compilation options. The compiler will issue warnings if it detects different compilation options used for how the header unit was produced versus how it's used. From 6b4afe7b49acd4e22a4c67a65818778823f48c81 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 7 Apr 2021 20:38:48 -0700 Subject: [PATCH 44/82] incorp review --- docs/build/cmake-presets-json-reference.md | 38 ++--- docs/build/cmake-presets-vs.md | 178 +++++++++++---------- 2 files changed, 113 insertions(+), 103 deletions(-) diff --git a/docs/build/cmake-presets-json-reference.md b/docs/build/cmake-presets-json-reference.md index 8b7fb122203..b1182f5b6f0 100644 --- a/docs/build/cmake-presets-json-reference.md +++ b/docs/build/cmake-presets-json-reference.md @@ -1,29 +1,29 @@ --- description: "Schema reference for `CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps" -title: "`CMakeUserPresets.json` " +title: "CMakeUserPresets.json" ms.date: "4/13/2021" helpviewer_keywords: ["CMake in Visual C++"] --- # `CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps -`CMake` supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. +CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. -`CMakePresets.json` and `CMakeUserPresets.json` can be used to drive `CMake` in Visual Studio, in Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. +`CMakePresets.json` and `CMakeUserPresets.json` can be used to drive CMake in Visual Studio, in Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. The schema for both files is identical. -CMakePresets.json` and `CMakeUserPresets.json` support vendor maps to store vendor-specific information. Microsoft maintains two vendor maps with options specific to Visual Studio and Visual Studio Code. Here we document two Microsoft vendor maps and vendor macros. To see documentation on the rest of the schema including Configure Presets, Build Presets, and Test Presets, see the official [`CMake` documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). +CMakePresets.json` and `CMakeUserPresets.json` support vendor maps to store vendor-specific information. Microsoft maintains two vendor maps with options specific to Visual Studio and Visual Studio Code. Here we document two Microsoft vendor maps and vendor macros. For documentation about the rest of the schema, including Configure Presets, Build Presets, and Test Presets, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). -For more information about how to use `CMakePresets.json` in Visual Studio, see [Configure and build with `CMake` presets in Visual Studio](cmake-presets-vs.md)\ -For more information about how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with `CMake` Presets in VS Code](https://github.com/microsoft/vscode-cmake-tools/blob/develop/docs/cmake-presets.md) +For more information about how to use `CMakePresets.json` in Visual Studio, see [Configure and build with CMake Presets in Visual Studio](cmake-presets-vs.md)\ +For more information about how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with CMake Presets in VS Code](https://github.com/microsoft/vscode-cmake-tools/blob/develop/docs/cmake-presets.md) ## Visual Studio Settings vendor map -One vendor map with the vendor URI `microsoft.com/VisualStudioSettings/CMake/` is allowed per Configure Preset and contains options specific to `CMake` integration in Visual Studio and Visual Studio Code. All options in the vendor map apply to Visual Studio. Options that apply to both Visual Studio and Visual Studio Code have been explicitly marked. +One vendor map with the vendor URI `microsoft.com/VisualStudioSettings/CMake/` is allowed per Configure Preset and contains options specific to CMake integration in Visual Studio and Visual Studio Code. All options in the vendor map apply to Visual Studio. Options that apply to both Visual Studio and Visual Studio Code have been explicitly marked. All settings in the Visual Studio Settings vendor map are optional and inherited from Configure Presets specified by the `inherits` key. Only options that have been modified are written to the file. The Visual Studio Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. -None of the options in the Visual Studio Settings vendor map impact the construction of the `CMake` or `CTest` command line. This ensures that the same `CMakePresets.json` file can be used to drive `CMake` with Visual Studio, Visual Studio Code, and from the command line. The exceptions to this are the `cacheRoot` and `cmakeGenerateCommand` options. These options are specific to the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio and cannot be reproduced from the command line. +None of the options in the Visual Studio Settings vendor map impact the construction of the CMake or CTest command line. This ensures that the same `CMakePresets.json` file can be used to drive CMake with Visual Studio, Visual Studio Code, and from the command line. The exceptions to this are the `cacheRoot` and `cmakeGenerateCommand` options. These options are specific to the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio and cannot be reproduced from the command line. | Setting | Description | |--|--| @@ -36,27 +36,27 @@ None of the options in the Visual Studio Settings vendor map impact the construc | `codeAnalysisExternalRuleset` | Specifies the ruleset to use when running Microsoft code analysis on external header in Visual Studio. This can be a path to a ruleset file, or the name of a ruleset file installed with Visual Studio. This option supports macro expansion. | | `enableClangTidyCodeAnalysis` | A bool that enables clang-tidy code analysis in Visual Studio when building with `clang-cl`. Defaults to `false`. | | `clangTidyChecks` | A comma-separated list of warnings passed to clang-tidy when running clang-tidy code analysis in Visual Studio. Wildcards are allowed, and the `–` prefix will remove checks. | -| `cacheRoot` | Specifies the path to a `CMake` cache. This directory should contain an existing `CMakeCache.txt` file. This key is only supported by the Open Existing Cache scenario in Visual Studio. This option supports macro expansion. | -| `cmakeGenerateCommand` | A command-line tool (specified as a command-line program + arguments, for example, “gencache.bat debug”) to generate the `CMake` cache. This command will run from the shell in the preset’s specified environment when `CMake` configure is invoked. This key is only supported by the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio. This option supports macro expansion | +| `cacheRoot` | Specifies the path to a CMake cache. This directory should contain an existing `CMakeCache.txt` file. This key is only supported by the Open Existing Cache scenario in Visual Studio. This option supports macro expansion. | +| `cmakeGenerateCommand` | A command-line tool (specified as a command-line program + arguments, for example, “gencache.bat debug”) to generate the CMake cache. This command will run from the shell in the preset’s specified environment when CMake configure is invoked. This key is only supported by the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio. This option supports macro expansion | ## Visual Studio Remote Settings vendor map -One vendor map with the vendor URI` microsoft.com/VisualStudioRemoteSettings/CMake/` is allowed per Configure Preset and contains options specific to remote development in Visual Studio. Remote development means you're invoking `CMake` on a remote SSH connection or WSL. None of the options in the Visual Studio Remote Settings vendor map apply to Visual Studio Code. +One vendor map with the vendor URI` microsoft.com/VisualStudioRemoteSettings/CMake/` is allowed per Configure Preset and contains options specific to remote development in Visual Studio. Remote development means you're invoking CMake on a remote SSH connection or WSL. None of the options in the Visual Studio Remote Settings vendor map apply to Visual Studio Code. All settings in the Visual Studio Remote Settings vendor map are optional and inherited from Configure Presets specified by the `inherits` key. Only options that have been modified are written to the file. The Visual Studio Remote Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. -None of the options in the Visual Studio Settings vendor map impact the construction of the `CMake` or `CTest` command line. This ensures that the same `CMakePresets.json` file can be used to drive `CMake` with Visual Studio, Visual Studio Code, and from the command line. +None of the options in the Visual Studio Settings vendor map impact the construction of the CMake or CTest command line. This ensures that the same `CMakePresets.json` file can be used to drive CMake with Visual Studio, Visual Studio Code, and from the command line. Many of the options in the Visual Studio Remote Settings vendor map are ignored when targeting WSL1. This is because the WSL1 toolset executes all commands locally and relies on Windows drives mounted under the /mnt folder to access local source files from WSL1. No source file copy is required. Options that are ignored when targeting WSL1 have been explicitly marked. | Setting | Description | |--|--| |`sourceDir` | Path to the directory on the remote system where the project will be copied. Defaults to `$env{HOME}/.vs/$ms{projectDirName}`. This option supports macro expansion.

    In remote copy scenarios, the macro` ${sourceDir}` evaluates to the project source directory on the remote system and not the project source directory on the Windows machine. Remote copy scenarios include targeting a remote SSH connection. In these cases, the project source directory on the remote system will be determined by the value of sourceDir in the Visual Studio Remote Settings vendor map. This option is ignored when targeting WSL1. | -|copySources | If `true`, Visual Studio will copy sources from Windows to the remote system. Set to false if you manage file synchronization yourself. Defaults to true. This option is ignored when targeting WSL1. | -|copySourcesOptions | An object of options related to the source copy from Windows to the remote system. This object is ignored when targeting WSL1.

    `copySourcesOptions.exclusionList`: A list of paths to be excluded when copying source files to the remote system. A path can be the name of a file or directory, or a path relative to the root of the copy. Defaults to `[ “.vs”, “.git”, “out” ]`. This option supports macro expansion.

    `copySourcesOptions.method`: The method used to copy source files to the remote system. Accepted values are `rsync` and `sftp`. Defaults to `rsync`.

    `copySourcesOptions.concurrentCopies`: The number of concurrent copies used during the synchronization of sources to the remote system. Defaults to 5.

    `copySourcesOptions.outputVerbosity`: The verbosity level of source copy operations to the remote system. Accepted levels are `Normal`, `Verbose`, and `Diagnostic`. Defaults to `Normal`.| +|`copySources` | If `true`, Visual Studio will copy sources from Windows to the remote system. Set to `false` if you manage file synchronization yourself. Defaults to true. This option is ignored when targeting WSL1. | +|`copySourcesOptions` | An object of options related to the source copy from Windows to the remote system. This object is ignored when targeting WSL1.

    `copySourcesOptions.exclusionList`: A list of paths to be excluded when copying source files to the remote system. A path can be the name of a file or directory, or a path relative to the root of the copy. Defaults to `[ “.vs”, “.git”, “out” ]`. This option supports macro expansion.

    `copySourcesOptions.method`: The method used to copy source files to the remote system. Accepted values are `rsync` and `sftp`. Defaults to `rsync`.

    `copySourcesOptions.concurrentCopies`: The number of concurrent copies used during the synchronization of sources to the remote system. Defaults to 5.

    `copySourcesOptions.outputVerbosity`: The verbosity level of source copy operations to the remote system. Accepted levels are `Normal`, `Verbose`, and `Diagnostic`. Defaults to `Normal`.| |`rsyncCommandArgs` | A list of additional command-line arguments passed to `rsync`. Defaults to `[ “-t”, “--delete", “--delete-excluded” ]`. This option supports macro expansion and is ignored when targeting WSL1. | |`copyBuildOutput` | Specifies whether to copy build output from the remote system back to Windows. Defaults to `false`. This option is ignored when targeting WSL1. | -|copyOptimizations | An object of options related to source copy optimizations. These options are ignored when targeting WSL1.

    `copyOptimizations.maxSmallChange`: The maximum number of files to copy using sftp instead of rsync. Defaults to 10.

    `copyOptimizations.useOptimizations`: Specifies the copy optimizations in use. Accepted values are no copy optimizations (`None`), rsync only optimizations (`RsyncOnly`), or rsync and sftp optimizations (`RsyncAndSftp`). Defaults to `RsyncAndSftp`.

    `copyOptimizations.rsyncSingleDirectoryCommandArgs`: A list of additional command-line arguments passed to rsync when copying the contents of a single directory to the remote system. Defaults to `[ “-t”, “-d” ]`. This option supports macro expansion. | +|`copyOptimizations` | An object of options related to source copy optimizations. These options are ignored when targeting WSL1.

    `copyOptimizations.maxSmallChange`: The maximum number of files to copy using sftp instead of rsync. Defaults to 10.

    `copyOptimizations.useOptimizations`: Specifies the copy optimizations in use. Accepted values are no copy optimizations (`None`), rsync only optimizations (`RsyncOnly`), or rsync and sftp optimizations (`RsyncAndSftp`). Defaults to `RsyncAndSftp`.

    `copyOptimizations.rsyncSingleDirectoryCommandArgs`: A list of additional command-line arguments passed to rsync when copying the contents of a single directory to the remote system. Defaults to `[ “-t”, “-d” ]`. This option supports macro expansion. | |`copyAdditionalIncludeDirectoriesList` | A list of paths to remote header directories to be copied locally for IntelliSense. This option supports macro expansion. | |`copyExcludeDirectoriesList` | A list of paths to remote header directories to not be copied locally for IntelliSense. This option supports macro expansion. | |`forceWSL1Toolset` | If `true`, Visual Studio will always use the WSL1 toolset when targeting WSL from Visual Studio. The WSL1 toolset executes all commands locally and relies on Windows drives mounted under the /mnt folder to access local source files from WSL. These options may be slower with WSL2. Defaults to `false`.

    The WSL1 toolset will always be used in Visual Studio 2019 version 16.10. This option will be relevant once native support for WSL2 is available. | @@ -67,7 +67,7 @@ Options for a `remotePrebuildEvent` and `remotePostbuildEvent` have been depreca Encode pre-build, pre-link, and post-build events in your CMakeLists.txt using [add_custom_command](https://cmake.org/cmake/help/latest/command/add_custom_command.html#build-events). This will ensure the same behavior when building with Visual Studio and from the command line. -If you need behavior that is specific to Visual Studio, you can add a custom remote task in` tasks.vs.json`. To get started, right-click on your root `CMakeLists.txt` in the **Solution Explorer** from**Folder View** and select **Configure Tasks**. You can then [add a new remote task](https://docs.microsoft.com/cpp/build/tasks-vs-json-schema-reference-cpp#remote-properties) to your `tasks.vs.json` file. +If you need behavior that is specific to Visual Studio, you can add a custom remote task in` tasks.vs.json`. To get started, right-click on your root `CMakeLists.txt` in the **Solution Explorer** from **Folder View** and select **Configure Tasks**. You can then [add a new remote task](https://docs.microsoft.com/cpp/build/tasks-vs-json-schema-reference-cpp#remote-properties) to your `tasks.vs.json` file. The following remote task creates a directory called test on the remote Linux system: @@ -87,9 +87,9 @@ The value of `remoteMachineName` must match the Host Name of a connection in the ## Microsoft vendor macros -`CMakePresets.json` and `CMakeUserPresets.json` allow “vendor maps” for vendors (like Microsoft) to add VS/VS code-specific options. Our vendor maps support all the macros defined by `CMake`. See [cmake-presets Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. All macros and environment variables are expanded before being passed to `cmake.exe`. +The two Microsoft vendor maps, `Visual Studio Settings` and `Visual Studio Remote Settings`, support all the macros defined by CMake. Our vendor maps support all the macros defined by CMake. See [cmake-presets Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. All macros and environment variables are expanded before being passed to `cmake.exe`. -Visual Studio supports vendor macros with the prefix `ms`. Microsoft vendor macros can only be used in Microsoft vendor maps. `CMake` can't use presets that have vendor macros outside of a vendor map. +Visual Studio supports vendor macros with the prefix `ms`. Microsoft vendor macros can only be used in Microsoft vendor maps. CMake can't use presets that have vendor macros outside of a vendor map. |Macro |Description | |---------|---------| @@ -99,7 +99,7 @@ Visual Studio supports vendor macros with the prefix `ms`. Microsoft vendor macr |Macro |Description | |---------|---------| -| `$env{}`
    `$penv{}`| Reference environment variables using this syntax supported by `CMake`. | +| `$env{}`
    `$penv{}`| Reference environment variables using this syntax supported by CMake. | ## Deprecated macros diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index 1f2c1b7687e..13d4006863f 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -1,41 +1,42 @@ --- -title: Configure and build with `CMake` presets -description: "Reference for using `CMake` presets to configure and build `CMake` projects." +title: Configure and build with CMake Presets +description: "Reference for using CMake Presets to configure and build CMake projects." ms.topic: reference ms.date: "04/13/2020" --- -# Configure and build with `CMake` presets in Visual Studio +# Configure and build with CMake Presets in Visual Studio -`CMake` supports two files, and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. +CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. - Use `CMakePresets.json` and `CMakeUserPresets.json` to drive `CMake` in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. +Use `CMakePresets.json` and `CMakeUserPresets.json` to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. -This article contains information about `CMakePresets.json` integration in Visual Studio. -- For more information on the format of `CMakePresets.json`, see the official [`CMake` Tools documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1). +This article contains information about `CMakePresets.json` integration Visual Studio. https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools + +- For more information on the format of `CMakePresets.json`, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1). - For more information on the Microsoft vendor maps and macro expansion, see [`CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps](cmake-presets-json-reference.md). -- For more information on how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with `CMake` Preset](https://github.com/microsoft/vscode-cmake-tools/tree/develop/docs/cmake-presets.md). +- For more information on how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with CMake Presets](https://github.com/microsoft/vscode-cmake-tools/tree/develop/docs/cmake-presets.md). `CMakePresets.json` is a recommended alternative to `CMakeSettings.json`. Visual Studio will never read from both `CMakePresets.json` and `CMakeSettings.json` at the same time. See [Enable `CMakePresets.json` in Visual Studio 2019](#enable-cmakepresetsjson-integration-in-visual-studio-2019) to enable or disable `CMakePresets.json` integration in Visual Studio. -## Supported `CMake` and `CMakePresets.json` versions +## Supported CMake and `CMakePresets.json` versions -The `CMake` Tools extension supports `CMakePresets.json` and `CMakeUserPresets.json` files version 2 or higher. You can update your file version by incrementing the version field in the root object. For an example and more information, see [`CMakePresets.json` format](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#format). +Visual Studio supports `CMakePresets.json` and `CMakeUserPresets.json` files version 2 or higher. You can update your file version by incrementing the version field in the root object. For an example and more information, see [`CMakePresets.json` format](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#format). -`CMake` version 3.20 or higher is required when invoking `CMake` with `CMakePresets.json` (version 2 or higher) from the command line. However, Visual Studio reads and evaluates `CMakePresets.json` and `CMakeUserPresets.json` itself and doesn't invoke `CMake` directly with the `--preset` option. This means `CMake` version 3.20 or higher isn't strictly required when building with `CMakePresets.json` inside Visual Studio. Use at least `CMake` version 3.14 or higher. +CMake version 3.20 or higher is required when invoking CMake with `CMakePresets.json` (version 2 or higher) from the command line. However, Visual Studio reads and evaluates `CMakePresets.json` and `CMakeUserPresets.json` itself and doesn't invoke CMake directly with the `--preset` option. This means CMake version 3.20 or higher isn't strictly required when building with `CMakePresets.json` inside Visual Studio. We recommend using at least CMake version 3.14 or higher. ## Enable `CMakePresets.json` integration in Visual Studio 2019 -`CMakePresets.json` integration isn't enabled by default in Visual Studio 2019. You can enable `CMakePresets.json` integration for all `CMake` projects in Tools > Options > `CMake` > General: +`CMakePresets.json` integration isn't enabled by default in Visual Studio 2019. You can enable `CMakePresets.json` integration for all CMake projects in **Tools** > **Options** > **CMake** > **General**: -![Enable `CMakePresets.json` in `CMake` options > General](./media/enable-cmakepresets.PNG) +![Enable `CMakePresets.json` in CMake options > General](./media/enable-cmakepresets.PNG) > [!Important] > Close and reopen the folder in Visual Studio to activate the integration. -If you don't want to enable `CMakePresets.json` integration for all `CMake` projects, then you can enable `CMakePresets.json` integration for a single `CMake` project by adding a `CMakePresets.json` file to the root of the open folder. You must close and reopen the folder in Visual Studio to activate the integration. +If you don't want to enable `CMakePresets.json` integration for all CMake projects, then you can enable `CMakePresets.json` integration for a single CMake project by adding a `CMakePresets.json` file to the root of the open folder. You must close and reopen the folder in Visual Studio to activate the integration. -The following table indicates when `CMakePresets.json` is used instead of `CMakeSettings.json` to drive `CMake` configuration and build. +The following table indicates when `CMakePresets.json` is used instead of `CMakeSettings.json` to drive CMake configuration and build. Key: **Tools** > **Options** enabled means **Use CMakePresets.json to drive CMake configure, build, and test** is selected in **Tools** > **Options** > **CMake** > **General**. @@ -45,14 +46,14 @@ If no configuration file is present, then default Configure Presets are used. |--|--|--| | No configuration file present | `CMakeSettings.json` | `CMakePresets.json` | | `CMakeSettings.json` present | `CMakeSettings.json` | `CMakePresets.json` | -| `CMakePresets.json` present | `CMakeSettings.json` | `CMakePresets.json` | -| Both configuration files present | `CMakeSettings.json` | `CMakePresets.json` | +| `CMakePresets.json` present | `CMakePresets.json` | `CMakePresets.json` | +| Both configuration files present | `CMakePresets.json` | `CMakePresets.json` | ## Auto configuration and cache notifications -By default, Visual Studio automatically invokes configure each time the active Target System or Configure Preset changes. You can modify this behavior by selecting **Never run configure step automatically** in **Tools** > **Options** > **CMake** > **General**. You can also disable all `CMake` cache notifications (gold bars) by deselecting **Show CMake cache notifications**. +By default, Visual Studio automatically invokes configure each time the active Target System or Configure Preset changes. You can modify this behavior by selecting **Never run configure step automatically** in **Tools** > **Options** > **CMake** > **General**. You can also disable all CMake cache notifications (gold bars) by deselecting **Show CMake cache notifications**. -## Default configure presets +## Default Configure Presets If no `CMakePresets.json` or `CMakeUserPresets.json` file exists, or if `CMakePresets.json` or `CMakeUserPresets.json` are invalid, then Visual Studio will fall back on the following default Configure Presets: @@ -77,7 +78,9 @@ If no `CMakePresets.json` or `CMakeUserPresets.json` file exists, or if `CMakePr } } }, +``` +```json { "name": "linux-default", "displayName": "Linux Debug", @@ -98,6 +101,7 @@ If no `CMakePresets.json` or `CMakeUserPresets.json` file exists, or if `CMakePr } } ``` + A `CMakePresets.json` file with the default Configure Presets is automatically created by Visual Studio at the root of your project if you attempt to open or modify a `CMakePresets.json` file that doesn't exist. ## Configure and build @@ -106,33 +110,33 @@ Visual Studio provides three dropdowns when `CMakePresets.json` integration is e ![Target system dropdown](./media/target-system-dropdown.PNG) -## Select a target system +### Select a target system -The dropdown on the left indicates the active **Target System**. This is the system on which `CMake` will be invoked to configure and build the project. This dropdown lists your local machine, all SSH connections in the **Connection Manager** by host name, and all Windows Subsystem for Linux (WSL) installations that Visual Studio can find: +The dropdown on the left indicates the active **Target System**. This is the system on which CMake will be invoked to configure and build the project. This dropdown lists your local machine, all SSH connections in the **Connection Manager** by host name, and all Windows Subsystem for Linux (WSL) installations that Visual Studio can find: ![Target system dropdown selection examples for local machine, a SSH connection, and WSL ubuntu and WSL debian](./media/target-system-selections.PNG) In the example above, **192.168.0.5** is a remote Linux system that was added to the **Connection Manager**. **ubuntu2004** and **debian** are WSL installations. Select **Manage Connections…** to open the **Connection Manager**. -## Select a Configure Preset +### Select a Configure Preset -The dropdown in the middle indicates the active **Configure Preset**. This is the `configurePreset` that will be used when `CMake` is invoked to generate the project build system. This dropdown lists the union of non-hidden Configure Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. +The dropdown in the middle indicates the active **Configure Preset**. This is the `configurePreset` that will be used when CMake is invoked to generate the project build system. This dropdown lists the union of non-hidden Configure Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. Visual Studio will use the value of `hostOS` in the Microsoft Visual Studio Settings vendor map to hide Configure Presets that don't apply to the active Target System. See the entry for `hostOS` in the table under [Visual Studio Settings vendor map](cmake-presets-json-reference.md#visual-studio-settings-vendor-map) for more information. Select **Manage Configurations…** to open the `CMakePresets.json` file located at the root of the project. `CMakePresets.json` is created if it doesn't already exist. -## Select a Build Preset +### Select a Build Preset -The dropdown on the right indicates the active **Build Preset**. This is the `buildPreset` that will be used when `CMake` is invoked to build the project. This dropdown lists the union of non-hidden Build Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. +The dropdown on the right indicates the active **Build Preset**. This is the `buildPreset` that will be used when CMake is invoked to build the project. This dropdown lists the union of non-hidden Build Presets defined in `CMakePresets.json` and `CMakeUserPresets.json`. All Build Presets are required to specify an associated `configurePreset`. Visual Studio hides Build Presets that don't apply to the active Configure Preset. For more information, see [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset). If there are no Build Presets associated with the active Configure Preset, then Visual Studio will list the Default Build Preset. The Default Build Preset is equivalent to passing `cmake --build` with no other arguments from the command line. -## Configure +### Configure -Visual Studio automatically tries to configure the project when it detects that the `CMake` cache is out of date. To manually invoke configure, select **Project** > **Configure ** from the main menu. This is the same as running `cmake --preset ` from the command line, where `` is the name of the active Configure Preset. To disable automatic cache generation, see [Auto configuration and cache notifications](#auto-configuration-and-cache-notifications). +Visual Studio automatically tries to configure the project when it detects that the CMake cache is out of date. To manually invoke configure, select **Project** > **Configure ** from the main menu. This is the same as running `cmake --preset ` from the command line, where `` is the name of the active Configure Preset. To disable automatic cache generation, see [Auto configuration and cache notifications](#auto-configuration-and-cache-notifications). -## Build +### Build To build the entire project, select **Build** > **Build All** from the main menu. This is the same as running `cmake --build --preset ` from the command line, where `` is the name of the active `Build Preset`. @@ -141,11 +145,11 @@ To build a single target, switch to **CMake Targets View** in the **Solution Exp > [!NOTE] > Visual Studio 2019 doesn't support the `buildPresets.targets` option to build a subset of targets specified in `CMakePresets.json`. -## Run `CTest` +## Run CTest There are two menu options supported by `CMakePresets.json` in Visual Studio 2019. -- **Test** > **Run CTests** for invokes `CTest` and runs all tests associated with the active Configure Preset and Build Preset, with no additional arguments passed to `CTest`. +- **Test** > **Run CTests** for invokes CTest and runs all tests associated with the active Configure Preset and Build Preset, with no additional arguments passed to CTest. - **Test** > **Run Test Preset** for will expand to show all Test Presets associated with the active Configure Preset. Selecting a single Test Preset is the same as running `ctest --preset ` from the command line, where `` is the name of the selected Test Preset. This option will be grayed out if no Test Presets are defined for the active Configure Preset. In Visual Studio 2019 the Test Explorer isn't integrated with `CMakePresets.json`. @@ -156,7 +160,7 @@ In Visual Studio 2019, all commands and preset templates modify `CMakePresets.js Use forward slashes (`/`) for paths in `CMakePresets.json` and `CMakeUserPresets.json`. -## Add new Configure Presets +### Add new Configure Presets To add a new Configure Preset to `CMakePresets.json`, from **Solution Explorer** right-click `CMakePresets.json` from **Folder View** and select **Add Configure Preset…** from the context menu. The dialog to select a Configure Preset template opens: @@ -166,33 +170,37 @@ Choose the **Windows x64 Debug** template to configure on Windows systems. Choos The selected template will be added to `CMakePresets.json` if it exists. Otherwise, the template will be copied into a new `CMakePresets.json`. -## Add new Build Presets and Test Presets +### Add new Build Presets and Test Presets Visual Studio 2019 doesn't offer templates for new Build Presets and Test Presets. Build Presets and Test Presets can be added by directly editing `CMakePresets.json`. See [Build Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#build-preset), [Test Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#test-preset), or [Example `CMakePresets.json` file](#example-cmakepresetsjson-file) for more information. ## Edit presets -The official [`CMake` documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1) is the best resource for editing Configure Presets, Build Presets, and Test Presets. The following information is a subset of the `CMake` documentation that is especially relevant to Visual Studio developers. +The official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1) is the best resource for editing Configure Presets, Build Presets, and Test Presets. The following information is a subset of the CMake documentation that is especially relevant to Visual Studio developers. -**Select your compilers** -C and C++ compilers can be set with `cacheVariables.CMAKE_C_COMPILER` and `cacheVariables.CMAKE_CXX_COMPILER` in a Configure Preset. This is equivalent to passing `-D CMAKE_C_COMPILER= and -D CMAKE_CXX_COMPILER=` to `CMake` from the command line. For more information, see [CMAKE__COMPILER](https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html#cmake-lang-compiler). +### Select your compilers + +C and C++ compilers can be set with `cacheVariables.CMAKE_C_COMPILER` and `cacheVariables.CMAKE_CXX_COMPILER` in a Configure Preset. This is equivalent to passing `-D CMAKE_C_COMPILER= and -D CMAKE_CXX_COMPILER=` to CMake from the command line. For more information, see [CMAKE__COMPILER](https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html#cmake-lang-compiler). Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual Studio. The C++ Clang tools for Windows component must be installed to build with `clang-cl`. ```json "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug", - "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", - "CMAKE_C_COMPILER": "cl", - "CMAKE_CXX_COMPILER": "cl" + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", + "CMAKE_C_COMPILER": "cl", + "CMAKE_CXX_COMPILER": "cl" }, +``` +```json "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", "CMAKE_C_COMPILER": "clang-cl", "CMAKE_CXX_COMPILER": "clang-cl" }, + "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { "intelliSenseMode": "windows-clang-x64" @@ -203,43 +211,45 @@ Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual > [!IMPORTANT] > In Visual Studio 2019 you must explicitly specify a Clang IntelliSense mode when building with `clang` or `clang-cl`. -See [Run `CMake` from the command line or a continuous integration (CI) pipeline](#run-cmake-from-the-command-line-or-a-continuous-integration-ci-pipeline) to reproduce these builds outside of Visual Studio. +See [Run CMake from the command line or a continuous integration (CI) pipeline](#run-cmake-from-the-command-line-or-a-continuous-integration-ci-pipeline) to reproduce these builds outside of Visual Studio. To build on Linux or without the Visual C++ toolset, specify the name of a compiler on your `PATH`, or an environment variable that evaluates to the full path of a compiler. Full paths are discouraged so that the file can remain shareable. A preset that builds with GCC version 8 might look like this: ```json "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug", - "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", - "CMAKE_C_COMPILER": "gcc-8", - "CMAKE_CXX_COMPILER": "g++-8" + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", + "CMAKE_C_COMPILER": "gcc-8", + "CMAKE_CXX_COMPILER": "g++-8" }, ``` -You can also set compilers with a `CMake` toolchain file. Toolchain files can be set with `cacheVariables.CMAKE_TOOLCHAIN_FILE`, which is equivalent to passing` -D CMAKE_TOOLCHAIN_FILE=` to `CMake` from the command line. A `CMake` toolchain file is most often used for cross-compilation. See [`CMake` toolchains](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html) for more information on authoring `CMake` toolchain files. +You can also set compilers with a CMake toolchain file. Toolchain files can be set with `cacheVariables.CMAKE_TOOLCHAIN_FILE`, which is equivalent to passing` -D CMAKE_TOOLCHAIN_FILE=` to CMake from the command line. A CMake toolchain file is most often used for cross-compilation. See [CMake toolchains](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html) for more information on authoring CMake toolchain files. + +### Select your generator -## Select your generator +The Windows and Linux Configure Preset templates both specify Ninja as the default generator. Other common generators are the [Visual Studio Generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html?highlight=visual%20studio%20generators#visual-studio-generators) on Windows and Unix Makefiles on Linux and macOS. You can specify a new generator with the `generator` option in a Configure Preset. This is equivalent to passing `-G` to CMake from the command line. -The Windows and Linux Configure Preset templates both specify Ninja as the default generator. Other common generators are the [Visual Studio Generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html?highlight=visual%20studio%20generators#visual-studio-generators) on Windows and Unix Makefiles on Linux and macOS. You can specify a new generator with the generator option in a Configure Preset. This is equivalent to passing `-G` to `CMake` from the command line. See `CMake` generators for more information. Make sure to set architecture.strategy and toolset.strategy to set when building with a Visual Studio Generator. See [`CMake` generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#:~:text=A%20CMake%20Generator%20is%20responsible%20for%20writing%20the,what%20native%20build%20system%20is%20to%20be%20used) for more information. +Set `architecture.strategy` and `toolset.strategy` to `set` when building with a Visual Studio Generator. See [CMake generators](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#:~:text=A%20CMake%20Generator%20is%20responsible%20for%20writing%20the,what%20native%20build%20system%20is%20to%20be%20used) for more information. -Make sure to set `architecture.strategy` and `toolset.strategy` to `set` when building with a Visual Studio Generator. +Set `architecture.strategy` and `toolset.strategy` to `set` when building with a Visual Studio Generator. -## Select your configuration type +### Select your configuration type -The configuration type (**Debug/Release**) for single configuration generators can be set with `cacheVariables.CMAKE_BUILD_TYPE`. This is equivalent to passing `-D CMAKE_BUILD_TYPE=` to `CMake` from the command line. See[ CMAKE_BUILD_TYPE](https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html) for more information. +The configuration type (**Debug/Release**) for single configuration generators can be set with `cacheVariables.CMAKE_BUILD_TYPE`. This is equivalent to passing `-D CMAKE_BUILD_TYPE=` to CMake from the command line. See[ CMAKE_BUILD_TYPE](https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html) for more information. -Select your target and host architecture when building with the Visual C++ toolset. +### Select your target and host architecture when building with the Visual C++ toolset. -The target architecture (x64, Win32, ARM64, or ARM) can be set with `architecture.value`. This is equivalent to passing` -A` to `CMake` from the command line. See [Platform Selection](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2016%202019.html#platform-selection) for more information. +The target architecture (x64, Win32, ARM64, or ARM) can be set with `architecture.value`. This is equivalent to passing` -A` to CMake from the command line. See [Platform Selection](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2016%202019.html#platform-selection) for more information. > [!NOTE] > Currently Visual Studio Generators expect the Win32 syntax and command-line generators (like Ninja) expect the x86 syntax when building for x86. -The host architecture (x64 or x86) and toolset can be set with `toolset.value`. This is equivalent to passing `-T` to `CMake` from the command line. See [Toolset Selection](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2016%202019.html#toolset-selection) for more information. +The host architecture (x64 or x86) and toolset can be set with `toolset.value`. This is equivalent to passing `-T` to CMake from the command line. See [Toolset Selection](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2016%202019.html#toolset-selection) for more information. -`architecture.strategy` and `toolset.strategy` tell `CMake` how to handle the architecture and toolset fields. set means `CMake` will set the respective value, and external means `CMake` won't set the respective value. +`architecture.strategy` and `toolset.strategy` tell CMake how to handle the architecture and toolset fields. `set` means CMake will set the respective value, and `external` means CMake won't set the respective value. - `set` should be used with IDE generators like the Visual Studio Generator. `external` should be used with command-line generators like Ninja. This allows vendors like Visual Studio to source the required environment before `CMake` is invoked. See [Configure Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#configure-preset) for more information on the architecture and toolset fields. + `set` should be used with IDE generators like the Visual Studio Generator. `external` should be used with command-line generators like Ninja. This allows vendors like Visual Studio to source the required environment before CMake is invoked. See [Configure Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#configure-preset) for more information on the architecture and toolset fields. For a full list of IDE generators that support the architecture field, see [CMAKE_GENERATOR_PLATFORM](https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_PLATFORM.html). For a full list of IDE generators that support the toolset field, see [CMAKE_GENERATOR_TOOLSET](https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_TOOLSET.html). @@ -259,13 +269,13 @@ Use the examples below to target ARM64 with the Ninja generator, or Win32 (x86) }, ``` -## Set and reference environment variables +### Set and reference environment variables You can set environment variables using the environment map. Environment variables are inherited through the `inherits` field, but you can override them as desired. A preset’s environment will be the union of its own environment and the environment from all its parents. If multiple `inherits` presets provide conflicting values for the same variable, the earlier preset in the `inherits` list will be preferred. You can unset a variable inherited from another preset by setting it to `null`. Environment variables set in a Configure Preset also automatically flow through to associated Build Presets and Test Presets unless `inheritConfigureEnvironment` is set to `false`. See [Configure Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#configure-preset) for more information. -You can reference environment variables using the `$env{}` and `$penv{}` syntax. See [Macro Expansion](https://cmake.org/cmake/help/latest/manual/`cmake`-presets.7.html#macro-expansion) for more information. +You can reference environment variables using the `$env{}` and `$penv{}` syntax. See [Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. -## Configure IntelliSense for a cross-compiler +### Configure IntelliSense for a cross-compiler By default, Visual Studio will use the IntelliSense mode that matches your specified toolset and target architecture. If you're cross-compiling, then you may need to manually specify the correct IntelliSense mode with the `intelliSenseMode` option in the Visual Studio Settings vendor map. See the entry for `intelliSenseMode` in the table under [Visual Studio Settings vendor map](cmake-presets-json-reference.md#visual-studio-settings-vendor-map) for more information. @@ -273,22 +283,22 @@ By default, Visual Studio will use the IntelliSense mode that matches your speci With `CMakePresets.json` support in Visual Studio you can easily configure and build your project on Windows, WSL, and remote systems. The steps to [Configure and build](#configure-and-build) your project on Windows, a remote system, or WSL are the same. However, there are a few behaviors that are specific to remote development. -## `${sourceDir}` behavior in remote copy scenarios +### `${sourceDir}` behavior in remote copy scenarios In local scenarios (including WSL1), `${sourceDir}` evaluates to the path to the project source directory that is open in Visual Studio. In remote copy scenarios, `${sourceDir}` evaluates to the path to the project source directory on the target system and not the project source directory on the local machine. The project source directory on the target system is determined by the value of `sourceDir` in the Visual Studio Remote Settings vendor map (defaults to `$env{HOME}/.vs/$ms{projectDirName}`). See the entry for `sourceDir` in the table under [Visual Studio Settings vendor map](cmake-presets-json-reference.md#visual-studio-settings-vendor-map) for more information. -## Local folder for remote output +### Local folder for remote output -Remote copy scenarios require a local directory to copy some remote files like `CMake` File-API response files or build files if `copyBuildOutput` in the Visual Studio Remote Settings vendor map is set to `true`. These files are automatically copied to `/out//build/${presetName}`. +Remote copy scenarios require a local directory to copy some remote files like CMake File-API response files or build files if `copyBuildOutput` in the Visual Studio Remote Settings vendor map is set to `true`. These files are automatically copied to `/out//build/${presetName}`. -## Invoke the same Configure Preset on Windows and WSL1 +### Invoke the same Configure Preset on Windows and WSL1 -You'll see an error if you try to use the same Configure Preset on Windows and WSL1. Windows and WSL1 both use the Windows file system, so `CMake` will try to use the same output directory (`binaryDir`) for both the Windows and WSL1 build tree. If you want to use the same Configure Preset with both Windows and the WSL1 toolset, create a second Configure Preset that inherits from the original preset and specifies a new `binaryDir`. In the following example, windows-preset can be used on Windows and base-preset can be used on WSL1: +You'll see an error if you try to use the same Configure Preset on Windows and WSL1. Windows and WSL1 both use the Windows file system, so CMake will try to use the same output directory (`binaryDir`) for both the Windows and WSL1 build tree. If you want to use the same Configure Preset with both Windows and the WSL1 toolset, create a second Configure Preset that inherits from the original preset and specifies a new `binaryDir`. In the following example, `windows-preset` can be used on Windows and base-preset can be used on WSL1: ```json { "name": "windows-preset", - "inherits": "base-preset" + "inherits": "base-preset", "binaryDir": "${sourceDir}/out/build/${presetName}", "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { @@ -303,9 +313,9 @@ You'll see an error if you try to use the same Configure Preset on Windows and W ## Vcpkg integration -Vcpkg helps you manage C and C++ libraries on Windows, Linux, and macOS. A vcpkg toolchain file (`vcpkg.cmake`) must be passed to `CMake` to enable vcpkg integration. See the [vcpkg documentation](https://github.com/microsoft/vcpkg#vcpkg-overview) for more information. +Vcpkg helps you manage C and C++ libraries on Windows, Linux, and macOS. A vcpkg toolchain file (`vcpkg.cmake`) must be passed to CMake to enable vcpkg integration. See the [vcpkg documentation](https://github.com/microsoft/vcpkg#vcpkg-overview) for more information. -Visual Studio no longer passes your vcpkg toolchain file to `CMake` automatically when `CMakePresets.json` integration is enabled. This eliminates Visual Studio specific behavior and ensures that your build can be reproduced from the command line. +Visual Studio no longer passes your vcpkg toolchain file to CMake automatically when `CMakePresets.json` integration is enabled. This eliminates Visual Studio specific behavior and ensures that your build can be reproduced from the command line. Instead, set the path to `vcpkg.cmake` with the `VCPKG_ROOT` environment variable in `CMakePresets.json`: @@ -320,13 +330,13 @@ Instead, set the path to `vcpkg.cmake` with the `VCPKG_ROOT` environment variabl `VCPKG_ROOT` should be set to the root of your vcpkg installation. See [vcpkg environment variables](https://github.com/microsoft/vcpkg/blob/master/docs/users/config-environment.md) for more information. -If you're already using a `CMake` toolchain file and want to enable vcpkg integration, then see [Using multiple toolchain files](https://github.com/microsoft/vcpkg/blob/master/docs/users/integration.md#using-multiple-toolchain-files) and follow those instructions to use an external toolchain file with a project using vcpkg. +If you're already using a CMake toolchain file and want to enable vcpkg integration, then see [Using multiple toolchain files](https://github.com/microsoft/vcpkg/blob/master/docs/users/integration.md#using-multiple-toolchain-files) and follow those instructions to use an external toolchain file with a project using vcpkg. ## Variable substitution in `launch.vs.json` and `tasks.vs.json` `CMakePresets.json` supports variable substitution in `launch.vs.json` and `tasks.vs.json`. -* Environment variables set in the active Configure Preset automatically flow through to `launch.vs.json` and `tasks.vs.json` configurations. You can unset individual environment variables in `launch.vs.json` and tasks.json by setting them to `null`. The following example sets the variable `DEBUG_LOGGING_LEVEL` to `null` in `launch.vs.json`: `"env": { "DEBUG_LOGGING_LEVEL": null }` +* Environment variables set in the active Configure Preset automatically flow through to `launch.vs.json` and `tasks.vs.json` configurations. You can unset individual environment variables in `launch.vs.json` and `tasks.vs.json` by setting them to `null`. The following example sets the variable `DEBUG_LOGGING_LEVEL` to `null` in `launch.vs.json`: `"env": { "DEBUG_LOGGING_LEVEL": null }` * Key-values set in the active Configure Preset are available for consumption in `launch.vs.json` and `tasks.vs.json` with the syntax `${cmake.}`. For example, use ` ${cmake.binaryDir}` to reference the output directory of the active Configure Preset. * Individual environment variables set in the environment map of the active Configure Preset are available for consumption in `launch.vs.json` and `tasks.vs.json` using the syntax `${env.}`. @@ -337,10 +347,10 @@ Update your `launch.vs.json` and `task.vs.json` files to reference `CMakePresets If things aren’t working as expected, there are a few troubleshooting steps that you can take. -If either `CMakePrests.json` or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you're referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run `cmake --list-presets` from the command line at the root of your project directory (`CMake` 3.20 or higher is required). If either file is invalid, then you'll see the following error: +If either `CMakePrests.json` or `CMakeUserPresets.json` is invalid, then Visual Studio will fall back on its default behavior and show only the default Configure Presets. Visual Studio IntelliSense can help you catch many of these JSON errors, but it won’t know if you're referencing a preset with `inherits` or `configurePreset` by the wrong name. To check if your preset files are valid, run `cmake --list-presets` from the command line at the root of your project directory (CMake 3.20 or higher is required). If either file is invalid, then you'll see the following error: ```DOS -`CMake` Error: Could not read presets from +CMake Error: Could not read presets from C:/Users//source/repos/: JSON parse error ``` @@ -374,25 +384,25 @@ if(ASAN_ENABLED) endif() ``` -`` are other compilation flags like `"-fno-omit-frame-pointer"`. See [Using AddressSanitizer](https://docs.microsoft.com/cpp/sanitizers/asan#command-prompt) for more information on `ASan` for Linux, and Use the AddressSanitizer from a Developer Command Prompt for more information on `ASan` with MSVC. +`` are other compilation flags like `"-fno-omit-frame-pointer"`. See [Using AddressSanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer#using-addresssanitizer) for more information on `ASan` for Linux, and see [Use the AddressSanitizer from a Developer Command Prompt](https://docs.microsoft.com/cpp/sanitizers/asan#command-prompt) for more information on `ASan` with MSVC. Pass additional runtime flags to AddressSanitizer with the `ASAN_OPTIONS` field in `launch.vs.json`. `ASAN_OPTIONS` defaults to `detect_leaks=0` when no other runtime options are specified because LeakSanitizer isn't supported in Visual Studio. -## Run `CMake` from the command line or a continuous integration (CI) pipeline +## Run CMake from the command line or a continuous integration (CI) pipeline -You can use the same `CMakePresets.json` and `CMakeUserPresets.json` files to invoke `CMake` in Visual Studio and from the command line. The [`CMake`](https://cmake.org/cmake/help/latest/manual/cmake.1.html) and [`CTest`](https://cmake.org/cmake/help/latest/manual/ctest.1.html) documentation are the best resources for invoking `CMake` and `CTest` with `--preset`. `CMake` version 3.20 or higher is required. +You can use the same `CMakePresets.json` and `CMakeUserPresets.json` files to invoke CMake in Visual Studio and from the command line. The [CMake](https://cmake.org/cmake/help/latest/manual/cmake.1.html) and [CTest](https://cmake.org/cmake/help/latest/manual/ctest.1.html) documentation are the best resources for invoking CMake and CTest with `--preset`. CMake version 3.20 or higher is required. -## Sourcing the environment when building with command-line generators on Windows +### Sourcing the environment when building with command-line generators on Windows -It’s up to the user to configure the environment before `CMake` is invoked when building with a command-line generator. If you’re building with Ninja and the Visual C++ toolset on Windows, then you'll need to source the environment before `CMake` is called to generate the build system. You can do this by calling vcvarsall.bat with the architecture argument. architecture specifies the host and target architecture to use. See [vcvarsall syntax](https://docs.microsoft.com/cpp/build/building-on-the-command-line#vcvarsall-syntax) for more information. If you build on Linux or on Windows with a Visual Studio Generator, then you don't need to take this step. +It’s up to the user to configure the environment before CMake is invoked when building with a command-line generator. If you’re building with Ninja and the Visual C++ toolset on Windows, then you'll need to source the environment before CMake is called to generate the build system. You can do this by calling `vcvarsall.bat` with the `architecture` argument. `architecture` specifies the host and target architecture to use. See [vcvarsall syntax](https://docs.microsoft.com/cpp/build/building-on-the-command-line#vcvarsall-syntax) for more information. If you build on Linux or on Windows with a Visual Studio Generator, then you don't need to take this step. -This is the same step that Visual Studio takes for you when `CMake` is invoked by the IDE. Visual Studio parses the active Configure Preset for the host and target architecture specified by toolset and architecture and then sources the specified environment from `vcvarsall.bat`. When you build from the Windows command line with Ninja, you'll need to take this step yourself. +This is the same step that Visual Studio takes for you when CMake is invoked by the IDE. Visual Studio parses the active Configure Preset for the host and target architecture specified by `toolset` and `architecture` and then sources the specified environment from `vcvarsall.bat`. When you build from the Windows command line with Ninja, you'll need to take this step yourself. `vcvarsall.bat` is installed with the Build Tools for Visual Studio. By default, `vcvarsall.bat` is installed in `C:\Program Files (x86)\Microsoft Visual Studio\2019\\VC\Auxiliary\Build`. You can add `vcvarsall.bat` to your `PATH` if you use the command-line workflow frequently. -## Example command-line workflow +### Example command-line workflow -The following commands can be used to configure and build a `CMake` project that uses Ninja to target arm64 with x64 build tools. `CMake` version 3.20 or higher is required. Run these commands from the directory where your `CMakePresets.json` is located: +The following commands can be used to configure and build a CMake project that uses Ninja to target arm64 with x64 build tools. CMake version 3.20 or higher is required. Run these commands from the directory where your `CMakePresets.json` is located: ```DOS /path/to/vcvarsall.bat x64_arm64 @@ -403,15 +413,15 @@ cmake --build --preset ## Example `CMakePresets.json` file -The `CMakePresets.json` file in [box2d-lite](https://github.com/esweet431/box2d-lite/blob/main/) contains examples of Configure Presets, Build Presets, and Test Presets. +The `CMakePresets.json` file in [box2d-lite](https://github.com/esweet431/box2d-lite/blob/main/CMakePresets.json) contains examples of Configure Presets, Build Presets, and Test Presets. ## Next steps -Learn more about configuring and debugging `CMake` projects in Visual Studio: +Learn more about configuring and debugging CMake projects in Visual Studio: > [!div class="nextstepaction"] -> [`CMake` Projects in Visual Studio](cmake-projects-in-visual-studio.md)

    -> [Customize `CMake` build settings](customize-cmake-settings.md)

    -> [Configure `CMake` debugging sessions](configure-cmake-debugging-sessions.md)

    -> [`CMake` predefined configuration reference](cmake-predefined-configuration-reference.md) +> [CMake Projects in Visual Studio](cmake-projects-in-visual-studio.md)

    +> [Customize CMake build settings](customize-cmake-settings.md)

    +> [Configure CMake debugging sessions](configure-cmake-debugging-sessions.md)

    +> [CMake predefined configuration reference](cmake-predefined-configuration-reference.md) > \ No newline at end of file From ca5dbdc355113322d65467d4cc0954add09a1f07 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 7 Apr 2021 21:01:18 -0700 Subject: [PATCH 45/82] edit cleanup --- docs/build/cmake-presets-json-reference.md | 18 +++++++++--------- docs/build/cmake-presets-vs.md | 18 ++++++++++++------ docs/build/media/target-system-selections.PNG | Bin 4127 -> 4672 bytes 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/docs/build/cmake-presets-json-reference.md b/docs/build/cmake-presets-json-reference.md index b1182f5b6f0..fe65882bccb 100644 --- a/docs/build/cmake-presets-json-reference.md +++ b/docs/build/cmake-presets-json-reference.md @@ -12,7 +12,7 @@ CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. The schema for both files is identical. -CMakePresets.json` and `CMakeUserPresets.json` support vendor maps to store vendor-specific information. Microsoft maintains two vendor maps with options specific to Visual Studio and Visual Studio Code. Here we document two Microsoft vendor maps and vendor macros. For documentation about the rest of the schema, including Configure Presets, Build Presets, and Test Presets, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). +`CMakePresets.json` and `CMakeUserPresets.json` support vendor maps to store vendor-specific information. Microsoft maintains two vendor maps with options specific to Visual Studio and Visual Studio Code. Here we document two Microsoft vendor maps and vendor macros. For documentation about the rest of the schema, including Configure Presets, Build Presets, and Test Presets, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). For more information about how to use `CMakePresets.json` in Visual Studio, see [Configure and build with CMake Presets in Visual Studio](cmake-presets-vs.md)\ For more information about how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with CMake Presets in VS Code](https://github.com/microsoft/vscode-cmake-tools/blob/develop/docs/cmake-presets.md) @@ -28,7 +28,7 @@ None of the options in the Visual Studio Settings vendor map impact the construc | Setting | Description | |--|--| | `hostOS` | An array of supported operating systems (OS). Accepted values are `Windows`, `Linux`, and `macOS`.

    The value of `hostOS` is used by Visual Studio and Visual Studio Code to hide Configure Presets that don't apply to the OS of the target system and provide a better user experience.

    If `hostOS` is unspecified, then Visual Studio and Visual Studio Code will always show all Configure Presets for selection. This field can also be a string, which is equivalent to an array containing one string

    This option is supported by both Visual Studio and Visual Studio Code. | -| `intelliSenseMode` | Specifies the mode used for computing IntelliSense information in Visual Studio with the format `--`.

    Accepted values:

    android-clang-arm
    android-clang-arm64
    android-clang-x6
    android-clang-x86
    ios-clang-ar
    ios-clang-arm64
    ios-clang-x6
    ios-clang-x86
    linux-gcc-arm
    linux-gcc-x64
    linux-gcc-x86
    windows-clang-arm
    windows-clang-arm64
    windows-clang-x64
    windows-clang-x86
    windows-msvc-arm
    windows-msvc-arm64
    windows-msvc-x64
    windows-msvc-x86

    If `intelliSenseMode` is unspecified, then Visual Studio will use the IntelliSense mode that matches your specified compilers and target architecture. `intelliSenseMode` is usually used to provide accurate IntelliSense for cross-compilation.

    In Visual Studio 2019, you must explicitly specify a clang IntelliSense mode when building with clang or clang-cl. | +| `intelliSenseMode` | Specifies the mode used for computing IntelliSense information in Visual Studio with the format `--`.

    Accepted values:

    `android-clang-arm`
    `android-clang-arm64`
    `android-clang-x6`
    `android-clang-x86`
    `ios-clang-ar`
    `ios-clang-arm64`
    `ios-clang-x6`
    `ios-clang-x86`
    `linux-gcc-arm`
    `linux-gcc-x64`
    `linux-gcc-x86`
    `windows-clang-arm`
    `windows-clang-arm64`
    `windows-clang-x64`
    `windows-clang-x86`
    `windows-msvc-arm`
    `windows-msvc-arm64`
    `windows-msvc-x64`
    `windows-msvc-x86`

    If `intelliSenseMode` is unspecified, then Visual Studio will use the IntelliSense mode that matches your specified compilers and target architecture. `intelliSenseMode` is usually used to provide accurate IntelliSense for cross-compilation.

    In Visual Studio 2019, you must explicitly specify a clang IntelliSense mode when building with clang or clang-cl. | | `intelliSenseOptions` | A map of additional IntelliSense configuration options.

    `useCompilerDefaults`: A `bool` that specifies whether to use the compilers’ default defines and include paths for IntelliSense. Should only be `false` if the compilers in use don't support gcc-style arguments. Defaults to `true`.

    `additionalCompilerArgs`: An array of additional options to control IntelliSense in Visual Studio. This option supports macro expansion. | | `enableMicrosoftCodeAnalysis` | A `bool` that enables Microsoft code analysis in Visual Studio when building with `cl` or `clang-cl`. Defaults to `false`. | | `codeAnalysisRulset` | Specifies the ruleset to use when running Microsoft code analysis in Visual Studio. This can be a path to a ruleset file, or the name of a ruleset file installed with Visual Studio. This option supports macro expansion. | @@ -37,7 +37,7 @@ None of the options in the Visual Studio Settings vendor map impact the construc | `enableClangTidyCodeAnalysis` | A bool that enables clang-tidy code analysis in Visual Studio when building with `clang-cl`. Defaults to `false`. | | `clangTidyChecks` | A comma-separated list of warnings passed to clang-tidy when running clang-tidy code analysis in Visual Studio. Wildcards are allowed, and the `–` prefix will remove checks. | | `cacheRoot` | Specifies the path to a CMake cache. This directory should contain an existing `CMakeCache.txt` file. This key is only supported by the Open Existing Cache scenario in Visual Studio. This option supports macro expansion. | -| `cmakeGenerateCommand` | A command-line tool (specified as a command-line program + arguments, for example, “gencache.bat debug”) to generate the CMake cache. This command will run from the shell in the preset’s specified environment when CMake configure is invoked. This key is only supported by the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio. This option supports macro expansion | +| `cmakeGenerateCommand` | A command-line tool (specified as a command-line program + arguments, for example, "gencache.bat debug") to generate the CMake cache. This command will run from the shell in the preset’s specified environment when CMake configure is invoked. This key is only supported by the [Open Existing Cache](https://devblogs.microsoft.com/cppblog/open-existing-cmake-caches-in-visual-studio/) scenario in Visual Studio. This option supports macro expansion | ## Visual Studio Remote Settings vendor map @@ -47,19 +47,19 @@ All settings in the Visual Studio Remote Settings vendor map are optional and in None of the options in the Visual Studio Settings vendor map impact the construction of the CMake or CTest command line. This ensures that the same `CMakePresets.json` file can be used to drive CMake with Visual Studio, Visual Studio Code, and from the command line. -Many of the options in the Visual Studio Remote Settings vendor map are ignored when targeting WSL1. This is because the WSL1 toolset executes all commands locally and relies on Windows drives mounted under the /mnt folder to access local source files from WSL1. No source file copy is required. Options that are ignored when targeting WSL1 have been explicitly marked. +Many of the options in the Visual Studio Remote Settings vendor map are ignored when targeting WSL1. This is because the WSL1 toolset executes all commands locally and relies on Windows drives mounted under the `/mnt` folder to access local source files from WSL1. No source file copy is required. Options that are ignored when targeting WSL1 have been explicitly marked. | Setting | Description | |--|--| |`sourceDir` | Path to the directory on the remote system where the project will be copied. Defaults to `$env{HOME}/.vs/$ms{projectDirName}`. This option supports macro expansion.

    In remote copy scenarios, the macro` ${sourceDir}` evaluates to the project source directory on the remote system and not the project source directory on the Windows machine. Remote copy scenarios include targeting a remote SSH connection. In these cases, the project source directory on the remote system will be determined by the value of sourceDir in the Visual Studio Remote Settings vendor map. This option is ignored when targeting WSL1. | |`copySources` | If `true`, Visual Studio will copy sources from Windows to the remote system. Set to `false` if you manage file synchronization yourself. Defaults to true. This option is ignored when targeting WSL1. | -|`copySourcesOptions` | An object of options related to the source copy from Windows to the remote system. This object is ignored when targeting WSL1.

    `copySourcesOptions.exclusionList`: A list of paths to be excluded when copying source files to the remote system. A path can be the name of a file or directory, or a path relative to the root of the copy. Defaults to `[ “.vs”, “.git”, “out” ]`. This option supports macro expansion.

    `copySourcesOptions.method`: The method used to copy source files to the remote system. Accepted values are `rsync` and `sftp`. Defaults to `rsync`.

    `copySourcesOptions.concurrentCopies`: The number of concurrent copies used during the synchronization of sources to the remote system. Defaults to 5.

    `copySourcesOptions.outputVerbosity`: The verbosity level of source copy operations to the remote system. Accepted levels are `Normal`, `Verbose`, and `Diagnostic`. Defaults to `Normal`.| -|`rsyncCommandArgs` | A list of additional command-line arguments passed to `rsync`. Defaults to `[ “-t”, “--delete", “--delete-excluded” ]`. This option supports macro expansion and is ignored when targeting WSL1. | +|`copySourcesOptions` | An object of options related to the source copy from Windows to the remote system. This object is ignored when targeting WSL1.

    `copySourcesOptions.exclusionList`: A list of paths to be excluded when copying source files to the remote system. A path can be the name of a file or directory, or a path relative to the root of the copy. Defaults to `[ ".vs", ".git", "out" ]`. This option supports macro expansion.

    `copySourcesOptions.method`: The method used to copy source files to the remote system. Accepted values are `rsync` and `sftp`. Defaults to `rsync`.

    `copySourcesOptions.concurrentCopies`: The number of concurrent copies used during the synchronization of sources to the remote system. Defaults to `5`.

    `copySourcesOptions.outputVerbosity`: The verbosity level of source copy operations to the remote system. Accepted levels are `Normal`, `Verbose`, and `Diagnostic`. Defaults to `Normal`.| +|`rsyncCommandArgs` | A list of additional command-line arguments passed to `rsync`. Defaults to `[ "-t", "--delete", "--delete-excluded" ]`. This option supports macro expansion and is ignored when targeting WSL1. | |`copyBuildOutput` | Specifies whether to copy build output from the remote system back to Windows. Defaults to `false`. This option is ignored when targeting WSL1. | -|`copyOptimizations` | An object of options related to source copy optimizations. These options are ignored when targeting WSL1.

    `copyOptimizations.maxSmallChange`: The maximum number of files to copy using sftp instead of rsync. Defaults to 10.

    `copyOptimizations.useOptimizations`: Specifies the copy optimizations in use. Accepted values are no copy optimizations (`None`), rsync only optimizations (`RsyncOnly`), or rsync and sftp optimizations (`RsyncAndSftp`). Defaults to `RsyncAndSftp`.

    `copyOptimizations.rsyncSingleDirectoryCommandArgs`: A list of additional command-line arguments passed to rsync when copying the contents of a single directory to the remote system. Defaults to `[ “-t”, “-d” ]`. This option supports macro expansion. | +|`copyOptimizations` | An object of options related to source copy optimizations. These options are ignored when targeting WSL1.

    `copyOptimizations.maxSmallChange`: The maximum number of files to copy using sftp instead of rsync. Defaults to 10.

    `copyOptimizations.useOptimizations`: Specifies the copy optimizations in use. Accepted values are no copy optimizations (`None`), rsync only optimizations (`RsyncOnly`), or rsync and sftp optimizations (`RsyncAndSftp`). Defaults to `RsyncAndSftp`.

    `copyOptimizations.rsyncSingleDirectoryCommandArgs`: A list of additional command-line arguments passed to rsync when copying the contents of a single directory to the remote system. Defaults to `[ "-t", "-d" ]`. This option supports macro expansion. | |`copyAdditionalIncludeDirectoriesList` | A list of paths to remote header directories to be copied locally for IntelliSense. This option supports macro expansion. | |`copyExcludeDirectoriesList` | A list of paths to remote header directories to not be copied locally for IntelliSense. This option supports macro expansion. | -|`forceWSL1Toolset` | If `true`, Visual Studio will always use the WSL1 toolset when targeting WSL from Visual Studio. The WSL1 toolset executes all commands locally and relies on Windows drives mounted under the /mnt folder to access local source files from WSL. These options may be slower with WSL2. Defaults to `false`.

    The WSL1 toolset will always be used in Visual Studio 2019 version 16.10. This option will be relevant once native support for WSL2 is available. | +|`forceWSL1Toolset` | If `true`, Visual Studio will always use the WSL1 toolset when targeting WSL from Visual Studio. The WSL1 toolset executes all commands locally and relies on Windows drives mounted under the `/mnt` folder to access local source files from WSL. These options may be slower with WSL2. Defaults to `false`.

    The WSL1 toolset will always be used in Visual Studio 2019 version 16.10. This option will be relevant once native support for WSL2 is available. | ## Remote pre-build and post-build events @@ -110,7 +110,7 @@ Use the macros supported by CMake to construct your file paths. This will ensure | Deprecated macro | Recommendation | |---------|---------| |`${projectFile} ` | `${sourceDir}/CMakeLists.txt` | -| `${thisFile}` | ` ${sourceDir}/`CMakePresets.json` ` | +| `${thisFile}` | ` ${sourceDir}/CMakePresets.json` | ## Accepted shell syntax diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index 13d4006863f..8cf1928d872 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -11,8 +11,7 @@ CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that Use `CMakePresets.json` and `CMakeUserPresets.json` to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. -This article contains information about `CMakePresets.json` integration Visual Studio. https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools - +This article contains information about `CMakePresets.json` integration Visual Studio. - For more information on the format of `CMakePresets.json`, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1). - For more information on the Microsoft vendor maps and macro expansion, see [`CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps](cmake-presets-json-reference.md). - For more information on how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with CMake Presets](https://github.com/microsoft/vscode-cmake-tools/tree/develop/docs/cmake-presets.md). @@ -27,7 +26,7 @@ CMake version 3.20 or higher is required when invoking CMake with `CMakePresets. ## Enable `CMakePresets.json` integration in Visual Studio 2019 -`CMakePresets.json` integration isn't enabled by default in Visual Studio 2019. You can enable `CMakePresets.json` integration for all CMake projects in **Tools** > **Options** > **CMake** > **General**: +`CMakePresets.json` integration isn't enabled by default in Visual Studio 2019. You can enable it for all CMake projects in **Tools** > **Options** > **CMake** > **General**: ![Enable `CMakePresets.json` in CMake options > General](./media/enable-cmakepresets.PNG) @@ -116,7 +115,11 @@ The dropdown on the left indicates the active **Target System**. This is the sys ![Target system dropdown selection examples for local machine, a SSH connection, and WSL ubuntu and WSL debian](./media/target-system-selections.PNG) -In the example above, **192.168.0.5** is a remote Linux system that was added to the **Connection Manager**. **ubuntu2004** and **debian** are WSL installations. Select **Manage Connections…** to open the **Connection Manager**. +In the example above: +- **192.168.0.5** is a remote Linux system that was added to the **Connection Manager**. +- **ubuntu2004** and **debian** are WSL installations. + +Select **Manage Connections…** to open the **Connection Manager**. ### Select a Configure Preset @@ -138,7 +141,7 @@ Visual Studio automatically tries to configure the project when it detects that ### Build -To build the entire project, select **Build** > **Build All** from the main menu. This is the same as running `cmake --build --preset ` from the command line, where `` is the name of the active `Build Preset`. +To build the entire project, select **Build** > **Build All** from the main menu. This is the same as running `cmake --build --preset ` from the command line, where `` is the name of the active Build Preset. To build a single target, switch to **CMake Targets View** in the **Solution Explorer**. Then right-click any target and select **Build** from the context menu. @@ -162,7 +165,7 @@ Use forward slashes (`/`) for paths in `CMakePresets.json` and `CMakeUserPresets ### Add new Configure Presets -To add a new Configure Preset to `CMakePresets.json`, from **Solution Explorer** right-click `CMakePresets.json` from **Folder View** and select **Add Configure Preset…** from the context menu. The dialog to select a Configure Preset template opens: +To add a new Configure Preset to `CMakePresets.json`, from **Solution Explorer** right-click `CMakePresets.json` from **Folder View** and select **Add Configure Preset…** from the context menu. The dialog to select a Configure Preset template appears: ![Add configure preset to `CMakePresets.json` dialog](./media/add-configure-preset-to-cmakepresets.PNG) @@ -184,6 +187,7 @@ C and C++ compilers can be set with `cacheVariables.CMAKE_C_COMPILER` and `cache Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual Studio. The C++ Clang tools for Windows component must be installed to build with `clang-cl`. +**CL** ```json "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", @@ -193,6 +197,7 @@ Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual }, ``` +**Clang** ```json "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", @@ -215,6 +220,7 @@ See [Run CMake from the command line or a continuous integration (CI) pipeline]( To build on Linux or without the Visual C++ toolset, specify the name of a compiler on your `PATH`, or an environment variable that evaluates to the full path of a compiler. Full paths are discouraged so that the file can remain shareable. A preset that builds with GCC version 8 might look like this: +**GCC** ```json "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", diff --git a/docs/build/media/target-system-selections.PNG b/docs/build/media/target-system-selections.PNG index 2c9a0a8ad0d7c354d7fd439ecadc64d1243b6471..6947285cddcf5b61d4491199c4c21f103e431578 100644 GIT binary patch literal 4672 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 JRp7_b{{wt_(@p>Y From 4fbbc86162b58f67d567e9245f25ae0d95f80aea Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 7 Apr 2021 21:24:48 -0700 Subject: [PATCH 46/82] fixes --- docs/build/cmake-presets-json-reference.md | 4 ++-- docs/build/cmake-presets-vs.md | 18 ++++++++---------- docs/build/toc.yml | 2 +- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/docs/build/cmake-presets-json-reference.md b/docs/build/cmake-presets-json-reference.md index fe65882bccb..13a0bcefb44 100644 --- a/docs/build/cmake-presets-json-reference.md +++ b/docs/build/cmake-presets-json-reference.md @@ -99,11 +99,11 @@ Visual Studio supports vendor macros with the prefix `ms`. Microsoft vendor macr |Macro |Description | |---------|---------| -| `$env{}`
    `$penv{}`| Reference environment variables using this syntax supported by CMake. | +| `$env{}`
    `$penv{}`| Reference environment variables using this syntax supported by CMake. See [cmake-presets Macro Expansion](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion) for more information. | ## Deprecated macros -A few macros that were supported by CMakeSettings.json have been deprecated with the adoption of `CMakePresets.json`. +A few macros that were supported by CMakeSettings.json have been deprecated with the adoption of `CMakePresets.json`. Use the macros supported by CMake to construct your file paths. This will ensure that the same `CMakePresets.json` file works inside Visual Studio and from the command line. diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index 8cf1928d872..c0a784fe208 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -9,7 +9,7 @@ ms.date: "04/13/2020" CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. -Use `CMakePresets.json` and `CMakeUserPresets.json` to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipeline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. +Use `CMakePresets.json` and `CMakeUserPresets.json` to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipReline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. This article contains information about `CMakePresets.json` integration Visual Studio. - For more information on the format of `CMakePresets.json`, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1). @@ -35,12 +35,10 @@ CMake version 3.20 or higher is required when invoking CMake with `CMakePresets. If you don't want to enable `CMakePresets.json` integration for all CMake projects, then you can enable `CMakePresets.json` integration for a single CMake project by adding a `CMakePresets.json` file to the root of the open folder. You must close and reopen the folder in Visual Studio to activate the integration. -The following table indicates when `CMakePresets.json` is used instead of `CMakeSettings.json` to drive CMake configuration and build. +The following table indicates when `CMakePresets.json` is used instead of `CMakeSettings.json` to drive CMake configuration and build. If no configuration file is present, then default Configure Presets are used. Key: **Tools** > **Options** enabled means **Use CMakePresets.json to drive CMake configure, build, and test** is selected in **Tools** > **Options** > **CMake** > **General**. -If no configuration file is present, then default Configure Presets are used. - | Configuration files | Tools > Options disabled | Tools > Options enabled | |--|--|--| | No configuration file present | `CMakeSettings.json` | `CMakePresets.json` | @@ -155,7 +153,7 @@ There are two menu options supported by `CMakePresets.json` in Visual Studio 201 - **Test** > **Run CTests** for invokes CTest and runs all tests associated with the active Configure Preset and Build Preset, with no additional arguments passed to CTest. - **Test** > **Run Test Preset** for will expand to show all Test Presets associated with the active Configure Preset. Selecting a single Test Preset is the same as running `ctest --preset ` from the command line, where `` is the name of the selected Test Preset. This option will be grayed out if no Test Presets are defined for the active Configure Preset. -In Visual Studio 2019 the Test Explorer isn't integrated with `CMakePresets.json`. +In Visual Studio 2019, the Test Explorer isn't integrated with `CMakePresets.json`. ## Add new presets @@ -187,7 +185,7 @@ C and C++ compilers can be set with `cacheVariables.CMAKE_C_COMPILER` and `cache Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual Studio. The C++ Clang tools for Windows component must be installed to build with `clang-cl`. -**CL** +**Build with `cl.exe`** ```json "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", @@ -197,7 +195,7 @@ Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual }, ``` -**Clang** +**Build with `clang`** ```json "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", @@ -214,7 +212,7 @@ Use the following examples to build with `cl.exe` and `clang-cl.exe` from Visual ``` > [!IMPORTANT] -> In Visual Studio 2019 you must explicitly specify a Clang IntelliSense mode when building with `clang` or `clang-cl`. +> In Visual Studio 2019, you must explicitly specify a Clang IntelliSense mode when building with `clang` or `clang-cl`. See [Run CMake from the command line or a continuous integration (CI) pipeline](#run-cmake-from-the-command-line-or-a-continuous-integration-ci-pipeline) to reproduce these builds outside of Visual Studio. @@ -287,7 +285,7 @@ By default, Visual Studio will use the IntelliSense mode that matches your speci ## Configure and build on a remote system or the Windows Subsystem for Linux (WSL) -With `CMakePresets.json` support in Visual Studio you can easily configure and build your project on Windows, WSL, and remote systems. The steps to [Configure and build](#configure-and-build) your project on Windows, a remote system, or WSL are the same. However, there are a few behaviors that are specific to remote development. +With `CMakePresets.json` support in Visual Studio, you can easily configure and build your project on Windows, WSL, and remote systems. The steps to [Configure and build](#configure-and-build) your project on Windows, a remote system, or WSL are the same. However, there are a few behaviors that are specific to remote development. ### `${sourceDir}` behavior in remote copy scenarios @@ -299,7 +297,7 @@ Remote copy scenarios require a local directory to copy some remote files like C ### Invoke the same Configure Preset on Windows and WSL1 -You'll see an error if you try to use the same Configure Preset on Windows and WSL1. Windows and WSL1 both use the Windows file system, so CMake will try to use the same output directory (`binaryDir`) for both the Windows and WSL1 build tree. If you want to use the same Configure Preset with both Windows and the WSL1 toolset, create a second Configure Preset that inherits from the original preset and specifies a new `binaryDir`. In the following example, `windows-preset` can be used on Windows and base-preset can be used on WSL1: +You'll see an error if you try to use the same Configure Preset on Windows and WSL1. Windows and WSL1 both use the Windows file system, so CMake will try to use the same output directory (`binaryDir`) for both the Windows and WSL1 build tree. If you want to use the same Configure Preset with both Windows and the WSL1 toolset, create a second Configure Preset that inherits from the original preset and specifies a new `binaryDir`. In the following example, `windows-preset` can be used on Windows and `base-preset` can be used on WSL1: ```json { diff --git a/docs/build/toc.yml b/docs/build/toc.yml index d54d162ac08..9ade732ca62 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -61,7 +61,7 @@ href: ../build/clang-support-cmake.md - name: Configure a Linux CMake project href: ../build/../linux/cmake-linux-project.md - - name: Configure and build with CMake presets + - name: Configure and build with CMake Presets href: ../build/cmake-presets-vs.md - name: CMakePresets.json reference href: ../build/cmake-presets-json-reference.md From 8ca5b246fcb452ca4c6e7154b7804a00cb48434c Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 8 Apr 2021 09:50:07 -0700 Subject: [PATCH 47/82] tech review --- docs/build/reference/module-exportheader.md | 2 +- .../sourcedependencies-directives.md | 15 +++---- docs/build/reference/sourcedependencies.md | 40 ++++++++++++++----- .../walkthrough-import-stl-header-units.md | 12 +++--- 4 files changed, 46 insertions(+), 23 deletions(-) diff --git a/docs/build/reference/module-exportheader.md b/docs/build/reference/module-exportheader.md index a291b6609d5..3cff873db53 100644 --- a/docs/build/reference/module-exportheader.md +++ b/docs/build/reference/module-exportheader.md @@ -15,7 +15,7 @@ Tells the compiler to create the header units specified by the input arguments. > **`/exportHeader /headerName:angle`** *`header-name`* > **`/exportHeader /headerName:quote`** *`header-name`* -> **`/exportHeader`** *`full or relative path to header file`* Note: this form is deprecated +> **`/exportHeader`** *`full path to header file`* ### Arguments diff --git a/docs/build/reference/sourcedependencies-directives.md b/docs/build/reference/sourcedependencies-directives.md index 9c7716c3adc..6a71c90fb85 100644 --- a/docs/build/reference/sourcedependencies-directives.md +++ b/docs/build/reference/sourcedependencies-directives.md @@ -9,16 +9,16 @@ helpviewer_keywords: ["/sourceDependencies:directives compiler option", "/source --- # `/sourceDependencies:directives` (List module and header unit dependencies) -This command-line switch generates a JSON file that lists the module and header-unit dependencies in your project. +This command-line switch generates a JSON file that lists the module and header-unit dependencies in the source code. -It identifies which modules and header units need to be compiled before the project that uses them is compiled. For instance, it will list `import ;` or `import "library"; as a header unit dependency, and `import name;` as a module dependency. +It identifies which modules and header units need to be compiled before the project that uses them is compiled. For instance, it will list `import ;` or `import "library";` as a header unit dependency, and `import name;` as a module dependency. This command-line option is similar to [`/sourceDependencies`](sourcedependencies.md), but differs in the following ways: - The compiler doesn't produce compiled output. Instead, the files are scanned for module directives. No compiled code, modules, or header units are produced. - The output JSON file doesn't list imported modules and imported header units (*`.ifc`* files) because this switch does a scan of the project files, not a compilation, so there are no built modules or header units to list. - Only directly imported modules or header units are listed. It doesn't list the dependencies of the imported modules or header units themselves. -- Header file dependencies are not listed. That is, `#include ` or `#include "file"` dependencies are not listed. +- Header file dependencies are not listed. That is, `#include ` or `#include "file"` dependencies are not listed - `/sourceDependencies:directives`is meant to be used before *`.ifc`* files are built. ## Syntax @@ -65,9 +65,9 @@ import "t.h"; int main() {} ``` -> `cl /std:c++latest /sourceDependencies:directives deps.json main.cpp` +> `cl /std:c++latest /sourceDependencies:directives output.json main.cpp` -This command line produces a JSON file *`deps.json`* with content like: +This command line produces a JSON file *`output.json`* with content like: ```JSON { @@ -81,8 +81,7 @@ This command line produces a JSON file *`deps.json`* with content like: ], "ImportedHeaderUnits":[ "C:\\...\\utility", - "C:\\a\\b\\t.h", - "C:\\...\\vector" + "C:\\a\\b\\t.h" ] } } @@ -90,6 +89,8 @@ This command line produces a JSON file *`deps.json`* with content like: We've used `...` to abbreviate the reported paths; the report contains the absolute paths. The paths reported depend on where the compiler finds the dependencies. If the results are unexpected, you may want to check your project's include path settings. +`ProvidedModule` lists exported module or module partition names. + No *`.ifc`* files are listed in the output because they weren't built. Unlike `/sourceDependencies`, the compiler doesn't produce compiled output when `/sourceDependencies:directives`is specified, so no compiled modules or header units are produced to import. ## To set this compiler option in the Visual Studio development environment diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index 8657275c63d..634c89eca9a 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -50,9 +50,11 @@ Given the following sample code: ```cpp // main.cpp -#include "header.h" -import m; -import "other.h"; +MouleE.ixx: +export module ModuleE; +import ModuleC; +import ModuleD; +import ; int main() { } ``` @@ -67,14 +69,32 @@ where `...` represents your other compiler options. This command line produces a { "Version": "1.1", "Data": { - "Source": "C:\\...\\main.cpp", - "PCH": "C:\\...\\pch.pch", - "Includes": [ - "C:\\...\\header.h" - ], + "Source": "f:\\test\\modulesample\\myproject\\modulee.ixx", + "ProvidedModule": "ModuleE", + "Includes": [], "ImportedModules": [ - "C:\\...\\m.ifc", - "C:\\...\\other.h.ifc" + { + "Name": "ModuleC", + "BMI": "F:\\test\\ModuleSample\\Outputs\\Intermediate\\MyProject\\x64\\Debug\\ModuleC.ixx.ifc" + }, + { + "Name": "ModuleB", + "BMI": "F:\\test\\ModuleSample\\Outputs\\Intermediate\\ModuleB\\x64\\Debug\\ModuleB.ixx.ifc" + }, + { + "Name": "ModuleD", + "BMI": "F:\\test\\ModuleSample\\Outputs\\Intermediate\\MyProject\\x64\\Debug\\ModuleD.cppm.ifc" + } + ], + "ImportedHeaderUnits": [ + { + "Header": "f:\\visual studio 16 main\\vc\\tools\\msvc\\14.29.30030\\include\\iostream", + "BMI": "F:\\test\\ModuleSample\\Outputs\\Intermediate\\HeaderUnits\\x64\\Debug\\iostream_W4L4JYGFJ3GL8OG9.ifc" + }, + { + "Header": "f:\\visual studio 16 main\\vc\\tools\\msvc\\14.29.30030\\include\\yvals_core.h", + "BMI": "F:\\test\\ModuleSample\\Outputs\\Intermediate\\HeaderUnits\\x64\\Debug\\yvals_core.h.ifc" + } ] } } diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 2846d561905..fb8046eeb20 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -107,9 +107,9 @@ The more flexible way to consume STL headers is to create one or more static lib This option ensures that header units for a particular header will be built only once. It's similar to using a shared precompiled header file, but is much easier. -In this example, you'll create a project that imports `` and ``. Once built, you'll reference this shared project from another C++ project. Then, in the referencing project, everywhere `import ;` or `import ;` is found, it will import the built header unit for that library instead of running the contents of the library header through the preprocessor. In projects that include the same library header in multiple files, this will improve build performance similarly to how PCH files do because the header won't have to be processed over and over by the files that include it. Instead, the already processed compiled header unit will be imported. +In this example, you'll create a project that imports `` and ``. Once built, you'll reference this shared header units project from another C++ project. Then, in the referencing project, everywhere `import ;` or `import ;` is found, it will import the built header unit for that library instead of running the contents of the library header through the preprocessor. In projects that include the same library header in multiple files, this will improve build performance similarly to how PCH files do because the header won't have to be processed over and over by the files that include it. Instead, the already processed compiled header unit will be imported. -### Create the shared project +### Create the shared header units project Begin by creating the project for the shared header units as follows: @@ -173,7 +173,7 @@ Then you can build the solution (**Build** > **Build Solution** from the main me The advantage of this approach is that you can reference the static library project from any project to reuse the header units in it. In this example, that's `` and ``. -You can make a monolithic library project containing all the commonly used STL headers that you want to import from your various projects. Or, you can produce smaller shared library projects that have different groupings of STL libraries that you want to import as header units. Then reference those shared projects as needed. +You can make a monolithic library project containing all the commonly used STL headers that you want to import from your various projects. Or, you can produce smaller shared library projects that have different groupings of STL libraries that you want to import as header units. Then reference those shared header units projects as needed. The result should be increased build throughput because importing a header unit significantly reduces the work the compiler must do. @@ -192,9 +192,11 @@ The following settings control the visibility of header units to the build syste - **Public C++ Module directories**: specify which project directories contain header units that should be available to referencing projects. This is a way of making some header units public, by putting those that can be shared in a directory that is visible to other projects. If you set this, you may also want to specify **Public Include Directories** so your public headers are automatically added to the include path in referencing projects. - **All Modules are Public** - To use header units built as a part of a DLL project, the symbols have to be exported from the DLL. To do so, set this property to **Yes**. -## Reuse header units between Visual Studio solutions +## Use a prebuilt module file -If you want to use a header unit built in a different Visual Studio solution, you can specify where the built *`.ifc`* files are so that you can import them. +Normally, the easiest way to reuse header units between solutions is to include the same shared header units project in each solution. + +But if you have a need to use a built header unit that you don't have the project for, you can specify where the built *`.ifc`* file is so that you can import it in your solution. To access this setting: 1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. From 681b6e4d7e91cee5078b1722216d9545e15b3d8b Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 8 Apr 2021 10:04:03 -0700 Subject: [PATCH 48/82] tech review --- .../sourcedependencies-directives.md | 2 +- docs/build/reference/sourcedependencies.md | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/docs/build/reference/sourcedependencies-directives.md b/docs/build/reference/sourcedependencies-directives.md index 6a71c90fb85..73a3532e11f 100644 --- a/docs/build/reference/sourcedependencies-directives.md +++ b/docs/build/reference/sourcedependencies-directives.md @@ -18,7 +18,7 @@ This command-line option is similar to [`/sourceDependencies`](sourcedependencie - The compiler doesn't produce compiled output. Instead, the files are scanned for module directives. No compiled code, modules, or header units are produced. - The output JSON file doesn't list imported modules and imported header units (*`.ifc`* files) because this switch does a scan of the project files, not a compilation, so there are no built modules or header units to list. - Only directly imported modules or header units are listed. It doesn't list the dependencies of the imported modules or header units themselves. -- Header file dependencies are not listed. That is, `#include ` or `#include "file"` dependencies are not listed +- Header file dependencies are not listed. That is, `#include ` or `#include "file"` dependencies are not listed. - `/sourceDependencies:directives`is meant to be used before *`.ifc`* files are built. ## Syntax diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index 634c89eca9a..bf09530d35a 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -49,14 +49,11 @@ All file paths appear as absolute paths in the output. Given the following sample code: ```cpp -// main.cpp -MouleE.ixx: +// ModuleE.ixx: export module ModuleE; import ModuleC; import ModuleD; import ; - -int main() { } ``` You can use **`/sourceDependencies`** with the rest of your compiler options: @@ -69,31 +66,31 @@ where `...` represents your other compiler options. This command line produces a { "Version": "1.1", "Data": { - "Source": "f:\\test\\modulesample\\myproject\\modulee.ixx", + "Source": "F:\\Sample\\myproject\\modulee.ixx", "ProvidedModule": "ModuleE", "Includes": [], "ImportedModules": [ { "Name": "ModuleC", - "BMI": "F:\\test\\ModuleSample\\Outputs\\Intermediate\\MyProject\\x64\\Debug\\ModuleC.ixx.ifc" + "BMI": "F:\\Sample\\Outputs\\Intermediate\\MyProject\\x64\\Debug\\ModuleC.ixx.ifc" }, { "Name": "ModuleB", - "BMI": "F:\\test\\ModuleSample\\Outputs\\Intermediate\\ModuleB\\x64\\Debug\\ModuleB.ixx.ifc" + "BMI": "F:\\Sample\\Outputs\\Intermediate\\ModuleB\\x64\\Debug\\ModuleB.ixx.ifc" }, { "Name": "ModuleD", - "BMI": "F:\\test\\ModuleSample\\Outputs\\Intermediate\\MyProject\\x64\\Debug\\ModuleD.cppm.ifc" + "BMI": "F:\\Sample\\Outputs\\Intermediate\\MyProject\\x64\\Debug\\ModuleD.cppm.ifc" } ], "ImportedHeaderUnits": [ { "Header": "f:\\visual studio 16 main\\vc\\tools\\msvc\\14.29.30030\\include\\iostream", - "BMI": "F:\\test\\ModuleSample\\Outputs\\Intermediate\\HeaderUnits\\x64\\Debug\\iostream_W4L4JYGFJ3GL8OG9.ifc" + "BMI": "F:\\Sample\\Outputs\\Intermediate\\HeaderUnits\\x64\\Debug\\iostream_W4L4JYGFJ3GL8OG9.ifc" }, { "Header": "f:\\visual studio 16 main\\vc\\tools\\msvc\\14.29.30030\\include\\yvals_core.h", - "BMI": "F:\\test\\ModuleSample\\Outputs\\Intermediate\\HeaderUnits\\x64\\Debug\\yvals_core.h.ifc" + "BMI": "F:\\Sample\\Outputs\\Intermediate\\HeaderUnits\\x64\\Debug\\yvals_core.h.ifc" } ] } @@ -102,6 +99,8 @@ where `...` represents your other compiler options. This command line produces a We've used `...` to abbreviate the reported paths; the report contains the absolute paths. The paths reported depend on where the compiler finds the dependencies. If the results are unexpected, you may want to check your project's include path settings. +`ProvidedModule` lists exported module or module partition names. + ### To set this compiler option in the Visual Studio development environment You normally shouldn't set this yourself in the Visual Studio development environment. It is set by the build system. From e9af0f5e1933c983e1caf186a89e83397e59dea1 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 8 Apr 2021 13:05:10 -0700 Subject: [PATCH 49/82] add note about availablity --- docs/build/cmake-presets-vs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index c0a784fe208..6cf1abbc56f 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -9,7 +9,7 @@ ms.date: "04/13/2020" CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that allow users to specify common configure, build, and test options and share them with others. -Use `CMakePresets.json` and `CMakeUserPresets.json` to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipReline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. +Use `CMakePresets.json` and `CMakeUserPresets.json` to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipReline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. `CMakePresets.json` is supported in Visual Studio 2019 version 16.10 or later. This article contains information about `CMakePresets.json` integration Visual Studio. - For more information on the format of `CMakePresets.json`, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1). From c4099cc215cd1d1861e915b2e52acb3595aafcb7 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 8 Apr 2021 14:59:21 -0700 Subject: [PATCH 50/82] intermediate step to do a case change on the extension --- ...PNG => add-configure-preset-to-cmakepresets.zzz} | Bin ...ble-cmakepresets.PNG => enable-cmakepresets.zzz} | Bin ...stem-dropdown.PNG => target-system-dropdown.zzz} | Bin ...-selections.PNG => target-system-selections.zzz} | Bin 4 files changed, 0 insertions(+), 0 deletions(-) rename docs/build/media/{add-configure-preset-to-cmakepresets.PNG => add-configure-preset-to-cmakepresets.zzz} (100%) rename docs/build/media/{enable-cmakepresets.PNG => enable-cmakepresets.zzz} (100%) rename docs/build/media/{target-system-dropdown.PNG => target-system-dropdown.zzz} (100%) rename docs/build/media/{target-system-selections.PNG => target-system-selections.zzz} (100%) diff --git a/docs/build/media/add-configure-preset-to-cmakepresets.PNG b/docs/build/media/add-configure-preset-to-cmakepresets.zzz similarity index 100% rename from docs/build/media/add-configure-preset-to-cmakepresets.PNG rename to docs/build/media/add-configure-preset-to-cmakepresets.zzz diff --git a/docs/build/media/enable-cmakepresets.PNG b/docs/build/media/enable-cmakepresets.zzz similarity index 100% rename from docs/build/media/enable-cmakepresets.PNG rename to docs/build/media/enable-cmakepresets.zzz diff --git a/docs/build/media/target-system-dropdown.PNG b/docs/build/media/target-system-dropdown.zzz similarity index 100% rename from docs/build/media/target-system-dropdown.PNG rename to docs/build/media/target-system-dropdown.zzz diff --git a/docs/build/media/target-system-selections.PNG b/docs/build/media/target-system-selections.zzz similarity index 100% rename from docs/build/media/target-system-selections.PNG rename to docs/build/media/target-system-selections.zzz From 706783d924e3afbc5b6cfe92254ec21b95c7ffa6 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 8 Apr 2021 15:00:35 -0700 Subject: [PATCH 51/82] complete step to rename extension --- ...zzz => add-configure-preset-to-cmakepresets.png} | Bin ...ble-cmakepresets.zzz => enable-cmakepresets.png} | Bin ...stem-dropdown.zzz => target-system-dropdown.png} | Bin ...-selections.zzz => target-system-selections.png} | Bin 4 files changed, 0 insertions(+), 0 deletions(-) rename docs/build/media/{add-configure-preset-to-cmakepresets.zzz => add-configure-preset-to-cmakepresets.png} (100%) rename docs/build/media/{enable-cmakepresets.zzz => enable-cmakepresets.png} (100%) rename docs/build/media/{target-system-dropdown.zzz => target-system-dropdown.png} (100%) rename docs/build/media/{target-system-selections.zzz => target-system-selections.png} (100%) diff --git a/docs/build/media/add-configure-preset-to-cmakepresets.zzz b/docs/build/media/add-configure-preset-to-cmakepresets.png similarity index 100% rename from docs/build/media/add-configure-preset-to-cmakepresets.zzz rename to docs/build/media/add-configure-preset-to-cmakepresets.png diff --git a/docs/build/media/enable-cmakepresets.zzz b/docs/build/media/enable-cmakepresets.png similarity index 100% rename from docs/build/media/enable-cmakepresets.zzz rename to docs/build/media/enable-cmakepresets.png diff --git a/docs/build/media/target-system-dropdown.zzz b/docs/build/media/target-system-dropdown.png similarity index 100% rename from docs/build/media/target-system-dropdown.zzz rename to docs/build/media/target-system-dropdown.png diff --git a/docs/build/media/target-system-selections.zzz b/docs/build/media/target-system-selections.png similarity index 100% rename from docs/build/media/target-system-selections.zzz rename to docs/build/media/target-system-selections.png From f903204439a74b321a63f673c1cbd27216aa200b Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 8 Apr 2021 15:06:31 -0700 Subject: [PATCH 52/82] change case of references to .PNG in case it matters --- docs/build/cmake-presets-vs.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index 6cf1abbc56f..e6a6befb11d 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -28,7 +28,7 @@ CMake version 3.20 or higher is required when invoking CMake with `CMakePresets. `CMakePresets.json` integration isn't enabled by default in Visual Studio 2019. You can enable it for all CMake projects in **Tools** > **Options** > **CMake** > **General**: -![Enable `CMakePresets.json` in CMake options > General](./media/enable-cmakepresets.PNG) +![Enable `CMakePresets.json` in CMake options > General](./media/enable-cmakepresets.png) > [!Important] > Close and reopen the folder in Visual Studio to activate the integration. @@ -105,13 +105,13 @@ A `CMakePresets.json` file with the default Configure Presets is automatically c Visual Studio provides three dropdowns when `CMakePresets.json` integration is enabled: -![Target system dropdown](./media/target-system-dropdown.PNG) +![Target system dropdown](./media/target-system-dropdown.png) ### Select a target system The dropdown on the left indicates the active **Target System**. This is the system on which CMake will be invoked to configure and build the project. This dropdown lists your local machine, all SSH connections in the **Connection Manager** by host name, and all Windows Subsystem for Linux (WSL) installations that Visual Studio can find: -![Target system dropdown selection examples for local machine, a SSH connection, and WSL ubuntu and WSL debian](./media/target-system-selections.PNG) +![Target system dropdown selection examples for local machine, a SSH connection, and WSL ubuntu and WSL debian](./media/target-system-selections.png) In the example above: - **192.168.0.5** is a remote Linux system that was added to the **Connection Manager**. @@ -165,7 +165,7 @@ Use forward slashes (`/`) for paths in `CMakePresets.json` and `CMakeUserPresets To add a new Configure Preset to `CMakePresets.json`, from **Solution Explorer** right-click `CMakePresets.json` from **Folder View** and select **Add Configure Preset…** from the context menu. The dialog to select a Configure Preset template appears: -![Add configure preset to `CMakePresets.json` dialog](./media/add-configure-preset-to-cmakepresets.PNG) +![Add configure preset to `CMakePresets.json` dialog](./media/add-configure-preset-to-cmakepresets.png) Choose the **Windows x64 Debug** template to configure on Windows systems. Choose the **Linux Debug** template to configure on WSL and remote Linux systems. See [Edit presets](#edit-presets) for more information on editing `CMakePresets.json`. From 79ff78575580b7414af87ec6fe6e342f4744d9c6 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 8 Apr 2021 16:35:47 -0700 Subject: [PATCH 53/82] draft --- docs/standard-library/ranges-functions.md | 99 -------------- docs/standard-library/ranges.md | 158 ++++++++++++++++------ docs/standard-library/toc.yml | 4 - 3 files changed, 115 insertions(+), 146 deletions(-) delete mode 100644 docs/standard-library/ranges-functions.md diff --git a/docs/standard-library/ranges-functions.md b/docs/standard-library/ranges-functions.md deleted file mode 100644 index 953f6998ed4..00000000000 --- a/docs/standard-library/ranges-functions.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -description: "Learn more about: ; functions" -title: " functions" -ms.date: "04/13/2021" -f1_keywords: ["ranges/std::span::as_bytes", "span/std::as_writable_bytes"] -helpviewer_keywords: ["std::span [C++], as_writable_bytes", "std::as_bytes [C++]"] ---- -# ` functions - -The `` header includes the following non-member functions that operate on **span** objects. - -| **Non-member functions** | **Description** | -|-|-| -|[as_bytes](#as_bytes) | Get a read-only view of the object representation of the elements in the span. | -|[as_writable_bytes](#as_writable_bytes) | Get a read/write view of the object representation of the elements in the span. | - -## `as_bytes` - -Get a read-only view of the object representation of the elements in the span. - -```cpp -template -auto as_bytes(span s) noexcept; -``` - -### Parameters - -*T*\ -The type of the elements in the span. - -*Extent*\ -The number of elements in the span (if known at compile time), otherwise `dynamic_extent` indicating that the number of elements isn't known until runtime. - -*s*\ -The span to get the raw representation of. - -### Return Value - -A `span` to the first item stored in the span where `S` is `{reinterpret_cast(s.data()), s.size_bytes()}` - -### Example - -```cpp -#include -#include - -using namespace std; - -void main() -{ - int a[] = { 0,1,2 }; - span mySpan(a); - auto bytes = std::as_bytes(mySpan); -} -``` - -## `as_writable_bytes` - -If `T` isn't **`const`**, gets a read/write view of the raw byte representation of the elements in the span. - -```cpp -template -auto as_writable_bytes(span s) noexcept; -``` - -### Parameters - -*T*\ -The type of the elements in the span. - -*Extent*\ -The number of elements in the span (if known at compile time), otherwise `dynamic_extent` indicating that the number of elements isn't known until runtime. - -*s*\ -The span to get the raw representation of. - -### Return Value - -A `span` to the first item stored in the span where `S` is `{reinterpret_cast(s.data()), s.size_bytes()}` - -### Example - -```cpp -#include -#include - -using namespace std; - -void main() -{ - int a[] = { 0,1,2 }; - span mySpan(a); - auto bytes = as_writable_bytes(mySpan); -} -``` - -## See also - -[\](span.md) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index 4172b3d7d80..24d41dde720 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -1,40 +1,128 @@ --- -title: "<ranges>" +title: "" description: "API reference for the Standard Template Library (STL) ranges namespace, which provides ... JTW" ms.date: "04/13/2021" f1_keywords: [""] helpviewer_keywords: ["ranges header"] --- -# <ranges> +# `` -A `range` is a ... +A `range`, at its most basic, is a collection of things that you can iterate over. -See [span class](span-class.md) for detailed information. Here's an example of how a span can be used: +The STL library contains many algorithms that take an iterator. You often pass a Begin(), End() iterator to define the items you want to process. That is flexible, but makes for a certain code wordiness. Rather than reverse a list, say, you have to pass a pair of iterators that define the boundaries of which parts of the list you want to reverse, and then pass the list along with that to a function to reverse them. Wouldn't it be nice if you could just pass the list and be done with it. Ranges allow this. -```cpp -#include +Saying that somehting is a range is essentially saying that it can be iterated over, which means that it has a begin, it has an end and they both return something that behaves essentially like an iterator. It’s a vague definition but they’re are a lot of things to fit into that definition and one of the is the STL containers, like std::vector for example. + +You can think of a range as two iterators that refer to the beginning and end of a group of elements that you can iterate over. Because all containers support iterators, every container can be thought of as a range. Since all algorithms from Boost.Range expect a range as a first parameter, a container like std::vector can be passed directly. You don’t have to call begin() and end() and then pass two iterators separately. This protects you from mistakes such as passing the begin and end iterator in the wrong order or passing iterators that belong to two different containers. https://theboostcpplibraries.com/boost.range-algorithms + +hanks to the ranges library in C++20, working with the Standard Template Library (STL) will become much more comfortable and powerful. The algorithms of the ranges library are lazy, can work directly on the container and can easily be composed. To make it short: The comfort and the power of the ranges library are due to its functional ideas. Let me show you what that means. + +I really like this intro to the types: + +https://www.modernescpp.com/index.php/c-20-the-ranges-library + + +https://www.modernescpp.com/index.php/c-20-the-ranges-librar +// rangesFilterTransform.cpp + +#include +#include +#include + +int main() { + + std::vector numbers = {1, 2, 3, 4, 5, 6}; + + auto results = numbers | std::views::filter([](int n){ return n % 2 == 0; }) + | std::views::transform([](int n){ return n * 2; }); + + for (auto v: results) std::cout << v << " "; // 4 8 12 + +} +You have to read the expression from left to right. The pipe symbol stands for function composition: First, all numbers can pass which are even (std::views::filter([](int n){ return n % 2 == 0; })). Afterwards, each remaining number is mapped to its double (std::views::transform([](int n){ return n * 2; })). The small example shows already two new features of the ranges library: Function composition which operators on the entire container. + +Now you should be prepared for the details. Let's go back to square one: ranges and views are concepts. +Ranges are an abstraction of “a collection of items”, or “something iterable”. + +example: + +#include +#include #include -void Show(std::span someValues) +int main() { - // show values in reverse - for (auto rIt = someValues.rbegin(); rIt != someValues.rend(); ++rIt) - { - std::cout << *rIt; - } - - // show a subspan - for (auto& i : someValues.subspan(1, 2)) - { - std::cout << i; - } + std::array a{{0, 1, 0, 1, 0, 1}}; + std::cout << boost::count(a, 0) << '\n'; } +example: https://www.modernescpp.com/index.php/c-20-the-ranges-library + +// rangesFilterTransform.cpp + +#include +#include +#include + +int main() { + + std::vector numbers = {1, 2, 3, 4, 5, 6}; + + auto results = numbers | std::views::filter([](int n){ return n % 2 == 0; }) + | std::views::transform([](int n){ return n * 2; }); + + for (auto v: results) std::cout << v << " "; // 4 8 12 + +} + + +most generic algorithms take a couple interators + +compose algorithms + +example: filter a vector of numbers. I think I saw that in the other example as well. +https://www.fluentcpp.com/2018/02/09/introduction-ranges-library/ + +===> https://hannes.hauswedell.net/post/2019/11/30/range_intro/ ** this could be it. + +C++20 introduces the notion of ranges and provides algorithms that accept such in the namespace std::ranges::, e.g. std::ranges::sort(v) now works if v is range – and vectors are ranges! <-- works for us? + + +a Range does not necessarily own the elements that can be accessed through it, have copy semantics, - https://www.boost.org/doc/libs/1_67_0/libs/range/doc/html/range/concepts/overview.html + +The operations that can be performed on a Range is dependent on the traversal category of the underlying iterator type. Therefore the range concepts are named to reflect which traversal category its iterators support. See also terminology and style guidelines. for more information about naming of ranges. + +sorting only all elements after the fifth one: +1std::ranges::sort(std::views::drop(v, 5)); +sorting in reverse order: +1std::ranges::sort(std::views::reverse(v)) + +range adaptors https://www.boost.org/doc/libs/1_67_0/libs/range/doc/html/range/reference/adaptors/introduction.html + +Range algorithms + +In its most simple form a Range Algorithm (or range-based algorithm) is simply an iterator-based algorithm where the two iterator arguments have been replaced by one range argument. For example, we may write + +#include +#include + +std::vector vec = ...; +boost::sort(vec); +instead of + +std::sort(vec.begin(), vec.end()); +However, the return type of range algorithms is almost always different from that of existing iterator-based algorithms. + +Here's an example of how a span can be used: + +```cpp +#include +#include + int main() { int numbers[]{ 0,1,2,3,4 }; - Show(numbers); // note conversion from array to span } ``` @@ -46,34 +134,18 @@ int main() **Compiler option:** [/std:c++latest](../build/reference/std-specify-language-standard-version.md) -## Members - -### Classes -|Name|Description| -|-|:-| -|[ranges](span-class.md)| Provides a view over a contiguous sequence of objects. | +View adaptors +See https://www.fluentcpp.com/2018/02/09/introduction-ranges-library/ +lazy eval -### Operators -|Name|Description| -|-|:-| -|[operator=](span-class.md#op_eq)| Span assignment | -|[operator\[\]](span-class.md#op_at)| Element access | - -### Functions - -|Name|Description| -|-|:-| -| [as_bytes](span-functions.md#as_bytes)| Get the underlying read-only bytes of the span. | -| [as_writable_bytes](span-functions.md#as_writable_bytes) | Get the underlying bytes of the span. | - -### Constants - -|Name|Description| -|-|:-| -| **dynamic_extent** | Indicates that the span size is determined at runtime rather than compile time. When the number of elements in the span is known at compile time, it's specified as the `Extent` template parameter. When the number isn't known until runtime, specify `dynamic_extent` instead. | ## See also [Header Files Reference](../standard-library/cpp-standard-library-header-files.md) + + +LINKS I LIKE +-------------- +https://www.modernescpp.com/index.php/c-20-the-ranges-library diff --git a/docs/standard-library/toc.yml b/docs/standard-library/toc.yml index a3ef6345d28..8170b8f123d 100644 --- a/docs/standard-library/toc.yml +++ b/docs/standard-library/toc.yml @@ -849,10 +849,6 @@ items: - name: href: ../standard-library/ranges.md - - name: functions - href: ../standard-library/ranges-functions.md - - name: ranges class - href: ../standard-library/ranges-class.md - name: href: ../standard-library/ratio.md - name: From c16094892a237f57f632b87eb54b96467c7f6aac Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 8 Apr 2021 16:39:27 -0700 Subject: [PATCH 54/82] tech review --- docs/build/reference/headerunit.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index b4815b99a71..63da823a4da 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -35,9 +35,9 @@ When the compiler comes across `import "file";` or `import `, this compile **`/headerUnit`** looks up the compiled header unit in the current directory, or at the location specified in *`ifc-filename`*. -**`/headerUnit:quote`** looks up the compiled header unit file using the same rules as `#include "file"`. This switch acts like a flag and can take, but doesn't require, an argument. +**`/headerUnit:quote`** looks up the compiled header unit file using the same rules as `#include "file"`. -**`/headerUnit:angle`** looks up the compiled header unit file using the same rules as `#include `. This switch acts like a flag and can take, but doesn't require, an argument. +**`/headerUnit:angle`** looks up the compiled header unit file using the same rules as `#include `. The compiler can't map a single *`header-name`* to multiple IFC files. While mapping multiple *`header-name`* arguments to a single IFC is possible, we don't recommend it. The contents of the IFC get imported as if it was only the header specified by *`header-name`*. From 396015482d94dac788910a3e5e6806cce8db1e0c Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 8 Apr 2021 19:14:48 -0700 Subject: [PATCH 55/82] draft --- docs/standard-library/ranges.md | 89 +++++++++++++++++++++++++++++++-- docs/standard-library/span.md | 4 +- 2 files changed, 88 insertions(+), 5 deletions(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index 24d41dde720..e39ab74a5ab 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -6,23 +6,104 @@ f1_keywords: [""] helpviewer_keywords: ["ranges header"] --- +introduction - what is a range + motivations/advantages + example +range adaptors + example +view adaptors + https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ (good range/view examples, composability) + example + + # `` +INTRO: + +From eric niebler +Ranges are an extension of the Standard Template Library that makes its iterators and algorithms more powerful by making them composable. Unlike other range-like solutions which seek to do away with iterators, in range-v3 ranges are an abstration layer on top of iterators. + +Range-v3 is built on three pillars: Views, Actions, and Algorithms. The algorithms are the same as those with which you are already familiar in the STL, except that in range-v3 all the algorithms have overloads that take ranges in addition to the overloads that take iterators. Views are composable adaptations of ranges where the adaptation happens lazily as the view is iterated. And an action is an eager application of an algorithm to a container that mutates the container in-place and returns it for further processing. + +Views and actions use the pipe syntax (e.g., rng | adapt1 | adapt2 | ...) so your code is terse and readable from left to right. + +http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4128.html#design-goals +Ranges (not Iterables) are copyable and assignable. They don't own the elements like, say, a container + + +> what it is - anything you can iterate through (docs.microsoft.com when talking about range-based for) +Essentially, a range is something that can be traversed. More precisely, a range is something that has a begin() and an end() method, that return objects (iterators) that let you iterate over the range (that is, move along the elements of the range, and be dereferenced to access these elements). - https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ +With ranges though, you generally don’t see iterators. They are here, but abstracted away by the concept of range. Iterators are technical constructs that let you iterate over a collection, but they are generally too technical for your functional code. Most of the time, what you are really trying to represent is a range, which corresponds better to the level of abstraction of your code. Like a range of cash flows, a range of lines in a screen, or a range of entries coming up from the database. + +So coding in terms of ranges is a huge improvement, because in that sense iterators violate the principle of respecting levels of abstraction, which I deem is the most important principle for designing good code. + +In range libraries, STL algorithms are redefined to take directly ranges as parameters, instead of two iterators, like: + +ranges::transform(input, std::back_inserter(output), f); +As opposed to: + +std::transform(input.begin(), input.end(), std::back_inserter(output), f); +Such algorithms reuse the STL versions in their implementation, by forwarding the begin and the end of the range to the native STL versions. + + +> an example +> the different types of ranges (input_range, output_range, etc. see https://www.modernescpp.com/index.php/c-20-the-ranges-library and search :input_range) +> List of containers the range types can work with (same link as above) +> What a View is: https://www.modernescpp.com/index.php/c-20-the-ranges-library + A View is something that you apply on a range and performs some operation. A view does not own data and it's time to copy, move, assignment its constant. + Lazy + std::vector numbers = {1, 2, 3, 4, 5, 6}; + auto results = numbers | std::views::filter([](int n){ return n % 2 == 0; }) + | std::views::transform([](int n){ return n * 2; }); +> What is a range adaptor: +A range adaptor is an object that can be combined with a range in order to produce a new range. + https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ + With the following collection of numbers: + + std::vector numbers = { 1, 2, 3, 4, 5 }; + The range + + auto range = numbers | view::transform(multiplyBy2); + is a view over the vector numbers that has the iteration behaviour of a transform_iterator with the function multiplyBy2. So when you iterate over this view, the results you get are all these numbers, multiplied by 2. For instance: + + ranges::accumulate(numbers | view::transform(multiplyBy2), 0); + returns 1*2 + 2*2 + 3*2 + 4*2 + 5*2 = 30 (similarly to std::accumulate, ranges::accumulate does the sum of the elements of the range it is passed to). + + + +List of views: https://www.modernescpp.com/index.php/c-20-the-ranges-library + +> What's a range adaptor: A range adaptor is an object that can be combined with a range in order to produce a new range. A subpart of them are view adaptors: with them, the initial adapted range remains unchanged, while the produced range does not contain elements because it is rather a view over the initial one, but with a customized iteration behaviour. See https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ +> View adaptors: https://www.fluentcpp.com/2018/02/09/introduction-ranges-library/ +auto evenNumbers = numbers | ranges::view::filter([](int n){ return n % 2 == 0; }); Same as above? + +We can plug as many view adaptors as we like. For example let me plug a transform adaptor with a function that multiplies a number by 2. + +auto evenNumbers = numbers | ranges::view::filter([](int n){ return n % 2 == 0; }) + | ranges::view::transform([](int n) { return n * 2; }); + A `range`, at its most basic, is a collection of things that you can iterate over. The STL library contains many algorithms that take an iterator. You often pass a Begin(), End() iterator to define the items you want to process. That is flexible, but makes for a certain code wordiness. Rather than reverse a list, say, you have to pass a pair of iterators that define the boundaries of which parts of the list you want to reverse, and then pass the list along with that to a function to reverse them. Wouldn't it be nice if you could just pass the list and be done with it. Ranges allow this. +https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ + +All algorithms manipulate iterators pointing into the collection they operate on. While this is handy in specific cases like stopping at a precise point in a container, the largely general case is to traverse the whole container from its .begin() to its .end().Therefore, portions of code that use the STL end up being littered with iterators: +std::copy(v1.begin(), v1.end(), std::back_inserter(v2)); +std::set_difference(v2.begin(), v2.end(), v3.begin(), v3.end(), std::back_inserter(v4)); +std::transform(v3.begin(), v3.end(), std::back_inserter(v4)); + +Composability: https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ Not sure I want to talk about this. + Saying that somehting is a range is essentially saying that it can be iterated over, which means that it has a begin, it has an end and they both return something that behaves essentially like an iterator. It’s a vague definition but they’re are a lot of things to fit into that definition and one of the is the STL containers, like std::vector for example. You can think of a range as two iterators that refer to the beginning and end of a group of elements that you can iterate over. Because all containers support iterators, every container can be thought of as a range. Since all algorithms from Boost.Range expect a range as a first parameter, a container like std::vector can be passed directly. You don’t have to call begin() and end() and then pass two iterators separately. This protects you from mistakes such as passing the begin and end iterator in the wrong order or passing iterators that belong to two different containers. https://theboostcpplibraries.com/boost.range-algorithms -hanks to the ranges library in C++20, working with the Standard Template Library (STL) will become much more comfortable and powerful. The algorithms of the ranges library are lazy, can work directly on the container and can easily be composed. To make it short: The comfort and the power of the ranges library are due to its functional ideas. Let me show you what that means. +thanks to the ranges library in C++20, working with the Standard Template Library (STL) will become much more comfortable and powerful. The algorithms of the ranges library are lazy, can work directly on the container and can easily be composed. To make it short: The comfort and the power of the ranges library are due to its functional ideas. Let me show you what that means. I really like this intro to the types: https://www.modernescpp.com/index.php/c-20-the-ranges-library - - https://www.modernescpp.com/index.php/c-20-the-ranges-librar // rangesFilterTransform.cpp @@ -149,3 +230,5 @@ lazy eval LINKS I LIKE -------------- https://www.modernescpp.com/index.php/c-20-the-ranges-library +https://www.fluentcpp.com/2018/02/09/introduction-ranges-library/ +https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ diff --git a/docs/standard-library/span.md b/docs/standard-library/span.md index 56cb3153625..b88fbc00dae 100644 --- a/docs/standard-library/span.md +++ b/docs/standard-library/span.md @@ -1,12 +1,12 @@ --- -title: "<span>" +title: "" description: "API reference for the Standard Template Library (STL) span namespace, which provides a lightweight view over a contiguous sequence of objects." ms.date: "05/28/2020" f1_keywords: [""] helpviewer_keywords: ["span header"] --- -# <span> +# `` A `span` is a view over a contiguous sequence of objects. It provides fast and bounds-safe access. Unlike `vector` or `array`, it doesn't "own" the elements it provides access to. From 59550447c210aa188c81dd488140050f15b14bb1 Mon Sep 17 00:00:00 2001 From: Tyler Whitney Date: Thu, 8 Apr 2021 19:18:18 -0700 Subject: [PATCH 56/82] Update docs/build/reference/translateinclude.md Co-authored-by: Stephan T. Lavavej --- docs/build/reference/translateinclude.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/reference/translateinclude.md b/docs/build/reference/translateinclude.md index deaf09a25c2..864d6eeb7d7 100644 --- a/docs/build/reference/translateinclude.md +++ b/docs/build/reference/translateinclude.md @@ -63,7 +63,7 @@ cl /IC:\ /translateInclude /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit ## To set this compiler option in the Visual Studio development environment -To enable `/TranslateInclude`, set the **Translate Includes to Imports** option in project properties: +To enable `/translateInclude`, set the **Translate Includes to Imports** option in project properties: 1. In the left-hand pane of the project property pages, select **Configuration Properties** > **C/C++** > **General** 1. Change the **Translate Includes to Imports** dropdown to **Yes** @@ -74,4 +74,4 @@ To enable `/TranslateInclude`, set the **Translate Includes to Imports** option [`/headerUnit` (Use header unit IFC)](headerunit.md).\ [`/exportHeader` (Create header units)](module-exportheader.md)\ -[`/reference` (Use named module IFC)](module-reference.md) \ No newline at end of file +[`/reference` (Use named module IFC)](module-reference.md) From 1e0b8f9728b72675a906e5f6df70d4152184f0d6 Mon Sep 17 00:00:00 2001 From: Tyler Whitney Date: Thu, 8 Apr 2021 19:18:52 -0700 Subject: [PATCH 57/82] Update docs/build/reference/headername.md Co-authored-by: Stephan T. Lavavej --- docs/build/reference/headername.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/reference/headername.md b/docs/build/reference/headername.md index a2b444ac479..8d1d2ef2ba2 100644 --- a/docs/build/reference/headername.md +++ b/docs/build/reference/headername.md @@ -26,7 +26,7 @@ The name of a header file that the compiler should compile into a header unit (a The **`/headerName`** compiler option is available starting in Visual Studio 2019 version 16.10 preview 2.\ The **`/headerName`** compiler option, in all its forms, requires the [/std:c++latest](std-specify-language-standard-version.md) option.\ -If you specify **`/headerName{quote,angle}`**, you must also specify [`/exportHeader`](module-exportheader.md). +If you specify **`/headerName:{quote,angle}`**, you must also specify [`/exportHeader`](module-exportheader.md). **`/headerName:quote`** looks up *`header-filename`* using the same rules as `#include "header-name"` and build it as a header unit (*`.ifc`* file).\ **`/headerName:angle`** looks up *`header-filename`* using the same rules as `#include ` and build it as a header unit (*`.ifc`* file). @@ -70,4 +70,4 @@ $ cl /std:c++latest /exportHeader /headerName:angle /MP /Fo.\ vector iostream al [`/exportHeader` (Create header units)](module-exportheader.md)\ [`/headerUnit` (Create header units)](headerunit.md)\ [`/reference` (Use named module IFC)](module-reference.md)\ -[`/translateInclude` (Translate include directives into import directives)](translateinclude.md) \ No newline at end of file +[`/translateInclude` (Translate include directives into import directives)](translateinclude.md) From 78370644fb3d46e5b3aca473ce31b528568c270d Mon Sep 17 00:00:00 2001 From: Tyler Whitney Date: Thu, 8 Apr 2021 19:27:52 -0700 Subject: [PATCH 58/82] Update docs/build/reference/headerunit.md Co-authored-by: Stephan T. Lavavej --- docs/build/reference/headerunit.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index 63da823a4da..c2e3a9aec27 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -31,7 +31,7 @@ The **`/headerUnit`** compiler option requires the [/std:c++latest](std-specify- The **`/headerUnit`** compiler option is available starting in Visual Studio 2019 version 16.10 preview 2. -When the compiler comes across `import "file";` or `import `, this compiler switch helps the compiler find the compiled header unit (*`.ifc`*) for the specified header file. The path to this file can be expressed in three ways: +When the compiler comes across `import "file";` or `import ;`, this compiler switch helps the compiler find the compiled header unit (*`.ifc`*) for the specified header file. The path to this file can be expressed in three ways: **`/headerUnit`** looks up the compiled header unit in the current directory, or at the location specified in *`ifc-filename`*. @@ -68,4 +68,4 @@ You normally shouldn't set this in the Visual Studio development environment. It [`/exportHeader` (Create header units)](module-exportheader.md)\ [`/headerName` (Create a header unit from the specified header)](headername.md)\ -[`/reference` (Use named module IFC)](module-reference.md)\ \ No newline at end of file +[`/reference` (Use named module IFC)](module-reference.md)\ From 94454f62a53b79182c3f664266550d432a6a4659 Mon Sep 17 00:00:00 2001 From: Tyler Whitney Date: Thu, 8 Apr 2021 19:28:15 -0700 Subject: [PATCH 59/82] Update docs/build/reference/module-reference.md Co-authored-by: Stephan T. Lavavej --- docs/build/reference/module-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/reference/module-reference.md b/docs/build/reference/module-reference.md index 43bb163f67b..853bc3ed540 100644 --- a/docs/build/reference/module-reference.md +++ b/docs/build/reference/module-reference.md @@ -76,6 +76,6 @@ cl ... /std:c++latest /reference m=m.ifc /reference M:Part1=m-part.ifc /referenc ## See also -[`/sourcedependencies:directives` (use header file to header unit allow-list)](sourcedependencies-directives.md)\ +[`/sourceDependencies:directives` (use header file to header unit allow-list)](sourcedependencies-directives.md)\ [`/headerUnit` (Use header unit IFC)](headerunit.md)\ [`/exportHeader` (Create header units)](module-exportheader.md)\ From 47ff9acc1280c1c5f91e7dd56455e101a6ff64d6 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 8 Apr 2021 19:43:07 -0700 Subject: [PATCH 60/82] tech review --- docs/build/reference/sourcedependencies-directives.md | 5 +++-- docs/build/reference/sourcedependencies.md | 5 +++-- docs/build/walkthrough-header-units.md | 2 +- docs/build/walkthrough-import-stl-header-units.md | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/build/reference/sourcedependencies-directives.md b/docs/build/reference/sourcedependencies-directives.md index 73a3532e11f..fe6734f799f 100644 --- a/docs/build/reference/sourcedependencies-directives.md +++ b/docs/build/reference/sourcedependencies-directives.md @@ -23,8 +23,9 @@ This command-line option is similar to [`/sourceDependencies`](sourcedependencie ## Syntax -> **`/sourceDependencies:directives[-]`** *filename*\ -> **`/sourceDependencies:directives[-]`** *directory* +> **`/sourceDependencies:directives`** -\ +> **`/sourceDependencies:directives`** *filename*\ +> **`/sourceDependencies:directives`** *directory*\ ## Arguments diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index bf09530d35a..f5de91e0325 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -20,8 +20,9 @@ This provides information necessary to build modules and header units in the pro ## Syntax -> **`/sourceDependencies[-]`** *filename*\ -> **`/sourceDependencies[-]`** *directory*\ +> **`/sourceDependencies`** -\ +> **`/sourceDependencies`** *filename*\ +> **`/sourceDependencies`** *directory*\ ## Arguments diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 8c80172e616..d7de5bb6a22 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -88,7 +88,7 @@ For source files (or header files that don't have a `.h` or `.hpp` extension): ### Change your code to import a header unit -In the source file for the example project, the file that contains `main()`, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). When you're compiling a header unit from a system header, use angle brackets (`#import ;`). If it's a project header, use `import "file";` +In the source file for the example project, the file that contains `main()`, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). When you're compiling a header unit from a system header, use angle brackets (`import ;`). If it's a project header, use `import "file";` Build the solution (**Build** > **Build Solution** from the main menu) and run it to see that it produces the expected output: `Pythagorean triple a:2 b:3 c:13` diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index fb8046eeb20..5e86f2858d6 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -82,7 +82,7 @@ Follow these steps to set the options that cause the build system to scan for im 1. From the main menu, choose **Project** > **Properties**. The project properties window appears: ![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) -1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings we will change so they apply whether you are building for debug or retail, and so on. +1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings we will change so they apply whether you are building for debug or release, and so on. 1. In the left-hand pane of the project property page, select **C/C++** > **General** 1. Set **Scan Sources for Module Dependencies** to **Yes** Because we're setting the project property, all sources in this project will be scanned. This could be set at the file level, but here we scan the entire project. From 75b5db8e422a2df23f78745b1c123bf142846779 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 8 Apr 2021 19:55:01 -0700 Subject: [PATCH 61/82] fix link text --- docs/build/reference/module-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/reference/module-reference.md b/docs/build/reference/module-reference.md index 853bc3ed540..c092ae3796d 100644 --- a/docs/build/reference/module-reference.md +++ b/docs/build/reference/module-reference.md @@ -76,6 +76,6 @@ cl ... /std:c++latest /reference m=m.ifc /reference M:Part1=m-part.ifc /referenc ## See also -[`/sourceDependencies:directives` (use header file to header unit allow-list)](sourcedependencies-directives.md)\ +[`/sourceDependencies:directives` (List module and header unit dependencies)](sourcedependencies-directives.md)\ [`/headerUnit` (Use header unit IFC)](headerunit.md)\ [`/exportHeader` (Create header units)](module-exportheader.md)\ From 03eb188b5e67fbe931aeafccf8a67c78994cc3da Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 9 Apr 2021 07:50:59 -0700 Subject: [PATCH 62/82] draft --- docs/standard-library/ranges.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index e39ab74a5ab..80fac571081 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -9,12 +9,30 @@ helpviewer_keywords: ["ranges header"] introduction - what is a range motivations/advantages example -range adaptors + +It’s been 20 years since the STL was standardized, and all I want to do is pass a vector to sort. Is that too much to ask? Nope. With C++20, you will finally be able to do this: https://ericniebler.com/2018/12/05/standard-ranges/ + +std::vector< int > v = // ... +std::ranges::sort( v ); // Hurray! + +Pillars: https://github.com/ericniebler/range-v3 +Views - Views are composable adaptations of ranges where the adaptation happens lazily as the view is iterated. +Actions - an action is an eager application of an algorithm to a container that mutates the container in-place and returns it for further processing. +Algorithms + +range adaptors : https://ericniebler.com/2018/12/05/standard-ranges/ example + Also The true power of ranges lies in the ability to create pipelines that transform ranges on the fly https://ericniebler.com/2018/12/05/standard-ranges/ + but these may be out of date - verify in product view adaptors https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ (good range/view examples, composability) example +Views and actions use the pipe syntax (e.g., rng | adapt1 | adapt2 | ...) so your code is terse and readable from left to right. + +Range algorithms available (casey list): +https://devblogs.microsoft.com/cppblog/initial-support-for-c20-ranges/ + # `` From 0a8efd34c5cf2501722567d4e46c06d7bd700740 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 9 Apr 2021 09:02:39 -0700 Subject: [PATCH 63/82] pr review feedback + tech review feedback --- .../sourcedependencies-directives.md | 2 +- docs/build/reference/translateinclude.md | 2 +- docs/build/walkthrough-header-units.md | 50 +++++----- .../walkthrough-import-stl-header-units.md | 97 ++++++++++--------- 4 files changed, 80 insertions(+), 71 deletions(-) diff --git a/docs/build/reference/sourcedependencies-directives.md b/docs/build/reference/sourcedependencies-directives.md index fe6734f799f..0d74ebcda86 100644 --- a/docs/build/reference/sourcedependencies-directives.md +++ b/docs/build/reference/sourcedependencies-directives.md @@ -94,7 +94,7 @@ We've used `...` to abbreviate the reported paths; the report contains the absol No *`.ifc`* files are listed in the output because they weren't built. Unlike `/sourceDependencies`, the compiler doesn't produce compiled output when `/sourceDependencies:directives`is specified, so no compiled modules or header units are produced to import. -## To set this compiler option in the Visual Studio development environment +## To set this compiler option in Visual Studio You normally shouldn't set this yourself in the Visual Studio development environment. It is set by the build system. diff --git a/docs/build/reference/translateinclude.md b/docs/build/reference/translateinclude.md index 864d6eeb7d7..fbfcfc435c5 100644 --- a/docs/build/reference/translateinclude.md +++ b/docs/build/reference/translateinclude.md @@ -61,7 +61,7 @@ If an `#include` is encountered that doesn't have a corresponding header unit sp cl /IC:\ /translateInclude /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit C:\app\app.h=C:\app.h.ifc ``` -## To set this compiler option in the Visual Studio development environment +## To set this compiler option in Visual Studio To enable `/translateInclude`, set the **Translate Includes to Imports** option in project properties: diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index d7de5bb6a22..deab55ee7b7 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -37,7 +37,7 @@ There are several ways to compile a file into a header unit: - Automatically scan for header units: This approach is best suited to smaller projects that include many different header files. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it's better suited to smaller projects is because it can't guarantee optimal build throughput since it has to scan all of the files to find what should be built into header units. This scanning can be done at the project level for all source files, or at the individual file level if you want to manually specify which headers to compile into header units. -- Build a shared header units project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library project (or projects) that contain the header units that you want. Then reference the library project (or projects) from the project that then imports the header units it needs. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. +- Build a shared header unit project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library project (or projects) that contain the header units that you want. Then reference the library project (or projects) from the project that then imports the header units it needs. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. - Choose individual header units to build by changing the compilation action for a file. This approach is demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's also a good way to quickly and selectively try out header units in your project. @@ -47,44 +47,46 @@ In this example, you'll compile a header file as a header unit. Begin by creatin 1. Create a new C++ console app project. 1. Replace the source file contents as follows: -```cpp -#include "Pythagorean.h" - -int main() -{ - PrintPythogoreanTriple(2,3); - return 0; -} -``` + ```cpp + #include "Pythagorean.h" + + int main() + { + PrintPythogoreanTriple(2,3); + return 0; + } + ``` 1. Add a header file called `Pythagorean.h`, and replace its contents with the following: -```cpp -#pragma once -#include - -void PrintPythogoreanTriple(int a, int b) -{ - std::cout << "Pythagorean triple a:" << a << " b:" << b << " c:" << a*a + b*b << std::endl; -} -``` + ```cpp + #pragma once + #include + + void PrintPythogoreanTriple(int a, int b) + { + std::cout << "Pythagorean triple a:" << a << " b:" << b << " c:" << a*a + b*b << std::endl; + } + ``` To enable header units, first set the project C++ language standard to use the latest features: 1. Right-click the project in the **Solution Explorer** and select **Properties**. 1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** 1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft** -![Set language standard to preview version](media/set-cpp-language-latest.png) +:::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing setting the language standard to preview version."::: ### Compile a header file as a header unit In the **Solution Explorer**, select the file you want to compile as a header unit. Right-click the file, and select **Properties**. Then do one of the following, depending on the file type: For header files: -- Set the **Item Type** property to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header**. Setting this property also sets **C/C++** > **Advanced** > **Compile As** to **Compile as C++ Header Unit (/exportHeader)** for you. -![Changing the item type to c/c++ compiler](media/change-item-type.png) + +Set the **Item Type** property to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header**. Setting this property also sets **C/C++** > **Advanced** > **Compile As** to **Compile as C++ Header Unit (/exportHeader)** for you. +:::image type="content" source="media/change-item-type.png" alt-text="Screenshot showing changing the item type to c/c++ compiler."::: For source files (or header files that don't have a `.h` or `.hpp` extension): -- Set the **Compile As** property to **Compile as C++ Header Unit (/exportHeader)**. -![Changing Compile As to Compile as C++ Header Unit ](media/change-compile-as.png) + +Set the **Compile As** property to **Compile as C++ Header Unit (/exportHeader)**. +:::image type="content" source="media/change-compile-as.png" alt-text="Screenshot showing changing Compile As to Compile as C++ Header Unit."::: ### Change your code to import a header unit diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 5e86f2858d6..179044ceb3c 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -35,7 +35,7 @@ Before an STL header can be imported, it must be compiled into a header unit. Th At a high level, this works by scanning your sources for `import "header";` and `import
    ;` statements, and tries to compile those header files and their dependencies into header units. It then imports the compiled header unit files (*`.ifc`*) instead of running the header file through the preprocessor. -It may not be the optimal approach for larger projects because it can't guarantee optimal build times since it needs to scan through the files to find the headers to build into header units. It may result in reprocessing the same header files repeatedly, increasing build time. Also, not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. If a header file can't be compiled into a header unit, it will be treated as a normal `#include` file. +It may not be the optimal approach for larger projects because it doesn't guarantee optimal build times as it needs to scan through the files to find the headers to build into header units. It may result in reprocessing the same header files repeatedly, increasing build time. Also, not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. If a header file can't be compiled into a header unit, it will be treated as a normal `#include` file. See [Approach 1: Scan for headers](#approach1), in this article, for a walkthrough of this approach. @@ -47,7 +47,7 @@ See [Approach 2: Build a static library project](#approach2), in this article, f ## Approach 1: Scan for imports -We'll begin with the easiest way to import STL libraries as header units. This approach may not be appropriate for larger projects because it can't guarantee the most optimal build time due to scanning the sources for `import` statements. +We'll begin with the easiest way to import STL libraries as header units. This approach may not be appropriate for larger projects because it doesn't guarantee the most optimal build time due to scanning the sources for `import` statements. This option is convenient for codebases that use many different headers, and where build throughput isn't critical. This option doesn't guarantee a header unit for a particular header will be built only once, whereas header units built into referenced static libraries projects are reused. @@ -65,17 +65,17 @@ To demonstrate this approach, we'll create a project that imports two STL librar This step creates a project that includes two libraries: `` and ``. You'll modify the project settings so that the project is scanned for potential header files that can be compiled into header units. 1. With Visual Studio, create a new C++ console app project. 1. Modify the source file as follows: -```cpp -import ; -import ; - -int main() -{ - std::vector numbers = {0, 1, 2}; - std::cout << numbers[1]; -} -``` - + ```cpp + import ; + import ; + + int main() + { + std::vector numbers = {0, 1, 2}; + std::cout << numbers[1]; + } + ``` + ### Set project options and run the project Follow these steps to set the options that cause the build system to scan for imported headers to compile into header units: @@ -90,9 +90,7 @@ Change the C++ language standard for the compiler. The latest preview setting is 1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** 1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft** - ![Set language standard to preview version](media/set-cpp-language-latest.png) - 1. Click **OK** to close the project properties pages, and then build the solution: **Build** > **Build Solution** from the main menu. You can run the solution to verify that it produces the expected output: `1` @@ -107,21 +105,21 @@ The more flexible way to consume STL headers is to create one or more static lib This option ensures that header units for a particular header will be built only once. It's similar to using a shared precompiled header file, but is much easier. -In this example, you'll create a project that imports `` and ``. Once built, you'll reference this shared header units project from another C++ project. Then, in the referencing project, everywhere `import ;` or `import ;` is found, it will import the built header unit for that library instead of running the contents of the library header through the preprocessor. In projects that include the same library header in multiple files, this will improve build performance similarly to how PCH files do because the header won't have to be processed over and over by the files that include it. Instead, the already processed compiled header unit will be imported. +In this example, you'll create a project that imports `` and ``. Once built, you'll reference this shared header unit project from another C++ project. Then, in the referencing project, everywhere `import ;` or `import ;` is found, it will import the built header unit for that library instead of running the contents of the library header through the preprocessor. In projects that include the same library header in multiple files, this will improve build performance similarly to how PCH files do because the header won't have to be processed over and over by the files that include it. Instead, the already processed compiled header unit will be imported. -### Create the shared header units project +### Create the shared header unit project -Begin by creating the project for the shared header units as follows: +Begin by creating the project for the shared header unit as follows: 1. Create an Empty C++ project. Call it, for the sake of this example, **SharedPrj**.\ **Empty C++ project** is one of the project types available on the **Create a new project** window: -![Create a new empty C++ project](media/empty-project-option.png) +:::image type="content" source="media/empty-project-option.png" alt-text="Screenshot showing creating a new empty C++ project."::: 1. Add a new (empty) C++ file to the project. Change the file's contents to the following: -```cpp -import ; -import ; -``` + ```cpp + import ; + import ; + ``` ### Set project properties @@ -134,37 +132,37 @@ Set project properties to share the header units from this project: 1. Change the **Configuration Type** option to **Static library (.lib)** 1. Change **C++ Language Standard** to **Preview-Features from the Latest C++ Working Draft** 1. In the left-hand pane of the project property page, select **C/C++** > **General** -![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) +:::image type="content" source="media/vs2019-scan-module-dependencies.png" alt-text="Screenshot showing the scan module dependencies property setting."::: 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** 1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu. -## Reference the STL header unit project +## Reference the shared header unit project -Next, create a project that will use the built `` and `` STL header unit project: +Next, create a project that will use the built `` and `` shared header project: 1. With the current solution still open, from the Visual Studio menu select **File** > **Add** > **New Project** 1. Add a C++ Console app project. Call it **Walkthrough**, for this example 1. Change the contents of its source file as follows: -```cpp -import ; -import ; - -int main() -{ - std::vector numbers = {0, 1, 2}; - std::cout << numbers[1]; -} -``` + ```cpp + import ; + import ; + + int main() + { + std::vector numbers = {0, 1, 2}; + std::cout << numbers[1]; + } + ``` Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: 1. In the **Solution Explorer**, select right-click the **Walkthrough** project and select **Properties**. The project properties window appears. -![Set language standard to preview version](media/set-cpp-language-latest.png) +:::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing setting the language standard to preview version"::: 1. In the left-hand pane of the **Walkthrough** project property pages, select **Configuration Properties** > **General** 1. Change **C++ Language Standard** to **Preview-Features from the Latest C++ Working Draft** 1. Click **OK** to close the project properties pages 1. Add a reference from the **Walkthrough** project to the **SharedPrj** project. To do so, under the **Walkthrough** project, click on the **References** node, and select **Add Reference**. Select **SharedPrj** from the list of projects. -![Add reference dialog. Used to add a reference to the Walkthough project](./media/add-reference-to-walkthrough.png) +:::image type="content" source="./media/add-reference-to-walkthrough.png" alt-text="Screenshot showing the add reference dialog. Used to add a reference to the Walkthough project."::: What this reference accomplishes is that the build system will use the header units built into **SharedPrj** whenever an `import` in the **Walkthrough** project matches one of the built header units in **SharedPrj** 1. Click **OK** to close the **Add Reference** dialog 1. Right-click the **Walkthrough** project and select **Set as Startup Project** @@ -173,18 +171,26 @@ Then you can build the solution (**Build** > **Build Solution** from the main me The advantage of this approach is that you can reference the static library project from any project to reuse the header units in it. In this example, that's `` and ``. -You can make a monolithic library project containing all the commonly used STL headers that you want to import from your various projects. Or, you can produce smaller shared library projects that have different groupings of STL libraries that you want to import as header units. Then reference those shared header units projects as needed. +You can make a monolithic library project containing all the commonly used STL headers that you want to import from your various projects. Or, you can produce smaller shared library projects that have different groupings of STL libraries that you want to import as header units. Then reference those shared header unit projects as needed. The result should be increased build throughput because importing a header unit significantly reduces the work the compiler must do. It's important when you do this with your own projects that you build the static library project using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the static library project. +## `/translateInclude` + +The [`/translateInclude`](./reference/translateinclude.md) compiler switch can make it easier for you to use a referenced shared header unit project from your project. + +It is useful because you don't have to modify the `#include` directives in your project to take advantage of importing built header units in a referenced shared header unit project. + +For example, if you `#include ` in your project, and you reference a shared header unit project that contains a header unit for ``, you don't need to manually change `#include ` to `import ;` in your source code. If you specify `/translateInclude` (available in the project properties dialog under **C/C++** > **General** > **Translate Includes to Imports**) the compiler will automatically treat `#include ` as `import ;`. This applies to any `#include` statement that refers to a built header unit in a referenced shared header unit project. Otherwise, it will be treated as a normal `#include`. + ## Reuse header units between projects Header units built as part of a static library project are automatically available to all directly and indirectly referencing projects. There are project settings you can use to control which header units should be automatically available to all referencing projects. The settings are in project settings under **VC++ Directories**: 1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. 1. In the left-hand pane of the project properties window, select **VC++ Directories** -![Public project content properties such as public include directories, all header files are public, etc.](media/public-include-module-directories-setting.png) +:::image type="content" source="media/public-include-module-directories-setting.png" alt-text="Screenshot showing public project content properties such as public include directories, all header files are public, etc."::: The following settings control the visibility of header units to the build system: @@ -194,7 +200,7 @@ The following settings control the visibility of header units to the build syste ## Use a prebuilt module file -Normally, the easiest way to reuse header units between solutions is to include the same shared header units project in each solution. +Normally, the easiest way to reuse header units between solutions is to include the same shared header unit project in each solution. But if you have a need to use a built header unit that you don't have the project for, you can specify where the built *`.ifc`* file is so that you can import it in your solution. @@ -206,7 +212,7 @@ To access this setting: Here's an example of the format to use for **Additional Module Dependencies**: `ModuleName1=Path\To\ModuleName1.ifc; ModuleName2=Path\To\ModuleName2.ifc` -## Handling multiple copies of a header unit +## Select among multiple copies of a header unit If you reference two or more projects that built two or more header units with the same name, or that built two or more header units for the same header file, you'll end up in a situation where there are multiple header units to choose from for the same import. You might have different versions of the header unit that were built with different compiler settings, for instance, and need to tell the compiler which one to use. @@ -216,9 +222,9 @@ To access this setting: 1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. 1. In the left-hand pane of the project properties window, select **C/C++** > **General**. 1. Use **Additional Header Unit Dependencies** to resolve collisions by specifying which module or header unit should be used for this project: -![Additional Header Unit Dependencies setting in the project properties dialog](media/additional-header-unit-dependencies-setting.png) +:::image type="content" source="media/additional-header-unit-dependencies-setting.png" alt-text="Screenshot showing the Additional Header Unit Dependencies setting in the project properties dialog."::: -Here's an example of the format to use for **Additional Header Unit Dependencies**: `Path\To\Header1.h= Path\To\HeaderUnit1.ifc;Path\To\Header2.h= Path\To\ HeaderUnit2.ifc` +This is the format to use for **Additional Header Unit Dependencies**: `Path\To\Header1.h= Path\To\HeaderUnit1.ifc;Path\To\Header2.h= Path\To\ HeaderUnit2.ifc` > [!IMPORTANT] > Ensure that projects that share header units are built with compatible compilation options. The compiler will issue warnings if it detects different compilation options used for how the header unit was produced versus how it's used. @@ -228,4 +234,5 @@ Here's an example of the format to use for **Additional Header Unit Dependencies ## See also -[Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) \ No newline at end of file +[Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) \ +[`/translateInclude`](./reference/translateinclude.md) \ No newline at end of file From e0c93f049590cb8c205ed272b9185d6e642c531e Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 9 Apr 2021 10:05:23 -0700 Subject: [PATCH 64/82] trying to kick the build again --- docs/build/walkthrough-header-units.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index deab55ee7b7..0763b0534f5 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -96,7 +96,7 @@ Build the solution (**Build** > **Build Solution** from the main menu) and run i In your own projects, repeat this process to compile the header files you want to import as header units. -If you only want to convert a few header files to header units, this is a good approach. But if you have many header files that you want to compile, and the convenience of having the build system automatically handle it outweighs the impact on build performance, you can have the build system scan for, and build, header units for you. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1). +If you only want to convert a few header files to header units, this is a good approach. But if you have many header files that you want to compile, and the convenience of having the build system automatically handle it outweighs the potential impact on build performance, you can have the build system scan for, and build, header units for you. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1). ## See also From deb7b620186af21399e8fcb8259d7c863c3afe1e Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 9 Apr 2021 10:29:55 -0700 Subject: [PATCH 65/82] draft --- docs/standard-library/ranges.md | 53 ++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index 80fac571081..8f6a606457c 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -6,38 +6,24 @@ f1_keywords: [""] helpviewer_keywords: ["ranges header"] --- + +Range algorithms available (casey list): +https://devblogs.microsoft.com/cppblog/initial-support-for-c20-ranges/ + + +# `` + +## INTRO + introduction - what is a range motivations/advantages example -It’s been 20 years since the STL was standardized, and all I want to do is pass a vector to sort. Is that too much to ask? Nope. With C++20, you will finally be able to do this: https://ericniebler.com/2018/12/05/standard-ranges/ - -std::vector< int > v = // ... -std::ranges::sort( v ); // Hurray! Pillars: https://github.com/ericniebler/range-v3 Views - Views are composable adaptations of ranges where the adaptation happens lazily as the view is iterated. Actions - an action is an eager application of an algorithm to a container that mutates the container in-place and returns it for further processing. Algorithms - -range adaptors : https://ericniebler.com/2018/12/05/standard-ranges/ - example - Also The true power of ranges lies in the ability to create pipelines that transform ranges on the fly https://ericniebler.com/2018/12/05/standard-ranges/ - but these may be out of date - verify in product -view adaptors - https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ (good range/view examples, composability) - example - -Views and actions use the pipe syntax (e.g., rng | adapt1 | adapt2 | ...) so your code is terse and readable from left to right. - -Range algorithms available (casey list): -https://devblogs.microsoft.com/cppblog/initial-support-for-c20-ranges/ - - -# `` - -INTRO: - From eric niebler Ranges are an extension of the Standard Template Library that makes its iterators and algorithms more powerful by making them composable. Unlike other range-like solutions which seek to do away with iterators, in range-v3 ranges are an abstration layer on top of iterators. @@ -48,6 +34,9 @@ Views and actions use the pipe syntax (e.g., rng | adapt1 | adapt2 | ...) so you http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4128.html#design-goals Ranges (not Iterables) are copyable and assignable. They don't own the elements like, say, a container +It’s been 20 years since the STL was standardized, and all I want to do is pass a vector to sort. Is that too much to ask? Nope. With C++20, you will finally be able to do this: https://ericniebler.com/2018/12/05/standard-ranges/ +std::vector< int > v = // ... +std::ranges::sort( v ); // Hurray! > what it is - anything you can iterate through (docs.microsoft.com when talking about range-based for) Essentially, a range is something that can be traversed. More precisely, a range is something that has a begin() and an end() method, that return objects (iterators) that let you iterate over the range (that is, move along the elements of the range, and be dereferenced to access these elements). - https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ @@ -73,7 +62,10 @@ Such algorithms reuse the STL versions in their implementation, by forwarding th std::vector numbers = {1, 2, 3, 4, 5, 6}; auto results = numbers | std::views::filter([](int n){ return n % 2 == 0; }) | std::views::transform([](int n){ return n * 2; }); -> What is a range adaptor: + +## range adaptor + +What is a range adaptor: A range adaptor is an object that can be combined with a range in order to produce a new range. https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ With the following collection of numbers: @@ -87,7 +79,20 @@ A range adaptor is an object that can be combined with a range in order to produ ranges::accumulate(numbers | view::transform(multiplyBy2), 0); returns 1*2 + 2*2 + 3*2 + 4*2 + 5*2 = 30 (similarly to std::accumulate, ranges::accumulate does the sum of the elements of the range it is passed to). +range adaptors : https://ericniebler.com/2018/12/05/standard-ranges/ + example + Also The true power of ranges lies in the ability to create pipelines that transform ranges on the fly https://ericniebler.com/2018/12/05/standard-ranges/ + but these may be out of date - verify in product + + + +## Views +Views and actions use the pipe syntax (e.g., rng | adapt1 | adapt2 | ...) so your code is terse and readable from left to right. + +view adaptors + https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ (good range/view examples, composability) + example List of views: https://www.modernescpp.com/index.php/c-20-the-ranges-library From b8e0ab6413922fe3910817b4cedf53b081b71861 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 9 Apr 2021 10:31:38 -0700 Subject: [PATCH 66/82] trying to kick build --- docs/build/walkthrough-header-units.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 0763b0534f5..c14327d2a36 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -1,7 +1,7 @@ --- description: "Learn more about C++ header units by converting a header file to a header unit" title: "Walkthrough: Build and import header units in Microsoft Visual C++ projects" -ms.date: "4/13/2021" +ms.date: "4/12/2021" ms.custom: "conceptual" author: "tylermsft" ms.author: "twhitney" From 1d9bd9b955445742713d30c4d600a84008dce78e Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 9 Apr 2021 12:21:44 -0700 Subject: [PATCH 67/82] change old style image tag to new one --- docs/build/walkthrough-import-stl-header-units.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 179044ceb3c..d8fad7100e0 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -81,7 +81,7 @@ This step creates a project that includes two libraries: `` and ` **Properties**. The project properties window appears: -![Scan module dependencies property setting](media/vs2019-scan-module-dependencies.png) +:::image type="content" source="media/vs2019-scan-module-dependencies.png" alt-text="Screenshot showing the scan module dependencies property setting in the project properties window."::: 1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings we will change so they apply whether you are building for debug or release, and so on. 1. In the left-hand pane of the project property page, select **C/C++** > **General** 1. Set **Scan Sources for Module Dependencies** to **Yes** Because we're setting the project property, all sources in this project will be scanned. This could be set at the file level, but here we scan the entire project. @@ -90,7 +90,7 @@ Change the C++ language standard for the compiler. The latest preview setting is 1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** 1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft** -![Set language standard to preview version](media/set-cpp-language-latest.png) +:::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing where to set the language standard."::: 1. Click **OK** to close the project properties pages, and then build the solution: **Build** > **Build Solution** from the main menu. You can run the solution to verify that it produces the expected output: `1` @@ -126,7 +126,7 @@ Begin by creating the project for the shared header unit as follows: Set project properties to share the header units from this project: 1. From the Visual Studio main menu, choose **Project** > **Properties**. The project properties window appears: -![Settings for Configuration type and C++ language standard](media/set-header-unit-library-settings.png) +:::image type="content" source="media/set-header-unit-library-settings.png" alt-text="Screenshot showing settings for Configuration type and C++ language standard."::: 1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings we will change so they apply whether you are building for debug or retail, and so on. 1. In the left-hand pane of the project property page, select **General** 1. Change the **Configuration Type** option to **Static library (.lib)** @@ -208,8 +208,7 @@ To access this setting: 1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. 1. In the left-hand pane of the project properties window, select **C/C++** > **General**. 1. Add the modules to reference in the **Additional Module Dependencies** dropdown. -![Project properties under C/C++, General, which Additional Module Dependencies selected](media/vs2019-additional-module-dependencies.png) - +:::image type="content" source="media/vs2019-additional-module-dependencies.png" alt-text="Screenshot showing project properties under C/C++, General, which Additional Module Dependencies selected."::: Here's an example of the format to use for **Additional Module Dependencies**: `ModuleName1=Path\To\ModuleName1.ifc; ModuleName2=Path\To\ModuleName2.ifc` ## Select among multiple copies of a header unit From 88a856b11c96be1a2797b6be8ed95e3311b6d69d Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 9 Apr 2021 17:02:23 -0700 Subject: [PATCH 68/82] an outline of stuff --- docs/standard-library/ranges.md | 263 ++++++++------------------------ 1 file changed, 66 insertions(+), 197 deletions(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index 8f6a606457c..7cac7b98f94 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -6,252 +6,121 @@ f1_keywords: [""] helpviewer_keywords: ["ranges header"] --- - -Range algorithms available (casey list): -https://devblogs.microsoft.com/cppblog/initial-support-for-c20-ranges/ - - # `` -## INTRO - -introduction - what is a range - motivations/advantages - example - - -Pillars: https://github.com/ericniebler/range-v3 -Views - Views are composable adaptations of ranges where the adaptation happens lazily as the view is iterated. -Actions - an action is an eager application of an algorithm to a container that mutates the container in-place and returns it for further processing. -Algorithms -From eric niebler -Ranges are an extension of the Standard Template Library that makes its iterators and algorithms more powerful by making them composable. Unlike other range-like solutions which seek to do away with iterators, in range-v3 ranges are an abstration layer on top of iterators. - -Range-v3 is built on three pillars: Views, Actions, and Algorithms. The algorithms are the same as those with which you are already familiar in the STL, except that in range-v3 all the algorithms have overloads that take ranges in addition to the overloads that take iterators. Views are composable adaptations of ranges where the adaptation happens lazily as the view is iterated. And an action is an eager application of an algorithm to a container that mutates the container in-place and returns it for further processing. - -Views and actions use the pipe syntax (e.g., rng | adapt1 | adapt2 | ...) so your code is terse and readable from left to right. +## Overview -http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4128.html#design-goals -Ranges (not Iterables) are copyable and assignable. They don't own the elements like, say, a container +At a high level, a range is something you can iterate over. A range is a rich abstraction over iterators that simplifies and amplifies your ability to use the Standard Template Library (STL). -It’s been 20 years since the STL was standardized, and all I want to do is pass a vector to sort. Is that too much to ask? Nope. With C++20, you will finally be able to do this: https://ericniebler.com/2018/12/05/standard-ranges/ -std::vector< int > v = // ... -std::ranges::sort( v ); // Hurray! +STL algorithms usually take iterators that point to the collection they operate on. But generally speaking, you want to operate on the entire collection. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators marking the beginning and end of the `vector`. That's flexible, but is noisy since much of the time you'd just like to sort the entire `vector`, but you still have to pass the beginning and end of what to sort. -> what it is - anything you can iterate through (docs.microsoft.com when talking about range-based for) -Essentially, a range is something that can be traversed. More precisely, a range is something that has a begin() and an end() method, that return objects (iterators) that let you iterate over the range (that is, move along the elements of the range, and be dereferenced to access these elements). - https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ -With ranges though, you generally don’t see iterators. They are here, but abstracted away by the concept of range. Iterators are technical constructs that let you iterate over a collection, but they are generally too technical for your functional code. Most of the time, what you are really trying to represent is a range, which corresponds better to the level of abstraction of your code. Like a range of cash flows, a range of lines in a screen, or a range of entries coming up from the database. +With ranges, you can call `std::ranges::sort(myVector);`. It is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, STL algorithms take ranges as parameters, instead of iterators. Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. -So coding in terms of ranges is a huge improvement, because in that sense iterators violate the principle of respecting levels of abstraction, which I deem is the most important principle for designing good code. +Simplified code that is more readable is great, but the benefits of ranges extend further to making it much easier to filter and transform collections of data, and to compose STL algorithms more easily. -In range libraries, STL algorithms are redefined to take directly ranges as parameters, instead of two iterators, like: +Unlike an iterator, ranges are copyable and assignable. Because they don't own the elements like a container does, they are lightweight. -ranges::transform(input, std::back_inserter(output), f); -As opposed to: +## An example -std::transform(input.begin(), input.end(), std::back_inserter(output), f); -Such algorithms reuse the STL versions in their implementation, by forwarding the begin and the end of the range to the native STL versions. +Before ranges, if you wanted to transform only the elements of a collection that met a certain criteria, you'd need to introduce an intermediate step to hold the results as they came in. For example, let's say you want to build a vector of squares from only the elements in another vector that are divisible by 3. You'd write something like: +```cpp +std::copy_if(input.begin(), input.end(), std::back_inserter(intermediate), [](const int i) { return i%3 == 0; }); +std::transform(intermediate.begin(), intermediate.end(), std::back_inserter(output), [](const int i) {return i*i; }); +``` -> an example -> the different types of ranges (input_range, output_range, etc. see https://www.modernescpp.com/index.php/c-20-the-ranges-library and search :input_range) -> List of containers the range types can work with (same link as above) -> What a View is: https://www.modernescpp.com/index.php/c-20-the-ranges-library - A View is something that you apply on a range and performs some operation. A view does not own data and it's time to copy, move, assignment its constant. - Lazy - std::vector numbers = {1, 2, 3, 4, 5, 6}; - auto results = numbers | std::views::filter([](int n){ return n % 2 == 0; }) - | std::views::transform([](int n){ return n * 2; }); +With ranges, you can instead write this as: -## range adaptor +```cpp +std::vector input = { 1, 2, 3, 5, 8, 13, 21, 34, 45, 79 }; +vector output; +auto output = input | std::views::filter([](const int n) {return n % 3 == 0; }) | std::views::transform([](const int n) {return n * n; }); +``` -What is a range adaptor: -A range adaptor is an object that can be combined with a range in order to produce a new range. - https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ - With the following collection of numbers: - - std::vector numbers = { 1, 2, 3, 4, 5 }; - The range - - auto range = numbers | view::transform(multiplyBy2); - is a view over the vector numbers that has the iteration behaviour of a transform_iterator with the function multiplyBy2. So when you iterate over this view, the results you get are all these numbers, multiplied by 2. For instance: - - ranges::accumulate(numbers | view::transform(multiplyBy2), 0); - returns 1*2 + 2*2 + 3*2 + 4*2 + 5*2 = 30 (similarly to std::accumulate, ranges::accumulate does the sum of the elements of the range it is passed to). +*** Note: I'd like to write something like this but it doesn't work: +```cpp +std::ranges::copy( input, std::views::filter([](const int n) {return n % 3 == 0; }) + | std::views::filter([](const int n) {return n * n; }), + std::back_inserter(output)); +``` -range adaptors : https://ericniebler.com/2018/12/05/standard-ranges/ - example - Also The true power of ranges lies in the ability to create pipelines that transform ranges on the fly https://ericniebler.com/2018/12/05/standard-ranges/ - but these may be out of date - verify in product +In the code above, the input is first filtered to just the entries that are divisible by three. The result is combined with a transformation that squares those elements (the ones divisible by three). +The '`|`' symbol chains the range view operations together, and is read left to right. +The result, `output`, is itself a type of range called a view, which is discussed next. ## Views -Views and actions use the pipe syntax (e.g., rng | adapt1 | adapt2 | ...) so your code is terse and readable from left to right. - -view adaptors - https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ (good range/view examples, composability) - example - -List of views: https://www.modernescpp.com/index.php/c-20-the-ranges-library - -> What's a range adaptor: A range adaptor is an object that can be combined with a range in order to produce a new range. A subpart of them are view adaptors: with them, the initial adapted range remains unchanged, while the produced range does not contain elements because it is rather a view over the initial one, but with a customized iteration behaviour. See https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ -> View adaptors: https://www.fluentcpp.com/2018/02/09/introduction-ranges-library/ -auto evenNumbers = numbers | ranges::view::filter([](int n){ return n % 2 == 0; }); Same as above? +A view is essentially a range that takes another range and transforms it in the way that you specify. -We can plug as many view adaptors as we like. For example let me plug a transform adaptor with a function that multiplies a number by 2. +A view is lightweight. Like a range, a view doesn't own the elements it provides access to. The time it takes to copy, move, or assign a view is constant, regardless of how many elements it points to. -auto evenNumbers = numbers | ranges::view::filter([](int n){ return n % 2 == 0; }) - | ranges::view::transform([](int n) { return n * 2; }); +Views are composable. In the example above, the view of vector elements that are divisible by three is then combined with the view that squares those elements. -A `range`, at its most basic, is a collection of things that you can iterate over. - -The STL library contains many algorithms that take an iterator. You often pass a Begin(), End() iterator to define the items you want to process. That is flexible, but makes for a certain code wordiness. Rather than reverse a list, say, you have to pass a pair of iterators that define the boundaries of which parts of the list you want to reverse, and then pass the list along with that to a function to reverse them. Wouldn't it be nice if you could just pass the list and be done with it. Ranges allow this. - -https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ - -All algorithms manipulate iterators pointing into the collection they operate on. While this is handy in specific cases like stopping at a precise point in a container, the largely general case is to traverse the whole container from its .begin() to its .end().Therefore, portions of code that use the STL end up being littered with iterators: -std::copy(v1.begin(), v1.end(), std::back_inserter(v2)); -std::set_difference(v2.begin(), v2.end(), v3.begin(), v3.end(), std::back_inserter(v4)); -std::transform(v3.begin(), v3.end(), std::back_inserter(v4)); - -Composability: https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ Not sure I want to talk about this. - -Saying that somehting is a range is essentially saying that it can be iterated over, which means that it has a begin, it has an end and they both return something that behaves essentially like an iterator. It’s a vague definition but they’re are a lot of things to fit into that definition and one of the is the STL containers, like std::vector for example. - -You can think of a range as two iterators that refer to the beginning and end of a group of elements that you can iterate over. Because all containers support iterators, every container can be thought of as a range. Since all algorithms from Boost.Range expect a range as a first parameter, a container like std::vector can be passed directly. You don’t have to call begin() and end() and then pass two iterators separately. This protects you from mistakes such as passing the begin and end iterator in the wrong order or passing iterators that belong to two different containers. https://theboostcpplibraries.com/boost.range-algorithms - -thanks to the ranges library in C++20, working with the Standard Template Library (STL) will become much more comfortable and powerful. The algorithms of the ranges library are lazy, can work directly on the container and can easily be composed. To make it short: The comfort and the power of the ranges library are due to its functional ideas. Let me show you what that means. - -I really like this intro to the types: - -https://www.modernescpp.com/index.php/c-20-the-ranges-library -https://www.modernescpp.com/index.php/c-20-the-ranges-librar -// rangesFilterTransform.cpp +The elements of a view are evaluated lazily. That is, the transformation you apply to yield elements in a view is not evaluated until you ask for an element. For example, if you run the following code in a debugger, and put a breakpoint on the line `auto x = ...`, you'll hit that breakpoint each iteration through the range `for` loop. That's because it isn't until the element is accessed that the operation that define the view are evaluated for that element. +```cpp #include #include #include -int main() { - - std::vector numbers = {1, 2, 3, 4, 5, 6}; - - auto results = numbers | std::views::filter([](int n){ return n % 2 == 0; }) - | std::views::transform([](int n){ return n * 2; }); - - for (auto v: results) std::cout << v << " "; // 4 8 12 - -} -You have to read the expression from left to right. The pipe symbol stands for function composition: First, all numbers can pass which are even (std::views::filter([](int n){ return n % 2 == 0; })). Afterwards, each remaining number is mapped to its double (std::views::transform([](int n){ return n * 2; })). The small example shows already two new features of the ranges library: Function composition which operators on the entire container. - -Now you should be prepared for the details. Let's go back to square one: ranges and views are concepts. -Ranges are an abstraction of “a collection of items”, or “something iterable”. - -example: - -#include -#include -#include - int main() { - std::array a{{0, 1, 0, 1, 0, 1}}; - std::cout << boost::count(a, 0) << '\n'; -} - -example: https://www.modernescpp.com/index.php/c-20-the-ranges-library - -// rangesFilterTransform.cpp - -#include -#include -#include - -int main() { + std::vector input = { 1, 2, 3, 5, 8, 13, 21, 34, 45, 79 }; - std::vector numbers = {1, 2, 3, 4, 5, 6}; - - auto results = numbers | std::views::filter([](int n){ return n % 2 == 0; }) - | std::views::transform([](int n){ return n * 2; }); - - for (auto v: results) std::cout << v << " "; // 4 8 12 + auto x = input | std::views::filter([](const int n) {return n % 3 == 0; }) + | std::views::transform([](const int n) {return n * n; }); + for (int i : x) + { + std::cout << i << '\n'; + } + return 0; } +``` +## View adaptors -most generic algorithms take a couple interators - -compose algorithms - -example: filter a vector of numbers. I think I saw that in the other example as well. -https://www.fluentcpp.com/2018/02/09/introduction-ranges-library/ - -===> https://hannes.hauswedell.net/post/2019/11/30/range_intro/ ** this could be it. - -C++20 introduces the notion of ranges and provides algorithms that accept such in the namespace std::ranges::, e.g. std::ranges::sort(v) now works if v is range – and vectors are ranges! <-- works for us? - - -a Range does not necessarily own the elements that can be accessed through it, have copy semantics, - https://www.boost.org/doc/libs/1_67_0/libs/range/doc/html/range/concepts/overview.html +A view adaptor provides a view over a range. The range being viewed remains unchanged. The produced view doesn't own any elements. Instead, a view allows you to iterate over the underlying range, but using customized behavior that you specify. -The operations that can be performed on a Range is dependent on the traversal category of the underlying iterator type. Therefore the range concepts are named to reflect which traversal category its iterators support. See also terminology and style guidelines. for more information about naming of ranges. +In the example above, the first view acts like an iterator that only provides the elements of `input` that are divisible by three. The other range acts like an iterator that takes the elements divisible by three, and provides their square. -sorting only all elements after the fifth one: -1std::ranges::sort(std::views::drop(v, 5)); -sorting in reverse order: -1std::ranges::sort(std::views::reverse(v)) +The `` library provides many kinds of view adaptors. In addition to the filter and transform views above, there are views that take or skip the first N elements of another view, reverse the order of a view, join views, skip elements of another view until a condition is met, transform the elements of another view, among others. -range adaptors https://www.boost.org/doc/libs/1_67_0/libs/range/doc/html/range/reference/adaptors/introduction.html +## Range adaptors -Range algorithms +A range adaptor produces a new range from an existing range. Views, discussed above, are a kind of range adaptor. -In its most simple form a Range Algorithm (or range-based algorithm) is simply an iterator-based algorithm where the two iterator arguments have been replaced by one range argument. For example, we may write +Range adaptors produce lazily evaluated ranges. That is, you don't incur the cost of transforming every element in the range; only the ones that you access. -#include -#include +Range adaptors come in many forms. For example, there are range adaptors that allow you to filter another range based on a predicate (`view::filter()`), transform the elements in a range (`view::transform`), split a range (`view::split()`), and more. -std::vector vec = ...; -boost::sort(vec); -instead of +Range adaptors can be chained, as shown in the example in this article. And that's where the true power of ranges lies, in the ability to chain various transformations together. -std::sort(vec.begin(), vec.end()); -However, the return type of range algorithms is almost always different from that of existing iterator-based algorithms. +## Range algorithms -Here's an example of how a span can be used: +Range algorithms have been introduced that take a range for an argument. `std::ranges::sort(myVector);` is an example. -```cpp -#include -#include +The range algorithms are lazy, meaning that they operate on the range only when an element is accessed. They can work directly on a container, and are easily composed. -int main() -{ - int numbers[]{ 0,1,2,3,4 }; -} -``` - -## Requirements - -**Header:** `` - -**Namespace:** std +Range-based algorithms are basically iterator-based algorithms where instead of taking two iterators, they take a range, instead. -**Compiler option:** [/std:c++latest](../build/reference/std-specify-language-standard-version.md) +## Types of ranges +What you can do with a range depends on the underlying iterator type. Range concepts are named to reflect the traversal category its iterators support. -View adaptors -See https://www.fluentcpp.com/2018/02/09/introduction-ranges-library/ -lazy eval - +There are different kinds, or refinements, of ranges, that are codified as concepts. This table lists them, along with the type of container they can be applied to: +| Range refinement | Description | Supported containers | +|--|--|--| +| `std::ranges::input_range` | Can iterate from beginning to end at least once | `std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset` | +| `std::ranges::output_range ` | A range whose iterator type satisfies output_iterator | ? | +| `std::ranges::forward_range` | Can iterate from beginning to end more than once) | ? | +| `std::ranges::bidirectional_range` | Can iterate forward and backward more than once | `std::list`
    `std::map`
    `std::multimap`
    `std::multiset`
    `std::set`| +| `std::ranges::random_access_range` | Can access an arbitrary element (in constant time) using the `[]` operator) | `std::deque` | +| `std::ranges::contiguous_range` | The elements are stored in memory consecutively | `std::array`
    `std::string`
    `std::vector` | ## See also -[Header Files Reference](../standard-library/cpp-standard-library-header-files.md) - - -LINKS I LIKE --------------- -https://www.modernescpp.com/index.php/c-20-the-ranges-library -https://www.fluentcpp.com/2018/02/09/introduction-ranges-library/ -https://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/ +[Header Files Reference](../standard-library/cpp-standard-library-header-files.md) \ No newline at end of file From a429f236041229ac27d1e9fcb3bf90ad508ba584 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Sat, 10 Apr 2021 14:41:54 -0700 Subject: [PATCH 69/82] incorp some review --- docs/standard-library/ranges.md | 51 +++++++++++++++------------------ 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index 7cac7b98f94..d72985fc898 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -1,6 +1,6 @@ --- title: "" -description: "API reference for the Standard Template Library (STL) ranges namespace, which provides ... JTW" +description: "Overview of the Standard Template Library (STL) ranges library" ms.date: "04/13/2021" f1_keywords: [""] helpviewer_keywords: ["ranges header"] @@ -8,17 +8,15 @@ helpviewer_keywords: ["ranges header"] # `` -## Overview - At a high level, a range is something you can iterate over. A range is a rich abstraction over iterators that simplifies and amplifies your ability to use the Standard Template Library (STL). -STL algorithms usually take iterators that point to the collection they operate on. But generally speaking, you want to operate on the entire collection. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators marking the beginning and end of the `vector`. That's flexible, but is noisy since much of the time you'd just like to sort the entire `vector`, but you still have to pass the beginning and end of what to sort. +STL algorithms usually take iterators that point to the collection they operate on. But generally speaking, you want to operate on the entire collection. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators marking the beginning and end of the `vector`. That's flexible, but is noisy since much of the time you just want to sort the entire `vector`, but you still have to pass the beginning and end of what to sort. -With ranges, you can call `std::ranges::sort(myVector);`. It is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, STL algorithms take ranges as parameters, instead of iterators. Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. +With ranges, you can call `std::ranges::sort(myVector);`. It is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, in addition to taking iterators, STL algorithms can take ranges as parameters. Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. Simplified code that is more readable is great, but the benefits of ranges extend further to making it much easier to filter and transform collections of data, and to compose STL algorithms more easily. -Unlike an iterator, ranges are copyable and assignable. Because they don't own the elements like a container does, they are lightweight. +Because ranges don't own elements like a container does, they are lightweight. ## An example @@ -32,21 +30,15 @@ std::transform(intermediate.begin(), intermediate.end(), std::back_inserter(outp With ranges, you can instead write this as: ```cpp +// requires /std:c++latest std::vector input = { 1, 2, 3, 5, 8, 13, 21, 34, 45, 79 }; -vector output; auto output = input | std::views::filter([](const int n) {return n % 3 == 0; }) | std::views::transform([](const int n) {return n * n; }); ``` +> [!NOTE] The ranges examples need to be compiled with the [`/std:c++latest`](../build/reference/std-specify-language-standard-version.md) compiler option. -*** Note: I'd like to write something like this but it doesn't work: -```cpp -std::ranges::copy( input, std::views::filter([](const int n) {return n % 3 == 0; }) - | std::views::filter([](const int n) {return n * n; }), - std::back_inserter(output)); -``` - -In the code above, the input is first filtered to just the entries that are divisible by three. The result is combined with a transformation that squares those elements (the ones divisible by three). +In addition to being a little easier to read, it avoid the memory allocation required for `intermediate` in the non-ranges example. -The '`|`' symbol chains the range view operations together, and is read left to right. +In the code above, the input is first filtered to just the entries that are divisible by three. The result is combined with a transformation that squares those elements (the ones divisible by three). The '`|`' symbol chains the range view operations together, and is read left to right. The result, `output`, is itself a type of range called a view, which is discussed next. @@ -58,24 +50,27 @@ A view is lightweight. Like a range, a view doesn't own the elements it provides Views are composable. In the example above, the view of vector elements that are divisible by three is then combined with the view that squares those elements. -The elements of a view are evaluated lazily. That is, the transformation you apply to yield elements in a view is not evaluated until you ask for an element. For example, if you run the following code in a debugger, and put a breakpoint on the line `auto x = ...`, you'll hit that breakpoint each iteration through the range `for` loop. That's because it isn't until the element is accessed that the operation that define the view are evaluated for that element. +The elements of a view are evaluated lazily. That is, the transformation you apply to yield elements in a view is not evaluated until you ask for an element. For example, if you run the following code in a debugger, and put a breakpoint on the lines `auto divisible_by_three = ...` and `auto square = ...`, you'll see that you hit the first breakpoint as every element is tested for divisibility by three, and then the second breakpoint as the ones that are divisible by three are squared. ```cpp -#include +// requires /std:c++latest #include #include +#include int main() { - std::vector input = { 1, 2, 3, 5, 8, 13, 21, 34, 45, 79 }; + std::vector input = { 1, 2, 3, 5, 8, 13, 21, 34, 45, 79 }; + auto divisible_by_three = [](const int n) {return n % 3 == 0; }; + auto square = [](const int n) {return n * n; }; - auto x = input | std::views::filter([](const int n) {return n % 3 == 0; }) - | std::views::transform([](const int n) {return n * n; }); + auto x = input | std::views::filter(divisible_by_three) + | std::views::transform(square); for (int i : x) - { - std::cout << i << '\n'; - } + { + std::cout << i << '\n'; + } return 0; } ``` @@ -84,7 +79,7 @@ int main() A view adaptor provides a view over a range. The range being viewed remains unchanged. The produced view doesn't own any elements. Instead, a view allows you to iterate over the underlying range, but using customized behavior that you specify. -In the example above, the first view acts like an iterator that only provides the elements of `input` that are divisible by three. The other range acts like an iterator that takes the elements divisible by three, and provides their square. +In the example above, the first view acts like an iterator that only provides the elements of `input` that are divisible by three. The other view acts like an iterator that takes the elements divisible by three, and provides their square. The `` library provides many kinds of view adaptors. In addition to the filter and transform views above, there are views that take or skip the first N elements of another view, reverse the order of a view, join views, skip elements of another view until a condition is met, transform the elements of another view, among others. @@ -111,12 +106,12 @@ Range-based algorithms are basically iterator-based algorithms where instead of What you can do with a range depends on the underlying iterator type. Range concepts are named to reflect the traversal category its iterators support. There are different kinds, or refinements, of ranges, that are codified as concepts. This table lists them, along with the type of container they can be applied to: - +j | Range refinement | Description | Supported containers | |--|--|--| -| `std::ranges::input_range` | Can iterate from beginning to end at least once | `std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset` | +| `std::ranges::input_range` | Can iterate from beginning to end at least once | `std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset`
    `basic_istream_view` | | `std::ranges::output_range ` | A range whose iterator type satisfies output_iterator | ? | -| `std::ranges::forward_range` | Can iterate from beginning to end more than once) | ? | +| `std::ranges::forward_range` | Can iterate from beginning to end more than once) | `std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset` | | `std::ranges::bidirectional_range` | Can iterate forward and backward more than once | `std::list`
    `std::map`
    `std::multimap`
    `std::multiset`
    `std::set`| | `std::ranges::random_access_range` | Can access an arbitrary element (in constant time) using the `[]` operator) | `std::deque` | | `std::ranges::contiguous_range` | The elements are stored in memory consecutively | `std::array`
    `std::string`
    `std::vector` | From 222845b89ca126c665bcf7b82818cf0553f99b3e Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Sat, 10 Apr 2021 15:36:55 -0700 Subject: [PATCH 70/82] more draft --- docs/standard-library/ranges.md | 40 ++++++++++++++++----------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index d72985fc898..f0f3e164814 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -10,11 +10,11 @@ helpviewer_keywords: ["ranges header"] At a high level, a range is something you can iterate over. A range is a rich abstraction over iterators that simplifies and amplifies your ability to use the Standard Template Library (STL). -STL algorithms usually take iterators that point to the collection they operate on. But generally speaking, you want to operate on the entire collection. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators marking the beginning and end of the `vector`. That's flexible, but is noisy since much of the time you just want to sort the entire `vector`, but you still have to pass the beginning and end of what to sort. +STL algorithms usually take iterators that point to the collection they operate on. But you usually want to operate on the entire collection. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators marking the beginning and end of the `vector`. That's flexible, but is noisy since much of the time you just want to sort the entire `vector`, yet you still have to pass the beginning and end of what to sort. -With ranges, you can call `std::ranges::sort(myVector);`. It is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, in addition to taking iterators, STL algorithms can take ranges as parameters. Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. +With ranges, you can call `std::ranges::sort(myVector);` It is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, in addition to taking iterators, algorithms can take ranges as parameters. Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. -Simplified code that is more readable is great, but the benefits of ranges extend further to making it much easier to filter and transform collections of data, and to compose STL algorithms more easily. +More readable and easier to write code is great, but the benefits of ranges goes further than that. They also make it much easier to filter and transform collections of data, and to compose STL algorithms more easily. Because ranges don't own elements like a container does, they are lightweight. @@ -27,30 +27,32 @@ std::copy_if(input.begin(), input.end(), std::back_inserter(intermediate), [](co std::transform(intermediate.begin(), intermediate.end(), std::back_inserter(output), [](const int i) {return i*i; }); ``` -With ranges, you can instead write this as: +With ranges, you can write this as: ```cpp // requires /std:c++latest std::vector input = { 1, 2, 3, 5, 8, 13, 21, 34, 45, 79 }; auto output = input | std::views::filter([](const int n) {return n % 3 == 0; }) | std::views::transform([](const int n) {return n * n; }); ``` -> [!NOTE] The ranges examples need to be compiled with the [`/std:c++latest`](../build/reference/std-specify-language-standard-version.md) compiler option. -In addition to being a little easier to read, it avoid the memory allocation required for `intermediate` in the non-ranges example. +In addition to being easier to read, it avoids the memory allocation required for `intermediate` in the non-ranges example. -In the code above, the input is first filtered to just the entries that are divisible by three. The result is combined with a transformation that squares those elements (the ones divisible by three). The '`|`' symbol chains the range view operations together, and is read left to right. +In the code above, each element that is divisible by three is combined with a transformation to square that element. The '`|`' symbol chains the operations together, and is read left to right. The result, `output`, is itself a type of range called a view, which is discussed next. +> [!NOTE] The ranges examples require the [`/std:c++latest`](../build/reference/std-specify-language-standard-version.md) compiler option. + + ## Views A view is essentially a range that takes another range and transforms it in the way that you specify. -A view is lightweight. Like a range, a view doesn't own the elements it provides access to. The time it takes to copy, move, or assign a view is constant, regardless of how many elements it points to. +A view is lightweight. Like a range, it doesn't own the elements it provides access to. The time it takes to copy, move, or assign a view is constant, regardless of how many elements it points to. -Views are composable. In the example above, the view of vector elements that are divisible by three is then combined with the view that squares those elements. +Views are composable. In the example above, the view of vector elements that are divisible by three is combined with the view that squares those elements. -The elements of a view are evaluated lazily. That is, the transformation you apply to yield elements in a view is not evaluated until you ask for an element. For example, if you run the following code in a debugger, and put a breakpoint on the lines `auto divisible_by_three = ...` and `auto square = ...`, you'll see that you hit the first breakpoint as every element is tested for divisibility by three, and then the second breakpoint as the ones that are divisible by three are squared. +The elements of a view are evaluated lazily. That is, the transformations you apply to yield the elements in a view are not evaluated until you ask for an element in the view. For example, if you run the following code in a debugger, and put a breakpoint on the lines `auto divisible_by_three = ...` and `auto square = ...`, you'll see that you hit the `divisible_by_three` lambda breakpoint as each element in `input` is tested for divisibility by three. Then you'll see the `square` lambda hit as those elements that are divisible by three are squared. ```cpp // requires /std:c++latest @@ -77,36 +79,32 @@ int main() ## View adaptors -A view adaptor provides a view over a range. The range being viewed remains unchanged. The produced view doesn't own any elements. Instead, a view allows you to iterate over the underlying range, but using customized behavior that you specify. +A view adaptor provides a view over a range. The range being viewed is not changed. A view doesn't own any elements. Instead, a view allows you to iterate over the underlying range, but using customized behavior that you specify. In the example above, the first view acts like an iterator that only provides the elements of `input` that are divisible by three. The other view acts like an iterator that takes the elements divisible by three, and provides their square. -The `` library provides many kinds of view adaptors. In addition to the filter and transform views above, there are views that take or skip the first N elements of another view, reverse the order of a view, join views, skip elements of another view until a condition is met, transform the elements of another view, among others. +The `` library provides many kinds of view adaptors. In addition to the filter and transform views above, there are views that take or skip the first N elements of another view, reverse the order of a view, join views, skip elements of another view until a condition is met, transform the elements of another view, and more. ## Range adaptors A range adaptor produces a new range from an existing range. Views, discussed above, are a kind of range adaptor. -Range adaptors produce lazily evaluated ranges. That is, you don't incur the cost of transforming every element in the range; only the ones that you access. +Range adaptors produce lazily evaluated ranges. That is, you don't incur the cost of transforming every element in the range--only the ones that you access. Range adaptors come in many forms. For example, there are range adaptors that allow you to filter another range based on a predicate (`view::filter()`), transform the elements in a range (`view::transform`), split a range (`view::split()`), and more. -Range adaptors can be chained, as shown in the example in this article. And that's where the true power of ranges lies, in the ability to chain various transformations together. +Range adaptors can be chained, which is where the power of ranges express itself. ## Range algorithms -Range algorithms have been introduced that take a range for an argument. `std::ranges::sort(myVector);` is an example. - -The range algorithms are lazy, meaning that they operate on the range only when an element is accessed. They can work directly on a container, and are easily composed. +Range algorithms have been introduced that can take ranges for an argument. For example, `std::ranges::sort(myVector);` -Range-based algorithms are basically iterator-based algorithms where instead of taking two iterators, they take a range, instead. +The range algorithms are lazy, meaning that they operate on the range only when an element is accessed. They can work directly on a container, and can be easily chained together. ## Types of ranges -What you can do with a range depends on the underlying iterator type. Range concepts are named to reflect the traversal category its iterators support. +What you can do with a range depends on the underlying iterator type of the range. There are different kinds of ranges, called refinements. The different kinds of ranges are codified as C++ 20 concepts. This table lists various range concepts, along with the type of container they can be applied to: -There are different kinds, or refinements, of ranges, that are codified as concepts. This table lists them, along with the type of container they can be applied to: -j | Range refinement | Description | Supported containers | |--|--|--| | `std::ranges::input_range` | Can iterate from beginning to end at least once | `std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset`
    `basic_istream_view` | From 1cce3b97f31b51a31cc71a3639d736f49894a435 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Sat, 10 Apr 2021 18:06:31 -0700 Subject: [PATCH 71/82] draft --- docs/standard-library/ranges.md | 37 ++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index f0f3e164814..5b6eb541ec1 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -8,21 +8,24 @@ helpviewer_keywords: ["ranges header"] # `` -At a high level, a range is something you can iterate over. A range is a rich abstraction over iterators that simplifies and amplifies your ability to use the Standard Template Library (STL). +At a high level, a range is something you can iterate over. A range is a rich abstraction on top of iterators that simplifies and amplifies your ability to use the Standard Template Library (STL). -STL algorithms usually take iterators that point to the collection they operate on. But you usually want to operate on the entire collection. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators marking the beginning and end of the `vector`. That's flexible, but is noisy since much of the time you just want to sort the entire `vector`, yet you still have to pass the beginning and end of what to sort. +STL algorithms usually take iterators that point to the collection they operate on. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators the mark the beginning and end of the `vector`. That provides flexibility, but passing the iterators to the algorithm is extra noise since most of the time you just want to sort the entire thing. -With ranges, you can call `std::ranges::sort(myVector);` It is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, in addition to taking iterators, algorithms can take ranges as parameters. Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. +With ranges, you can call `std::ranges::sort(myVector);` It is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, in addition to taking iterators, algorithms take ranges as parameters. Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. -More readable and easier to write code is great, but the benefits of ranges goes further than that. They also make it much easier to filter and transform collections of data, and to compose STL algorithms more easily. +More readable and easier to write code is great, but the benefits of ranges go further than that. They also make it much easier to filter and transform collections of data by making it easier to compose STL algorithms more easily. -Because ranges don't own elements like a container does, they are lightweight. +Because ranges don't own elements like a container does, they are very lightweight. The time it takes to copy, move, or assign a range is constant--regardless of how many elements it points to. ## An example -Before ranges, if you wanted to transform only the elements of a collection that met a certain criteria, you'd need to introduce an intermediate step to hold the results as they came in. For example, let's say you want to build a vector of squares from only the elements in another vector that are divisible by 3. You'd write something like: +Before ranges, if you wanted to transform only the elements of a collection that met a certain criteria, you'd need to introduce an intermediate step to hold the results between operations. For example, let's say you want to build a vector of squares from only the elements in another vector that are divisible by 3. You'd write something like: ```cpp +std::vector input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; +std::vector intermediate, output; + std::copy_if(input.begin(), input.end(), std::back_inserter(intermediate), [](const int i) { return i%3 == 0; }); std::transform(intermediate.begin(), intermediate.end(), std::back_inserter(output), [](const int i) {return i*i; }); ``` @@ -31,22 +34,22 @@ With ranges, you can write this as: ```cpp // requires /std:c++latest -std::vector input = { 1, 2, 3, 5, 8, 13, 21, 34, 45, 79 }; +std::vector input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + auto output = input | std::views::filter([](const int n) {return n % 3 == 0; }) | std::views::transform([](const int n) {return n * n; }); ``` -In addition to being easier to read, it avoids the memory allocation required for `intermediate` in the non-ranges example. +In addition to being easier to read, it avoids the memory allocation required for the `intermediate` vector and its contents. -In the code above, each element that is divisible by three is combined with a transformation to square that element. The '`|`' symbol chains the operations together, and is read left to right. +In the code above, each element that is divisible by three is combined with an operation to to square that element. The '`|`' symbol chains the operations together, and is read left to right. The result, `output`, is itself a type of range called a view, which is discussed next. > [!NOTE] The ranges examples require the [`/std:c++latest`](../build/reference/std-specify-language-standard-version.md) compiler option. - ## Views -A view is essentially a range that takes another range and transforms it in the way that you specify. +A view is essentially a range that takes another range and transforms how its elements are accessed using an algorithm or operation that you specify. The underlying range is unchanged. In the earlier example, one view took a range and returned a view of only the elements that were divisible by three. A view is lightweight. Like a range, it doesn't own the elements it provides access to. The time it takes to copy, move, or assign a view is constant, regardless of how many elements it points to. @@ -62,7 +65,7 @@ The elements of a view are evaluated lazily. That is, the transformations you ap int main() { - std::vector input = { 1, 2, 3, 5, 8, 13, 21, 34, 45, 79 }; + std::vector input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; auto divisible_by_three = [](const int n) {return n % 3 == 0; }; auto square = [](const int n) {return n * n; }; @@ -79,21 +82,21 @@ int main() ## View adaptors -A view adaptor provides a view over a range. The range being viewed is not changed. A view doesn't own any elements. Instead, a view allows you to iterate over the underlying range, but using customized behavior that you specify. +A view adaptor produces a view over a range. The range being viewed is not changed. A view doesn't own any elements. It allows you to iterate over the underlying range, but using customized behavior that you specify. In the example above, the first view acts like an iterator that only provides the elements of `input` that are divisible by three. The other view acts like an iterator that takes the elements divisible by three, and provides their square. -The `` library provides many kinds of view adaptors. In addition to the filter and transform views above, there are views that take or skip the first N elements of another view, reverse the order of a view, join views, skip elements of another view until a condition is met, transform the elements of another view, and more. +The `` library provides many kinds of view adaptors. In addition to the filter and transform views, there are views that take or skip the first N elements of a range, reverse the order of a range, join ranges, skip elements of a range until a condition is met, transform the elements of a range, and more. ## Range adaptors -A range adaptor produces a new range from an existing range. Views, discussed above, are a kind of range adaptor. +A range adaptor produces a new range from an existing range, but with different behavior. A range adaptor might take a range and produce a new one that presents the elements in reverse order. Views, discussed earlier, are a common kind of range adaptor. -Range adaptors produce lazily evaluated ranges. That is, you don't incur the cost of transforming every element in the range--only the ones that you access. +Range adaptors produce lazily evaluated ranges. That is, you don't incur the cost of transforming every element in the range--only the ones that you access, when you access them. Range adaptors come in many forms. For example, there are range adaptors that allow you to filter another range based on a predicate (`view::filter()`), transform the elements in a range (`view::transform`), split a range (`view::split()`), and more. -Range adaptors can be chained, which is where the power of ranges express itself. +Range adaptors can be chained or composed--which is where the power of ranges express itself. ## Range algorithms From 88f6c91335bd50b41720f2347abf1d3b316587f6 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 12 Apr 2021 09:20:44 -0700 Subject: [PATCH 72/82] fix table --- docs/standard-library/ranges.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index 5b6eb541ec1..b3e0230bbaa 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -12,11 +12,11 @@ At a high level, a range is something you can iterate over. A range is a rich ab STL algorithms usually take iterators that point to the collection they operate on. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators the mark the beginning and end of the `vector`. That provides flexibility, but passing the iterators to the algorithm is extra noise since most of the time you just want to sort the entire thing. -With ranges, you can call `std::ranges::sort(myVector);` It is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, in addition to taking iterators, algorithms take ranges as parameters. Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. +With ranges, you can call `std::ranges::sort(myVector);` It's treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, in addition to taking iterators, algorithms take ranges as parameters. Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. More readable and easier to write code is great, but the benefits of ranges go further than that. They also make it much easier to filter and transform collections of data by making it easier to compose STL algorithms more easily. -Because ranges don't own elements like a container does, they are very lightweight. The time it takes to copy, move, or assign a range is constant--regardless of how many elements it points to. +Because ranges don't own elements like a container does, they're very lightweight. The time it takes to copy, move, or assign a range is constant--no matter how many elements it points to. ## An example @@ -45,13 +45,14 @@ In the code above, each element that is divisible by three is combined with an o The result, `output`, is itself a type of range called a view, which is discussed next. -> [!NOTE] The ranges examples require the [`/std:c++latest`](../build/reference/std-specify-language-standard-version.md) compiler option. +> [!NOTE] +> The ranges examples require the [`/std:c++latest`](../build/reference/std-specify-language-standard-version.md) compiler option. ## Views A view is essentially a range that takes another range and transforms how its elements are accessed using an algorithm or operation that you specify. The underlying range is unchanged. In the earlier example, one view took a range and returned a view of only the elements that were divisible by three. -A view is lightweight. Like a range, it doesn't own the elements it provides access to. The time it takes to copy, move, or assign a view is constant, regardless of how many elements it points to. +A view is lightweight. Like a range, it doesn't own the elements. The time it takes to copy, move, or assign a view is constant, regardless of how many elements it points to. Views are composable. In the example above, the view of vector elements that are divisible by three is combined with the view that squares those elements. @@ -82,7 +83,7 @@ int main() ## View adaptors -A view adaptor produces a view over a range. The range being viewed is not changed. A view doesn't own any elements. It allows you to iterate over the underlying range, but using customized behavior that you specify. +A view adaptor produces a view over a range. The range being viewed isn't changed. A view doesn't own any elements. It allows you to iterate over the underlying range, but using customized behavior that you specify. In the example above, the first view acts like an iterator that only provides the elements of `input` that are divisible by three. The other view acts like an iterator that takes the elements divisible by three, and provides their square. @@ -110,7 +111,8 @@ What you can do with a range depends on the underlying iterator type of the rang | Range refinement | Description | Supported containers | |--|--|--| -| `std::ranges::input_range` | Can iterate from beginning to end at least once | `std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset`
    `basic_istream_view` | +| `std::ranges::input_range` | Can iterate from beginning to end at least once | +|`std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset`
    `basic_istream_view` | | `std::ranges::output_range ` | A range whose iterator type satisfies output_iterator | ? | | `std::ranges::forward_range` | Can iterate from beginning to end more than once) | `std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset` | | `std::ranges::bidirectional_range` | Can iterate forward and backward more than once | `std::list`
    `std::map`
    `std::multimap`
    `std::multiset`
    `std::set`| From 69c71ab97a90051555ce49a66bd6679579d79cd6 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 12 Apr 2021 12:00:27 -0700 Subject: [PATCH 73/82] cleanup --- .../compiler-options-listed-alphabetically.md | 4 +- .../compiler-options-listed-by-category.md | 2 +- docs/build/reference/experimental-module.md | 6 +- docs/build/reference/headername.md | 16 ++-- docs/build/reference/headerunit.md | 10 +-- docs/build/reference/module-reference.md | 6 +- .../sourcedependencies-directives.md | 10 +-- docs/build/reference/sourcedependencies.md | 10 +-- docs/build/reference/translateinclude.md | 6 +- docs/build/walkthrough-header-units.md | 39 ++++----- .../walkthrough-import-stl-header-units.md | 80 +++++++++---------- 11 files changed, 96 insertions(+), 93 deletions(-) diff --git a/docs/build/reference/compiler-options-listed-alphabetically.md b/docs/build/reference/compiler-options-listed-alphabetically.md index ca240849c16..ed2cb7d3e8d 100644 --- a/docs/build/reference/compiler-options-listed-alphabetically.md +++ b/docs/build/reference/compiler-options-listed-alphabetically.md @@ -1,7 +1,7 @@ --- title: "Compiler options listed alphabetically" description: "Reference listing in alphabetical order of the Microsoft C/C++ compiler command-line options." -ms.date: 07/29/2020 +ms.date: 04/13/2021 helpviewer_keywords: ["compiler options, C++"] --- # Compiler options listed alphabetically @@ -34,7 +34,7 @@ This table contains an alphabetical list of compiler options. For a list of comp | [`/execution-charset`](execution-charset-set-execution-character-set.md) | Set the execution character set. | | [`/experimental:module`](experimental-module.md) | Enables experimental module support. | | [`/experimental:preprocessor`](experimental-preprocessor.md) | Deprecated. Enables experimental conforming preprocessor support. Use [`/Zc:preprocessor`](zc-preprocessor.md) | -| [`/exportHeader`](module-exportheader.md) Create the header units (*`.ifc`*) files specified by the input arguments. | +| [`/exportHeader`](module-exportheader.md) | Create the header units (*`.ifc`*) files specified by the input arguments. | | [`/F`](f-set-stack-size.md) | Sets stack size. | | [`/favor`](favor-optimize-for-architecture-specifics.md) | Produces code optimized for a specific x64 architecture. Or, for the specific micro-architectures in both the AMD64 and EM64T architectures. | | [`/FA`](fa-fa-listing-file.md) | Creates a listing file. | diff --git a/docs/build/reference/compiler-options-listed-by-category.md b/docs/build/reference/compiler-options-listed-by-category.md index 4ceee7fbda6..20c8dc9428c 100644 --- a/docs/build/reference/compiler-options-listed-by-category.md +++ b/docs/build/reference/compiler-options-listed-by-category.md @@ -107,7 +107,7 @@ This article contains a categorical list of compiler options. For an alphabetica | Option | Purpose | |--|--| -| [`/exportHeader`](module-exportheader.md) | Create the header units (*`.ifc`*) files specified by the input arguments. | +| [`/exportHeader`](module-exportheader.md) | Create the header units files (*`.ifc`*) specified by the input arguments. | | [`/headerUnit`](headerunit.md) | Specify where to find the header unit file (`.ifc`) for the specified header. | | [`/headerName`](headername.md) | Build a header unit from the specified header. | | [`/reference`](module-reference.md) | Use named module IFC. | diff --git a/docs/build/reference/experimental-module.md b/docs/build/reference/experimental-module.md index 1a22ec887eb..1b5765fa529 100644 --- a/docs/build/reference/experimental-module.md +++ b/docs/build/reference/experimental-module.md @@ -1,13 +1,13 @@ --- title: "/experimental:module (Enable module support)" -description: "Use the /experimental:module compiler option to enable experimental compiler support for modules." +description: "Use the /experimental:module compiler option to enable experimental compiler support for named modules." ms.date: "04/13/2021" f1_keywords: ["module", "/experimental:module"] helpviewer_keywords: ["module", "/experimental:module", "Enable module support"] --- # /experimental:module (Enable module support) -Enables experimental compiler support for Standard Template Library named module usage. +Enables experimental compiler support for Standard Template Library named modules. ## Syntax @@ -15,7 +15,7 @@ Enables experimental compiler support for Standard Template Library named module ## Remarks -You can enable experimental modules support by use of the **`/experimental:module`** compiler option along with the [/std:c++latest](std-specify-language-standard-version.md) option. You can use **`/experimental:module-`** to disable module support explicitly. +You can enable experimental modules support by use of the **`/experimental:module`** compiler option along with the [/std:c++latest](std-specify-language-standard-version.md) option. Use **`/experimental:module-`** to disable module support explicitly. This option is available starting in Visual Studio 2015 Update 1. As of Visual Studio 2019 version 16.2, Draft C++20 Standard modules aren't fully implemented in the Microsoft C++ compiler. You can use the modules feature to create single-partition modules and to import the Standard Library modules provided by Microsoft. A module and the code that consumes it must be compiled with the same compiler options. diff --git a/docs/build/reference/headername.md b/docs/build/reference/headername.md index 8d1d2ef2ba2..f02520a15f0 100644 --- a/docs/build/reference/headername.md +++ b/docs/build/reference/headername.md @@ -13,27 +13,27 @@ Build the specified header file into a header unit (*`.ifc`* file). ## Syntax -> **`/headerName:quote`** *`header-filename` -> **`/headerName:angle`** *`header-filename` +> **`/headerName:quote`** `header-filename`\ +> **`/headerName:angle`** `header-filename` ### Arguments *`header-filename`*\ -The name of a header file that the compiler should compile into a header unit (an *`.ifc`* file). +The name of a header file that the compiler should compile into a header unit (*`.ifc`* file). ## Remarks -The **`/headerName`** compiler option is available starting in Visual Studio 2019 version 16.10 preview 2.\ +The **`/headerName`** compiler option is available starting in Visual Studio 2019 version 16.10 preview 2. The **`/headerName`** compiler option, in all its forms, requires the [/std:c++latest](std-specify-language-standard-version.md) option.\ If you specify **`/headerName:{quote,angle}`**, you must also specify [`/exportHeader`](module-exportheader.md). -**`/headerName:quote`** looks up *`header-filename`* using the same rules as `#include "header-name"` and build it as a header unit (*`.ifc`* file).\ -**`/headerName:angle`** looks up *`header-filename`* using the same rules as `#include ` and build it as a header unit (*`.ifc`* file). +**`/headerName:quote`** looks up *`header-filename`* using the same rules as `#include "header-name"` and builds it as a header unit (*`.ifc`* file).\ +**`/headerName:angle`** looks up *`header-filename`* using the same rules as `#include ` and builds it as a header unit (*`.ifc`* file). ### Examples -Given a project that references a header file it defines called `m.h`, the compiler option to compile it into a header unit might look like this: +Given a project that references a header file it defines called `m.h`, the compiler option to compile it into a header unit looks similar to this: ```Bash $ cl /std:c++latest /exportHeader /headerName:quote m.h /Fom.h.obj @@ -55,7 +55,7 @@ $ cl /std:c++latest /exportHeader /headerName:angle /MP /Fo.\ vector iostream al ### To set this compiler option in the Visual Studio development environment > [!NOTE] -> This command line switch is typically set by the build system. +> Users don't typically set this command line switch. It is set by the build system. 1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). diff --git a/docs/build/reference/headerunit.md b/docs/build/reference/headerunit.md index c2e3a9aec27..5957c4afcd7 100644 --- a/docs/build/reference/headerunit.md +++ b/docs/build/reference/headerunit.md @@ -9,7 +9,7 @@ ms.author: "twhitney" --- # `/headerUnit` (Use header unit IFC) -Tells the compiler where to find the *`.ifc`* file (the binary representation of the header unit) for the specified header. Used to import a header unit. +Used to import a header unit. Tells the compiler where to find the *`.ifc`* file (the binary representation of the header unit) for the specified header. ## Syntax @@ -23,7 +23,7 @@ Tells the compiler where to find the *`.ifc`* file (the binary representation of During `import header-name;` the compiler resolves `header-name` to a file on disk. Use *`header-filename`* to specify that file. Once matched, the compiler opens the corresponding IFC named by *`ifc-filename`* for import. *`ifc-filename`*\ -The name of a file that contains compiled header unit information. To import more than one header unit, include a separate **`/headerUnit`** option for each file. +The name of a file that contains compiled header unit information. To import more than one header unit, add a separate **`/headerUnit`** option for each file. ## Remarks @@ -39,7 +39,7 @@ When the compiler comes across `import "file";` or `import ;`, this compil **`/headerUnit:angle`** looks up the compiled header unit file using the same rules as `#include `. -The compiler can't map a single *`header-name`* to multiple IFC files. While mapping multiple *`header-name`* arguments to a single IFC is possible, we don't recommend it. The contents of the IFC get imported as if it was only the header specified by *`header-name`*. +The compiler can't map a single *`header-name`* to multiple *`.ifc`* files. While mapping multiple *`header-name`* arguments to a single *`.ifc`* is possible, we don't recommend it. The contents of the *`.ifc`* get imported as if it was only the header specified by *`header-name`*. The compiler implicitly enables the new preprocessor when this switch is used. That is, [`/Zc:preprocessor`](zc-preprocessor.md) is added to the command line by the compiler if any form of `/headerUnit` is specified on the command line. To opt out of the implicit `/Zc:preprocessor`, specify: `/Zc:preprocessor-` @@ -54,7 +54,7 @@ Given a project that references two header files and their header units, listed | *`C:\utils\util.h`* | *`C:\util.h.ifc`* | | *`C:\app\app.h`* | *`C:\app\app.h.ifc`* | -The compiler options to reference the header units for these particular header files might look like this: +The compiler options to reference the header units for these particular header files would look similar to this: ```CMD cl ... /std:c++latest /headerUnit C:\utils\util.h=C:\util.h.ifc /headerUnit:quote app.h=app.h.ifc @@ -68,4 +68,4 @@ You normally shouldn't set this in the Visual Studio development environment. It [`/exportHeader` (Create header units)](module-exportheader.md)\ [`/headerName` (Create a header unit from the specified header)](headername.md)\ -[`/reference` (Use named module IFC)](module-reference.md)\ +[`/reference` (Use named module IFC)](module-reference.md) diff --git a/docs/build/reference/module-reference.md b/docs/build/reference/module-reference.md index c092ae3796d..fafe887f2f2 100644 --- a/docs/build/reference/module-reference.md +++ b/docs/build/reference/module-reference.md @@ -62,13 +62,13 @@ Given three modules as listed in this table: | *`M:Part1`* | *`m-part1.ifc`* | | *`Core.Networking`* | *`Networking.ifc`* | -The reference options using a *`filename`* argument could look like: +The reference options using a *`filename`* argument would be like this: ```cmd cl ... /std:c++latest /reference m.ifc /reference m-part.ifc /reference Networking.ifc ``` -The reference options using *`module-name=filename`* could look like: +The reference options using *`module-name=filename`* would be like this: ```cmd cl ... /std:c++latest /reference m=m.ifc /reference M:Part1=m-part.ifc /reference Core.Networking=Networking.ifc @@ -78,4 +78,4 @@ cl ... /std:c++latest /reference m=m.ifc /reference M:Part1=m-part.ifc /referenc [`/sourceDependencies:directives` (List module and header unit dependencies)](sourcedependencies-directives.md)\ [`/headerUnit` (Use header unit IFC)](headerunit.md)\ -[`/exportHeader` (Create header units)](module-exportheader.md)\ +[`/exportHeader` (Create header units)](module-exportheader.md) diff --git a/docs/build/reference/sourcedependencies-directives.md b/docs/build/reference/sourcedependencies-directives.md index 0d74ebcda86..99ad668327c 100644 --- a/docs/build/reference/sourcedependencies-directives.md +++ b/docs/build/reference/sourcedependencies-directives.md @@ -9,14 +9,14 @@ helpviewer_keywords: ["/sourceDependencies:directives compiler option", "/source --- # `/sourceDependencies:directives` (List module and header unit dependencies) -This command-line switch generates a JSON file that lists the module and header-unit dependencies in the source code. +This command-line switch generates a JSON file that lists module and header-unit dependencies. It identifies which modules and header units need to be compiled before the project that uses them is compiled. For instance, it will list `import ;` or `import "library";` as a header unit dependency, and `import name;` as a module dependency. This command-line option is similar to [`/sourceDependencies`](sourcedependencies.md), but differs in the following ways: - The compiler doesn't produce compiled output. Instead, the files are scanned for module directives. No compiled code, modules, or header units are produced. -- The output JSON file doesn't list imported modules and imported header units (*`.ifc`* files) because this switch does a scan of the project files, not a compilation, so there are no built modules or header units to list. +- The output JSON file doesn't list imported modules and imported header units (*`.ifc`* files) because this switch does a scan of the project files, not a compilation. So there are no built modules or header units to list. - Only directly imported modules or header units are listed. It doesn't list the dependencies of the imported modules or header units themselves. - Header file dependencies are not listed. That is, `#include ` or `#include "file"` dependencies are not listed. - `/sourceDependencies:directives`is meant to be used before *`.ifc`* files are built. @@ -33,7 +33,7 @@ This command-line option is similar to [`/sourceDependencies`](sourcedependencie If the single dash is provided, then the compiler will emit the source dependencies JSON to `stdout`, or to where compiler output is redirected to. *`filename`*\ -The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path.\ +The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path. *`directory`*\ If the argument is a directory, the compiler generates source dependency files in the specified directory. The output file name is based on the full name of the input file, with an appended *`.json`* extension. For example, if the file provided to the compiler is *`main.cpp`*, the generated output filename is *`main.cpp.json`*. @@ -88,11 +88,11 @@ This command line produces a JSON file *`output.json`* with content like: } ``` -We've used `...` to abbreviate the reported paths; the report contains the absolute paths. The paths reported depend on where the compiler finds the dependencies. If the results are unexpected, you may want to check your project's include path settings. +We've used `...` to abbreviate the reported paths. The report will contain the absolute paths. The paths reported depend on where the compiler finds the dependencies. If the results are unexpected, you may want to check your project's include path settings. `ProvidedModule` lists exported module or module partition names. -No *`.ifc`* files are listed in the output because they weren't built. Unlike `/sourceDependencies`, the compiler doesn't produce compiled output when `/sourceDependencies:directives`is specified, so no compiled modules or header units are produced to import. +No *`.ifc`* files are listed in the output because they weren't built. Unlike `/sourceDependencies`, the compiler doesn't produce compiled output when `/sourceDependencies:directives` is specified, so no compiled modules or header units are produced to import. ## To set this compiler option in Visual Studio diff --git a/docs/build/reference/sourcedependencies.md b/docs/build/reference/sourcedependencies.md index f5de91e0325..d5405349d64 100644 --- a/docs/build/reference/sourcedependencies.md +++ b/docs/build/reference/sourcedependencies.md @@ -11,10 +11,10 @@ helpviewer_keywords: ["/sourceDependencies compiler option", "/sourceDependencie This command-line switch generates a JSON file that details the source-level dependencies consumed during compilation. The JSON file contains a list of the source dependencies, which include: -- Header files (both directly included and the list of headers included by those headers). +- Header files. Both directly included and the list of headers included by those headers. - The PCH used (if **`/Yu`** is specified). - Names of imported modules -- File paths and names of imported header units (both directly imported and those imported by those modules and headers units). +- File paths and names of imported header units. Both directly imported and those imported by those modules and headers units. This provides information necessary to build modules and header units in the proper dependency order. @@ -22,7 +22,7 @@ This provides information necessary to build modules and header units in the pro > **`/sourceDependencies`** -\ > **`/sourceDependencies`** *filename*\ -> **`/sourceDependencies`** *directory*\ +> **`/sourceDependencies`** *directory* ## Arguments @@ -30,7 +30,7 @@ This provides information necessary to build modules and header units in the pro If the single dash is provided, then the compiler will emit the source dependencies JSON to `stdout`, or to where compiler output is redirected to. *`filename`*\ -The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path.\ +The compiler writes the source dependency output to the specified filename, which may include a relative or absolute path. *`directory`*\ If the argument is a directory, the compiler generates source dependency files in the specified directory. The output file name is based on the full name of the input file, with an appended *`.json`* extension. For example, if the file provided to the compiler is *`main.cpp`*, the generated output filename is *`main.cpp.json`*. @@ -98,7 +98,7 @@ where `...` represents your other compiler options. This command line produces a } ``` -We've used `...` to abbreviate the reported paths; the report contains the absolute paths. The paths reported depend on where the compiler finds the dependencies. If the results are unexpected, you may want to check your project's include path settings. +We've used `...` to abbreviate the reported paths. The report will contain the absolute paths. The paths reported depend on where the compiler finds the dependencies. If the results are unexpected, you may want to check your project's include path settings. `ProvidedModule` lists exported module or module partition names. diff --git a/docs/build/reference/translateinclude.md b/docs/build/reference/translateinclude.md index fbfcfc435c5..f8cf53733d6 100644 --- a/docs/build/reference/translateinclude.md +++ b/docs/build/reference/translateinclude.md @@ -9,7 +9,7 @@ helpviewer_keywords: ["/translateInclude", "Translate include directives into im --- # `/translateInclude` (Translate include directives into import directives) -Instructs the compiler to treat `#include` as `import` for headers that have been prebuilt into a header unit (`.ifc`) file. +Instructs the compiler to treat `#include` as `import` for those headers that have been prebuilt into a header unit (`.ifc`) file. ## Syntax @@ -19,7 +19,7 @@ Instructs the compiler to treat `#include` as `import` for headers that have bee The **`/translateInclude`** compiler option requires you enable the [/std:c++latest](std-specify-language-standard-version.md) option. `/translateInclude` is available starting in Visual Studio 2019 version 16.10 Preview 2. -The **`/translateInclude`** option effectively makes the following transformation, where the example `` is an importable header unit: +The **`/translateInclude`** option effectively makes the following transformation, where the example `` has been prebuilt into an importable header unit: ```cpp #include @@ -31,7 +31,7 @@ The compiler replaces this directive with: import ; ``` -In MSVC, available header units are made available by the **`/headerUnit`** option, which maps a header file to its importable header unit. For more information, see [`/headerUnit` (Use header unit IFC)](headerunit.md). +In MSVC, available header units are made available by the **`/headerUnit`** option, which maps a header file to its corresponding prebuilt importable header unit. For more information, see [`/headerUnit` (Specify where to find the header unit file (`.ifc`) for the specified header)](headerunit.md). ### Examples diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index c14327d2a36..056ac01d6c1 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -1,11 +1,11 @@ --- description: "Learn more about C++ header units by converting a header file to a header unit" title: "Walkthrough: Build and import header units in Microsoft Visual C++ projects" -ms.date: "4/12/2021" +ms.date: "4/13/2021" ms.custom: "conceptual" author: "tylermsft" ms.author: "twhitney" -helpviewer_keywords: ["import", "header unit", "ifc", "stl"] +helpviewer_keywords: ["import", "header unit", "ifc"] --- # Walkthrough: Build and import header units in Microsoft Visual C++ @@ -22,24 +22,27 @@ Support for header units requires at least Visual Studio 2019 16.10.0 Preview 2. Header units are a binary representation of a header file, and end with an *`.ifc`* extension. This is also the format used for named modules. -One important difference between a header unit and a header file is that header units aren't affected by macro definitions. You can't `#define` a symbol that causes the header unit to behave differently when you import it the way you can with a header file. Everything visible from a header file is also visible from a header unit. +An important difference between a header unit and a header file is that header units aren't affected by macro definitions. You can't `#define` a symbol that causes the header unit to behave differently when you import it, the way that you can with a header file. -Before you can import a header unit, a header file must be compiled into a header unit. An advantage of header units (*`.ifc`* files) over a PCH is that it can be used in distributed builds. For example, as long as you're using the same compiler to compile the *`.ifc`* and the program that imports it, and are targeting the same platform and architecture, a header unit produced on one machine can be used on another. +A similarity is that everything visible from a header file is also visible from a header unit. -Another advantage of header units over a PCH is that there's more flexibility when it comes to the compiler flags used to compile the header unit and the program that imports it. With a PCH, more compiler flags must be the same. But with header units, the primary flags that should be the same include: - - Exception handling switches such as `/EHsc` - - `/MD[d]` or `MT[d]` - - `/D` You can define additional macros when building the program that imports the header unit, but those used to build the header unit should also be present and defined the same way when building the program that imports the header unit. +Before you can import a header unit, a header file must be compiled into a header unit. An advantage of header units over a PCH is that it can be used in distributed builds. For example, as long as you're using the same compiler to compile the *`.ifc`* and the program that imports it, and are targeting the same platform and architecture, a header unit produced on one machine can be used on another. + +Another advantage of header units over PCHs is that there's more flexibility when it comes to the compiler flags used to compile the header unit and the program that imports it. With a PCH, more compiler flags must be the same. But with header units, the primary flags that should be the same include: + +- Exception handling switches such as `/EHsc` +- `/MD[d]` or `MT[d]` +- `/D` You can define additional macros when building the program that imports the header unit, but those used to build the header unit should also be present and defined the same way when building the program that imports the header unit. ## Ways to compile a header unit There are several ways to compile a file into a header unit: -- Automatically scan for header units: This approach is best suited to smaller projects that include many different header files. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it's better suited to smaller projects is because it can't guarantee optimal build throughput since it has to scan all of the files to find what should be built into header units. This scanning can be done at the project level for all source files, or at the individual file level if you want to manually specify which headers to compile into header units. +- **Automatically scan for header units**: This approach is best suited to smaller projects that include many different header files. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) for a demonstration of this approach. The reason it's better suited to smaller projects is because it can't guarantee optimal build throughput since it scans all of the files to find what should be built into header units. -- Build a shared header unit project: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library project (or projects) that contain the header units that you want. Then reference the library project (or projects) from the project that then imports the header units it needs. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. +- **Build a shared header unit project**: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library project (or projects) that contain the header units that you want. Then reference the library project (or projects) from the project that then imports the header units it needs. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. -- Choose individual header units to build by changing the compilation action for a file. This approach is demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's also a good way to quickly and selectively try out header units in your project. +- **Choose individual header units to build** by changing the compilation action for a file. This approach is demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's also a good way to quickly and selectively try out header units in your project. ## Convert a project to use header units @@ -67,10 +70,10 @@ In this example, you'll compile a header file as a header unit. Begin by creatin } ``` -To enable header units, first set the project C++ language standard to use the latest features: +To enable header units, first set the **C++ Language Standard** to use the latest features: -1. Right-click the project in the **Solution Explorer** and select **Properties**. -1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** +1. From the Visual Studio main menu, choose **Project** > **Properties**. +1. In the left-hand pane of the project property pages window, select **Configuration Properties** > **General** 1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft** :::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing setting the language standard to preview version."::: @@ -78,25 +81,25 @@ To enable header units, first set the project C++ language standard to use the l In the **Solution Explorer**, select the file you want to compile as a header unit. Right-click the file, and select **Properties**. Then do one of the following, depending on the file type: -For header files: +**For header files**: Set the **Item Type** property to **C/C++ compiler**. By default, header files have an **Item Type** of **C/C++ header**. Setting this property also sets **C/C++** > **Advanced** > **Compile As** to **Compile as C++ Header Unit (/exportHeader)** for you. :::image type="content" source="media/change-item-type.png" alt-text="Screenshot showing changing the item type to c/c++ compiler."::: -For source files (or header files that don't have a `.h` or `.hpp` extension): +**For source files** (or header files that don't have a `.h` or `.hpp` extension): Set the **Compile As** property to **Compile as C++ Header Unit (/exportHeader)**. :::image type="content" source="media/change-compile-as.png" alt-text="Screenshot showing changing Compile As to Compile as C++ Header Unit."::: ### Change your code to import a header unit -In the source file for the example project, the file that contains `main()`, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). When you're compiling a header unit from a system header, use angle brackets (`import ;`). If it's a project header, use `import "file";` +In the source file for the example project, that is, the file that contains `main()`, change `#include "Pythagorean.h"` to `import "Pythagorean.h";` (don't forget the trailing semicolon that is required for `import` statements). When you're compiling a header unit from a system header, use angle brackets (`import ;`). If it's a project header, use `import "file";` Build the solution (**Build** > **Build Solution** from the main menu) and run it to see that it produces the expected output: `Pythagorean triple a:2 b:3 c:13` In your own projects, repeat this process to compile the header files you want to import as header units. -If you only want to convert a few header files to header units, this is a good approach. But if you have many header files that you want to compile, and the convenience of having the build system automatically handle it outweighs the potential impact on build performance, you can have the build system scan for, and build, header units for you. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1). +If you only want to convert a few header files to header units, this is a good approach. But if you have many header files that you want to compile, and the convenience of having the build system automatically handle it outweighs the potential impact on build performance, you can have the build system scan for, and build, header units for you. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach1) to learn how. ## See also diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index d8fad7100e0..68cbb075b93 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -5,7 +5,7 @@ ms.date: "4/13/2021" ms.custom: "conceptual" author: "tylermsft" ms.author: "twhitney" -helpviewer_keywords: ["import"] +helpviewer_keywords: ["import", "header unit", "ifc", "stl"] --- # Walkthrough: Import STL libraries as header units @@ -19,9 +19,9 @@ Importing a STL header as a header unit is a simpler alternative to [precompiled Before you can import an STL header, it must be compiled into a header unit. Header units are a binary representation of a header file, and end with an *`.ifc`* extension. -One important difference between a header unit and a header file is that header units are not affected by macro definitions the way header files are. You can't `#define` a symbol that causes the header unit to behave differently when you import it as you can with a header file. +An important difference between a header unit and a header file is that header units aren't affected by macro definitions. You can't `#define` a symbol that causes the header unit to behave differently when you import it, the way that you can with a header file. -Everything visible from a header file is also visible from a header unit. +A similarity is that everything visible from a header file is also visible from a header unit. ## Prerequisites @@ -35,13 +35,13 @@ Before an STL header can be imported, it must be compiled into a header unit. Th At a high level, this works by scanning your sources for `import "header";` and `import
    ;` statements, and tries to compile those header files and their dependencies into header units. It then imports the compiled header unit files (*`.ifc`*) instead of running the header file through the preprocessor. -It may not be the optimal approach for larger projects because it doesn't guarantee optimal build times as it needs to scan through the files to find the headers to build into header units. It may result in reprocessing the same header files repeatedly, increasing build time. Also, not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols, may not work as header units. If a header file can't be compiled into a header unit, it will be treated as a normal `#include` file. +It may not be the optimal approach for larger projects because it doesn't guarantee optimal build times as it needs to scan through the files to find the headers to build into header units. It may result in reprocessing the same header files repeatedly, increasing build time. Also, not all header files can be automatically converted to header units. For example, headers that depend on conditional compilation via `#define` symbols may not work as header units. If a header file can't be compiled into a header unit, it is treated as a normal `#include` file. -See [Approach 1: Scan for headers](#approach1), in this article, for a walkthrough of this approach. +See [Approach 1: Scan for headers](#approach1), in this article, to walkthrough this approach. **Create a static library project** -The recommended approach, particularly for larger projects, or in cases where you want to share a common set of header units across multiple projects, is to create a static library project containing the header units you want to use. This library project is then referenced by projects that import those header units. It's like using [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but easier. +The recommended approach, particularly for larger projects, or in cases where you want to share a common set of header units across multiple projects, is to create a static library project containing the header units you want to share. This library project is then referenced by projects that import those header units. It's like using [shared precompiled headers](https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/), but easier. See [Approach 2: Build a static library project](#approach2), in this article, for a walkthrough of this approach. @@ -49,20 +49,20 @@ See [Approach 2: Build a static library project](#approach2), in this article, f We'll begin with the easiest way to import STL libraries as header units. This approach may not be appropriate for larger projects because it doesn't guarantee the most optimal build time due to scanning the sources for `import` statements. -This option is convenient for codebases that use many different headers, and where build throughput isn't critical. This option doesn't guarantee a header unit for a particular header will be built only once, whereas header units built into referenced static libraries projects are reused. +This option is convenient for codebases that use many different headers, and where build throughput isn't critical. This option doesn't guarantee a header unit for a particular header will be built only once, whereas header units that are part of referenced static libraries projects are reused. -You can import your STL libraries as header units without modifying your code by setting a Visual C++ project option: -- **Scan Sources for Module Dependencies** +You can import your STL libraries as header units without modifying your code by setting the Visual C++ project **Scan Sources for Module Dependencies** option. This setting causes the build system to scan your source code for `import` directives and tries to compile the imported header file into a header unit. There are other ways to indicate that a header file should be treated as a header unit besides scanning your entire project. That is covered in [Walkthrough: Build and import header units in Visual C++ projects](walkthrough-header-units.md). -Not all headers can be converted to a header unit. One issue is `#define` symbols that cause a header file to compile differently. If a header file relies on this mechanism, it won't be converted to a header unit. Instead, it is treated as an ordinary `#include`. +Not all headers can be converted to a header unit. One issue is header files that rely on `#define` symbols to cause the header file to compile differently. If a header file relies on this mechanism, it won't be converted to a header unit. Instead, it is treated as an ordinary `#include`. -To demonstrate this approach, we'll create a project that imports two STL libraries, and then change the project properties so that it treats the library includes as header imports. +To demonstrate this approach, we'll create a project that imports two STL libraries, and then change the project properties so that it treats the libraries as header units. ### Create a C++ console app project This step creates a project that includes two libraries: `` and ``. You'll modify the project settings so that the project is scanned for potential header files that can be compiled into header units. + 1. With Visual Studio, create a new C++ console app project. 1. Modify the source file as follows: ```cpp @@ -78,20 +78,20 @@ This step creates a project that includes two libraries: `` and ` **Properties**. The project properties window appears: :::image type="content" source="media/vs2019-scan-module-dependencies.png" alt-text="Screenshot showing the scan module dependencies property setting in the project properties window."::: -1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings we will change so they apply whether you are building for debug or release, and so on. +1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings you change to apply whether you are building for debug or release, and so on. 1. In the left-hand pane of the project property page, select **C/C++** > **General** -1. Set **Scan Sources for Module Dependencies** to **Yes** Because we're setting the project property, all sources in this project will be scanned. This could be set at the file level, but here we scan the entire project. +1. Set **Scan Sources for Module Dependencies** to **Yes**. Because we're setting the project property, all sources in this project will be scanned. Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: 1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** 1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft** :::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing where to set the language standard."::: -1. Click **OK** to close the project properties pages, and then build the solution: **Build** > **Build Solution** from the main menu. +1. Click **OK** to close the project properties pages, and then build the solution with **Build** > **Build Solution** from the main menu. You can run the solution to verify that it produces the expected output: `1` @@ -101,7 +101,7 @@ You can fine-tune this balance by not scanning for import dependencies, and inst ## Approach 2: Build a static library project -The more flexible way to consume STL headers is to create one or more static library projects that build header units from the STL headers you want to reuse. Then reference the library project, or library projects, from the projects that need those STL headers. Modules and header units built in a static library project are automatically available to referencing projects. The project system automatically adds the appropriate [`/headerUnit](./reference/headerunit.md) switches to the command line so that the header units can be imported by the referencing projects. +The more flexible way to consume STL headers is to create one or more static library projects that build the header units from the STL headers that you want to reuse. Then reference the library project, or library projects, from the projects that need those STL headers. Modules and header units built in a static library project are automatically available to referencing projects. The project system automatically adds the appropriate [`/headerUnit](./reference/headerunit.md) switches to the command line so that the header units can be imported by the referencing projects. This option ensures that header units for a particular header will be built only once. It's similar to using a shared precompiled header file, but is much easier. @@ -112,7 +112,7 @@ In this example, you'll create a project that imports `` and ` Begin by creating the project for the shared header unit as follows: 1. Create an Empty C++ project. Call it, for the sake of this example, **SharedPrj**.\ - **Empty C++ project** is one of the project types available on the **Create a new project** window: + Select **Empty C++ project** from the project types available on the **Create a new project** window: :::image type="content" source="media/empty-project-option.png" alt-text="Screenshot showing creating a new empty C++ project."::: 1. Add a new (empty) C++ file to the project. Change the file's contents to the following: @@ -127,21 +127,21 @@ Set project properties to share the header units from this project: 1. From the Visual Studio main menu, choose **Project** > **Properties**. The project properties window appears: :::image type="content" source="media/set-header-unit-library-settings.png" alt-text="Screenshot showing settings for Configuration type and C++ language standard."::: -1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings we will change so they apply whether you are building for debug or retail, and so on. +1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings you change so that they apply whether you are building for debug or retail, and so on. 1. In the left-hand pane of the project property page, select **General** 1. Change the **Configuration Type** option to **Static library (.lib)** 1. Change **C++ Language Standard** to **Preview-Features from the Latest C++ Working Draft** 1. In the left-hand pane of the project property page, select **C/C++** > **General** :::image type="content" source="media/vs2019-scan-module-dependencies.png" alt-text="Screenshot showing the scan module dependencies property setting."::: 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** -1. Click **OK** to close the project properties pages and then build the solution: **Build** > **Build Solution** from the main menu. +1. Click **OK** to close the project properties pages and then build the solution by selecting **Build** > **Build Solution** from the main menu. ## Reference the shared header unit project Next, create a project that will use the built `` and `` shared header project: -1. With the current solution still open, from the Visual Studio menu select **File** > **Add** > **New Project** -1. Add a C++ Console app project. Call it **Walkthrough**, for this example +1. With the current solution still open, from the Visual Studio menu select **File** > **Add** > **New Project**. +1. Add a C++ Console app project. Call it **Walkthrough**, for this example. 1. Change the contents of its source file as follows: ```cpp @@ -155,15 +155,18 @@ Next, create a project that will use the built `` and `` share } ``` -Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: +Change the **C++ Language Standard** for the compiler. The latest preview setting is necessary to use header units: 1. In the **Solution Explorer**, select right-click the **Walkthrough** project and select **Properties**. The project properties window appears. :::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing setting the language standard to preview version"::: 1. In the left-hand pane of the **Walkthrough** project property pages, select **Configuration Properties** > **General** 1. Change **C++ Language Standard** to **Preview-Features from the Latest C++ Working Draft** 1. Click **OK** to close the project properties pages -1. Add a reference from the **Walkthrough** project to the **SharedPrj** project. To do so, under the **Walkthrough** project, click on the **References** node, and select **Add Reference**. Select **SharedPrj** from the list of projects. + +Add a reference from the **Walkthrough** project to the **SharedPrj** project. + +1. Under the **Walkthrough** project, click on the **References** node, and select **Add Reference**. Select **SharedPrj** from the list of projects. :::image type="content" source="./media/add-reference-to-walkthrough.png" alt-text="Screenshot showing the add reference dialog. Used to add a reference to the Walkthough project."::: -What this reference accomplishes is that the build system will use the header units built into **SharedPrj** whenever an `import` in the **Walkthrough** project matches one of the built header units in **SharedPrj** +What this reference accomplishes is that the build system will use the header units built by **SharedPrj** whenever an `import` in the **Walkthrough** project matches one of the built header units in **SharedPrj** 1. Click **OK** to close the **Add Reference** dialog 1. Right-click the **Walkthrough** project and select **Set as Startup Project** @@ -171,60 +174,57 @@ Then you can build the solution (**Build** > **Build Solution** from the main me The advantage of this approach is that you can reference the static library project from any project to reuse the header units in it. In this example, that's `` and ``. -You can make a monolithic library project containing all the commonly used STL headers that you want to import from your various projects. Or, you can produce smaller shared library projects that have different groupings of STL libraries that you want to import as header units. Then reference those shared header unit projects as needed. +You can make a monolithic static library project that contains all of the commonly used STL headers that you want to import from your various projects. Or, you can produce smaller shared library projects for the different groupings of STL libraries that you want to import as header units. Then reference those shared header unit projects as needed. The result should be increased build throughput because importing a header unit significantly reduces the work the compiler must do. -It's important when you do this with your own projects that you build the static library project using compiler switches that are compatible with the project that will consume it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that consume the static library project. +It's important when you do this with your own projects that you build the static library project using compiler switches that are compatible with the project that will reference it. For example, STL projects should be built with the `/EHsc` compiler switch to turn on exception handling, and so should the projects that reference the static library project. ## `/translateInclude` The [`/translateInclude`](./reference/translateinclude.md) compiler switch can make it easier for you to use a referenced shared header unit project from your project. -It is useful because you don't have to modify the `#include` directives in your project to take advantage of importing built header units in a referenced shared header unit project. +It is useful because you don't have to modify the `#include` directives in your project to take advantage of importing built header units from the referenced shared header unit project. -For example, if you `#include ` in your project, and you reference a shared header unit project that contains a header unit for ``, you don't need to manually change `#include ` to `import ;` in your source code. If you specify `/translateInclude` (available in the project properties dialog under **C/C++** > **General** > **Translate Includes to Imports**) the compiler will automatically treat `#include ` as `import ;`. This applies to any `#include` statement that refers to a built header unit in a referenced shared header unit project. Otherwise, it will be treated as a normal `#include`. +For example, if you `#include ` in your project, and you reference a shared header unit project that contains a header unit for ``, you don't need to manually change `#include ` to `import ;` in your source code. If you specify `/translateInclude` (available in the project properties dialog under **C/C++** > **General** > **Translate Includes to Imports**) the compiler will automatically treat `#include ` as `import ;` This applies to any `#include` statement that refers to a built header unit in a referenced shared header unit project. Otherwise, it will be treated as a normal `#include`. ## Reuse header units between projects -Header units built as part of a static library project are automatically available to all directly and indirectly referencing projects. There are project settings you can use to control which header units should be automatically available to all referencing projects. The settings are in project settings under **VC++ Directories**: +Header units built by a static library project are automatically available to all directly and indirectly referencing projects. There are project settings that allow you to select which header units should be automatically available to all referencing projects. The settings are in project settings under **VC++ Directories**: 1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. 1. In the left-hand pane of the project properties window, select **VC++ Directories** :::image type="content" source="media/public-include-module-directories-setting.png" alt-text="Screenshot showing public project content properties such as public include directories, all header files are public, etc."::: The following settings control the visibility of header units to the build system: -- **Public Include Directories**: specify project directories for header units that should be automatically added to the include path in referencing projects. -- **Public C++ Module directories**: specify which project directories contain header units that should be available to referencing projects. This is a way of making some header units public, by putting those that can be shared in a directory that is visible to other projects. If you set this, you may also want to specify **Public Include Directories** so your public headers are automatically added to the include path in referencing projects. +- **Public Include Directories**: specifies project directories for header units that should be automatically added to the include path in referencing projects. +- **Public C++ Module directories**: specifies which project directories contain header units that should be available to referencing projects. This is a way of making some header units public by providing a place where you can put header units that can be shared in a place that is made visible to other projects. If you set this, you may also want to specify **Public Include Directories** so your public headers are automatically added to the include path in referencing projects. - **All Modules are Public** - To use header units built as a part of a DLL project, the symbols have to be exported from the DLL. To do so, set this property to **Yes**. ## Use a prebuilt module file -Normally, the easiest way to reuse header units between solutions is to include the same shared header unit project in each solution. +Normally, the easiest way to reuse header units between solutions is to reference the same shared header unit project from each solution. But if you have a need to use a built header unit that you don't have the project for, you can specify where the built *`.ifc`* file is so that you can import it in your solution. To access this setting: -1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. +1. From the main menu, choose **Project** > **Properties**. The project properties window appears. 1. In the left-hand pane of the project properties window, select **C/C++** > **General**. -1. Add the modules to reference in the **Additional Module Dependencies** dropdown. +1. Add the modules to reference in the **Additional Module Dependencies** dropdown. Here's an example of the format to use for **Additional Module Dependencies**: `ModuleName1=Path\To\ModuleName1.ifc; ModuleName2=Path\To\ModuleName2.ifc` :::image type="content" source="media/vs2019-additional-module-dependencies.png" alt-text="Screenshot showing project properties under C/C++, General, which Additional Module Dependencies selected."::: -Here's an example of the format to use for **Additional Module Dependencies**: `ModuleName1=Path\To\ModuleName1.ifc; ModuleName2=Path\To\ModuleName2.ifc` ## Select among multiple copies of a header unit -If you reference two or more projects that built two or more header units with the same name, or that built two or more header units for the same header file, you'll end up in a situation where there are multiple header units to choose from for the same import. You might have different versions of the header unit that were built with different compiler settings, for instance, and need to tell the compiler which one to use. +If you reference two or more projects that built two or more header units with the same name, or that built two or more header units for the same header file, there will be multiple header units to choose from for the same import. You might have different versions of the header unit that were built with different compiler settings, for instance, and need to tell the compiler which one to use. Use the project properties **C/C++** > **Additional Header Unit Dependencies** to resolve collisions by specifying which header unit should be used. Otherwise, you can't predict which one gets picked. To access this setting: -1. Select the project in the **Solution Explorer**, then right-click the project and select **Properties**. +1. From the main menu, choose **Project** > **Properties**. The project properties window appears. 1. In the left-hand pane of the project properties window, select **C/C++** > **General**. -1. Use **Additional Header Unit Dependencies** to resolve collisions by specifying which module or header unit should be used for this project: +1. Use **Additional Header Unit Dependencies** to resolve collisions by specifying which module or header unit should be used for this project. This is the format to use for **Additional Header Unit Dependencies**: `Path\To\Header1.h= Path\To\HeaderUnit1.ifc;Path\To\Header2.h= Path\To\ HeaderUnit2.ifc` :::image type="content" source="media/additional-header-unit-dependencies-setting.png" alt-text="Screenshot showing the Additional Header Unit Dependencies setting in the project properties dialog."::: -This is the format to use for **Additional Header Unit Dependencies**: `Path\To\Header1.h= Path\To\HeaderUnit1.ifc;Path\To\Header2.h= Path\To\ HeaderUnit2.ifc` - > [!IMPORTANT] > Ensure that projects that share header units are built with compatible compilation options. The compiler will issue warnings if it detects different compilation options used for how the header unit was produced versus how it's used. From 6a633423b72a3985a1982140c66891ccc6b0af91 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 12 Apr 2021 12:50:27 -0700 Subject: [PATCH 74/82] clarify command line switch --- docs/build/reference/module-exportheader.md | 2 +- docs/build/walkthrough-header-units.md | 6 +++--- docs/build/walkthrough-import-stl-header-units.md | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/build/reference/module-exportheader.md b/docs/build/reference/module-exportheader.md index 3cff873db53..a89cf612b17 100644 --- a/docs/build/reference/module-exportheader.md +++ b/docs/build/reference/module-exportheader.md @@ -19,7 +19,7 @@ Tells the compiler to create the header units specified by the input arguments. ### Arguments -The argument to `/exportHeader` is a `/headerName`command-line option that specifies the name, *`header-name`*, of the header file to export. +The argument to `/exportHeader` is a `/headerName` command-line option that specifies the name, *`header-name`*, of the header file to export. ## Remarks diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 056ac01d6c1..21f1c88277b 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -42,7 +42,7 @@ There are several ways to compile a file into a header unit: - **Build a shared header unit project**: This approach is best suited for larger projects, and for when you want more control over the organization of the imported header units. You create a static library project (or projects) that contain the header units that you want. Then reference the library project (or projects) from the project that then imports the header units it needs. See [Walkthrough: Import STL libraries as header units](walkthrough-import-stl-header-units.md#approach2) for a demonstration of this approach. -- **Choose individual header units to build** by changing the compilation action for a file. This approach is demonstrated here. This approach gives you file by file control over which header files are treated as header units. It's also a good way to quickly and selectively try out header units in your project. +- **Choose individual header units to build**: This approach gives you file by file control over which header files are treated as header units. It's also a good way to quickly and selectively try out header units in your project. This approach is demonstrated in this walkthrough. ## Convert a project to use header units @@ -70,11 +70,11 @@ In this example, you'll compile a header file as a header unit. Begin by creatin } ``` -To enable header units, first set the **C++ Language Standard** to use the latest features: +To enable header units, first set the **C++ Language Standard** to [/std:c++latest](std-specify-language-standard-version.md): 1. From the Visual Studio main menu, choose **Project** > **Properties**. 1. In the left-hand pane of the project property pages window, select **Configuration Properties** > **General** -1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft** +1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft (/std:c++latest)** :::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing setting the language standard to preview version."::: ### Compile a header file as a header unit diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 68cbb075b93..2f7f7d52333 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -86,10 +86,10 @@ Follow these steps to set the options that cause the build system to scan for im 1. In the left-hand pane of the project property page, select **C/C++** > **General** 1. Set **Scan Sources for Module Dependencies** to **Yes**. Because we're setting the project property, all sources in this project will be scanned. -Change the C++ language standard for the compiler. The latest preview setting is necessary to use header units: +Change the C++ language standard for the compiler. The [/std:c++latest](std-specify-language-standard-version.md) switch is required to use header units: 1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** -1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft** +1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft (/std:c++latest)** :::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing where to set the language standard."::: 1. Click **OK** to close the project properties pages, and then build the solution with **Build** > **Build Solution** from the main menu. @@ -130,7 +130,7 @@ Set project properties to share the header units from this project: 1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings you change so that they apply whether you are building for debug or retail, and so on. 1. In the left-hand pane of the project property page, select **General** 1. Change the **Configuration Type** option to **Static library (.lib)** -1. Change **C++ Language Standard** to **Preview-Features from the Latest C++ Working Draft** +1. Change **C++ Language Standard** to **Preview-Features from the Latest C++ Working Draft (/std:c++latest)** 1. In the left-hand pane of the project property page, select **C/C++** > **General** :::image type="content" source="media/vs2019-scan-module-dependencies.png" alt-text="Screenshot showing the scan module dependencies property setting."::: 1. Set the **Scan Sources for Module Dependencies** dropdown to **Yes** @@ -155,11 +155,11 @@ Next, create a project that will use the built `` and `` share } ``` -Change the **C++ Language Standard** for the compiler. The latest preview setting is necessary to use header units: +Change the **C++ Language Standard** for the compiler. The [/std:c++latest](std-specify-language-standard-version.md) switch is required to use header units: 1. In the **Solution Explorer**, select right-click the **Walkthrough** project and select **Properties**. The project properties window appears. :::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing setting the language standard to preview version"::: 1. In the left-hand pane of the **Walkthrough** project property pages, select **Configuration Properties** > **General** -1. Change **C++ Language Standard** to **Preview-Features from the Latest C++ Working Draft** +1. Change **C++ Language Standard** to **Preview-Features from the Latest C++ Working Draft (/std:c++latest)** 1. Click **OK** to close the project properties pages Add a reference from the **Walkthrough** project to the **SharedPrj** project. From 87b9234e3bceef705c934dc1f8fe42b6b5c69e55 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 12 Apr 2021 13:04:07 -0700 Subject: [PATCH 75/82] cleanup --- docs/build/cmake-presets-json-reference.md | 5 +++-- docs/build/cmake-presets-vs.md | 20 ++++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/docs/build/cmake-presets-json-reference.md b/docs/build/cmake-presets-json-reference.md index 13a0bcefb44..a96f9a174bd 100644 --- a/docs/build/cmake-presets-json-reference.md +++ b/docs/build/cmake-presets-json-reference.md @@ -14,7 +14,8 @@ CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that `CMakePresets.json` and `CMakeUserPresets.json` support vendor maps to store vendor-specific information. Microsoft maintains two vendor maps with options specific to Visual Studio and Visual Studio Code. Here we document two Microsoft vendor maps and vendor macros. For documentation about the rest of the schema, including Configure Presets, Build Presets, and Test Presets, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html). -For more information about how to use `CMakePresets.json` in Visual Studio, see [Configure and build with CMake Presets in Visual Studio](cmake-presets-vs.md)\ +For more information about how to use `CMakePresets.json` in Visual Studio, see [Configure and build with CMake Presets in Visual Studio](cmake-presets-vs.md) + For more information about how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with CMake Presets in VS Code](https://github.com/microsoft/vscode-cmake-tools/blob/develop/docs/cmake-presets.md) ## Visual Studio Settings vendor map @@ -41,7 +42,7 @@ None of the options in the Visual Studio Settings vendor map impact the construc ## Visual Studio Remote Settings vendor map -One vendor map with the vendor URI` microsoft.com/VisualStudioRemoteSettings/CMake/` is allowed per Configure Preset and contains options specific to remote development in Visual Studio. Remote development means you're invoking CMake on a remote SSH connection or WSL. None of the options in the Visual Studio Remote Settings vendor map apply to Visual Studio Code. +One vendor map with the vendor URI ` microsoft.com/VisualStudioRemoteSettings/CMake/` is allowed per Configure Preset and contains options specific to remote development in Visual Studio. Remote development means you're invoking CMake on a remote SSH connection or WSL. None of the options in the Visual Studio Remote Settings vendor map apply to Visual Studio Code. All settings in the Visual Studio Remote Settings vendor map are optional and inherited from Configure Presets specified by the `inherits` key. Only options that have been modified are written to the file. The Visual Studio Remote Settings vendor map is supported by both `CMakePresets.json` and `CMakeUserPresets.json`. diff --git a/docs/build/cmake-presets-vs.md b/docs/build/cmake-presets-vs.md index e6a6befb11d..8edfe28df59 100644 --- a/docs/build/cmake-presets-vs.md +++ b/docs/build/cmake-presets-vs.md @@ -12,9 +12,9 @@ CMake supports two files, `CMakePresets.json` and `CMakeUserPresets.json`, that Use `CMakePresets.json` and `CMakeUserPresets.json` to drive CMake in Visual Studio and Visual Studio Code, in a Continuous Integration (CI) pipReline, and from the command line. `CMakePresets.json` is intended to save project-wide builds, and `CMakeUserPresets.json` is intended for developers to save their own local builds. `CMakePresets.json` is supported in Visual Studio 2019 version 16.10 or later. This article contains information about `CMakePresets.json` integration Visual Studio. -- For more information on the format of `CMakePresets.json`, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1). -- For more information on the Microsoft vendor maps and macro expansion, see [`CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps](cmake-presets-json-reference.md). -- For more information on how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with CMake Presets](https://github.com/microsoft/vscode-cmake-tools/tree/develop/docs/cmake-presets.md). +- For more information about the format of `CMakePresets.json`, see the official [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#id1). +- For more information about the Microsoft vendor maps and macro expansion, see [`CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps](cmake-presets-json-reference.md). +- For more information about how to use `CMakePresets.json` in Visual Studio Code, see [Configure and build with CMake Presets](https://github.com/microsoft/vscode-cmake-tools/tree/develop/docs/cmake-presets.md). `CMakePresets.json` is a recommended alternative to `CMakeSettings.json`. Visual Studio will never read from both `CMakePresets.json` and `CMakeSettings.json` at the same time. See [Enable `CMakePresets.json` in Visual Studio 2019](#enable-cmakepresetsjson-integration-in-visual-studio-2019) to enable or disable `CMakePresets.json` integration in Visual Studio. @@ -54,6 +54,8 @@ By default, Visual Studio automatically invokes configure each time the active T If no `CMakePresets.json` or `CMakeUserPresets.json` file exists, or if `CMakePresets.json` or `CMakeUserPresets.json` are invalid, then Visual Studio will fall back on the following default Configure Presets: +**Windows example** + ```json { "name": "windows-default", @@ -77,6 +79,8 @@ If no `CMakePresets.json` or `CMakeUserPresets.json` file exists, or if `CMakePr }, ``` +**Linux example** + ```json { "name": "linux-default", @@ -159,7 +163,7 @@ In Visual Studio 2019, the Test Explorer isn't integrated with `CMakePresets.jso In Visual Studio 2019, all commands and preset templates modify `CMakePresets.json`. You can add new user-level presets by directly editing `CMakeUserPresets.json` -Use forward slashes (`/`) for paths in `CMakePresets.json` and `CMakeUserPresets.json`. +Use a forward slash (`/`) for paths in `CMakePresets.json` and `CMakeUserPresets.json`. ### Add new Configure Presets @@ -167,7 +171,7 @@ To add a new Configure Preset to `CMakePresets.json`, from **Solution Explorer** ![Add configure preset to `CMakePresets.json` dialog](./media/add-configure-preset-to-cmakepresets.png) -Choose the **Windows x64 Debug** template to configure on Windows systems. Choose the **Linux Debug** template to configure on WSL and remote Linux systems. See [Edit presets](#edit-presets) for more information on editing `CMakePresets.json`. +Choose the **Windows x64 Debug** template to configure on Windows systems. Choose the **Linux Debug** template to configure on WSL and remote Linux systems. See [Edit presets](#edit-presets) for more information about editing `CMakePresets.json`. The selected template will be added to `CMakePresets.json` if it exists. Otherwise, the template will be copied into a new `CMakePresets.json`. @@ -228,7 +232,7 @@ To build on Linux or without the Visual C++ toolset, specify the name of a compi }, ``` -You can also set compilers with a CMake toolchain file. Toolchain files can be set with `cacheVariables.CMAKE_TOOLCHAIN_FILE`, which is equivalent to passing` -D CMAKE_TOOLCHAIN_FILE=` to CMake from the command line. A CMake toolchain file is most often used for cross-compilation. See [CMake toolchains](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html) for more information on authoring CMake toolchain files. +You can also set compilers with a CMake toolchain file. Toolchain files can be set with `cacheVariables.CMAKE_TOOLCHAIN_FILE`, which is equivalent to passing` -D CMAKE_TOOLCHAIN_FILE=` to CMake from the command line. A CMake toolchain file is most often used for cross-compilation. See [CMake toolchains](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html) for more information about authoring CMake toolchain files. ### Select your generator @@ -253,7 +257,7 @@ The host architecture (x64 or x86) and toolset can be set with `toolset.value`. `architecture.strategy` and `toolset.strategy` tell CMake how to handle the architecture and toolset fields. `set` means CMake will set the respective value, and `external` means CMake won't set the respective value. - `set` should be used with IDE generators like the Visual Studio Generator. `external` should be used with command-line generators like Ninja. This allows vendors like Visual Studio to source the required environment before CMake is invoked. See [Configure Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#configure-preset) for more information on the architecture and toolset fields. + `set` should be used with IDE generators like the Visual Studio Generator. `external` should be used with command-line generators like Ninja. This allows vendors like Visual Studio to source the required environment before CMake is invoked. See [Configure Presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#configure-preset) for more information about the architecture and toolset fields. For a full list of IDE generators that support the architecture field, see [CMAKE_GENERATOR_PLATFORM](https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_PLATFORM.html). For a full list of IDE generators that support the toolset field, see [CMAKE_GENERATOR_TOOLSET](https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_TOOLSET.html). @@ -388,7 +392,7 @@ if(ASAN_ENABLED) endif() ``` -`` are other compilation flags like `"-fno-omit-frame-pointer"`. See [Using AddressSanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer#using-addresssanitizer) for more information on `ASan` for Linux, and see [Use the AddressSanitizer from a Developer Command Prompt](https://docs.microsoft.com/cpp/sanitizers/asan#command-prompt) for more information on `ASan` with MSVC. +`` are other compilation flags like `"-fno-omit-frame-pointer"`. See [Using AddressSanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer#using-addresssanitizer) for more information about `ASan` for Linux, and see [Use the AddressSanitizer from a Developer Command Prompt](https://docs.microsoft.com/cpp/sanitizers/asan#command-prompt) for more information about `ASan` with MSVC. Pass additional runtime flags to AddressSanitizer with the `ASAN_OPTIONS` field in `launch.vs.json`. `ASAN_OPTIONS` defaults to `detect_leaks=0` when no other runtime options are specified because LeakSanitizer isn't supported in Visual Studio. From 32354ce788dfc7b486f70c4b8ffddaa40a3fd0c2 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 12 Apr 2021 13:06:47 -0700 Subject: [PATCH 76/82] fix links --- docs/build/walkthrough-header-units.md | 2 +- docs/build/walkthrough-import-stl-header-units.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 21f1c88277b..82a641c9097 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -70,7 +70,7 @@ In this example, you'll compile a header file as a header unit. Begin by creatin } ``` -To enable header units, first set the **C++ Language Standard** to [/std:c++latest](std-specify-language-standard-version.md): +To enable header units, first set the **C++ Language Standard** to [/std:c++latest](./reference/std-specify-language-standard-version.md): 1. From the Visual Studio main menu, choose **Project** > **Properties**. 1. In the left-hand pane of the project property pages window, select **Configuration Properties** > **General** diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 2f7f7d52333..704caf78ac0 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -86,7 +86,7 @@ Follow these steps to set the options that cause the build system to scan for im 1. In the left-hand pane of the project property page, select **C/C++** > **General** 1. Set **Scan Sources for Module Dependencies** to **Yes**. Because we're setting the project property, all sources in this project will be scanned. -Change the C++ language standard for the compiler. The [/std:c++latest](std-specify-language-standard-version.md) switch is required to use header units: +Change the C++ language standard for the compiler. The [/std:c++latest](./reference/std-specify-language-standard-version.md) switch is required to use header units: 1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** 1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft (/std:c++latest)** @@ -155,7 +155,7 @@ Next, create a project that will use the built `` and `` share } ``` -Change the **C++ Language Standard** for the compiler. The [/std:c++latest](std-specify-language-standard-version.md) switch is required to use header units: +Change the **C++ Language Standard** for the compiler. The [/std:c++latest](./reference/std-specify-language-standard-version.md) switch is required to use header units: 1. In the **Solution Explorer**, select right-click the **Walkthrough** project and select **Properties**. The project properties window appears. :::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing setting the language standard to preview version"::: 1. In the left-hand pane of the **Walkthrough** project property pages, select **Configuration Properties** > **General** From d17b5e762341d8190bb73bac9c5011b522189bbc Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 12 Apr 2021 13:17:10 -0700 Subject: [PATCH 77/82] escape switches --- docs/build/walkthrough-header-units.md | 8 ++++---- docs/build/walkthrough-import-stl-header-units.md | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/build/walkthrough-header-units.md b/docs/build/walkthrough-header-units.md index 82a641c9097..e81fe406b27 100644 --- a/docs/build/walkthrough-header-units.md +++ b/docs/build/walkthrough-header-units.md @@ -70,16 +70,16 @@ In this example, you'll compile a header file as a header unit. Begin by creatin } ``` -To enable header units, first set the **C++ Language Standard** to [/std:c++latest](./reference/std-specify-language-standard-version.md): +To enable header units, first set the **C++ Language Standard** to [`/std:c++latest`](./reference/std-specify-language-standard-version.md): 1. From the Visual Studio main menu, choose **Project** > **Properties**. -1. In the left-hand pane of the project property pages window, select **Configuration Properties** > **General** -1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft (/std:c++latest)** +1. In the left-hand pane of the project property pages window, select **Configuration Properties** > **General**. +1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft (/std:c++latest)**. :::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing setting the language standard to preview version."::: ### Compile a header file as a header unit -In the **Solution Explorer**, select the file you want to compile as a header unit. Right-click the file, and select **Properties**. Then do one of the following, depending on the file type: +In the **Solution Explorer**, select the file you want to compile as a header unit. Right-click that file, and select **Properties**. Then do one of the following, depending on the file type: **For header files**: diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index 704caf78ac0..dab7b8538e8 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -83,13 +83,13 @@ Follow these steps to set the options that cause the build system to scan for im 1. From the main menu, choose **Project** > **Properties**. The project properties window appears: :::image type="content" source="media/vs2019-scan-module-dependencies.png" alt-text="Screenshot showing the scan module dependencies property setting in the project properties window."::: 1. You may want to set the **Configuration** dropdown to **All Configurations** and **Platform** dropdown to **All Platforms**. This propagates the settings you change to apply whether you are building for debug or release, and so on. -1. In the left-hand pane of the project property page, select **C/C++** > **General** +1. In the left-hand pane of the project property page, select **C/C++** > **General**. 1. Set **Scan Sources for Module Dependencies** to **Yes**. Because we're setting the project property, all sources in this project will be scanned. -Change the C++ language standard for the compiler. The [/std:c++latest](./reference/std-specify-language-standard-version.md) switch is required to use header units: +Change the C++ language standard for the compiler. The [`/std:c++latest`](./reference/std-specify-language-standard-version.md) switch is required to use header units: -1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General** -1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft (/std:c++latest)** +1. In the left-hand pane of the project property pages, select **Configuration Properties** > **General**. +1. Change the **C++ Language Standard** dropdown to **Preview-Features from the Latest C++ Working Draft (/std:c++latest)**. :::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing where to set the language standard."::: 1. Click **OK** to close the project properties pages, and then build the solution with **Build** > **Build Solution** from the main menu. @@ -155,7 +155,7 @@ Next, create a project that will use the built `` and `` share } ``` -Change the **C++ Language Standard** for the compiler. The [/std:c++latest](./reference/std-specify-language-standard-version.md) switch is required to use header units: +Change the **C++ Language Standard** for the compiler. The [`/std:c++latest`](./reference/std-specify-language-standard-version.md) switch is required to use header units: 1. In the **Solution Explorer**, select right-click the **Walkthrough** project and select **Properties**. The project properties window appears. :::image type="content" source="media/set-cpp-language-latest.png" alt-text="Screenshot showing setting the language standard to preview version"::: 1. In the left-hand pane of the **Walkthrough** project property pages, select **Configuration Properties** > **General** From 4880afdd3d458089698de2d32a6693adec82e921 Mon Sep 17 00:00:00 2001 From: Meg van Huygen Date: Mon, 12 Apr 2021 13:50:04 -0700 Subject: [PATCH 78/82] Line 168, fixed typo "Walkthough" --- docs/build/walkthrough-import-stl-header-units.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/walkthrough-import-stl-header-units.md b/docs/build/walkthrough-import-stl-header-units.md index dab7b8538e8..a4884eb1cc1 100644 --- a/docs/build/walkthrough-import-stl-header-units.md +++ b/docs/build/walkthrough-import-stl-header-units.md @@ -165,7 +165,7 @@ Change the **C++ Language Standard** for the compiler. The [`/std:c++latest`](./ Add a reference from the **Walkthrough** project to the **SharedPrj** project. 1. Under the **Walkthrough** project, click on the **References** node, and select **Add Reference**. Select **SharedPrj** from the list of projects. -:::image type="content" source="./media/add-reference-to-walkthrough.png" alt-text="Screenshot showing the add reference dialog. Used to add a reference to the Walkthough project."::: +:::image type="content" source="./media/add-reference-to-walkthrough.png" alt-text="Screenshot showing the add reference dialog. Used to add a reference to the Walkthrough project."::: What this reference accomplishes is that the build system will use the header units built by **SharedPrj** whenever an `import` in the **Walkthrough** project matches one of the built header units in **SharedPrj** 1. Click **OK** to close the **Add Reference** dialog 1. Right-click the **Walkthrough** project and select **Set as Startup Project** @@ -234,4 +234,4 @@ To access this setting: ## See also [Walkthrough: Build and import header units in your Visual C++ projects](walkthrough-header-units.md) \ -[`/translateInclude`](./reference/translateinclude.md) \ No newline at end of file +[`/translateInclude`](./reference/translateinclude.md) From 859b96ee76e3b94fd265e4e73c5363ae61be2903 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 12 Apr 2021 14:35:41 -0700 Subject: [PATCH 79/82] draft --- docs/standard-library/ranges.md | 41 ++++++++++++++++----------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index b3e0230bbaa..63db582ae94 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -3,24 +3,24 @@ title: "" description: "Overview of the Standard Template Library (STL) ranges library" ms.date: "04/13/2021" f1_keywords: [""] -helpviewer_keywords: ["ranges header"] +helpviewer_keywords: ["ranges"] --- # `` -At a high level, a range is something you can iterate over. A range is a rich abstraction on top of iterators that simplifies and amplifies your ability to use the Standard Template Library (STL). +At a high level, a range is something you can iterate over. A range is a rich abstraction over iterators that simplifies and amplifies your ability to use the Standard Template Library (STL). -STL algorithms usually take iterators that point to the collection they operate on. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators the mark the beginning and end of the `vector`. That provides flexibility, but passing the iterators to the algorithm is extra noise since most of the time you just want to sort the entire thing. +STL algorithms usually take iterators that point to the portion of the collection they should operate on. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators the mark the beginning and end of the `vector`. That provides flexibility, but passing the iterators to the algorithm is extra noise since most of the time you just want to sort the whole thing. -With ranges, you can call `std::ranges::sort(myVector);` It's treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, in addition to taking iterators, algorithms take ranges as parameters. Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. +With ranges, you can simply call `std::ranges::sort(myVector);` which is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, algorithms take ranges as parameters (although they can also take iterators, if you want). Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. -More readable and easier to write code is great, but the benefits of ranges go further than that. They also make it much easier to filter and transform collections of data by making it easier to compose STL algorithms more easily. +Code that is easier to write and more readable is great, but the benefits of ranges go further than that. They also make it easier to filter and transform collections of data in part by allowing you to compose STL algorithms more easily. -Because ranges don't own elements like a container does, they're very lightweight. The time it takes to copy, move, or assign a range is constant--no matter how many elements it points to. +Because ranges don't own elements like a container does, they're very lightweight. The time it takes to copy, move, or assign a range is constant no matter how many elements it points to. -## An example +## A ranges example -Before ranges, if you wanted to transform only the elements of a collection that met a certain criteria, you'd need to introduce an intermediate step to hold the results between operations. For example, let's say you want to build a vector of squares from only the elements in another vector that are divisible by 3. You'd write something like: +Before ranges, if you wanted to transform only the elements of a collection that meet a certain criteria, you'd need to introduce an intermediate step to hold the results between operations. For example, let's say you want to build a vector of squares from only the elements in another vector that are divisible by 3. You'd write something like: ```cpp std::vector input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; @@ -30,7 +30,7 @@ std::copy_if(input.begin(), input.end(), std::back_inserter(intermediate), [](co std::transform(intermediate.begin(), intermediate.end(), std::back_inserter(output), [](const int i) {return i*i; }); ``` -With ranges, you can write this as: +With ranges, you can accomplish the same thing without needing the `intermediate` vector: ```cpp // requires /std:c++latest @@ -39,7 +39,7 @@ std::vector input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; auto output = input | std::views::filter([](const int n) {return n % 3 == 0; }) | std::views::transform([](const int n) {return n * n; }); ``` -In addition to being easier to read, it avoids the memory allocation required for the `intermediate` vector and its contents. +In addition to being easier to read, it avoids the memory allocation required for the `intermediate` vector and its contents, while also allowing you to compose two operations. In the code above, each element that is divisible by three is combined with an operation to to square that element. The '`|`' symbol chains the operations together, and is read left to right. @@ -50,13 +50,13 @@ The result, `output`, is itself a type of range called a view, which is discusse ## Views -A view is essentially a range that takes another range and transforms how its elements are accessed using an algorithm or operation that you specify. The underlying range is unchanged. In the earlier example, one view took a range and returned a view of only the elements that were divisible by three. +A view is essentially a range that takes another range and transforms how its elements are accessed. How the elements appear depends on the algorithm or operation that you specify. The underlying range is unchanged. In the earlier example, one view took a range and returned a view of only the elements that were divisible by three. -A view is lightweight. Like a range, it doesn't own the elements. The time it takes to copy, move, or assign a view is constant, regardless of how many elements it points to. +A view is lightweight. Like a range, it doesn't own the elements. The time it takes to copy, move, or assign a view is constant, no matter the number of elements it points to. Views are composable. In the example above, the view of vector elements that are divisible by three is combined with the view that squares those elements. -The elements of a view are evaluated lazily. That is, the transformations you apply to yield the elements in a view are not evaluated until you ask for an element in the view. For example, if you run the following code in a debugger, and put a breakpoint on the lines `auto divisible_by_three = ...` and `auto square = ...`, you'll see that you hit the `divisible_by_three` lambda breakpoint as each element in `input` is tested for divisibility by three. Then you'll see the `square` lambda hit as those elements that are divisible by three are squared. +The elements of a view are evaluated lazily. That is, the transformations you apply to yield the elements in a view are not evaluated until you ask for an element. For example, if you run the following code in a debugger, and put a breakpoint on the lines `auto divisible_by_three = ...` and `auto square = ...`, you'll see that you hit the `divisible_by_three` lambda breakpoint as each element in `input` is tested for divisibility by three. The `square` lambda breakpoint will be hit as the elements that are divisible by three are squared. ```cpp // requires /std:c++latest @@ -83,25 +83,25 @@ int main() ## View adaptors -A view adaptor produces a view over a range. The range being viewed isn't changed. A view doesn't own any elements. It allows you to iterate over the underlying range, but using customized behavior that you specify. +A view adaptor produces a view over a range. The range being viewed remains unchanged. A view doesn't own any elements. It allows you to iterate over the underlying range using customized behavior that you specify. -In the example above, the first view acts like an iterator that only provides the elements of `input` that are divisible by three. The other view acts like an iterator that takes the elements divisible by three, and provides their square. +In the example above, the first view acts like an iterator that only provides the elements of `input` that are divisible by three. The other view acts like an iterator that takes the elements divisible by three, and provides the element's square. The `` library provides many kinds of view adaptors. In addition to the filter and transform views, there are views that take or skip the first N elements of a range, reverse the order of a range, join ranges, skip elements of a range until a condition is met, transform the elements of a range, and more. ## Range adaptors -A range adaptor produces a new range from an existing range, but with different behavior. A range adaptor might take a range and produce a new one that presents the elements in reverse order. Views, discussed earlier, are a common kind of range adaptor. +A range adaptor produces a new range from an existing range. The new range uses customized behavior specified by the range adaptor to provide the elements. For example, a range adaptor might take a range and produce a new one that presents the elements from the original range in reverse order. Views, discussed earlier, are a common kind of range adaptor. -Range adaptors produce lazily evaluated ranges. That is, you don't incur the cost of transforming every element in the range--only the ones that you access, when you access them. +Range adaptors produce lazily evaluated ranges. That is, you don't incur the cost of transforming every element in the range--only the ones that you access, and at the time that you access them. -Range adaptors come in many forms. For example, there are range adaptors that allow you to filter another range based on a predicate (`view::filter()`), transform the elements in a range (`view::transform`), split a range (`view::split()`), and more. +Range adaptors come in many forms. For example, there are range adaptors that allow you to filter another range based on a predicate (`view::filter`), transform the elements in a range (`view::transform`), split a range (`view::split()`), and more. -Range adaptors can be chained or composed--which is where the power of ranges express itself. +Range adaptors can be chained or composed--which is where the power and flexibility of ranges is most apparent. ## Range algorithms -Range algorithms have been introduced that can take ranges for an argument. For example, `std::ranges::sort(myVector);` +Range algorithms have been created that take a range argument. For example, `std::ranges::sort(myVector);` The range algorithms are lazy, meaning that they operate on the range only when an element is accessed. They can work directly on a container, and can be easily chained together. @@ -113,7 +113,6 @@ What you can do with a range depends on the underlying iterator type of the rang |--|--|--| | `std::ranges::input_range` | Can iterate from beginning to end at least once | |`std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset`
    `basic_istream_view` | -| `std::ranges::output_range ` | A range whose iterator type satisfies output_iterator | ? | | `std::ranges::forward_range` | Can iterate from beginning to end more than once) | `std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset` | | `std::ranges::bidirectional_range` | Can iterate forward and backward more than once | `std::list`
    `std::map`
    `std::multimap`
    `std::multiset`
    `std::set`| | `std::ranges::random_access_range` | Can access an arbitrary element (in constant time) using the `[]` operator) | `std::deque` | From 7aac3ea9f0b0a3b93e0cabf4e55f50ef3b70ed4e Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 12 Apr 2021 14:40:25 -0700 Subject: [PATCH 80/82] arcolinks --- docs/standard-library/ranges.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index 63db582ae94..e91dbe1eb89 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -12,11 +12,11 @@ At a high level, a range is something you can iterate over. A range is a rich ab STL algorithms usually take iterators that point to the portion of the collection they should operate on. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators the mark the beginning and end of the `vector`. That provides flexibility, but passing the iterators to the algorithm is extra noise since most of the time you just want to sort the whole thing. -With ranges, you can simply call `std::ranges::sort(myVector);` which is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, algorithms take ranges as parameters (although they can also take iterators, if you want). Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. +With ranges, you can simply call `std::ranges::sort(myVector);`, which is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, algorithms take ranges as parameters (although they can also take iterators, if you want). Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. Code that is easier to write and more readable is great, but the benefits of ranges go further than that. They also make it easier to filter and transform collections of data in part by allowing you to compose STL algorithms more easily. -Because ranges don't own elements like a container does, they're very lightweight. The time it takes to copy, move, or assign a range is constant no matter how many elements it points to. +Because ranges don't own elements like a container does, they're lightweight. The time it takes to copy, move, or assign a range is constant no matter how many elements it points to. ## A ranges example @@ -39,9 +39,9 @@ std::vector input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; auto output = input | std::views::filter([](const int n) {return n % 3 == 0; }) | std::views::transform([](const int n) {return n * n; }); ``` -In addition to being easier to read, it avoids the memory allocation required for the `intermediate` vector and its contents, while also allowing you to compose two operations. +Besides being easier to read, it avoids the memory allocation required for the `intermediate` vector and its contents, while also allowing you to compose two operations. -In the code above, each element that is divisible by three is combined with an operation to to square that element. The '`|`' symbol chains the operations together, and is read left to right. +In the code above, each element that is divisible by three is combined with an operation to square that element. The '`|`' symbol chains the operations together, and is read left to right. The result, `output`, is itself a type of range called a view, which is discussed next. @@ -56,7 +56,7 @@ A view is lightweight. Like a range, it doesn't own the elements. The time it ta Views are composable. In the example above, the view of vector elements that are divisible by three is combined with the view that squares those elements. -The elements of a view are evaluated lazily. That is, the transformations you apply to yield the elements in a view are not evaluated until you ask for an element. For example, if you run the following code in a debugger, and put a breakpoint on the lines `auto divisible_by_three = ...` and `auto square = ...`, you'll see that you hit the `divisible_by_three` lambda breakpoint as each element in `input` is tested for divisibility by three. The `square` lambda breakpoint will be hit as the elements that are divisible by three are squared. +The elements of a view are evaluated lazily. That is, the transformations you apply to yield the elements in a view aren't evaluated until you ask for an element. For example, if you run the following code in a debugger, and put a breakpoint on the lines `auto divisible_by_three = ...` and `auto square = ...`, you'll see that you hit the `divisible_by_three` lambda breakpoint as each element in `input` is tested for divisibility by three. The `square` lambda breakpoint will be hit as the elements that are divisible by three are squared. ```cpp // requires /std:c++latest @@ -87,7 +87,7 @@ A view adaptor produces a view over a range. The range being viewed remains unch In the example above, the first view acts like an iterator that only provides the elements of `input` that are divisible by three. The other view acts like an iterator that takes the elements divisible by three, and provides the element's square. -The `` library provides many kinds of view adaptors. In addition to the filter and transform views, there are views that take or skip the first N elements of a range, reverse the order of a range, join ranges, skip elements of a range until a condition is met, transform the elements of a range, and more. +The `` library provides many kinds of view adaptors. Besides the filter and transform views, there are views that take or skip the first N elements of a range, reverse the order of a range, join ranges, skip elements of a range until a condition is met, transform the elements of a range, and more. ## Range adaptors From 5bd9e461107d6e576f9887a81e67833639b9a624 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 12 Apr 2021 14:48:03 -0700 Subject: [PATCH 81/82] small adjustment --- docs/standard-library/ranges.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index e91dbe1eb89..93491d14e43 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -8,11 +8,11 @@ helpviewer_keywords: ["ranges"] # `` -At a high level, a range is something you can iterate over. A range is a rich abstraction over iterators that simplifies and amplifies your ability to use the Standard Template Library (STL). +At a high level, a range is something you can iterate over. A range abstracts iterators in a way that simplifies and amplifies your ability to use the Standard Template Library (STL). STL algorithms usually take iterators that point to the portion of the collection they should operate on. Consider how you sort a `vector` today. To call `std::sort()`, you pass two iterators the mark the beginning and end of the `vector`. That provides flexibility, but passing the iterators to the algorithm is extra noise since most of the time you just want to sort the whole thing. -With ranges, you can simply call `std::ranges::sort(myVector);`, which is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, algorithms take ranges as parameters (although they can also take iterators, if you want). Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. +With ranges, you can simply call `std::ranges::sort(myVector);` which is treated as if you had called `std::sort(myVector.begin(), myVector.end());` In range libraries, algorithms take ranges as parameters (although they can also take iterators, if you want). Examples of range algorithms available in `` include `copy`, `copy_n`, `copy_if`, `all_of`, `any_of`, and `none_of`, `find`, `find_if`, and `find_if_not`, `count` and `count_if`, `for_each` and `for_each_n`, `equal` and `mismatch`. Code that is easier to write and more readable is great, but the benefits of ranges go further than that. They also make it easier to filter and transform collections of data in part by allowing you to compose STL algorithms more easily. From e506b22ee2d2f43d0b2d3e9ca606990404cb6788 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 12 Apr 2021 15:22:38 -0700 Subject: [PATCH 82/82] update table endings --- docs/standard-library/ranges.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/standard-library/ranges.md b/docs/standard-library/ranges.md index 93491d14e43..0a6d5eb6823 100644 --- a/docs/standard-library/ranges.md +++ b/docs/standard-library/ranges.md @@ -111,8 +111,8 @@ What you can do with a range depends on the underlying iterator type of the rang | Range refinement | Description | Supported containers | |--|--|--| -| `std::ranges::input_range` | Can iterate from beginning to end at least once | -|`std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset`
    `basic_istream_view` | +| `std::ranges::input_range` | Can iterate from beginning to end at least once | +| `std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset`
    `basic_istream_view` | | `std::ranges::forward_range` | Can iterate from beginning to end more than once) | `std::forward_list`
    `std::unordered_map`
    `std::unordered_multimap`
    `std::unordered_set`
    `std::unordered_multiset` | | `std::ranges::bidirectional_range` | Can iterate forward and backward more than once | `std::list`
    `std::map`
    `std::multimap`
    `std::multiset`
    `std::set`| | `std::ranges::random_access_range` | Can access an arbitrary element (in constant time) using the `[]` operator) | `std::deque` |