From 4c0d9afc24aa817eeb1e2645fc8a464a9bcc4320 Mon Sep 17 00:00:00 2001 From: Josiah Bills Date: Wed, 11 Dec 2024 01:09:57 -0500 Subject: [PATCH] Fix output directory on Multi-Config Generators (#568) * CMake doesn't automatically append the config type to the output dir when using a custom command. --- cmake/Corrosion.cmake | 11 ++++++++-- test/output directory/CMakeLists.txt | 20 +++++++++++++------ .../output directory/CMakeLists.txt | 2 +- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/cmake/Corrosion.cmake b/cmake/Corrosion.cmake index 628cc239..e28b31bd 100644 --- a/cmake/Corrosion.cmake +++ b/cmake/Corrosion.cmake @@ -100,7 +100,14 @@ function(_corrosion_set_imported_location_deferred target_name base_property out if(output_dir_curr_config) set(curr_out_dir "${output_dir_curr_config}") elseif(output_directory) - set(curr_out_dir "${output_directory}") + string(GENEX_STRIP "${output_directory}" output_dir_no_genex) + # Only add config dir if there is no genex in here. See + # https://cmake.org/cmake/help/latest/prop_tgt/RUNTIME_OUTPUT_DIRECTORY.html + if(output_directory STREQUAL output_dir_no_genex) + set(curr_out_dir "${output_directory}/${config_type}") + else() + set(curr_out_dir "${output_directory}") + endif() else() set(curr_out_dir "${CMAKE_CURRENT_BINARY_DIR}") endif() @@ -207,7 +214,7 @@ function(_corrosion_copy_byproduct_deferred target_name output_dir_prop_names ca # Fallback to `output_dir` if specified # Note: Multi-configuration generators append a per-configuration subdirectory to the # specified directory unless a generator expression is used (from CMake documentation). - set(curr_out_dir "${output_dir}") + set(curr_out_dir "${output_dir}/${config_type}") else() # Fallback to the default directory. We do not append the configuration directory here # and instead let CMake do this, since otherwise the resolving of dynamic library diff --git a/test/output directory/CMakeLists.txt b/test/output directory/CMakeLists.txt index 0f5cf723..997311e8 100644 --- a/test/output directory/CMakeLists.txt +++ b/test/output directory/CMakeLists.txt @@ -40,6 +40,14 @@ if(CORROSION_TESTS_INSTALL_CORROSION) set_tests_properties("output_directory_build" PROPERTIES FIXTURES_REQUIRED "fixture_corrosion_install") endif() +get_cmake_property(IS_MULTI_CONFIG GENERATOR_IS_MULTI_CONFIG) + +if (IS_MULTI_CONFIG) + set(config_path_str "$/") +else() + set(config_path_str "") +endif() + foreach(output_approach targetprop var targetprop_pdb_fallback) if(output_approach STREQUAL "targetprop") set(rust_proj_suffix "1") @@ -57,7 +65,7 @@ foreach(output_approach targetprop var targetprop_pdb_fallback) COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/build/custom_bin_${output_approach}/${bin_name}" + "${CMAKE_CURRENT_BINARY_DIR}/build/custom_bin_${output_approach}/${config_path_str}${bin_name}" ) set_tests_properties("output_directory_bin_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory") @@ -69,7 +77,7 @@ foreach(output_approach targetprop var targetprop_pdb_fallback) COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/build/custom_archive_${output_approach}/${static_lib_name}" + "${CMAKE_CURRENT_BINARY_DIR}/build/custom_archive_${output_approach}/${config_path_str}${static_lib_name}" ) set_tests_properties("output_directory_staticlib_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory") @@ -85,7 +93,7 @@ foreach(output_approach targetprop var targetprop_pdb_fallback) COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/build/custom_lib_${output_approach}/${dynamic_lib_name}" + "${CMAKE_CURRENT_BINARY_DIR}/build/custom_lib_${output_approach}/${config_path_str}${dynamic_lib_name}" ) set_tests_properties("output_directory_cdylib_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory") @@ -98,7 +106,7 @@ foreach(output_approach targetprop var targetprop_pdb_fallback) -P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake" # Implib is an ARCHIVE artifact, see: # https://cmake.org/cmake/help/v3.25/manual/cmake-buildsystem.7.html#archive-output-artifacts - "${CMAKE_CURRENT_BINARY_DIR}/build/custom_archive_${output_approach}/${implib_name}" + "${CMAKE_CURRENT_BINARY_DIR}/build/custom_archive_${output_approach}/${config_path_str}${implib_name}" ) set_tests_properties("output_directory_implib_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory") @@ -123,7 +131,7 @@ foreach(output_approach targetprop var targetprop_pdb_fallback) COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/build/${expected_lib_pdb_path}/${lib_pdb_name}" + "${CMAKE_CURRENT_BINARY_DIR}/build/${expected_lib_pdb_path}/${config_path_str}${lib_pdb_name}" ) set_tests_properties("output_directory_cdylib_pdb_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory") @@ -132,7 +140,7 @@ foreach(output_approach targetprop var targetprop_pdb_fallback) COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/build/${expected_bin_pdb_path}/${bin_pdb_name}" + "${CMAKE_CURRENT_BINARY_DIR}/build/${expected_bin_pdb_path}/${config_path_str}${bin_pdb_name}" ) set_tests_properties("output_directory_bin_pdb_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory") endif() diff --git a/test/output directory/output directory/CMakeLists.txt b/test/output directory/output directory/CMakeLists.txt index 9fbe6415..e0d29a3d 100644 --- a/test/output directory/output directory/CMakeLists.txt +++ b/test/output directory/output directory/CMakeLists.txt @@ -22,7 +22,7 @@ add_custom_command(TARGET cargo-build_rust_bin1 POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/another_dir" COMMAND - ${CMAKE_COMMAND} -E copy_if_different "$" "${CMAKE_CURRENT_BINARY_DIR}/another_dir/moved_bin" + ${CMAKE_COMMAND} -E copy_if_different "$>" "${CMAKE_CURRENT_BINARY_DIR}/another_dir/moved_bin" ) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/custom_bin_var")