1include(LLVMParseArguments) 2include(LLVMProcessSources) 3include(LLVM-Config) 4 5macro(add_llvm_library name) 6 llvm_process_sources( ALL_FILES ${ARGN} ) 7 add_library( ${name} ${ALL_FILES} ) 8 set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} ) 9 if( LLVM_COMMON_DEPENDS ) 10 add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} ) 11 endif( LLVM_COMMON_DEPENDS ) 12 13 if( BUILD_SHARED_LIBS ) 14 llvm_config( ${name} ${LLVM_LINK_COMPONENTS} ) 15 endif() 16 17 # Ensure that the system libraries always comes last on the 18 # list. Without this, linking the unit tests on MinGW fails. 19 link_system_libs( ${name} ) 20 21 if( EXCLUDE_FROM_ALL ) 22 set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) 23 else() 24 install(TARGETS ${name} 25 LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} 26 ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) 27 endif() 28 set_target_properties(${name} PROPERTIES FOLDER "Libraries") 29 30 # Add the explicit dependency information for this library. 31 # 32 # It would be nice to verify that we have the dependencies for this library 33 # name, but using get_property(... SET) doesn't suffice to determine if a 34 # property has been set to an empty value. 35 get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name}) 36 target_link_libraries(${name} ${lib_deps}) 37endmacro(add_llvm_library name) 38 39macro(add_llvm_loadable_module name) 40 if( NOT LLVM_ON_UNIX OR CYGWIN ) 41 message(STATUS "Loadable modules not supported on this platform. 42${name} ignored.") 43 # Add empty "phony" target 44 add_custom_target(${name}) 45 else() 46 llvm_process_sources( ALL_FILES ${ARGN} ) 47 if (MODULE) 48 set(libkind MODULE) 49 else() 50 set(libkind SHARED) 51 endif() 52 53 add_library( ${name} ${libkind} ${ALL_FILES} ) 54 set_target_properties( ${name} PROPERTIES PREFIX "" ) 55 56 llvm_config( ${name} ${LLVM_LINK_COMPONENTS} ) 57 link_system_libs( ${name} ) 58 59 if (APPLE) 60 # Darwin-specific linker flags for loadable modules. 61 set_target_properties(${name} PROPERTIES 62 LINK_FLAGS "-Wl,-flat_namespace -Wl,-undefined -Wl,suppress") 63 endif() 64 65 if( EXCLUDE_FROM_ALL ) 66 set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) 67 else() 68 install(TARGETS ${name} 69 LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} 70 ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) 71 endif() 72 endif() 73 74 set_target_properties(${name} PROPERTIES FOLDER "Loadable modules") 75endmacro(add_llvm_loadable_module name) 76 77 78macro(add_llvm_executable name) 79 llvm_process_sources( ALL_FILES ${ARGN} ) 80 if( EXCLUDE_FROM_ALL ) 81 add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES}) 82 else() 83 add_executable(${name} ${ALL_FILES}) 84 endif() 85 set(EXCLUDE_FROM_ALL OFF) 86 llvm_config( ${name} ${LLVM_LINK_COMPONENTS} ) 87 if( LLVM_COMMON_DEPENDS ) 88 add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} ) 89 endif( LLVM_COMMON_DEPENDS ) 90 link_system_libs( ${name} ) 91endmacro(add_llvm_executable name) 92 93 94macro(add_llvm_tool name) 95 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR}) 96 if( NOT LLVM_BUILD_TOOLS ) 97 set(EXCLUDE_FROM_ALL ON) 98 endif() 99 add_llvm_executable(${name} ${ARGN}) 100 if( LLVM_BUILD_TOOLS ) 101 install(TARGETS ${name} RUNTIME DESTINATION bin) 102 endif() 103 set_target_properties(${name} PROPERTIES FOLDER "Tools") 104endmacro(add_llvm_tool name) 105 106 107macro(add_llvm_example name) 108# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_EXAMPLES_BINARY_DIR}) 109 if( NOT LLVM_BUILD_EXAMPLES ) 110 set(EXCLUDE_FROM_ALL ON) 111 endif() 112 add_llvm_executable(${name} ${ARGN}) 113 if( LLVM_BUILD_EXAMPLES ) 114 install(TARGETS ${name} RUNTIME DESTINATION examples) 115 endif() 116 set_target_properties(${name} PROPERTIES FOLDER "Examples") 117endmacro(add_llvm_example name) 118 119 120macro(add_llvm_utility name) 121 add_llvm_executable(${name} ${ARGN}) 122 set_target_properties(${name} PROPERTIES FOLDER "Utils") 123endmacro(add_llvm_utility name) 124 125 126macro(add_llvm_target target_name) 127 include_directories(BEFORE 128 ${CMAKE_CURRENT_BINARY_DIR} 129 ${CMAKE_CURRENT_SOURCE_DIR}) 130 add_llvm_library(LLVM${target_name} ${ARGN} ${TABLEGEN_OUTPUT}) 131 set( CURRENT_LLVM_TARGET LLVM${target_name} ) 132endmacro(add_llvm_target) 133 134# Add external project that may want to be built as part of llvm such as Clang, 135# lld, and Polly. This adds two options. One for the source directory of the 136# project, which defaults to ${CMAKE_CURRENT_SOURCE_DIR}/${name}. Another to 137# enable or disable building it with everthing else. 138macro(add_llvm_external_project name) 139 string(TOUPPER ${name} nameUPPER) 140 set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${name}" 141 CACHE PATH "Path to ${name} source directory") 142 if (NOT ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} STREQUAL "" 143 AND EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}/CMakeLists.txt) 144 option(LLVM_EXTERNAL_${nameUPPER}_BUILD 145 "Whether to build ${name} as part of LLVM" ON) 146 if (LLVM_EXTERNAL_${nameUPPER}_BUILD) 147 add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${name}) 148 endif() 149 endif() 150endmacro(add_llvm_external_project) 151 152# Generic support for adding a unittest. 153function(add_unittest test_suite test_name) 154 if (CMAKE_BUILD_TYPE) 155 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY 156 ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}) 157 else() 158 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 159 endif() 160 if( NOT LLVM_BUILD_TESTS ) 161 set(EXCLUDE_FROM_ALL ON) 162 endif() 163 164 add_llvm_executable(${test_name} ${ARGN}) 165 target_link_libraries(${test_name} 166 gtest 167 gtest_main 168 LLVMSupport # gtest needs it for raw_ostream. 169 ) 170 171 add_dependencies(${test_suite} ${test_name}) 172 get_target_property(test_suite_folder ${test_suite} FOLDER) 173 if (NOT ${test_suite_folder} STREQUAL "NOTFOUND") 174 set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}") 175 endif () 176 177 # Visual Studio 2012 only supports up to 8 template parameters in 178 # std::tr1::tuple by default, but gtest requires 10 179 if (MSVC AND MSVC_VERSION EQUAL 1700) 180 set_property(TARGET ${test_name} APPEND PROPERTY COMPILE_DEFINITIONS _VARIADIC_MAX=10) 181 endif () 182 183 include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include) 184 set_property(TARGET ${test_name} APPEND PROPERTY COMPILE_DEFINITIONS GTEST_HAS_RTTI=0) 185 if (NOT LLVM_ENABLE_THREADS) 186 set_property(TARGET ${test_name} APPEND PROPERTY COMPILE_DEFINITIONS GTEST_HAS_PTHREAD=0) 187 endif () 188 189 get_property(target_compile_flags TARGET ${test_name} PROPERTY COMPILE_FLAGS) 190 if (LLVM_COMPILER_IS_GCC_COMPATIBLE) 191 set(target_compile_flags "${target_compile_flags} -fno-rtti") 192 elseif (MSVC) 193 set(target_compile_flags "${target_compile_flags} /GR-") 194 endif () 195 196 if (SUPPORTS_NO_VARIADIC_MACROS_FLAG) 197 set(target_compile_flags "${target_compile_flags} -Wno-variadic-macros") 198 endif () 199 set_property(TARGET ${test_name} PROPERTY COMPILE_FLAGS "${target_compile_flags}") 200endfunction() 201 202# This function provides an automatic way to 'configure'-like generate a file 203# based on a set of common and custom variables, specifically targetting the 204# variables needed for the 'lit.site.cfg' files. This function bundles the 205# common variables that any Lit instance is likely to need, and custom 206# variables can be passed in. 207function(configure_lit_site_cfg input output) 208 foreach(c ${LLVM_TARGETS_TO_BUILD}) 209 set(TARGETS_BUILT "${TARGETS_BUILT} ${c}") 210 endforeach(c) 211 set(TARGETS_TO_BUILD ${TARGETS_BUILT}) 212 213 set(SHLIBEXT "${LTDL_SHLIB_EXT}") 214 set(SHLIBDIR "${LLVM_BINARY_DIR}/lib/${CMAKE_CFG_INTDIR}") 215 216 if(BUILD_SHARED_LIBS) 217 set(LLVM_SHARED_LIBS_ENABLED "1") 218 else() 219 set(LLVM_SHARED_LIBS_ENABLED "0") 220 endif(BUILD_SHARED_LIBS) 221 222 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 223 set(SHLIBPATH_VAR "DYLD_LIBRARY_PATH") 224 else() # Default for all other unix like systems. 225 # CMake hardcodes the library locaction using rpath. 226 # Therefore LD_LIBRARY_PATH is not required to run binaries in the 227 # build dir. We pass it anyways. 228 set(SHLIBPATH_VAR "LD_LIBRARY_PATH") 229 endif() 230 231 # Configuration-time: See Unit/lit.site.cfg.in 232 set(LLVM_BUILD_MODE "%(build_mode)s") 233 234 set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR}) 235 set(LLVM_BINARY_DIR ${LLVM_BINARY_DIR}) 236 set(LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}/%(build_config)s") 237 set(LLVM_LIBS_DIR "${LLVM_BINARY_DIR}/lib/%(build_config)s") 238 set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE}) 239 set(ENABLE_SHARED ${LLVM_SHARED_LIBS_ENABLED}) 240 set(SHLIBPATH_VAR ${SHLIBPATH_VAR}) 241 242 if(LLVM_ENABLE_ASSERTIONS AND NOT MSVC_IDE) 243 set(ENABLE_ASSERTIONS "1") 244 else() 245 set(ENABLE_ASSERTIONS "0") 246 endif() 247 248 set(HOST_OS ${CMAKE_HOST_SYSTEM_NAME}) 249 set(HOST_ARCH ${CMAKE_HOST_SYSTEM_PROCESSOR}) 250 251 configure_file(${input} ${output} @ONLY) 252endfunction() 253 254# A raw function to create a lit target. This is used to implement the testuite 255# management functions. 256function(add_lit_target target comment) 257 parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN}) 258 set(LIT_ARGS "${ARG_ARGS} ${LLVM_LIT_ARGS}") 259 separate_arguments(LIT_ARGS) 260 set(LIT_COMMAND 261 ${PYTHON_EXECUTABLE} 262 ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py 263 --param build_config=${CMAKE_CFG_INTDIR} 264 --param build_mode=${RUNTIME_BUILD_MODE} 265 ${LIT_ARGS} 266 ) 267 foreach(param ${ARG_PARAMS}) 268 list(APPEND LIT_COMMAND --param ${param}) 269 endforeach() 270 add_custom_target(${target} 271 COMMAND ${LIT_COMMAND} ${ARG_DEFAULT_ARGS} 272 COMMENT "${comment}" 273 ) 274 add_dependencies(${target} ${ARG_DEPENDS}) 275endfunction() 276 277# A function to add a set of lit test suites to be driven through 'check-*' targets. 278function(add_lit_testsuite target comment) 279 parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN}) 280 281 # Register the testsuites, params and depends for the global check rule. 282 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${ARG_DEFAULT_ARGS}) 283 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_PARAMS ${ARG_PARAMS}) 284 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_DEPENDS ${ARG_DEPENDS}) 285 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_EXTRA_ARGS ${ARG_ARGS}) 286 287 # Produce a specific suffixed check rule. 288 add_lit_target(${target} ${comment} 289 ${ARG_DEFAULT_ARGS} 290 PARAMS ${ARG_PARAMS} 291 DEPENDS ${ARG_DEPENDS} 292 ARGS ${ARG_ARGS} 293 ) 294endfunction() 295