New upstream version 3.27.0~rc5

ci/unstable
Timo Röhling 1 year ago
parent 6de3bd6333
commit 1101acd15c

@ -197,6 +197,10 @@ syn keyword cmakeProperty contained
\ HAS_CXX
\ HEADER_FILE_ONLY
\ HELPSTRING
\ HIP_ARCHITECTURES
\ HIP_EXTENSIONS
\ HIP_STANDARD
\ HIP_STANDARD_REQUIRED
\ IMPLICIT_DEPENDS_INCLUDE_TRANSFORM
\ IMPORTED
\ IMPORTED_COMMON_LANGUAGE_RUNTIME
@ -1150,6 +1154,74 @@ syn keyword cmakeVariable contained
\ CMAKE_GLOBAL_AUTORCC_TARGET
\ CMAKE_GLOBAL_AUTORCC_TARGET_NAME
\ CMAKE_GNUtoMS
\ CMAKE_HIP
\ CMAKE_HIP_ANDROID_TOOLCHAIN_MACHINE
\ CMAKE_HIP_ANDROID_TOOLCHAIN_PREFIX
\ CMAKE_HIP_ANDROID_TOOLCHAIN_SUFFIX
\ CMAKE_HIP_ARCHITECTURES
\ CMAKE_HIP_ARCHIVE_APPEND
\ CMAKE_HIP_ARCHIVE_CREATE
\ CMAKE_HIP_ARCHIVE_FINISH
\ CMAKE_HIP_CLANG_TIDY
\ CMAKE_HIP_COMPILER
\ CMAKE_HIP_COMPILER_ABI
\ CMAKE_HIP_COMPILER_AR
\ CMAKE_HIP_COMPILER_ARCHITECTURE_ID
\ CMAKE_HIP_COMPILER_EXTERNAL_TOOLCHAIN
\ CMAKE_HIP_COMPILER_ID
\ CMAKE_HIP_COMPILER_LAUNCHER
\ CMAKE_HIP_COMPILER_LOADED
\ CMAKE_HIP_COMPILER_PREDEFINES_COMMAND
\ CMAKE_HIP_COMPILER_RANLIB
\ CMAKE_HIP_COMPILER_TARGET
\ CMAKE_HIP_COMPILER_VERSION
\ CMAKE_HIP_COMPILER_VERSION_INTERNAL
\ CMAKE_HIP_COMPILE_FEATURES
\ CMAKE_HIP_COMPILE_OBJECT
\ CMAKE_HIP_CPPCHECK
\ CMAKE_HIP_CPPLINT
\ CMAKE_HIP_CREATE_SHARED_LIBRARY
\ CMAKE_HIP_CREATE_SHARED_MODULE
\ CMAKE_HIP_CREATE_STATIC_LIBRARY
\ CMAKE_HIP_EXTENSIONS
\ CMAKE_HIP_FLAGS
\ CMAKE_HIP_FLAGS_DEBUG
\ CMAKE_HIP_FLAGS_DEBUG_INIT
\ CMAKE_HIP_FLAGS_INIT
\ CMAKE_HIP_FLAGS_MINSIZEREL
\ CMAKE_HIP_FLAGS_MINSIZEREL_INIT
\ CMAKE_HIP_FLAGS_RELEASE
\ CMAKE_HIP_FLAGS_RELEASE_INIT
\ CMAKE_HIP_FLAGS_RELWITHDEBINFO
\ CMAKE_HIP_FLAGS_RELWITHDEBINFO_INIT
\ CMAKE_HIP_IGNORE_EXTENSIONS
\ CMAKE_HIP_IMPLICIT_INCLUDE_DIRECTORIES
\ CMAKE_HIP_IMPLICIT_LINK_DIRECTORIES
\ CMAKE_HIP_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
\ CMAKE_HIP_IMPLICIT_LINK_LIBRARIES
\ CMAKE_HIP_INCLUDE_WHAT_YOU_USE
\ CMAKE_HIP_INIT
\ CMAKE_HIP_LIBRARY_ARCHITECTURE
\ CMAKE_HIP_LINKER_LAUNCHER
\ CMAKE_HIP_LINKER_PREFERENCE
\ CMAKE_HIP_LINKER_PREFERENCE_PROPAGATES
\ CMAKE_HIP_LINKER_WRAPPER_FLAG
\ CMAKE_HIP_LINKER_WRAPPER_FLAG_SEP
\ CMAKE_HIP_LINK_EXECUTABLE
\ CMAKE_HIP_LINK_LIBRARY_FILE_FLAG
\ CMAKE_HIP_LINK_LIBRARY_FLAG
\ CMAKE_HIP_LINK_LIBRARY_SUFFIX
\ CMAKE_HIP_OUTPUT_EXTENSION
\ CMAKE_HIP_PLATFORM_ID
\ CMAKE_HIP_SIMULATE_ID
\ CMAKE_HIP_SIMULATE_VERSION
\ CMAKE_HIP_SIZEOF_DATA_PTR
\ CMAKE_HIP_SOURCE_FILE_EXTENSIONS
\ CMAKE_HIP_STANDARD
\ CMAKE_HIP_STANDARD_INCLUDE_DIRECTORIES
\ CMAKE_HIP_STANDARD_LIBRARIES
\ CMAKE_HIP_STANDARD_REQUIRED
\ CMAKE_HIP_VISIBILITY_PRESET
\ CMAKE_HOME_DIRECTORY
\ CMAKE_HOST_APPLE
\ CMAKE_HOST_SOLARIS
@ -1502,6 +1574,7 @@ syn keyword cmakeVariable contained
\ CMAKE_USER_MAKE_RULES_OVERRIDE_CUDA
\ CMAKE_USER_MAKE_RULES_OVERRIDE_CXX
\ CMAKE_USER_MAKE_RULES_OVERRIDE_Fortran
\ CMAKE_USER_MAKE_RULES_OVERRIDE_HIP
\ CMAKE_USER_MAKE_RULES_OVERRIDE_Java
\ CMAKE_USER_MAKE_RULES_OVERRIDE_RC
\ CMAKE_USER_MAKE_RULES_OVERRIDE_Swift
@ -2575,6 +2648,7 @@ syn keyword cmakeKWdoxygen_add_docs contained
syn keyword cmakeKWenable_language contained
\ ASM
\ CUDA
\ HIP
\ ISPC
\ OBJC
\ OBJCXX
@ -3317,6 +3391,7 @@ syn keyword cmakeKWproject contained
\ CMAKE_PROJECT_
\ CUDA
\ DESCRIPTION
\ HIP
\ HOMEPAGE_URL
\ ISPC
\ LANGUAGES
@ -3630,6 +3705,9 @@ syn keyword cmakeKWtry_compile contained
\ EXECUTABLE
\ FALSE
\ GHS
\ HIP_EXTENSIONS
\ HIP_STANDARD
\ HIP_STANDARD_REQUIRED
\ INCLUDE_DIRECTORIES
\ LANG
\ LINK_DIRECTORIES
@ -3749,6 +3827,9 @@ syn keyword cmakeGeneratorExpressions contained
\ GENERATE
\ GENEX_EVAL
\ GNU
\ HIP_COMPILER_ID
\ HIP_COMPILER_VERSION
\ HIP_STANDARD
\ HOST_LINK
\ IF
\ IGNORE

@ -333,6 +333,15 @@ Most of the expressions in this section are closely associated with the
:command:`list` command, providing the same capabilities, but in
the form of a generator expression.
In each of the following list-related generator expressions, the ``list``
must not contain any commas if that generator expression expects something to
be provided after the ``list``. For example, the expression
``$<LIST:FIND,list,value>`` requires a ``value`` after the ``list``.
Since a comma is used to separate the ``list`` and the ``value``, the ``list``
cannot itself contain a comma. This restriction does not apply to the
:command:`list` command, it is specific to the list-handling generator
expressions only.
.. _GenEx List Comparisons:
List Comparisons
@ -354,133 +363,151 @@ List Queries
.. versionadded:: 3.27
Returns the list's length.
The number of items in the ``list``.
.. genex:: $<LIST:GET,list,index,...>
.. versionadded:: 3.27
Returns the list of elements specified by indices from the list.
Expands to the list of items specified by indices from the ``list``.
.. genex:: $<LIST:SUBLIST,list,begin,length>
.. versionadded:: 3.27
Returns a sublist of the given list. If <length> is 0, an empty list will be
returned. If <length> is -1 or the list is smaller than <begin>+<length> then
the remaining elements of the list starting at <begin> will be returned.
A sublist of the given ``list``. If ``length`` is 0, an empty list
will be returned. If ``length`` is -1 or the list is smaller than
``begin + length``, the remaining items of the list starting at
``begin`` will be returned.
.. genex:: $<LIST:FIND,list,value>
.. versionadded:: 3.27
Returns the index of the element specified in the list or -1 if it wasn't
found.
The index of the first item in ``list`` with the specified ``value``,
or -1 if ``value`` is not in the ``list``.
.. _GenEx List Transformations:
List Transformations
^^^^^^^^^^^^^^^^^^^^
.. _GenEx LIST-JOIN:
.. genex:: $<LIST:JOIN,list,glue>
.. versionadded:: 3.27
Returns a string which joins the list with the content of the ``glue`` string
inserted between each item.
Converts ``list`` to a single string with the content of the ``glue`` string
inserted between each item. This is conceptually the same operation as
:genex:`$<JOIN:list,glue>`, but the two have different behavior with regard
to empty items. ``$<LIST:JOIN,list,glue>`` preserves all empty items,
whereas :genex:`$<JOIN:list,glue>` drops all empty items from the list.
.. genex:: $<LIST:APPEND,list,element,...>
.. genex:: $<LIST:APPEND,list,item,...>
.. versionadded:: 3.27
Returns a list with the elements appended.
The ``list`` with each ``item`` appended. Multiple items should be
separated by commas.
.. genex:: $<LIST:PREPEND,list,element,...>
.. genex:: $<LIST:PREPEND,list,item,...>
.. versionadded:: 3.27
Returns a list with the elements inserted at the beginning of the list.
The ``list`` with each ``item`` inserted at the beginning. If there are
multiple items, they should be separated by commas, and the order of the
prepended items will be preserved.
.. genex:: $<LIST:INSERT,list,index,element,...>
.. genex:: $<LIST:INSERT,list,index,item,...>
.. versionadded:: 3.27
Returns a list with the elements inserted at the specified index. It is an
error to specify an out-of-range index. Valid indexes are 0 to N where N is
the length of the list, inclusive. An empty list has length 0.
The ``list`` with the ``item`` (or multiple items) inserted at the specified
``index``. Multiple items should be separated by commas.
It is an error to specify an out-of-range ``index``. Valid indexes are 0 to N,
where N is the length of the list, inclusive. An empty list has length 0.
.. genex:: $<LIST:POP_BACK,list>
.. versionadded:: 3.27
Returns a list with the last element was removed.
The ``list`` with the last item removed.
.. genex:: $<LIST:POP_FRONT,list>
.. versionadded:: 3.27
Returns a list with the first element was removed.
The ``list`` with the first item removed.
.. genex:: $<LIST:REMOVE_ITEM,list,value,...>
.. versionadded:: 3.27
Returns a list with all instances of the given values were removed.
The ``list`` with all instances of the given ``value`` (or values) removed.
If multiple values are given, they should be separated by commas.
.. genex:: $<LIST:REMOVE_AT,list,index,...>
.. versionadded:: 3.27
Returns a list with all values at given indices were removed.
The ``list`` with the item at each given ``index`` removed.
.. _GenEx LIST-REMOVE_DUPLICATES:
.. genex:: $<LIST:REMOVE_DUPLICATES,list>
.. versionadded:: 3.27
Returns a list where duplicated items were removed. The relative order of
The ``list`` with all duplicated items removed. The relative order of
items is preserved, but if duplicates are encountered, only the first
instance is preserved.
instance is preserved. The result is the same as
:genex:`$<REMOVE_DUPLICATES:list>`.
.. _GenEx LIST-FILTER:
.. genex:: $<LIST:FILTER,list,INCLUDE|EXCLUDE,regex>
.. versionadded:: 3.27
Returns a list with the items that match the regular expression ``regex``
were included or removed.
A list of items from the ``list`` which match (``INCLUDE``) or do not match
(``EXCLUDE``) the regular expression ``regex``. The result is the same as
:genex:`$<FILTER:list,INCLUDE|EXCLUDE,regex>`.
.. genex:: $<LIST:TRANSFORM,list,ACTION[,SELECTOR]>
.. versionadded:: 3.27
Returns the list transformed by applying an ``ACTION`` to all or, by
specifying a ``SELECTOR``, to the selected elements of the list.
The ``list`` transformed by applying an ``ACTION`` to all or, by
specifying a ``SELECTOR``, to the selected list items.
.. note::
The ``TRANSFORM`` sub-command does not change the number of elements in the
list. If a ``SELECTOR`` is specified, only some elements will be changed,
The ``TRANSFORM`` sub-command does not change the number of items in the
list. If a ``SELECTOR`` is specified, only some items will be changed,
the other ones will remain the same as before the transformation.
``ACTION`` specifies the action to apply to the elements of the list.
The actions have exactly the same semantics as of the
``ACTION`` specifies the action to apply to the items of the list.
The actions have exactly the same semantics as for the
:command:`list(TRANSFORM)` command. ``ACTION`` must be one of the following:
:command:`APPEND <list(TRANSFORM_APPEND)>`, :command:`PREPEND <list(TRANSFORM_APPEND)>`
Append, prepend specified value to each element of the list.
Append, prepend specified value to each item of the list.
.. code-block:: cmake
$<LIST:TRANSFORM,list,(APPEND|PREPEND),value[,SELECTOR]>
:command:`TOLOWER <list(TRANSFORM_TOLOWER)>`, :command:`TOUPPER <list(TRANSFORM_TOLOWER)>`
Convert each element of the list to lower, upper characters.
Convert each item of the list to lower, upper characters.
.. code-block:: cmake
$<LIST:TRANSFORM,list,(TOLOWER|TOUPPER)[,SELECTOR]>
:command:`STRIP <list(TRANSFORM_STRIP)>`
Remove leading and trailing spaces from each element of the list.
Remove leading and trailing spaces from each item of the list.
.. code-block:: cmake
@ -488,13 +515,13 @@ List Transformations
:command:`REPLACE <list(TRANSFORM_REPLACE)>`:
Match the regular expression as many times as possible and substitute
the replacement expression for the match for each element of the list.
the replacement expression for the match for each item of the list.
.. code-block:: cmake
$<LIST:TRANSFORM,list,REPLACE,regular_expression,replace_expression[,SELECTOR]>
``SELECTOR`` determines which elements of the list will be transformed.
``SELECTOR`` determines which items of the list will be transformed.
Only one type of selector can be specified at a time. When given,
``SELECTOR`` must be one of the following:
@ -515,7 +542,7 @@ List Transformations
``REGEX``
Specify a regular expression.
Only elements matching the regular expression will be transformed.
Only items matching the regular expression will be transformed.
.. code-block:: cmake
@ -523,23 +550,29 @@ List Transformations
.. genex:: $<JOIN:list,glue>
Joins the list with the content of the ``glue`` string inserted between each
item.
Joins the ``list`` with the content of the ``glue`` string inserted between
each item. This is conceptually the same operation as
:ref:`$\<LIST:JOIN,list,glue\> <GenEx LIST-JOIN>`, but the two have
different behavior with regard to empty items.
:ref:`$\<LIST:JOIN,list,glue\> <GenEx LIST-JOIN>` preserves all empty items,
whereas ``$<JOIN,list,glue>`` drops all empty items from the list.
.. genex:: $<REMOVE_DUPLICATES:list>
.. versionadded:: 3.15
Removes duplicated items in the given ``list``. The relative order of items
is preserved, but if duplicates are encountered, only the first instance is
preserved.
is preserved, and if duplicates are encountered, only the first instance is
retained. The result is the same as
:ref:`$\<LIST:REMOVE_DUPLICATES,list\> <GenEx LIST-REMOVE_DUPLICATES>`.
.. genex:: $<FILTER:list,INCLUDE|EXCLUDE,regex>
.. versionadded:: 3.15
Includes or removes items from ``list`` that match the regular expression
``regex``.
``regex``. The result is the same as
:ref:`$\<LIST:FILTER,list,INCLUDE|EXCLUDE,regex\> <GenEx LIST-FILTER>`.
.. _GenEx List Ordering:
@ -550,13 +583,13 @@ List Ordering
.. versionadded:: 3.27
Returns the list with the elements in reverse order.
The ``list`` with the items in reverse order.
.. genex:: $<LIST:SORT,list[,(COMPARE:option|CASE:option|ORDER:option)]...>
.. versionadded:: 3.27
Returns the list sorted according the specified options.
The ``list`` sorted according to the specified options.
Use one of the ``COMPARE`` options to select the comparison method
for sorting:
@ -566,26 +599,25 @@ List Ordering
This is the default behavior if the ``COMPARE`` option is not given.
``FILE_BASENAME``
Sorts a list of pathnames of files by their basenames.
Sorts a list of file paths by their basenames.
``NATURAL``
Sorts a list of strings using natural order
(see ``strverscmp(3)`` manual), i.e. such that contiguous digits
are compared as whole numbers.
For example: the following list `10.0 1.1 2.1 8.0 2.0 3.1`
will be sorted as `1.1 2.0 2.1 3.1 8.0 10.0` if the ``NATURAL``
comparison is selected where it will be sorted as
`1.1 10.0 2.0 2.1 3.1 8.0` with the ``STRING`` comparison.
Sorts a list of strings using natural order (see the man page for
``strverscmp(3)``), such that contiguous digits are compared as whole
numbers. For example, the following list ``10.0 1.1 2.1 8.0 2.0 3.1``
will be sorted as ``1.1 2.0 2.1 3.1 8.0 10.0`` if the ``NATURAL``
comparison is selected, whereas it will be sorted as
``1.1 10.0 2.0 2.1 3.1 8.0`` with the ``STRING`` comparison.
Use one of the ``CASE`` options to select a case sensitive or case
insensitive sort mode:
Use one of the ``CASE`` options to select a case-sensitive or
case-insensitive sort mode:
``SENSITIVE``
List items are sorted in a case-sensitive manner.
This is the default behavior if the ``CASE`` option is not given.
``INSENSITIVE``
List items are sorted case insensitively. The order of
List items are sorted in a case-insensitive manner. The order of
items which differ only by upper/lowercase is not specified.
To control the sort order, one of the ``ORDER`` options can be given:
@ -597,8 +629,8 @@ List Ordering
``DESCENDING``
Sorts the list in descending order.
This is an error to specify multiple times the same option. Various options
can be specified in any order:
Options can be specified in any order, but it is an error to specify the
same option multiple times.
.. code-block:: cmake
@ -1789,20 +1821,20 @@ In the following, the phrase "the ``tgt`` filename" means the name of the
.. versionadded:: 3.27
Full path to the linker import file. On DLL platforms, it would be the
``.lib`` file. On AIX, for the executables, and on macOS, for the shared
libraries, it could be, respectively, the ``.imp`` or ``.tbd`` import file,
depending of the value of :prop_tgt:`ENABLE_EXPORTS` property.
``.lib`` file. For executables on AIX, and for shared libraries on macOS,
it could be, respectively, the ``.imp`` or ``.tbd`` import file,
depending on the value of the :prop_tgt:`ENABLE_EXPORTS` property.
An empty string is returned when there is no import file associated with the
target.
This expands to an empty string when there is no import file associated
with the target.
.. genex:: $<TARGET_IMPORT_FILE_BASE_NAME:tgt>
.. versionadded:: 3.27
Base name of file linker import file of the target ``tgt`` without prefix and
suffix. For example, if target file name is ``libbase.tbd``, the base name is
``base``.
Base name of the linker import file of the target ``tgt`` without prefix or
suffix. For example, if the target file name is ``libbase.tbd``, the base
name is ``base``.
See also the :prop_tgt:`OUTPUT_NAME` and :prop_tgt:`ARCHIVE_OUTPUT_NAME`
target properties and their configuration specific variants
@ -1831,7 +1863,7 @@ In the following, the phrase "the ``tgt`` filename" means the name of the
Suffix of the import file of the target ``tgt``.
The suffix corresponds to the file extension (such as ".lib" or ".tbd").
The suffix corresponds to the file extension (such as ``.lib`` or ``.tbd``).
See also the :prop_tgt:`IMPORT_SUFFIX` target property.
@ -1842,13 +1874,15 @@ In the following, the phrase "the ``tgt`` filename" means the name of the
.. versionadded:: 3.27
Name of the import file of the target target ``tgt``.
Name of the import file of the target ``tgt``.
Note that ``tgt`` is not added as a dependency of the target this
expression is evaluated on.
.. genex:: $<TARGET_IMPORT_FILE_DIR:tgt>
.. versionadded:: 3.27
Directory of the import file of the target ``tgt``.
Note that ``tgt`` is not added as a dependency of the target this
@ -1863,11 +1897,11 @@ In the following, the phrase "the ``tgt`` filename" means the name of the
.. versionadded:: 3.27
On macOS, it could be the ``.tbd`` import file associated with the shared
library, depending of the value of :prop_tgt:`ENABLE_EXPORTS` property.
library, depending on the value of the :prop_tgt:`ENABLE_EXPORTS` property.
This generator expression is equivalent to
:genex:`$<TARGET_LINKER_LIBRARY_FILE>` or
:genex:`$<TARGET_LINKER_IMPORT_FILE>` generator expressions, depending of the
:genex:`$<TARGET_LINKER_IMPORT_FILE>` generator expressions, depending on the
characteristics of the target and the platform.
.. genex:: $<TARGET_LINKER_FILE_BASE_NAME:tgt>

@ -157,6 +157,12 @@ Generator Expressions
:ref:`transformation <GenEx Path Transformations>` operations learned
to process :ref:`lists <CMake Language Lists>` of paths element-wise.
* The :genex:`TARGET_IMPORT_FILE`, :genex:`TARGET_IMPORT_FILE_BASE_NAME`,
:genex:`TARGET_IMPORT_FILE_PREFIX`, :genex:`TARGET_IMPORT_FILE_SUFFIX`,
:genex:`TARGET_IMPORT_FILE_NAME`, and :genex:`TARGET_IMPORT_FILE_DIR`
generator expressions were added. These expand to details about the
linker import file for a target.
* The :genex:`TARGET_RUNTIME_DLL_DIRS` generator expression was added.
It expands to a list of the directories containing DLLs in
:genex:`TARGET_RUNTIME_DLLS`.

@ -124,7 +124,10 @@ unset(_CMAKE_HIP_COMPILER_ID_IMPLICIT_FWKS)
unset(_CMAKE_HIP_COMPILER_ID_IMPLICIT_LOG)
if(NOT CMAKE_HIP_COMPILER_ROCM_LIB)
set(_CMAKE_HIP_COMPILER_ROCM_LIB_DIRS "${CMAKE_HIP_COMPILER_ROCM_ROOT}/lib")
set(_CMAKE_HIP_COMPILER_ROCM_LIB_DIRS
"${CMAKE_HIP_COMPILER_ROCM_ROOT}/lib"
"${CMAKE_HIP_COMPILER_ROCM_ROOT}/lib64"
)
if(CMAKE_HIP_LIBRARY_ARCHITECTURE)
list(APPEND _CMAKE_HIP_COMPILER_ROCM_LIB_DIRS "${CMAKE_HIP_COMPILER_ROCM_ROOT}/lib/${CMAKE_HIP_LIBRARY_ARCHITECTURE}")
endif()
@ -146,6 +149,12 @@ if(NOT CMAKE_HIP_COMPILER_ROCM_LIB)
endif()
unset(_CMAKE_HIP_COMPILER_ROCM_LIB_DIRS)
endif()
if(CMAKE_HIP_COMPILER_ROCM_LIB MATCHES "/lib64$" AND NOT DEFINED CMAKE_SIZEOF_VOID_P)
# We have not yet determined the target ABI but we need 'find_package' to
# search lib64 directories to find hip-lang CMake package dependencies.
# This will be replaced by ABI detection later.
set(CMAKE_HIP_SIZEOF_DATA_PTR 8)
endif()
if (NOT _CMAKE_TOOLCHAIN_LOCATION)
get_filename_component(_CMAKE_TOOLCHAIN_LOCATION "${CMAKE_HIP_COMPILER}" PATH)

@ -499,11 +499,7 @@ if(Protobuf_INCLUDE_DIR)
math(EXPR _PROTOBUF_MAJOR_VERSION "${Protobuf_LIB_VERSION} / 1000000")
math(EXPR _PROTOBUF_MINOR_VERSION "${Protobuf_LIB_VERSION} / 1000 % 1000")
math(EXPR _PROTOBUF_SUBMINOR_VERSION "${Protobuf_LIB_VERSION} % 1000")
if (_PROTOBUF_MINOR_VERSION GREATER_EQUAL "21")
set(Protobuf_VERSION "${_PROTOBUF_MINOR_VERSION}.${_PROTOBUF_SUBMINOR_VERSION}")
else()
set(Protobuf_VERSION "${_PROTOBUF_MAJOR_VERSION}.${_PROTOBUF_MINOR_VERSION}.${_PROTOBUF_SUBMINOR_VERSION}")
endif()
set(Protobuf_VERSION "${_PROTOBUF_MAJOR_VERSION}.${_PROTOBUF_MINOR_VERSION}.${_PROTOBUF_SUBMINOR_VERSION}")
if(Protobuf_DEBUG)
message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
@ -524,7 +520,9 @@ if(Protobuf_INCLUDE_DIR)
"${Protobuf_PROTOC_EXECUTABLE} reveals version ${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}")
endif()
if(NOT "${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}" VERSION_EQUAL "${Protobuf_VERSION}")
# protoc version 22 and up don't print the major version any more
if(NOT "${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}" VERSION_EQUAL "${Protobuf_VERSION}" AND
NOT "${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}" VERSION_EQUAL "${_PROTOBUF_MINOR_VERSION}.${_PROTOBUF_SUBMINOR_VERSION}")
message(WARNING "Protobuf compiler version ${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}"
" doesn't match library version ${Protobuf_VERSION}")
endif()
@ -556,7 +554,7 @@ if(Protobuf_INCLUDE_DIR)
INTERFACE_COMPILE_FEATURES cxx_std_11
)
endif()
if (MSVC AND NOT Protobuf_USE_STATIC_LIBS)
if (WIN32 AND NOT Protobuf_USE_STATIC_LIBS)
set_property(TARGET protobuf::libprotobuf APPEND PROPERTY
INTERFACE_COMPILE_DEFINITIONS "PROTOBUF_USE_DLLS"
)
@ -589,7 +587,7 @@ if(Protobuf_INCLUDE_DIR)
set_target_properties(protobuf::libprotobuf-lite PROPERTIES
IMPORTED_LOCATION_DEBUG "${Protobuf_LITE_LIBRARY_DEBUG}")
endif()
if (MSVC AND NOT Protobuf_USE_STATIC_LIBS)
if (WIN32 AND NOT Protobuf_USE_STATIC_LIBS)
set_property(TARGET protobuf::libprotobuf-lite APPEND PROPERTY
INTERFACE_COMPILE_DEFINITIONS "PROTOBUF_USE_DLLS"
)
@ -627,7 +625,7 @@ if(Protobuf_INCLUDE_DIR)
INTERFACE_COMPILE_FEATURES cxx_std_11
)
endif()
if (MSVC AND NOT Protobuf_USE_STATIC_LIBS)
if (WIN32 AND NOT Protobuf_USE_STATIC_LIBS)
set_property(TARGET protobuf::libprotoc APPEND PROPERTY
INTERFACE_COMPILE_DEFINITIONS "PROTOBUF_USE_DLLS"
)

@ -4,6 +4,8 @@ if(CMAKE_ANDROID_NDK)
include(${CMAKE_ANDROID_NDK}/build/cmake/hooks/pre/Android.cmake OPTIONAL)
endif()
include(Platform/Linux)
# Natively compiling on an Android host doesn't need these flags to be reset.
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Android")
return()

@ -2,7 +2,7 @@
set(CMake_VERSION_MAJOR 3)
set(CMake_VERSION_MINOR 27)
set(CMake_VERSION_PATCH 0)
set(CMake_VERSION_RC 4)
set(CMake_VERSION_RC 5)
set(CMake_VERSION_IS_DIRTY 0)
# Start with the full version number used in tags. It has no dev info.
@ -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 [==[b384058e4b CMake 3.27.0-rc4]==])
set(git_info [==[8bcba75b1c CMake 3.27.0-rc5]==])
# 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]* "

@ -6,6 +6,7 @@
#include <cstddef>
#include <cstdint>
#include <memory>
#include <utility>
#include <cm3p/cppdap/optional.h>
#include <cm3p/cppdap/session.h>
@ -78,12 +79,14 @@ cmDebuggerBreakpointManager::HandleSetBreakpointsRequest(
cmSystemTools::GetActualCaseForPath(request.source.path.value());
const dap::array<dap::SourceBreakpoint> defaultValue{};
const auto& breakpoints = request.breakpoints.value(defaultValue);
if (Breakpoints.find(sourcePath) != Breakpoints.end()) {
Breakpoints[sourcePath].clear();
}
response.breakpoints.resize(breakpoints.size());
if (ListFileFunctionLines.find(sourcePath) != ListFileFunctionLines.end()) {
// The file has loaded, we can validate breakpoints.
if (Breakpoints.find(sourcePath) != Breakpoints.end()) {
Breakpoints[sourcePath].clear();
}
response.breakpoints.resize(breakpoints.size());
for (size_t i = 0; i < breakpoints.size(); i++) {
int64_t correctedLine =
CalibrateBreakpointLine(sourcePath, breakpoints[i].line);
@ -106,7 +109,6 @@ cmDebuggerBreakpointManager::HandleSetBreakpointsRequest(
// The file has not loaded, validate breakpoints later.
ListFilePendingValidations.emplace(sourcePath);
response.breakpoints.resize(breakpoints.size());
for (size_t i = 0; i < breakpoints.size(); i++) {
Breakpoints[sourcePath].emplace_back(NextBreakpointId++,
breakpoints[i].line);
@ -191,6 +193,15 @@ std::vector<int64_t> cmDebuggerBreakpointManager::GetBreakpoints(
return breakpoints;
}
size_t cmDebuggerBreakpointManager::GetBreakpointCount() const
{
size_t count = 0;
for (auto const& pair : Breakpoints) {
count += pair.second.size();
}
return count;
}
void cmDebuggerBreakpointManager::ClearAll()
{
std::unique_lock<std::mutex> lock(Mutex);

@ -4,6 +4,7 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include <cstddef>
#include <cstdint>
#include <mutex>
#include <string>
@ -55,6 +56,7 @@ public:
std::vector<cmListFileFunction> const& functions);
std::vector<int64_t> GetBreakpoints(std::string const& sourcePath,
int64_t line);
size_t GetBreakpointCount() const;
void ClearAll();
};

@ -78,15 +78,16 @@ dap::array<dap::Variable> cmDebuggerVariables::HandleVariablesRequest()
entry.Value.empty()) {
continue;
}
variables.push_back(dap::Variable{ {},
{},
{},
entry.Name,
{},
PrivateDataHint,
entry.Type,
entry.Value,
0 });
variables.push_back(dap::Variable{
{},
{},
{},
entry.Name,
{},
PrivateDataHint,
SupportsVariableType ? entry.Type : dap::optional<dap::string>(),
entry.Value,
0 });
}
}
@ -106,16 +107,16 @@ void cmDebuggerVariables::EnumerateSubVariablesIfAny(
{
dap::array<dap::Variable> ret;
for (auto const& variables : SubVariables) {
toBeReturned.emplace_back(
dap::Variable{ {},
{},
{},
variables->GetName(),
{},
PrivatePropertyHint,
SupportsVariableType ? "collection" : nullptr,
variables->GetValue(),
variables->GetId() });
toBeReturned.emplace_back(dap::Variable{
{},
{},
{},
variables->GetName(),
{},
PrivatePropertyHint,
SupportsVariableType ? "collection" : dap::optional<dap::string>(),
variables->GetValue(),
variables->GetId() });
}
}

@ -384,7 +384,9 @@ static const struct RemoveDuplicatesNode : public cmGeneratorExpressionNode
"$<REMOVE_DUPLICATES:...> expression requires one parameter");
}
return cmList{ parameters.front() }.remove_duplicates().to_string();
return cmList{ parameters.front(), cmList::EmptyElements::Yes }
.remove_duplicates()
.to_string();
}
} removeDuplicatesNode;

@ -2733,7 +2733,8 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
auto mm = CxxModuleMapContent(*modmap_fmt, locs, object, usages);
// XXX(modmap): If changing this path construction, change
// `cmNinjaTargetGenerator::WriteObjectBuildStatements` to generate the
// `cmNinjaTargetGenerator::WriteObjectBuildStatements` and
// `cmNinjaTargetGenerator::ExportObjectCompileCommand` to generate the
// corresponding file path.
cmGeneratedFileStream mmf(cmStrCat(object.PrimaryOutput, ".modmap"));
mmf << mm;

@ -1428,8 +1428,9 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
if (!modmapFormat.empty()) {
// XXX(modmap): If changing this path construction, change
// `cmGlobalNinjaGenerator::WriteDyndep` to expect the corresponding file
// path.
// `cmGlobalNinjaGenerator::WriteDyndep` and
// `cmNinjaTargetGenerator::ExportObjectCompileCommand` to expect the
// corresponding file path.
std::string ddModmapFile = cmStrCat(objectFileName, ".modmap");
vars["DYNDEP_MODULE_MAP_FILE"] = ddModmapFile;
objBuild.OrderOnlyDeps.push_back(ddModmapFile);
@ -1688,11 +1689,32 @@ void cmNinjaTargetGenerator::ExportObjectCompileCommand(
escapedSourceFileName = this->LocalGenerator->ConvertToOutputFormat(
escapedSourceFileName, cmOutputConverter::SHELL);
std::string fullFlags = flags;
{
bool const needDyndep =
this->GetGeneratorTarget()->NeedDyndep(language, outputConfig);
std::string const modmapFormatVar =
cmStrCat("CMAKE_EXPERIMENTAL_", language, "_MODULE_MAP_FORMAT");
std::string const modmapFormat =
this->Makefile->GetSafeDefinition(modmapFormatVar);
if (needDyndep && !modmapFormat.empty()) {
std::string modmapFlags = this->GetMakefile()->GetRequiredDefinition(
cmStrCat("CMAKE_EXPERIMENTAL_", language, "_MODULE_MAP_FLAG"));
// XXX(modmap): If changing this path construction, change
// `cmGlobalNinjaGenerator::WriteDyndep` and
// `cmNinjaTargetGenerator::WriteObjectBuildStatement` to expect the
// corresponding file path.
cmSystemTools::ReplaceString(modmapFlags, "<MODULE_MAP_FILE>",
cmStrCat(objectFileName, ".modmap"));
fullFlags += cmStrCat(' ', modmapFlags);
}
}
compileObjectVars.Source = escapedSourceFileName.c_str();
compileObjectVars.Object = objectFileName.c_str();
compileObjectVars.ObjectDir = objectDir.c_str();
compileObjectVars.ObjectFileDir = objectFileDir.c_str();
compileObjectVars.Flags = flags.c_str();
compileObjectVars.Flags = fullFlags.c_str();
compileObjectVars.Defines = defines.c_str();
compileObjectVars.Includes = includes.c_str();

@ -309,7 +309,7 @@ void cmUVReadOnlyProcess::UVExit(uv_process_t* handle, int64_t exitStatus,
// Set error message on demand
proc.Result()->ExitStatus = exitStatus;
proc.Result()->TermSignal = termSignal;
if (!proc.Result()->error()) {
if (proc.Result()->ErrorMessage.empty()) {
if (termSignal != 0) {
proc.Result()->ErrorMessage = cmStrCat(
"Process was terminated by signal ", proc.Result()->TermSignal);

@ -2502,6 +2502,26 @@ int cmVSLink::LinkIncremental()
int cmVSLink::LinkNonIncremental()
{
// The MSVC link tool expects 'rc' to be in the PATH if it needs to embed
// manifests, but the user might explicitly set 'CMAKE_RC_COMPILER' instead.
// Add its location as a fallback at the end of PATH.
if (cmSystemTools::FileIsFullPath(this->RcPath)) {
std::string rcDir = cmSystemTools::GetFilenamePath(this->RcPath);
#ifdef _WIN32
std::replace(rcDir.begin(), rcDir.end(), '/', '\\');
char const pathSep = ';';
#else
char const pathSep = ':';
#endif
cm::optional<std::string> path = cmSystemTools::GetEnvVar("PATH");
if (path) {
path = cmStrCat(*path, pathSep, rcDir);
} else {
path = rcDir;
}
cmSystemTools::PutEnv(cmStrCat("PATH=", *path));
}
// Sort out any manifests.
if (this->LinkGeneratesManifest || !this->UserManifests.empty()) {
std::string opt =

@ -19,11 +19,15 @@
do { \
ASSERT_TRUE(x.name == expectedName); \
ASSERT_TRUE(x.value == expectedValue); \
ASSERT_TRUE(x.type.value() == expectedType); \
ASSERT_TRUE(x.evaluateName.has_value() == false); \
if (std::string(expectedType) == "collection") { \
ASSERT_TRUE(x.variablesReference != 0); \
if (expectedType == nullptr) { \
ASSERT_TRUE(x.type == dap::optional<dap::string>()); \
} else { \
ASSERT_TRUE(x.type == dap::optional<dap::string>(expectedType)); \
if (std::string(expectedType) == "collection") { \
ASSERT_TRUE(x.variablesReference != 0); \
} \
} \
ASSERT_TRUE(x.evaluateName.has_value() == false); \
} while (false)
#define ASSERT_VARIABLE_REFERENCE(x, expectedName, expectedValue, \

@ -51,6 +51,13 @@ static bool testHandleBreakpointRequestBeforeFileIsLoaded()
sourcePath, false);
ASSERT_BREAKPOINT(response.breakpoints[2], 2, sourceBreakpoints[2].line,
sourcePath, false);
ASSERT_TRUE(breakpointManager.GetBreakpointCount() == 3);
// setBreakpoints should override any existing breakpoints
setBreakpointRequest.breakpoints.value().clear();
helper.Client->send(setBreakpointRequest).get();
ASSERT_TRUE(breakpointManager.GetBreakpointCount() == 0);
return true;
}
@ -103,6 +110,12 @@ static bool testHandleBreakpointRequestAfterFileIsLoaded()
sourcePath, true);
ASSERT_TRUE(notExpectBreakpointEvents.load());
ASSERT_TRUE(breakpointManager.GetBreakpointCount() == 5);
// setBreakpoints should override any existing breakpoints
setBreakpointRequest.breakpoints.value().clear();
helper.Client->send(setBreakpointRequest).get();
ASSERT_TRUE(breakpointManager.GetBreakpointCount() == 0);
return true;
}

@ -8,6 +8,7 @@
#include <unordered_set>
#include <vector>
#include <cm3p/cppdap/optional.h>
#include <cm3p/cppdap/protocol.h>
#include <cm3p/cppdap/types.h>
@ -174,6 +175,33 @@ static bool testSortTheResult()
return true;
}
static bool testNoSupportsVariableType()
{
auto variablesManager =
std::make_shared<cmDebugger::cmDebuggerVariablesManager>();
auto vars = std::make_shared<cmDebugger::cmDebuggerVariables>(
variablesManager, "Variables", false, []() {
return std::vector<cmDebugger::cmDebuggerVariableEntry>{ { "test",
"value" } };
});
auto subvars = std::make_shared<cmDebugger::cmDebuggerVariables>(
variablesManager, "Children", false);
vars->AddSubVariables(subvars);
dap::array<dap::Variable> variables =
variablesManager->HandleVariablesRequest(
CreateVariablesRequest(vars->GetId()));
ASSERT_TRUE(variables.size() == 2);
ASSERT_VARIABLE(variables[0], "Children", "", nullptr);
ASSERT_VARIABLE(variables[1], "test", "value", nullptr);
return true;
}
int testDebuggerVariables(int, char*[])
{
return runTests(std::vector<std::function<bool()>>{
@ -181,5 +209,6 @@ int testDebuggerVariables(int, char*[])
testConstructors,
testIgnoreEmptyStringEntries,
testSortTheResult,
testNoSupportsVariableType,
});
}

@ -8,6 +8,7 @@
#include <utility>
#include <vector>
#include <cm3p/cppdap/optional.h>
#include <cm3p/cppdap/protocol.h>
#include <cm3p/cppdap/types.h>
#include <stddef.h>

@ -152,6 +152,11 @@ if ("named" IN_LIST CMake_TEST_MODULE_COMPILATION)
run_cxx_module_test(scan_properties)
endif ()
# Tests which require compile commands support.
if ("compile_commands" IN_LIST CMake_TEST_MODULE_COMPILATION)
run_cxx_module_test(export-compile-commands)
endif ()
# Tests which require collation work.
if ("collation" IN_LIST CMake_TEST_MODULE_COMPILATION)
run_cxx_module_test(public-req-private)

@ -0,0 +1,25 @@
if (NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/compile_commands.json")
list(APPEND RunCMake_TEST_FAILED
"No compile commands database detected.")
endif ()
file(READ "${RunCMake_TEST_BINARY_DIR}/compile_commands.json" compile_commands)
string(JSON length
LENGTH "${compile_commands}")
math(EXPR length "${length} - 1")
foreach (item RANGE "${length}")
string(JSON entry
GET "${compile_commands}"
"${item}")
string(JSON command
GET "${entry}"
"command")
if (NOT command MATCHES "(@|-fmodule-mapper=).*\\.modmap")
string(JSON output
GET "${entry}"
"output")
list(APPEND RunCMake_TEST_FAILED
"Missing `.modmap` argument for '${output}'")
endif ()
endforeach ()

@ -0,0 +1,4 @@
CMake Warning \(dev\) at CMakeLists.txt:9 \(target_sources\):
CMake's C\+\+ module support is experimental. It is meant only for
experimentation and feedback to CMake developers.
This warning is for project developers. Use -Wno-dev to suppress it.

@ -0,0 +1,20 @@
cmake_minimum_required(VERSION 3.24)
project(cxx_modules_export_compile_commands CXX)
include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake")
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
add_executable(export-compile-commands)
target_sources(export-compile-commands
PRIVATE
main.cxx
PRIVATE
FILE_SET CXX_MODULES
BASE_DIRS
"${CMAKE_CURRENT_SOURCE_DIR}"
FILES
importable.cxx)
target_compile_features(export-compile-commands PUBLIC cxx_std_20)
add_test(NAME export-compile-commands COMMAND export-compile-commands)

@ -0,0 +1,6 @@
export module importable;
export int from_import()
{
return 0;
}

@ -0,0 +1,6 @@
import importable;
int main(int argc, char* argv[])
{
return from_import();
}

@ -0,0 +1,6 @@
file(READ "${RunCMake_TEST_BINARY_DIR}/REMOVE_DUPLICATES-generated.txt" content)
set(expected "1;;2;3")
if(NOT content STREQUAL expected)
set(RunCMake_TEST_FAILED "actual content:\n [[${content}]]\nbut expected:\n [[${expected}]]")
endif()

@ -0,0 +1,3 @@
cmake_policy(VERSION 3.11)
file(GENERATE OUTPUT "REMOVE_DUPLICATES-generated.txt" CONTENT "$<REMOVE_DUPLICATES:1$<SEMICOLON>$<SEMICOLON>2$<SEMICOLON>$<SEMICOLON>3>")

@ -36,6 +36,7 @@ run_cmake(TARGET_NAME_IF_EXISTS-alias-target)
run_cmake(TARGET_NAME_IF_EXISTS-imported-target)
run_cmake(TARGET_NAME_IF_EXISTS-imported-global-target)
run_cmake(REMOVE_DUPLICATES-empty)
run_cmake(REMOVE_DUPLICATES-empty-element)
run_cmake(REMOVE_DUPLICATES-1)
run_cmake(REMOVE_DUPLICATES-2)
run_cmake(REMOVE_DUPLICATES-3)

@ -737,7 +737,7 @@ class CMakeDomain(Domain):
def get_objects(self):
for refname, obj in self.data['objects'].items():
yield (refname, obj.name, obj.objtype, obj.docname, obj.node_id, 1)
yield (refname, refname, obj.objtype, obj.docname, obj.node_id, 1)
def setup(app):

Loading…
Cancel
Save