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 ( NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES )
message ( STATUS "No build type selected, default to Debug" )
set ( CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (default Debug)" )
endif ( )
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 ( )
if ( NOT DEFINED LLVM_VERSION_MAJOR )
set ( LLVM_VERSION_MAJOR 3 )
endif ( )
if ( NOT DEFINED LLVM_VERSION_MINOR )
set ( LLVM_VERSION_MINOR 9 )
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 ( )
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-04-29 04:14:19 +08:00
if ( APPLE )
if ( NOT CMAKE_LIBTOOL )
find_program ( CMAKE_LIBTOOL NAMES libtool )
endif ( )
if ( CMAKE_LIBTOOL )
set ( CMAKE_LIBTOOL ${ CMAKE_LIBTOOL } CACHE PATH "libtool executable" )
message ( STATUS "Found libtool - ${CMAKE_LIBTOOL}" )
get_property ( languages GLOBAL PROPERTY ENABLED_LANGUAGES )
foreach ( lang ${ languages } )
set ( CMAKE_ ${ lang } _CREATE_STATIC_LIBRARY
" $ { C M A K E _ L I B T O O L } - s t a t i c - o < T A R G E T > < L I N K _ F L A G S > < O B J E C T S > " )
endforeach ( )
endif ( )
endif ( )
2016-03-29 02:19:32 +08:00
# The following only works with the Ninja generator in CMake >= 3.0.
set ( LLVM_PARALLEL_COMPILE_JOBS "" CACHE STRING
" D e f i n e t h e m a x i m u m n u m b e r o f c o n c u r r e n t c o m p i l a t i o n j o b s . " )
if ( LLVM_PARALLEL_COMPILE_JOBS )
2016-06-09 06:38:30 +08:00
if ( NOT CMAKE_MAKE_PROGRAM MATCHES "ninja" )
message ( WARNING "Job pooling is only available with Ninja generators." )
2016-03-29 02:19:32 +08:00
else ( )
set_property ( GLOBAL APPEND PROPERTY JOB_POOLS compile_job_pool= ${ LLVM_PARALLEL_COMPILE_JOBS } )
set ( CMAKE_JOB_POOL_COMPILE compile_job_pool )
endif ( )
endif ( )
set ( LLVM_BUILD_GLOBAL_ISEL OFF CACHE BOOL "Experimental: Build GlobalISel" )
if ( LLVM_BUILD_GLOBAL_ISEL )
add_definitions ( -DLLVM_BUILD_GLOBAL_ISEL )
endif ( )
set ( LLVM_PARALLEL_LINK_JOBS "" CACHE STRING
" D e f i n e t h e m a x i m u m n u m b e r o f c o n c u r r e n t l i n k j o b s . " )
if ( LLVM_PARALLEL_LINK_JOBS )
2016-06-09 06:38:30 +08:00
if ( NOT CMAKE_MAKE_PROGRAM MATCHES "ninja" )
message ( WARNING "Job pooling is only available with Ninja generators." )
2016-03-29 02:19:32 +08:00
else ( )
set_property ( GLOBAL APPEND PROPERTY JOB_POOLS link_job_pool= ${ LLVM_PARALLEL_LINK_JOBS } )
set ( CMAKE_JOB_POOL_LINK link_job_pool )
endif ( )
endif ( )
# 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
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
M i p s
M S P 4 3 0
N V P T X
P o w e r P C
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 )
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 )
include ( AddLLVMDefinitions )
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 )
option ( LLVM_ENABLE_CXX1Y "Compile with C++1y enabled." OFF )
option ( LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF )
option ( LLVM_ENABLE_LIBCXXABI "Use libc++abi when using libc++." OFF )
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 )
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 )
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 )
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 )
# 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 } )
option ( LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF )
if ( CMAKE_CROSSCOMPILING OR ( LLVM_OPTIMIZED_TABLEGEN AND LLVM_ENABLE_ASSERTIONS ) )
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 )
set ( LLVM_PROFILE_FILE_PATTERN "%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" )
else ( )
file ( TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN )
endif ( )
endif ( )
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}" )
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 (
C O M M A N D $ { P Y T H O N _ E X E C U T A B L E } $ { L L V M B U I L D T O O L }
- - 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 )
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 )
# 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 } )
set ( CMAKE_BUILD_WITH_INSTALL_RPATH ON )
if ( APPLE )
set ( CMAKE_INSTALL_NAME_DIR "@rpath" )
set ( CMAKE_INSTALL_RPATH "@executable_path/../lib" )
else ( UNIX )
if ( NOT DEFINED CMAKE_INSTALL_RPATH )
set ( CMAKE_INSTALL_RPATH "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" )
if ( ${ CMAKE_SYSTEM_NAME } MATCHES "(FreeBSD|DragonFly)" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,origin" )
set ( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,origin" )
endif ( )
endif ( NOT DEFINED CMAKE_INSTALL_RPATH )
endif ( )
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.
if ( UNIX AND NOT APPLE AND NOT ${ CMAKE_SYSTEM_NAME } MATCHES "SunOS" )
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.
add_subdirectory ( lib/Support )
add_subdirectory ( lib/TableGen )
add_subdirectory ( utils/TableGen )
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 ( )
if ( LLVM_INCLUDE_TESTS )
add_subdirectory ( utils/unittest )
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 ( )
2016-06-24 06:07:21 +08:00
add_subdirectory ( runtimes )
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 )
if ( MSVC )
# 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 )
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 }
D E P E N D S $ { L L V M _ L I T _ D E P E N D S }
A R G S $ { L L V M _ L I T _ E X T R A _ A R G S }
)
add_custom_target ( test-depends DEPENDS ${ LLVM_LIT_DEPENDS } )
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
)
if ( NOT CMAKE_CONFIGURATION_TYPES )
add_custom_target ( installhdrs
D E P E N D S $ { n a m e }
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 ( )