Merge topic 'topics/FindCUDA/Multi-dir-clash'
80e279d
Make CUDA working directory unique for each target.
This commit is contained in:
commit
c26e28754c
|
@ -813,6 +813,43 @@ function(CUDA_BUILD_SHARED_LIBRARY shared_flag)
|
|||
set(${shared_flag} ${_cuda_build_shared_libs} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
##############################################################################
|
||||
# Helper to avoid clashes of files with the same basename but different paths.
|
||||
# This doesn't attempt to do exactly what CMake internals do, which is to only
|
||||
# add this path when there is a conflict, since by the time a second collision
|
||||
# in names is detected it's already too late to fix the first one. For
|
||||
# consistency sake the relative path will be added to all files.
|
||||
function(CUDA_COMPUTE_BUILD_PATH path build_path)
|
||||
#message("CUDA_COMPUTE_BUILD_PATH([${path}] ${build_path})")
|
||||
# Only deal with CMake style paths from here on out
|
||||
file(TO_CMAKE_PATH "${path}" bpath)
|
||||
if (IS_ABSOLUTE "${bpath}")
|
||||
# Absolute paths are generally unnessary, especially if something like
|
||||
# FILE(GLOB_RECURSE) is used to pick up the files.
|
||||
file(RELATIVE_PATH bpath "${CMAKE_CURRENT_SOURCE_DIR}" "${bpath}")
|
||||
endif()
|
||||
|
||||
# This recipie is from cmLocalGenerator::CreateSafeUniqueObjectFileName in the
|
||||
# CMake source.
|
||||
|
||||
# Remove leading /
|
||||
string(REGEX REPLACE "^[/]+" "" bpath "${bpath}")
|
||||
# Avoid absolute paths by removing ':'
|
||||
string(REPLACE ":" "_" bpath "${bpath}")
|
||||
# Avoid relative paths that go up the tree
|
||||
string(REPLACE "../" "__/" bpath "${bpath}")
|
||||
# Avoid spaces
|
||||
string(REPLACE " " "_" bpath "${bpath}")
|
||||
|
||||
# Strip off the filename. I wait until here to do it, since removin the
|
||||
# basename can make a path that looked like path/../basename turn into
|
||||
# path/.. (notice the trailing slash).
|
||||
get_filename_component(bpath "${bpath}" PATH)
|
||||
|
||||
set(${build_path} "${bpath}" PARENT_SCOPE)
|
||||
#message("${build_path} = ${bpath}")
|
||||
endfunction()
|
||||
|
||||
##############################################################################
|
||||
# This helper macro populates the following variables and setups up custom
|
||||
# commands and targets to invoke the nvcc compiler to generate C or PTX source
|
||||
|
@ -982,13 +1019,6 @@ macro(CUDA_WRAP_SRCS cuda_target format generated_files)
|
|||
list(APPEND nvcc_flags "-D${cuda_target}_EXPORTS")
|
||||
endif()
|
||||
|
||||
# Determine output directory
|
||||
if(CUDA_GENERATED_OUTPUT_DIR)
|
||||
set(cuda_compile_output_dir "${CUDA_GENERATED_OUTPUT_DIR}")
|
||||
else()
|
||||
set(cuda_compile_output_dir "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
endif()
|
||||
|
||||
# Reset the output variable
|
||||
set(_cuda_wrap_generated_files "")
|
||||
|
||||
|
@ -999,6 +1029,19 @@ macro(CUDA_WRAP_SRCS cuda_target format generated_files)
|
|||
get_source_file_property(_is_header ${file} HEADER_FILE_ONLY)
|
||||
if(${file} MATCHES ".*\\.cu$" AND NOT _is_header)
|
||||
|
||||
# Determine output directory
|
||||
cuda_compute_build_path("${file}" cuda_build_path)
|
||||
set(cuda_compile_intermediate_directory "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${cuda_target}.dir/${cuda_build_path}")
|
||||
if(CUDA_GENERATED_OUTPUT_DIR)
|
||||
set(cuda_compile_output_dir "${CUDA_GENERATED_OUTPUT_DIR}")
|
||||
else()
|
||||
if ( compile_to_ptx )
|
||||
set(cuda_compile_output_dir "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
else()
|
||||
set(cuda_compile_output_dir "${cuda_compile_intermediate_directory}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Add a custom target to generate a c or ptx file. ######################
|
||||
|
||||
get_filename_component( basename ${file} NAME )
|
||||
|
@ -1018,10 +1061,10 @@ macro(CUDA_WRAP_SRCS cuda_target format generated_files)
|
|||
# argument, so that the ${CMAKE_CFG_INTDIR} gets expanded at run time
|
||||
# instead of configure time.
|
||||
set(generated_file "${generated_file_path}/${generated_file_basename}")
|
||||
set(cmake_dependency_file "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${generated_file_basename}.depend")
|
||||
set(NVCC_generated_dependency_file "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${generated_file_basename}.NVCC-depend")
|
||||
set(cmake_dependency_file "${cuda_compile_intermediate_directory}/${generated_file_basename}.depend")
|
||||
set(NVCC_generated_dependency_file "${cuda_compile_intermediate_directory}/${generated_file_basename}.NVCC-depend")
|
||||
set(generated_cubin_file "${generated_file_path}/${generated_file_basename}.cubin.txt")
|
||||
set(custom_target_script "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${generated_file_basename}.cmake")
|
||||
set(custom_target_script "${cuda_compile_intermediate_directory}/${generated_file_basename}.cmake")
|
||||
|
||||
# Setup properties for obj files:
|
||||
if( NOT compile_to_ptx )
|
||||
|
@ -1101,6 +1144,7 @@ macro(CUDA_WRAP_SRCS cuda_target format generated_files)
|
|||
-D "generated_file:STRING=${generated_file}"
|
||||
-D "generated_cubin_file:STRING=${generated_cubin_file}"
|
||||
-P "${custom_target_script}"
|
||||
WORKING_DIRECTORY "${cuda_compile_intermediate_directory}"
|
||||
COMMENT "${cuda_build_comment_string}"
|
||||
)
|
||||
|
||||
|
|
Loading…
Reference in New Issue