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