Make -disable-simplify-libcalls work with -std-compile-opts
[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 include(VersionFromVCS)
16
17 option(LLVM_APPEND_VC_REV
18   "Append the version control system revision id to LLVM version" OFF)
19
20 if( LLVM_APPEND_VC_REV )
21   add_version_info_from_vcs(PACKAGE_VERSION)
22 endif()
23
24 set(PACKAGE_NAME llvm)
25 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
26 set(PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu")
27
28 if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
29   message(FATAL_ERROR "In-source builds are not allowed.
30 CMake would overwrite the makefiles distributed with LLVM.
31 Please create a directory and run cmake from there, passing the path
32 to this source directory as the last argument.
33 This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
34 Please delete them.")
35 endif()
36
37 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
38
39 set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
40 set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include)
41 set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
42 set(LLVM_TOOLS_BINARY_DIR ${LLVM_BINARY_DIR}/bin)
43 set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
44 set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
45
46 if( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
47   file(GLOB_RECURSE
48     tablegenned_files_on_include_dir
49     "${LLVM_MAIN_SRC_DIR}/include/llvm/*.gen")
50   file(GLOB_RECURSE
51     tablegenned_files_on_lib_dir
52     "${LLVM_MAIN_SRC_DIR}/lib/Target/*.inc")
53   if( tablegenned_files_on_include_dir OR tablegenned_files_on_lib_dir)
54     message(FATAL_ERROR "Apparently there is a previous in-source build,
55 probably as the result of running `configure' and `make' on
56 ${LLVM_MAIN_SRC_DIR}.
57 This may cause problems. The suspicious files are:
58 ${tablegenned_files_on_lib_dir}
59 ${tablegenned_files_on_include_dir}
60 Please clean the source directory.")
61   endif()
62 endif()
63
64 set(LLVM_ALL_TARGETS
65   Alpha
66   ARM
67   Blackfin
68   CBackend
69   CellSPU
70   CppBackend
71   Mips
72   MBlaze
73   MSP430
74   PowerPC
75   PTX
76   Sparc
77   SystemZ
78   X86
79   XCore
80   )
81
82 if( MSVC )
83   set(LLVM_TARGETS_TO_BUILD X86
84     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
85 else( MSVC )
86   set(LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS}
87     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
88 endif( MSVC )
89
90 option(LLVM_ENABLE_CBE_PRINTF_A "Set to ON if CBE is enabled for printf %a output" ON)
91 if(LLVM_ENABLE_CBE_PRINTF_A)
92   set(ENABLE_CBE_PRINTF_A 1)
93 endif()
94
95 option(LLVM_ENABLE_TIMESTAMPS "Enable embedding timestamp information in build" ON)
96 if(LLVM_ENABLE_TIMESTAMPS)
97   set(ENABLE_TIMESTAMPS 1)
98 endif()
99
100 option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
101 set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
102 set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
103
104 set(LLVM_TARGET_ARCH "host"
105   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
106
107 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
108
109 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
110   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
111 endif()
112
113 set(LLVM_ENUM_TARGETS "")
114 foreach(c ${LLVM_TARGETS_TO_BUILD})
115   list(FIND LLVM_ALL_TARGETS ${c} idx)
116   if( idx LESS 0 )
117     message(FATAL_ERROR "The target `${c}' does not exist.
118     It should be one of\n${LLVM_ALL_TARGETS}")
119   else()
120     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
121   endif()
122 endforeach(c)
123
124 # Produce llvm/Config/Targets.def
125 configure_file(
126   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
127   ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
128   )
129
130 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
131
132 include(AddLLVMDefinitions)
133
134 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
135
136 include(config-ix)
137
138 include(HandleLLVMOptions)
139
140 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
141   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
142 else()
143   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
144 endif()
145
146 configure_file(
147   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
148   ${LLVM_BINARY_DIR}/include/llvm/Config/config.h)
149
150 configure_file(
151   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
152   ${LLVM_BINARY_DIR}/include/llvm/Config/llvm-config.h)
153
154 configure_file(
155   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/DataTypes.h.cmake
156   ${LLVM_BINARY_DIR}/include/llvm/Support/DataTypes.h)
157
158 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
159 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
160 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
161
162 # MSVC has a gazillion warnings with this.
163 if( MSVC )
164   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
165 else( MSVC )
166   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
167 endif()
168
169 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
170 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
171
172 set(CMAKE_INCLUDE_CURRENT_DIR ON)
173
174 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
175
176 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
177    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/Support/Solaris.h")
178 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
179
180 include(AddLLVM)
181 include(TableGen)
182
183 if( MINGW )
184   get_system_libs(LLVM_SYSTEM_LIBS_LIST)
185   foreach(l ${LLVM_SYSTEM_LIBS_LIST})
186     set(LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS} -l${l}")
187   endforeach()
188   set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
189   set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
190 endif()
191
192 if( MINGW )
193   # People report that -O3 is unreliable on MinGW. The traditional
194   # build also uses -O2 for that reason:
195   llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
196 endif()
197
198 add_subdirectory(lib/Support)
199
200 # Everything else depends on Support:
201 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
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/VMCore)
218 add_subdirectory(lib/CodeGen)
219 add_subdirectory(lib/CodeGen/SelectionDAG)
220 add_subdirectory(lib/CodeGen/AsmPrinter)
221 add_subdirectory(lib/Bitcode/Reader)
222 add_subdirectory(lib/Bitcode/Writer)
223 add_subdirectory(lib/Transforms/Utils)
224 add_subdirectory(lib/Transforms/Instrumentation)
225 add_subdirectory(lib/Transforms/InstCombine)
226 add_subdirectory(lib/Transforms/Scalar)
227 add_subdirectory(lib/Transforms/IPO)
228 add_subdirectory(lib/Transforms/Hello)
229 add_subdirectory(lib/Linker)
230 add_subdirectory(lib/Analysis)
231 add_subdirectory(lib/Analysis/IPA)
232 add_subdirectory(lib/MC)
233 add_subdirectory(lib/MC/MCParser)
234 add_subdirectory(lib/MC/MCDisassembler)
235 add_subdirectory(lib/Object)
236
237 add_subdirectory(utils/FileCheck)
238 add_subdirectory(utils/FileUpdate)
239 add_subdirectory(utils/count)
240 add_subdirectory(utils/not)
241 add_subdirectory(utils/llvm-lit)
242
243 set(LLVM_ENUM_ASM_PRINTERS "")
244 set(LLVM_ENUM_ASM_PARSERS "")
245 set(LLVM_ENUM_DISASSEMBLERS "")
246 foreach(t ${LLVM_TARGETS_TO_BUILD})
247   message(STATUS "Targeting ${t}")
248   add_subdirectory(lib/Target/${t})
249   add_subdirectory(lib/Target/${t}/TargetInfo)
250   set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
251   file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
252   if( asmp_file )
253     set(LLVM_ENUM_ASM_PRINTERS
254       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
255   endif()
256   if( EXISTS ${td}/InstPrinter/CMakeLists.txt )
257     add_subdirectory(lib/Target/${t}/InstPrinter)
258   endif()
259   if( EXISTS ${td}/AsmParser/CMakeLists.txt )
260     add_subdirectory(lib/Target/${t}/AsmParser)
261     set(LLVM_ENUM_ASM_PARSERS
262       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
263   endif()
264   if( EXISTS ${td}/Disassembler/CMakeLists.txt )
265     add_subdirectory(lib/Target/${t}/Disassembler)
266     set(LLVM_ENUM_DISASSEMBLERS
267       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
268   endif()
269   if( EXISTS ${td}/Utils/CMakeLists.txt )
270     add_subdirectory(${td}/Utils)
271   endif()
272   set(CURRENT_LLVM_TARGET)
273 endforeach(t)
274
275 # Produce llvm/Config/AsmPrinters.def
276 configure_file(
277   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
278   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
279   )
280
281 # Produce llvm/Config/AsmParsers.def
282 configure_file(
283   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
284   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
285   )
286
287 # Produce llvm/Config/Disassemblers.def
288 configure_file(
289   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
290   ${LLVM_BINARY_DIR}/include/llvm/Config/Disassemblers.def
291   )
292
293 add_subdirectory(lib/ExecutionEngine)
294 add_subdirectory(lib/ExecutionEngine/Interpreter)
295 add_subdirectory(lib/ExecutionEngine/JIT)
296 add_subdirectory(lib/ExecutionEngine/MCJIT)
297 add_subdirectory(lib/Target)
298 add_subdirectory(lib/AsmParser)
299 add_subdirectory(lib/Archive)
300
301 add_subdirectory(projects)
302
303 option(LLVM_BUILD_TOOLS
304   "Build the LLVM tools. If OFF, just generate build targets." ON)
305 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
306 if( LLVM_INCLUDE_TOOLS )
307   add_subdirectory(tools)
308 endif()
309
310 option(LLVM_BUILD_EXAMPLES
311   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
312 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
313 if( LLVM_INCLUDE_EXAMPLES )
314   add_subdirectory(examples)
315 endif()
316
317 option(LLVM_BUILD_TESTS
318   "Build LLVM unit tests. If OFF, just generate build targes." OFF)
319 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
320 if( LLVM_INCLUDE_TESTS )
321   add_subdirectory(test)
322   add_subdirectory(utils/unittest)
323   add_subdirectory(unittests)
324   if (MSVC)
325     # This utility is used to prevent chrashing tests from calling Dr. Watson on
326     # Windows.
327     add_subdirectory(utils/KillTheDoctor)
328   endif()
329 endif()
330
331 add_subdirectory(cmake/modules)
332
333 install(DIRECTORY include/
334   DESTINATION include
335   FILES_MATCHING
336   PATTERN "*.def"
337   PATTERN "*.h"
338   PATTERN "*.td"
339   PATTERN "*.inc"
340   PATTERN ".svn" EXCLUDE
341   )
342
343 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
344   DESTINATION include
345   FILES_MATCHING
346   PATTERN "*.def"
347   PATTERN "*.h"
348   PATTERN "*.gen"
349   PATTERN "*.inc"
350   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
351   PATTERN "CMakeFiles" EXCLUDE
352   PATTERN ".svn" EXCLUDE
353   )
354
355 # TODO: make and install documentation.
356
357 set(CPACK_PACKAGE_VENDOR "LLVM")
358 set(CPACK_PACKAGE_VERSION_MAJOR 2)
359 set(CPACK_PACKAGE_VERSION_MINOR 9)
360 add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH)
361 include(CPack)
362
363 # Workaround for MSVS10 to avoid the Dialog Hell
364 # FIXME: This could be removed with future version of CMake.
365 if(MSVC_VERSION EQUAL 1600)
366   set(LLVM_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/LLVM.sln")
367   if( EXISTS "${LLVM_SLN_FILENAME}" )
368     file(APPEND "${LLVM_SLN_FILENAME}" "\n# This should be regenerated!\n")
369   endif()
370 endif()