xref: /aosp_15_r20/external/llvm/cmake/modules/LLVMExternalProjectUtils.cmake (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Workerinclude(ExternalProject)
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker# llvm_ExternalProject_BuildCmd(out_var target)
4*9880d681SAndroid Build Coastguard Worker#   Utility function for constructing command lines for external project targets
5*9880d681SAndroid Build Coastguard Workerfunction(llvm_ExternalProject_BuildCmd out_var target bin_dir)
6*9880d681SAndroid Build Coastguard Worker  if (CMAKE_GENERATOR MATCHES "Make")
7*9880d681SAndroid Build Coastguard Worker    # Use special command for Makefiles to support parallelism.
8*9880d681SAndroid Build Coastguard Worker    set(${out_var} "$(MAKE)" "-C" "${BINARY_DIR}" "${target}" PARENT_SCOPE)
9*9880d681SAndroid Build Coastguard Worker  else()
10*9880d681SAndroid Build Coastguard Worker    set(${out_var} ${CMAKE_COMMAND} --build ${bin_dir} --target ${target}
11*9880d681SAndroid Build Coastguard Worker                                    --config $<CONFIGURATION> PARENT_SCOPE)
12*9880d681SAndroid Build Coastguard Worker  endif()
13*9880d681SAndroid Build Coastguard Workerendfunction()
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker# llvm_ExternalProject_Add(name source_dir ...
16*9880d681SAndroid Build Coastguard Worker#   USE_TOOLCHAIN
17*9880d681SAndroid Build Coastguard Worker#     Use just-built tools (see TOOLCHAIN_TOOLS)
18*9880d681SAndroid Build Coastguard Worker#   EXCLUDE_FROM_ALL
19*9880d681SAndroid Build Coastguard Worker#     Exclude this project from the all target
20*9880d681SAndroid Build Coastguard Worker#   NO_INSTALL
21*9880d681SAndroid Build Coastguard Worker#     Don't generate install targets for this project
22*9880d681SAndroid Build Coastguard Worker#   ALWAYS_CLEAN
23*9880d681SAndroid Build Coastguard Worker#     Always clean the sub-project before building
24*9880d681SAndroid Build Coastguard Worker#   CMAKE_ARGS arguments...
25*9880d681SAndroid Build Coastguard Worker#     Optional cmake arguments to pass when configuring the project
26*9880d681SAndroid Build Coastguard Worker#   TOOLCHAIN_TOOLS targets...
27*9880d681SAndroid Build Coastguard Worker#     Targets for toolchain tools (defaults to clang;lld)
28*9880d681SAndroid Build Coastguard Worker#   DEPENDS targets...
29*9880d681SAndroid Build Coastguard Worker#     Targets that this project depends on
30*9880d681SAndroid Build Coastguard Worker#   EXTRA_TARGETS targets...
31*9880d681SAndroid Build Coastguard Worker#     Extra targets in the subproject to generate targets for
32*9880d681SAndroid Build Coastguard Worker#   PASSTHROUGH_PREFIXES prefix...
33*9880d681SAndroid Build Coastguard Worker#     Extra variable prefixes (name is always included) to pass down
34*9880d681SAndroid Build Coastguard Worker#   )
35*9880d681SAndroid Build Coastguard Workerfunction(llvm_ExternalProject_Add name source_dir)
36*9880d681SAndroid Build Coastguard Worker  cmake_parse_arguments(ARG
37*9880d681SAndroid Build Coastguard Worker    "USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"
38*9880d681SAndroid Build Coastguard Worker    "SOURCE_DIR"
39*9880d681SAndroid Build Coastguard Worker    "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES"
40*9880d681SAndroid Build Coastguard Worker    ${ARGN})
41*9880d681SAndroid Build Coastguard Worker  canonicalize_tool_name(${name} nameCanon)
42*9880d681SAndroid Build Coastguard Worker  if(NOT ARG_TOOLCHAIN_TOOLS)
43*9880d681SAndroid Build Coastguard Worker    set(ARG_TOOLCHAIN_TOOLS clang lld)
44*9880d681SAndroid Build Coastguard Worker  endif()
45*9880d681SAndroid Build Coastguard Worker  foreach(tool ${ARG_TOOLCHAIN_TOOLS})
46*9880d681SAndroid Build Coastguard Worker    if(TARGET ${tool})
47*9880d681SAndroid Build Coastguard Worker      list(APPEND TOOLCHAIN_TOOLS ${tool})
48*9880d681SAndroid Build Coastguard Worker      list(APPEND TOOLCHAIN_BINS $<TARGET_FILE:${tool}>)
49*9880d681SAndroid Build Coastguard Worker    endif()
50*9880d681SAndroid Build Coastguard Worker  endforeach()
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker  if(NOT ARG_RUNTIME_LIBRARIES)
53*9880d681SAndroid Build Coastguard Worker    set(ARG_RUNTIME_LIBRARIES compiler-rt libcxx)
54*9880d681SAndroid Build Coastguard Worker  endif()
55*9880d681SAndroid Build Coastguard Worker  foreach(lib ${ARG_RUNTIME_LIBRARIES})
56*9880d681SAndroid Build Coastguard Worker    if(TARGET ${lib})
57*9880d681SAndroid Build Coastguard Worker      list(APPEND RUNTIME_LIBRARIES ${lib})
58*9880d681SAndroid Build Coastguard Worker    endif()
59*9880d681SAndroid Build Coastguard Worker  endforeach()
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker  if(ARG_ALWAYS_CLEAN)
62*9880d681SAndroid Build Coastguard Worker    set(always_clean clean)
63*9880d681SAndroid Build Coastguard Worker  endif()
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker  list(FIND TOOLCHAIN_TOOLS clang FOUND_CLANG)
66*9880d681SAndroid Build Coastguard Worker  if(FOUND_CLANG GREATER -1)
67*9880d681SAndroid Build Coastguard Worker    set(CLANG_IN_TOOLCHAIN On)
68*9880d681SAndroid Build Coastguard Worker  endif()
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker  if(RUNTIME_LIBRARIES AND CLANG_IN_TOOLCHAIN)
71*9880d681SAndroid Build Coastguard Worker    list(APPEND TOOLCHAIN_BINS ${RUNTIME_LIBRARIES})
72*9880d681SAndroid Build Coastguard Worker  endif()
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker  set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/${name}-stamps/)
75*9880d681SAndroid Build Coastguard Worker  set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${name}-bins/)
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker  add_custom_target(${name}-clear
78*9880d681SAndroid Build Coastguard Worker    COMMAND ${CMAKE_COMMAND} -E remove_directory ${BINARY_DIR}
79*9880d681SAndroid Build Coastguard Worker    COMMAND ${CMAKE_COMMAND} -E remove_directory ${STAMP_DIR}
80*9880d681SAndroid Build Coastguard Worker    COMMENT "Clobbering ${name} build and stamp directories"
81*9880d681SAndroid Build Coastguard Worker    USES_TERMINAL
82*9880d681SAndroid Build Coastguard Worker    )
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker  # Find all variables that start with a prefix and propagate them through
85*9880d681SAndroid Build Coastguard Worker  get_cmake_property(variableNames VARIABLES)
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker  list(APPEND ARG_PASSTHROUGH_PREFIXES ${nameCanon})
88*9880d681SAndroid Build Coastguard Worker  foreach(prefix ${ARG_PASSTHROUGH_PREFIXES})
89*9880d681SAndroid Build Coastguard Worker    foreach(variableName ${variableNames})
90*9880d681SAndroid Build Coastguard Worker      if(variableName MATCHES "^${prefix}")
91*9880d681SAndroid Build Coastguard Worker        string(REPLACE ";" "\;" value "${${variableName}}")
92*9880d681SAndroid Build Coastguard Worker        list(APPEND PASSTHROUGH_VARIABLES
93*9880d681SAndroid Build Coastguard Worker          -D${variableName}=${value})
94*9880d681SAndroid Build Coastguard Worker      endif()
95*9880d681SAndroid Build Coastguard Worker    endforeach()
96*9880d681SAndroid Build Coastguard Worker  endforeach()
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker  if(ARG_USE_TOOLCHAIN)
99*9880d681SAndroid Build Coastguard Worker    if(CLANG_IN_TOOLCHAIN)
100*9880d681SAndroid Build Coastguard Worker      set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang
101*9880d681SAndroid Build Coastguard Worker                        -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++)
102*9880d681SAndroid Build Coastguard Worker    endif()
103*9880d681SAndroid Build Coastguard Worker    list(APPEND ARG_DEPENDS ${TOOLCHAIN_TOOLS})
104*9880d681SAndroid Build Coastguard Worker  endif()
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker  add_custom_command(
107*9880d681SAndroid Build Coastguard Worker    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp
108*9880d681SAndroid Build Coastguard Worker    DEPENDS ${ARG_DEPENDS}
109*9880d681SAndroid Build Coastguard Worker    COMMAND ${CMAKE_COMMAND} -E touch ${BINARY_DIR}/CMakeCache.txt
110*9880d681SAndroid Build Coastguard Worker    COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_DIR}/${name}-mkdir
111*9880d681SAndroid Build Coastguard Worker    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp
112*9880d681SAndroid Build Coastguard Worker    COMMENT "Clobbering bootstrap build and stamp directories"
113*9880d681SAndroid Build Coastguard Worker    )
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker  add_custom_target(${name}-clobber
116*9880d681SAndroid Build Coastguard Worker    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp)
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker  if(ARG_EXCLUDE_FROM_ALL)
119*9880d681SAndroid Build Coastguard Worker    set(exclude EXCLUDE_FROM_ALL 1)
120*9880d681SAndroid Build Coastguard Worker  endif()
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker  ExternalProject_Add(${name}
123*9880d681SAndroid Build Coastguard Worker    DEPENDS ${ARG_DEPENDS}
124*9880d681SAndroid Build Coastguard Worker    ${name}-clobber
125*9880d681SAndroid Build Coastguard Worker    PREFIX ${CMAKE_BINARY_DIR}/projects/${name}
126*9880d681SAndroid Build Coastguard Worker    SOURCE_DIR ${source_dir}
127*9880d681SAndroid Build Coastguard Worker    STAMP_DIR ${STAMP_DIR}
128*9880d681SAndroid Build Coastguard Worker    BINARY_DIR ${BINARY_DIR}
129*9880d681SAndroid Build Coastguard Worker    ${exclude}
130*9880d681SAndroid Build Coastguard Worker    CMAKE_ARGS ${${nameCanon}_CMAKE_ARGS}
131*9880d681SAndroid Build Coastguard Worker               ${compiler_args}
132*9880d681SAndroid Build Coastguard Worker               -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
133*9880d681SAndroid Build Coastguard Worker               -DLLVM_BINARY_DIR=${PROJECT_BINARY_DIR}
134*9880d681SAndroid Build Coastguard Worker               -DLLVM_CONFIG_PATH=$<TARGET_FILE:llvm-config>
135*9880d681SAndroid Build Coastguard Worker               -DLLVM_ENABLE_WERROR=${LLVM_ENABLE_WERROR}
136*9880d681SAndroid Build Coastguard Worker               -DPACKAGE_VERSION=${PACKAGE_VERSION}
137*9880d681SAndroid Build Coastguard Worker               -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
138*9880d681SAndroid Build Coastguard Worker               -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
139*9880d681SAndroid Build Coastguard Worker               ${ARG_CMAKE_ARGS}
140*9880d681SAndroid Build Coastguard Worker               ${PASSTHROUGH_VARIABLES}
141*9880d681SAndroid Build Coastguard Worker    INSTALL_COMMAND ""
142*9880d681SAndroid Build Coastguard Worker    STEP_TARGETS configure build
143*9880d681SAndroid Build Coastguard Worker    BUILD_ALWAYS 1
144*9880d681SAndroid Build Coastguard Worker    USES_TERMINAL_CONFIGURE 1
145*9880d681SAndroid Build Coastguard Worker    USES_TERMINAL_BUILD 1
146*9880d681SAndroid Build Coastguard Worker    USES_TERMINAL_INSTALL 1
147*9880d681SAndroid Build Coastguard Worker    )
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker  if(ARG_USE_TOOLCHAIN)
150*9880d681SAndroid Build Coastguard Worker    set(force_deps DEPENDS ${TOOLCHAIN_BINS})
151*9880d681SAndroid Build Coastguard Worker  endif()
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker  llvm_ExternalProject_BuildCmd(run_clean clean ${BINARY_DIR})
154*9880d681SAndroid Build Coastguard Worker  ExternalProject_Add_Step(${name} clean
155*9880d681SAndroid Build Coastguard Worker    COMMAND ${run_clean}
156*9880d681SAndroid Build Coastguard Worker    COMMENT "Cleaning ${name}..."
157*9880d681SAndroid Build Coastguard Worker    DEPENDEES configure
158*9880d681SAndroid Build Coastguard Worker    ${force_deps}
159*9880d681SAndroid Build Coastguard Worker    WORKING_DIRECTORY ${BINARY_DIR}
160*9880d681SAndroid Build Coastguard Worker    EXCLUDE_FROM_MAIN 1
161*9880d681SAndroid Build Coastguard Worker    USES_TERMINAL 1
162*9880d681SAndroid Build Coastguard Worker    )
163*9880d681SAndroid Build Coastguard Worker  ExternalProject_Add_StepTargets(${name} clean)
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker  if(ARG_USE_TOOLCHAIN)
166*9880d681SAndroid Build Coastguard Worker    add_dependencies(${name}-clean ${name}-clobber)
167*9880d681SAndroid Build Coastguard Worker    set_target_properties(${name}-clean PROPERTIES
168*9880d681SAndroid Build Coastguard Worker      SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp)
169*9880d681SAndroid Build Coastguard Worker  endif()
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker  if(NOT ARG_NO_INSTALL)
172*9880d681SAndroid Build Coastguard Worker    install(CODE "execute_process\(COMMAND \${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX} -P ${BINARY_DIR}/cmake_install.cmake \)"
173*9880d681SAndroid Build Coastguard Worker      COMPONENT ${name})
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker    add_custom_target(install-${name}
176*9880d681SAndroid Build Coastguard Worker                      DEPENDS ${name}
177*9880d681SAndroid Build Coastguard Worker                      COMMAND "${CMAKE_COMMAND}"
178*9880d681SAndroid Build Coastguard Worker                               -DCMAKE_INSTALL_COMPONENT=${name}
179*9880d681SAndroid Build Coastguard Worker                               -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
180*9880d681SAndroid Build Coastguard Worker                      USES_TERMINAL)
181*9880d681SAndroid Build Coastguard Worker  endif()
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker  # Add top-level targets
184*9880d681SAndroid Build Coastguard Worker  foreach(target ${ARG_EXTRA_TARGETS})
185*9880d681SAndroid Build Coastguard Worker    llvm_ExternalProject_BuildCmd(build_runtime_cmd ${target} ${BINARY_DIR})
186*9880d681SAndroid Build Coastguard Worker    add_custom_target(${target}
187*9880d681SAndroid Build Coastguard Worker      COMMAND ${build_runtime_cmd}
188*9880d681SAndroid Build Coastguard Worker      DEPENDS ${name}-configure
189*9880d681SAndroid Build Coastguard Worker      WORKING_DIRECTORY ${BINARY_DIR}
190*9880d681SAndroid Build Coastguard Worker      VERBATIM
191*9880d681SAndroid Build Coastguard Worker      USES_TERMINAL)
192*9880d681SAndroid Build Coastguard Worker  endforeach()
193*9880d681SAndroid Build Coastguard Workerendfunction()
194