• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# See docs/CMake.html for instructions about how to build LLVM with CMake.
2
3project(LLVM)
4cmake_minimum_required(VERSION 2.8)
5
6# Add path for custom modules
7set(CMAKE_MODULE_PATH
8  ${CMAKE_MODULE_PATH}
9  "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
10  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
11  )
12
13set(PACKAGE_VERSION "3.0")
14
15set_property(GLOBAL PROPERTY USE_FOLDERS ON)
16
17include(VersionFromVCS)
18
19option(LLVM_APPEND_VC_REV
20  "Append the version control system revision id to LLVM version" OFF)
21
22if( LLVM_APPEND_VC_REV )
23  add_version_info_from_vcs(PACKAGE_VERSION)
24endif()
25
26set(PACKAGE_NAME llvm)
27set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
28set(PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu")
29
30if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
31  message(FATAL_ERROR "In-source builds are not allowed.
32CMake would overwrite the makefiles distributed with LLVM.
33Please create a directory and run cmake from there, passing the path
34to this source directory as the last argument.
35This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
36Please delete them.")
37endif()
38
39string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
40
41set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
42set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include)
43set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
44set(LLVM_TOOLS_BINARY_DIR ${LLVM_BINARY_DIR}/bin)
45set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
46set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
47
48if( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
49  file(GLOB_RECURSE
50    tablegenned_files_on_include_dir
51    "${LLVM_MAIN_SRC_DIR}/include/llvm/*.gen")
52  file(GLOB_RECURSE
53    tablegenned_files_on_lib_dir
54    "${LLVM_MAIN_SRC_DIR}/lib/Target/*.inc")
55  if( tablegenned_files_on_include_dir OR tablegenned_files_on_lib_dir)
56    message(FATAL_ERROR "Apparently there is a previous in-source build,
57probably as the result of running `configure' and `make' on
58${LLVM_MAIN_SRC_DIR}.
59This may cause problems. The suspicious files are:
60${tablegenned_files_on_lib_dir}
61${tablegenned_files_on_include_dir}
62Please clean the source directory.")
63  endif()
64endif()
65
66set(LLVM_ALL_TARGETS
67  Alpha
68  ARM
69  Blackfin
70  CBackend
71  CellSPU
72  CppBackend
73  Mips
74  MBlaze
75  MSP430
76  PowerPC
77  PTX
78  Sparc
79  SystemZ
80  X86
81  XCore
82  )
83
84# List of targets with JIT support:
85set(LLVM_TARGETS_WITH_JIT X86 PowerPC ARM)
86
87if( MSVC )
88  set(LLVM_TARGETS_TO_BUILD X86
89    CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
90else( MSVC )
91  set(LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS}
92    CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
93endif( MSVC )
94
95option(LLVM_ENABLE_CBE_PRINTF_A "Set to ON if CBE is enabled for printf %a output" ON)
96if(LLVM_ENABLE_CBE_PRINTF_A)
97  set(ENABLE_CBE_PRINTF_A 1)
98endif()
99
100option(LLVM_ENABLE_TIMESTAMPS "Enable embedding timestamp information in build" ON)
101if(LLVM_ENABLE_TIMESTAMPS)
102  set(ENABLE_TIMESTAMPS 1)
103endif()
104
105option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
106set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
107set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
108
109set(LLVM_TARGET_ARCH "host"
110  CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
111
112option(LLVM_ENABLE_THREADS "Use threads if available." ON)
113
114if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
115  set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
116endif()
117
118set(LLVM_ENUM_TARGETS "")
119foreach(c ${LLVM_TARGETS_TO_BUILD})
120  list(FIND LLVM_ALL_TARGETS ${c} idx)
121  if( idx LESS 0 )
122    message(FATAL_ERROR "The target `${c}' does not exist.
123    It should be one of\n${LLVM_ALL_TARGETS}")
124  else()
125    set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
126  endif()
127endforeach(c)
128
129# Produce llvm/Config/Targets.def
130configure_file(
131  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
132  ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
133  )
134
135set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
136
137include(AddLLVMDefinitions)
138
139option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
140
141# MSVC has a gazillion warnings with this.
142if( MSVC )
143  option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
144else( MSVC )
145  option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
146endif()
147
148option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
149option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
150
151if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
152  option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
153else()
154  option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
155endif()
156
157# All options referred to from HandleLLVMOptions have to be specified
158# BEFORE this include, otherwise options will not be correctly set on
159# first cmake run
160include(config-ix)
161include(HandleLLVMOptions)
162
163configure_file(
164  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
165  ${LLVM_BINARY_DIR}/include/llvm/Config/config.h)
166
167configure_file(
168  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
169  ${LLVM_BINARY_DIR}/include/llvm/Config/llvm-config.h)
170
171configure_file(
172  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/DataTypes.h.cmake
173  ${LLVM_BINARY_DIR}/include/llvm/Support/DataTypes.h)
174
175set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
176set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
177set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
178
179set(CMAKE_INCLUDE_CURRENT_DIR ON)
180
181include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
182
183if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
184   SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include llvm/Support/Solaris.h")
185endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
186
187include(AddLLVM)
188include(TableGen)
189
190if( MINGW )
191  # People report that -O3 is unreliable on MinGW. The traditional
192  # build also uses -O2 for that reason:
193  llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
194endif()
195
196# Put this before tblgen. Else we have a circular dependence.
197add_subdirectory(lib/Support)
198
199set(LLVM_TABLEGEN "tblgen" CACHE
200  STRING "Native TableGen executable. Saves building one when cross-compiling.")
201# Effective tblgen executable to be used:
202set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
203
204add_subdirectory(utils/TableGen)
205
206if( CMAKE_CROSSCOMPILING )
207  # This adds a dependency on target `tblgen', so must go after utils/TableGen
208  include( CrossCompileLLVM )
209endif( CMAKE_CROSSCOMPILING )
210
211add_subdirectory(include/llvm)
212
213add_subdirectory(lib)
214
215add_subdirectory(utils/FileCheck)
216add_subdirectory(utils/FileUpdate)
217add_subdirectory(utils/count)
218add_subdirectory(utils/not)
219add_subdirectory(utils/llvm-lit)
220
221add_subdirectory(projects)
222
223option(LLVM_BUILD_TOOLS
224  "Build the LLVM tools. If OFF, just generate build targets." ON)
225option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
226if( LLVM_INCLUDE_TOOLS )
227  add_subdirectory(tools)
228endif()
229
230option(LLVM_BUILD_RUNTIME
231  "Build the LLVM runtime libraries. If OFF, just generate build targets." ON)
232option(LLVM_INCLUDE_RUNTIME "Generate build targets for the LLVM runtimes" ON)
233if( LLVM_INCLUDE_RUNTIME )
234  add_subdirectory(runtime)
235endif()
236
237option(LLVM_BUILD_EXAMPLES
238  "Build the LLVM example programs. If OFF, just generate build targets." OFF)
239option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
240if( LLVM_INCLUDE_EXAMPLES )
241  add_subdirectory(examples)
242endif()
243
244option(LLVM_BUILD_TESTS
245  "Build LLVM unit tests. If OFF, just generate build targets." OFF)
246if( LLVM_INCLUDE_TESTS )
247  add_subdirectory(test)
248  add_subdirectory(utils/unittest)
249  add_subdirectory(unittests)
250  if (MSVC)
251    # This utility is used to prevent chrashing tests from calling Dr. Watson on
252    # Windows.
253    add_subdirectory(utils/KillTheDoctor)
254  endif()
255endif()
256
257add_subdirectory(cmake/modules)
258
259install(DIRECTORY include/
260  DESTINATION include
261  FILES_MATCHING
262  PATTERN "*.def"
263  PATTERN "*.h"
264  PATTERN "*.td"
265  PATTERN "*.inc"
266  PATTERN "LICENSE.TXT"
267  PATTERN ".svn" EXCLUDE
268  )
269
270install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
271  DESTINATION include
272  FILES_MATCHING
273  PATTERN "*.def"
274  PATTERN "*.h"
275  PATTERN "*.gen"
276  PATTERN "*.inc"
277  # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
278  PATTERN "CMakeFiles" EXCLUDE
279  PATTERN ".svn" EXCLUDE
280  )
281
282# TODO: make and install documentation.
283
284set(CPACK_PACKAGE_VENDOR "LLVM")
285set(CPACK_PACKAGE_VERSION_MAJOR 2)
286set(CPACK_PACKAGE_VERSION_MINOR 9)
287add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH)
288include(CPack)
289
290# Workaround for MSVS10 to avoid the Dialog Hell
291# FIXME: This could be removed with future version of CMake.
292if(MSVC_VERSION EQUAL 1600)
293  set(LLVM_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/LLVM.sln")
294  if( EXISTS "${LLVM_SLN_FILENAME}" )
295    file(APPEND "${LLVM_SLN_FILENAME}" "\n# This should be regenerated!\n")
296  endif()
297endif()
298