mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00
{get,set}_property: Add support for referencing binary directories
Index directories by their binary directory path in addition to their source directory path. Fixes: #19262
This commit is contained in:
@@ -8,9 +8,14 @@ Get a property of ``DIRECTORY`` scope.
|
||||
get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)
|
||||
|
||||
Stores a property of directory scope in the named ``<variable>``.
|
||||
|
||||
The ``DIRECTORY`` argument specifies another directory from which
|
||||
to retrieve the property value instead of the current directory.
|
||||
The specified directory must have already been traversed by CMake.
|
||||
It may reference either a source directory, or since CMake 3.19,
|
||||
a binary directory. Relative paths are treated as relative to the
|
||||
current source directory. CMake must already know about the directory,
|
||||
either by having added it through a call to :command:`add_subdirectory`
|
||||
or being the top level directory.
|
||||
|
||||
If the property is not defined for the nominated directory scope,
|
||||
an empty string is returned. In the case of ``INHERITED`` properties,
|
||||
|
@@ -30,7 +30,9 @@ It must be one of the following:
|
||||
``DIRECTORY``
|
||||
Scope defaults to the current directory but another
|
||||
directory (already processed by CMake) may be named by the
|
||||
full or relative path ``<dir>``.
|
||||
full or relative path ``<dir>``. The ``<dir>`` may reference either a
|
||||
source directory, or since CMake 3.19, a binary directory.
|
||||
Relative paths are treated as relative to the current source directory.
|
||||
See also the :command:`get_directory_property` command.
|
||||
|
||||
``TARGET``
|
||||
@@ -44,10 +46,11 @@ It must be one of the following:
|
||||
|
||||
``DIRECTORY <dir>``
|
||||
The source file property will be read from the ``<dir>`` directory's
|
||||
scope. CMake must already know about that source directory, either by
|
||||
having added it through a call to :command:`add_subdirectory` or ``<dir>``
|
||||
being the top level source directory. Relative paths are treated as
|
||||
relative to the current source directory.
|
||||
scope. The ``<dir>`` may reference either a source directory, or
|
||||
since CMake 3.19, a binary directory. CMake must already know about
|
||||
the directory, either by having added it through a call
|
||||
to :command:`add_subdirectory` or ``<dir>`` being the top level directory.
|
||||
Relative paths are treated as relative to the current source directory.
|
||||
|
||||
``TARGET_DIRECTORY <target>``
|
||||
The source file property will be read from the directory scope in which
|
||||
|
@@ -26,8 +26,11 @@ It must be one of the following:
|
||||
Scope is unique and does not accept a name.
|
||||
|
||||
``DIRECTORY``
|
||||
Scope defaults to the current directory but another directory
|
||||
Scope defaults to the current directory but other directories
|
||||
(already processed by CMake) may be named by full or relative path.
|
||||
Each path may reference either a source directory, or since CMake 3.19,
|
||||
a binary directory.
|
||||
Relative paths are treated as relative to the current source directory.
|
||||
See also the :command:`set_directory_properties` command.
|
||||
|
||||
``TARGET``
|
||||
@@ -42,8 +45,9 @@ It must be one of the following:
|
||||
|
||||
``DIRECTORY <dirs>...``
|
||||
The source file property will be set in each of the ``<dirs>``
|
||||
directories' scopes. CMake must already know about each of these
|
||||
source directories, either by having added them through a call to
|
||||
directories' scopes. Each path may reference either a source directory,
|
||||
or since CMake 3.19, a binary directory. CMake must already know about
|
||||
each of these directories, either by having added them through a call to
|
||||
:command:`add_subdirectory` or it being the top level source directory.
|
||||
Relative paths are treated as relative to the current source directory.
|
||||
|
||||
|
7
Help/release/dev/binary-dir-props.rst
Normal file
7
Help/release/dev/binary-dir-props.rst
Normal file
@@ -0,0 +1,7 @@
|
||||
binary-dir-props
|
||||
----------------
|
||||
|
||||
* The :command:`set_property`, :command:`get_property`,
|
||||
and :command:`get_directory_property` commands' ``DIRECTORY``
|
||||
options now accept references to binary directory paths,
|
||||
such as the value of :variable:`CMAKE_CURRENT_BINARY_DIR`.
|
@@ -2353,13 +2353,13 @@ std::string cmGlobalGenerator::IndexGeneratorTargetUniquely(
|
||||
|
||||
void cmGlobalGenerator::IndexMakefile(cmMakefile* mf)
|
||||
{
|
||||
// FIXME: add_subdirectory supports multiple build directories
|
||||
// sharing the same source directory. We currently index only the
|
||||
// first one, because that is what FindMakefile has always returned.
|
||||
// All of its callers will need to be modified to support looking
|
||||
// up directories by build directory path.
|
||||
// We index by both source and binary directory. add_subdirectory
|
||||
// supports multiple build directories sharing the same source directory.
|
||||
// The source directory index will reference only the first time it is used.
|
||||
this->MakefileSearchIndex.insert(
|
||||
MakefileMap::value_type(mf->GetCurrentSourceDirectory(), mf));
|
||||
this->MakefileSearchIndex.insert(
|
||||
MakefileMap::value_type(mf->GetCurrentBinaryDirectory(), mf));
|
||||
}
|
||||
|
||||
void cmGlobalGenerator::IndexLocalGenerator(cmLocalGenerator* lg)
|
||||
|
@@ -113,7 +113,7 @@ bool HandleSourceFileDirectoryScopes(
|
||||
"given non-existent target for TARGET_DIRECTORY ", target_name));
|
||||
return false;
|
||||
}
|
||||
cmProp target_source_dir = target->GetProperty("SOURCE_DIR");
|
||||
cmProp target_source_dir = target->GetProperty("BINARY_DIR");
|
||||
cmMakefile* target_dir_mf =
|
||||
status.GetMakefile().GetGlobalGenerator()->FindMakefile(
|
||||
*target_source_dir);
|
||||
|
@@ -165,6 +165,34 @@ add_library(maindirtest SHARED)
|
||||
generate_file_for_set_property_test(32 maindirtest)
|
||||
generate_file_for_set_property_test(33 maindirtest)
|
||||
|
||||
# Set/get properties by binary directory path.
|
||||
add_subdirectory(SubDir SubDirA)
|
||||
get_property(dir_prop_top DIRECTORY PROPERTY dir_prop_top)
|
||||
if(NOT dir_prop_top STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirA")
|
||||
message(SEND_ERROR "dir_prop_top unexpected value after SubDirA:\n ${dir_prop_top}")
|
||||
endif()
|
||||
add_subdirectory(SubDir SubDirB)
|
||||
get_property(dir_prop_top DIRECTORY PROPERTY dir_prop_top)
|
||||
if(NOT dir_prop_top STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirB")
|
||||
message(SEND_ERROR "dir_prop_top unexpected value after SubDirB:\n ${dir_prop_top}")
|
||||
endif()
|
||||
get_property(dir_prop_subA DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SubDirA PROPERTY dir_prop_sub)
|
||||
if(NOT dir_prop_subA STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirA")
|
||||
message(SEND_ERROR "SubDirA property dir_prop_sub incorrect:\n ${dir_prop_subA}")
|
||||
endif()
|
||||
get_property(dir_prop_subB DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SubDirB PROPERTY dir_prop_sub)
|
||||
if(NOT dir_prop_subB STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirB")
|
||||
message(SEND_ERROR "SubDirB property dir_prop_sub incorrect:\n ${dir_prop_subB}")
|
||||
endif()
|
||||
get_directory_property(dir_prop_subA DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SubDirA dir_prop_sub)
|
||||
if(NOT dir_prop_subA STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirA")
|
||||
message(SEND_ERROR "SubDirA property dir_prop_sub incorrect:\n ${dir_prop_subA}")
|
||||
endif()
|
||||
get_directory_property(dir_prop_subB DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SubDirB dir_prop_sub)
|
||||
if(NOT dir_prop_subB STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirB")
|
||||
message(SEND_ERROR "SubDirB property dir_prop_sub incorrect:\n ${dir_prop_subB}")
|
||||
endif()
|
||||
|
||||
add_subdirectory(SubDir2)
|
||||
|
||||
set(src_prefix "${CMAKE_CURRENT_BINARY_DIR}/SubDir2/")
|
||||
|
2
Tests/Properties/SubDir/CMakeLists.txt
Normal file
2
Tests/Properties/SubDir/CMakeLists.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
set_property(DIRECTORY PROPERTY dir_prop_sub ${CMAKE_CURRENT_BINARY_DIR})
|
||||
set_property(DIRECTORY ${CMAKE_BINARY_DIR} PROPERTY dir_prop_top ${CMAKE_CURRENT_BINARY_DIR})
|
Reference in New Issue
Block a user