Skip to content

Commit 0911e57

Browse files
committed
[DeviceRTL] Fix incremental build
Need both add_custom_command to resolve file-level dependency and add_custom_target to resolve target-level dependency. From CMake add_custom_command doc: Do not list the output in more than one independent target that may build in parallel or the two instances of the rule may conflict (instead use the add_custom_target() command to drive the command and make the other targets depend on that one). ${CMAKE_CURRENT_BINARY_DIR}/${bclib_name} is used by multiple targets and thus requires a custom target to avoid racing. Differential Revision: https://reviews.llvm.org/D136911
1 parent cf953e3 commit 0911e57

File tree

1 file changed

+65
-53
lines changed

1 file changed

+65
-53
lines changed

openmp/libomptarget/DeviceRTL/CMakeLists.txt

Lines changed: 65 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -143,21 +143,25 @@ function(compileDeviceRTLLibrary target_cpu target_name target_triple)
143143
get_filename_component(outfile ${src} NAME)
144144
set(outfile "${outfile}-${target_cpu}.bc")
145145

146-
add_custom_target(${outfile}
146+
add_custom_command(OUTPUT ${outfile}
147147
COMMAND ${CLANG_TOOL}
148148
${bc_flags}
149149
--offload-arch=${target_cpu}
150150
${target_bc_flags}
151151
${infile} -o ${outfile}
152152
DEPENDS ${infile} ${include_files}
153+
IMPLICIT_DEPENDS CXX ${infile}
153154
COMMENT "Building LLVM bitcode ${outfile}"
154155
VERBATIM
155156
)
156157
if("${CLANG_TOOL}" STREQUAL "$<TARGET_FILE:clang>")
157-
# Add a target-level dependency to ensure that clang is up-to-date.
158-
# By default, add_custom_target only builds clang if the
158+
# Add a file-level dependency to ensure that clang is up-to-date.
159+
# By default, add_custom_command only builds clang if the
159160
# executable is missing.
160-
add_dependencies(${outfile} clang)
161+
add_custom_command(OUTPUT ${outfile}
162+
DEPENDS clang
163+
APPEND
164+
)
161165
endif()
162166
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${outfile})
163167

@@ -167,91 +171,99 @@ function(compileDeviceRTLLibrary target_cpu target_name target_triple)
167171
set(bclib_name "libomptarget-${target_name}-${target_cpu}.bc")
168172

169173
# Link to a bitcode library.
170-
add_custom_target(linked_${bclib_name}
174+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/linked_${bclib_name}
171175
COMMAND ${LINK_TOOL}
172176
-o ${CMAKE_CURRENT_BINARY_DIR}/linked_${bclib_name} ${bc_files}
177+
DEPENDS ${bc_files}
173178
COMMENT "Linking LLVM bitcode ${bclib_name}"
174179
)
175-
add_dependencies(linked_${bclib_name} ${bc_files})
180+
if("${LINK_TOOL}" STREQUAL "$<TARGET_FILE:llvm-link>")
181+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/linked_${bclib_name}
182+
DEPENDS llvm-link
183+
APPEND)
184+
endif()
176185

177-
add_custom_target(internalized_${bclib_name}
186+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/internalized_${bclib_name}
178187
COMMAND ${OPT_TOOL} ${link_export_flag} ${CMAKE_CURRENT_BINARY_DIR}/linked_${bclib_name}
179188
-o ${CMAKE_CURRENT_BINARY_DIR}/internalized_${bclib_name}
180-
DEPENDS ${source_directory}/exports
189+
DEPENDS ${source_directory}/exports ${CMAKE_CURRENT_BINARY_DIR}/linked_${bclib_name}
181190
COMMENT "Internalizing LLVM bitcode ${bclib_name}"
182191
)
183-
add_dependencies(internalized_${bclib_name} linked_${bclib_name})
192+
if("${OPT_TOOL}" STREQUAL "$<TARGET_FILE:opt>")
193+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/internalized_${bclib_name}
194+
DEPENDS opt
195+
APPEND)
196+
endif()
184197

185-
add_custom_target(${bclib_name}
198+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${bclib_name}
186199
COMMAND ${OPT_TOOL} ${link_opt_flags} ${CMAKE_CURRENT_BINARY_DIR}/internalized_${bclib_name}
187200
-o ${CMAKE_CURRENT_BINARY_DIR}/${bclib_name}
201+
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/internalized_${bclib_name}
188202
COMMENT "Optimizing LLVM bitcode ${bclib_name}"
189203
)
190-
add_dependencies(${bclib_name} internalized_${bclib_name})
204+
if("${OPT_TOOL}" STREQUAL "$<TARGET_FILE:opt>")
205+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${bclib_name}
206+
DEPENDS opt
207+
APPEND)
208+
endif()
191209

192-
add_custom_target(extracted_${bclib_name}
210+
set(bclib_target_name "omptarget-${target_name}-${target_cpu}-bc")
211+
add_custom_target(${bclib_target_name} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${bclib_name})
212+
213+
# Copy library to destination.
214+
add_custom_command(TARGET ${bclib_target_name} POST_BUILD
215+
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${bclib_name}
216+
${LIBOMPTARGET_LIBRARY_DIR})
217+
add_dependencies(omptarget.devicertl.${target_name} ${bclib_target_name})
218+
219+
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${bclib_name} ${LIBOMPTARGET_LIBRARY_DIR}/${bclib_name})
220+
221+
# Install bitcode library under the lib destination folder.
222+
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${bclib_name} DESTINATION "${OPENMP_INSTALL_LIBDIR}")
223+
224+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/extracted_${bclib_name}
193225
COMMAND ${EXTRACT_TOOL} ${link_extract_flag} ${CMAKE_CURRENT_BINARY_DIR}/${bclib_name}
194226
-o ${CMAKE_CURRENT_BINARY_DIR}/extracted_${bclib_name}
227+
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${bclib_name} ${bclib_target_name}
195228
COMMENT "Extracting LLVM bitcode ${bclib_name}"
196229
)
197-
add_dependencies(extracted_${bclib_name} ${bclib_name})
230+
if("${EXTRACT_TOOL}" STREQUAL "$<TARGET_FILE:llvm-extract>")
231+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/extracted_${bclib_name}
232+
DEPENDS llvm-extract
233+
APPEND)
234+
endif()
198235

199236
# Package the bitcode in the bitcode and embed it in an ELF for the static library
200-
add_custom_target(packaged_${bclib_name}
237+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/packaged_${bclib_name}
201238
COMMAND ${PACKAGER_TOOL} -o ${CMAKE_CURRENT_BINARY_DIR}/packaged_${bclib_name}
202239
"--image=file=${CMAKE_CURRENT_BINARY_DIR}/extracted_${bclib_name},triple=${target_triple},arch=${target_cpu},kind=openmp"
240+
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/extracted_${bclib_name}
203241
COMMENT "Packaging LLVM offloading binary ${bclib_name}.out"
204242
)
205-
add_dependencies(packaged_${bclib_name} extracted_${bclib_name})
243+
if("${PACKAGER_TOOL}" STREQUAL "$<TARGET_FILE:clang-offload-packager>")
244+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/packaged_${bclib_name}
245+
DEPENDS clang-offload-packager
246+
APPEND)
247+
endif()
206248

207249
set(output_name "${CMAKE_CURRENT_BINARY_DIR}/devicertl-${target_name}-${target_cpu}.o")
208-
add_custom_target(embedded_${target_name}-${target_cpu}
250+
add_custom_command(OUTPUT ${output_name}
209251
COMMAND ${CLANG_TOOL} --std=c++17 -c -nostdlib
210252
-Xclang -fembed-offload-object=${CMAKE_CURRENT_BINARY_DIR}/packaged_${bclib_name}
211253
-o ${output_name}
212254
${source_directory}/Stub.cpp
213-
BYPRODUCTS ${output_name}
214-
COMMENT "Embedding LLVM offloading binary in ${output_name}"
255+
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/packaged_${bclib_name} ${source_directory}/Stub.cpp
256+
COMMENT "Embedding LLVM offloading binary in devicertl-${target_name}-${target_cpu}.o"
215257
VERBATIM
216258
)
217-
add_dependencies(embedded_${target_name}-${target_cpu} packaged_${bclib_name})
218-
219-
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${output_name})
220-
add_dependencies(omptarget.devicertl.all_objs embedded_${target_name}-${target_cpu})
221-
set_property(TARGET omptarget.devicertl.all_objs APPEND PROPERTY IMPORTED_OBJECTS ${output_name})
222-
223-
# Add a target-level dependency to ensure that llvm-link and opt are up-to-date.
224-
# By default, add_custom_target only builds the tool if the executable is missing
225-
if("${LINK_TOOL}" STREQUAL "$<TARGET_FILE:llvm-link>")
226-
add_dependencies(linked_${bclib_name} llvm-link)
227-
endif()
228-
if("${OPT_TOOL}" STREQUAL "$<TARGET_FILE:opt>")
229-
add_dependencies(${bclib_name} opt)
230-
endif()
231-
if("${EXTRACT_TOOL}" STREQUAL "$<TARGET_FILE:llvm-extract>")
232-
add_dependencies(extracted_${bclib_name} llvm-extract)
233-
endif()
234-
if("${PACKAGER_TOOL}" STREQUAL "$<TARGET_FILE:clang-offload-packager>")
235-
add_dependencies(packaged_${bclib_name} clang-offload-packager)
236-
endif()
237259
if("${CLANG_TOOL}" STREQUAL "$<TARGET_FILE:clang>")
238-
add_dependencies(embedded_${target_name}-${target_cpu} clang)
260+
add_custom_command(OUTPUT ${output_name}
261+
DEPENDS clang
262+
APPEND)
239263
endif()
240264

241-
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${bclib_name})
242-
243-
set(bclib_target_name "omptarget-${target_name}-${target_cpu}-bc")
244-
add_custom_target(${bclib_target_name} ALL)
245-
add_dependencies(${bclib_target_name} ${bclib_name})
246-
247-
# Copy library to destination.
248-
add_custom_command(TARGET ${bclib_target_name} POST_BUILD
249-
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${bclib_name}
250-
${LIBOMPTARGET_LIBRARY_DIR})
251-
add_dependencies("omptarget.devicertl.${target_name}" "${bclib_target_name}")
252-
253-
# Install bitcode library under the lib destination folder.
254-
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${bclib_name} DESTINATION "${OPENMP_INSTALL_LIBDIR}")
265+
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${output_name})
266+
set_property(TARGET omptarget.devicertl.all_objs APPEND PROPERTY IMPORTED_OBJECTS ${output_name})
255267
endfunction()
256268

257269
# Generate a Bitcode library for all the compute capabilities the user requested

0 commit comments

Comments
 (0)