PR9139: Specify ARM/Darwin triple for vector-DAGCombine.ll test.
[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   set(CURRENT_LLVM_TARGET)
270 endforeach(t)
271
272 # Produce llvm/Config/AsmPrinters.def
273 configure_file(
274   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
275   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
276   )
277
278 # Produce llvm/Config/AsmParsers.def
279 configure_file(
280   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
281   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
282   )
283
284 # Produce llvm/Config/Disassemblers.def
285 configure_file(
286   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
287   ${LLVM_BINARY_DIR}/include/llvm/Config/Disassemblers.def
288   )
289
290 add_subdirectory(lib/ExecutionEngine)
291 add_subdirectory(lib/ExecutionEngine/Interpreter)
292 add_subdirectory(lib/ExecutionEngine/JIT)
293 add_subdirectory(lib/ExecutionEngine/MCJIT)
294 add_subdirectory(lib/Target)
295 add_subdirectory(lib/AsmParser)
296 add_subdirectory(lib/Archive)
297
298 add_subdirectory(projects)
299
300 option(LLVM_BUILD_TOOLS
301   "Build the LLVM tools. If OFF, just generate build targets." ON)
302 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
303 if( LLVM_INCLUDE_TOOLS )
304   add_subdirectory(tools)
305 endif()
306
307 option(LLVM_BUILD_EXAMPLES
308   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
309 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
310 if( LLVM_INCLUDE_EXAMPLES )
311   add_subdirectory(examples)
312 endif()
313
314 option(LLVM_BUILD_TESTS
315   "Build LLVM unit tests. If OFF, just generate build targes." OFF)
316 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
317 if( LLVM_INCLUDE_TESTS )
318   add_subdirectory(test)
319   add_subdirectory(utils/unittest)
320   add_subdirectory(unittests)
321   if (MSVC)
322     # This utility is used to prevent chrashing tests from calling Dr. Watson on
323     # Windows.
324     add_subdirectory(utils/KillTheDoctor)
325   endif()
326 endif()
327
328 add_subdirectory(cmake/modules)
329
330 install(DIRECTORY include/
331   DESTINATION include
332   FILES_MATCHING
333   PATTERN "*.def"
334   PATTERN "*.h"
335   PATTERN "*.td"
336   PATTERN "*.inc"
337   PATTERN ".svn" EXCLUDE
338   )
339
340 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
341   DESTINATION include
342   FILES_MATCHING
343   PATTERN "*.def"
344   PATTERN "*.h"
345   PATTERN "*.gen"
346   PATTERN "*.inc"
347   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
348   PATTERN "CMakeFiles" EXCLUDE
349   PATTERN ".svn" EXCLUDE
350   )
351
352 # TODO: make and install documentation.
353
354 set(CPACK_PACKAGE_VENDOR "LLVM")
355 set(CPACK_PACKAGE_VERSION_MAJOR 2)
356 set(CPACK_PACKAGE_VERSION_MINOR 9)
357 add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH)
358 include(CPack)
359
360 # Workaround for MSVS10 to avoid the Dialog Hell
361 # FIXME: This could be removed with future version of CMake.
362 if(MSVC_VERSION EQUAL 1600)
363   set(LLVM_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/LLVM.sln")
364   if( EXISTS "${LLVM_SLN_FILENAME}" )
365     file(APPEND "${LLVM_SLN_FILENAME}" "\n# This should be regenerated!\n")
366   endif()
367 endif()