1
0
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:
Brad King
2020-09-22 12:57:50 -04:00
parent 0cb7216b9f
commit f2daa025e3
8 changed files with 64 additions and 15 deletions

View File

@@ -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,

View File

@@ -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

View File

@@ -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.

View 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`.

View File

@@ -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)

View File

@@ -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);

View File

@@ -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/")

View 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})