From c2e8f9c1ebe316d7f3b2932fa1c24065fdf83d37 Mon Sep 17 00:00:00 2001 From: "Harsh Aggarwal (NVIDIA)" Date: Fri, 14 Mar 2025 17:28:51 +0530 Subject: Fix: Respect user-defined output directory settings for libraries (#6604) * Fix: Respect user-defined output directory settings for libraries Modified SlangTarget.cmake to properly respect CMAKE_LIBRARY_OUTPUT_DIRECTORY, CMAKE_RUNTIME_OUTPUT_DIRECTORY and CMAKE_ARCHIVE_OUTPUT_DIRECTORY variables when they are explicitly set by the user. This ensures libraries and executables are placed in the directories specified by the user, including handling Multi-Config generators like Visual Studio, Xcode, and Ninja Multi-Config. Fixes #5896: Shared library build output location ignores CMAKE setting * format code --------- Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com> --- cmake/SlangTarget.cmake | 83 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 4 deletions(-) (limited to 'cmake/SlangTarget.cmake') diff --git a/cmake/SlangTarget.cmake b/cmake/SlangTarget.cmake index 85d09be89..9e9407ca3 100644 --- a/cmake/SlangTarget.cmake +++ b/cmake/SlangTarget.cmake @@ -195,15 +195,90 @@ function(slang_add_target dir type) if(type STREQUAL "MODULE") set(library_subdir ${module_subdir}) endif() + + # Respect user-defined CMAKE_*_OUTPUT_DIRECTORY variables if they are set + if(DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY) + set(archive_output_dir "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}") + else() + set(archive_output_dir "${output_dir}/${archive_subdir}") + endif() + + if(DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY) + set(library_output_dir "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") + else() + set(library_output_dir "${output_dir}/${library_subdir}") + endif() + + if(DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) + set(runtime_output_dir "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") + set(pdb_output_dir "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") + else() + set(runtime_output_dir "${output_dir}/${runtime_subdir}") + set(pdb_output_dir "${output_dir}/${runtime_subdir}") + endif() + set_target_properties( ${target} PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY "${output_dir}/${archive_subdir}" - LIBRARY_OUTPUT_DIRECTORY "${output_dir}/${library_subdir}" - RUNTIME_OUTPUT_DIRECTORY "${output_dir}/${runtime_subdir}" - PDB_OUTPUT_DIRECTORY "${output_dir}/${runtime_subdir}" + ARCHIVE_OUTPUT_DIRECTORY "${archive_output_dir}" + LIBRARY_OUTPUT_DIRECTORY "${library_output_dir}" + RUNTIME_OUTPUT_DIRECTORY "${runtime_output_dir}" + PDB_OUTPUT_DIRECTORY "${pdb_output_dir}" ) + # For Multi-Config generators we also need to set per-config output directories + # if user-defined paths are provided + if(DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY) + set_target_properties( + ${target} + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY_DEBUG + "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}" + ARCHIVE_OUTPUT_DIRECTORY_RELEASE + "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}" + ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO + "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}" + ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL + "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}" + ) + endif() + + if(DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY) + set_target_properties( + ${target} + PROPERTIES + LIBRARY_OUTPUT_DIRECTORY_DEBUG + "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + LIBRARY_OUTPUT_DIRECTORY_RELEASE + "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO + "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL + "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + ) + endif() + + if(DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) + set_target_properties( + ${target} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY_DEBUG + "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + RUNTIME_OUTPUT_DIRECTORY_RELEASE + "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO + "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL + "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + PDB_OUTPUT_DIRECTORY_DEBUG "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + PDB_OUTPUT_DIRECTORY_RELEASE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + PDB_OUTPUT_DIRECTORY_RELWITHDEBINFO + "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + PDB_OUTPUT_DIRECTORY_MINSIZEREL + "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + ) + endif() + set(debug_configs "Debug,RelWithDebInfo") if(SLANG_ENABLE_RELEASE_DEBUG_INFO) set(debug_configs "Debug,RelWithDebInfo,Release") -- cgit v1.2.3