Update upstream source from tag 'upstream/3.23.1'
Update to upstream version '3.23.1' with Debian dir 8f78483bcd021186b0de24f0235b8bea761b47d5
This commit is contained in:
commit
63e96e614c
@ -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.
|
||||
|
||||
.. 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
|
||||
accepts the same options as the normal export mode. The Android
|
||||
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
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
custom target.
|
||||
custom target or :prop_tgt:`FRAMEWORK` target.
|
||||
|
||||
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
|
||||
|
@ -245,20 +245,6 @@ Commit with a message such as::
|
||||
Release versions do not have the development topic section of
|
||||
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
|
||||
``$major.$minor.0-rc0``:
|
||||
|
||||
@ -290,15 +276,13 @@ Merge the ``release-$ver`` branch to ``master``:
|
||||
git merge --no-ff release-$ver
|
||||
|
||||
Begin post-release development by restoring the development branch release
|
||||
note infrastructure, the nightly package pipeline upload jobs, and
|
||||
the version date from ``origin/master``:
|
||||
note infrastructure, and the version date from ``origin/master``:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
git checkout origin/master -- \
|
||||
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 's/^\.u:/u:/' .gitlab-ci.yml
|
||||
|
||||
Update ``Source/CMakeVersion.cmake`` to set the version to
|
||||
``$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
|
||||
generator expressions would always be added. CMake 3.19 and above prefer
|
||||
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
|
||||
target for the above generator expressions. The ``NEW`` behavior of
|
||||
|
@ -3,14 +3,13 @@ HEADER_SETS
|
||||
|
||||
.. versionadded:: 3.23
|
||||
|
||||
List of the target's ``PRIVATE`` and ``PUBLIC`` header sets (i.e. all
|
||||
file sets with the type ``HEADERS``). Files listed in these file sets
|
||||
are treated as source files for the purpose of IDE integration.
|
||||
The files also have their :prop_sf:`HEADER_FILE_ONLY` property set to
|
||||
``TRUE``.
|
||||
Read-only list of the target's ``PRIVATE`` and ``PUBLIC`` header sets (i.e.
|
||||
all file sets with the type ``HEADERS``). Files listed in these file sets are
|
||||
treated as source files for the purpose of IDE integration. The files also
|
||||
have their :prop_sf:`HEADER_FILE_ONLY` property set to ``TRUE``.
|
||||
|
||||
This property is normally only set by :command:`target_sources(FILE_SET)`
|
||||
rather than being manipulated directly.
|
||||
Header sets may be defined using the :command:`target_sources` command
|
||||
``FILE_SET`` option with type ``HEADERS``.
|
||||
|
||||
See also :prop_tgt:`HEADER_SET_<NAME>`, :prop_tgt:`HEADER_SET` and
|
||||
:prop_tgt:`INTERFACE_HEADER_SETS`.
|
||||
|
@ -3,12 +3,12 @@ INTERFACE_HEADER_SETS
|
||||
|
||||
.. versionadded:: 3.23
|
||||
|
||||
List of the target's ``INTERFACE`` and ``PUBLIC`` header sets (i.e. all
|
||||
file sets with the type ``HEADERS``). Files listed in these header sets
|
||||
Read-only list of the target's ``INTERFACE`` and ``PUBLIC`` header sets (i.e.
|
||||
all file sets with the type ``HEADERS``). Files listed in these header sets
|
||||
can be installed with :command:`install(TARGETS)` and exported with
|
||||
:command:`install(EXPORT)` and :command:`export`.
|
||||
|
||||
This property is normally only set by :command:`target_sources(FILE_SET)`
|
||||
rather than being manipulated directly.
|
||||
Header sets may be defined using the :command:`target_sources` command
|
||||
``FILE_SET`` option with type ``HEADERS``.
|
||||
|
||||
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.
|
||||
|
||||
Updates
|
||||
=======
|
||||
|
||||
Changes made since CMake 3.22.0 include the following.
|
||||
|
||||
3.22.1
|
||||
------
|
||||
|
||||
This version made no changes to documented features or interfaces.
|
||||
Some implementation updates were made to support ecosystem changes
|
||||
and/or fix regressions.
|
||||
* This version made no changes to documented features or interfaces.
|
||||
Some implementation updates were made to support ecosystem changes
|
||||
and/or fix regressions.
|
||||
|
||||
3.22.2
|
||||
------
|
||||
@ -164,3 +169,10 @@ and/or fix regressions.
|
||||
errors in existing projects. The fix has been reverted to restore
|
||||
compatibility. The fix may be restored in a future version of CMake
|
||||
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
|
||||
----------
|
||||
|
||||
* The :prop_tgt:`HEADER_SETS` and :prop_tgt:`INTERFACE_HEADER_SETS` target
|
||||
properties were added to list header sets associated with a target.
|
||||
* The :prop_tgt:`HEADER_SETS` and :prop_tgt:`INTERFACE_HEADER_SETS` read-only
|
||||
target properties were added to list header sets associated with a target.
|
||||
|
||||
* The :prop_tgt:`HEADER_SET` and :prop_tgt:`HEADER_SET_<NAME>` target
|
||||
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
|
||||
CMake from source. This is experimental, and so is not included
|
||||
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
|
||||
-------------------
|
||||
|
||||
The directory with the ``CMakeCache.txt`` file.
|
||||
|
||||
This is the full path to the directory that has the ``CMakeCache.txt``
|
||||
file in it. This is the same as :variable:`CMAKE_BINARY_DIR`.
|
||||
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
|
||||
same value as :variable:`CMAKE_BINARY_DIR`. Use that variable instead.
|
||||
|
@ -16,13 +16,18 @@ conditions are true.
|
||||
|
||||
cmake_dependent_option(<option> "<help_text>" <value> <depends> <force>)
|
||||
|
||||
Makes ``<option>`` available to the user if ``<depends>`` is true. When
|
||||
``<option>`` is available, the given ``<help_text>`` and initial ``<value>``
|
||||
are used. If the ``<depends>`` condition is not true, ``<option>`` will not be
|
||||
presented and will always have the value given by ``<force>``. Any value set by
|
||||
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
|
||||
be true in order to initialize ``<option>`` with ``<value>``.
|
||||
Makes ``<option>`` available to the user if the
|
||||
:ref:`semicolon-separated list <CMake Language Lists>` of conditions in
|
||||
``<depends>`` are all true. Otherwise, a local variable named ``<option>``
|
||||
is set to ``<force>``.
|
||||
|
||||
When ``<option>`` is available, the given ``<help_text>`` and initial
|
||||
``<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:
|
||||
|
||||
|
@ -22,10 +22,13 @@ property for executables will be honored at link time.
|
||||
Options are:
|
||||
|
||||
``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>...``
|
||||
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.
|
||||
|
||||
@ -43,9 +46,9 @@ Variables
|
||||
For each language checked, two boolean cache variables are defined.
|
||||
|
||||
``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``
|
||||
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
|
||||
^^^^^^^^
|
||||
@ -139,7 +142,7 @@ function (check_pie_supported)
|
||||
# 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_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()
|
||||
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.
|
||||
# E.g C:\Program Files\PostgreSQL\8.4.
|
||||
# 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:
|
||||
# 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}
|
||||
"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.
|
||||
set( PostgreSQL_ROOT_DIRECTORIES
|
||||
|
@ -55,7 +55,7 @@ where ``<dir>`` is one of:
|
||||
object code libraries (``lib`` or ``lib64``)
|
||||
|
||||
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``
|
||||
C header files (``include``)
|
||||
``OLDINCLUDEDIR``
|
||||
@ -273,9 +273,7 @@ if(NOT DEFINED CMAKE_INSTALL_LIBDIR OR (_libdir_set
|
||||
|
||||
if(__system_type_for_install STREQUAL "debian")
|
||||
if(CMAKE_LIBRARY_ARCHITECTURE)
|
||||
if("${CMAKE_INSTALL_PREFIX}" STREQUAL "/"
|
||||
OR "${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/?$"
|
||||
OR "${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/local/?$")
|
||||
if("${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/?$")
|
||||
set(_LIBDIR_DEFAULT "lib/${CMAKE_LIBRARY_ARCHITECTURE}")
|
||||
endif()
|
||||
if(DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX
|
||||
|
@ -59,8 +59,8 @@ macro(CMAKE_CHECK_FLAG_COMMON_INIT _FUNC _LANG _SRC _PATTERNS)
|
||||
return()
|
||||
endif()
|
||||
# Normalize locale during test compilation.
|
||||
set(_locale_vars LC_ALL LC_MESSAGES LANG)
|
||||
foreach(v IN LISTS _locale_vars)
|
||||
set(_CFCC_locale_vars LC_ALL LC_MESSAGES LANG)
|
||||
foreach(v IN LISTS _CFCC_locale_vars)
|
||||
set(_CMAKE_CHECK_FLAG_COMMON_CONFIG_locale_vars_saved_${v} "$ENV{${v}}")
|
||||
set(ENV{${v}} C)
|
||||
endforeach()
|
||||
|
69
Modules/Internal/HeaderpadWorkaround.cmake
Normal file
69
Modules/Internal/HeaderpadWorkaround.cmake
Normal file
@ -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.
|
||||
set(CMake_VERSION_MAJOR 3)
|
||||
set(CMake_VERSION_MINOR 23)
|
||||
set(CMake_VERSION_PATCH 0)
|
||||
set(CMake_VERSION_PATCH 1)
|
||||
#set(CMake_VERSION_RC 0)
|
||||
set(CMake_VERSION_IS_DIRTY 0)
|
||||
|
||||
@ -21,7 +21,7 @@ endif()
|
||||
|
||||
if(NOT CMake_VERSION_NO_GIT)
|
||||
# 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.
|
||||
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"
|
||||
: "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) {
|
||||
/* Put the executable at a known location (for COPY_FILE). */
|
||||
fprintf(fout, "set(CMAKE_RUNTIME_OUTPUT_DIRECTORY \"%s\")\n",
|
||||
|
@ -7,19 +7,79 @@
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <cmext/string_view>
|
||||
|
||||
#include "cmsys/RegularExpression.hxx"
|
||||
|
||||
#include "cmGeneratorExpression.h"
|
||||
#include "cmListFileCache.h"
|
||||
#include "cmLocalGenerator.h"
|
||||
#include "cmMakefile.h"
|
||||
#include "cmMessageType.h"
|
||||
#include "cmStringAlgorithms.h"
|
||||
#include "cmSystemTools.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))
|
||||
, Type(std::move(type))
|
||||
, Visibility(visibility)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -7,20 +7,38 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <cm/string_view>
|
||||
#include <cmext/string_view>
|
||||
|
||||
#include "cmListFileCache.h"
|
||||
|
||||
class cmCompiledGeneratorExpression;
|
||||
struct cmGeneratorExpressionDAGChecker;
|
||||
class cmGeneratorTarget;
|
||||
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
|
||||
{
|
||||
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& GetType() const { return this->Type; }
|
||||
cmFileSetVisibility GetVisibility() const { return this->Visibility; }
|
||||
|
||||
void ClearDirectoryEntries();
|
||||
void AddDirectoryEntry(BT<std::string> directories);
|
||||
@ -61,6 +79,7 @@ public:
|
||||
private:
|
||||
std::string Name;
|
||||
std::string Type;
|
||||
cmFileSetVisibility Visibility;
|
||||
std::vector<BT<std::string>> DirectoryEntries;
|
||||
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",
|
||||
"OBJCXX" } };
|
||||
|
||||
bool haveAnyPch = false;
|
||||
std::set<std::string> pchLangSet;
|
||||
if (this->GetGlobalGenerator()->IsXcode()) {
|
||||
for (const std::string& lang : langs) {
|
||||
const std::string pchHeader = target->GetPchHeader(config, lang, "");
|
||||
if (!pchHeader.empty()) {
|
||||
haveAnyPch = true;
|
||||
pchLangSet.emplace(lang);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2519,9 +2519,11 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target)
|
||||
const std::string pchHeader = target->GetPchHeader(config, lang, arch);
|
||||
|
||||
if (pchSource.empty() || pchHeader.empty()) {
|
||||
if (this->GetGlobalGenerator()->IsXcode() && haveAnyPch) {
|
||||
if (this->GetGlobalGenerator()->IsXcode() && !pchLangSet.empty()) {
|
||||
for (auto* sf : sources) {
|
||||
sf->SetProperty("SKIP_PRECOMPILE_HEADERS", "ON");
|
||||
if (pchLangSet.find(sf->GetLanguage()) == pchLangSet.end()) {
|
||||
sf->SetProperty("SKIP_PRECOMPILE_HEADERS", "ON");
|
||||
}
|
||||
}
|
||||
}
|
||||
continue;
|
||||
|
@ -1678,28 +1678,32 @@ void cmNinjaTargetGenerator::ExportObjectCompileCommand(
|
||||
compileObjectVars.Includes = includes.c_str();
|
||||
|
||||
// Rule for compiling object file.
|
||||
std::vector<std::string> compileCmds;
|
||||
std::string cudaCompileMode;
|
||||
if (language == "CUDA") {
|
||||
std::string cmdVar;
|
||||
if (this->GeneratorTarget->GetPropertyAsBool(
|
||||
"CUDA_SEPARABLE_COMPILATION")) {
|
||||
cmdVar = "CMAKE_CUDA_COMPILE_SEPARABLE_COMPILATION";
|
||||
} else if (this->GeneratorTarget->GetPropertyAsBool(
|
||||
"CUDA_PTX_COMPILATION")) {
|
||||
cmdVar = "CMAKE_CUDA_COMPILE_PTX_COMPILATION";
|
||||
} else {
|
||||
cmdVar = "CMAKE_CUDA_COMPILE_WHOLE_COMPILATION";
|
||||
const std::string& rdcFlag =
|
||||
this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_RDC_FLAG");
|
||||
cudaCompileMode = cmStrCat(cudaCompileMode, rdcFlag, " ");
|
||||
}
|
||||
const std::string& compileCmd =
|
||||
this->GetMakefile()->GetRequiredDefinition(cmdVar);
|
||||
cmExpandList(compileCmd, compileCmds);
|
||||
} else {
|
||||
const std::string cmdVar = cmStrCat("CMAKE_", language, "_COMPILE_OBJECT");
|
||||
const std::string& compileCmd =
|
||||
this->GetMakefile()->GetRequiredDefinition(cmdVar);
|
||||
cmExpandList(compileCmd, compileCmds);
|
||||
if (this->GeneratorTarget->GetPropertyAsBool("CUDA_PTX_COMPILATION")) {
|
||||
const std::string& ptxFlag =
|
||||
this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_PTX_FLAG");
|
||||
cudaCompileMode = cmStrCat(cudaCompileMode, ptxFlag);
|
||||
} 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& compileCmd =
|
||||
this->Makefile->GetRequiredDefinition(cmdVar);
|
||||
cmExpandList(compileCmd, compileCmds);
|
||||
|
||||
std::unique_ptr<cmRulePlaceholderExpander> rulePlaceholderExpander(
|
||||
this->GetLocalGenerator()->CreateRulePlaceholderExpander());
|
||||
|
||||
|
@ -1456,37 +1456,14 @@ void cmTarget::StoreProperty(const std::string& prop, ValueType value)
|
||||
BT<std::string>(value, this->impl->Makefile->GetBacktrace()));
|
||||
}
|
||||
} else if (prop == propHEADER_SETS) {
|
||||
if (value) {
|
||||
for (auto const& name : cmExpandedList(value)) {
|
||||
if (!this->GetFileSet(name)) {
|
||||
this->impl->Makefile->IssueMessage(
|
||||
MessageType::FATAL_ERROR,
|
||||
cmStrCat("Header set \"", name, "\" has not yet been created."));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
this->impl->HeaderSetsEntries.clear();
|
||||
if (!StringIsEmpty(value)) {
|
||||
this->impl->HeaderSetsEntries.emplace_back(
|
||||
value, this->impl->Makefile->GetBacktrace());
|
||||
}
|
||||
this->impl->Makefile->IssueMessage(MessageType::FATAL_ERROR,
|
||||
"HEADER_SETS property is read-only\n");
|
||||
return;
|
||||
} else if (prop == propINTERFACE_HEADER_SETS) {
|
||||
if (value) {
|
||||
for (auto const& name : cmExpandedList(value)) {
|
||||
if (!this->GetFileSet(name)) {
|
||||
this->impl->Makefile->IssueMessage(
|
||||
MessageType::FATAL_ERROR,
|
||||
cmStrCat("Header set \"", name, "\" has not yet been created."));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
this->impl->InterfaceHeaderSetsEntries.clear();
|
||||
if (!StringIsEmpty(value)) {
|
||||
this->impl->InterfaceHeaderSetsEntries.emplace_back(
|
||||
value, this->impl->Makefile->GetBacktrace());
|
||||
}
|
||||
this->impl->Makefile->IssueMessage(
|
||||
MessageType::FATAL_ERROR,
|
||||
"INTERFACE_HEADER_SETS property is read-only\n");
|
||||
return;
|
||||
} else {
|
||||
this->impl->Properties.SetProperty(prop, value);
|
||||
}
|
||||
@ -1641,27 +1618,14 @@ void cmTarget::AppendProperty(const std::string& prop,
|
||||
fileSet->AddFileEntry(
|
||||
BT<std::string>(value, this->impl->Makefile->GetBacktrace()));
|
||||
} else if (prop == "HEADER_SETS") {
|
||||
for (auto const& name : cmExpandedList(value)) {
|
||||
if (!this->GetFileSet(name)) {
|
||||
this->impl->Makefile->IssueMessage(
|
||||
MessageType::FATAL_ERROR,
|
||||
cmStrCat("Header set \"", name, "\" has not yet been created."));
|
||||
return;
|
||||
}
|
||||
}
|
||||
this->impl->HeaderSetsEntries.emplace_back(
|
||||
value, this->impl->Makefile->GetBacktrace());
|
||||
this->impl->Makefile->IssueMessage(MessageType::FATAL_ERROR,
|
||||
"HEADER_SETS property is read-only\n");
|
||||
return;
|
||||
} else if (prop == "INTERFACE_HEADER_SETS") {
|
||||
for (auto const& name : cmExpandedList(value)) {
|
||||
if (!this->GetFileSet(name)) {
|
||||
this->impl->Makefile->IssueMessage(
|
||||
MessageType::FATAL_ERROR,
|
||||
cmStrCat("Header set \"", name, "\" has not yet been created."));
|
||||
return;
|
||||
}
|
||||
}
|
||||
this->impl->InterfaceHeaderSetsEntries.emplace_back(
|
||||
value, this->impl->Makefile->GetBacktrace());
|
||||
this->impl->Makefile->IssueMessage(
|
||||
MessageType::FATAL_ERROR,
|
||||
"INTERFACE_HEADER_SETS property is read-only\n");
|
||||
return;
|
||||
} else {
|
||||
this->impl->Properties.AppendProperty(prop, value, asString);
|
||||
}
|
||||
@ -2038,13 +2002,26 @@ cmValue cmTarget::GetProperty(const std::string& prop) const
|
||||
return cmValue(output);
|
||||
}
|
||||
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;
|
||||
output = cmJoin(this->impl->HeaderSetsEntries, ";"_s);
|
||||
output = cmJoin(set_names, ";"_s);
|
||||
return cmValue(output);
|
||||
}
|
||||
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;
|
||||
output = cmJoin(this->impl->InterfaceHeaderSetsEntries, ";"_s);
|
||||
output = cmJoin(set_names, ";"_s);
|
||||
return cmValue(output);
|
||||
}
|
||||
}
|
||||
@ -2342,10 +2319,20 @@ cmFileSet* cmTarget::GetFileSet(const std::string& name)
|
||||
}
|
||||
|
||||
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 =
|
||||
this->impl->FileSets.emplace(std::make_pair(name, cmFileSet(name, type)));
|
||||
auto result = this->impl->FileSets.emplace(
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <vector>
|
||||
|
||||
#include "cmAlgorithms.h"
|
||||
#include "cmFileSet.h"
|
||||
#include "cmPolicies.h"
|
||||
#include "cmStateTypes.h"
|
||||
#include "cmStringAlgorithms.h"
|
||||
@ -19,7 +20,6 @@
|
||||
#include "cmValue.h"
|
||||
|
||||
class cmCustomCommand;
|
||||
class cmFileSet;
|
||||
class cmGlobalGenerator;
|
||||
class cmInstallTargetGenerator;
|
||||
class cmListFileBacktrace;
|
||||
@ -285,7 +285,8 @@ public:
|
||||
const cmFileSet* GetFileSet(const std::string& name) const;
|
||||
cmFileSet* GetFileSet(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;
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
#include "cmTargetSourcesCommand.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
#include <utility>
|
||||
|
||||
@ -230,12 +229,20 @@ bool TargetSourcesImpl::HandleOneFileSet(
|
||||
this->SetError("FILE_SETs may not be added to custom targets");
|
||||
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 ||
|
||||
(args.Type.empty() && args.FileSet[0] >= 'A' && args.FileSet[0] <= 'Z');
|
||||
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 (!isDefault) {
|
||||
if (!cmFileSet::IsValidName(args.FileSet)) {
|
||||
@ -257,15 +264,6 @@ bool TargetSourcesImpl::HandleOneFileSet(
|
||||
if (args.BaseDirs.empty()) {
|
||||
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 {
|
||||
type = fileSet.first->GetType();
|
||||
if (!args.Type.empty() && args.Type != type) {
|
||||
@ -275,37 +273,11 @@ bool TargetSourcesImpl::HandleOneFileSet(
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string existingScope = "PRIVATE";
|
||||
|
||||
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) {
|
||||
if (visibility != fileSet.first->GetVisibility()) {
|
||||
this->SetError(
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -326,11 +298,11 @@ bool TargetSourcesImpl::HandleOneFileSet(
|
||||
for (auto const& dir : cmExpandedList(baseDirectories)) {
|
||||
auto interfaceDirectoriesGenex =
|
||||
cmStrCat("$<BUILD_INTERFACE:", dir, ">");
|
||||
if (scope == "PRIVATE"_s || scope == "PUBLIC"_s) {
|
||||
if (cmFileSetVisibilityIsForSelf(visibility)) {
|
||||
this->Target->AppendProperty("INCLUDE_DIRECTORIES",
|
||||
interfaceDirectoriesGenex);
|
||||
}
|
||||
if (scope == "INTERFACE"_s || scope == "PUBLIC"_s) {
|
||||
if (cmFileSetVisibilityIsForInterface(visibility)) {
|
||||
this->Target->AppendProperty("INTERFACE_INCLUDE_DIRECTORIES",
|
||||
interfaceDirectoriesGenex);
|
||||
}
|
||||
|
@ -306,10 +306,11 @@ int do_cmake(int ac, char const* const* av)
|
||||
parsedArgs.emplace_back("--find-package");
|
||||
return true;
|
||||
} },
|
||||
CommandArgument{ "--list-presets", CommandArgument::Values::Zero,
|
||||
[&](std::string const&) -> bool {
|
||||
CommandArgument{ "--list-presets", CommandArgument::Values::ZeroOrOne,
|
||||
[&](std::string const& value) -> bool {
|
||||
workingMode = cmake::HELP_MODE;
|
||||
parsedArgs.emplace_back("--list-presets");
|
||||
parsedArgs.emplace_back(value);
|
||||
return true;
|
||||
} },
|
||||
};
|
||||
|
@ -1,6 +1,8 @@
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
project(WithDefs CUDA)
|
||||
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
|
||||
set(release_compile_defs DEFREL)
|
||||
|
||||
#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)
|
||||
endif()
|
||||
|
||||
set(_preset "--preset=${name}")
|
||||
if(CMakePresets_NO_PRESET)
|
||||
set(_preset)
|
||||
endif()
|
||||
|
||||
set(RunCMake_TEST_COMMAND ${CMAKE_COMMAND}
|
||||
${_source_args}
|
||||
-DRunCMake_TEST=${name}
|
||||
-DRunCMake_GENERATOR=${RunCMake_GENERATOR}
|
||||
-DCMAKE_MAKE_PROGRAM=${RunCMake_MAKE_PROGRAM}
|
||||
${_unused_cli}
|
||||
--preset=${name}
|
||||
${_preset}
|
||||
${ARGN}
|
||||
)
|
||||
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_NO_CLEAN 1)
|
||||
set(CMakePresets_NO_SOURCE_ARGS 1)
|
||||
set(CMakePresets_NO_PRESET 1)
|
||||
run_cmake_presets(ListPresetsWorkingDir --list-presets)
|
||||
run_cmake_presets(ListConfigurePresetsWorkingDir --list-presets=configure)
|
||||
unset(CMakePresets_NO_PRESET)
|
||||
unset(CMakePresets_NO_SOURCE_ARGS)
|
||||
unset(RunCMake_TEST_NO_CLEAN)
|
||||
unset(RunCMake_TEST_BINARY_DIR)
|
||||
|
@ -4,6 +4,10 @@ include(CheckCompilerFlag)
|
||||
|
||||
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)
|
||||
if(SHOULD_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")
|
||||
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
|
||||
|
||||
# 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)
|
||||
if(SHOULD_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")
|
||||
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})
|
||||
|
18
Tests/RunCMake/CheckCompilerFlag/HeaderpadWorkaround.cmake
Normal file
18
Tests/RunCMake/CheckCompilerFlag/HeaderpadWorkaround.cmake
Normal file
@ -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)
|
||||
run_cmake(CheckHIPCompilerFlag)
|
||||
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_INCLUDEDIR='usr/include'
|
||||
CMAKE_INSTALL_INFODIR='usr/share/info'
|
||||
CMAKE_INSTALL_LIBDIR='usr/lib/arch'
|
||||
CMAKE_INSTALL_LIBDIR='usr/lib'
|
||||
CMAKE_INSTALL_LIBEXECDIR='usr/libexec'
|
||||
CMAKE_INSTALL_LOCALEDIR='usr/share/locale'
|
||||
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_INCLUDEDIR='/usr/include'
|
||||
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_LOCALEDIR='/usr/share/locale'
|
||||
CMAKE_INSTALL_FULL_LOCALSTATEDIR='/var'
|
||||
|
@ -4,7 +4,7 @@ CMAKE_INSTALL_DATAROOTDIR='share'
|
||||
CMAKE_INSTALL_DOCDIR='share/doc/UsrLocal'
|
||||
CMAKE_INSTALL_INCLUDEDIR='include'
|
||||
CMAKE_INSTALL_INFODIR='share/info'
|
||||
CMAKE_INSTALL_LIBDIR='lib/arch'
|
||||
CMAKE_INSTALL_LIBDIR='lib'
|
||||
CMAKE_INSTALL_LIBEXECDIR='libexec'
|
||||
CMAKE_INSTALL_LOCALEDIR='share/locale'
|
||||
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_INCLUDEDIR='/usr/local/include'
|
||||
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_LOCALEDIR='/usr/local/share/locale'
|
||||
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()
|
||||
run_test(PchReuseFromObjLib)
|
||||
run_test(PchIncludedAllLanguages)
|
||||
run_test(PchIncludedOneLanguage)
|
||||
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]*xcodebuild[^\n]*DVTPlugInManager"
|
||||
"|[^\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]*offset in archive not a multiple of 8"
|
||||
"|[^\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\)$
|
7
Tests/RunCMake/target_sources/FileSetFramework.cmake
Normal file
7
Tests/RunCMake/target_sources/FileSetFramework.cmake
Normal file
@ -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")
|
||||
|
||||
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_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
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(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_DIRS "${export_build_dir}/install/include")
|
||||
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}>")
|
||||
|
||||
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_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 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)
|
||||
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_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}>")
|
||||
|
@ -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)
|
||||
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(FileSetInstallMissingSetsPrivate)
|
||||
run_cmake(FileSetInstallMissingSetsInterface)
|
||||
run_cmake(FileSetNoScope)
|
||||
run_cmake(FileSetNoExistPrivate)
|
||||
run_cmake(FileSetNoExistInterface)
|
||||
run_cmake(FileSetReadOnlyPrivate)
|
||||
run_cmake(FileSetReadOnlyInterface)
|
||||
run_cmake(FileSetNoExistInstall)
|
||||
run_cmake(FileSetDirectories)
|
||||
run_cmake(FileSetCustomTarget)
|
||||
run_cmake(FileSetBadName)
|
||||
if(APPLE)
|
||||
run_cmake(FileSetFramework)
|
||||
endif()
|
||||
|
||||
set(RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0115=NEW)
|
||||
run_cmake(FileSetFileNoExist)
|
||||
|
@ -32,7 +32,7 @@ SPHINX_EXECUTABLE:FILEPATH=/usr/local/bin/sphinx-build
|
||||
SPHINX_HTML:BOOL=ON
|
||||
SPHINX_MAN: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.
|
||||
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_MAN: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.
|
||||
CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE
|
||||
|
@ -24,7 +24,7 @@ SPHINX_EXECUTABLE:FILEPATH=C:/python3/Scripts/sphinx-build.exe
|
||||
SPHINX_HTML:BOOL=ON
|
||||
SPHINX_MAN: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.
|
||||
CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE
|
||||
|
@ -24,7 +24,7 @@ SPHINX_EXECUTABLE:FILEPATH=C:/python3/Scripts/sphinx-build.exe
|
||||
SPHINX_HTML:BOOL=ON
|
||||
SPHINX_MAN: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.
|
||||
CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE
|
||||
|
@ -50,6 +50,12 @@ else()
|
||||
set(conf_copyright "Kitware, Inc.")
|
||||
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_path "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
set(conf_version "${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}.${CMake_VERSION_PATCH}")
|
||||
@ -97,12 +103,12 @@ endif()
|
||||
if(SPHINX_QTHELP)
|
||||
find_package(PythonInterp REQUIRED)
|
||||
|
||||
find_program(QCOLLECTIONGENERATOR_EXECUTABLE
|
||||
NAMES qcollectiongenerator-qt5 qcollectiongenerator
|
||||
DOC "qcollectiongenerator tool"
|
||||
find_program(QHELPGENERATOR_EXECUTABLE
|
||||
NAMES qhelpgenerator-qt5 qhelpgenerator
|
||||
DOC "qhelpgenerator tool"
|
||||
)
|
||||
if (NOT QCOLLECTIONGENERATOR_EXECUTABLE)
|
||||
message(FATAL_ERROR "QCOLLECTIONGENERATOR_EXECUTABLE (qcollectiongenerator) not found!")
|
||||
if(NOT QHELPGENERATOR_EXECUTABLE)
|
||||
message(FATAL_ERROR "QHELPGENERATOR_EXECUTABLE (qhelpgenerator) not found!")
|
||||
endif()
|
||||
list(APPEND doc_formats qthelp)
|
||||
|
||||
@ -122,7 +128,7 @@ if(SPHINX_QTHELP)
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/create_identifiers.py"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/qthelp/"
|
||||
|
||||
COMMAND ${QCOLLECTIONGENERATOR_EXECUTABLE}
|
||||
COMMAND ${QHELPGENERATOR_EXECUTABLE}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/qthelp/CMake.qhcp
|
||||
)
|
||||
endif()
|
||||
@ -130,11 +136,35 @@ if(SPHINX_LATEXPDF)
|
||||
list(APPEND doc_formats latexpdf)
|
||||
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_last "")
|
||||
foreach(format ${doc_formats})
|
||||
set(doc_format_output "doc_format_${format}")
|
||||
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")
|
||||
# This format does not use builder (-b) but make_mode (-M) which expects
|
||||
# arguments in peculiar order
|
||||
@ -145,8 +175,9 @@ foreach(format ${doc_formats})
|
||||
${CMake_SOURCE_DIR}/Help
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${format}
|
||||
-c ${CMAKE_CURRENT_BINARY_DIR}
|
||||
-d ${CMAKE_CURRENT_BINARY_DIR}/doctrees
|
||||
-d ${CMAKE_CURRENT_BINARY_DIR}/${doctrees}
|
||||
${sphinx_flags}
|
||||
${doc_${format}_opts}
|
||||
> ${doc_format_log} # log stdout, pass stderr
|
||||
${${format}_extra_commands}
|
||||
DEPENDS ${doc_format_last}
|
||||
@ -159,9 +190,10 @@ foreach(format ${doc_formats})
|
||||
OUTPUT ${doc_format_output}
|
||||
COMMAND ${SPHINX_EXECUTABLE}
|
||||
-c ${CMAKE_CURRENT_BINARY_DIR}
|
||||
-d ${CMAKE_CURRENT_BINARY_DIR}/doctrees
|
||||
-d ${CMAKE_CURRENT_BINARY_DIR}/${doctrees}
|
||||
-b ${format}
|
||||
${sphinx_flags}
|
||||
${doc_${format}_opts}
|
||||
${CMake_SOURCE_DIR}/Help
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${format}
|
||||
> ${doc_format_log} # log stdout, pass stderr
|
||||
@ -173,7 +205,9 @@ foreach(format ${doc_formats})
|
||||
endif()
|
||||
set_property(SOURCE ${doc_format_output} PROPERTY SYMBOLIC 1)
|
||||
list(APPEND doc_format_outputs ${doc_format_output})
|
||||
set(doc_format_last ${doc_format_output})
|
||||
if(NOT CMake_SPHINX_CMAKE_ORG)
|
||||
set(doc_format_last ${doc_format_output})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
add_custom_target(documentation ALL DEPENDS ${doc_format_outputs})
|
||||
@ -193,6 +227,10 @@ if(CMake_SPHINX_DEPEND_ON_EXECUTABLES)
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
if(CMake_SPHINX_CMAKE_ORG)
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(SPHINX_INFO)
|
||||
CMake_OPTIONAL_COMPONENT(sphinx-info)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/texinfo/cmake.info
|
||||
|
@ -55,6 +55,7 @@ for fpath in cmake_manuals:
|
||||
man_show_urls = False
|
||||
man_make_section_directory = False
|
||||
|
||||
html_baseurl = '@conf_baseurl@'
|
||||
html_show_sourcelink = True
|
||||
html_static_path = ['@conf_path@/static']
|
||||
html_style = 'cmake.css'
|
||||
|
@ -22,3 +22,15 @@ div.sphinxsidebarwrapper {
|
||||
dd > :first-child > p {
|
||||
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>
|
||||
{% 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 %}
|
||||
{% if versionswitch is defined %}
|
||||
<script type="text/javascript" src="{{ pathto('../version_switch.js', 1) }}"></script>
|
||||
{% endif %}
|
||||
{%- 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>
|
||||
{%- endif %}
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
||||
@ -29,3 +47,19 @@
|
||||
{% block htmltitle %}
|
||||
<title>{{ title|striptags|e }} {{ "—"|safe }} {{ docstitle|e }}</title>
|
||||
{% 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…
x
Reference in New Issue
Block a user