1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-17 07:11:52 +08:00

GenEx: Add POSTFIX option to $<TARGET_PDB_FILE_BASE_NAME>

Extend commit 0b055a8893 (GenEx: add POSTFIX option to
$<TARGET_FILE_BASE_NAME>, 2025-09-07) to cover PDB names too.
This commit is contained in:
Marc Chevrier
2025-09-23 15:35:32 +02:00
parent 5654207925
commit 7a154bf4fd
7 changed files with 82 additions and 31 deletions

View File

@@ -2687,24 +2687,37 @@ In the following, the phrase "the ``tgt`` filename" means the name of the
target properties and their configuration specific variants target properties and their configuration specific variants
:prop_tgt:`PDB_NAME_<CONFIG>` and :prop_tgt:`PDB_OUTPUT_DIRECTORY_<CONFIG>`. :prop_tgt:`PDB_NAME_<CONFIG>` and :prop_tgt:`PDB_OUTPUT_DIRECTORY_<CONFIG>`.
.. genex:: $<TARGET_PDB_FILE_BASE_NAME:tgt> .. genex:: $<TARGET_PDB_FILE_BASE_NAME:tgt[,POSTFIX:(INCLUDE|EXCLUDE)]>
.. versionadded:: 3.15 .. versionadded:: 3.15
Base name of the linker generated program database file (.pdb) Base name of the linker generated program database file (.pdb)
where ``tgt`` is the name of a target. where ``tgt`` is the name of a target.
.. versionadded:: 4.2
The option ``POSTFIX``, which can be used to control the inclusion or not
of the :prop_tgt:`<CONFIG>_POSTFIX` target property value as part of the
base name. The default is ``POSTFIX:INCLUDE``.
.. versionchanged:: 4.2 .. versionchanged:: 4.2
The postfix, as specified by :prop_tgt:`DEBUG_POSTFIX` or The postfix, as specified by :prop_tgt:`DEBUG_POSTFIX` or
:prop_tgt:`<CONFIG>_POSTFIX` target properties, is always included in the :prop_tgt:`<CONFIG>_POSTFIX` target properties, is always included in the
``PDB`` base name. See the policy :policy:`CMP0202`. ``PDB`` base name, except if option ``POSTFIX`` has value ``EXCLUDE``.
See the policy :policy:`CMP0202`.
The base name corresponds to the target PDB file name (see The base name corresponds to the target PDB file name (see
``$<TARGET_PDB_FILE_NAME:tgt>``) without prefix and suffix. For example, ``$<TARGET_PDB_FILE_NAME:tgt>``) without prefix and suffix, and, optionally,
if target file name is ``base.pdb``, the base name is ``base``. postfix. For example, if target file name is ``base_postfix.pdb``, the base
name is
See also the :prop_tgt:`PDB_NAME` target property, and its * ``base_postfix`` for ``$<TARGET_PDB_FILE_BASE_NAME:tgt>`` or
configuration-specific variant :prop_tgt:`PDB_NAME_<CONFIG>`. ``$<TARGET_PDB_FILE_BASE_NAME:tgt,POSTFIX:INCLUDE>``.
* ``base`` for ``$<TARGET_PDB_FILE_BASE_NAME:tgt,POSTFIX:EXCLUDE>``.
See also the :prop_tgt:`OUTPUT_NAME`, :prop_tgt:`PDB_NAME` target properties,
and their configuration-specific variants :prop_tgt:`OUTPUT_NAME_<CONFIG>`
and :prop_tgt:`PDB_NAME_<CONFIG>`, and the :prop_tgt:`<CONFIG>_POSTFIX` and
:prop_tgt:`DEBUG_POSTFIX` target properties.
Note that ``tgt`` is not added as a dependency of the target this Note that ``tgt`` is not added as a dependency of the target this
expression is evaluated on. expression is evaluated on.

View File

@@ -4,7 +4,8 @@ GenEx-TARGET_FILE_BASE_NAME-POSTFIX
* The :genex:`TARGET_FILE_BASE_NAME`, :genex:`TARGET_IMPORT_FILE_BASE_NAME`, * The :genex:`TARGET_FILE_BASE_NAME`, :genex:`TARGET_IMPORT_FILE_BASE_NAME`,
:genex:`TARGET_LINKER_FILE_BASE_NAME`, :genex:`TARGET_LINKER_FILE_BASE_NAME`,
:genex:`TARGET_LINKER_LIBRARY_FILE_BASE_NAME`, :genex:`TARGET_LINKER_LIBRARY_FILE_BASE_NAME`,
and :genex:`TARGET_LINKER_IMPORT_FILE_BASE_NAME` :genex:`TARGET_LINKER_IMPORT_FILE_BASE_NAME`, and
:genex:`TARGET_PDB_FILE_BASE_NAME`
generator expressions gained the option ``POSTFIX`` to control the inclusion generator expressions gained the option ``POSTFIX`` to control the inclusion
or not of the :prop_tgt:`<CONFIG>_POSTFIX` target property as part of the or not of the :prop_tgt:`<CONFIG>_POSTFIX` target property as part of the
base name of the target. base name of the target.

View File

@@ -4166,6 +4166,7 @@ static TargetFilesystemArtifact<ArtifactBundleContentDirTag,
// //
enum class Postfix enum class Postfix
{ {
Unspecified,
Exclude, Exclude,
Include Include
}; };
@@ -4189,7 +4190,7 @@ struct TargetOutputNameArtifactResultGetter<ArtifactNameTag>
{ {
auto output = target->GetOutputName(eval->Context.Config, auto output = target->GetOutputName(eval->Context.Config,
cmStateEnums::RuntimeBinaryArtifact); cmStateEnums::RuntimeBinaryArtifact);
return postfix == Postfix::Include return postfix != Postfix::Exclude
? cmStrCat(output, target->GetFilePostfix(eval->Context.Config)) ? cmStrCat(output, target->GetFilePostfix(eval->Context.Config))
: output; : output;
} }
@@ -4206,7 +4207,7 @@ struct TargetOutputNameArtifactResultGetter<ArtifactImportTag>
if (target->HasImportLibrary(eval->Context.Config)) { if (target->HasImportLibrary(eval->Context.Config)) {
auto output = target->GetOutputName(eval->Context.Config, auto output = target->GetOutputName(eval->Context.Config,
cmStateEnums::ImportLibraryArtifact); cmStateEnums::ImportLibraryArtifact);
return postfix == Postfix::Include return postfix != Postfix::Exclude
? cmStrCat(output, target->GetFilePostfix(eval->Context.Config)) ? cmStrCat(output, target->GetFilePostfix(eval->Context.Config))
: output; : output;
} }
@@ -4235,7 +4236,7 @@ struct TargetOutputNameArtifactResultGetter<ArtifactLinkerTag>
? cmStateEnums::ImportLibraryArtifact ? cmStateEnums::ImportLibraryArtifact
: cmStateEnums::RuntimeBinaryArtifact; : cmStateEnums::RuntimeBinaryArtifact;
auto output = target->GetOutputName(eval->Context.Config, artifact); auto output = target->GetOutputName(eval->Context.Config, artifact);
return postfix == Postfix::Include return postfix != Postfix::Exclude
? cmStrCat(output, target->GetFilePostfix(eval->Context.Config)) ? cmStrCat(output, target->GetFilePostfix(eval->Context.Config))
: output; : output;
} }
@@ -4262,7 +4263,7 @@ struct TargetOutputNameArtifactResultGetter<ArtifactLinkerLibraryTag>
target->GetType() == cmStateEnums::STATIC_LIBRARY) { target->GetType() == cmStateEnums::STATIC_LIBRARY) {
auto output = target->GetOutputName(eval->Context.Config, auto output = target->GetOutputName(eval->Context.Config,
cmStateEnums::ImportLibraryArtifact); cmStateEnums::ImportLibraryArtifact);
return postfix == Postfix::Include return postfix != Postfix::Exclude
? cmStrCat(output, target->GetFilePostfix(eval->Context.Config)) ? cmStrCat(output, target->GetFilePostfix(eval->Context.Config))
: output; : output;
} }
@@ -4289,7 +4290,7 @@ struct TargetOutputNameArtifactResultGetter<ArtifactLinkerImportTag>
if (target->HasImportLibrary(eval->Context.Config)) { if (target->HasImportLibrary(eval->Context.Config)) {
auto output = target->GetOutputName(eval->Context.Config, auto output = target->GetOutputName(eval->Context.Config,
cmStateEnums::ImportLibraryArtifact); cmStateEnums::ImportLibraryArtifact);
return postfix == Postfix::Include return postfix != Postfix::Exclude
? cmStrCat(output, target->GetFilePostfix(eval->Context.Config)) ? cmStrCat(output, target->GetFilePostfix(eval->Context.Config))
: output; : output;
} }
@@ -4303,7 +4304,7 @@ struct TargetOutputNameArtifactResultGetter<ArtifactPdbTag>
static std::string Get(cmGeneratorTarget* target, static std::string Get(cmGeneratorTarget* target,
cm::GenEx::Evaluation* eval, cm::GenEx::Evaluation* eval,
GeneratorExpressionContent const* content, GeneratorExpressionContent const* content,
Postfix /* unused */) Postfix postfix)
{ {
if (target->IsImported()) { if (target->IsImported()) {
::reportError( ::reportError(
@@ -4336,9 +4337,24 @@ struct TargetOutputNameArtifactResultGetter<ArtifactPdbTag>
auto output = target->GetPDBOutputName(eval->Context.Config); auto output = target->GetPDBOutputName(eval->Context.Config);
return target->GetPolicyStatusCMP0202() == cmPolicies::NEW if (target->GetPolicyStatusCMP0202() == cmPolicies::NEW) {
? cmStrCat(output, target->GetFilePostfix(eval->Context.Config)) return postfix != Postfix::Exclude
: output; ? cmStrCat(output, target->GetFilePostfix(eval->Context.Config))
: output;
}
if (target->GetPolicyStatusCMP0202() == cmPolicies::WARN &&
postfix != Postfix::Unspecified) {
eval->Context.LG->GetCMakeInstance()->IssueMessage(
MessageType::AUTHOR_WARNING,
cmStrCat(cmPolicies::GetPolicyWarning(cmPolicies::CMP0202), '\n',
"\"POSTFIX\" option is recognized only when the policy is "
"set to NEW. Since the policy is not set, the OLD behavior "
"will be used."),
eval->Backtrace);
}
return output;
} }
}; };
@@ -4366,7 +4382,7 @@ struct TargetFileBaseNameArtifact : public TargetArtifactBase
return std::string(); return std::string();
} }
Postfix postfix = Postfix::Include; Postfix postfix = Postfix::Unspecified;
if (parameters.size() == 2) { if (parameters.size() == 2) {
if (parameters[1] == "POSTFIX:INCLUDE") { if (parameters[1] == "POSTFIX:INCLUDE") {
postfix = Postfix::Include; postfix = Postfix::Include;
@@ -4388,14 +4404,6 @@ struct TargetFileBaseNameArtifact : public TargetArtifactBase
} }
}; };
struct TargetPdbFileBaseNameArtifact
: public TargetFileBaseNameArtifact<ArtifactPdbTag>
{
TargetPdbFileBaseNameArtifact() {} // NOLINT(modernize-use-equals-default)
int NumExpectedParameters() const override { return 1; }
};
static TargetFileBaseNameArtifact<ArtifactNameTag> const static TargetFileBaseNameArtifact<ArtifactNameTag> const
targetFileBaseNameNode; targetFileBaseNameNode;
static TargetFileBaseNameArtifact<ArtifactImportTag> const static TargetFileBaseNameArtifact<ArtifactImportTag> const
@@ -4406,7 +4414,8 @@ static TargetFileBaseNameArtifact<ArtifactLinkerLibraryTag> const
targetLinkerLibraryFileBaseNameNode; targetLinkerLibraryFileBaseNameNode;
static TargetFileBaseNameArtifact<ArtifactLinkerImportTag> const static TargetFileBaseNameArtifact<ArtifactLinkerImportTag> const
targetLinkerImportFileBaseNameNode; targetLinkerImportFileBaseNameNode;
static TargetPdbFileBaseNameArtifact const targetPdbFileBaseNameNode; static TargetFileBaseNameArtifact<ArtifactPdbTag> const
targetPdbFileBaseNameNode;
class ArtifactFilePrefixTag; class ArtifactFilePrefixTag;
class ArtifactImportFilePrefixTag; class ArtifactImportFilePrefixTag;

View File

@@ -0,0 +1,10 @@
^CMake Warning \(dev\) at CMP0202-WARN-TARGET_PDB_FILE_BASE_NAME\.cmake:[0-9]+ \(file\):
Policy CMP0202 is not set: PDB file names always include their target's
per-config POSTFIX\. Run "cmake --help-policy CMP0202" for policy details\.
Use the cmake_policy command to set the policy and suppress this warning\.
"POSTFIX" option is recognized only when the policy is set to NEW. Since
the policy is not set, the OLD behavior will be used\.
Call Stack \(most recent call first\):
CMakeLists\.txt:[0-9]+ \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.

View File

@@ -0,0 +1,11 @@
cmake_minimum_required(VERSION 4.0)
enable_language(C)
add_library(empty SHARED empty.c)
file(GENERATE
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/test.txt"
CONTENT "[$<TARGET_PDB_FILE_BASE_NAME:empty,POSTFIX:INCLUDE>]"
)

View File

@@ -41,6 +41,7 @@ if(LINKER_SUPPORTS_PDB)
run_cmake(ValidTarget-TARGET_PDB_FILE) run_cmake(ValidTarget-TARGET_PDB_FILE)
run_cmake(NonValidTarget-TARGET_PDB_FILE_BASE_NAME) run_cmake(NonValidTarget-TARGET_PDB_FILE_BASE_NAME)
run_cmake(ValidTarget-TARGET_PDB_FILE_BASE_NAME) run_cmake(ValidTarget-TARGET_PDB_FILE_BASE_NAME)
run_cmake(CMP0202-WARN-TARGET_PDB_FILE_BASE_NAME)
else() else()
run_cmake(NonValidCompiler-TARGET_PDB_FILE) run_cmake(NonValidCompiler-TARGET_PDB_FILE)
run_cmake(NonValidCompiler-TARGET_PDB_FILE_BASE_NAME) run_cmake(NonValidCompiler-TARGET_PDB_FILE_BASE_NAME)

View File

@@ -117,23 +117,23 @@ string (APPEND GENERATE_CONTENT [[
check_value ("TARGET_FILE_BASE_NAME executable all properties + postfix" "$<TARGET_FILE_BASE_NAME:exec4>" "exec4_runtime_postfix") check_value ("TARGET_FILE_BASE_NAME executable all properties + postfix" "$<TARGET_FILE_BASE_NAME:exec4>" "exec4_runtime_postfix")
check_value ("TARGET_FILE_BASE_NAME executable all properties + postfix" "$<TARGET_FILE_BASE_NAME:exec4,POSTFIX:INCLUDE>" "exec4_runtime_postfix") check_value ("TARGET_FILE_BASE_NAME executable all properties + postfix" "$<TARGET_FILE_BASE_NAME:exec4,POSTFIX:INCLUDE>" "exec4_runtime_postfix")
check_value ("TARGET_FILE_BASE_NAME executable all properties without postfix" "$<TARGET_FILE_BASE_NAME:exec4,POSTFIX:EXCLUDE>" "exec4_runtime") check_value ("TARGET_FILE_BASE_NAME executable all properties + postfix (excluded)" "$<TARGET_FILE_BASE_NAME:exec4,POSTFIX:EXCLUDE>" "exec4_runtime")
check_value ("TARGET_FILE_BASE_NAME shared all properties + postfix" "$<TARGET_FILE_BASE_NAME:shared4>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_runtime,shared4_library>_postfix") check_value ("TARGET_FILE_BASE_NAME shared all properties + postfix" "$<TARGET_FILE_BASE_NAME:shared4>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_runtime,shared4_library>_postfix")
check_value ("TARGET_FILE_BASE_NAME shared all properties + postfix" "$<TARGET_FILE_BASE_NAME:shared4,POSTFIX:INCLUDE>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_runtime,shared4_library>_postfix") check_value ("TARGET_FILE_BASE_NAME shared all properties + postfix" "$<TARGET_FILE_BASE_NAME:shared4,POSTFIX:INCLUDE>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_runtime,shared4_library>_postfix")
check_value ("TARGET_FILE_BASE_NAME shared all properties without postfix" "$<TARGET_FILE_BASE_NAME:shared4,POSTFIX:EXCLUDE>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_runtime,shared4_library>") check_value ("TARGET_FILE_BASE_NAME shared all properties + postfix (excluded)" "$<TARGET_FILE_BASE_NAME:shared4,POSTFIX:EXCLUDE>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_runtime,shared4_library>")
check_value ("TARGET_LINKER_FILE_BASE_NAME shared linker all properties + postfix" "$<TARGET_LINKER_FILE_BASE_NAME:shared4>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_archive,shared4_library>_postfix") check_value ("TARGET_LINKER_FILE_BASE_NAME shared linker all properties + postfix" "$<TARGET_LINKER_FILE_BASE_NAME:shared4>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_archive,shared4_library>_postfix")
check_value ("TARGET_LINKER_FILE_BASE_NAME shared linker all properties + postfix" "$<TARGET_LINKER_FILE_BASE_NAME:shared4,POSTFIX:INCLUDE>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_archive,shared4_library>_postfix") check_value ("TARGET_LINKER_FILE_BASE_NAME shared linker all properties + postfix" "$<TARGET_LINKER_FILE_BASE_NAME:shared4,POSTFIX:INCLUDE>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_archive,shared4_library>_postfix")
check_value ("TARGET_LINKER_FILE_BASE_NAME shared linker all properties without postfix" "$<TARGET_LINKER_FILE_BASE_NAME:shared4,POSTFIX:EXCLUDE>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_archive,shared4_library>") check_value ("TARGET_LINKER_FILE_BASE_NAME shared linker all properties + postfix (excluded)" "$<TARGET_LINKER_FILE_BASE_NAME:shared4,POSTFIX:EXCLUDE>" "$<IF:$<IN_LIST:$<PLATFORM_ID>,Windows$<SEMICOLON>CYGWIN$<SEMICOLON>MSYS>,shared4_archive,shared4_library>")
check_value ("TARGET_FILE_BASE_NAME static all properties + postfix" "$<TARGET_FILE_BASE_NAME:static4>" "static4_archive_postfix") check_value ("TARGET_FILE_BASE_NAME static all properties + postfix" "$<TARGET_FILE_BASE_NAME:static4>" "static4_archive_postfix")
check_value ("TARGET_FILE_BASE_NAME static all properties + postfix" "$<TARGET_FILE_BASE_NAME:static4,POSTFIX:INCLUDE>" "static4_archive_postfix") check_value ("TARGET_FILE_BASE_NAME static all properties + postfix" "$<TARGET_FILE_BASE_NAME:static4,POSTFIX:INCLUDE>" "static4_archive_postfix")
check_value ("TARGET_FILE_BASE_NAME static all properties without postfix" "$<TARGET_FILE_BASE_NAME:static4,POSTFIX:EXCLUDE>" "static4_archive") check_value ("TARGET_FILE_BASE_NAME static all properties + postfix (excluded)" "$<TARGET_FILE_BASE_NAME:static4,POSTFIX:EXCLUDE>" "static4_archive")
check_value ("TARGET_LINKER_FILE_BASE_NAME static linker all properties + postfix" "$<TARGET_LINKER_FILE_BASE_NAME:static4>" "static4_archive_postfix") check_value ("TARGET_LINKER_FILE_BASE_NAME static linker all properties + postfix" "$<TARGET_LINKER_FILE_BASE_NAME:static4>" "static4_archive_postfix")
check_value ("TARGET_LINKER_FILE_BASE_NAME static linker all properties + postfix" "$<TARGET_LINKER_FILE_BASE_NAME:static4,POSTFIX:INCLUDE>" "static4_archive_postfix") check_value ("TARGET_LINKER_FILE_BASE_NAME static linker all properties + postfix" "$<TARGET_LINKER_FILE_BASE_NAME:static4,POSTFIX:INCLUDE>" "static4_archive_postfix")
check_value ("TARGET_LINKER_FILE_BASE_NAME static linker all properties without postfix" "$<TARGET_LINKER_FILE_BASE_NAME:static4,POSTFIX:EXCLUDE>" "static4_archive") check_value ("TARGET_LINKER_FILE_BASE_NAME static linker all properties + postfix (excluded)" "$<TARGET_LINKER_FILE_BASE_NAME:static4,POSTFIX:EXCLUDE>" "static4_archive")
]]) ]])
if (CMAKE_C_LINKER_SUPPORTS_PDB) if (CMAKE_C_LINKER_SUPPORTS_PDB)
string (APPEND GENERATE_CONTENT [[ string (APPEND GENERATE_CONTENT [[
@@ -158,6 +158,12 @@ if (CMAKE_C_LINKER_SUPPORTS_PDB)
string (APPEND GENERATE_CONTENT [[ string (APPEND GENERATE_CONTENT [[
check_value ("TARGET_PDB_FILE_BASE_NAME executable PDB all properties + postfix" "$<TARGET_PDB_FILE_BASE_NAME:exec5>" "exec5_pdb_postfix") check_value ("TARGET_PDB_FILE_BASE_NAME executable PDB all properties + postfix" "$<TARGET_PDB_FILE_BASE_NAME:exec5>" "exec5_pdb_postfix")
check_value ("TARGET_PDB_FILE_BASE_NAME shared PDB all properties + postfix" "$<TARGET_PDB_FILE_BASE_NAME:shared5>" "shared5_pdb_postfix") check_value ("TARGET_PDB_FILE_BASE_NAME shared PDB all properties + postfix" "$<TARGET_PDB_FILE_BASE_NAME:shared5>" "shared5_pdb_postfix")
check_value ("TARGET_PDB_FILE_BASE_NAME executable PDB all properties + postfix" "$<TARGET_PDB_FILE_BASE_NAME:exec5,POSTFIX:INCLUDE>" "exec5_pdb_postfix")
check_value ("TARGET_PDB_FILE_BASE_NAME shared PDB all properties + postfix" "$<TARGET_PDB_FILE_BASE_NAME:shared5,POSTFIX:INCLUDE>" "shared5_pdb_postfix")
check_value ("TARGET_PDB_FILE_BASE_NAME executable PDB all properties + postfix (excluded)" "$<TARGET_PDB_FILE_BASE_NAME:exec5,POSTFIX:EXCLUDE>" "exec5_pdb")
check_value ("TARGET_PDB_FILE_BASE_NAME shared PDB all properties + postfix (excluded)" "$<TARGET_PDB_FILE_BASE_NAME:shared5,POSTFIX:EXCLUDE>" "shared5_pdb")
]]) ]])
endif() endif()