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