Moved more stuff to HandleLLVMOptions.cmake
[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 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
173
174 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
175    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/Support/Solaris.h")
176 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
177
178 include(AddLLVM)
179 include(TableGen)
180
181 if( MINGW )
182   get_system_libs(LLVM_SYSTEM_LIBS_LIST)
183   foreach(l ${LLVM_SYSTEM_LIBS_LIST})
184     set(LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS} -l${l}")
185   endforeach()
186   set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
187   set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
188 endif()
189
190 if( 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")
194 endif()
195
196 add_subdirectory(lib/Support)
197
198 # Everything else depends on Support:
199 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
200
201 set(LLVM_TABLEGEN "tblgen" CACHE
202   STRING "Native TableGen executable. Saves building one when cross-compiling.")
203 # Effective tblgen executable to be used:
204 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
205
206 add_subdirectory(utils/TableGen)
207
208 if( CMAKE_CROSSCOMPILING )
209   # This adds a dependency on target `tblgen', so must go after utils/TableGen
210   include( CrossCompileLLVM )
211 endif( CMAKE_CROSSCOMPILING )
212
213 add_subdirectory(include/llvm)
214
215 add_subdirectory(lib/VMCore)
216 add_subdirectory(lib/CodeGen)
217 add_subdirectory(lib/CodeGen/SelectionDAG)
218 add_subdirectory(lib/CodeGen/AsmPrinter)
219 add_subdirectory(lib/Bitcode/Reader)
220 add_subdirectory(lib/Bitcode/Writer)
221 add_subdirectory(lib/Transforms/Utils)
222 add_subdirectory(lib/Transforms/Instrumentation)
223 add_subdirectory(lib/Transforms/InstCombine)
224 add_subdirectory(lib/Transforms/Scalar)
225 add_subdirectory(lib/Transforms/IPO)
226 add_subdirectory(lib/Transforms/Hello)
227 add_subdirectory(lib/Linker)
228 add_subdirectory(lib/Analysis)
229 add_subdirectory(lib/Analysis/IPA)
230 add_subdirectory(lib/MC)
231 add_subdirectory(lib/MC/MCParser)
232 add_subdirectory(lib/MC/MCDisassembler)
233 add_subdirectory(lib/Object)
234
235 add_subdirectory(utils/FileCheck)
236 add_subdirectory(utils/FileUpdate)
237 add_subdirectory(utils/count)
238 add_subdirectory(utils/not)
239 add_subdirectory(utils/llvm-lit)
240
241 set(LLVM_ENUM_ASM_PRINTERS "")
242 set(LLVM_ENUM_ASM_PARSERS "")
243 set(LLVM_ENUM_DISASSEMBLERS "")
244 foreach(t ${LLVM_TARGETS_TO_BUILD})
245   message(STATUS "Targeting ${t}")
246   add_subdirectory(lib/Target/${t})
247   add_subdirectory(lib/Target/${t}/TargetInfo)
248   set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
249   file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
250   if( asmp_file )
251     set(LLVM_ENUM_ASM_PRINTERS
252       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
253   endif()
254   if( EXISTS ${td}/InstPrinter/CMakeLists.txt )
255     add_subdirectory(lib/Target/${t}/InstPrinter)
256   endif()
257   if( EXISTS ${td}/AsmParser/CMakeLists.txt )
258     add_subdirectory(lib/Target/${t}/AsmParser)
259     set(LLVM_ENUM_ASM_PARSERS
260       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
261   endif()
262   if( EXISTS ${td}/Disassembler/CMakeLists.txt )
263     add_subdirectory(lib/Target/${t}/Disassembler)
264     set(LLVM_ENUM_DISASSEMBLERS
265       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
266   endif()
267   set(CURRENT_LLVM_TARGET)
268 endforeach(t)
269
270 # Produce llvm/Config/AsmPrinters.def
271 configure_file(
272   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
273   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
274   )
275
276 # Produce llvm/Config/AsmParsers.def
277 configure_file(
278   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
279   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
280   )
281
282 # Produce llvm/Config/Disassemblers.def
283 configure_file(
284   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
285   ${LLVM_BINARY_DIR}/include/llvm/Config/Disassemblers.def
286   )
287
288 add_subdirectory(lib/ExecutionEngine)
289 add_subdirectory(lib/ExecutionEngine/Interpreter)
290 add_subdirectory(lib/ExecutionEngine/JIT)
291 add_subdirectory(lib/ExecutionEngine/MCJIT)
292 add_subdirectory(lib/Target)
293 add_subdirectory(lib/AsmParser)
294 add_subdirectory(lib/Archive)
295
296 add_subdirectory(projects)
297
298 option(LLVM_BUILD_TOOLS
299   "Build the LLVM tools. If OFF, just generate build targets." ON)
300 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
301 if( LLVM_INCLUDE_TOOLS )
302   add_subdirectory(tools)
303 endif()
304
305 option(LLVM_BUILD_EXAMPLES
306   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
307 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
308 if( LLVM_INCLUDE_EXAMPLES )
309   add_subdirectory(examples)
310 endif()
311
312 option(LLVM_BUILD_TESTS
313   "Build LLVM unit tests. If OFF, just generate build targes." OFF)
314 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
315 if( LLVM_INCLUDE_TESTS )
316   add_subdirectory(test)
317   add_subdirectory(utils/unittest)
318   add_subdirectory(unittests)
319   if (MSVC)
320     # This utility is used to prevent chrashing tests from calling Dr. Watson on
321     # Windows.
322     add_subdirectory(utils/KillTheDoctor)
323   endif()
324 endif()
325
326 add_subdirectory(cmake/modules)
327
328 install(DIRECTORY include/
329   DESTINATION include
330   FILES_MATCHING
331   PATTERN "*.def"
332   PATTERN "*.h"
333   PATTERN "*.td"
334   PATTERN "*.inc"
335   PATTERN ".svn" EXCLUDE
336   )
337
338 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
339   DESTINATION include
340   FILES_MATCHING
341   PATTERN "*.def"
342   PATTERN "*.h"
343   PATTERN "*.gen"
344   PATTERN "*.inc"
345   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
346   PATTERN "CMakeFiles" EXCLUDE
347   PATTERN ".svn" EXCLUDE
348   )
349
350 # TODO: make and install documentation.
351
352 set(CPACK_PACKAGE_VENDOR "LLVM")
353 set(CPACK_PACKAGE_VERSION_MAJOR 2)
354 set(CPACK_PACKAGE_VERSION_MINOR 9)
355 add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH)
356 include(CPack)
357
358 # Workaround for MSVS10 to avoid the Dialog Hell
359 # FIXME: This could be removed with future version of CMake.
360 if(MSVC_VERSION EQUAL 1600)
361   set(LLVM_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/LLVM.sln")
362   if( EXISTS "${LLVM_SLN_FILENAME}" )
363     file(APPEND "${LLVM_SLN_FILENAME}" "\n# This should be regenerated!\n")
364   endif()
365 endif()