Commit 64c38577 authored by Asit Dhal's avatar Asit Dhal Committed by Brad King
Browse files

OUTPUT_DIRECTORY: Support tgt genex in output artifact vars

Following variables now support target dependent generator expressions.
- CMAKE_RUNTIME_OUTPUT_DIRECTORY
- CMAKE_LIBRARY_OUTPUT_DIRECTORY
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY

Fixes: #18055
parent 72974fe3
Pipeline #210921 waiting for manual action with stages
in 24 minutes and 54 seconds
OUTPUT_DIRECTORY
----------------
* The variables :variable:`CMAKE_RUNTIME_OUTPUT_DIRECTORY`,
:variable:`CMAKE_LIBRARY_OUTPUT_DIRECTORY`, and
:variable:`CMAKE_ARCHIVE_OUTPUT_DIRECTORY` now support target-dependent
generator expressions.
......@@ -6491,15 +6491,14 @@ bool cmGeneratorTarget::ComputeOutputDir(const std::string& config,
if (cmProp config_outdir = this->GetProperty(configProp)) {
// Use the user-specified per-configuration output directory.
out = cmGeneratorExpression::Evaluate(*config_outdir, this->LocalGenerator,
config);
config, this);
// Skip per-configuration subdirectory.
conf.clear();
} else if (cmProp outdir = this->GetProperty(propertyName)) {
// Use the user-specified output directory.
out =
cmGeneratorExpression::Evaluate(*outdir, this->LocalGenerator, config);
out = cmGeneratorExpression::Evaluate(*outdir, this->LocalGenerator,
config, this);
// Skip per-configuration subdirectory if the value contained a
// generator expression.
if (out != *outdir) {
......
enable_language(C)
if(CMAKE_IMPORT_LIBRARY_SUFFIX)
set(expect_dll 1)
else()
set(expect_dll 0)
endif()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/$<IF:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>,rtlib,rtbin>")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/$<IF:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>,sharedlib,others>")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/$<IF:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,STATIC_LIBRARY>,staticlib,others>")
add_executable(exe_tgt main.c)
add_library(shared_tgt SHARED lib.c)
add_library(static_tgt STATIC lib.c)
add_custom_target(checkDirs ALL
COMMAND ${CMAKE_COMMAND}
-Dartifact_path=${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>
-Dexe_name=$<TARGET_FILE_NAME:exe_tgt>
-Dshared_name=$<TARGET_FILE_NAME:shared_tgt>
-Dstatic_name=$<TARGET_FILE_NAME:static_tgt>
-Dexpect_dll=${expect_dll}
-P ${CMAKE_CURRENT_SOURCE_DIR}/check.cmake
)
add_dependencies(checkDirs exe_tgt shared_tgt static_tgt)
cmake_minimum_required(VERSION 3.19)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)
include(RunCMake)
function(run_cmake_and_verify_after_build case)
set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${case}-build")
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
set(RunCMake_TEST_NO_CLEAN 1)
if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
set(RunCMake_TEST_OPTIONS -DCMAKE_CONFIGURATION_TYPES=Debug)
else()
set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Debug)
endif()
run_cmake(${case})
run_cmake_command("${case}-build" ${CMAKE_COMMAND} --build .)
unset(RunCMake_TEST_NO_CLEAN)
unset(RunCMake_TEST_BINARY_DIR)
endfunction()
run_cmake_and_verify_after_build(ArtifactOutputDirs)
set(expected ${artifact_path}/rtbin/${exe_name})
if(NOT EXISTS "${expected}")
message(SEND_ERROR "executable artifact not created in the expected path:\n ${expected}")
endif()
set(expected ${artifact_path}/staticlib/${static_name})
if(NOT EXISTS "${expected}")
message(SEND_ERROR "static artifact not created in the expected path:\n ${expected}")
endif()
if(expect_dll)
set(expected ${artifact_path}/rtlib/${shared_name})
if(NOT EXISTS "${expected}")
message(SEND_ERROR "dll artifact not created in the expected path:\n ${expected}")
endif()
else()
set(expected ${artifact_path}/sharedlib/${shared_name})
if(NOT EXISTS "${expected}")
message(SEND_ERROR "shared artifact not created in the expected path:\n ${expected}")
endif()
endif()
int func(void)
{
return 0;
}
int main(void)
{
return 0;
}
......@@ -197,6 +197,9 @@ if(CMake_TEST_Qt5 AND Qt5Widgets_FOUND)
set(autogen_with_qt5 TRUE)
endif ()
add_RunCMake_test(Autogen -Dwith_qt5=${autogen_with_qt5})
add_RunCMake_test(ArtifactOutputDirs)
if(NOT DEFINED CMake_TEST_BuildDepends_GNU_AS
AND CMAKE_C_COMPILER_ID STREQUAL "GNU"
AND CMAKE_GENERATOR MATCHES "^Ninja"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment