New upstream version 3.23.1

ci/unstable
Timo Röhling 3 years ago
parent eefde565b0
commit 550d0a8e15

@ -828,7 +828,7 @@ of the ``Development`` component in the package metadata, ensuring that the
library is always installed if the headers and CMake export file are present. library is always installed if the headers and CMake export file are present.
.. versionadded:: 3.7 .. versionadded:: 3.7
In addition to cmake language files, the ``EXPORT_ANDROID_MK`` mode maybe In addition to cmake language files, the ``EXPORT_ANDROID_MK`` mode may be
used to specify an export to the android ndk build system. This mode used to specify an export to the android ndk build system. This mode
accepts the same options as the normal export mode. The Android accepts the same options as the normal export mode. The Android
NDK supports the use of prebuilt libraries, both static and shared. This NDK supports the use of prebuilt libraries, both static and shared. This

@ -612,7 +612,7 @@ Requires an element of object type.
.. code-block:: cmake .. code-block:: cmake
string(JSON <out-var> [ERROR_VARIABLE <error-variable>] string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
LENGTH <json-string> <member|index> [<member|index> ...]) LENGTH <json-string> [<member|index> ...])
Get the length of an element in ``<json-string>`` at the location Get the length of an element in ``<json-string>`` at the location
given by the list of ``<member|index>`` arguments. given by the list of ``<member|index>`` arguments.

@ -77,7 +77,7 @@ have zero or more named file sets. Each file set has a name, a type, a scope of
``INTERFACE``, ``PUBLIC``, or ``PRIVATE``, one or more base directories, and ``INTERFACE``, ``PUBLIC``, or ``PRIVATE``, one or more base directories, and
files within those directories. The only acceptable type is ``HEADERS``. The files within those directories. The only acceptable type is ``HEADERS``. The
optional default file sets are named after their type. The target may not be a optional default file sets are named after their type. The target may not be a
custom target. custom target or :prop_tgt:`FRAMEWORK` target.
Files in a ``PRIVATE`` or ``PUBLIC`` file set are marked as source files for Files in a ``PRIVATE`` or ``PUBLIC`` file set are marked as source files for
the purposes of IDE integration. Additionally, files in ``HEADERS`` file sets the purposes of IDE integration. Additionally, files in ``HEADERS`` file sets

@ -245,20 +245,6 @@ Commit with a message such as::
Release versions do not have the development topic section of Release versions do not have the development topic section of
the CMake Release Notes index page. the CMake Release Notes index page.
Update ``.gitlab-ci.yml`` to drop the upload jobs from the
packaging pipeline by renaming them to start in ``.``:
.. code-block:: shell
sed -i 's/^u:/.u:/' .gitlab-ci.yml
Commit with a message such as::
gitlab-ci: Drop package pipeline upload jobs for release branch
The package pipeline for release versions should not upload packages
automatically to our archive of nightly development versions.
Update ``Source/CMakeVersion.cmake`` to set the version to Update ``Source/CMakeVersion.cmake`` to set the version to
``$major.$minor.0-rc0``: ``$major.$minor.0-rc0``:
@ -290,15 +276,13 @@ Merge the ``release-$ver`` branch to ``master``:
git merge --no-ff release-$ver git merge --no-ff release-$ver
Begin post-release development by restoring the development branch release Begin post-release development by restoring the development branch release
note infrastructure, the nightly package pipeline upload jobs, and note infrastructure, and the version date from ``origin/master``:
the version date from ``origin/master``:
.. code-block:: shell .. code-block:: shell
git checkout origin/master -- \ git checkout origin/master -- \
Source/CMakeVersion.cmake Help/release/dev/0-sample-topic.rst Source/CMakeVersion.cmake Help/release/dev/0-sample-topic.rst
sed -i $'/^Releases/ i\\\n.. include:: dev.txt\\\n' Help/release/index.rst sed -i $'/^Releases/ i\\\n.. include:: dev.txt\\\n' Help/release/index.rst
sed -i 's/^\.u:/u:/' .gitlab-ci.yml
Update ``Source/CMakeVersion.cmake`` to set the version to Update ``Source/CMakeVersion.cmake`` to set the version to
``$major.$minor.$date``: ``$major.$minor.$date``:

@ -24,7 +24,9 @@ file name components no longer add a dependency on the evaluated target.
In CMake 3.18 and lower a dependency on the evaluated target of the above In CMake 3.18 and lower a dependency on the evaluated target of the above
generator expressions would always be added. CMake 3.19 and above prefer generator expressions would always be added. CMake 3.19 and above prefer
to not add this dependency. This policy provides compatibility for projects to not add this dependency. This policy provides compatibility for projects
that have not been updated to expect the new behavior. that have not been updated to expect the new behavior. The policy setting
is recorded on each target when it is created, and decides whether generator
expressions referencing that target imply a dependency on it.
The ``OLD`` behavior for this policy is to add a dependency on the evaluated The ``OLD`` behavior for this policy is to add a dependency on the evaluated
target for the above generator expressions. The ``NEW`` behavior of target for the above generator expressions. The ``NEW`` behavior of

@ -3,14 +3,13 @@ HEADER_SETS
.. versionadded:: 3.23 .. versionadded:: 3.23
List of the target's ``PRIVATE`` and ``PUBLIC`` header sets (i.e. all Read-only list of the target's ``PRIVATE`` and ``PUBLIC`` header sets (i.e.
file sets with the type ``HEADERS``). Files listed in these file sets all file sets with the type ``HEADERS``). Files listed in these file sets are
are treated as source files for the purpose of IDE integration. treated as source files for the purpose of IDE integration. The files also
The files also have their :prop_sf:`HEADER_FILE_ONLY` property set to have their :prop_sf:`HEADER_FILE_ONLY` property set to ``TRUE``.
``TRUE``.
This property is normally only set by :command:`target_sources(FILE_SET)` Header sets may be defined using the :command:`target_sources` command
rather than being manipulated directly. ``FILE_SET`` option with type ``HEADERS``.
See also :prop_tgt:`HEADER_SET_<NAME>`, :prop_tgt:`HEADER_SET` and See also :prop_tgt:`HEADER_SET_<NAME>`, :prop_tgt:`HEADER_SET` and
:prop_tgt:`INTERFACE_HEADER_SETS`. :prop_tgt:`INTERFACE_HEADER_SETS`.

@ -3,12 +3,12 @@ INTERFACE_HEADER_SETS
.. versionadded:: 3.23 .. versionadded:: 3.23
List of the target's ``INTERFACE`` and ``PUBLIC`` header sets (i.e. all Read-only list of the target's ``INTERFACE`` and ``PUBLIC`` header sets (i.e.
file sets with the type ``HEADERS``). Files listed in these header sets all file sets with the type ``HEADERS``). Files listed in these header sets
can be installed with :command:`install(TARGETS)` and exported with can be installed with :command:`install(TARGETS)` and exported with
:command:`install(EXPORT)` and :command:`export`. :command:`install(EXPORT)` and :command:`export`.
This property is normally only set by :command:`target_sources(FILE_SET)` Header sets may be defined using the :command:`target_sources` command
rather than being manipulated directly. ``FILE_SET`` option with type ``HEADERS``.
See also :prop_tgt:`HEADER_SETS`. See also :prop_tgt:`HEADER_SETS`.

@ -143,12 +143,17 @@ Other Changes
* The :cpack_gen:`CPack NSIS Generator` now requires NSIS 3.03 or later. * The :cpack_gen:`CPack NSIS Generator` now requires NSIS 3.03 or later.
Updates
=======
Changes made since CMake 3.22.0 include the following.
3.22.1 3.22.1
------ ------
This version made no changes to documented features or interfaces. * This version made no changes to documented features or interfaces.
Some implementation updates were made to support ecosystem changes Some implementation updates were made to support ecosystem changes
and/or fix regressions. and/or fix regressions.
3.22.2 3.22.2
------ ------
@ -164,3 +169,10 @@ and/or fix regressions.
errors in existing projects. The fix has been reverted to restore errors in existing projects. The fix has been reverted to restore
compatibility. The fix may be restored in a future version of CMake compatibility. The fix may be restored in a future version of CMake
via a policy. via a policy.
3.22.4
------
* This version made no changes to documented features or interfaces.
Some implementation updates were made to support ecosystem changes
and/or fix regressions.

@ -114,8 +114,8 @@ Variables
Properties Properties
---------- ----------
* The :prop_tgt:`HEADER_SETS` and :prop_tgt:`INTERFACE_HEADER_SETS` target * The :prop_tgt:`HEADER_SETS` and :prop_tgt:`INTERFACE_HEADER_SETS` read-only
properties were added to list header sets associated with a target. target properties were added to list header sets associated with a target.
* The :prop_tgt:`HEADER_SET` and :prop_tgt:`HEADER_SET_<NAME>` target * The :prop_tgt:`HEADER_SET` and :prop_tgt:`HEADER_SET_<NAME>` target
properties were added to list files in the default header set properties were added to list files in the default header set
@ -264,3 +264,21 @@ Other Changes
* :manual:`ccmake(1)` may now be enabled on Windows when building * :manual:`ccmake(1)` may now be enabled on Windows when building
CMake from source. This is experimental, and so is not included CMake from source. This is experimental, and so is not included
in official distributions. in official distributions.
Updates
=======
Changes made since CMake 3.23.0 include the following.
3.23.1
------
* The :command:`target_sources` ``FILE_SET`` feature added in CMake 3.23.0
does not yet place header files properly in Apple :prop_tgt:`FRAMEWORK`
targets. Pending further work in a future version of CMake, it is now
an error to add a ``FILE_SET`` of type ``HEADERS`` to such targets on
Apple platforms.
* The :prop_tgt:`HEADER_SETS` and :prop_tgt:`INTERFACE_HEADER_SETS` target
properties added in CMake 3.23.0 are now read-only records of the header
sets created by the :command:`target_sources` command.

@ -1,7 +1,6 @@
CMAKE_CACHEFILE_DIR CMAKE_CACHEFILE_DIR
------------------- -------------------
The directory with the ``CMakeCache.txt`` file. This variable is used internally by CMake, and may not be set during
the first configuration of a build tree. When it is set, it has the
This is the full path to the directory that has the ``CMakeCache.txt`` same value as :variable:`CMAKE_BINARY_DIR`. Use that variable instead.
file in it. This is the same as :variable:`CMAKE_BINARY_DIR`.

@ -16,13 +16,18 @@ conditions are true.
cmake_dependent_option(<option> "<help_text>" <value> <depends> <force>) cmake_dependent_option(<option> "<help_text>" <value> <depends> <force>)
Makes ``<option>`` available to the user if ``<depends>`` is true. When Makes ``<option>`` available to the user if the
``<option>`` is available, the given ``<help_text>`` and initial ``<value>`` :ref:`semicolon-separated list <CMake Language Lists>` of conditions in
are used. If the ``<depends>`` condition is not true, ``<option>`` will not be ``<depends>`` are all true. Otherwise, a local variable named ``<option>``
presented and will always have the value given by ``<force>``. Any value set by is set to ``<force>``.
the user is preserved for when the option is presented again. In case ``<depends>``
is a :ref:`semicolon-separated list <CMake Language Lists>`, all elements must When ``<option>`` is available, the given ``<help_text>`` and initial
be true in order to initialize ``<option>`` with ``<value>``. ``<value>`` are used. Otherwise, any value set by the user is preserved for
when ``<depends>`` is satisfied in the future.
Note that the ``<option>`` variable only has a value which satisfies the
``<depends>`` condition within the scope of the caller because it is a local
variable.
Example invocation: Example invocation:

@ -22,10 +22,13 @@ property for executables will be honored at link time.
Options are: Options are:
``OUTPUT_VARIABLE <output>`` ``OUTPUT_VARIABLE <output>``
Set ``<output>`` variable with details about any error. Set ``<output>`` variable with details about any error. If the check is
bypassed because it uses cached results from a previous call, the output
will be empty even if errors were present in the previous call.
``LANGUAGES <lang>...`` ``LANGUAGES <lang>...``
Check the linkers used for each of the specified languages. Check the linkers used for each of the specified languages.
If this option is not provided, the command checks all enabled languages.
``C``, ``CXX``, ``Fortran`` are supported. ``C``, ``CXX``, ``Fortran`` are supported.
@ -43,9 +46,9 @@ Variables
For each language checked, two boolean cache variables are defined. For each language checked, two boolean cache variables are defined.
``CMAKE_<lang>_LINK_PIE_SUPPORTED`` ``CMAKE_<lang>_LINK_PIE_SUPPORTED``
Set to ``YES`` if ``PIE`` is supported by the linker and ``NO`` otherwise. Set to true if ``PIE`` is supported by the linker and false otherwise.
``CMAKE_<lang>_LINK_NO_PIE_SUPPORTED`` ``CMAKE_<lang>_LINK_NO_PIE_SUPPORTED``
Set to ``YES`` if ``NO_PIE`` is supported by the linker and ``NO`` otherwise. Set to true if ``NO_PIE`` is supported by the linker and false otherwise.
Examples Examples
^^^^^^^^ ^^^^^^^^
@ -139,7 +142,7 @@ function (check_pie_supported)
# no support at link time. Set cache variables to NO # no support at link time. Set cache variables to NO
set(CMAKE_${lang}_LINK_PIE_SUPPORTED NO CACHE INTERNAL "PIE (${lang})") set(CMAKE_${lang}_LINK_PIE_SUPPORTED NO CACHE INTERNAL "PIE (${lang})")
set(CMAKE_${lang}_LINK_NO_PIE_SUPPORTED NO CACHE INTERNAL "NO_PIE (${lang})") set(CMAKE_${lang}_LINK_NO_PIE_SUPPORTED NO CACHE INTERNAL "NO_PIE (${lang})")
string (APPEND outputs "PIE and NO_PIE are not supported by linker for ${lang}") string (APPEND outputs "PIE and NO_PIE are not supported by linker for ${lang}\n")
endif() endif()
endforeach() endforeach()

@ -53,7 +53,7 @@ is set regardless of the presence of the ``Server`` component in find_package ca
# In Windows the default installation of PostgreSQL uses that as part of the path. # In Windows the default installation of PostgreSQL uses that as part of the path.
# E.g C:\Program Files\PostgreSQL\8.4. # E.g C:\Program Files\PostgreSQL\8.4.
# Currently, the following version numbers are known to this module: # Currently, the following version numbers are known to this module:
# "13" "12" "11" "10" "9.6" "9.5" "9.4" "9.3" "9.2" "9.1" "9.0" "8.4" "8.3" "8.2" "8.1" "8.0" # "14" "13" "12" "11" "10" "9.6" "9.5" "9.4" "9.3" "9.2" "9.1" "9.0" "8.4" "8.3" "8.2" "8.1" "8.0"
# #
# To use this variable just do something like this: # To use this variable just do something like this:
# set(PostgreSQL_ADDITIONAL_VERSIONS "9.2" "8.4.4") # set(PostgreSQL_ADDITIONAL_VERSIONS "9.2" "8.4.4")
@ -102,7 +102,7 @@ set(PostgreSQL_ROOT_DIR_MESSAGE "Set the PostgreSQL_ROOT system variable to wher
set(PostgreSQL_KNOWN_VERSIONS ${PostgreSQL_ADDITIONAL_VERSIONS} set(PostgreSQL_KNOWN_VERSIONS ${PostgreSQL_ADDITIONAL_VERSIONS}
"13" "12" "11" "10" "9.6" "9.5" "9.4" "9.3" "9.2" "9.1" "9.0" "8.4" "8.3" "8.2" "8.1" "8.0") "14" "13" "12" "11" "10" "9.6" "9.5" "9.4" "9.3" "9.2" "9.1" "9.0" "8.4" "8.3" "8.2" "8.1" "8.0")
# Define additional search paths for root directories. # Define additional search paths for root directories.
set( PostgreSQL_ROOT_DIRECTORIES set( PostgreSQL_ROOT_DIRECTORIES

@ -55,7 +55,7 @@ where ``<dir>`` is one of:
object code libraries (``lib`` or ``lib64``) object code libraries (``lib`` or ``lib64``)
On Debian, this may be ``lib/<multiarch-tuple>`` when On Debian, this may be ``lib/<multiarch-tuple>`` when
:variable:`CMAKE_INSTALL_PREFIX` is ``/``, ``/usr``, or ``/usr/local``. :variable:`CMAKE_INSTALL_PREFIX` is ``/usr``.
``INCLUDEDIR`` ``INCLUDEDIR``
C header files (``include``) C header files (``include``)
``OLDINCLUDEDIR`` ``OLDINCLUDEDIR``
@ -273,9 +273,7 @@ if(NOT DEFINED CMAKE_INSTALL_LIBDIR OR (_libdir_set
if(__system_type_for_install STREQUAL "debian") if(__system_type_for_install STREQUAL "debian")
if(CMAKE_LIBRARY_ARCHITECTURE) if(CMAKE_LIBRARY_ARCHITECTURE)
if("${CMAKE_INSTALL_PREFIX}" STREQUAL "/" if("${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/?$")
OR "${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/?$"
OR "${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/local/?$")
set(_LIBDIR_DEFAULT "lib/${CMAKE_LIBRARY_ARCHITECTURE}") set(_LIBDIR_DEFAULT "lib/${CMAKE_LIBRARY_ARCHITECTURE}")
endif() endif()
if(DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX if(DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX

@ -59,8 +59,8 @@ macro(CMAKE_CHECK_FLAG_COMMON_INIT _FUNC _LANG _SRC _PATTERNS)
return() return()
endif() endif()
# Normalize locale during test compilation. # Normalize locale during test compilation.
set(_locale_vars LC_ALL LC_MESSAGES LANG) set(_CFCC_locale_vars LC_ALL LC_MESSAGES LANG)
foreach(v IN LISTS _locale_vars) foreach(v IN LISTS _CFCC_locale_vars)
set(_CMAKE_CHECK_FLAG_COMMON_CONFIG_locale_vars_saved_${v} "$ENV{${v}}") set(_CMAKE_CHECK_FLAG_COMMON_CONFIG_locale_vars_saved_${v} "$ENV{${v}}")
set(ENV{${v}} C) set(ENV{${v}} C)
endforeach() endforeach()

@ -0,0 +1,69 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
# Do NOT include this module directly into any of your code. It is used by
# the try_compile() implementation to work around a specific issue with
# conflicting flags when building for Apple platforms.
if(NOT APPLE)
return()
endif()
cmake_policy(PUSH)
cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
function(__cmake_internal_workaround_headerpad_flag_conflict _LANG)
# Until we can avoid hard-coding -Wl,-headerpad_max_install_names in the
# linker flags, we need to remove it here for cases where we know it will
# conflict with other flags, generate a warning and be ignored.
set(regex "(^| )(-fembed-bitcode(-marker|=(all|bitcode|marker))?|-bundle_bitcode)($| )")
set(remove_headerpad NO)
# Check arbitrary flags that the user or project has set. These compiler
# flags get added to the linker command line.
if("${CMAKE_${_LANG}_FLAGS}" MATCHES "${regex}")
set(remove_headerpad YES)
endif()
if(NOT remove_headerpad)
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(is_multi_config)
# Only one of these config-specific variables will be set by try_compile()
# and the rest will be unset, but we can't easily tell which one is set.
# No harm to just add them all here, empty ones won't add flags to check.
foreach(config IN LISTS CMAKE_CONFIGURATION_TYPES)
if("${CMAKE_${_LANG}_FLAGS_${config}}" MATCHES "${regex}")
set(remove_headerpad YES)
break()
endif()
endforeach()
else()
if("${CMAKE_${_LANG}_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}")
set(remove_headerpad YES)
endif()
endif()
endif()
# The try_compile() command passes compiler flags to check in a way that
# results in them being added to add_definitions(). Those don't end up on
# the linker command line, so we don't need to check them here.
if(remove_headerpad)
foreach(flag IN ITEMS
CMAKE_${_LANG}_LINK_FLAGS
CMAKE_SHARED_LIBRARY_CREATE_${_LANG}_FLAGS
CMAKE_SHARED_MODULE_CREATE_${_LANG}_FLAGS)
string(REPLACE "-Wl,-headerpad_max_install_names" "" ${flag} "${${flag}}")
set(${flag} "${${flag}}" PARENT_SCOPE)
endforeach()
endif()
endfunction()
get_property(__enabled_languages GLOBAL PROPERTY ENABLED_LANGUAGES)
foreach(__lang IN LISTS __enabled_languages)
__cmake_internal_workaround_headerpad_flag_conflict(${__lang})
endforeach()
unset(__lang)
unset(__enabled_languages)
cmake_policy(POP)

@ -1,7 +1,7 @@
# CMake version number components. # CMake version number components.
set(CMake_VERSION_MAJOR 3) set(CMake_VERSION_MAJOR 3)
set(CMake_VERSION_MINOR 23) set(CMake_VERSION_MINOR 23)
set(CMake_VERSION_PATCH 0) set(CMake_VERSION_PATCH 1)
#set(CMake_VERSION_RC 0) #set(CMake_VERSION_RC 0)
set(CMake_VERSION_IS_DIRTY 0) set(CMake_VERSION_IS_DIRTY 0)
@ -21,7 +21,7 @@ endif()
if(NOT CMake_VERSION_NO_GIT) if(NOT CMake_VERSION_NO_GIT)
# If this source was exported by 'git archive', use its commit info. # If this source was exported by 'git archive', use its commit info.
set(git_info [==[00677703d0 CMake 3.23.0]==]) set(git_info [==[efe08e2894 CMake 3.23.1]==])
# Otherwise, try to identify the current development source version. # Otherwise, try to identify the current development source version.
if(NOT git_info MATCHES "^([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]?[0-9a-f]?)[0-9a-f]* " if(NOT git_info MATCHES "^([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]?[0-9a-f]?)[0-9a-f]* "

@ -831,6 +831,12 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
? "NEW" ? "NEW"
: "OLD"); : "OLD");
// Workaround for -Wl,-headerpad_max_install_names issue until we can avoid
// adding that flag in the platform and compiler language files
fprintf(fout,
"include(\"${CMAKE_ROOT}/Modules/Internal/"
"HeaderpadWorkaround.cmake\")\n");
if (targetType == cmStateEnums::EXECUTABLE) { if (targetType == cmStateEnums::EXECUTABLE) {
/* Put the executable at a known location (for COPY_FILE). */ /* Put the executable at a known location (for COPY_FILE). */
fprintf(fout, "set(CMAKE_RUNTIME_OUTPUT_DIRECTORY \"%s\")\n", fprintf(fout, "set(CMAKE_RUNTIME_OUTPUT_DIRECTORY \"%s\")\n",

@ -7,19 +7,79 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <cmext/string_view>
#include "cmsys/RegularExpression.hxx" #include "cmsys/RegularExpression.hxx"
#include "cmGeneratorExpression.h" #include "cmGeneratorExpression.h"
#include "cmListFileCache.h" #include "cmListFileCache.h"
#include "cmLocalGenerator.h" #include "cmLocalGenerator.h"
#include "cmMakefile.h"
#include "cmMessageType.h" #include "cmMessageType.h"
#include "cmStringAlgorithms.h" #include "cmStringAlgorithms.h"
#include "cmSystemTools.h" #include "cmSystemTools.h"
#include "cmake.h" #include "cmake.h"
cmFileSet::cmFileSet(std::string name, std::string type) cm::static_string_view cmFileSetVisibilityToName(cmFileSetVisibility vis)
{
switch (vis) {
case cmFileSetVisibility::Interface:
return "INTERFACE"_s;
case cmFileSetVisibility::Public:
return "PUBLIC"_s;
case cmFileSetVisibility::Private:
return "PRIVATE"_s;
}
return ""_s;
}
cmFileSetVisibility cmFileSetVisibilityFromName(cm::string_view name,
cmMakefile* mf)
{
if (name == "INTERFACE"_s) {
return cmFileSetVisibility::Interface;
}
if (name == "PUBLIC"_s) {
return cmFileSetVisibility::Public;
}
if (name == "PRIVATE"_s) {
return cmFileSetVisibility::Private;
}
mf->IssueMessage(
MessageType::FATAL_ERROR,
cmStrCat("File set visibility \"", name, "\" is not valid."));
return cmFileSetVisibility::Private;
}
bool cmFileSetVisibilityIsForSelf(cmFileSetVisibility vis)
{
switch (vis) {
case cmFileSetVisibility::Interface:
return false;
case cmFileSetVisibility::Public:
case cmFileSetVisibility::Private:
return true;
}
return false;
}
bool cmFileSetVisibilityIsForInterface(cmFileSetVisibility vis)
{
switch (vis) {
case cmFileSetVisibility::Interface:
case cmFileSetVisibility::Public:
return true;
case cmFileSetVisibility::Private:
return false;
}
return false;
}
cmFileSet::cmFileSet(std::string name, std::string type,
cmFileSetVisibility visibility)
: Name(std::move(name)) : Name(std::move(name))
, Type(std::move(type)) , Type(std::move(type))
, Visibility(visibility)
{ {
} }

@ -7,20 +7,38 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include <cm/string_view>
#include <cmext/string_view>
#include "cmListFileCache.h" #include "cmListFileCache.h"
class cmCompiledGeneratorExpression; class cmCompiledGeneratorExpression;
struct cmGeneratorExpressionDAGChecker; struct cmGeneratorExpressionDAGChecker;
class cmGeneratorTarget; class cmGeneratorTarget;
class cmLocalGenerator; class cmLocalGenerator;
class cmMakefile;
enum class cmFileSetVisibility
{
Private,
Public,
Interface,
};
cm::static_string_view cmFileSetVisibilityToName(cmFileSetVisibility vis);
cmFileSetVisibility cmFileSetVisibilityFromName(cm::string_view name,
cmMakefile* mf);
bool cmFileSetVisibilityIsForSelf(cmFileSetVisibility vis);
bool cmFileSetVisibilityIsForInterface(cmFileSetVisibility vis);
class cmFileSet class cmFileSet
{ {
public: public:
cmFileSet(std::string name, std::string type); cmFileSet(std::string name, std::string type,
cmFileSetVisibility visibility);
const std::string& GetName() const { return this->Name; } const std::string& GetName() const { return this->Name; }
const std::string& GetType() const { return this->Type; } const std::string& GetType() const { return this->Type; }
cmFileSetVisibility GetVisibility() const { return this->Visibility; }
void ClearDirectoryEntries(); void ClearDirectoryEntries();
void AddDirectoryEntry(BT<std::string> directories); void AddDirectoryEntry(BT<std::string> directories);
@ -61,6 +79,7 @@ public:
private: private:
std::string Name; std::string Name;
std::string Type; std::string Type;
cmFileSetVisibility Visibility;
std::vector<BT<std::string>> DirectoryEntries; std::vector<BT<std::string>> DirectoryEntries;
std::vector<BT<std::string>> FileEntries; std::vector<BT<std::string>> FileEntries;
}; };

@ -2469,12 +2469,12 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target)
static const std::array<std::string, 4> langs = { { "C", "CXX", "OBJC", static const std::array<std::string, 4> langs = { { "C", "CXX", "OBJC",
"OBJCXX" } }; "OBJCXX" } };
bool haveAnyPch = false; std::set<std::string> pchLangSet;
if (this->GetGlobalGenerator()->IsXcode()) { if (this->GetGlobalGenerator()->IsXcode()) {
for (const std::string& lang : langs) { for (const std::string& lang : langs) {
const std::string pchHeader = target->GetPchHeader(config, lang, ""); const std::string pchHeader = target->GetPchHeader(config, lang, "");
if (!pchHeader.empty()) { if (!pchHeader.empty()) {
haveAnyPch = true; pchLangSet.emplace(lang);
} }
} }
} }
@ -2519,11 +2519,13 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target)
const std::string pchHeader = target->GetPchHeader(config, lang, arch); const std::string pchHeader = target->GetPchHeader(config, lang, arch);
if (pchSource.empty() || pchHeader.empty()) { if (pchSource.empty() || pchHeader.empty()) {
if (this->GetGlobalGenerator()->IsXcode() && haveAnyPch) { if (this->GetGlobalGenerator()->IsXcode() && !pchLangSet.empty()) {
for (auto* sf : sources) { for (auto* sf : sources) {
if (pchLangSet.find(sf->GetLanguage()) == pchLangSet.end()) {
sf->SetProperty("SKIP_PRECOMPILE_HEADERS", "ON"); sf->SetProperty("SKIP_PRECOMPILE_HEADERS", "ON");
} }
} }
}
continue; continue;
} }

@ -1678,27 +1678,31 @@ void cmNinjaTargetGenerator::ExportObjectCompileCommand(
compileObjectVars.Includes = includes.c_str(); compileObjectVars.Includes = includes.c_str();
// Rule for compiling object file. // Rule for compiling object file.
std::vector<std::string> compileCmds; std::string cudaCompileMode;
if (language == "CUDA") { if (language == "CUDA") {
std::string cmdVar;
if (this->GeneratorTarget->GetPropertyAsBool( if (this->GeneratorTarget->GetPropertyAsBool(
"CUDA_SEPARABLE_COMPILATION")) { "CUDA_SEPARABLE_COMPILATION")) {
cmdVar = "CMAKE_CUDA_COMPILE_SEPARABLE_COMPILATION"; const std::string& rdcFlag =
} else if (this->GeneratorTarget->GetPropertyAsBool( this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_RDC_FLAG");
"CUDA_PTX_COMPILATION")) { cudaCompileMode = cmStrCat(cudaCompileMode, rdcFlag, " ");
cmdVar = "CMAKE_CUDA_COMPILE_PTX_COMPILATION";
} else {
cmdVar = "CMAKE_CUDA_COMPILE_WHOLE_COMPILATION";
} }
const std::string& compileCmd = if (this->GeneratorTarget->GetPropertyAsBool("CUDA_PTX_COMPILATION")) {
this->GetMakefile()->GetRequiredDefinition(cmdVar); const std::string& ptxFlag =
cmExpandList(compileCmd, compileCmds); this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_PTX_FLAG");
cudaCompileMode = cmStrCat(cudaCompileMode, ptxFlag);
} else { } else {
const std::string& wholeFlag =
this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_WHOLE_FLAG");
cudaCompileMode = cmStrCat(cudaCompileMode, wholeFlag);
}
compileObjectVars.CudaCompileMode = cudaCompileMode.c_str();
}
std::vector<std::string> compileCmds;
const std::string cmdVar = cmStrCat("CMAKE_", language, "_COMPILE_OBJECT"); const std::string cmdVar = cmStrCat("CMAKE_", language, "_COMPILE_OBJECT");
const std::string& compileCmd = const std::string& compileCmd =
this->GetMakefile()->GetRequiredDefinition(cmdVar); this->Makefile->GetRequiredDefinition(cmdVar);
cmExpandList(compileCmd, compileCmds); cmExpandList(compileCmd, compileCmds);
}
std::unique_ptr<cmRulePlaceholderExpander> rulePlaceholderExpander( std::unique_ptr<cmRulePlaceholderExpander> rulePlaceholderExpander(
this->GetLocalGenerator()->CreateRulePlaceholderExpander()); this->GetLocalGenerator()->CreateRulePlaceholderExpander());

@ -1456,37 +1456,14 @@ void cmTarget::StoreProperty(const std::string& prop, ValueType value)
BT<std::string>(value, this->impl->Makefile->GetBacktrace())); BT<std::string>(value, this->impl->Makefile->GetBacktrace()));
} }
} else if (prop == propHEADER_SETS) { } else if (prop == propHEADER_SETS) {
if (value) { this->impl->Makefile->IssueMessage(MessageType::FATAL_ERROR,
for (auto const& name : cmExpandedList(value)) { "HEADER_SETS property is read-only\n");
if (!this->GetFileSet(name)) {
this->impl->Makefile->IssueMessage(
MessageType::FATAL_ERROR,
cmStrCat("Header set \"", name, "\" has not yet been created."));
return; return;
}
}
}
this->impl->HeaderSetsEntries.clear();
if (!StringIsEmpty(value)) {
this->impl->HeaderSetsEntries.emplace_back(
value, this->impl->Makefile->GetBacktrace());
}
} else if (prop == propINTERFACE_HEADER_SETS) { } else if (prop == propINTERFACE_HEADER_SETS) {
if (value) {
for (auto const& name : cmExpandedList(value)) {
if (!this->GetFileSet(name)) {
this->impl->Makefile->IssueMessage( this->impl->Makefile->IssueMessage(
MessageType::FATAL_ERROR, MessageType::FATAL_ERROR,
cmStrCat("Header set \"", name, "\" has not yet been created.")); "INTERFACE_HEADER_SETS property is read-only\n");
return; return;
}
}
}
this->impl->InterfaceHeaderSetsEntries.clear();
if (!StringIsEmpty(value)) {
this->impl->InterfaceHeaderSetsEntries.emplace_back(
value, this->impl->Makefile->GetBacktrace());
}
} else { } else {
this->impl->Properties.SetProperty(prop, value); this->impl->Properties.SetProperty(prop, value);
} }
@ -1641,27 +1618,14 @@ void cmTarget::AppendProperty(const std::string& prop,
fileSet->AddFileEntry( fileSet->AddFileEntry(
BT<std::string>(value, this->impl->Makefile->GetBacktrace())); BT<std::string>(value, this->impl->Makefile->GetBacktrace()));
} else if (prop == "HEADER_SETS") { } else if (prop == "HEADER_SETS") {
for (auto const& name : cmExpandedList(value)) { this->impl->Makefile->IssueMessage(MessageType::FATAL_ERROR,
if (!this->GetFileSet(name)) { "HEADER_SETS property is read-only\n");
this->impl->Makefile->IssueMessage(
MessageType::FATAL_ERROR,
cmStrCat("Header set \"", name, "\" has not yet been created."));
return; return;
}
}
this->impl->HeaderSetsEntries.emplace_back(
value, this->impl->Makefile->GetBacktrace());
} else if (prop == "INTERFACE_HEADER_SETS") { } else if (prop == "INTERFACE_HEADER_SETS") {
for (auto const& name : cmExpandedList(value)) {
if (!this->GetFileSet(name)) {
this->impl->Makefile->IssueMessage( this->impl->Makefile->IssueMessage(
MessageType::FATAL_ERROR, MessageType::FATAL_ERROR,
cmStrCat("Header set \"", name, "\" has not yet been created.")); "INTERFACE_HEADER_SETS property is read-only\n");
return; return;
}
}
this->impl->InterfaceHeaderSetsEntries.emplace_back(
value, this->impl->Makefile->GetBacktrace());
} else { } else {
this->impl->Properties.AppendProperty(prop, value, asString); this->impl->Properties.AppendProperty(prop, value, asString);
} }
@ -2038,13 +2002,26 @@ cmValue cmTarget::GetProperty(const std::string& prop) const
return cmValue(output); return cmValue(output);
} }
if (prop == propHEADER_SETS) { if (prop == propHEADER_SETS) {
std::vector<std::string> set_names;
for (auto const& file_set : this->impl->FileSets) {
if (cmFileSetVisibilityIsForSelf(file_set.second.GetVisibility())) {
set_names.push_back(file_set.second.GetName());
}
}
static std::string output; static std::string output;
output = cmJoin(this->impl->HeaderSetsEntries, ";"_s); output = cmJoin(set_names, ";"_s);
return cmValue(output); return cmValue(output);
} }
if (prop == propINTERFACE_HEADER_SETS) { if (prop == propINTERFACE_HEADER_SETS) {
std::vector<std::string> set_names;
for (auto const& file_set : this->impl->FileSets) {
if (cmFileSetVisibilityIsForInterface(
file_set.second.GetVisibility())) {
set_names.push_back(file_set.second.GetName());
}
}
static std::string output; static std::string output;
output = cmJoin(this->impl->InterfaceHeaderSetsEntries, ";"_s); output = cmJoin(set_names, ";"_s);
return cmValue(output); return cmValue(output);
} }
} }
@ -2342,10 +2319,20 @@ cmFileSet* cmTarget::GetFileSet(const std::string& name)
} }
std::pair<cmFileSet*, bool> cmTarget::GetOrCreateFileSet( std::pair<cmFileSet*, bool> cmTarget::GetOrCreateFileSet(
const std::string& name, const std::string& type) const std::string& name, const std::string& type, cmFileSetVisibility vis)
{ {
auto result = auto result = this->impl->FileSets.emplace(
this->impl->FileSets.emplace(std::make_pair(name, cmFileSet(name, type))); std::make_pair(name, cmFileSet(name, type, vis)));
if (result.second) {
if (cmFileSetVisibilityIsForSelf(vis)) {
this->impl->HeaderSetsEntries.emplace_back(
name, this->impl->Makefile->GetBacktrace());
}
if (cmFileSetVisibilityIsForInterface(vis)) {
this->impl->InterfaceHeaderSetsEntries.emplace_back(
name, this->impl->Makefile->GetBacktrace());
}
}
return std::make_pair(&result.first->second, result.second); return std::make_pair(&result.first->second, result.second);
} }

@ -12,6 +12,7 @@
#include <vector> #include <vector>
#include "cmAlgorithms.h" #include "cmAlgorithms.h"
#include "cmFileSet.h"
#include "cmPolicies.h" #include "cmPolicies.h"
#include "cmStateTypes.h" #include "cmStateTypes.h"
#include "cmStringAlgorithms.h" #include "cmStringAlgorithms.h"
@ -19,7 +20,6 @@
#include "cmValue.h" #include "cmValue.h"
class cmCustomCommand; class cmCustomCommand;
class cmFileSet;
class cmGlobalGenerator; class cmGlobalGenerator;
class cmInstallTargetGenerator; class cmInstallTargetGenerator;
class cmListFileBacktrace; class cmListFileBacktrace;
@ -285,7 +285,8 @@ public:
const cmFileSet* GetFileSet(const std::string& name) const; const cmFileSet* GetFileSet(const std::string& name) const;
cmFileSet* GetFileSet(const std::string& name); cmFileSet* GetFileSet(const std::string& name);
std::pair<cmFileSet*, bool> GetOrCreateFileSet(const std::string& name, std::pair<cmFileSet*, bool> GetOrCreateFileSet(const std::string& name,
const std::string& type); const std::string& type,
cmFileSetVisibility vis);
std::vector<std::string> GetAllInterfaceFileSets() const; std::vector<std::string> GetAllInterfaceFileSets() const;

@ -2,7 +2,6 @@
file Copyright.txt or https://cmake.org/licensing for details. */ file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmTargetSourcesCommand.h" #include "cmTargetSourcesCommand.h"
#include <algorithm>
#include <sstream> #include <sstream>
#include <utility> #include <utility>
@ -230,12 +229,20 @@ bool TargetSourcesImpl::HandleOneFileSet(
this->SetError("FILE_SETs may not be added to custom targets"); this->SetError("FILE_SETs may not be added to custom targets");
return false; return false;
} }
if (this->Target->IsFrameworkOnApple()) {
this->SetError("FILE_SETs may not be added to FRAMEWORK targets");
return false;
}
bool const isDefault = args.Type == args.FileSet || bool const isDefault = args.Type == args.FileSet ||
(args.Type.empty() && args.FileSet[0] >= 'A' && args.FileSet[0] <= 'Z'); (args.Type.empty() && args.FileSet[0] >= 'A' && args.FileSet[0] <= 'Z');
std::string type = isDefault ? args.FileSet : args.Type; std::string type = isDefault ? args.FileSet : args.Type;
auto fileSet = this->Target->GetOrCreateFileSet(args.FileSet, type); cmFileSetVisibility visibility =
cmFileSetVisibilityFromName(scope, this->Makefile);
auto fileSet =
this->Target->GetOrCreateFileSet(args.FileSet, type, visibility);
if (fileSet.second) { if (fileSet.second) {
if (!isDefault) { if (!isDefault) {
if (!cmFileSet::IsValidName(args.FileSet)) { if (!cmFileSet::IsValidName(args.FileSet)) {
@ -257,15 +264,6 @@ bool TargetSourcesImpl::HandleOneFileSet(
if (args.BaseDirs.empty()) { if (args.BaseDirs.empty()) {
args.BaseDirs.emplace_back(this->Makefile->GetCurrentSourceDirectory()); args.BaseDirs.emplace_back(this->Makefile->GetCurrentSourceDirectory());
} }
if (scope == "PRIVATE"_s || scope == "PUBLIC"_s) {
this->Target->AppendProperty(cmTarget::GetFileSetsPropertyName(type),
args.FileSet);
}
if (scope == "INTERFACE"_s || scope == "PUBLIC"_s) {
this->Target->AppendProperty(
cmTarget::GetInterfaceFileSetsPropertyName(type), args.FileSet);
}
} else { } else {
type = fileSet.first->GetType(); type = fileSet.first->GetType();
if (!args.Type.empty() && args.Type != type) { if (!args.Type.empty() && args.Type != type) {
@ -275,37 +273,11 @@ bool TargetSourcesImpl::HandleOneFileSet(
return false; return false;
} }
std::string existingScope = "PRIVATE"; if (visibility != fileSet.first->GetVisibility()) {
auto const fileSetsProperty = cmTarget::GetFileSetsPropertyName(type);
auto const interfaceFileSetsProperty =
cmTarget::GetInterfaceFileSetsPropertyName(type);
std::vector<std::string> fileSets;
std::vector<std::string> interfaceFileSets;
cmExpandList(this->Target->GetSafeProperty(fileSetsProperty), fileSets);
cmExpandList(this->Target->GetSafeProperty(interfaceFileSetsProperty),
interfaceFileSets);
if (std::find(interfaceFileSets.begin(), interfaceFileSets.end(),
args.FileSet) != interfaceFileSets.end()) {
existingScope = "INTERFACE";
}
if (std::find(fileSets.begin(), fileSets.end(), args.FileSet) !=
fileSets.end()) {
if (existingScope == "INTERFACE"_s) {
existingScope = "PUBLIC";
}
} else if (existingScope != "INTERFACE"_s) {
this->SetError(cmStrCat("File set \"", args.FileSet, "\" is not in ",
fileSetsProperty, " or ",
interfaceFileSetsProperty));
return false;
}
if (scope != existingScope) {
this->SetError( this->SetError(
cmStrCat("Scope ", scope, " for file set \"", args.FileSet, cmStrCat("Scope ", scope, " for file set \"", args.FileSet,
"\" does not match original scope ", existingScope)); "\" does not match original scope ",
cmFileSetVisibilityToName(fileSet.first->GetVisibility())));
return false; return false;
} }
} }
@ -326,11 +298,11 @@ bool TargetSourcesImpl::HandleOneFileSet(
for (auto const& dir : cmExpandedList(baseDirectories)) { for (auto const& dir : cmExpandedList(baseDirectories)) {
auto interfaceDirectoriesGenex = auto interfaceDirectoriesGenex =
cmStrCat("$<BUILD_INTERFACE:", dir, ">"); cmStrCat("$<BUILD_INTERFACE:", dir, ">");
if (scope == "PRIVATE"_s || scope == "PUBLIC"_s) { if (cmFileSetVisibilityIsForSelf(visibility)) {
this->Target->AppendProperty("INCLUDE_DIRECTORIES", this->Target->AppendProperty("INCLUDE_DIRECTORIES",
interfaceDirectoriesGenex); interfaceDirectoriesGenex);
} }
if (scope == "INTERFACE"_s || scope == "PUBLIC"_s) { if (cmFileSetVisibilityIsForInterface(visibility)) {
this->Target->AppendProperty("INTERFACE_INCLUDE_DIRECTORIES", this->Target->AppendProperty("INTERFACE_INCLUDE_DIRECTORIES",
interfaceDirectoriesGenex); interfaceDirectoriesGenex);
} }

@ -306,10 +306,11 @@ int do_cmake(int ac, char const* const* av)
parsedArgs.emplace_back("--find-package"); parsedArgs.emplace_back("--find-package");
return true; return true;
} }, } },
CommandArgument{ "--list-presets", CommandArgument::Values::Zero, CommandArgument{ "--list-presets", CommandArgument::Values::ZeroOrOne,
[&](std::string const&) -> bool { [&](std::string const& value) -> bool {
workingMode = cmake::HELP_MODE; workingMode = cmake::HELP_MODE;
parsedArgs.emplace_back("--list-presets"); parsedArgs.emplace_back("--list-presets");
parsedArgs.emplace_back(value);
return true; return true;
} }, } },
}; };

@ -1,6 +1,8 @@
cmake_minimum_required(VERSION 3.18) cmake_minimum_required(VERSION 3.18)
project(WithDefs CUDA) project(WithDefs CUDA)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(release_compile_defs DEFREL) set(release_compile_defs DEFREL)
#Goal for this example: #Goal for this example:

@ -0,0 +1,7 @@
^Not searching for unused variables given on the command line\.
Available configure presets:
"zzzzzz" - Sleepy
"aaaaaaaa" - Screaming
"mmmmmm"
"no-generator"$

@ -71,13 +71,18 @@ function(run_cmake_presets name)
set(_unused_cli) set(_unused_cli)
endif() endif()
set(_preset "--preset=${name}")
if(CMakePresets_NO_PRESET)
set(_preset)
endif()
set(RunCMake_TEST_COMMAND ${CMAKE_COMMAND} set(RunCMake_TEST_COMMAND ${CMAKE_COMMAND}
${_source_args} ${_source_args}
-DRunCMake_TEST=${name} -DRunCMake_TEST=${name}
-DRunCMake_GENERATOR=${RunCMake_GENERATOR} -DRunCMake_GENERATOR=${RunCMake_GENERATOR}
-DCMAKE_MAKE_PROGRAM=${RunCMake_MAKE_PROGRAM} -DCMAKE_MAKE_PROGRAM=${RunCMake_MAKE_PROGRAM}
${_unused_cli} ${_unused_cli}
--preset=${name} ${_preset}
${ARGN} ${ARGN}
) )
run_cmake(${name}) run_cmake(${name})
@ -288,7 +293,10 @@ run_cmake_presets(ListPresets --list-presets)
set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/ListPresetsWorkingDir") set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/ListPresetsWorkingDir")
set(RunCMake_TEST_NO_CLEAN 1) set(RunCMake_TEST_NO_CLEAN 1)
set(CMakePresets_NO_SOURCE_ARGS 1) set(CMakePresets_NO_SOURCE_ARGS 1)
set(CMakePresets_NO_PRESET 1)
run_cmake_presets(ListPresetsWorkingDir --list-presets) run_cmake_presets(ListPresetsWorkingDir --list-presets)
run_cmake_presets(ListConfigurePresetsWorkingDir --list-presets=configure)
unset(CMakePresets_NO_PRESET)
unset(CMakePresets_NO_SOURCE_ARGS) unset(CMakePresets_NO_SOURCE_ARGS)
unset(RunCMake_TEST_NO_CLEAN) unset(RunCMake_TEST_NO_CLEAN)
unset(RunCMake_TEST_BINARY_DIR) unset(RunCMake_TEST_BINARY_DIR)

@ -4,6 +4,10 @@ include(CheckCompilerFlag)
set(C 1) # test that this is tolerated set(C 1) # test that this is tolerated
# test that the check uses an isolated locale
set(_env_LC_ALL "${LC_ALL}")
set(ENV{LC_ALL} "BAD")
check_compiler_flag(C "-_this_is_not_a_flag_" SHOULD_FAIL) check_compiler_flag(C "-_this_is_not_a_flag_" SHOULD_FAIL)
if(SHOULD_FAIL) if(SHOULD_FAIL)
message(SEND_ERROR "invalid C compile flag didn't fail.") message(SEND_ERROR "invalid C compile flag didn't fail.")
@ -22,3 +26,8 @@ if(CMAKE_C_COMPILER_ID STREQUAL "GNU") # LCC C compiler silently ignore -frtti i
message(SEND_ERROR "${CMAKE_C_COMPILER_ID} compiler flag '-frtti' check passed but should have failed") message(SEND_ERROR "${CMAKE_C_COMPILER_ID} compiler flag '-frtti' check passed but should have failed")
endif() endif()
endif() endif()
if(NOT "$ENV{LC_ALL}" STREQUAL "BAD")
message(SEND_ERROR "ENV{LC_ALL} was not preserved by check_compiler_flag")
endif()
set(ENV{LC_ALL} ${_env_LC_ALL})

@ -4,6 +4,10 @@ include(CheckCompilerFlag)
set(CXX 1) # test that this is tolerated set(CXX 1) # test that this is tolerated
# test that the check uses an isolated locale
set(_env_LC_ALL "${LC_ALL}")
set(ENV{LC_ALL} "BAD")
check_compiler_flag(CXX "-_this_is_not_a_flag_" SHOULD_FAIL) check_compiler_flag(CXX "-_this_is_not_a_flag_" SHOULD_FAIL)
if(SHOULD_FAIL) if(SHOULD_FAIL)
message(SEND_ERROR "invalid CXX compile flag didn't fail.") message(SEND_ERROR "invalid CXX compile flag didn't fail.")
@ -15,3 +19,8 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|LCC|Clang" AND NOT "x${CMAKE_CXX_SIMULATE_
message(SEND_ERROR "${CMAKE_CXX_COMPILER_ID} compiler flag '-x c++' check failed") message(SEND_ERROR "${CMAKE_CXX_COMPILER_ID} compiler flag '-x c++' check failed")
endif() endif()
endif() endif()
if(NOT "$ENV{LC_ALL}" STREQUAL "BAD")
message(SEND_ERROR "ENV{LC_ALL} was not preserved by check_compiler_flag")
endif()
set(ENV{LC_ALL} ${_env_LC_ALL})

@ -0,0 +1,18 @@
enable_language(C)
include(CheckCompilerFlag)
# Confirm we can check the conflicting flag directly. This should pass with
# or without the workaround.
check_compiler_flag(C "-fembed-bitcode" result1)
if(NOT result1)
message(FATAL_ERROR "False negative when -fembed-bitcode tested directly")
endif()
# Check conflicting flag set by user or project won't cause a false negative
# when testing a valid flag. This only passes with the workaround.
set(CMAKE_C_FLAGS -fembed-bitcode)
check_compiler_flag(C "-O" result2)
if(NOT result2)
message(FATAL_ERROR "False negative when -fembed-bitcode set in CMAKE_C_FLAGS")
endif()

@ -26,3 +26,7 @@ endif()
if(CMake_TEST_HIP) if(CMake_TEST_HIP)
run_cmake(CheckHIPCompilerFlag) run_cmake(CheckHIPCompilerFlag)
endif() endif()
if(APPLE)
run_cmake_with_options(HeaderpadWorkaround --debug-trycompile)
endif()

@ -4,7 +4,7 @@ CMAKE_INSTALL_DATAROOTDIR='usr/share'
CMAKE_INSTALL_DOCDIR='usr/share/doc/Root' CMAKE_INSTALL_DOCDIR='usr/share/doc/Root'
CMAKE_INSTALL_INCLUDEDIR='usr/include' CMAKE_INSTALL_INCLUDEDIR='usr/include'
CMAKE_INSTALL_INFODIR='usr/share/info' CMAKE_INSTALL_INFODIR='usr/share/info'
CMAKE_INSTALL_LIBDIR='usr/lib/arch' CMAKE_INSTALL_LIBDIR='usr/lib'
CMAKE_INSTALL_LIBEXECDIR='usr/libexec' CMAKE_INSTALL_LIBEXECDIR='usr/libexec'
CMAKE_INSTALL_LOCALEDIR='usr/share/locale' CMAKE_INSTALL_LOCALEDIR='usr/share/locale'
CMAKE_INSTALL_LOCALSTATEDIR='var' CMAKE_INSTALL_LOCALSTATEDIR='var'
@ -19,7 +19,7 @@ CMAKE_INSTALL_FULL_DATAROOTDIR='/usr/share'
CMAKE_INSTALL_FULL_DOCDIR='/usr/share/doc/Root' CMAKE_INSTALL_FULL_DOCDIR='/usr/share/doc/Root'
CMAKE_INSTALL_FULL_INCLUDEDIR='/usr/include' CMAKE_INSTALL_FULL_INCLUDEDIR='/usr/include'
CMAKE_INSTALL_FULL_INFODIR='/usr/share/info' CMAKE_INSTALL_FULL_INFODIR='/usr/share/info'
CMAKE_INSTALL_FULL_LIBDIR='/usr/lib/arch' CMAKE_INSTALL_FULL_LIBDIR='/usr/lib'
CMAKE_INSTALL_FULL_LIBEXECDIR='/usr/libexec' CMAKE_INSTALL_FULL_LIBEXECDIR='/usr/libexec'
CMAKE_INSTALL_FULL_LOCALEDIR='/usr/share/locale' CMAKE_INSTALL_FULL_LOCALEDIR='/usr/share/locale'
CMAKE_INSTALL_FULL_LOCALSTATEDIR='/var' CMAKE_INSTALL_FULL_LOCALSTATEDIR='/var'

@ -4,7 +4,7 @@ CMAKE_INSTALL_DATAROOTDIR='share'
CMAKE_INSTALL_DOCDIR='share/doc/UsrLocal' CMAKE_INSTALL_DOCDIR='share/doc/UsrLocal'
CMAKE_INSTALL_INCLUDEDIR='include' CMAKE_INSTALL_INCLUDEDIR='include'
CMAKE_INSTALL_INFODIR='share/info' CMAKE_INSTALL_INFODIR='share/info'
CMAKE_INSTALL_LIBDIR='lib/arch' CMAKE_INSTALL_LIBDIR='lib'
CMAKE_INSTALL_LIBEXECDIR='libexec' CMAKE_INSTALL_LIBEXECDIR='libexec'
CMAKE_INSTALL_LOCALEDIR='share/locale' CMAKE_INSTALL_LOCALEDIR='share/locale'
CMAKE_INSTALL_LOCALSTATEDIR='var' CMAKE_INSTALL_LOCALSTATEDIR='var'
@ -19,7 +19,7 @@ CMAKE_INSTALL_FULL_DATAROOTDIR='/usr/local/share'
CMAKE_INSTALL_FULL_DOCDIR='/usr/local/share/doc/UsrLocal' CMAKE_INSTALL_FULL_DOCDIR='/usr/local/share/doc/UsrLocal'
CMAKE_INSTALL_FULL_INCLUDEDIR='/usr/local/include' CMAKE_INSTALL_FULL_INCLUDEDIR='/usr/local/include'
CMAKE_INSTALL_FULL_INFODIR='/usr/local/share/info' CMAKE_INSTALL_FULL_INFODIR='/usr/local/share/info'
CMAKE_INSTALL_FULL_LIBDIR='/usr/local/lib/arch' CMAKE_INSTALL_FULL_LIBDIR='/usr/local/lib'
CMAKE_INSTALL_FULL_LIBEXECDIR='/usr/local/libexec' CMAKE_INSTALL_FULL_LIBEXECDIR='/usr/local/libexec'
CMAKE_INSTALL_FULL_LOCALEDIR='/usr/local/share/locale' CMAKE_INSTALL_FULL_LOCALEDIR='/usr/local/share/locale'
CMAKE_INSTALL_FULL_LOCALSTATEDIR='/usr/local/var' CMAKE_INSTALL_FULL_LOCALSTATEDIR='/usr/local/var'

@ -0,0 +1,17 @@
cmake_minimum_required(VERSION 3.16)
project(PchIncludedAllLanguages C CXX)
if(CMAKE_CXX_COMPILE_OPTIONS_USE_PCH)
add_definitions(-DHAVE_PCH_SUPPORT)
endif()
add_executable(main
main.cpp
empty.c
pch-included.cpp
)
target_precompile_headers(main PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/pch.h>)
enable_testing()
add_test(NAME main COMMAND main)

@ -30,4 +30,5 @@ if(RunCMake_GENERATOR MATCHES "Make|Ninja")
endif() endif()
run_test(PchReuseFromObjLib) run_test(PchReuseFromObjLib)
run_test(PchIncludedAllLanguages) run_test(PchIncludedAllLanguages)
run_test(PchIncludedOneLanguage)
run_test(PchLibObjLibExe) run_test(PchLibObjLibExe)

@ -165,7 +165,7 @@ function(run_cmake test)
"|[^\n]*install_name_tool: warning: changes being made to the file will invalidate the code signature in:" "|[^\n]*install_name_tool: warning: changes being made to the file will invalidate the code signature in:"
"|[^\n]*xcodebuild[^\n]*DVTPlugInManager" "|[^\n]*xcodebuild[^\n]*DVTPlugInManager"
"|[^\n]*xcodebuild[^\n]*warning: file type[^\n]*is based on missing file type" "|[^\n]*xcodebuild[^\n]*warning: file type[^\n]*is based on missing file type"
"|[^\n]*objc[^\n]*: Class AMSupportURL[^\n]* One of the two will be used. Which one is undefined." "|[^\n]*objc[^\n]*: Class [^\n]* One of the two will be used. Which one is undefined."
"|[^\n]*is a member of multiple groups" "|[^\n]*is a member of multiple groups"
"|[^\n]*offset in archive not a multiple of 8" "|[^\n]*offset in archive not a multiple of 8"
"|[^\n]*from Time Machine by path" "|[^\n]*from Time Machine by path"

@ -0,0 +1,4 @@
^CMake Error at FileSetFramework\.cmake:[0-9]+ \(target_sources\):
target_sources FILE_SETs may not be added to FRAMEWORK targets
Call Stack \(most recent call first\):
CMakeLists\.txt:[0-9]+ \(include\)$

@ -0,0 +1,7 @@
enable_language(C)
add_library(lib1 SHARED lib1.c)
set_property(TARGET lib1 PROPERTY FRAMEWORK ON)
target_sources(lib1
PUBLIC FILE_SET HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES h1.h
)

@ -17,7 +17,7 @@ include("${export_build_dir}/export.cmake")
include("${export_build_dir}/install/lib/cmake/export.cmake") include("${export_build_dir}/install/lib/cmake/export.cmake")
assert_prop_eq(export::lib1 HEADER_SETS "") assert_prop_eq(export::lib1 HEADER_SETS "")
assert_prop_eq(export::lib1 INTERFACE_HEADER_SETS "HEADERS;b;c;d;e;f;g;dir3") assert_prop_eq(export::lib1 INTERFACE_HEADER_SETS "HEADERS;b;c;d;dir3;e;f;g")
assert_prop_eq(export::lib1 HEADER_SET "${CMAKE_CURRENT_SOURCE_DIR}/error.c") assert_prop_eq(export::lib1 HEADER_SET "${CMAKE_CURRENT_SOURCE_DIR}/error.c")
assert_prop_eq(export::lib1 HEADER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}") assert_prop_eq(export::lib1 HEADER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
assert_prop_eq(export::lib1 HEADER_SET_b "${CMAKE_CURRENT_SOURCE_DIR}/h2.h") assert_prop_eq(export::lib1 HEADER_SET_b "${CMAKE_CURRENT_SOURCE_DIR}/h2.h")
@ -35,7 +35,7 @@ assert_prop_eq(export::lib1 HEADER_DIRS_g "${CMAKE_CURRENT_SOURCE_DIR}/dir1;${CM
assert_prop_eq(export::lib1 INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR};$<1:${CMAKE_CURRENT_SOURCE_DIR}/dir>;${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>;${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR}/dir1;${CMAKE_CURRENT_SOURCE_DIR}/dir2;${CMAKE_CURRENT_SOURCE_DIR}/dir3;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:$<1:${CMAKE_CURRENT_SOURCE_DIR}/dir>>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir1>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir2>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir3>") assert_prop_eq(export::lib1 INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR};$<1:${CMAKE_CURRENT_SOURCE_DIR}/dir>;${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>;${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR}/dir1;${CMAKE_CURRENT_SOURCE_DIR}/dir2;${CMAKE_CURRENT_SOURCE_DIR}/dir3;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:$<1:${CMAKE_CURRENT_SOURCE_DIR}/dir>>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir1>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir2>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir3>")
assert_prop_eq(install::lib1 HEADER_SETS "") assert_prop_eq(install::lib1 HEADER_SETS "")
assert_prop_eq(install::lib1 INTERFACE_HEADER_SETS "HEADERS;b;c;d;e;f;g;dir3") assert_prop_eq(install::lib1 INTERFACE_HEADER_SETS "HEADERS;b;c;d;dir3;e;f;g")
assert_prop_eq(install::lib1 HEADER_SET "${export_build_dir}/install/include/error.c") assert_prop_eq(install::lib1 HEADER_SET "${export_build_dir}/install/include/error.c")
assert_prop_eq(install::lib1 HEADER_DIRS "${export_build_dir}/install/include") assert_prop_eq(install::lib1 HEADER_DIRS "${export_build_dir}/install/include")
assert_prop_eq(install::lib1 HEADER_SET_b "${export_build_dir}/install/include/h2.h") assert_prop_eq(install::lib1 HEADER_SET_b "${export_build_dir}/install/include/h2.h")

@ -1,4 +0,0 @@
^CMake Error at FileSetNoExistInterface\.cmake:[0-9]+ \(set_property\):
Header set "a" has not yet been created\.
Call Stack \(most recent call first\):
CMakeLists\.txt:[0-9]+ \(include\)$

@ -1,4 +0,0 @@
^CMake Error at FileSetNoExistPrivate\.cmake:[0-9]+ \(set_property\):
Header set "a" has not yet been created\.
Call Stack \(most recent call first\):
CMakeLists\.txt:[0-9]+ \(include\)$

@ -1,7 +0,0 @@
enable_language(C)
add_library(lib1 STATIC empty.c)
set_property(TARGET lib1 PROPERTY HEADER_SETS "a")
# Error happens at configure-time, so this doesn't help.
target_sources(lib1 PRIVATE FILE_SET a TYPE HEADERS)

@ -1,4 +0,0 @@
^CMake Error at FileSetNoScope\.cmake:[0-9]+ \(target_sources\):
target_sources File set "a" is not in HEADER_SETS or INTERFACE_HEADER_SETS
Call Stack \(most recent call first\):
CMakeLists\.txt:[0-9]+ \(include\)$

@ -1,6 +0,0 @@
enable_language(C)
add_library(lib1 STATIC empty.c)
target_sources(lib1 PRIVATE FILE_SET a TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES h1.h)
set_property(TARGET lib1 PROPERTY HEADER_SETS)
target_sources(lib1 PRIVATE FILE_SET a TYPE HEADERS FILES h2.h)

@ -57,14 +57,14 @@ assert_prop_eq(lib1 INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURC
assert_prop_eq(lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>") assert_prop_eq(lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
target_sources(lib1 PUBLIC FILE_SET HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}" FILES h1.h) target_sources(lib1 PUBLIC FILE_SET HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}" FILES h1.h)
assert_prop_eq(lib1 INTERFACE_HEADER_SETS "a;c;d;HEADERS") assert_prop_eq(lib1 INTERFACE_HEADER_SETS "HEADERS;a;c;d")
assert_prop_eq(lib1 HEADER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}") assert_prop_eq(lib1 HEADER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
assert_prop_eq(lib1 HEADER_SET "${CMAKE_CURRENT_SOURCE_DIR}/h1.h") assert_prop_eq(lib1 HEADER_SET "${CMAKE_CURRENT_SOURCE_DIR}/h1.h")
assert_prop_eq(lib1 INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>") assert_prop_eq(lib1 INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
assert_prop_eq(lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>") assert_prop_eq(lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
target_sources(lib1 PUBLIC FILE_SET HEADERS FILES h2.h) target_sources(lib1 PUBLIC FILE_SET HEADERS FILES h2.h)
assert_prop_eq(lib1 INTERFACE_HEADER_SETS "a;c;d;HEADERS") assert_prop_eq(lib1 INTERFACE_HEADER_SETS "HEADERS;a;c;d")
assert_prop_eq(lib1 HEADER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}") assert_prop_eq(lib1 HEADER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
assert_prop_eq(lib1 HEADER_SET "${CMAKE_CURRENT_SOURCE_DIR}/h1.h;${CMAKE_CURRENT_SOURCE_DIR}/h2.h") assert_prop_eq(lib1 HEADER_SET "${CMAKE_CURRENT_SOURCE_DIR}/h1.h;${CMAKE_CURRENT_SOURCE_DIR}/h2.h")
assert_prop_eq(lib1 INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>") assert_prop_eq(lib1 INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")

@ -0,0 +1,5 @@
^CMake Error at FileSetReadOnlyInterface\.cmake:[0-9]+ \(set_property\):
INTERFACE_HEADER_SETS property is read-only
Call Stack \(most recent call first\):
CMakeLists\.txt:[0-9]+ \(include\)$

@ -2,6 +2,3 @@ enable_language(C)
add_library(lib1 STATIC empty.c) add_library(lib1 STATIC empty.c)
set_property(TARGET lib1 PROPERTY INTERFACE_HEADER_SETS "a") set_property(TARGET lib1 PROPERTY INTERFACE_HEADER_SETS "a")
# Error happens at configure-time, so this doesn't help.
target_sources(lib1 INTERFACE FILE_SET a TYPE HEADERS)

@ -0,0 +1,5 @@
^CMake Error at FileSetReadOnlyPrivate\.cmake:[0-9]+ \(set_property\):
HEADER_SETS property is read-only
Call Stack \(most recent call first\):
CMakeLists\.txt:[0-9]+ \(include\)$

@ -0,0 +1,4 @@
enable_language(C)
add_library(lib1 STATIC empty.c)
set_property(TARGET lib1 PROPERTY HEADER_SETS "a")

@ -33,13 +33,15 @@ run_cmake(FileSetWrongBaseDirsRelative)
run_cmake(FileSetOverlappingBaseDirs) run_cmake(FileSetOverlappingBaseDirs)
run_cmake(FileSetInstallMissingSetsPrivate) run_cmake(FileSetInstallMissingSetsPrivate)
run_cmake(FileSetInstallMissingSetsInterface) run_cmake(FileSetInstallMissingSetsInterface)
run_cmake(FileSetNoScope) run_cmake(FileSetReadOnlyPrivate)
run_cmake(FileSetNoExistPrivate) run_cmake(FileSetReadOnlyInterface)
run_cmake(FileSetNoExistInterface)
run_cmake(FileSetNoExistInstall) run_cmake(FileSetNoExistInstall)
run_cmake(FileSetDirectories) run_cmake(FileSetDirectories)
run_cmake(FileSetCustomTarget) run_cmake(FileSetCustomTarget)
run_cmake(FileSetBadName) run_cmake(FileSetBadName)
if(APPLE)
run_cmake(FileSetFramework)
endif()
set(RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0115=NEW) set(RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0115=NEW)
run_cmake(FileSetFileNoExist) run_cmake(FileSetFileNoExist)

@ -32,7 +32,7 @@ SPHINX_EXECUTABLE:FILEPATH=/usr/local/bin/sphinx-build
SPHINX_HTML:BOOL=ON SPHINX_HTML:BOOL=ON
SPHINX_MAN:BOOL=ON SPHINX_MAN:BOOL=ON
SPHINX_QTHELP:BOOL=ON SPHINX_QTHELP:BOOL=ON
QCOLLECTIONGENERATOR_EXECUTABLE:PATH=/opt/qt/bin/qhelpgenerator QHELPGENERATOR_EXECUTABLE:PATH=/opt/qt/bin/qhelpgenerator
# We bootstrap as part of the build so skip its test. # We bootstrap as part of the build so skip its test.
CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE

@ -32,7 +32,7 @@ SPHINX_EXECUTABLE:FILEPATH=/opt/rh/rh-python36/root/usr/bin/sphinx-build
SPHINX_HTML:BOOL=ON SPHINX_HTML:BOOL=ON
SPHINX_MAN:BOOL=ON SPHINX_MAN:BOOL=ON
SPHINX_QTHELP:BOOL=ON SPHINX_QTHELP:BOOL=ON
QCOLLECTIONGENERATOR_EXECUTABLE:PATH=/opt/qt/bin/qhelpgenerator QHELPGENERATOR_EXECUTABLE:PATH=/opt/qt/bin/qhelpgenerator
# We bootstrap as part of the build so skip its test. # We bootstrap as part of the build so skip its test.
CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE

@ -24,7 +24,7 @@ SPHINX_EXECUTABLE:FILEPATH=C:/python3/Scripts/sphinx-build.exe
SPHINX_HTML:BOOL=ON SPHINX_HTML:BOOL=ON
SPHINX_MAN:BOOL=ON SPHINX_MAN:BOOL=ON
SPHINX_QTHELP:BOOL=ON SPHINX_QTHELP:BOOL=ON
QCOLLECTIONGENERATOR_EXECUTABLE:PATH=C:/qt-i386/bin/qhelpgenerator.exe QHELPGENERATOR_EXECUTABLE:PATH=C:/qt-i386/bin/qhelpgenerator.exe
# No bootstrap with MSVC tools. # No bootstrap with MSVC tools.
CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE

@ -24,7 +24,7 @@ SPHINX_EXECUTABLE:FILEPATH=C:/python3/Scripts/sphinx-build.exe
SPHINX_HTML:BOOL=ON SPHINX_HTML:BOOL=ON
SPHINX_MAN:BOOL=ON SPHINX_MAN:BOOL=ON
SPHINX_QTHELP:BOOL=ON SPHINX_QTHELP:BOOL=ON
QCOLLECTIONGENERATOR_EXECUTABLE:PATH=C:/qt-x86_64/bin/qhelpgenerator.exe QHELPGENERATOR_EXECUTABLE:PATH=C:/qt-x86_64/bin/qhelpgenerator.exe
# No bootstrap with MSVC tools. # No bootstrap with MSVC tools.
CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE

@ -50,6 +50,12 @@ else()
set(conf_copyright "Kitware, Inc.") set(conf_copyright "Kitware, Inc.")
endif() endif()
if(CMake_SPHINX_CMAKE_ORG)
set(conf_baseurl "https://cmake.org/cmake/help/latest")
else()
set(conf_baseurl "")
endif()
set(conf_docs "${CMake_SOURCE_DIR}/Help") set(conf_docs "${CMake_SOURCE_DIR}/Help")
set(conf_path "${CMAKE_CURRENT_SOURCE_DIR}") set(conf_path "${CMAKE_CURRENT_SOURCE_DIR}")
set(conf_version "${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}.${CMake_VERSION_PATCH}") set(conf_version "${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}.${CMake_VERSION_PATCH}")
@ -97,12 +103,12 @@ endif()
if(SPHINX_QTHELP) if(SPHINX_QTHELP)
find_package(PythonInterp REQUIRED) find_package(PythonInterp REQUIRED)
find_program(QCOLLECTIONGENERATOR_EXECUTABLE find_program(QHELPGENERATOR_EXECUTABLE
NAMES qcollectiongenerator-qt5 qcollectiongenerator NAMES qhelpgenerator-qt5 qhelpgenerator
DOC "qcollectiongenerator tool" DOC "qhelpgenerator tool"
) )
if (NOT QCOLLECTIONGENERATOR_EXECUTABLE) if(NOT QHELPGENERATOR_EXECUTABLE)
message(FATAL_ERROR "QCOLLECTIONGENERATOR_EXECUTABLE (qcollectiongenerator) not found!") message(FATAL_ERROR "QHELPGENERATOR_EXECUTABLE (qhelpgenerator) not found!")
endif() endif()
list(APPEND doc_formats qthelp) list(APPEND doc_formats qthelp)
@ -122,7 +128,7 @@ if(SPHINX_QTHELP)
"${CMAKE_CURRENT_SOURCE_DIR}/create_identifiers.py" "${CMAKE_CURRENT_SOURCE_DIR}/create_identifiers.py"
"${CMAKE_CURRENT_BINARY_DIR}/qthelp/" "${CMAKE_CURRENT_BINARY_DIR}/qthelp/"
COMMAND ${QCOLLECTIONGENERATOR_EXECUTABLE} COMMAND ${QHELPGENERATOR_EXECUTABLE}
${CMAKE_CURRENT_BINARY_DIR}/qthelp/CMake.qhcp ${CMAKE_CURRENT_BINARY_DIR}/qthelp/CMake.qhcp
) )
endif() endif()
@ -130,11 +136,35 @@ if(SPHINX_LATEXPDF)
list(APPEND doc_formats latexpdf) list(APPEND doc_formats latexpdf)
endif() endif()
set(doc_html_opts "")
if(CMake_SPHINX_CMAKE_ORG)
list(APPEND doc_html_opts
-A googleanalytics=1
-A opensearch=1
-A versionswitch=1
)
if(CMake_SPHINX_CMAKE_ORG_OUTDATED)
list(APPEND doc_html_opts -A outdated=1)
endif()
list(APPEND qthelp_extra_commands
COMMAND ${CMAKE_COMMAND} -E copy
"${CMAKE_CURRENT_BINARY_DIR}/qthelp/CMake.qch"
"${CMAKE_CURRENT_BINARY_DIR}/html/CMake.qch"
)
endif()
set(doc_format_outputs "") set(doc_format_outputs "")
set(doc_format_last "") set(doc_format_last "")
foreach(format ${doc_formats}) foreach(format ${doc_formats})
set(doc_format_output "doc_format_${format}") set(doc_format_output "doc_format_${format}")
set(doc_format_log "build-${format}.log") set(doc_format_log "build-${format}.log")
if(CMake_SPHINX_CMAKE_ORG)
set(doctrees "doctrees/${format}")
else()
set(doctrees "doctrees")
endif()
if(format STREQUAL "latexpdf") if(format STREQUAL "latexpdf")
# This format does not use builder (-b) but make_mode (-M) which expects # This format does not use builder (-b) but make_mode (-M) which expects
# arguments in peculiar order # arguments in peculiar order
@ -145,8 +175,9 @@ foreach(format ${doc_formats})
${CMake_SOURCE_DIR}/Help ${CMake_SOURCE_DIR}/Help
${CMAKE_CURRENT_BINARY_DIR}/${format} ${CMAKE_CURRENT_BINARY_DIR}/${format}
-c ${CMAKE_CURRENT_BINARY_DIR} -c ${CMAKE_CURRENT_BINARY_DIR}
-d ${CMAKE_CURRENT_BINARY_DIR}/doctrees -d ${CMAKE_CURRENT_BINARY_DIR}/${doctrees}
${sphinx_flags} ${sphinx_flags}
${doc_${format}_opts}
> ${doc_format_log} # log stdout, pass stderr > ${doc_format_log} # log stdout, pass stderr
${${format}_extra_commands} ${${format}_extra_commands}
DEPENDS ${doc_format_last} DEPENDS ${doc_format_last}
@ -159,9 +190,10 @@ foreach(format ${doc_formats})
OUTPUT ${doc_format_output} OUTPUT ${doc_format_output}
COMMAND ${SPHINX_EXECUTABLE} COMMAND ${SPHINX_EXECUTABLE}
-c ${CMAKE_CURRENT_BINARY_DIR} -c ${CMAKE_CURRENT_BINARY_DIR}
-d ${CMAKE_CURRENT_BINARY_DIR}/doctrees -d ${CMAKE_CURRENT_BINARY_DIR}/${doctrees}
-b ${format} -b ${format}
${sphinx_flags} ${sphinx_flags}
${doc_${format}_opts}
${CMake_SOURCE_DIR}/Help ${CMake_SOURCE_DIR}/Help
${CMAKE_CURRENT_BINARY_DIR}/${format} ${CMAKE_CURRENT_BINARY_DIR}/${format}
> ${doc_format_log} # log stdout, pass stderr > ${doc_format_log} # log stdout, pass stderr
@ -173,7 +205,9 @@ foreach(format ${doc_formats})
endif() endif()
set_property(SOURCE ${doc_format_output} PROPERTY SYMBOLIC 1) set_property(SOURCE ${doc_format_output} PROPERTY SYMBOLIC 1)
list(APPEND doc_format_outputs ${doc_format_output}) list(APPEND doc_format_outputs ${doc_format_output})
if(NOT CMake_SPHINX_CMAKE_ORG)
set(doc_format_last ${doc_format_output}) set(doc_format_last ${doc_format_output})
endif()
endforeach() endforeach()
add_custom_target(documentation ALL DEPENDS ${doc_format_outputs}) add_custom_target(documentation ALL DEPENDS ${doc_format_outputs})
@ -193,6 +227,10 @@ if(CMake_SPHINX_DEPEND_ON_EXECUTABLES)
endforeach() endforeach()
endif() endif()
if(CMake_SPHINX_CMAKE_ORG)
return()
endif()
if(SPHINX_INFO) if(SPHINX_INFO)
CMake_OPTIONAL_COMPONENT(sphinx-info) CMake_OPTIONAL_COMPONENT(sphinx-info)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/texinfo/cmake.info install(FILES ${CMAKE_CURRENT_BINARY_DIR}/texinfo/cmake.info

@ -55,6 +55,7 @@ for fpath in cmake_manuals:
man_show_urls = False man_show_urls = False
man_make_section_directory = False man_make_section_directory = False
html_baseurl = '@conf_baseurl@'
html_show_sourcelink = True html_show_sourcelink = True
html_static_path = ['@conf_path@/static'] html_static_path = ['@conf_path@/static']
html_style = 'cmake.css' html_style = 'cmake.css'

@ -22,3 +22,15 @@ div.sphinxsidebarwrapper {
dd > :first-child > p { dd > :first-child > p {
margin-top: 0px; margin-top: 0px;
} }
div.outdated {
background-color: #f0f0c0;
color: black;
font-size: 90%;
padding-bottom: 5px;
padding-left: 2px;
padding-right: 2px;
padding-top: 5px;
text-align: center;
width: 100%;
}

@ -17,10 +17,28 @@
</li> </li>
{% endblock %} {% endblock %}
{%- block relbar1 %}
{{ super() }}
{%- if outdated is defined %}
<div class="outdated">
This documents an old version of CMake.
<a href="https://cmake.org/cmake/help/latest/{{ pagename }}.html">
Click here to see the latest release.
</a>
<span class="version_switch_note"></span>
</div>
{%- endif %}
{%- endblock %}
{% block extrahead %} {% block extrahead %}
{% if versionswitch is defined %} {%- if opensearch is defined %}
<link rel="search" type="application/opensearchdescription+xml"
title="Search within CMake Documentation of Latest Version"
href="{{ pathto('../latest-opensearch.xml', 1) }}"/>
{%- endif %}
{%- if versionswitch is defined %}
<script type="text/javascript" src="{{ pathto('../version_switch.js', 1) }}"></script> <script type="text/javascript" src="{{ pathto('../version_switch.js', 1) }}"></script>
{% endif %} {%- endif %}
{{ super() }} {{ super() }}
{% endblock %} {% endblock %}
@ -29,3 +47,19 @@
{% block htmltitle %} {% block htmltitle %}
<title>{{ title|striptags|e }} {{ "&mdash;"|safe }} {{ docstitle|e }}</title> <title>{{ title|striptags|e }} {{ "&mdash;"|safe }} {{ docstitle|e }}</title>
{% endblock %} {% endblock %}
{%- block footer %}
{{ super() }}
{%- if googleanalytics is defined %}
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-6042509-4");
pageTracker._trackPageview();
} catch(err) {}
</script>
{%- endif %}
{%- endblock %}

Loading…
Cancel
Save