2016-03-29 02:19:32 +08:00
# See docs/CMake.html for instructions about how to build LLVM with CMake.
2016-06-01 04:21:32 +08:00
cmake_minimum_required ( VERSION 3.4.3 )
2016-03-29 02:19:32 +08:00
if ( POLICY CMP0022 )
cmake_policy ( SET CMP0022 NEW ) # automatic when 2.8.12 is required
endif ( )
if ( POLICY CMP0051 )
# CMake 3.1 and higher include generator expressions of the form
# $<TARGETLIB:obj> in the SOURCES property. These need to be
# stripped everywhere that access the SOURCES property, so we just
# defer to the OLD behavior of not including generator expressions
# in the output for now.
cmake_policy ( SET CMP0051 OLD )
endif ( )
2016-09-28 07:18:32 +08:00
if ( POLICY CMP0057 )
cmake_policy ( SET CMP0057 NEW )
endif ( )
2016-03-29 02:19:32 +08:00
if ( NOT DEFINED LLVM_VERSION_MAJOR )
2017-01-13 05:22:36 +08:00
set ( LLVM_VERSION_MAJOR 5 )
2016-03-29 02:19:32 +08:00
endif ( )
if ( NOT DEFINED LLVM_VERSION_MINOR )
2016-07-19 01:51:04 +08:00
set ( LLVM_VERSION_MINOR 0 )
2016-03-29 02:19:32 +08:00
endif ( )
if ( NOT DEFINED LLVM_VERSION_PATCH )
set ( LLVM_VERSION_PATCH 0 )
endif ( )
if ( NOT DEFINED LLVM_VERSION_SUFFIX )
set ( LLVM_VERSION_SUFFIX svn )
endif ( )
if ( POLICY CMP0048 )
cmake_policy ( SET CMP0048 NEW )
set ( cmake_3_0_PROJ_VERSION
V E R S I O N $ { L L V M _ V E R S I O N _ M A J O R } . $ { L L V M _ V E R S I O N _ M I N O R } . $ { L L V M _ V E R S I O N _ P A T C H } )
set ( cmake_3_0_LANGUAGES LANGUAGES )
endif ( )
if ( NOT PACKAGE_VERSION )
set ( PACKAGE_VERSION
" $ { L L V M _ V E R S I O N _ M A J O R } . $ { L L V M _ V E R S I O N _ M I N O R } . $ { L L V M _ V E R S I O N _ P A T C H } $ { L L V M _ V E R S I O N _ S U F F I X } " )
endif ( )
2017-05-26 05:01:30 +08:00
if ( ( CMAKE_GENERATOR MATCHES "Visual Studio" ) AND ( CMAKE_GENERATOR_TOOLSET STREQUAL "" ) )
message ( WARNING "Visual Studio generators use the x86 host compiler by "
" d e f a u l t , e v e n f o r 6 4 - b i t t a r g e t s . T h i s c a n r e s u l t i n l i n k e r "
" i n s t a b i l i t y a n d o u t o f m e m o r y e r r o r s . T o u s e t h e 6 4 - b i t "
" h o s t c o m p i l e r , p a s s - T h o s t = x 6 4 o n t h e C M a k e c o m m a n d l i n e . " )
endif ( )
2016-03-29 02:19:32 +08:00
project ( LLVM
$ { c m a k e _ 3 _ 0 _ P R O J _ V E R S I O N }
$ { c m a k e _ 3 _ 0 _ L A N G U A G E S }
C C X X A S M )
2016-08-19 02:17:28 +08:00
if ( NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES )
message ( STATUS "No build type selected, default to Debug" )
2016-11-02 14:10:03 +08:00
set ( CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (default Debug)" FORCE )
2016-08-19 02:17:28 +08:00
endif ( )
2016-07-26 07:46:08 +08:00
# This should only apply if you are both on an Apple host, and targeting Apple.
if ( CMAKE_HOST_APPLE AND APPLE )
2017-02-08 07:32:56 +08:00
# if CMAKE_LIBTOOL is not set, try and find it with xcrun or find_program
if ( NOT CMAKE_LIBTOOL )
if ( NOT CMAKE_XCRUN )
find_program ( CMAKE_XCRUN NAMES xcrun )
endif ( )
if ( CMAKE_XCRUN )
execute_process ( COMMAND ${ CMAKE_XCRUN } -find libtool
O U T P U T _ V A R I A B L E C M A K E _ L I B T O O L
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
endif ( )
2016-07-26 07:46:08 +08:00
2017-02-08 07:32:56 +08:00
if ( NOT CMAKE_LIBTOOL OR NOT EXISTS CMAKE_LIBTOOL )
find_program ( CMAKE_LIBTOOL NAMES libtool )
endif ( )
2016-04-29 04:14:19 +08:00
endif ( )
2016-07-26 07:46:08 +08:00
get_property ( languages GLOBAL PROPERTY ENABLED_LANGUAGES )
2016-04-29 04:14:19 +08:00
if ( CMAKE_LIBTOOL )
set ( CMAKE_LIBTOOL ${ CMAKE_LIBTOOL } CACHE PATH "libtool executable" )
message ( STATUS "Found libtool - ${CMAKE_LIBTOOL}" )
2016-12-05 13:21:44 +08:00
execute_process ( COMMAND ${ CMAKE_LIBTOOL } -V
O U T P U T _ V A R I A B L E L I B T O O L _ V _ O U T P U T
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
if ( "${LIBTOOL_V_OUTPUT}" MATCHES ".*cctools-([0-9.]+).*" )
string ( REGEX REPLACE ".*cctools-([0-9.]+).*" "\\1" LIBTOOL_VERSION
$ { L I B T O O L _ V _ O U T P U T } )
if ( NOT LIBTOOL_VERSION VERSION_LESS "862" )
set ( LIBTOOL_NO_WARNING_FLAG "-no_warning_for_no_symbols" )
endif ( )
endif ( )
2016-04-29 04:14:19 +08:00
foreach ( lang ${ languages } )
set ( CMAKE_ ${ lang } _CREATE_STATIC_LIBRARY
2016-12-05 13:21:44 +08:00
" $ { C M A K E _ L I B T O O L } - s t a t i c $ { L I B T O O L _ N O _ W A R N I N G _ F L A G } - o < T A R G E T > \
< L I N K _ F L A G S > < O B J E C T S > " )
2016-04-29 04:14:19 +08:00
endforeach ( )
endif ( )
2016-07-26 07:46:08 +08:00
# If DYLD_LIBRARY_PATH is set we need to set it on archiver commands
if ( DYLD_LIBRARY_PATH )
set ( dyld_envar "DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}" )
foreach ( lang ${ languages } )
foreach ( cmd ${ CMAKE_${lang } _CREATE_STATIC_LIBRARY} )
list ( APPEND CMAKE_ ${ lang } _CREATE_STATIC_LIBRARY_NEW
" $ { d y l d _ e n v a r } $ { c m d } " )
endforeach ( )
set ( CMAKE_ ${ lang } _CREATE_STATIC_LIBRARY
$ { C M A K E _ $ { l a n g } _ C R E A T E _ S T A T I C _ L I B R A R Y _ N E W } )
endforeach ( )
endif ( )
2016-04-29 04:14:19 +08:00
endif ( )
2016-11-08 06:13:38 +08:00
# Side-by-side subprojects layout: automatically set the
# LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS
# This allows an easy way of setting up a build directory for llvm and another
# one for llvm+clang+... using the same sources.
set ( LLVM_ALL_PROJECTS "clang;libcxx;libcxxabi;lldb;compiler-rt;lld;polly" )
set ( LLVM_ENABLE_PROJECTS "" CACHE STRING
" S e m i c o l o n - s e p a r a t e d l i s t o f p r o j e c t s t o build ( ${ LLVM_ALL_PROJECTS } ) , o r \ " a l l \ " . " )
if ( LLVM_ENABLE_PROJECTS STREQUAL "all" )
set ( LLVM_ENABLE_PROJECTS ${ LLVM_ALL_PROJECTS } )
endif ( )
foreach ( proj ${ LLVM_ENABLE_PROJECTS } )
set ( PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" )
if ( NOT EXISTS "${PROJ_DIR}" OR NOT IS_DIRECTORY "${PROJ_DIR}" )
message ( FATAL_ERROR "LLVM_ENABLE_PROJECTS requests ${proj} but directory not found: ${PROJ_DIR}" )
endif ( )
string ( TOUPPER "${proj}" upper_proj )
2016-11-09 08:23:20 +08:00
STRING ( REGEX REPLACE "-" "_" upper_proj ${ upper_proj } )
2016-11-08 06:13:38 +08:00
set ( LLVM_EXTERNAL_ ${ upper_proj } _SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" )
# There is a widely spread opinion that clang-tools-extra should be merged
# into clang. The following simulates it by always enabling clang-tools-extra
# when enabling clang.
if ( proj STREQUAL "clang" )
set ( LLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../clang-tools-extra" )
endif ( )
endforeach ( )
2016-08-02 05:28:03 +08:00
# Build llvm with ccache if the package is present
set ( LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build" )
if ( LLVM_CCACHE_BUILD )
find_program ( CCACHE_PROGRAM ccache )
if ( CCACHE_PROGRAM )
set ( LLVM_CCACHE_SIZE "" CACHE STRING "Size of ccache" )
set ( LLVM_CCACHE_DIR "" CACHE STRING "Directory to keep ccached data" )
set ( CCACHE_PROGRAM "CCACHE_CPP2=yes CCACHE_HASHDIR=yes ${CCACHE_PROGRAM}" )
if ( LLVM_CCACHE_SIZE )
set ( CCACHE_PROGRAM "CCACHE_SIZE=${LLVM_CCACHE_SIZE} ${CCACHE_PROGRAM}" )
endif ( )
if ( LLVM_CCACHE_DIR )
set ( CCACHE_PROGRAM "CCACHE_DIR=${LLVM_CCACHE_DIR} ${CCACHE_PROGRAM}" )
endif ( )
set_property ( GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${ CCACHE_PROGRAM } )
else ( )
message ( FATAL_ERROR "Unable to find the program ccache. Set LLVM_CCACHE_BUILD to OFF" )
endif ( )
endif ( )
2016-11-17 12:36:59 +08:00
option ( LLVM_DEPENDENCY_DEBUGGING "Dependency debugging mode to verify correctly expressed library dependencies (Darwin only)" OFF )
# Some features of the LLVM build may be disallowed when dependency debugging is
# enabled. In particular you cannot use ccache because we want to force compile
# operations to always happen.
if ( LLVM_DEPENDENCY_DEBUGGING )
if ( NOT CMAKE_HOST_APPLE )
message ( FATAL_ERROR "Dependency debugging is only currently supported on Darwin hosts." )
endif ( )
if ( LLVM_CCACHE_BUILD )
message ( FATAL_ERROR "Cannot enable dependency debugging while using ccache." )
endif ( )
endif ( )
2017-01-27 07:53:31 +08:00
option ( LLVM_BUILD_GLOBAL_ISEL "Experimental: Build GlobalISel" ON )
2016-03-29 02:19:32 +08:00
if ( LLVM_BUILD_GLOBAL_ISEL )
add_definitions ( -DLLVM_BUILD_GLOBAL_ISEL )
endif ( )
2017-02-15 02:32:41 +08:00
option ( LLVM_ENABLE_DAGISEL_COV "Debug: Prints tablegen patterns that were used for selecting" OFF )
2016-03-29 02:19:32 +08:00
# Add path for custom modules
set ( CMAKE_MODULE_PATH
$ { C M A K E _ M O D U L E _ P A T H }
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c m a k e "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c m a k e / m o d u l e s "
)
# Generate a CompilationDatabase (compile_commands.json file) for our build,
# for use by clang_complete, YouCompleteMe, etc.
set ( CMAKE_EXPORT_COMPILE_COMMANDS 1 )
option ( LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OFF )
option ( LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF )
option ( LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON )
if ( LLVM_USE_FOLDERS )
set_property ( GLOBAL PROPERTY USE_FOLDERS ON )
endif ( )
include ( VersionFromVCS )
option ( LLVM_APPEND_VC_REV
" A p p e n d t h e v e r s i o n c o n t r o l s y s t e m r e v i s i o n i d t o L L V M v e r s i o n " O F F )
if ( LLVM_APPEND_VC_REV )
add_version_info_from_vcs ( PACKAGE_VERSION )
endif ( )
set ( PACKAGE_NAME LLVM )
set ( PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}" )
set ( PACKAGE_BUGREPORT "http://llvm.org/bugs/" )
set ( BUG_REPORT_URL "${PACKAGE_BUGREPORT}" CACHE STRING
" D e f a u l t U R L w h e r e b u g r e p o r t s a r e t o b e s u b m i t t e d . " )
# Configure CPack.
set ( CPACK_PACKAGE_INSTALL_DIRECTORY "LLVM" )
set ( CPACK_PACKAGE_VENDOR "LLVM" )
set ( CPACK_PACKAGE_VERSION_MAJOR ${ LLVM_VERSION_MAJOR } )
set ( CPACK_PACKAGE_VERSION_MINOR ${ LLVM_VERSION_MINOR } )
set ( CPACK_PACKAGE_VERSION_PATCH ${ LLVM_VERSION_PATCH } )
set ( CPACK_PACKAGE_VERSION ${ PACKAGE_VERSION } )
set ( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.TXT" )
set ( CPACK_NSIS_COMPRESSOR "/SOLID lzma \r\n SetCompressorDictSize 32" )
if ( WIN32 AND NOT UNIX )
set ( CPACK_PACKAGE_INSTALL_REGISTRY_KEY "LLVM" )
set ( CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_logo.bmp" )
set ( CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico" )
set ( CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico" )
set ( CPACK_NSIS_MODIFY_PATH "ON" )
set ( CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL "ON" )
set ( CPACK_NSIS_EXTRA_INSTALL_COMMANDS
" E x e c W a i t ' $ I N S T D I R / t o o l s / m s b u i l d / i n s t a l l . b a t ' " )
set ( CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS
" E x e c W a i t ' $ I N S T D I R / t o o l s / m s b u i l d / u n i n s t a l l . b a t ' " )
if ( CMAKE_CL_64 )
set ( CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64" )
endif ( )
endif ( )
include ( CPack )
# Sanity check our source directory to make sure that we are not trying to
# generate an in-tree build (unless on MSVC_IDE, where it is ok), and to make
# sure that we don't have any stray generated files lying around in the tree
# (which would end up getting picked up by header search, instead of the correct
# versions).
if ( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
message ( FATAL_ERROR " In-source builds are not allowed.
C M a k e w o u l d o v e r w r i t e t h e m a k e f i l e s d i s t r i b u t e d w i t h L L V M .
P l e a s e c r e a t e a d i r e c t o r y a n d r u n c m a k e f r o m t h e r e , p a s s i n g t h e p a t h
t o t h i s s o u r c e d i r e c t o r y a s t h e l a s t a r g u m e n t .
T h i s p r o c e s s c r e a t e d t h e f i l e ` C M a k e C a c h e . t x t ' a n d t h e d i r e c t o r y ` C M a k e F i l e s ' .
P l e a s e d e l e t e t h e m . " )
endif ( )
if ( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
file ( GLOB_RECURSE
t a b l e g e n n e d _ f i l e s _ o n _ i n c l u d e _ d i r
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / i n c l u d e / l l v m / * . g e n " )
file ( GLOB_RECURSE
t a b l e g e n n e d _ f i l e s _ o n _ l i b _ d i r
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / l i b / T a r g e t / * . i n c " )
if ( tablegenned_files_on_include_dir OR tablegenned_files_on_lib_dir )
message ( FATAL_ERROR " Apparently there is a previous in-source build,
p r o b a b l y a s t h e r e s u l t o f r u n n i n g ` c o n f i g u r e ' a n d ` m a k e ' o n
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } .
T h i s m a y c a u s e p r o b l e m s . T h e s u s p i c i o u s f i l e s a r e :
$ { t a b l e g e n n e d _ f i l e s _ o n _ l i b _ d i r }
$ { t a b l e g e n n e d _ f i l e s _ o n _ i n c l u d e _ d i r }
P l e a s e c l e a n t h e s o u r c e d i r e c t o r y . " )
endif ( )
endif ( )
string ( TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE )
if ( CMAKE_BUILD_TYPE AND
N O T u p p e r c a s e _ C M A K E _ B U I L D _ T Y P E M A T C H E S " ^ ( D E B U G | R E L E A S E | R E L W I T H D E B I N F O | M I N S I Z E R E L ) $ " )
message ( FATAL_ERROR "Invalid value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}" )
endif ( )
set ( LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
2016-06-09 05:19:26 +08:00
set ( LLVM_TOOLS_INSTALL_DIR "bin" CACHE STRING "Path for binary subdirectory (defaults to 'bin')" )
mark_as_advanced ( LLVM_TOOLS_INSTALL_DIR )
2016-03-29 02:19:32 +08:00
# They are used as destination of target generators.
set ( LLVM_RUNTIME_OUTPUT_INTDIR ${ CMAKE_CURRENT_BINARY_DIR } / ${ CMAKE_CFG_INTDIR } /bin )
set ( LLVM_LIBRARY_OUTPUT_INTDIR ${ CMAKE_CURRENT_BINARY_DIR } / ${ CMAKE_CFG_INTDIR } /lib ${ LLVM_LIBDIR_SUFFIX } )
if ( WIN32 OR CYGWIN )
# DLL platform -- put DLLs into bin.
set ( LLVM_SHLIB_OUTPUT_INTDIR ${ LLVM_RUNTIME_OUTPUT_INTDIR } )
else ( )
set ( LLVM_SHLIB_OUTPUT_INTDIR ${ LLVM_LIBRARY_OUTPUT_INTDIR } )
endif ( )
# Each of them corresponds to llvm-config's.
set ( LLVM_TOOLS_BINARY_DIR ${ LLVM_RUNTIME_OUTPUT_INTDIR } ) # --bindir
set ( LLVM_LIBRARY_DIR ${ LLVM_LIBRARY_OUTPUT_INTDIR } ) # --libdir
set ( LLVM_MAIN_SRC_DIR ${ CMAKE_CURRENT_SOURCE_DIR } ) # --src-root
set ( LLVM_MAIN_INCLUDE_DIR ${ LLVM_MAIN_SRC_DIR } /include ) # --includedir
set ( LLVM_BINARY_DIR ${ CMAKE_CURRENT_BINARY_DIR } ) # --prefix
2016-10-19 20:18:34 +08:00
# Note: LLVM_CMAKE_PATH does not include generated files
set ( LLVM_CMAKE_PATH ${ LLVM_MAIN_SRC_DIR } /cmake/modules )
2016-03-29 02:19:32 +08:00
set ( LLVM_EXAMPLES_BINARY_DIR ${ LLVM_BINARY_DIR } /examples )
set ( LLVM_INCLUDE_DIR ${ CMAKE_CURRENT_BINARY_DIR } /include )
set ( LLVM_ALL_TARGETS
A A r c h 6 4
A M D G P U
A R M
B P F
H e x a g o n
2016-08-23 09:06:44 +08:00
L a n a i
2016-03-29 02:19:32 +08:00
M i p s
M S P 4 3 0
N V P T X
P o w e r P C
2016-11-02 01:27:54 +08:00
R I S C V
2016-03-29 02:19:32 +08:00
S p a r c
S y s t e m Z
X 8 6
X C o r e
)
# List of targets with JIT support:
set ( LLVM_TARGETS_WITH_JIT X86 PowerPC AArch64 ARM Mips SystemZ )
set ( LLVM_TARGETS_TO_BUILD "all"
C A C H E S T R I N G " S e m i c o l o n - s e p a r a t e d l i s t o f t a r g e t s t o b u i l d , o r \ " a l l \ " . " )
set ( LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ""
C A C H E S T R I N G " S e m i c o l o n - s e p a r a t e d l i s t o f e x p e r i m e n t a l t a r g e t s t o b u i l d . " )
option ( BUILD_SHARED_LIBS
" B u i l d a l l l i b r a r i e s a s s h a r e d l i b r a r i e s i n s t e a d o f s t a t i c " O F F )
option ( LLVM_ENABLE_BACKTRACES "Enable embedding backtraces on crash." ON )
if ( LLVM_ENABLE_BACKTRACES )
set ( ENABLE_BACKTRACES 1 )
endif ( )
option ( LLVM_ENABLE_CRASH_OVERRIDES "Enable crash overrides." ON )
if ( LLVM_ENABLE_CRASH_OVERRIDES )
set ( ENABLE_CRASH_OVERRIDES 1 )
endif ( )
option ( LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF )
set ( FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so" )
set ( FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h" )
set ( LLVM_TARGET_ARCH "host"
C A C H E S T R I N G " S e t t a r g e t t o u s e f o r L L V M J I T o r u s e \ " h o s t \ " f o r a u t o m a t i c d e t e c t i o n . " )
option ( LLVM_ENABLE_TERMINFO "Use terminfo database if available." ON )
2016-11-18 09:25:49 +08:00
option ( LLVM_ENABLE_LIBEDIT "Use libedit if available." ON )
2016-03-29 02:19:32 +08:00
option ( LLVM_ENABLE_THREADS "Use threads if available." ON )
option ( LLVM_ENABLE_ZLIB "Use zlib for compression/decompression if available." ON )
if ( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
set ( LLVM_TARGETS_TO_BUILD ${ LLVM_ALL_TARGETS } )
endif ( )
set ( LLVM_TARGETS_TO_BUILD
$ { L L V M _ T A R G E T S _ T O _ B U I L D }
$ { L L V M _ E X P E R I M E N T A L _ T A R G E T S _ T O _ B U I L D } )
list ( REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD )
option ( LLVM_ENABLE_PIC "Build Position-Independent Code" ON )
option ( LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON )
option ( LLVM_ENABLE_MODULES "Compile with C++ modules enabled." OFF )
2016-06-30 09:46:49 +08:00
if ( ${ CMAKE_SYSTEM_NAME } MATCHES "Darwin" )
2016-07-01 01:15:44 +08:00
option ( LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." ON )
2016-06-30 09:46:49 +08:00
option ( LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." OFF )
else ( )
2016-07-01 01:15:44 +08:00
option ( LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF )
2016-06-30 09:46:49 +08:00
option ( LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON )
endif ( )
2016-03-29 02:19:32 +08:00
option ( LLVM_ENABLE_CXX1Y "Compile with C++1y enabled." OFF )
2017-06-10 06:09:57 +08:00
option ( LLVM_ENABLE_CXX1Z "Compile with C++1z enabled." OFF )
2016-03-29 02:19:32 +08:00
option ( LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF )
2016-07-29 08:46:13 +08:00
option ( LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF )
2016-03-29 02:19:32 +08:00
option ( LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON )
option ( LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF )
if ( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
option ( LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF )
else ( )
option ( LLVM_ENABLE_ASSERTIONS "Enable assertions" ON )
endif ( )
2016-04-29 23:22:48 +08:00
option ( LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF )
2016-03-29 02:19:32 +08:00
set ( LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
" E n a b l e a b i - b r e a k i n g c h e c k s . C a n b e W I T H _ A S S E R T S , F O R C E _ O N o r F O R C E _ O F F . " )
option ( LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
" S e t t o O N t o f o r c e u s i n g a n o l d , u n s u p p o r t e d h o s t t o o l c h a i n . " O F F )
option ( LLVM_USE_INTEL_JITEVENTS
" U s e I n t e l J I T A P I t o i n f o r m Intel ( R ) VTune ( TM ) A m p l i f i e r X E 2 0 1 1 a b o u t J I T c o d e "
O F F )
if ( LLVM_USE_INTEL_JITEVENTS )
# Verify we are on a supported platform
if ( NOT CMAKE_SYSTEM_NAME MATCHES "Windows" AND NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
message ( FATAL_ERROR
" I n t e l J I T A P I s u p p o r t i s a v a i l a b l e o n L i n u x a n d W i n d o w s o n l y . " )
endif ( )
endif ( LLVM_USE_INTEL_JITEVENTS )
option ( LLVM_USE_OPROFILE
" U s e o p a g e n t J I T i n t e r f a c e t o i n f o r m O P r o f i l e a b o u t J I T c o d e " O F F )
option ( LLVM_EXTERNALIZE_DEBUGINFO
" G e n e r a t e d S Y M f i l e s a n d s t r i p e x e c u t a b l e s a n d libraries ( Darwin Only ) " O F F )
# If enabled, verify we are on a platform that supports oprofile.
if ( LLVM_USE_OPROFILE )
if ( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
message ( FATAL_ERROR "OProfile support is available on Linux only." )
endif ( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
endif ( LLVM_USE_OPROFILE )
set ( LLVM_USE_SANITIZER "" CACHE STRING
" D e f i n e t h e s a n i t i z e r u s e d t o b u i l d b i n a r i e s a n d t e s t s . " )
option ( LLVM_USE_SPLIT_DWARF
" U s e - g s p l i t - d w a r f w h e n c o m p i l i n g l l v m . " O F F )
2016-05-05 04:04:40 +08:00
option ( LLVM_POLLY_LINK_INTO_TOOLS "Statically link Polly into tools (if available)" ON )
option ( LLVM_POLLY_BUILD "Build LLVM with Polly" ON )
if ( EXISTS ${ LLVM_MAIN_SRC_DIR } /tools/polly/CMakeLists.txt )
set ( POLLY_IN_TREE TRUE )
2016-10-08 05:32:47 +08:00
elseif ( LLVM_EXTERNAL_POLLY_SOURCE_DIR )
set ( POLLY_IN_TREE TRUE )
2016-05-05 04:04:40 +08:00
else ( )
set ( POLLY_IN_TREE FALSE )
endif ( )
if ( LLVM_POLLY_BUILD AND POLLY_IN_TREE )
set ( WITH_POLLY ON )
else ( )
set ( WITH_POLLY OFF )
endif ( )
if ( LLVM_POLLY_LINK_INTO_TOOLS AND WITH_POLLY )
set ( LINK_POLLY_INTO_TOOLS ON )
else ( )
set ( LINK_POLLY_INTO_TOOLS OFF )
endif ( )
2016-03-29 02:19:32 +08:00
# Define an option controlling whether we should build for 32-bit on 64-bit
# platforms, where supported.
if ( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
# TODO: support other platforms and toolchains.
option ( LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF )
endif ( )
# Define the default arguments to use with 'lit', and an option for the user to
# override.
set ( LIT_ARGS_DEFAULT "-sv" )
if ( MSVC_IDE OR XCODE )
set ( LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar" )
endif ( )
set ( LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit" )
# On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
if ( WIN32 AND NOT CYGWIN )
set ( LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools" )
endif ( )
# Define options to control the inclusion and default build behavior for
# components which may not strictly be necessary (tools, examples, and tests).
#
# This is primarily to support building smaller or faster project files.
option ( LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON )
option ( LLVM_BUILD_TOOLS
" B u i l d t h e L L V M t o o l s . I f O F F , j u s t g e n e r a t e b u i l d t a r g e t s . " O N )
option ( LLVM_INCLUDE_UTILS "Generate build targets for the LLVM utils." ON )
2016-07-10 10:43:47 +08:00
option ( LLVM_BUILD_UTILS
" B u i l d L L V M u t i l i t y b i n a r i e s . I f O F F , j u s t g e n e r a t e b u i l d t a r g e t s . " O N )
2016-03-29 02:19:32 +08:00
2017-03-24 06:40:10 +08:00
option ( LLVM_INCLUDE_RUNTIMES "Generate build targets for the LLVM runtimes." ON )
option ( LLVM_BUILD_RUNTIMES
" B u i l d t h e L L V M r u n t i m e s . I f O F F , j u s t g e n e r a t e b u i l d t a r g e t s . " O N )
2016-03-29 02:19:32 +08:00
option ( LLVM_BUILD_RUNTIME
" B u i l d t h e L L V M r u n t i m e l i b r a r i e s . " O N )
option ( LLVM_BUILD_EXAMPLES
" B u i l d t h e L L V M e x a m p l e p r o g r a m s . I f O F F , j u s t g e n e r a t e b u i l d t a r g e t s . " O F F )
option ( LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON )
option ( LLVM_BUILD_TESTS
" B u i l d L L V M u n i t t e s t s . I f O F F , j u s t g e n e r a t e b u i l d t a r g e t s . " O F F )
option ( LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON )
option ( LLVM_INCLUDE_GO_TESTS "Include the Go bindings tests in test build targets." ON )
option ( LLVM_BUILD_DOCS "Build the llvm documentation." OFF )
option ( LLVM_INCLUDE_DOCS "Generate build targets for llvm documentation." ON )
option ( LLVM_ENABLE_DOXYGEN "Use doxygen to generate llvm API documentation." OFF )
option ( LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF )
2016-08-24 02:07:16 +08:00
option ( LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON )
2016-03-29 02:19:32 +08:00
2016-09-28 03:52:29 +08:00
set ( LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html"
C A C H E S T R I N G " D o x y g e n - g e n e r a t e d H T M L d o c u m e n t a t i o n i n s t a l l d i r e c t o r y " )
set ( LLVM_INSTALL_OCAMLDOC_HTML_DIR "share/doc/llvm/ocaml-html"
C A C H E S T R I N G " O C a m l d o c - g e n e r a t e d H T M L d o c u m e n t a t i o n i n s t a l l d i r e c t o r y " )
2016-03-29 02:19:32 +08:00
option ( LLVM_BUILD_EXTERNAL_COMPILER_RT
" B u i l d c o m p i l e r - r t a s a n e x t e r n a l p r o j e c t . " O F F )
2017-04-19 08:03:36 +08:00
option ( LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO
" S h o w t a r g e t a n d h o s t i n f o w h e n t o o l s a r e i n v o k e d w i t h - - v e r s i o n . " O N )
2016-03-29 02:19:32 +08:00
# You can configure which libraries from LLVM you want to include in the
# shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited
# list of LLVM components. All component names handled by llvm-config are valid.
if ( NOT DEFINED LLVM_DYLIB_COMPONENTS )
set ( LLVM_DYLIB_COMPONENTS "all" CACHE STRING
" S e m i c o l o n - s e p a r a t e d l i s t o f c o m p o n e n t s t o i n c l u d e i n l i b L L V M , o r \ " a l l \ " . " )
endif ( )
option ( LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF )
option ( LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin Only)" OFF )
set ( LLVM_BUILD_LLVM_DYLIB_default OFF )
if ( LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB )
set ( LLVM_BUILD_LLVM_DYLIB_default ON )
endif ( )
option ( LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${ LLVM_BUILD_LLVM_DYLIB_default } )
2017-05-03 22:43:44 +08:00
option ( LLVM_DYLIB_SYMBOL_VERSIONING OFF )
2016-03-29 02:19:32 +08:00
option ( LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF )
2016-11-29 01:12:09 +08:00
if ( CMAKE_CROSSCOMPILING OR ( LLVM_OPTIMIZED_TABLEGEN AND ( LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES ) ) )
2016-03-29 02:19:32 +08:00
set ( LLVM_USE_HOST_TOOLS ON )
endif ( )
if ( MSVC_IDE AND NOT ( MSVC_VERSION LESS 1900 ) )
option ( LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE )
else ( )
set ( LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION FALSE CACHE INTERNAL "For Visual Studio 2013, manually copy natvis files to Documents\\Visual Studio 2013\\Visualizers" FORCE )
endif ( )
2016-06-14 07:33:48 +08:00
if ( LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE )
if ( NOT LLVM_PROFILE_MERGE_POOL_SIZE )
# A pool size of 1-2 is probably sufficient on a SSD. 3-4 should be fine
# for spining disks. Anything higher may only help on slower mediums.
set ( LLVM_PROFILE_MERGE_POOL_SIZE "4" )
endif ( )
if ( NOT LLVM_PROFILE_FILE_PATTERN )
if ( NOT LLVM_PROFILE_DATA_DIR )
2016-07-23 08:38:11 +08:00
file ( TO_NATIVE_PATH "${LLVM_BINARY_DIR}/profiles/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN )
2016-06-14 07:33:48 +08:00
else ( )
file ( TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN )
endif ( )
endif ( )
endif ( )
2016-11-17 19:22:23 +08:00
if ( LLVM_BUILD_STATIC )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static" )
endif ( )
2016-03-29 02:19:32 +08:00
# All options referred to from HandleLLVMOptions have to be specified
# BEFORE this include, otherwise options will not be correctly set on
# first cmake run
include ( config-ix )
string ( REPLACE "Native" ${ LLVM_NATIVE_ARCH }
L L V M _ T A R G E T S _ T O _ B U I L D " $ { L L V M _ T A R G E T S _ T O _ B U I L D } " )
list ( REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD )
# By default, we target the host, but this can be overridden at CMake
# invocation time.
set ( LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_HOST_TRIPLE}" CACHE STRING
" D e f a u l t t a r g e t f o r w h i c h L L V M w i l l g e n e r a t e c o d e . " )
set ( TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}" )
2016-09-28 02:08:40 +08:00
message ( STATUS "LLVM host triple: ${LLVM_HOST_TRIPLE}" )
message ( STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}" )
2016-03-29 02:19:32 +08:00
include ( HandleLLVMOptions )
# Verify that we can find a Python 2 interpreter. Python 3 is unsupported.
# FIXME: We should support systems with only Python 3, but that requires work
# on LLDB.
set ( Python_ADDITIONAL_VERSIONS 2.7 )
include ( FindPythonInterp )
if ( NOT PYTHONINTERP_FOUND )
message ( FATAL_ERROR
" U n a b l e t o f i n d P y t h o n i n t e r p r e t e r , r e q u i r e d f o r b u i l d s a n d t e s t i n g .
P l e a s e i n s t a l l P y t h o n o r s p e c i f y t h e P Y T H O N _ E X E C U T A B L E C M a k e v a r i a b l e . " )
endif ( )
if ( ${ PYTHON_VERSION_STRING } VERSION_LESS 2.7 )
message ( FATAL_ERROR "Python 2.7 or newer is required" )
endif ( )
######
# LLVMBuild Integration
#
# We use llvm-build to generate all the data required by the CMake based
# build system in one swoop:
#
# - We generate a file (a CMake fragment) in the object root which contains
# all the definitions that are required by CMake.
#
# - We generate the library table used by llvm-config.
#
# - We generate the dependencies for the CMake fragment, so that we will
# automatically reconfigure outselves.
set ( LLVMBUILDTOOL "${LLVM_MAIN_SRC_DIR}/utils/llvm-build/llvm-build" )
set ( LLVMCONFIGLIBRARYDEPENDENCIESINC
" $ { L L V M _ B I N A R Y _ D I R } / t o o l s / l l v m - c o n f i g / L i b r a r y D e p e n d e n c i e s . i n c " )
set ( LLVMBUILDCMAKEFRAG
" $ { L L V M _ B I N A R Y _ D I R } / L L V M B u i l d . c m a k e " )
# Create the list of optional components that are enabled
if ( LLVM_USE_INTEL_JITEVENTS )
set ( LLVMOPTIONALCOMPONENTS IntelJITEvents )
endif ( LLVM_USE_INTEL_JITEVENTS )
if ( LLVM_USE_OPROFILE )
set ( LLVMOPTIONALCOMPONENTS ${ LLVMOPTIONALCOMPONENTS } OProfileJIT )
endif ( LLVM_USE_OPROFILE )
message ( STATUS "Constructing LLVMBuild project information" )
execute_process (
2017-03-23 22:54:34 +08:00
C O M M A N D $ { P Y T H O N _ E X E C U T A B L E } - B $ { L L V M B U I L D T O O L }
2016-03-29 02:19:32 +08:00
- - n a t i v e - t a r g e t " $ { L L V M _ N A T I V E _ A R C H } "
- - e n a b l e - t a r g e t s " $ { L L V M _ T A R G E T S _ T O _ B U I L D } "
- - e n a b l e - o p t i o n a l - c o m p o n e n t s " $ { L L V M O P T I O N A L C O M P O N E N T S } "
- - w r i t e - l i b r a r y - t a b l e $ { L L V M C O N F I G L I B R A R Y D E P E N D E N C I E S I N C }
- - w r i t e - c m a k e - f r a g m e n t $ { L L V M B U I L D C M A K E F R A G }
O U T P U T _ V A R I A B L E L L V M B U I L D O U T P U T
E R R O R _ V A R I A B L E L L V M B U I L D E R R O R S
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
E R R O R _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
R E S U L T _ V A R I A B L E L L V M B U I L D R E S U L T )
# On Win32, CMake doesn't properly handle piping the default output/error
# streams into the GUI console. So, we explicitly catch and report them.
if ( NOT "${LLVMBUILDOUTPUT}" STREQUAL "" )
message ( STATUS "llvm-build output: ${LLVMBUILDOUTPUT}" )
endif ( )
if ( NOT "${LLVMBUILDRESULT}" STREQUAL "0" )
message ( FATAL_ERROR
" U n e x p e c t e d f a i l u r e e x e c u t i n g l l v m - b u i l d : $ { L L V M B U I L D E R R O R S } " )
endif ( )
# Include the generated CMake fragment. This will define properties from the
# LLVMBuild files in a format which is easy to consume from CMake, and will add
# the dependencies so that CMake will reconfigure properly when the LLVMBuild
# files change.
include ( ${ LLVMBUILDCMAKEFRAG } )
######
# Configure all of the various header file fragments LLVM uses which depend on
# configuration variables.
set ( LLVM_ENUM_TARGETS "" )
set ( LLVM_ENUM_ASM_PRINTERS "" )
set ( LLVM_ENUM_ASM_PARSERS "" )
set ( LLVM_ENUM_DISASSEMBLERS "" )
foreach ( t ${ LLVM_TARGETS_TO_BUILD } )
set ( td ${ LLVM_MAIN_SRC_DIR } /lib/Target/ ${ t } )
list ( FIND LLVM_ALL_TARGETS ${ t } idx )
list ( FIND LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ${ t } idy )
if ( idx LESS 0 AND idy LESS 0 )
message ( FATAL_ERROR " The target ` ${ t } ' does not exist.
I t s h o u l d b e o n e o f \ n $ { L L V M _ A L L _ T A R G E T S } " )
else ( )
set ( LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${t})\n" )
endif ( )
file ( GLOB asmp_file "${td}/*AsmPrinter.cpp" )
if ( asmp_file )
set ( LLVM_ENUM_ASM_PRINTERS
" $ { L L V M _ E N U M _ A S M _ P R I N T E R S } LLVM_ASM_PRINTER ( ${ t } ) \ n " )
endif ( )
if ( EXISTS ${ td } /AsmParser/CMakeLists.txt )
set ( LLVM_ENUM_ASM_PARSERS
" $ { L L V M _ E N U M _ A S M _ P A R S E R S } LLVM_ASM_PARSER ( ${ t } ) \ n " )
endif ( )
if ( EXISTS ${ td } /Disassembler/CMakeLists.txt )
set ( LLVM_ENUM_DISASSEMBLERS
" $ { L L V M _ E N U M _ D I S A S S E M B L E R S } LLVM_DISASSEMBLER ( ${ t } ) \ n " )
endif ( )
endforeach ( t )
# Produce the target definition files, which provide a way for clients to easily
# include various classes of targets.
configure_file (
$ { L L V M _ M A I N _ I N C L U D E _ D I R } / l l v m / C o n f i g / A s m P r i n t e r s . d e f . i n
$ { L L V M _ I N C L U D E _ D I R } / l l v m / C o n f i g / A s m P r i n t e r s . d e f
)
configure_file (
$ { L L V M _ M A I N _ I N C L U D E _ D I R } / l l v m / C o n f i g / A s m P a r s e r s . d e f . i n
$ { L L V M _ I N C L U D E _ D I R } / l l v m / C o n f i g / A s m P a r s e r s . d e f
)
configure_file (
$ { L L V M _ M A I N _ I N C L U D E _ D I R } / l l v m / C o n f i g / D i s a s s e m b l e r s . d e f . i n
$ { L L V M _ I N C L U D E _ D I R } / l l v m / C o n f i g / D i s a s s e m b l e r s . d e f
)
configure_file (
$ { L L V M _ M A I N _ I N C L U D E _ D I R } / l l v m / C o n f i g / T a r g e t s . d e f . i n
$ { L L V M _ I N C L U D E _ D I R } / l l v m / C o n f i g / T a r g e t s . d e f
)
# Configure the three LLVM configuration header files.
configure_file (
$ { L L V M _ M A I N _ I N C L U D E _ D I R } / l l v m / C o n f i g / c o n f i g . h . c m a k e
$ { L L V M _ I N C L U D E _ D I R } / l l v m / C o n f i g / c o n f i g . h )
configure_file (
$ { L L V M _ M A I N _ I N C L U D E _ D I R } / l l v m / C o n f i g / l l v m - c o n f i g . h . c m a k e
$ { L L V M _ I N C L U D E _ D I R } / l l v m / C o n f i g / l l v m - c o n f i g . h )
2016-11-29 06:23:53 +08:00
configure_file (
$ { L L V M _ M A I N _ I N C L U D E _ D I R } / l l v m / C o n f i g / a b i - b r e a k i n g . h . c m a k e
$ { L L V M _ I N C L U D E _ D I R } / l l v m / C o n f i g / a b i - b r e a k i n g . h )
2016-03-29 02:19:32 +08:00
configure_file (
$ { L L V M _ M A I N _ I N C L U D E _ D I R } / l l v m / S u p p o r t / D a t a T y p e s . h . c m a k e
$ { L L V M _ I N C L U D E _ D I R } / l l v m / S u p p o r t / D a t a T y p e s . h )
2017-03-06 22:26:50 +08:00
# Add target for generating source rpm package.
set ( LLVM_SRPM_USER_BINARY_SPECFILE ${ CMAKE_CURRENT_SOURCE_DIR } /llvm.spec.in
C A C H E F I L E P A T H " . s p e c f i l e t o u s e f o r s r p m g e n e r a t i o n " )
set ( LLVM_SRPM_BINARY_SPECFILE ${ CMAKE_CURRENT_BINARY_DIR } /llvm.spec )
set ( LLVM_SRPM_DIR "${CMAKE_CURRENT_BINARY_DIR}/srpm" )
# SVN_REVISION and GIT_COMMIT get set by the call to add_version_info_from_vcs.
# DUMMY_VAR contains a version string which we don't care about.
add_version_info_from_vcs ( DUMMY_VAR )
if ( SVN_REVISION )
set ( LLVM_RPM_SPEC_REVISION "r${SVN_REVISION}" )
elseif ( GIT_COMMIT )
set ( LLVM_RPM_SPEC_REVISION "g${GIT_COMMIT}" )
endif ( )
configure_file (
$ { L L V M _ S R P M _ U S E R _ B I N A R Y _ S P E C F I L E }
$ { L L V M _ S R P M _ B I N A R Y _ S P E C F I L E } @ O N L Y )
add_custom_target ( srpm
C O M M A N D c p a c k - G T G Z - - c o n f i g C P a c k S o u r c e C o n f i g . c m a k e - B $ { L L V M _ S R P M _ D I R } / S O U R C E S
C O M M A N D r p m b u i l d - b s - - d e f i n e ' _ t o p d i r $ { L L V M _ S R P M _ D I R } ' $ { L L V M _ S R P M _ B I N A R Y _ S P E C F I L E } )
2016-03-29 02:19:32 +08:00
# They are not referenced. See set_output_directory().
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ LLVM_BINARY_DIR } /bin )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ LLVM_BINARY_DIR } /lib ${ LLVM_LIBDIR_SUFFIX } )
set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${ LLVM_BINARY_DIR } /lib ${ LLVM_LIBDIR_SUFFIX } )
if ( APPLE AND DARWIN_LTO_LIBRARY )
set ( CMAKE_EXE_LINKER_FLAGS
" $ { C M A K E _ E X E _ L I N K E R _ F L A G S } - W l , - l t o _ l i b r a r y - W l , $ { D A R W I N _ L T O _ L I B R A R Y } " )
set ( CMAKE_SHARED_LINKER_FLAGS
" $ { C M A K E _ S H A R E D _ L I N K E R _ F L A G S } - W l , - l t o _ l i b r a r y - W l , $ { D A R W I N _ L T O _ L I B R A R Y } " )
set ( CMAKE_MODULE_LINKER_FLAGS
" $ { C M A K E _ M O D U L E _ L I N K E R _ F L A G S } - W l , - l t o _ l i b r a r y - W l , $ { D A R W I N _ L T O _ L I B R A R Y } " )
endif ( )
# Work around a broken bfd ld behavior. When linking a binary with a
# foo.so library, it will try to find any library that foo.so uses and
# check its symbols. This is wasteful (the check was done when foo.so
# was created) and can fail since it is not the dynamic linker and
# doesn't know how to handle search paths correctly.
2016-07-20 06:46:39 +08:00
if ( UNIX AND NOT APPLE AND NOT ${ CMAKE_SYSTEM_NAME } MATCHES "SunOS|AIX" )
2016-03-29 02:19:32 +08:00
set ( CMAKE_EXE_LINKER_FLAGS
" $ { C M A K E _ E X E _ L I N K E R _ F L A G S } - W l , - a l l o w - s h l i b - u n d e f i n e d " )
endif ( )
set ( CMAKE_INCLUDE_CURRENT_DIR ON )
include_directories ( ${ LLVM_INCLUDE_DIR } ${ LLVM_MAIN_INCLUDE_DIR } )
# when crosscompiling import the executable targets from a file
if ( LLVM_USE_HOST_TOOLS )
include ( CrossCompile )
endif ( LLVM_USE_HOST_TOOLS )
if ( LLVM_TARGET_IS_CROSSCOMPILE_HOST )
# Dummy use to avoid CMake Wraning: Manually-specified variables were not used
# (this is a variable that CrossCompile sets on recursive invocations)
endif ( )
if ( ${ CMAKE_SYSTEM_NAME } MATCHES "(FreeBSD|DragonFly)" )
# On FreeBSD, /usr/local/* is not used by default. In order to build LLVM
# with libxml2, iconv.h, etc., we must add /usr/local paths.
include_directories ( "/usr/local/include" )
link_directories ( "/usr/local/lib" )
endif ( ${ CMAKE_SYSTEM_NAME } MATCHES "(FreeBSD|DragonFly)" )
if ( ${ CMAKE_SYSTEM_NAME } MATCHES SunOS )
SET ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include llvm/Support/Solaris.h" )
endif ( ${ CMAKE_SYSTEM_NAME } MATCHES SunOS )
# Make sure we don't get -rdynamic in every binary. For those that need it,
# use export_executable_symbols(target).
set ( CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "" )
set ( LLVM_PROFDATA_FILE "" CACHE FILEPATH
" P r o f i l i n g d a t a f i l e t o u s e w h e n c o m p i l i n g i n o r d e r t o i m p r o v e r u n t i m e p e r f o r m a n c e . " )
if ( LLVM_PROFDATA_FILE AND EXISTS ${ LLVM_PROFDATA_FILE } )
if ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
add_definitions ( "-fprofile-instr-use=${LLVM_PROFDATA_FILE}" )
else ( )
message ( FATAL_ERROR "LLVM_PROFDATA_FILE can only be specified when compiling with clang" )
endif ( )
endif ( )
include ( AddLLVM )
include ( TableGen )
if ( MINGW )
# People report that -O3 is unreliable on MinGW. The traditional
# build also uses -O2 for that reason:
llvm_replace_compiler_option ( CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2" )
endif ( )
# Put this before tblgen. Else we have a circular dependence.
2016-09-07 04:16:19 +08:00
add_subdirectory ( lib/Demangle )
2016-03-29 02:19:32 +08:00
add_subdirectory ( lib/Support )
add_subdirectory ( lib/TableGen )
add_subdirectory ( utils/TableGen )
2016-07-01 04:35:56 +08:00
# Force target to be built as soon as possible. Clang modules builds depend
# header-wise on it as they ship all headers from the umbrella folders. Building
# an entire module might include header, which depends on intrinsics_gen. This
# should be right after LLVMSupport and LLVMTableGen otherwise we introduce a
# circular dependence.
if ( LLVM_ENABLE_MODULES )
list ( APPEND LLVM_COMMON_DEPENDS intrinsics_gen )
endif ( LLVM_ENABLE_MODULES )
2016-03-29 02:19:32 +08:00
add_subdirectory ( include/llvm )
add_subdirectory ( lib )
if ( LLVM_INCLUDE_UTILS )
add_subdirectory ( utils/FileCheck )
add_subdirectory ( utils/PerfectShuffle )
add_subdirectory ( utils/count )
add_subdirectory ( utils/not )
add_subdirectory ( utils/llvm-lit )
add_subdirectory ( utils/yaml-bench )
else ( )
if ( LLVM_INCLUDE_TESTS )
message ( FATAL_ERROR " Including tests when not building utils will not work.
E i t h e r s e t L L V M _ I N C L U D E _ U T I L S t o O n , o r s e t L L V M _ I N C L D E _ T E S T S t o O f f . " )
endif ( )
endif ( )
# Use LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION instead of LLVM_INCLUDE_UTILS because it is not really a util
if ( LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION )
add_subdirectory ( utils/LLVMVisualizers )
endif ( )
foreach ( binding ${ LLVM_BINDINGS_LIST } )
if ( EXISTS "${LLVM_MAIN_SRC_DIR}/bindings/${binding}/CMakeLists.txt" )
add_subdirectory ( bindings/ ${ binding } )
endif ( )
endforeach ( )
add_subdirectory ( projects )
if ( LLVM_INCLUDE_TOOLS )
add_subdirectory ( tools )
endif ( )
2017-03-24 06:40:10 +08:00
if ( LLVM_INCLUDE_RUNTIMES )
add_subdirectory ( runtimes )
endif ( )
2016-06-24 06:07:21 +08:00
2016-03-29 02:19:32 +08:00
if ( LLVM_INCLUDE_EXAMPLES )
add_subdirectory ( examples )
endif ( )
if ( LLVM_INCLUDE_TESTS )
if ( EXISTS ${ LLVM_MAIN_SRC_DIR } /projects/test-suite AND TARGET clang )
include ( LLVMExternalProjectUtils )
llvm_ExternalProject_Add ( test-suite ${ LLVM_MAIN_SRC_DIR } /projects/test-suite
U S E _ T O O L C H A I N
E X C L U D E _ F R O M _ A L L
2016-06-24 06:07:21 +08:00
N O _ I N S T A L L
A L W A Y S _ C L E A N )
2016-03-29 02:19:32 +08:00
endif ( )
add_subdirectory ( test )
add_subdirectory ( unittests )
2017-06-10 00:37:39 +08:00
if ( LLVM_INCLUDE_UTILS )
add_subdirectory ( utils/unittest )
endif ( )
2016-12-23 03:11:42 +08:00
if ( WIN32 )
2016-03-29 02:19:32 +08:00
# This utility is used to prevent crashing tests from calling Dr. Watson on
# Windows.
add_subdirectory ( utils/KillTheDoctor )
endif ( )
# Add a global check rule now that all subdirectories have been traversed
# and we know the total set of lit testsuites.
get_property ( LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES )
get_property ( LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS )
get_property ( LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS )
get_property ( LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS )
2016-09-02 02:26:01 +08:00
get_property ( LLVM_ADDITIONAL_TEST_TARGETS
G L O B A L P R O P E R T Y L L V M _ A D D I T I O N A L _ T E S T _ T A R G E T S )
get_property ( LLVM_ADDITIONAL_TEST_DEPENDS
G L O B A L P R O P E R T Y L L V M _ A D D I T I O N A L _ T E S T _ D E P E N D S )
2016-03-29 02:19:32 +08:00
add_lit_target ( check-all
" R u n n i n g a l l r e g r e s s i o n t e s t s "
$ { L L V M _ L I T _ T E S T S U I T E S }
P A R A M S $ { L L V M _ L I T _ P A R A M S }
2016-09-02 02:26:01 +08:00
D E P E N D S $ { L L V M _ L I T _ D E P E N D S } $ { L L V M _ A D D I T I O N A L _ T E S T _ T A R G E T S }
2016-03-29 02:19:32 +08:00
A R G S $ { L L V M _ L I T _ E X T R A _ A R G S }
)
2016-08-26 01:18:41 +08:00
if ( TARGET check-runtimes )
add_dependencies ( check-all check-runtimes )
endif ( )
2016-09-02 02:26:01 +08:00
add_custom_target ( test-depends
D E P E N D S $ { L L V M _ L I T _ D E P E N D S } $ { L L V M _ A D D I T I O N A L _ T E S T _ D E P E N D S } )
2016-04-12 23:09:14 +08:00
set_target_properties ( test-depends PROPERTIES FOLDER "Tests" )
2016-03-29 02:19:32 +08:00
endif ( )
if ( LLVM_INCLUDE_DOCS )
add_subdirectory ( docs )
endif ( )
add_subdirectory ( cmake/modules )
if ( NOT LLVM_INSTALL_TOOLCHAIN_ONLY )
install ( DIRECTORY include/llvm include/llvm-c
D E S T I N A T I O N i n c l u d e
C O M P O N E N T l l v m - h e a d e r s
F I L E S _ M A T C H I N G
P A T T E R N " * . d e f "
P A T T E R N " * . h "
P A T T E R N " * . t d "
P A T T E R N " * . i n c "
P A T T E R N " L I C E N S E . T X T "
P A T T E R N " . s v n " E X C L U D E
)
install ( DIRECTORY ${ LLVM_INCLUDE_DIR } /llvm
D E S T I N A T I O N i n c l u d e
C O M P O N E N T l l v m - h e a d e r s
F I L E S _ M A T C H I N G
P A T T E R N " * . d e f "
P A T T E R N " * . h "
P A T T E R N " * . g e n "
P A T T E R N " * . i n c "
# Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
P A T T E R N " C M a k e F i l e s " E X C L U D E
P A T T E R N " c o n f i g . h " E X C L U D E
P A T T E R N " . s v n " E X C L U D E
)
2016-10-25 05:58:58 +08:00
# Installing the headers needs to depend on generating any public
# tablegen'd headers.
add_custom_target ( llvm-headers DEPENDS intrinsics_gen )
2016-03-29 02:19:32 +08:00
if ( NOT CMAKE_CONFIGURATION_TYPES )
2016-10-25 05:58:58 +08:00
add_custom_target ( install-llvm-headers
D E P E N D S l l v m - h e a d e r s
2016-03-29 02:19:32 +08:00
C O M M A N D " $ { C M A K E _ C O M M A N D } "
- D C M A K E _ I N S T A L L _ C O M P O N E N T = l l v m - h e a d e r s
- P " $ { C M A K E _ B I N A R Y _ D I R } / c m a k e _ i n s t a l l . c m a k e " )
endif ( )
endif ( )
# This must be at the end of the LLVM root CMakeLists file because it must run
# after all targets are created.
if ( LLVM_DISTRIBUTION_COMPONENTS )
if ( CMAKE_CONFIGURATION_TYPES )
message ( FATAL_ERROR "LLVM_DISTRIBUTION_COMPONENTS cannot be specified with multi-configuration generators (i.e. Xcode or Visual Studio)" )
endif ( )
add_custom_target ( distribution )
add_custom_target ( install-distribution )
foreach ( target ${ LLVM_DISTRIBUTION_COMPONENTS } )
if ( TARGET ${ target } )
add_dependencies ( distribution ${ target } )
else ( )
message ( FATAL_ERROR "Specified distribution component '${target}' doesn't have a target" )
endif ( )
if ( TARGET install- ${ target } )
add_dependencies ( install-distribution install- ${ target } )
else ( )
message ( FATAL_ERROR "Specified distribution component '${target}' doesn't have an install target" )
endif ( )
endforeach ( )
endif ( )
2017-01-28 15:39:52 +08:00
# This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake
if ( MSVC )
include ( InstallRequiredSystemLibraries )
endif ( )