AddLLVM.cmake 66 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817
  1. include(LLVMProcessSources)
  2. include(LLVM-Config)
  3. include(DetermineGCCCompatible)
  4. function(llvm_update_compile_flags name)
  5. get_property(sources TARGET ${name} PROPERTY SOURCES)
  6. if("${sources}" MATCHES "\\.c(;|$)")
  7. set(update_src_props ON)
  8. endif()
  9. list(APPEND LLVM_COMPILE_CFLAGS " ${LLVM_COMPILE_FLAGS}")
  10. # LLVM_REQUIRES_EH is an internal flag that individual targets can use to
  11. # force EH
  12. if(LLVM_REQUIRES_EH OR LLVM_ENABLE_EH)
  13. if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI))
  14. message(AUTHOR_WARNING "Exception handling requires RTTI. Enabling RTTI for ${name}")
  15. set(LLVM_REQUIRES_RTTI ON)
  16. endif()
  17. if(MSVC)
  18. list(APPEND LLVM_COMPILE_FLAGS "/EHsc")
  19. endif()
  20. else()
  21. if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
  22. list(APPEND LLVM_COMPILE_FLAGS "-fno-exceptions")
  23. if(NOT LLVM_ENABLE_UNWIND_TABLES)
  24. list(APPEND LLVM_COMPILE_FLAGS "-fno-unwind-tables")
  25. list(APPEND LLVM_COMPILE_FLAGS "-fno-asynchronous-unwind-tables")
  26. endif()
  27. elseif(MSVC)
  28. list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0)
  29. list(APPEND LLVM_COMPILE_FLAGS "/EHs-c-")
  30. elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL")
  31. list(APPEND LLVM_COMPILE_FLAGS "-qnoeh")
  32. endif()
  33. endif()
  34. # LLVM_REQUIRES_RTTI is an internal flag that individual
  35. # targets can use to force RTTI
  36. set(LLVM_CONFIG_HAS_RTTI YES CACHE INTERNAL "")
  37. if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI))
  38. set(LLVM_CONFIG_HAS_RTTI NO CACHE INTERNAL "")
  39. list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_RTTI=0)
  40. if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
  41. list(APPEND LLVM_COMPILE_FLAGS "-fno-rtti")
  42. elseif (MSVC)
  43. list(APPEND LLVM_COMPILE_FLAGS "/GR-")
  44. elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL")
  45. list(APPEND LLVM_COMPILE_FLAGS "-qnortti")
  46. endif ()
  47. elseif(MSVC)
  48. list(APPEND LLVM_COMPILE_FLAGS "/GR")
  49. endif()
  50. # Assume that;
  51. # - LLVM_COMPILE_FLAGS is list.
  52. # - PROPERTY COMPILE_FLAGS is string.
  53. string(REPLACE ";" " " target_compile_flags " ${LLVM_COMPILE_FLAGS}")
  54. string(REPLACE ";" " " target_compile_cflags " ${LLVM_COMPILE_CFLAGS}")
  55. if(update_src_props)
  56. foreach(fn ${sources})
  57. get_filename_component(suf ${fn} EXT)
  58. if("${suf}" STREQUAL ".cpp")
  59. set_property(SOURCE ${fn} APPEND_STRING PROPERTY
  60. COMPILE_FLAGS "${target_compile_flags}")
  61. endif()
  62. if("${suf}" STREQUAL ".c")
  63. set_property(SOURCE ${fn} APPEND_STRING PROPERTY
  64. COMPILE_FLAGS "${target_compile_cflags}")
  65. endif()
  66. endforeach()
  67. else()
  68. # Update target props, since all sources are C++.
  69. set_property(TARGET ${name} APPEND_STRING PROPERTY
  70. COMPILE_FLAGS "${target_compile_flags}")
  71. endif()
  72. set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS ${LLVM_COMPILE_DEFINITIONS})
  73. endfunction()
  74. function(add_llvm_symbol_exports target_name export_file)
  75. if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
  76. set(native_export_file "${target_name}.exports")
  77. add_custom_command(OUTPUT ${native_export_file}
  78. COMMAND sed -e "s/^/_/" < ${export_file} > ${native_export_file}
  79. DEPENDS ${export_file}
  80. VERBATIM
  81. COMMENT "Creating export file for ${target_name}")
  82. set_property(TARGET ${target_name} APPEND_STRING PROPERTY
  83. LINK_FLAGS " -Wl,-exported_symbols_list,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"")
  84. elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
  85. set_property(TARGET ${target_name} APPEND_STRING PROPERTY
  86. LINK_FLAGS " -Wl,-bE:${export_file}")
  87. elseif(LLVM_HAVE_LINK_VERSION_SCRIPT)
  88. # Gold and BFD ld require a version script rather than a plain list.
  89. set(native_export_file "${target_name}.exports")
  90. # FIXME: Don't write the "local:" line on OpenBSD.
  91. # in the export file, also add a linker script to version LLVM symbols (form: LLVM_N.M)
  92. add_custom_command(OUTPUT ${native_export_file}
  93. COMMAND echo "LLVM_${LLVM_VERSION_MAJOR} {" > ${native_export_file}
  94. COMMAND grep -q "[[:alnum:]]" ${export_file} && echo " global:" >> ${native_export_file} || :
  95. COMMAND sed -e "s/$/;/" -e "s/^/ /" < ${export_file} >> ${native_export_file}
  96. COMMAND echo " local: *;" >> ${native_export_file}
  97. COMMAND echo "};" >> ${native_export_file}
  98. DEPENDS ${export_file}
  99. VERBATIM
  100. COMMENT "Creating export file for ${target_name}")
  101. if (${LLVM_LINKER_IS_SOLARISLD})
  102. set_property(TARGET ${target_name} APPEND_STRING PROPERTY
  103. LINK_FLAGS " -Wl,-M,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"")
  104. else()
  105. set_property(TARGET ${target_name} APPEND_STRING PROPERTY
  106. LINK_FLAGS " -Wl,--version-script,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"")
  107. endif()
  108. else()
  109. set(native_export_file "${target_name}.def")
  110. add_custom_command(OUTPUT ${native_export_file}
  111. COMMAND ${PYTHON_EXECUTABLE} -c "import sys;print(''.join(['EXPORTS\\n']+sys.stdin.readlines(),))"
  112. < ${export_file} > ${native_export_file}
  113. DEPENDS ${export_file}
  114. VERBATIM
  115. COMMENT "Creating export file for ${target_name}")
  116. set(export_file_linker_flag "${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
  117. if(MSVC)
  118. set(export_file_linker_flag "/DEF:\"${export_file_linker_flag}\"")
  119. endif()
  120. set_property(TARGET ${target_name} APPEND_STRING PROPERTY
  121. LINK_FLAGS " ${export_file_linker_flag}")
  122. endif()
  123. add_custom_target(${target_name}_exports DEPENDS ${native_export_file})
  124. set_target_properties(${target_name}_exports PROPERTIES FOLDER "Misc")
  125. get_property(srcs TARGET ${target_name} PROPERTY SOURCES)
  126. foreach(src ${srcs})
  127. get_filename_component(extension ${src} EXT)
  128. if(extension STREQUAL ".cpp")
  129. set(first_source_file ${src})
  130. break()
  131. endif()
  132. endforeach()
  133. # Force re-linking when the exports file changes. Actually, it
  134. # forces recompilation of the source file. The LINK_DEPENDS target
  135. # property only works for makefile-based generators.
  136. # FIXME: This is not safe because this will create the same target
  137. # ${native_export_file} in several different file:
  138. # - One where we emitted ${target_name}_exports
  139. # - One where we emitted the build command for the following object.
  140. # set_property(SOURCE ${first_source_file} APPEND PROPERTY
  141. # OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${native_export_file})
  142. set_property(DIRECTORY APPEND
  143. PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${native_export_file})
  144. add_dependencies(${target_name} ${target_name}_exports)
  145. # Add dependency to *_exports later -- CMake issue 14747
  146. list(APPEND LLVM_COMMON_DEPENDS ${target_name}_exports)
  147. set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE)
  148. endfunction(add_llvm_symbol_exports)
  149. if(APPLE)
  150. execute_process(
  151. COMMAND "${CMAKE_LINKER}" -v
  152. ERROR_VARIABLE stderr
  153. )
  154. set(LLVM_LINKER_DETECTED YES)
  155. if("${stderr}" MATCHES "PROJECT:ld64")
  156. set(LLVM_LINKER_IS_LD64 YES)
  157. message(STATUS "Linker detection: ld64")
  158. else()
  159. set(LLVM_LINKER_DETECTED NO)
  160. message(STATUS "Linker detection: unknown")
  161. endif()
  162. elseif(NOT WIN32)
  163. # Detect what linker we have here
  164. if( LLVM_USE_LINKER )
  165. set(command ${CMAKE_C_COMPILER} -fuse-ld=${LLVM_USE_LINKER} -Wl,--version)
  166. else()
  167. separate_arguments(flags UNIX_COMMAND "${CMAKE_EXE_LINKER_FLAGS}")
  168. set(command ${CMAKE_C_COMPILER} ${flags} -Wl,--version)
  169. endif()
  170. execute_process(
  171. COMMAND ${command}
  172. OUTPUT_VARIABLE stdout
  173. ERROR_VARIABLE stderr
  174. )
  175. set(LLVM_LINKER_DETECTED YES)
  176. if("${stdout}" MATCHES "GNU gold")
  177. set(LLVM_LINKER_IS_GOLD YES)
  178. message(STATUS "Linker detection: GNU Gold")
  179. elseif("${stdout}" MATCHES "^LLD")
  180. set(LLVM_LINKER_IS_LLD YES)
  181. message(STATUS "Linker detection: LLD")
  182. elseif("${stdout}" MATCHES "GNU ld")
  183. set(LLVM_LINKER_IS_GNULD YES)
  184. message(STATUS "Linker detection: GNU ld")
  185. elseif("${stderr}" MATCHES "Solaris Link Editors" OR
  186. "${stdout}" MATCHES "Solaris Link Editors")
  187. set(LLVM_LINKER_IS_SOLARISLD YES)
  188. message(STATUS "Linker detection: Solaris ld")
  189. else()
  190. set(LLVM_LINKER_DETECTED NO)
  191. message(STATUS "Linker detection: unknown")
  192. endif()
  193. endif()
  194. function(add_link_opts target_name)
  195. # Don't use linker optimizations in debug builds since it slows down the
  196. # linker in a context where the optimizations are not important.
  197. if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
  198. # Pass -O3 to the linker. This enabled different optimizations on different
  199. # linkers.
  200. if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin|SunOS|AIX" OR WIN32))
  201. set_property(TARGET ${target_name} APPEND_STRING PROPERTY
  202. LINK_FLAGS " -Wl,-O3")
  203. endif()
  204. if(LLVM_LINKER_IS_GOLD)
  205. # With gold gc-sections is always safe.
  206. set_property(TARGET ${target_name} APPEND_STRING PROPERTY
  207. LINK_FLAGS " -Wl,--gc-sections")
  208. # Note that there is a bug with -Wl,--icf=safe so it is not safe
  209. # to enable. See https://sourceware.org/bugzilla/show_bug.cgi?id=17704.
  210. endif()
  211. if(NOT LLVM_NO_DEAD_STRIP)
  212. if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
  213. # ld64's implementation of -dead_strip breaks tools that use plugins.
  214. set_property(TARGET ${target_name} APPEND_STRING PROPERTY
  215. LINK_FLAGS " -Wl,-dead_strip")
  216. elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
  217. set_property(TARGET ${target_name} APPEND_STRING PROPERTY
  218. LINK_FLAGS " -Wl,-z -Wl,discard-unused=sections")
  219. elseif(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD AND
  220. NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD|AIX")
  221. # Object files are compiled with -ffunction-data-sections.
  222. # Versions of bfd ld < 2.23.1 have a bug in --gc-sections that breaks
  223. # tools that use plugins. Always pass --gc-sections once we require
  224. # a newer linker.
  225. set_property(TARGET ${target_name} APPEND_STRING PROPERTY
  226. LINK_FLAGS " -Wl,--gc-sections")
  227. endif()
  228. else() #LLVM_NO_DEAD_STRIP
  229. if(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
  230. set_property(TARGET ${target_name} APPEND_STRING PROPERTY
  231. LINK_FLAGS " -Wl,-bnogc")
  232. endif()
  233. endif()
  234. endif()
  235. endfunction(add_link_opts)
  236. # Set each output directory according to ${CMAKE_CONFIGURATION_TYPES}.
  237. # Note: Don't set variables CMAKE_*_OUTPUT_DIRECTORY any more,
  238. # or a certain builder, for eaxample, msbuild.exe, would be confused.
  239. function(set_output_directory target)
  240. cmake_parse_arguments(ARG "" "BINARY_DIR;LIBRARY_DIR" "" ${ARGN})
  241. # module_dir -- corresponding to LIBRARY_OUTPUT_DIRECTORY.
  242. # It affects output of add_library(MODULE).
  243. if(WIN32 OR CYGWIN)
  244. # DLL platform
  245. set(module_dir ${ARG_BINARY_DIR})
  246. else()
  247. set(module_dir ${ARG_LIBRARY_DIR})
  248. endif()
  249. if(NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".")
  250. foreach(build_mode ${CMAKE_CONFIGURATION_TYPES})
  251. string(TOUPPER "${build_mode}" CONFIG_SUFFIX)
  252. if(ARG_BINARY_DIR)
  253. string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} bi ${ARG_BINARY_DIR})
  254. set_target_properties(${target} PROPERTIES "RUNTIME_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${bi})
  255. endif()
  256. if(ARG_LIBRARY_DIR)
  257. string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} li ${ARG_LIBRARY_DIR})
  258. set_target_properties(${target} PROPERTIES "ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${li})
  259. endif()
  260. if(module_dir)
  261. string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} mi ${module_dir})
  262. set_target_properties(${target} PROPERTIES "LIBRARY_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${mi})
  263. endif()
  264. endforeach()
  265. else()
  266. if(ARG_BINARY_DIR)
  267. set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${ARG_BINARY_DIR})
  268. endif()
  269. if(ARG_LIBRARY_DIR)
  270. set_target_properties(${target} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${ARG_LIBRARY_DIR})
  271. endif()
  272. if(module_dir)
  273. set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${module_dir})
  274. endif()
  275. endif()
  276. endfunction()
  277. # If on Windows and building with MSVC, add the resource script containing the
  278. # VERSIONINFO data to the project. This embeds version resource information
  279. # into the output .exe or .dll.
  280. # TODO: Enable for MinGW Windows builds too.
  281. #
  282. function(add_windows_version_resource_file OUT_VAR)
  283. set(sources ${ARGN})
  284. if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
  285. set(resource_file ${LLVM_SOURCE_DIR}/resources/windows_version_resource.rc)
  286. if(EXISTS ${resource_file})
  287. set(sources ${sources} ${resource_file})
  288. source_group("Resource Files" ${resource_file})
  289. set(windows_resource_file ${resource_file} PARENT_SCOPE)
  290. endif()
  291. endif(MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
  292. set(${OUT_VAR} ${sources} PARENT_SCOPE)
  293. endfunction(add_windows_version_resource_file)
  294. # set_windows_version_resource_properties(name resource_file...
  295. # VERSION_MAJOR int
  296. # Optional major version number (defaults to LLVM_VERSION_MAJOR)
  297. # VERSION_MINOR int
  298. # Optional minor version number (defaults to LLVM_VERSION_MINOR)
  299. # VERSION_PATCHLEVEL int
  300. # Optional patchlevel version number (defaults to LLVM_VERSION_PATCH)
  301. # VERSION_STRING
  302. # Optional version string (defaults to PACKAGE_VERSION)
  303. # PRODUCT_NAME
  304. # Optional product name string (defaults to "LLVM")
  305. # )
  306. function(set_windows_version_resource_properties name resource_file)
  307. cmake_parse_arguments(ARG
  308. ""
  309. "VERSION_MAJOR;VERSION_MINOR;VERSION_PATCHLEVEL;VERSION_STRING;PRODUCT_NAME"
  310. ""
  311. ${ARGN})
  312. if (NOT DEFINED ARG_VERSION_MAJOR)
  313. set(ARG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
  314. endif()
  315. if (NOT DEFINED ARG_VERSION_MINOR)
  316. set(ARG_VERSION_MINOR ${LLVM_VERSION_MINOR})
  317. endif()
  318. if (NOT DEFINED ARG_VERSION_PATCHLEVEL)
  319. set(ARG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})
  320. endif()
  321. if (NOT DEFINED ARG_VERSION_STRING)
  322. set(ARG_VERSION_STRING ${PACKAGE_VERSION})
  323. endif()
  324. if (NOT DEFINED ARG_PRODUCT_NAME)
  325. set(ARG_PRODUCT_NAME "LLVM")
  326. endif()
  327. set_property(SOURCE ${resource_file}
  328. PROPERTY COMPILE_FLAGS /nologo)
  329. set_property(SOURCE ${resource_file}
  330. PROPERTY COMPILE_DEFINITIONS
  331. "RC_VERSION_FIELD_1=${ARG_VERSION_MAJOR}"
  332. "RC_VERSION_FIELD_2=${ARG_VERSION_MINOR}"
  333. "RC_VERSION_FIELD_3=${ARG_VERSION_PATCHLEVEL}"
  334. "RC_VERSION_FIELD_4=0"
  335. "RC_FILE_VERSION=\"${ARG_VERSION_STRING}\""
  336. "RC_INTERNAL_NAME=\"${name}\""
  337. "RC_PRODUCT_NAME=\"${ARG_PRODUCT_NAME}\""
  338. "RC_PRODUCT_VERSION=\"${ARG_VERSION_STRING}\"")
  339. endfunction(set_windows_version_resource_properties)
  340. # llvm_add_library(name sources...
  341. # SHARED;STATIC
  342. # STATIC by default w/o BUILD_SHARED_LIBS.
  343. # SHARED by default w/ BUILD_SHARED_LIBS.
  344. # OBJECT
  345. # Also create an OBJECT library target. Default if STATIC && SHARED.
  346. # MODULE
  347. # Target ${name} might not be created on unsupported platforms.
  348. # Check with "if(TARGET ${name})".
  349. # DISABLE_LLVM_LINK_LLVM_DYLIB
  350. # Do not link this library to libLLVM, even if
  351. # LLVM_LINK_LLVM_DYLIB is enabled.
  352. # OUTPUT_NAME name
  353. # Corresponds to OUTPUT_NAME in target properties.
  354. # DEPENDS targets...
  355. # Same semantics as add_dependencies().
  356. # LINK_COMPONENTS components...
  357. # Same as the variable LLVM_LINK_COMPONENTS.
  358. # LINK_LIBS lib_targets...
  359. # Same semantics as target_link_libraries().
  360. # ADDITIONAL_HEADERS
  361. # May specify header files for IDE generators.
  362. # SONAME
  363. # Should set SONAME link flags and create symlinks
  364. # NO_INSTALL_RPATH
  365. # Suppress default RPATH settings in shared libraries.
  366. # PLUGIN_TOOL
  367. # The tool (i.e. cmake target) that this plugin will link against
  368. # )
  369. function(llvm_add_library name)
  370. cmake_parse_arguments(ARG
  371. "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH"
  372. "OUTPUT_NAME;PLUGIN_TOOL;ENTITLEMENTS;BUNDLE_PATH"
  373. "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
  374. ${ARGN})
  375. list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
  376. if(ARG_ADDITIONAL_HEADERS)
  377. # Pass through ADDITIONAL_HEADERS.
  378. set(ARG_ADDITIONAL_HEADERS ADDITIONAL_HEADERS ${ARG_ADDITIONAL_HEADERS})
  379. endif()
  380. if(ARG_OBJLIBS)
  381. set(ALL_FILES ${ARG_OBJLIBS})
  382. else()
  383. llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS})
  384. endif()
  385. if(ARG_MODULE)
  386. if(ARG_SHARED OR ARG_STATIC)
  387. message(WARNING "MODULE with SHARED|STATIC doesn't make sense.")
  388. endif()
  389. # Plugins that link against a tool are allowed even when plugins in general are not
  390. if(NOT LLVM_ENABLE_PLUGINS AND NOT (ARG_PLUGIN_TOOL AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS))
  391. message(STATUS "${name} ignored -- Loadable modules not supported on this platform.")
  392. return()
  393. endif()
  394. else()
  395. if(ARG_PLUGIN_TOOL)
  396. message(WARNING "PLUGIN_TOOL without MODULE doesn't make sense.")
  397. endif()
  398. if(BUILD_SHARED_LIBS AND NOT ARG_STATIC)
  399. set(ARG_SHARED TRUE)
  400. endif()
  401. if(NOT ARG_SHARED)
  402. set(ARG_STATIC TRUE)
  403. endif()
  404. endif()
  405. # Generate objlib
  406. if((ARG_SHARED AND ARG_STATIC) OR ARG_OBJECT)
  407. # Generate an obj library for both targets.
  408. set(obj_name "obj.${name}")
  409. add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL
  410. ${ALL_FILES}
  411. )
  412. llvm_update_compile_flags(${obj_name})
  413. if(CMAKE_GENERATOR STREQUAL "Xcode")
  414. set(DUMMY_FILE ${CMAKE_CURRENT_BINARY_DIR}/Dummy.c)
  415. file(WRITE ${DUMMY_FILE} "// This file intentionally empty\n")
  416. set_property(SOURCE ${DUMMY_FILE} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wno-empty-translation-unit")
  417. endif()
  418. set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>" ${DUMMY_FILE})
  419. # Do add_dependencies(obj) later due to CMake issue 14747.
  420. list(APPEND objlibs ${obj_name})
  421. set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries")
  422. if(ARG_DEPENDS)
  423. add_dependencies(${obj_name} ${ARG_DEPENDS})
  424. endif()
  425. endif()
  426. if(ARG_SHARED AND ARG_STATIC)
  427. # static
  428. set(name_static "${name}_static")
  429. if(ARG_OUTPUT_NAME)
  430. set(output_name OUTPUT_NAME "${ARG_OUTPUT_NAME}")
  431. endif()
  432. # DEPENDS has been appended to LLVM_COMMON_LIBS.
  433. llvm_add_library(${name_static} STATIC
  434. ${output_name}
  435. OBJLIBS ${ALL_FILES} # objlib
  436. LINK_LIBS ${ARG_LINK_LIBS}
  437. LINK_COMPONENTS ${ARG_LINK_COMPONENTS}
  438. )
  439. # FIXME: Add name_static to anywhere in TARGET ${name}'s PROPERTY.
  440. set(ARG_STATIC)
  441. endif()
  442. if(ARG_MODULE)
  443. add_library(${name} MODULE ${ALL_FILES})
  444. elseif(ARG_SHARED)
  445. add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
  446. add_library(${name} SHARED ${ALL_FILES})
  447. else()
  448. add_library(${name} STATIC ${ALL_FILES})
  449. endif()
  450. if(NOT ARG_NO_INSTALL_RPATH)
  451. if(ARG_MODULE OR ARG_SHARED)
  452. llvm_setup_rpath(${name})
  453. endif()
  454. endif()
  455. setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS})
  456. if(DEFINED windows_resource_file)
  457. set_windows_version_resource_properties(${name} ${windows_resource_file})
  458. set(windows_resource_file ${windows_resource_file} PARENT_SCOPE)
  459. endif()
  460. set_output_directory(${name} BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR} LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
  461. # $<TARGET_OBJECTS> doesn't require compile flags.
  462. if(NOT obj_name)
  463. llvm_update_compile_flags(${name})
  464. endif()
  465. add_link_opts( ${name} )
  466. if(ARG_OUTPUT_NAME)
  467. set_target_properties(${name}
  468. PROPERTIES
  469. OUTPUT_NAME ${ARG_OUTPUT_NAME}
  470. )
  471. endif()
  472. if(ARG_MODULE)
  473. set_target_properties(${name} PROPERTIES
  474. PREFIX ""
  475. SUFFIX ${LLVM_PLUGIN_EXT}
  476. )
  477. endif()
  478. if(ARG_SHARED)
  479. if(WIN32)
  480. set_target_properties(${name} PROPERTIES
  481. PREFIX ""
  482. )
  483. endif()
  484. # Set SOVERSION on shared libraries that lack explicit SONAME
  485. # specifier, on *nix systems that are not Darwin.
  486. if(UNIX AND NOT APPLE AND NOT ARG_SONAME)
  487. set_target_properties(${name}
  488. PROPERTIES
  489. # Since 4.0.0, the ABI version is indicated by the major version
  490. SOVERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX}
  491. VERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX})
  492. endif()
  493. endif()
  494. if(ARG_MODULE OR ARG_SHARED)
  495. # Do not add -Dname_EXPORTS to the command-line when building files in this
  496. # target. Doing so is actively harmful for the modules build because it
  497. # creates extra module variants, and not useful because we don't use these
  498. # macros.
  499. set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" )
  500. if (LLVM_EXPORTED_SYMBOL_FILE)
  501. add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
  502. endif()
  503. endif()
  504. if(ARG_SHARED AND UNIX)
  505. if(NOT APPLE AND ARG_SONAME)
  506. get_target_property(output_name ${name} OUTPUT_NAME)
  507. if(${output_name} STREQUAL "output_name-NOTFOUND")
  508. set(output_name ${name})
  509. endif()
  510. set(library_name ${output_name}-${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX})
  511. set(api_name ${output_name}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX})
  512. set_target_properties(${name} PROPERTIES OUTPUT_NAME ${library_name})
  513. llvm_install_library_symlink(${api_name} ${library_name} SHARED
  514. COMPONENT ${name}
  515. ALWAYS_GENERATE)
  516. llvm_install_library_symlink(${output_name} ${library_name} SHARED
  517. COMPONENT ${name}
  518. ALWAYS_GENERATE)
  519. endif()
  520. endif()
  521. if(ARG_MODULE AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS AND ARG_PLUGIN_TOOL AND (WIN32 OR CYGWIN))
  522. # On DLL platforms symbols are imported from the tool by linking against it.
  523. set(llvm_libs ${ARG_PLUGIN_TOOL})
  524. elseif (DEFINED LLVM_LINK_COMPONENTS OR DEFINED ARG_LINK_COMPONENTS)
  525. if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
  526. set(llvm_libs LLVM)
  527. else()
  528. llvm_map_components_to_libnames(llvm_libs
  529. ${ARG_LINK_COMPONENTS}
  530. ${LLVM_LINK_COMPONENTS}
  531. )
  532. endif()
  533. else()
  534. # Components have not been defined explicitly in CMake, so add the
  535. # dependency information for this library as defined by LLVMBuild.
  536. #
  537. # It would be nice to verify that we have the dependencies for this library
  538. # name, but using get_property(... SET) doesn't suffice to determine if a
  539. # property has been set to an empty value.
  540. get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name})
  541. endif()
  542. if(ARG_STATIC)
  543. set(libtype INTERFACE)
  544. else()
  545. # We can use PRIVATE since SO knows its dependent libs.
  546. set(libtype PRIVATE)
  547. endif()
  548. target_link_libraries(${name} ${libtype}
  549. ${ARG_LINK_LIBS}
  550. ${lib_deps}
  551. ${llvm_libs}
  552. )
  553. if(LLVM_COMMON_DEPENDS)
  554. add_dependencies(${name} ${LLVM_COMMON_DEPENDS})
  555. # Add dependencies also to objlibs.
  556. # CMake issue 14747 -- add_dependencies() might be ignored to objlib's user.
  557. foreach(objlib ${objlibs})
  558. add_dependencies(${objlib} ${LLVM_COMMON_DEPENDS})
  559. endforeach()
  560. endif()
  561. if(ARG_SHARED OR ARG_MODULE)
  562. llvm_externalize_debuginfo(${name})
  563. llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH})
  564. endif()
  565. # clang and newer versions of ninja use high-resolutions timestamps,
  566. # but older versions of libtool on Darwin don't, so the archive will
  567. # often get an older timestamp than the last object that was added
  568. # or updated. To fix this, we add a custom command to touch archive
  569. # after it's been built so that ninja won't rebuild it unnecessarily
  570. # the next time it's run.
  571. if(ARG_STATIC AND LLVM_TOUCH_STATIC_LIBRARIES)
  572. add_custom_command(TARGET ${name}
  573. POST_BUILD
  574. COMMAND touch ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}
  575. )
  576. endif()
  577. endfunction()
  578. function(add_llvm_install_targets target)
  579. cmake_parse_arguments(ARG "" "COMPONENT;PREFIX" "DEPENDS" ${ARGN})
  580. if(ARG_COMPONENT)
  581. set(component_option -DCMAKE_INSTALL_COMPONENT="${ARG_COMPONENT}")
  582. endif()
  583. if(ARG_PREFIX)
  584. set(prefix_option -DCMAKE_INSTALL_PREFIX="${ARG_PREFIX}")
  585. endif()
  586. set(file_dependencies)
  587. set(target_dependencies)
  588. foreach(dependency ${ARG_DEPENDS})
  589. if(TARGET ${dependency})
  590. list(APPEND target_dependencies ${dependency})
  591. else()
  592. list(APPEND file_dependencies ${dependency})
  593. endif()
  594. endforeach()
  595. add_custom_target(${target}
  596. DEPENDS ${file_dependencies}
  597. COMMAND "${CMAKE_COMMAND}"
  598. ${component_option}
  599. ${prefix_option}
  600. -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
  601. USES_TERMINAL)
  602. add_custom_target(${target}-stripped
  603. DEPENDS ${file_dependencies}
  604. COMMAND "${CMAKE_COMMAND}"
  605. ${component_option}
  606. ${prefix_option}
  607. -DCMAKE_INSTALL_DO_STRIP=1
  608. -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
  609. USES_TERMINAL)
  610. if(target_dependencies)
  611. add_dependencies(${target} ${target_dependencies})
  612. add_dependencies(${target}-stripped ${target_dependencies})
  613. endif()
  614. endfunction()
  615. macro(add_llvm_library name)
  616. cmake_parse_arguments(ARG
  617. "SHARED;BUILDTREE_ONLY;MODULE;INSTALL_WITH_TOOLCHAIN"
  618. ""
  619. ""
  620. ${ARGN})
  621. if(ARG_MODULE)
  622. llvm_add_library(${name} MODULE ${ARG_UNPARSED_ARGUMENTS})
  623. elseif( BUILD_SHARED_LIBS OR ARG_SHARED )
  624. llvm_add_library(${name} SHARED ${ARG_UNPARSED_ARGUMENTS})
  625. else()
  626. llvm_add_library(${name} ${ARG_UNPARSED_ARGUMENTS})
  627. endif()
  628. # Libraries that are meant to only be exposed via the build tree only are
  629. # never installed and are only exported as a target in the special build tree
  630. # config file.
  631. if (NOT ARG_BUILDTREE_ONLY AND NOT ARG_MODULE)
  632. set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} )
  633. set(in_llvm_libs YES)
  634. endif()
  635. if (ARG_MODULE AND NOT TARGET ${name})
  636. # Add empty "phony" target
  637. add_custom_target(${name})
  638. elseif( EXCLUDE_FROM_ALL )
  639. set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
  640. elseif(ARG_BUILDTREE_ONLY)
  641. set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name})
  642. else()
  643. if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ARG_INSTALL_WITH_TOOLCHAIN)
  644. set(export_to_llvmexports)
  645. if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
  646. (in_llvm_libs AND "llvm-libraries" IN_LIST LLVM_DISTRIBUTION_COMPONENTS) OR
  647. NOT LLVM_DISTRIBUTION_COMPONENTS)
  648. set(export_to_llvmexports EXPORT LLVMExports)
  649. set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True)
  650. endif()
  651. install(TARGETS ${name}
  652. ${export_to_llvmexports}
  653. LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
  654. ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
  655. RUNTIME DESTINATION bin COMPONENT ${name})
  656. if (NOT LLVM_ENABLE_IDE)
  657. add_llvm_install_targets(install-${name}
  658. DEPENDS ${name}
  659. COMPONENT ${name})
  660. endif()
  661. endif()
  662. set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
  663. endif()
  664. if (ARG_MODULE)
  665. set_target_properties(${name} PROPERTIES FOLDER "Loadable modules")
  666. else()
  667. set_target_properties(${name} PROPERTIES FOLDER "Libraries")
  668. endif()
  669. endmacro(add_llvm_library name)
  670. macro(add_llvm_executable name)
  671. cmake_parse_arguments(ARG
  672. "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH"
  673. "ENTITLEMENTS;BUNDLE_PATH"
  674. "DEPENDS"
  675. ${ARGN})
  676. llvm_process_sources( ALL_FILES ${ARG_UNPARSED_ARGUMENTS} )
  677. list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
  678. # Generate objlib
  679. if(LLVM_ENABLE_OBJLIB)
  680. # Generate an obj library for both targets.
  681. set(obj_name "obj.${name}")
  682. add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL
  683. ${ALL_FILES}
  684. )
  685. llvm_update_compile_flags(${obj_name})
  686. set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>")
  687. set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries")
  688. endif()
  689. add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
  690. if(XCODE)
  691. # Note: the dummy.cpp source file provides no definitions. However,
  692. # it forces Xcode to properly link the static library.
  693. list(APPEND ALL_FILES "${LLVM_MAIN_SRC_DIR}/cmake/dummy.cpp")
  694. endif()
  695. if( EXCLUDE_FROM_ALL )
  696. add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES})
  697. else()
  698. add_executable(${name} ${ALL_FILES})
  699. endif()
  700. setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS})
  701. if(NOT ARG_NO_INSTALL_RPATH)
  702. llvm_setup_rpath(${name})
  703. endif()
  704. if(DEFINED windows_resource_file)
  705. set_windows_version_resource_properties(${name} ${windows_resource_file})
  706. endif()
  707. # $<TARGET_OBJECTS> doesn't require compile flags.
  708. if(NOT LLVM_ENABLE_OBJLIB)
  709. llvm_update_compile_flags(${name})
  710. endif()
  711. add_link_opts( ${name} )
  712. # Do not add -Dname_EXPORTS to the command-line when building files in this
  713. # target. Doing so is actively harmful for the modules build because it
  714. # creates extra module variants, and not useful because we don't use these
  715. # macros.
  716. set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" )
  717. if (LLVM_EXPORTED_SYMBOL_FILE)
  718. add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
  719. endif(LLVM_EXPORTED_SYMBOL_FILE)
  720. if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
  721. set(USE_SHARED USE_SHARED)
  722. endif()
  723. set(EXCLUDE_FROM_ALL OFF)
  724. set_output_directory(${name} BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR} LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
  725. llvm_config( ${name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} )
  726. if( LLVM_COMMON_DEPENDS )
  727. add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
  728. endif( LLVM_COMMON_DEPENDS )
  729. if(NOT ARG_IGNORE_EXTERNALIZE_DEBUGINFO)
  730. llvm_externalize_debuginfo(${name})
  731. endif()
  732. if (LLVM_PTHREAD_LIB)
  733. # libpthreads overrides some standard library symbols, so main
  734. # executable must be linked with it in order to provide consistent
  735. # API for all shared libaries loaded by this executable.
  736. target_link_libraries(${name} PRIVATE ${LLVM_PTHREAD_LIB})
  737. endif()
  738. llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH})
  739. endmacro(add_llvm_executable name)
  740. function(export_executable_symbols target)
  741. if (LLVM_EXPORTED_SYMBOL_FILE)
  742. # The symbol file should contain the symbols we want the executable to
  743. # export
  744. set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1)
  745. elseif (LLVM_EXPORT_SYMBOLS_FOR_PLUGINS)
  746. # Extract the symbols to export from the static libraries that the
  747. # executable links against.
  748. set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1)
  749. set(exported_symbol_file ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${target}.symbols)
  750. # We need to consider not just the direct link dependencies, but also the
  751. # transitive link dependencies. Do this by starting with the set of direct
  752. # dependencies, then the dependencies of those dependencies, and so on.
  753. get_target_property(new_libs ${target} LINK_LIBRARIES)
  754. set(link_libs ${new_libs})
  755. while(NOT "${new_libs}" STREQUAL "")
  756. foreach(lib ${new_libs})
  757. if(TARGET ${lib})
  758. get_target_property(lib_type ${lib} TYPE)
  759. if("${lib_type}" STREQUAL "STATIC_LIBRARY")
  760. list(APPEND static_libs ${lib})
  761. else()
  762. list(APPEND other_libs ${lib})
  763. endif()
  764. get_target_property(transitive_libs ${lib} INTERFACE_LINK_LIBRARIES)
  765. foreach(transitive_lib ${transitive_libs})
  766. list(FIND link_libs ${transitive_lib} idx)
  767. if(TARGET ${transitive_lib} AND idx EQUAL -1)
  768. list(APPEND newer_libs ${transitive_lib})
  769. list(APPEND link_libs ${transitive_lib})
  770. endif()
  771. endforeach(transitive_lib)
  772. endif()
  773. endforeach(lib)
  774. set(new_libs ${newer_libs})
  775. set(newer_libs "")
  776. endwhile()
  777. if (MSVC)
  778. set(mangling microsoft)
  779. else()
  780. set(mangling itanium)
  781. endif()
  782. add_custom_command(OUTPUT ${exported_symbol_file}
  783. COMMAND ${PYTHON_EXECUTABLE} ${LLVM_MAIN_SRC_DIR}/utils/extract_symbols.py --mangling=${mangling} ${static_libs} -o ${exported_symbol_file}
  784. WORKING_DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR}
  785. DEPENDS ${LLVM_MAIN_SRC_DIR}/utils/extract_symbols.py ${static_libs}
  786. VERBATIM
  787. COMMENT "Generating export list for ${target}")
  788. add_llvm_symbol_exports( ${target} ${exported_symbol_file} )
  789. # If something links against this executable then we want a
  790. # transitive link against only the libraries whose symbols
  791. # we aren't exporting.
  792. set_target_properties(${target} PROPERTIES INTERFACE_LINK_LIBRARIES "${other_libs}")
  793. # The default import library suffix that cmake uses for cygwin/mingw is
  794. # ".dll.a", but for clang.exe that causes a collision with libclang.dll,
  795. # where the import libraries of both get named libclang.dll.a. Use a suffix
  796. # of ".exe.a" to avoid this.
  797. if(CYGWIN OR MINGW)
  798. set_target_properties(${target} PROPERTIES IMPORT_SUFFIX ".exe.a")
  799. endif()
  800. elseif(NOT (WIN32 OR CYGWIN))
  801. # On Windows auto-exporting everything doesn't work because of the limit on
  802. # the size of the exported symbol table, but on other platforms we can do
  803. # it without any trouble.
  804. set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1)
  805. if (APPLE)
  806. set_property(TARGET ${target} APPEND_STRING PROPERTY
  807. LINK_FLAGS " -rdynamic")
  808. endif()
  809. endif()
  810. endfunction()
  811. if(NOT LLVM_TOOLCHAIN_TOOLS)
  812. set (LLVM_TOOLCHAIN_TOOLS
  813. llvm-ar
  814. llvm-ranlib
  815. llvm-lib
  816. llvm-nm
  817. llvm-objcopy
  818. llvm-objdump
  819. llvm-rc
  820. llvm-profdata
  821. llvm-symbolizer
  822. )
  823. endif()
  824. macro(add_llvm_tool name)
  825. if( NOT LLVM_BUILD_TOOLS )
  826. set(EXCLUDE_FROM_ALL ON)
  827. endif()
  828. add_llvm_executable(${name} ${ARGN})
  829. if ( ${name} IN_LIST LLVM_TOOLCHAIN_TOOLS OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
  830. if( LLVM_BUILD_TOOLS )
  831. set(export_to_llvmexports)
  832. if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
  833. NOT LLVM_DISTRIBUTION_COMPONENTS)
  834. set(export_to_llvmexports EXPORT LLVMExports)
  835. set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True)
  836. endif()
  837. install(TARGETS ${name}
  838. ${export_to_llvmexports}
  839. RUNTIME DESTINATION ${LLVM_TOOLS_INSTALL_DIR}
  840. COMPONENT ${name})
  841. if (NOT LLVM_ENABLE_IDE)
  842. add_llvm_install_targets(install-${name}
  843. DEPENDS ${name}
  844. COMPONENT ${name})
  845. endif()
  846. endif()
  847. endif()
  848. if( LLVM_BUILD_TOOLS )
  849. set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
  850. endif()
  851. set_target_properties(${name} PROPERTIES FOLDER "Tools")
  852. endmacro(add_llvm_tool name)
  853. macro(add_llvm_example name)
  854. if( NOT LLVM_BUILD_EXAMPLES )
  855. set(EXCLUDE_FROM_ALL ON)
  856. endif()
  857. add_llvm_executable(${name} ${ARGN})
  858. if( LLVM_BUILD_EXAMPLES )
  859. install(TARGETS ${name} RUNTIME DESTINATION examples)
  860. endif()
  861. set_target_properties(${name} PROPERTIES FOLDER "Examples")
  862. endmacro(add_llvm_example name)
  863. # This is a macro that is used to create targets for executables that are needed
  864. # for development, but that are not intended to be installed by default.
  865. macro(add_llvm_utility name)
  866. if ( NOT LLVM_BUILD_UTILS )
  867. set(EXCLUDE_FROM_ALL ON)
  868. endif()
  869. add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN})
  870. set_target_properties(${name} PROPERTIES FOLDER "Utils")
  871. if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
  872. if (LLVM_INSTALL_UTILS AND LLVM_BUILD_UTILS)
  873. set(export_to_llvmexports)
  874. if (${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
  875. NOT LLVM_DISTRIBUTION_COMPONENTS)
  876. set(export_to_llvmexports EXPORT LLVMExports)
  877. set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True)
  878. endif()
  879. install(TARGETS ${name}
  880. ${export_to_llvmexports}
  881. RUNTIME DESTINATION ${LLVM_UTILS_INSTALL_DIR}
  882. COMPONENT ${name})
  883. if (NOT LLVM_ENABLE_IDE)
  884. add_llvm_install_targets(install-${name}
  885. DEPENDS ${name}
  886. COMPONENT ${name})
  887. endif()
  888. set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
  889. elseif(LLVM_BUILD_UTILS)
  890. set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name})
  891. endif()
  892. endif()
  893. endmacro(add_llvm_utility name)
  894. macro(add_llvm_fuzzer name)
  895. cmake_parse_arguments(ARG "" "DUMMY_MAIN" "" ${ARGN})
  896. if( LLVM_LIB_FUZZING_ENGINE )
  897. set(LLVM_OPTIONAL_SOURCES ${ARG_DUMMY_MAIN})
  898. add_llvm_executable(${name} ${ARG_UNPARSED_ARGUMENTS})
  899. target_link_libraries(${name} PRIVATE ${LLVM_LIB_FUZZING_ENGINE})
  900. set_target_properties(${name} PROPERTIES FOLDER "Fuzzers")
  901. elseif( LLVM_USE_SANITIZE_COVERAGE )
  902. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer")
  903. set(LLVM_OPTIONAL_SOURCES ${ARG_DUMMY_MAIN})
  904. add_llvm_executable(${name} ${ARG_UNPARSED_ARGUMENTS})
  905. set_target_properties(${name} PROPERTIES FOLDER "Fuzzers")
  906. elseif( ARG_DUMMY_MAIN )
  907. add_llvm_executable(${name} ${ARG_DUMMY_MAIN} ${ARG_UNPARSED_ARGUMENTS})
  908. set_target_properties(${name} PROPERTIES FOLDER "Fuzzers")
  909. endif()
  910. endmacro()
  911. macro(add_llvm_target target_name)
  912. include_directories(BEFORE
  913. ${CMAKE_CURRENT_BINARY_DIR}
  914. ${CMAKE_CURRENT_SOURCE_DIR})
  915. add_llvm_library(LLVM${target_name} ${ARGN})
  916. set( CURRENT_LLVM_TARGET LLVM${target_name} )
  917. endmacro(add_llvm_target)
  918. function(canonicalize_tool_name name output)
  919. string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" nameStrip ${name})
  920. string(REPLACE "-" "_" nameUNDERSCORE ${nameStrip})
  921. string(TOUPPER ${nameUNDERSCORE} nameUPPER)
  922. set(${output} "${nameUPPER}" PARENT_SCOPE)
  923. endfunction(canonicalize_tool_name)
  924. # Custom add_subdirectory wrapper
  925. # Takes in a project name (i.e. LLVM), the subdirectory name, and an optional
  926. # path if it differs from the name.
  927. function(add_llvm_subdirectory project type name)
  928. set(add_llvm_external_dir "${ARGN}")
  929. if("${add_llvm_external_dir}" STREQUAL "")
  930. set(add_llvm_external_dir ${name})
  931. endif()
  932. canonicalize_tool_name(${name} nameUPPER)
  933. set(canonical_full_name ${project}_${type}_${nameUPPER})
  934. get_property(already_processed GLOBAL PROPERTY ${canonical_full_name}_PROCESSED)
  935. if(already_processed)
  936. return()
  937. endif()
  938. set_property(GLOBAL PROPERTY ${canonical_full_name}_PROCESSED YES)
  939. if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}/CMakeLists.txt)
  940. # Treat it as in-tree subproject.
  941. option(${canonical_full_name}_BUILD
  942. "Whether to build ${name} as part of ${project}" On)
  943. mark_as_advanced(${project}_${type}_${name}_BUILD)
  944. if(${canonical_full_name}_BUILD)
  945. add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir} ${add_llvm_external_dir})
  946. endif()
  947. else()
  948. set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR
  949. "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}"
  950. CACHE PATH "Path to ${name} source directory")
  951. set(${canonical_full_name}_BUILD_DEFAULT ON)
  952. if(NOT LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR OR NOT EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR})
  953. set(${canonical_full_name}_BUILD_DEFAULT OFF)
  954. endif()
  955. if("${LLVM_EXTERNAL_${nameUPPER}_BUILD}" STREQUAL "OFF")
  956. set(${canonical_full_name}_BUILD_DEFAULT OFF)
  957. endif()
  958. option(${canonical_full_name}_BUILD
  959. "Whether to build ${name} as part of LLVM"
  960. ${${canonical_full_name}_BUILD_DEFAULT})
  961. if (${canonical_full_name}_BUILD)
  962. if(EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR})
  963. add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir})
  964. elseif(NOT "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}" STREQUAL "")
  965. message(WARNING "Nonexistent directory for ${name}: ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}")
  966. endif()
  967. endif()
  968. endif()
  969. endfunction()
  970. # Add external project that may want to be built as part of llvm such as Clang,
  971. # lld, and Polly. This adds two options. One for the source directory of the
  972. # project, which defaults to ${CMAKE_CURRENT_SOURCE_DIR}/${name}. Another to
  973. # enable or disable building it with everything else.
  974. # Additional parameter can be specified as the name of directory.
  975. macro(add_llvm_external_project name)
  976. add_llvm_subdirectory(LLVM TOOL ${name} ${ARGN})
  977. endmacro()
  978. macro(add_llvm_tool_subdirectory name)
  979. add_llvm_external_project(${name})
  980. endmacro(add_llvm_tool_subdirectory)
  981. function(get_project_name_from_src_var var output)
  982. string(REGEX MATCH "LLVM_EXTERNAL_(.*)_SOURCE_DIR"
  983. MACHED_TOOL "${var}")
  984. if(MACHED_TOOL)
  985. set(${output} ${CMAKE_MATCH_1} PARENT_SCOPE)
  986. else()
  987. set(${output} PARENT_SCOPE)
  988. endif()
  989. endfunction()
  990. function(create_subdirectory_options project type)
  991. file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*")
  992. foreach(dir ${sub-dirs})
  993. if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/CMakeLists.txt")
  994. canonicalize_tool_name(${dir} name)
  995. option(${project}_${type}_${name}_BUILD
  996. "Whether to build ${name} as part of ${project}" On)
  997. mark_as_advanced(${project}_${type}_${name}_BUILD)
  998. endif()
  999. endforeach()
  1000. endfunction(create_subdirectory_options)
  1001. function(create_llvm_tool_options)
  1002. create_subdirectory_options(LLVM TOOL)
  1003. endfunction(create_llvm_tool_options)
  1004. function(llvm_add_implicit_projects project)
  1005. set(list_of_implicit_subdirs "")
  1006. file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*")
  1007. foreach(dir ${sub-dirs})
  1008. if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/CMakeLists.txt")
  1009. canonicalize_tool_name(${dir} name)
  1010. if (${project}_TOOL_${name}_BUILD)
  1011. get_filename_component(fn "${dir}" NAME)
  1012. list(APPEND list_of_implicit_subdirs "${fn}")
  1013. endif()
  1014. endif()
  1015. endforeach()
  1016. foreach(external_proj ${list_of_implicit_subdirs})
  1017. add_llvm_subdirectory(${project} TOOL "${external_proj}" ${ARGN})
  1018. endforeach()
  1019. endfunction(llvm_add_implicit_projects)
  1020. function(add_llvm_implicit_projects)
  1021. llvm_add_implicit_projects(LLVM)
  1022. endfunction(add_llvm_implicit_projects)
  1023. # Generic support for adding a unittest.
  1024. function(add_unittest test_suite test_name)
  1025. if( NOT LLVM_BUILD_TESTS )
  1026. set(EXCLUDE_FROM_ALL ON)
  1027. endif()
  1028. # Our current version of gtest does not properly recognize C++11 support
  1029. # with MSVC, so it falls back to tr1 / experimental classes. Since LLVM
  1030. # itself requires C++11, we can safely force it on unconditionally so that
  1031. # we don't have to fight with the buggy gtest check.
  1032. add_definitions(-DGTEST_LANG_CXX11=1)
  1033. add_definitions(-DGTEST_HAS_TR1_TUPLE=0)
  1034. include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include)
  1035. include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googlemock/include)
  1036. if (NOT LLVM_ENABLE_THREADS)
  1037. list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_PTHREAD=0)
  1038. endif ()
  1039. if (SUPPORTS_VARIADIC_MACROS_FLAG)
  1040. list(APPEND LLVM_COMPILE_FLAGS "-Wno-variadic-macros")
  1041. endif ()
  1042. # Some parts of gtest rely on this GNU extension, don't warn on it.
  1043. if(SUPPORTS_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS_FLAG)
  1044. list(APPEND LLVM_COMPILE_FLAGS "-Wno-gnu-zero-variadic-macro-arguments")
  1045. endif()
  1046. set(LLVM_REQUIRES_RTTI OFF)
  1047. list(APPEND LLVM_LINK_COMPONENTS Support) # gtest needs it for raw_ostream
  1048. add_llvm_executable(${test_name} IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH ${ARGN})
  1049. set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
  1050. set_output_directory(${test_name} BINARY_DIR ${outdir} LIBRARY_DIR ${outdir})
  1051. # libpthreads overrides some standard library symbols, so main
  1052. # executable must be linked with it in order to provide consistent
  1053. # API for all shared libaries loaded by this executable.
  1054. target_link_libraries(${test_name} PRIVATE gtest_main gtest ${LLVM_PTHREAD_LIB})
  1055. add_dependencies(${test_suite} ${test_name})
  1056. get_target_property(test_suite_folder ${test_suite} FOLDER)
  1057. if (NOT ${test_suite_folder} STREQUAL "NOTFOUND")
  1058. set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}")
  1059. endif ()
  1060. endfunction()
  1061. # Use for test binaries that call llvm::getInputFileDirectory(). Use of this
  1062. # is discouraged.
  1063. function(add_unittest_with_input_files test_suite test_name)
  1064. set(LLVM_UNITTEST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
  1065. configure_file(
  1066. ${LLVM_MAIN_SRC_DIR}/unittests/unittest.cfg.in
  1067. ${CMAKE_CURRENT_BINARY_DIR}/llvm.srcdir.txt)
  1068. add_unittest(${test_suite} ${test_name} ${ARGN})
  1069. endfunction()
  1070. # Generic support for adding a benchmark.
  1071. function(add_benchmark benchmark_name)
  1072. if( NOT LLVM_BUILD_BENCHMARKS )
  1073. set(EXCLUDE_FROM_ALL ON)
  1074. endif()
  1075. add_llvm_executable(${benchmark_name} IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH ${ARGN})
  1076. set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
  1077. set_output_directory(${benchmark_name} BINARY_DIR ${outdir} LIBRARY_DIR ${outdir})
  1078. set_property(TARGET ${benchmark_name} PROPERTY FOLDER "Utils")
  1079. target_link_libraries(${benchmark_name} PRIVATE benchmark)
  1080. endfunction()
  1081. function(llvm_add_go_executable binary pkgpath)
  1082. cmake_parse_arguments(ARG "ALL" "" "DEPENDS;GOFLAGS" ${ARGN})
  1083. if(LLVM_BINDINGS MATCHES "go")
  1084. # FIXME: This should depend only on the libraries Go needs.
  1085. get_property(llvmlibs GLOBAL PROPERTY LLVM_LIBS)
  1086. set(binpath ${CMAKE_BINARY_DIR}/bin/${binary}${CMAKE_EXECUTABLE_SUFFIX})
  1087. set(cc "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}")
  1088. set(cxx "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}")
  1089. set(cppflags "")
  1090. get_property(include_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
  1091. foreach(d ${include_dirs})
  1092. set(cppflags "${cppflags} -I${d}")
  1093. endforeach(d)
  1094. set(ldflags "${CMAKE_EXE_LINKER_FLAGS}")
  1095. add_custom_command(OUTPUT ${binpath}
  1096. COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "go=${GO_EXECUTABLE}" "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}" "packages=${LLVM_GO_PACKAGES}"
  1097. ${ARG_GOFLAGS} build -o ${binpath} ${pkgpath}
  1098. DEPENDS llvm-config ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX}
  1099. ${llvmlibs} ${ARG_DEPENDS}
  1100. COMMENT "Building Go executable ${binary}"
  1101. VERBATIM)
  1102. if (ARG_ALL)
  1103. add_custom_target(${binary} ALL DEPENDS ${binpath})
  1104. else()
  1105. add_custom_target(${binary} DEPENDS ${binpath})
  1106. endif()
  1107. endif()
  1108. endfunction()
  1109. # This function canonicalize the CMake variables passed by names
  1110. # from CMake boolean to 0/1 suitable for passing into Python or C++,
  1111. # in place.
  1112. function(llvm_canonicalize_cmake_booleans)
  1113. foreach(var ${ARGN})
  1114. if(${var})
  1115. set(${var} 1 PARENT_SCOPE)
  1116. else()
  1117. set(${var} 0 PARENT_SCOPE)
  1118. endif()
  1119. endforeach()
  1120. endfunction(llvm_canonicalize_cmake_booleans)
  1121. macro(set_llvm_build_mode)
  1122. # Configuration-time: See Unit/lit.site.cfg.in
  1123. if (CMAKE_CFG_INTDIR STREQUAL ".")
  1124. set(LLVM_BUILD_MODE ".")
  1125. else ()
  1126. set(LLVM_BUILD_MODE "%(build_mode)s")
  1127. endif ()
  1128. endmacro()
  1129. # This function provides an automatic way to 'configure'-like generate a file
  1130. # based on a set of common and custom variables, specifically targeting the
  1131. # variables needed for the 'lit.site.cfg' files. This function bundles the
  1132. # common variables that any Lit instance is likely to need, and custom
  1133. # variables can be passed in.
  1134. function(configure_lit_site_cfg site_in site_out)
  1135. cmake_parse_arguments(ARG "" "" "MAIN_CONFIG;OUTPUT_MAPPING" ${ARGN})
  1136. if ("${ARG_MAIN_CONFIG}" STREQUAL "")
  1137. get_filename_component(INPUT_DIR ${site_in} DIRECTORY)
  1138. set(ARG_MAIN_CONFIG "${INPUT_DIR}/lit.cfg")
  1139. endif()
  1140. if ("${ARG_OUTPUT_MAPPING}" STREQUAL "")
  1141. set(ARG_OUTPUT_MAPPING "${site_out}")
  1142. endif()
  1143. foreach(c ${LLVM_TARGETS_TO_BUILD})
  1144. set(TARGETS_BUILT "${TARGETS_BUILT} ${c}")
  1145. endforeach(c)
  1146. set(TARGETS_TO_BUILD ${TARGETS_BUILT})
  1147. set(SHLIBEXT "${LTDL_SHLIB_EXT}")
  1148. set_llvm_build_mode()
  1149. # They below might not be the build tree but provided binary tree.
  1150. set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR})
  1151. set(LLVM_BINARY_DIR ${LLVM_BINARY_DIR})
  1152. string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}")
  1153. string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_LIBS_DIR "${LLVM_LIBRARY_DIR}")
  1154. # SHLIBDIR points the build tree.
  1155. string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" SHLIBDIR "${LLVM_SHLIB_OUTPUT_INTDIR}")
  1156. set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
  1157. # FIXME: "ENABLE_SHARED" doesn't make sense, since it is used just for
  1158. # plugins. We may rename it.
  1159. if(LLVM_ENABLE_PLUGINS)
  1160. set(ENABLE_SHARED "1")
  1161. else()
  1162. set(ENABLE_SHARED "0")
  1163. endif()
  1164. if(LLVM_ENABLE_ASSERTIONS AND NOT MSVC_IDE)
  1165. set(ENABLE_ASSERTIONS "1")
  1166. else()
  1167. set(ENABLE_ASSERTIONS "0")
  1168. endif()
  1169. set(HOST_OS ${CMAKE_SYSTEM_NAME})
  1170. set(HOST_ARCH ${CMAKE_SYSTEM_PROCESSOR})
  1171. set(HOST_CC "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}")
  1172. set(HOST_CXX "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}")
  1173. set(HOST_LDFLAGS "${CMAKE_EXE_LINKER_FLAGS}")
  1174. set(LIT_SITE_CFG_IN_HEADER "## Autogenerated from ${site_in}\n## Do not edit!")
  1175. # Override config_target_triple (and the env)
  1176. if(LLVM_TARGET_TRIPLE_ENV)
  1177. # This is expanded into the heading.
  1178. string(CONCAT LIT_SITE_CFG_IN_HEADER "${LIT_SITE_CFG_IN_HEADER}\n\n"
  1179. "import os\n"
  1180. "target_env = \"${LLVM_TARGET_TRIPLE_ENV}\"\n"
  1181. "config.target_triple = config.environment[target_env] = os.environ.get(target_env, \"${TARGET_TRIPLE}\")\n"
  1182. )
  1183. # This is expanded to; config.target_triple = ""+config.target_triple+""
  1184. set(TARGET_TRIPLE "\"+config.target_triple+\"")
  1185. endif()
  1186. configure_file(${site_in} ${site_out} @ONLY)
  1187. if (EXISTS "${ARG_MAIN_CONFIG}")
  1188. set(PYTHON_STATEMENT "map_config('${ARG_MAIN_CONFIG}', '${site_out}')")
  1189. get_property(LLVM_LIT_CONFIG_MAP GLOBAL PROPERTY LLVM_LIT_CONFIG_MAP)
  1190. set(LLVM_LIT_CONFIG_MAP "${LLVM_LIT_CONFIG_MAP}\n${PYTHON_STATEMENT}")
  1191. set_property(GLOBAL PROPERTY LLVM_LIT_CONFIG_MAP ${LLVM_LIT_CONFIG_MAP})
  1192. endif()
  1193. endfunction()
  1194. function(dump_all_cmake_variables)
  1195. get_cmake_property(_variableNames VARIABLES)
  1196. foreach (_variableName ${_variableNames})
  1197. message(STATUS "${_variableName}=${${_variableName}}")
  1198. endforeach()
  1199. endfunction()
  1200. function(get_llvm_lit_path base_dir file_name)
  1201. cmake_parse_arguments(ARG "ALLOW_EXTERNAL" "" "" ${ARGN})
  1202. if (ARG_ALLOW_EXTERNAL)
  1203. set (LLVM_EXTERNAL_LIT "" CACHE STRING "Command used to spawn lit")
  1204. if ("${LLVM_EXTERNAL_LIT}" STREQUAL "")
  1205. set(LLVM_EXTERNAL_LIT "${LLVM_DEFAULT_EXTERNAL_LIT}")
  1206. endif()
  1207. if (NOT "${LLVM_EXTERNAL_LIT}" STREQUAL "")
  1208. if (EXISTS ${LLVM_EXTERNAL_LIT})
  1209. get_filename_component(LIT_FILE_NAME ${LLVM_EXTERNAL_LIT} NAME)
  1210. get_filename_component(LIT_BASE_DIR ${LLVM_EXTERNAL_LIT} DIRECTORY)
  1211. set(${file_name} ${LIT_FILE_NAME} PARENT_SCOPE)
  1212. set(${base_dir} ${LIT_BASE_DIR} PARENT_SCOPE)
  1213. return()
  1214. else()
  1215. message(WARNING "LLVM_EXTERNAL_LIT set to ${LLVM_EXTERNAL_LIT}, but the path does not exist.")
  1216. endif()
  1217. endif()
  1218. endif()
  1219. set(lit_file_name "llvm-lit")
  1220. if (CMAKE_HOST_WIN32 AND NOT CYGWIN)
  1221. # llvm-lit needs suffix.py for multiprocess to find a main module.
  1222. set(lit_file_name "${lit_file_name}.py")
  1223. endif ()
  1224. set(${file_name} ${lit_file_name} PARENT_SCOPE)
  1225. get_property(LLVM_LIT_BASE_DIR GLOBAL PROPERTY LLVM_LIT_BASE_DIR)
  1226. if (NOT "${LLVM_LIT_BASE_DIR}" STREQUAL "")
  1227. set(${base_dir} ${LLVM_LIT_BASE_DIR} PARENT_SCOPE)
  1228. endif()
  1229. # Allow individual projects to provide an override
  1230. if (NOT "${LLVM_LIT_OUTPUT_DIR}" STREQUAL "")
  1231. set(LLVM_LIT_BASE_DIR ${LLVM_LIT_OUTPUT_DIR})
  1232. elseif(NOT "${LLVM_RUNTIME_OUTPUT_INTDIR}" STREQUAL "")
  1233. set(LLVM_LIT_BASE_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
  1234. else()
  1235. set(LLVM_LIT_BASE_DIR "")
  1236. endif()
  1237. # Cache this so we don't have to do it again and have subsequent calls
  1238. # potentially disagree on the value.
  1239. set_property(GLOBAL PROPERTY LLVM_LIT_BASE_DIR ${LLVM_LIT_BASE_DIR})
  1240. set(${base_dir} ${LLVM_LIT_BASE_DIR} PARENT_SCOPE)
  1241. endfunction()
  1242. # A raw function to create a lit target. This is used to implement the testuite
  1243. # management functions.
  1244. function(add_lit_target target comment)
  1245. cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
  1246. set(LIT_ARGS "${ARG_ARGS} ${LLVM_LIT_ARGS}")
  1247. separate_arguments(LIT_ARGS)
  1248. if (NOT CMAKE_CFG_INTDIR STREQUAL ".")
  1249. list(APPEND LIT_ARGS --param build_mode=${CMAKE_CFG_INTDIR})
  1250. endif ()
  1251. # Get the path to the lit to *run* tests with. This can be overriden by
  1252. # the user by specifying -DLLVM_EXTERNAL_LIT=<path-to-lit.py>
  1253. get_llvm_lit_path(
  1254. lit_base_dir
  1255. lit_file_name
  1256. ALLOW_EXTERNAL
  1257. )
  1258. set(LIT_COMMAND "${PYTHON_EXECUTABLE};${lit_base_dir}/${lit_file_name}")
  1259. list(APPEND LIT_COMMAND ${LIT_ARGS})
  1260. foreach(param ${ARG_PARAMS})
  1261. list(APPEND LIT_COMMAND --param ${param})
  1262. endforeach()
  1263. if (ARG_UNPARSED_ARGUMENTS)
  1264. add_custom_target(${target}
  1265. COMMAND ${LIT_COMMAND} ${ARG_UNPARSED_ARGUMENTS}
  1266. COMMENT "${comment}"
  1267. USES_TERMINAL
  1268. )
  1269. else()
  1270. add_custom_target(${target}
  1271. COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no tools built.")
  1272. message(STATUS "${target} does nothing.")
  1273. endif()
  1274. if (ARG_DEPENDS)
  1275. add_dependencies(${target} ${ARG_DEPENDS})
  1276. endif()
  1277. # Tests should be excluded from "Build Solution".
  1278. set_target_properties(${target} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON)
  1279. endfunction()
  1280. # A function to add a set of lit test suites to be driven through 'check-*' targets.
  1281. function(add_lit_testsuite target comment)
  1282. cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
  1283. # EXCLUDE_FROM_ALL excludes the test ${target} out of check-all.
  1284. if(NOT EXCLUDE_FROM_ALL)
  1285. # Register the testsuites, params and depends for the global check rule.
  1286. set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${ARG_UNPARSED_ARGUMENTS})
  1287. set_property(GLOBAL APPEND PROPERTY LLVM_LIT_PARAMS ${ARG_PARAMS})
  1288. set_property(GLOBAL APPEND PROPERTY LLVM_LIT_DEPENDS ${ARG_DEPENDS})
  1289. set_property(GLOBAL APPEND PROPERTY LLVM_LIT_EXTRA_ARGS ${ARG_ARGS})
  1290. endif()
  1291. # Produce a specific suffixed check rule.
  1292. add_lit_target(${target} ${comment}
  1293. ${ARG_UNPARSED_ARGUMENTS}
  1294. PARAMS ${ARG_PARAMS}
  1295. DEPENDS ${ARG_DEPENDS}
  1296. ARGS ${ARG_ARGS}
  1297. )
  1298. endfunction()
  1299. function(add_lit_testsuites project directory)
  1300. if (NOT LLVM_ENABLE_IDE)
  1301. cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
  1302. # Search recursively for test directories by assuming anything not
  1303. # in a directory called Inputs contains tests.
  1304. file(GLOB_RECURSE to_process LIST_DIRECTORIES true ${directory}/*)
  1305. foreach(lit_suite ${to_process})
  1306. if(NOT IS_DIRECTORY ${lit_suite})
  1307. continue()
  1308. endif()
  1309. string(FIND ${lit_suite} Inputs is_inputs)
  1310. string(FIND ${lit_suite} Output is_output)
  1311. if (NOT (is_inputs EQUAL -1 AND is_output EQUAL -1))
  1312. continue()
  1313. endif()
  1314. # Create a check- target for the directory.
  1315. string(REPLACE ${directory} "" name_slash ${lit_suite})
  1316. if (name_slash)
  1317. string(REPLACE "/" "-" name_slash ${name_slash})
  1318. string(REPLACE "\\" "-" name_dashes ${name_slash})
  1319. string(TOLOWER "${project}${name_dashes}" name_var)
  1320. add_lit_target("check-${name_var}" "Running lit suite ${lit_suite}"
  1321. ${lit_suite}
  1322. PARAMS ${ARG_PARAMS}
  1323. DEPENDS ${ARG_DEPENDS}
  1324. ARGS ${ARG_ARGS}
  1325. )
  1326. endif()
  1327. endforeach()
  1328. endif()
  1329. endfunction()
  1330. function(llvm_install_library_symlink name dest type)
  1331. cmake_parse_arguments(ARG "ALWAYS_GENERATE" "COMPONENT" "" ${ARGN})
  1332. foreach(path ${CMAKE_MODULE_PATH})
  1333. if(EXISTS ${path}/LLVMInstallSymlink.cmake)
  1334. set(INSTALL_SYMLINK ${path}/LLVMInstallSymlink.cmake)
  1335. break()
  1336. endif()
  1337. endforeach()
  1338. set(component ${ARG_COMPONENT})
  1339. if(NOT component)
  1340. set(component ${name})
  1341. endif()
  1342. set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX})
  1343. set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX})
  1344. set(output_dir lib${LLVM_LIBDIR_SUFFIX})
  1345. if(WIN32 AND "${type}" STREQUAL "SHARED")
  1346. set(output_dir bin)
  1347. endif()
  1348. install(SCRIPT ${INSTALL_SYMLINK}
  1349. CODE "install_symlink(${full_name} ${full_dest} ${output_dir})"
  1350. COMPONENT ${component})
  1351. if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE)
  1352. add_llvm_install_targets(install-${name}
  1353. DEPENDS ${name} ${dest} install-${dest}
  1354. COMPONENT ${name})
  1355. endif()
  1356. endfunction()
  1357. function(llvm_install_symlink name dest)
  1358. cmake_parse_arguments(ARG "ALWAYS_GENERATE" "COMPONENT" "" ${ARGN})
  1359. foreach(path ${CMAKE_MODULE_PATH})
  1360. if(EXISTS ${path}/LLVMInstallSymlink.cmake)
  1361. set(INSTALL_SYMLINK ${path}/LLVMInstallSymlink.cmake)
  1362. break()
  1363. endif()
  1364. endforeach()
  1365. if(ARG_COMPONENT)
  1366. set(component ${ARG_COMPONENT})
  1367. else()
  1368. if(ARG_ALWAYS_GENERATE)
  1369. set(component ${dest})
  1370. else()
  1371. set(component ${name})
  1372. endif()
  1373. endif()
  1374. set(full_name ${name}${CMAKE_EXECUTABLE_SUFFIX})
  1375. set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX})
  1376. install(SCRIPT ${INSTALL_SYMLINK}
  1377. CODE "install_symlink(${full_name} ${full_dest} ${LLVM_TOOLS_INSTALL_DIR})"
  1378. COMPONENT ${component})
  1379. if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE)
  1380. add_llvm_install_targets(install-${name}
  1381. DEPENDS ${name} ${dest} install-${dest}
  1382. COMPONENT ${name})
  1383. endif()
  1384. endfunction()
  1385. function(add_llvm_tool_symlink link_name target)
  1386. cmake_parse_arguments(ARG "ALWAYS_GENERATE" "OUTPUT_DIR" "" ${ARGN})
  1387. set(dest_binary "$<TARGET_FILE:${target}>")
  1388. # This got a bit gross... For multi-configuration generators the target
  1389. # properties return the resolved value of the string, not the build system
  1390. # expression. To reconstruct the platform-agnostic path we have to do some
  1391. # magic. First we grab one of the types, and a type-specific path. Then from
  1392. # the type-specific path we find the last occurrence of the type in the path,
  1393. # and replace it with CMAKE_CFG_INTDIR. This allows the build step to be type
  1394. # agnostic again.
  1395. if(NOT ARG_OUTPUT_DIR)
  1396. # If you're not overriding the OUTPUT_DIR, we can make the link relative in
  1397. # the same directory.
  1398. if(CMAKE_HOST_UNIX)
  1399. set(dest_binary "$<TARGET_FILE_NAME:${target}>")
  1400. endif()
  1401. if(CMAKE_CONFIGURATION_TYPES)
  1402. list(GET CMAKE_CONFIGURATION_TYPES 0 first_type)
  1403. string(TOUPPER ${first_type} first_type_upper)
  1404. set(first_type_suffix _${first_type_upper})
  1405. endif()
  1406. get_target_property(target_type ${target} TYPE)
  1407. if(${target_type} STREQUAL "STATIC_LIBRARY")
  1408. get_target_property(ARG_OUTPUT_DIR ${target} ARCHIVE_OUTPUT_DIRECTORY${first_type_suffix})
  1409. elseif(UNIX AND ${target_type} STREQUAL "SHARED_LIBRARY")
  1410. get_target_property(ARG_OUTPUT_DIR ${target} LIBRARY_OUTPUT_DIRECTORY${first_type_suffix})
  1411. else()
  1412. get_target_property(ARG_OUTPUT_DIR ${target} RUNTIME_OUTPUT_DIRECTORY${first_type_suffix})
  1413. endif()
  1414. if(CMAKE_CONFIGURATION_TYPES)
  1415. string(FIND "${ARG_OUTPUT_DIR}" "/${first_type}/" type_start REVERSE)
  1416. string(SUBSTRING "${ARG_OUTPUT_DIR}" 0 ${type_start} path_prefix)
  1417. string(SUBSTRING "${ARG_OUTPUT_DIR}" ${type_start} -1 path_suffix)
  1418. string(REPLACE "/${first_type}/" "/${CMAKE_CFG_INTDIR}/"
  1419. path_suffix ${path_suffix})
  1420. set(ARG_OUTPUT_DIR ${path_prefix}${path_suffix})
  1421. endif()
  1422. endif()
  1423. if(CMAKE_HOST_UNIX)
  1424. set(LLVM_LINK_OR_COPY create_symlink)
  1425. else()
  1426. set(LLVM_LINK_OR_COPY copy)
  1427. endif()
  1428. set(output_path "${ARG_OUTPUT_DIR}/${link_name}${CMAKE_EXECUTABLE_SUFFIX}")
  1429. set(target_name ${link_name})
  1430. if(TARGET ${link_name})
  1431. set(target_name ${link_name}-link)
  1432. endif()
  1433. if(ARG_ALWAYS_GENERATE)
  1434. set_property(DIRECTORY APPEND PROPERTY
  1435. ADDITIONAL_MAKE_CLEAN_FILES ${dest_binary})
  1436. add_custom_command(TARGET ${target} POST_BUILD
  1437. COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}")
  1438. else()
  1439. add_custom_command(OUTPUT ${output_path}
  1440. COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}"
  1441. DEPENDS ${target})
  1442. add_custom_target(${target_name} ALL DEPENDS ${target} ${output_path})
  1443. set_target_properties(${target_name} PROPERTIES FOLDER Tools)
  1444. # Make sure both the link and target are toolchain tools
  1445. if (${link_name} IN_LIST LLVM_TOOLCHAIN_TOOLS AND ${target} IN_LIST LLVM_TOOLCHAIN_TOOLS)
  1446. set(TOOL_IS_TOOLCHAIN ON)
  1447. endif()
  1448. if ((TOOL_IS_TOOLCHAIN OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) AND LLVM_BUILD_TOOLS)
  1449. llvm_install_symlink(${link_name} ${target})
  1450. endif()
  1451. endif()
  1452. endfunction()
  1453. function(llvm_externalize_debuginfo name)
  1454. if(NOT LLVM_EXTERNALIZE_DEBUGINFO)
  1455. return()
  1456. endif()
  1457. if(NOT LLVM_EXTERNALIZE_DEBUGINFO_SKIP_STRIP)
  1458. if(APPLE)
  1459. if(NOT CMAKE_STRIP)
  1460. set(CMAKE_STRIP xcrun strip)
  1461. endif()
  1462. set(strip_command COMMAND ${CMAKE_STRIP} -Sxl $<TARGET_FILE:${name}>)
  1463. else()
  1464. set(strip_command COMMAND ${CMAKE_STRIP} -g -x $<TARGET_FILE:${name}>)
  1465. endif()
  1466. endif()
  1467. if(APPLE)
  1468. if(LLVM_EXTERNALIZE_DEBUGINFO_EXTENSION)
  1469. set(file_ext ${LLVM_EXTERNALIZE_DEBUGINFO_EXTENSION})
  1470. else()
  1471. set(file_ext dSYM)
  1472. endif()
  1473. set(output_name "$<TARGET_FILE_NAME:${name}>.${file_ext}")
  1474. if(LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR)
  1475. set(output_path "-o=${LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR}/${output_name}")
  1476. else()
  1477. set(output_path "-o=${output_name}")
  1478. endif()
  1479. if(CMAKE_CXX_FLAGS MATCHES "-flto"
  1480. OR CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE} MATCHES "-flto")
  1481. set(lto_object ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${name}-lto.o)
  1482. set_property(TARGET ${name} APPEND_STRING PROPERTY
  1483. LINK_FLAGS " -Wl,-object_path_lto,${lto_object}")
  1484. endif()
  1485. if(NOT CMAKE_DSYMUTIL)
  1486. set(CMAKE_DSYMUTIL xcrun dsymutil)
  1487. endif()
  1488. add_custom_command(TARGET ${name} POST_BUILD
  1489. COMMAND ${CMAKE_DSYMUTIL} ${output_path} $<TARGET_FILE:${name}>
  1490. ${strip_command}
  1491. )
  1492. else()
  1493. add_custom_command(TARGET ${name} POST_BUILD
  1494. COMMAND ${CMAKE_OBJCOPY} --only-keep-debug $<TARGET_FILE:${name}> $<TARGET_FILE:${name}>.debug
  1495. ${strip_command} -R .gnu_debuglink
  1496. COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=$<TARGET_FILE:${name}>.debug $<TARGET_FILE:${name}>
  1497. )
  1498. endif()
  1499. endfunction()
  1500. # Usage: llvm_codesign(name [FORCE] [ENTITLEMENTS file] [BUNDLE_PATH path])
  1501. function(llvm_codesign name)
  1502. cmake_parse_arguments(ARG "FORCE" "ENTITLEMENTS;BUNDLE_PATH" "" ${ARGN})
  1503. if(NOT LLVM_CODESIGNING_IDENTITY)
  1504. return()
  1505. endif()
  1506. if(CMAKE_GENERATOR STREQUAL "Xcode")
  1507. set_target_properties(${name} PROPERTIES
  1508. XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ${LLVM_CODESIGNING_IDENTITY}
  1509. )
  1510. if(DEFINED ARG_ENTITLEMENTS)
  1511. set_target_properties(${name} PROPERTIES
  1512. XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${ARG_ENTITLEMENTS}
  1513. )
  1514. endif()
  1515. elseif(APPLE AND CMAKE_HOST_SYSTEM_NAME MATCHES Darwin)
  1516. if(NOT CMAKE_CODESIGN)
  1517. set(CMAKE_CODESIGN xcrun codesign)
  1518. endif()
  1519. if(NOT CMAKE_CODESIGN_ALLOCATE)
  1520. execute_process(
  1521. COMMAND xcrun -f codesign_allocate
  1522. OUTPUT_STRIP_TRAILING_WHITESPACE
  1523. OUTPUT_VARIABLE CMAKE_CODESIGN_ALLOCATE
  1524. )
  1525. endif()
  1526. if(DEFINED ARG_ENTITLEMENTS)
  1527. set(pass_entitlements --entitlements ${ARG_ENTITLEMENTS})
  1528. endif()
  1529. if (NOT ARG_BUNDLE_PATH)
  1530. set(ARG_BUNDLE_PATH $<TARGET_FILE:${name}>)
  1531. endif()
  1532. if(ARG_FORCE)
  1533. set(force_flag "-f")
  1534. endif()
  1535. add_custom_command(
  1536. TARGET ${name} POST_BUILD
  1537. COMMAND ${CMAKE_COMMAND} -E
  1538. env CODESIGN_ALLOCATE=${CMAKE_CODESIGN_ALLOCATE}
  1539. ${CMAKE_CODESIGN} -s ${LLVM_CODESIGNING_IDENTITY}
  1540. ${pass_entitlements} ${force_flag} ${ARG_BUNDLE_PATH}
  1541. )
  1542. endif()
  1543. endfunction()
  1544. function(llvm_setup_rpath name)
  1545. if(CMAKE_INSTALL_RPATH)
  1546. return()
  1547. endif()
  1548. if(LLVM_INSTALL_PREFIX AND NOT (LLVM_INSTALL_PREFIX STREQUAL CMAKE_INSTALL_PREFIX))
  1549. set(extra_libdir ${LLVM_LIBRARY_DIR})
  1550. elseif(LLVM_BUILD_LIBRARY_DIR)
  1551. set(extra_libdir ${LLVM_LIBRARY_DIR})
  1552. endif()
  1553. if (APPLE)
  1554. set(_install_name_dir INSTALL_NAME_DIR "@rpath")
  1555. set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
  1556. elseif(UNIX)
  1557. set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
  1558. if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
  1559. set_property(TARGET ${name} APPEND_STRING PROPERTY
  1560. LINK_FLAGS " -Wl,-z,origin ")
  1561. endif()
  1562. if(LLVM_LINKER_IS_GNULD)
  1563. # $ORIGIN is not interpreted at link time by ld.bfd
  1564. set_property(TARGET ${name} APPEND_STRING PROPERTY
  1565. LINK_FLAGS " -Wl,-rpath-link,${LLVM_LIBRARY_OUTPUT_INTDIR} ")
  1566. endif()
  1567. else()
  1568. return()
  1569. endif()
  1570. set_target_properties(${name} PROPERTIES
  1571. BUILD_WITH_INSTALL_RPATH On
  1572. INSTALL_RPATH "${_install_rpath}"
  1573. ${_install_name_dir})
  1574. endfunction()
  1575. function(setup_dependency_debugging name)
  1576. if(NOT LLVM_DEPENDENCY_DEBUGGING)
  1577. return()
  1578. endif()
  1579. if("intrinsics_gen" IN_LIST ARGN)
  1580. return()
  1581. endif()
  1582. set(deny_attributes_inc "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Attributes.inc\"))")
  1583. set(deny_intrinsics_inc "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Intrinsics.inc\"))")
  1584. set(sandbox_command "sandbox-exec -p '(version 1) (allow default) ${deny_attributes_inc} ${deny_intrinsics_inc}'")
  1585. set_target_properties(${name} PROPERTIES RULE_LAUNCH_COMPILE ${sandbox_command})
  1586. endfunction()
  1587. function(find_first_existing_vc_file path out_var)
  1588. if(NOT EXISTS "${path}")
  1589. return()
  1590. endif()
  1591. if(EXISTS "${path}/.svn")
  1592. set(svn_files
  1593. "${path}/.svn/wc.db" # SVN 1.7
  1594. "${path}/.svn/entries" # SVN 1.6
  1595. )
  1596. foreach(file IN LISTS svn_files)
  1597. if(EXISTS "${file}")
  1598. set(${out_var} "${file}" PARENT_SCOPE)
  1599. return()
  1600. endif()
  1601. endforeach()
  1602. else()
  1603. find_package(Git)
  1604. if(GIT_FOUND)
  1605. execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --git-dir
  1606. WORKING_DIRECTORY ${path}
  1607. RESULT_VARIABLE git_result
  1608. OUTPUT_VARIABLE git_output
  1609. ERROR_QUIET)
  1610. if(git_result EQUAL 0)
  1611. string(STRIP "${git_output}" git_output)
  1612. get_filename_component(git_dir ${git_output} ABSOLUTE BASE_DIR ${path})
  1613. # Some branchless cases (e.g. 'repo') may not yet have .git/logs/HEAD
  1614. if (NOT EXISTS "${git_dir}/logs/HEAD")
  1615. file(WRITE "${git_dir}/logs/HEAD" "")
  1616. endif()
  1617. set(${out_var} "${git_dir}/logs/HEAD" PARENT_SCOPE)
  1618. endif()
  1619. endif()
  1620. endif()
  1621. endfunction()