1
1
cmake_minimum_required (VERSION 3.20.0 )
2
2
3
- project ( libclc VERSION 0.2.0 LANGUAGES CXX C )
3
+ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
4
+ project (libclc VERSION 0.2.0 LANGUAGES CXX C )
5
+ endif ()
4
6
5
7
set (CMAKE_CXX_STANDARD 17 )
6
8
7
9
# Add path for custom modules
8
- list ( INSERT CMAKE_MODULE_PATH 0 "${PROJECT_SOURCE_DIR } /cmake/modules" )
10
+ list ( INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR } /cmake/modules" )
9
11
10
12
set ( LIBCLC_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} )
11
13
set ( LIBCLC_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} )
@@ -49,12 +51,12 @@ if( LIBCLC_STANDALONE_BUILD OR CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DI
49
51
message ( FATAL_ERROR "libclc needs at least LLVM ${LIBCLC_MIN_LLVM} " )
50
52
endif ()
51
53
52
- # Import required tools as targets
54
+ # Import required tools
53
55
if ( NOT EXISTS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} )
54
56
foreach ( tool IN ITEMS clang llvm-as llvm-link opt )
55
57
find_program ( LLVM_TOOL_${tool} ${tool} PATHS ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )
56
- add_executable ( libclc:: ${tool} IMPORTED GLOBAL )
57
- set_target_properties ( libclc:: ${tool} PROPERTIES IMPORTED_LOCATION ${LLVM_TOOL_${tool}} )
58
+ set ( ${tool} _exe ${LLVM_TOOL_${tool}} )
59
+ set ( ${tool} _target )
58
60
endforeach ()
59
61
endif ()
60
62
else ()
@@ -71,9 +73,10 @@ else()
71
73
endif ()
72
74
73
75
if ( NOT EXISTS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} )
74
- foreach ( tool IN ITEMS clang llvm-as llvm-link opt )
75
- add_executable (libclc::${tool} ALIAS ${tool} )
76
- endforeach ()
76
+ setup_host_tool ( clang CLANG clang_exe clang_target )
77
+ setup_host_tool ( llvm-as LLVM_AS llvm-as_exe llvm-as_target )
78
+ setup_host_tool ( llvm-link LLVM_LINK llvm-link_exe llvm-link_target )
79
+ setup_host_tool ( opt OPT opt_exe opt_target )
77
80
endif ()
78
81
endif ()
79
82
@@ -88,14 +91,13 @@ if( EXISTS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} )
88
91
foreach ( tool IN ITEMS clang llvm-as llvm-link opt )
89
92
find_program ( LLVM_CUSTOM_TOOL_${tool} ${tool}
90
93
PATHS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )
91
- add_executable ( libclc::${tool} IMPORTED GLOBAL )
92
- set_target_properties ( libclc::${tool} PROPERTIES
93
- IMPORTED_LOCATION ${LLVM_CUSTOM_TOOL_${tool}} )
94
+ set ( ${tool} _exe ${LLVM_CUSTOM_TOOL_${tool}} )
95
+ set ( ${tool} _target )
94
96
endforeach ()
95
97
endif ()
96
98
97
99
foreach ( tool IN ITEMS clang opt llvm-as llvm-link )
98
- if ( NOT TARGET libclc::${ tool} )
100
+ if ( NOT EXISTS "${ ${tool} _exe}" AND NOT TARGET "${ ${ tool}_target}" )
99
101
message ( FATAL_ERROR "libclc toolchain incomplete - missing tool ${tool} !" )
100
102
endif ()
101
103
endforeach ()
@@ -165,8 +167,11 @@ set(LLVM_LINK_COMPONENTS
165
167
)
166
168
if ( LIBCLC_STANDALONE_BUILD )
167
169
add_llvm_executable ( prepare_builtins utils/prepare-builtins.cpp )
170
+ set ( prepare_builtins_exe prepare_builtins )
171
+ set ( prepare_builtins_target prepare_builtins )
168
172
else ()
169
173
add_llvm_utility ( prepare_builtins utils/prepare-builtins.cpp )
174
+ setup_host_tool ( prepare_builtins PREPARE_BUILTINS prepare_builtins_exe prepare_builtins_target )
170
175
endif ()
171
176
target_compile_definitions ( prepare_builtins PRIVATE ${LLVM_VERSION_DEFINE} )
172
177
# These were not properly reported in early LLVM and we don't need them
@@ -211,15 +216,15 @@ if( ENABLE_RUNTIME_SUBNORMAL )
211
216
foreach ( file IN ITEMS subnormal_use_default subnormal_disable )
212
217
link_bc (
213
218
TARGET ${file}
214
- INPUTS ${PROJECT_SOURCE_DIR } /generic/lib/${file}.ll
219
+ INPUTS ${CMAKE_CURRENT_SOURCE_DIR } /generic/lib/${file}.ll
215
220
)
216
221
install ( FILES $< TARGET_PROPERTY:${file} ,TARGET_FILE> ARCHIVE
217
222
DESTINATION "${CMAKE_INSTALL_DATADIR} /clc" )
218
223
endforeach ()
219
224
endif ()
220
225
221
226
find_package ( Python3 REQUIRED COMPONENTS Interpreter )
222
- file ( TO_CMAKE_PATH ${PROJECT_SOURCE_DIR } /generic/lib/gen_convert.py script_loc )
227
+ file ( TO_CMAKE_PATH ${CMAKE_CURRENT_SOURCE_DIR } /generic/lib/gen_convert.py script_loc )
223
228
add_custom_command (
224
229
OUTPUT convert.cl
225
230
COMMAND ${Python3_EXECUTABLE} ${script_loc} > convert.cl
@@ -264,7 +269,7 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
264
269
foreach ( l ${dirs} ${DARCH} ${DARCH} -${OS} ${DARCH} -${VENDOR}-${OS} )
265
270
foreach ( s "SOURCES" "SOURCES_${LLVM_MAJOR} .${LLVM_MINOR} " )
266
271
file ( TO_CMAKE_PATH ${l} /lib/${s} file_loc )
267
- file ( TO_CMAKE_PATH ${PROJECT_SOURCE_DIR } /${file_loc} loc )
272
+ file ( TO_CMAKE_PATH ${CMAKE_CURRENT_SOURCE_DIR } /${file_loc} loc )
268
273
# Prepend the location to give higher priority to
269
274
# specialized implementation
270
275
if ( EXISTS ${loc} )
@@ -339,7 +344,7 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
339
344
list ( APPEND build_flags
340
345
-D__CLC_INTERNAL
341
346
-D${CLC_TARGET_DEFINE}
342
- -I${PROJECT_SOURCE_DIR }/generic/include
347
+ -I${CMAKE_CURRENT_SOURCE_DIR }/generic/include
343
348
# FIXME: Fix libclc to not require disabling this noisy warning
344
349
-Wno-bitwise-conditional-parentheses
345
350
)
@@ -360,9 +365,9 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
360
365
# the path (e.g., ironing out any ".."), then make it relative to the
361
366
# root directory again, and use that relative path component for the
362
367
# binary path.
363
- get_filename_component ( abs_path ${file} ABSOLUTE BASE_DIR ${PROJECT_SOURCE_DIR } )
364
- file ( RELATIVE_PATH root_rel_path ${PROJECT_SOURCE_DIR } ${abs_path} )
365
- set ( input_file ${PROJECT_SOURCE_DIR } /${file} )
368
+ get_filename_component ( abs_path ${file} ABSOLUTE BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR } )
369
+ file ( RELATIVE_PATH root_rel_path ${CMAKE_CURRENT_SOURCE_DIR } ${abs_path} )
370
+ set ( input_file ${CMAKE_CURRENT_SOURCE_DIR } /${file} )
366
371
set ( output_file "${LIBCLC_ARCH_OBJFILE_DIR} /${root_rel_path} .bc" )
367
372
endif ()
368
373
@@ -373,7 +378,7 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
373
378
INPUT ${input_file}
374
379
OUTPUT ${output_file}
375
380
EXTRA_OPTS "${mcpu} " -fno-builtin -nostdlib
376
- "${build_flags} " -I${PROJECT_SOURCE_DIR }/${file_dir}
381
+ "${build_flags} " -I${CMAKE_CURRENT_SOURCE_DIR }/${file_dir}
377
382
DEPENDENCIES generate_convert.cl clspv-generate_convert.cl
378
383
)
379
384
list ( APPEND bytecode_files ${output_file} )
@@ -407,9 +412,9 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
407
412
408
413
# Add opt target
409
414
add_custom_command ( OUTPUT ${builtins_opt_lib_tgt} .bc
410
- COMMAND libclc::opt ${opt_flags} -o ${builtins_opt_lib_tgt} .bc
415
+ COMMAND ${opt_exe} ${opt_flags} -o ${builtins_opt_lib_tgt} .bc
411
416
${builtins_link_lib}
412
- DEPENDS libclc::opt ${builtins_link_lib} ${builtins_link_lib_tgt}
417
+ DEPENDS ${opt_target} ${builtins_link_lib} ${builtins_link_lib_tgt}
413
418
)
414
419
add_custom_target ( ${builtins_opt_lib_tgt}
415
420
ALL DEPENDS ${builtins_opt_lib_tgt} .bc
@@ -423,15 +428,15 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
423
428
# Add prepare target
424
429
set ( obj_suffix ${arch_suffix} .bc )
425
430
add_custom_command ( OUTPUT ${obj_suffix}
426
- COMMAND prepare_builtins -o ${obj_suffix} ${builtins_opt_lib}
427
- DEPENDS ${builtins_opt_lib} ${builtins_opt_lib_tgt} prepare_builtins )
431
+ COMMAND ${prepare_builtins_exe} -o ${obj_suffix} ${builtins_opt_lib}
432
+ DEPENDS ${builtins_opt_lib} ${builtins_opt_lib_tgt} ${prepare_builtins_target} )
428
433
add_custom_target ( prepare-${obj_suffix} ALL DEPENDS ${obj_suffix} )
429
434
430
435
# nvptx-- targets don't include workitem builtins
431
436
if ( NOT clang_triple MATCHES ".*ptx.*--$" )
432
437
add_test ( NAME external-calls-${obj_suffix}
433
438
COMMAND ./check_external_calls.sh ${CMAKE_CURRENT_BINARY_DIR} /${obj_suffix} ${LLVM_TOOLS_BINARY_DIR}
434
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR } )
439
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR } )
435
440
endif ()
436
441
437
442
install ( FILES ${CMAKE_CURRENT_BINARY_DIR} /${obj_suffix} DESTINATION "${CMAKE_INSTALL_DATADIR} /clc" )
0 commit comments