[libclc] [libclc] Fix cross in-tree builds (PR #97392)
Harald van Dijk via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 2 00:43:35 PDT 2024
https://github.com/hvdijk created https://github.com/llvm/llvm-project/pull/97392
When performing cross in-tree builds, we need native versions of various tools, we cannot assume the cross builds that are part of the current build are executable. LLVM provides the setup_host_tool function to handle this, either picking up versions of tools from LLVM_NATIVE_TOOL_DIR, or implicitly building native versions as needed. Use it for libclc too.
LLVM's setup_host_tool function assumes the project is LLVM, so this also needs libclc's project() to be conditional on it being built standalone. Luckily, the only change this needs is using CMAKE_CURRENT_SOURCE_DIR instead of PROJECT_SOURCE_DIR.
>From 273d5c86afd1418565d563825f38d6ec340ee00f Mon Sep 17 00:00:00 2001
From: Harald van Dijk <harald.vandijk at codeplay.com>
Date: Fri, 28 Jun 2024 13:41:16 +0100
Subject: [PATCH 1/2] [libclc][NFC] Do not set project in in-tree builds.
This is NFC at the moment because nothing relies on ${PROJECT_*} being
set to the LLVM values.
---
libclc/CMakeLists.txt | 24 +++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index ef8d21b167623..42a1fe46ea9ac 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -1,11 +1,13 @@
cmake_minimum_required(VERSION 3.20.0)
-project( libclc VERSION 0.2.0 LANGUAGES CXX C)
+if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
+ project(libclc VERSION 0.2.0 LANGUAGES CXX C)
+endif()
set(CMAKE_CXX_STANDARD 17)
# Add path for custom modules
-list( INSERT CMAKE_MODULE_PATH 0 "${PROJECT_SOURCE_DIR}/cmake/modules" )
+list( INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" )
set( LIBCLC_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} )
set( LIBCLC_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} )
@@ -211,7 +213,7 @@ if( ENABLE_RUNTIME_SUBNORMAL )
foreach( file IN ITEMS subnormal_use_default subnormal_disable )
link_bc(
TARGET ${file}
- INPUTS ${PROJECT_SOURCE_DIR}/generic/lib/${file}.ll
+ INPUTS ${CMAKE_CURRENT_SOURCE_DIR}/generic/lib/${file}.ll
)
install( FILES $<TARGET_PROPERTY:${file},TARGET_FILE> ARCHIVE
DESTINATION "${CMAKE_INSTALL_DATADIR}/clc" )
@@ -219,7 +221,7 @@ if( ENABLE_RUNTIME_SUBNORMAL )
endif()
find_package( Python3 REQUIRED COMPONENTS Interpreter )
-file( TO_CMAKE_PATH ${PROJECT_SOURCE_DIR}/generic/lib/gen_convert.py script_loc )
+file( TO_CMAKE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/generic/lib/gen_convert.py script_loc )
add_custom_command(
OUTPUT convert.cl
COMMAND ${Python3_EXECUTABLE} ${script_loc} > convert.cl
@@ -264,7 +266,7 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
foreach( l ${dirs} ${DARCH} ${DARCH}-${OS} ${DARCH}-${VENDOR}-${OS} )
foreach( s "SOURCES" "SOURCES_${LLVM_MAJOR}.${LLVM_MINOR}" )
file( TO_CMAKE_PATH ${l}/lib/${s} file_loc )
- file( TO_CMAKE_PATH ${PROJECT_SOURCE_DIR}/${file_loc} loc )
+ file( TO_CMAKE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${file_loc} loc )
# Prepend the location to give higher priority to
# specialized implementation
if( EXISTS ${loc} )
@@ -339,7 +341,7 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
list( APPEND build_flags
-D__CLC_INTERNAL
-D${CLC_TARGET_DEFINE}
- -I${PROJECT_SOURCE_DIR}/generic/include
+ -I${CMAKE_CURRENT_SOURCE_DIR}/generic/include
# FIXME: Fix libclc to not require disabling this noisy warning
-Wno-bitwise-conditional-parentheses
)
@@ -360,9 +362,9 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
# the path (e.g., ironing out any ".."), then make it relative to the
# root directory again, and use that relative path component for the
# binary path.
- get_filename_component( abs_path ${file} ABSOLUTE BASE_DIR ${PROJECT_SOURCE_DIR} )
- file( RELATIVE_PATH root_rel_path ${PROJECT_SOURCE_DIR} ${abs_path} )
- set( input_file ${PROJECT_SOURCE_DIR}/${file} )
+ get_filename_component( abs_path ${file} ABSOLUTE BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR} )
+ file( RELATIVE_PATH root_rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${abs_path} )
+ set( input_file ${CMAKE_CURRENT_SOURCE_DIR}/${file} )
set( output_file "${LIBCLC_ARCH_OBJFILE_DIR}/${root_rel_path}.bc" )
endif()
@@ -373,7 +375,7 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
INPUT ${input_file}
OUTPUT ${output_file}
EXTRA_OPTS "${mcpu}" -fno-builtin -nostdlib
- "${build_flags}" -I${PROJECT_SOURCE_DIR}/${file_dir}
+ "${build_flags}" -I${CMAKE_CURRENT_SOURCE_DIR}/${file_dir}
DEPENDENCIES generate_convert.cl clspv-generate_convert.cl
)
list( APPEND bytecode_files ${output_file} )
@@ -431,7 +433,7 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
if( NOT clang_triple MATCHES ".*ptx.*--$" )
add_test( NAME external-calls-${obj_suffix}
COMMAND ./check_external_calls.sh ${CMAKE_CURRENT_BINARY_DIR}/${obj_suffix} ${LLVM_TOOLS_BINARY_DIR}
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} )
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
endif()
install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${obj_suffix} DESTINATION "${CMAKE_INSTALL_DATADIR}/clc" )
>From f3612cd69beef57e109e0a91e22bcce7ac859b70 Mon Sep 17 00:00:00 2001
From: Harald van Dijk <harald.vandijk at codeplay.com>
Date: Fri, 28 Jun 2024 19:42:18 +0100
Subject: [PATCH 2/2] [libclc] Fix cross in-tree builds.
When performing cross in-tree builds, we need native versions of various
tools, we cannot assume the cross builds that are part of the current
build are executable. LLVM provides the setup_host_tool macro to handle
this, either picking up versions of tools from LLVM_NATIVE_TOOL_DIR, or
implicitly building native versions as needed. Use it for libclc too.
---
libclc/CMakeLists.txt | 31 +++++++++++++++-------------
libclc/cmake/modules/AddLibclc.cmake | 16 +++++++-------
2 files changed, 25 insertions(+), 22 deletions(-)
diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index 42a1fe46ea9ac..4f5625ff94916 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -51,12 +51,12 @@ if( LIBCLC_STANDALONE_BUILD OR CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DI
message( FATAL_ERROR "libclc needs at least LLVM ${LIBCLC_MIN_LLVM}" )
endif()
- # Import required tools as targets
+ # Import required tools
if( NOT EXISTS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} )
foreach( tool IN ITEMS clang llvm-as llvm-link opt )
find_program( LLVM_TOOL_${tool} ${tool} PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )
- add_executable( libclc::${tool} IMPORTED GLOBAL )
- set_target_properties( libclc::${tool} PROPERTIES IMPORTED_LOCATION ${LLVM_TOOL_${tool}} )
+ set( ${tool}_exe ${LLVM_TOOL_${tool}} )
+ set( ${tool}_target )
endforeach()
endif()
else()
@@ -73,9 +73,10 @@ else()
endif()
if( NOT EXISTS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} )
- foreach( tool IN ITEMS clang llvm-as llvm-link opt )
- add_executable(libclc::${tool} ALIAS ${tool})
- endforeach()
+ setup_host_tool( clang CLANG clang_exe clang_target )
+ setup_host_tool( llvm-as LLVM_AS llvm-as_exe llvm-as_target )
+ setup_host_tool( llvm-link LLVM_LINK llvm-link_exe llvm-link_target )
+ setup_host_tool( opt OPT opt_exe opt_target )
endif()
endif()
@@ -90,14 +91,13 @@ if( EXISTS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} )
foreach( tool IN ITEMS clang llvm-as llvm-link opt )
find_program( LLVM_CUSTOM_TOOL_${tool} ${tool}
PATHS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )
- add_executable( libclc::${tool} IMPORTED GLOBAL )
- set_target_properties( libclc::${tool} PROPERTIES
- IMPORTED_LOCATION ${LLVM_CUSTOM_TOOL_${tool}} )
+ set( ${tool}_exe ${LLVM_CUSTOM_TOOL_${tool}} )
+ set( ${tool}_target )
endforeach()
endif()
foreach( tool IN ITEMS clang opt llvm-as llvm-link )
- if( NOT TARGET libclc::${tool} )
+ if( NOT EXISTS "${${tool}_exe}" AND NOT TARGET "${${tool}_target}" )
message( FATAL_ERROR "libclc toolchain incomplete - missing tool ${tool}!" )
endif()
endforeach()
@@ -167,8 +167,11 @@ set(LLVM_LINK_COMPONENTS
)
if( LIBCLC_STANDALONE_BUILD )
add_llvm_executable( prepare_builtins utils/prepare-builtins.cpp )
+ set( prepare_builtins_exe prepare_builtins )
+ set( prepare_builtins_target prepare_builtins )
else()
add_llvm_utility( prepare_builtins utils/prepare-builtins.cpp )
+ setup_host_tool( prepare_builtins PREPARE_BUILTINS prepare_builtins_exe prepare_builtins_target )
endif()
target_compile_definitions( prepare_builtins PRIVATE ${LLVM_VERSION_DEFINE} )
# These were not properly reported in early LLVM and we don't need them
@@ -409,9 +412,9 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
# Add opt target
add_custom_command( OUTPUT ${builtins_opt_lib_tgt}.bc
- COMMAND libclc::opt ${opt_flags} -o ${builtins_opt_lib_tgt}.bc
+ COMMAND ${opt_exe} ${opt_flags} -o ${builtins_opt_lib_tgt}.bc
${builtins_link_lib}
- DEPENDS libclc::opt ${builtins_link_lib} ${builtins_link_lib_tgt}
+ DEPENDS ${opt_target} ${builtins_link_lib} ${builtins_link_lib_tgt}
)
add_custom_target( ${builtins_opt_lib_tgt}
ALL DEPENDS ${builtins_opt_lib_tgt}.bc
@@ -425,8 +428,8 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
# Add prepare target
set( obj_suffix ${arch_suffix}.bc )
add_custom_command( OUTPUT ${obj_suffix}
- COMMAND prepare_builtins -o ${obj_suffix} ${builtins_opt_lib}
- DEPENDS ${builtins_opt_lib} ${builtins_opt_lib_tgt} prepare_builtins )
+ COMMAND ${prepare_builtins_exe} -o ${obj_suffix} ${builtins_opt_lib}
+ DEPENDS ${builtins_opt_lib} ${builtins_opt_lib_tgt} ${prepare_builtins_target} )
add_custom_target( prepare-${obj_suffix} ALL DEPENDS ${obj_suffix} )
# nvptx-- targets don't include workitem builtins
diff --git a/libclc/cmake/modules/AddLibclc.cmake b/libclc/cmake/modules/AddLibclc.cmake
index ea97e504364ba..68b33ede6c369 100644
--- a/libclc/cmake/modules/AddLibclc.cmake
+++ b/libclc/cmake/modules/AddLibclc.cmake
@@ -12,8 +12,8 @@
# * DEPENDENCIES <string> ...
# List of extra dependencies to inject
#
-# Depends on the libclc::clang and libclc::llvm-as targets for compiling and
-# assembling, respectively.
+# Depends on the clang, llvm-as, and llvm-link targets for compiling,
+# assembling, and linking, respectively.
function(compile_to_bc)
cmake_parse_arguments(ARG
""
@@ -45,7 +45,7 @@ function(compile_to_bc)
add_custom_command(
OUTPUT ${ARG_OUTPUT}${TMP_SUFFIX}
- COMMAND libclc::clang
+ COMMAND ${clang_exe}
${TARGET_ARG}
${PP_OPTS}
${ARG_EXTRA_OPTS}
@@ -58,7 +58,7 @@ function(compile_to_bc)
-x cl
${ARG_INPUT}
DEPENDS
- libclc::clang
+ ${clang_target}
${ARG_INPUT}
${ARG_DEPENDENCIES}
DEPFILE ${ARG_OUTPUT}.d
@@ -67,8 +67,8 @@ function(compile_to_bc)
if( ${FILE_EXT} STREQUAL ".ll" )
add_custom_command(
OUTPUT ${ARG_OUTPUT}
- COMMAND libclc::llvm-as -o ${ARG_OUTPUT} ${ARG_OUTPUT}${TMP_SUFFIX}
- DEPENDS libclc::llvm-as ${ARG_OUTPUT}${TMP_SUFFIX}
+ COMMAND ${llvm-as_exe} -o ${ARG_OUTPUT} ${ARG_OUTPUT}${TMP_SUFFIX}
+ DEPENDS ${llvm-as_target} ${ARG_OUTPUT}${TMP_SUFFIX}
)
endif()
endfunction()
@@ -107,8 +107,8 @@ function(link_bc)
add_custom_command(
OUTPUT ${ARG_TARGET}.bc
- COMMAND libclc::llvm-link -o ${ARG_TARGET}.bc ${LINK_INPUT_ARG}
- DEPENDS libclc::llvm-link ${ARG_DEPENDENCIES} ${ARG_INPUTS} ${RSP_FILE}
+ COMMAND ${llvm-link_exe} -o ${ARG_TARGET}.bc ${LINK_INPUT_ARG}
+ DEPENDS ${llvm-link_target} ${ARG_DEPENDENCIES} ${ARG_INPUTS} ${RSP_FILE}
)
add_custom_target( ${ARG_TARGET} ALL DEPENDS ${ARG_TARGET}.bc )
More information about the cfe-commits
mailing list