Revert 118422 in search of bot verdancy.
[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 include(VersionFromVCS)
15 add_version_info_from_vcs(PACKAGE_VERSION)
16
17 set(PACKAGE_NAME llvm)
18 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
19 set(PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu")
20
21 if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
22   message(FATAL_ERROR "In-source builds are not allowed.
23 CMake would overwrite the makefiles distributed with LLVM.
24 Please create a directory and run cmake from there, passing the path
25 to this source directory as the last argument.
26 This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
27 Please delete them.")
28 endif()
29
30 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
31
32 set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
33 set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include)
34 set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
35 set(LLVM_TOOLS_BINARY_DIR ${LLVM_BINARY_DIR}/bin)
36 set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
37 set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
38
39 if( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
40   file(GLOB_RECURSE
41     tablegenned_files_on_include_dir
42     "${LLVM_MAIN_SRC_DIR}/include/llvm/*.gen")
43   file(GLOB_RECURSE
44     tablegenned_files_on_lib_dir
45     "${LLVM_MAIN_SRC_DIR}/lib/Target/*.inc")
46   if( tablegenned_files_on_include_dir OR tablegenned_files_on_lib_dir)
47     message(FATAL_ERROR "Apparently there is a previous in-source build,
48 probably as the result of running `configure' and `make' on
49 ${LLVM_MAIN_SRC_DIR}.
50 This may cause problems. The suspicious files are:
51 ${tablegenned_files_on_lib_dir}
52 ${tablegenned_files_on_include_dir}
53 Please clean the source directory.")
54   endif()
55 endif()
56
57 set(LLVM_ALL_TARGETS
58   Alpha
59   ARM
60   Blackfin
61   CBackend
62   CellSPU
63   CppBackend
64   Mips
65   MBlaze
66   MSP430
67   PowerPC
68   PTX
69   Sparc
70   SystemZ
71   X86
72   XCore
73   )
74
75 if( MSVC )
76   set(LLVM_TARGETS_TO_BUILD X86
77     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
78 else( MSVC )
79   set(LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS}
80     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
81 endif( MSVC )
82
83 set(CLANG_RESOURCE_DIR "" CACHE STRING
84   "Relative directory from the Clang binary to its resource files.")
85
86 set(C_INCLUDE_DIRS "" CACHE STRING
87   "Colon separated list of directories clang will search for headers.")
88
89 set(LLVM_TARGET_ARCH "host"
90   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
91
92 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
93
94 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
95   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
96 else()
97   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
98 endif()
99
100 if( LLVM_ENABLE_ASSERTIONS )
101   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
102   if( NOT MSVC )
103     add_definitions( -D_DEBUG )
104   endif()
105   # On Release builds cmake automatically defines NDEBUG, so we
106   # explicitly undefine it:
107   if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
108     add_definitions( -UNDEBUG )
109   endif()
110 else()
111   if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
112     add_definitions( -DNDEBUG )
113   endif()
114 endif()
115
116 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
117   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
118 endif()
119
120 set(LLVM_ENUM_TARGETS "")
121 foreach(c ${LLVM_TARGETS_TO_BUILD})
122   list(FIND LLVM_ALL_TARGETS ${c} idx)
123   if( idx LESS 0 )
124     message(FATAL_ERROR "The target `${c}' does not exist.
125     It should be one of\n${LLVM_ALL_TARGETS}")
126   else()
127     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
128   endif()
129 endforeach(c)
130
131 # Produce llvm/Config/Targets.def
132 configure_file(
133   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
134   ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
135   )
136
137 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
138
139 include(AddLLVMDefinitions)
140
141 if(WIN32)
142   if(CYGWIN)
143     set(LLVM_ON_WIN32 0)
144     set(LLVM_ON_UNIX 1)
145   else(CYGWIN)
146     set(LLVM_ON_WIN32 1)
147     set(LLVM_ON_UNIX 0)
148   endif(CYGWIN)
149   set(LTDL_SHLIB_EXT ".dll")
150   set(EXEEXT ".exe")
151   # Maximum path length is 160 for non-unicode paths
152   set(MAXPATHLEN 160)
153 else(WIN32)
154   if(UNIX)
155     set(LLVM_ON_WIN32 0)
156     set(LLVM_ON_UNIX 1)
157     if(APPLE)
158       set(LTDL_SHLIB_EXT ".dylib")
159     else(APPLE)
160       set(LTDL_SHLIB_EXT ".so")
161     endif(APPLE)
162     set(EXEEXT "")
163     # FIXME: Maximum path length is currently set to 'safe' fixed value
164     set(MAXPATHLEN 2024)
165   else(UNIX)
166     MESSAGE(SEND_ERROR "Unable to determine platform")
167   endif(UNIX)
168 endif(WIN32)
169
170 include(config-ix)
171
172 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
173
174 set(ENABLE_PIC 0)
175 if( LLVM_ENABLE_PIC )
176  if( XCODE )
177    # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
178    # know how to disable this, so just force ENABLE_PIC off for now.
179    message(STATUS "Warning: -fPIC not supported with Xcode.")
180  else( XCODE )
181    if( SUPPORTS_FPIC_FLAG )
182       message(STATUS "Building with -fPIC")
183       add_llvm_definitions(-fPIC)
184       set(ENABLE_PIC 1)
185    else( SUPPORTS_FPIC_FLAG )
186       message(STATUS "Warning: -fPIC not supported.")
187    endif()
188  endif()
189 endif()
190
191 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
192 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
193 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
194
195 # set(CMAKE_VERBOSE_MAKEFILE true)
196
197 add_llvm_definitions( -D__STDC_LIMIT_MACROS )
198 add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
199
200 # MSVC has a gazillion warnings with this.
201 if( MSVC )
202   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
203 else( MSVC )
204   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
205 endif()
206
207 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
208 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
209
210 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
211   # TODO: support other platforms and toolchains.
212   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
213   if( LLVM_BUILD_32_BITS )
214     message(STATUS "Building 32 bits executables and libraries.")
215     add_llvm_definitions( -m32 )
216     list(APPEND CMAKE_EXE_LINKER_FLAGS -m32)
217     list(APPEND CMAKE_SHARED_LINKER_FLAGS -m32)
218   endif( LLVM_BUILD_32_BITS )
219 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
220
221 if( MSVC )
222   include(ChooseMSVCCRT)
223
224   add_llvm_definitions( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS )
225   add_llvm_definitions( -D_SCL_SECURE_NO_WARNINGS -DCRT_NONSTDC_NO_WARNINGS )
226   add_llvm_definitions( -D_SCL_SECURE_NO_DEPRECATE )
227   add_llvm_definitions( -wd4146 -wd4503 -wd4996 -wd4800 -wd4244 -wd4624 )
228   add_llvm_definitions( -wd4355 -wd4715 -wd4180 -wd4345 -wd4224 -wd4267 )
229
230   # Suppress 'new behavior: elements of array 'array' will be default initialized'
231   add_llvm_definitions( -wd4351 )
232
233   # Enable warnings
234   if (LLVM_ENABLE_WARNINGS)
235     add_llvm_definitions( /W4 /Wall )
236     if (LLVM_ENABLE_PEDANTIC)
237       # No MSVC equivalent available
238     endif (LLVM_ENABLE_PEDANTIC)
239   endif (LLVM_ENABLE_WARNINGS)
240   if (LLVM_ENABLE_WERROR)
241     add_llvm_definitions( /WX )
242   endif (LLVM_ENABLE_WERROR)
243 elseif( CMAKE_COMPILER_IS_GNUCXX )
244   if (LLVM_ENABLE_WARNINGS)
245     add_llvm_definitions( -Wall -W -Wno-unused-parameter -Wwrite-strings )
246     if (LLVM_ENABLE_PEDANTIC)
247       add_llvm_definitions( -pedantic -Wno-long-long )
248     endif (LLVM_ENABLE_PEDANTIC)
249   endif (LLVM_ENABLE_WARNINGS)
250   if (LLVM_ENABLE_WERROR)
251     add_llvm_definitions( -Werror )
252   endif (LLVM_ENABLE_WERROR)
253 endif( MSVC )
254
255 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
256
257 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
258    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/System/Solaris.h")
259 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
260
261 include(AddLLVM)
262 include(TableGen)
263
264 if( MINGW )
265   get_system_libs(LLVM_SYSTEM_LIBS_LIST)
266   foreach(l ${LLVM_SYSTEM_LIBS_LIST})
267     set(LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS} -l${l}")
268   endforeach()
269   set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
270   set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
271 endif()
272
273 add_subdirectory(lib/Support)
274 add_subdirectory(lib/System)
275
276 # Everything else depends on Support and System:
277 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
278
279 set(LLVM_TABLEGEN "tblgen" CACHE
280   STRING "Native TableGen executable. Saves building one when cross-compiling.")
281 # Effective tblgen executable to be used:
282 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
283
284 add_subdirectory(utils/TableGen)
285
286 if( CMAKE_CROSSCOMPILING )
287   # This adds a dependency on target `tblgen', so must go after utils/TableGen
288   include( CrossCompileLLVM )
289 endif( CMAKE_CROSSCOMPILING )
290
291 add_subdirectory(include/llvm)
292
293 add_subdirectory(lib/VMCore)
294 add_subdirectory(lib/CodeGen)
295 add_subdirectory(lib/CodeGen/SelectionDAG)
296 add_subdirectory(lib/CodeGen/AsmPrinter)
297 add_subdirectory(lib/Bitcode/Reader)
298 add_subdirectory(lib/Bitcode/Writer)
299 add_subdirectory(lib/Transforms/Utils)
300 add_subdirectory(lib/Transforms/Instrumentation)
301 add_subdirectory(lib/Transforms/InstCombine)
302 add_subdirectory(lib/Transforms/Scalar)
303 add_subdirectory(lib/Transforms/IPO)
304 add_subdirectory(lib/Transforms/Hello)
305 add_subdirectory(lib/Linker)
306 add_subdirectory(lib/Analysis)
307 add_subdirectory(lib/Analysis/IPA)
308 add_subdirectory(lib/MC)
309 add_subdirectory(lib/MC/MCParser)
310 add_subdirectory(lib/MC/MCDisassembler)
311
312 add_subdirectory(utils/FileCheck)
313 add_subdirectory(utils/count)
314 add_subdirectory(utils/not)
315 add_subdirectory(utils/llvm-lit)
316
317 set(LLVM_ENUM_ASM_PRINTERS "")
318 set(LLVM_ENUM_ASM_PARSERS "")
319 set(LLVM_ENUM_DISASSEMBLERS "")
320 foreach(t ${LLVM_TARGETS_TO_BUILD})
321   message(STATUS "Targeting ${t}")
322   add_subdirectory(lib/Target/${t})
323   add_subdirectory(lib/Target/${t}/TargetInfo)
324   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
325     add_subdirectory(lib/Target/${t}/AsmPrinter)
326     set(LLVM_ENUM_ASM_PRINTERS 
327       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
328   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
329   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/InstPrinter/CMakeLists.txt )
330     add_subdirectory(lib/Target/${t}/InstPrinter)
331     set(LLVM_ENUM_ASM_PRINTERS
332       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
333   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/InstPrinter/CMakeLists.txt )
334   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
335     add_subdirectory(lib/Target/${t}/AsmParser)
336     set(LLVM_ENUM_ASM_PARSERS 
337       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
338   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
339   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/Disassembler/CMakeLists.txt )
340     add_subdirectory(lib/Target/${t}/Disassembler)
341     set(LLVM_ENUM_DISASSEMBLERS
342       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
343   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/Disassembler/CMakeLists.txt )
344   set(CURRENT_LLVM_TARGET)
345 endforeach(t)
346
347 # Produce llvm/Config/AsmPrinters.def
348 configure_file(
349   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
350   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
351   )
352
353 # Produce llvm/Config/AsmParsers.def
354 configure_file(
355   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
356   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
357   )
358
359 # Produce llvm/Config/Disassemblers.def
360 configure_file(
361   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
362   ${LLVM_BINARY_DIR}/include/llvm/Config/Disassemblers.def
363   )
364
365 add_subdirectory(lib/ExecutionEngine)
366 add_subdirectory(lib/ExecutionEngine/Interpreter)
367 add_subdirectory(lib/ExecutionEngine/JIT)
368 add_subdirectory(lib/Target)
369 add_subdirectory(lib/AsmParser)
370 add_subdirectory(lib/Archive)
371
372 add_subdirectory(projects)
373
374 option(LLVM_BUILD_TOOLS
375   "Build the LLVM tools. If OFF, just generate build targets." ON)
376 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
377 if( LLVM_INCLUDE_TOOLS )
378   add_subdirectory(tools)
379 endif()
380
381 option(LLVM_BUILD_EXAMPLES
382   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
383 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
384 if( LLVM_INCLUDE_EXAMPLES )
385   add_subdirectory(examples)
386 endif()
387
388 option(LLVM_BUILD_TESTS
389   "Build LLVM unit tests. If OFF, just generate build targes." OFF)
390 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
391 if( LLVM_INCLUDE_TESTS )
392   add_subdirectory(test)
393   add_subdirectory(utils/unittest)
394   add_subdirectory(unittests)
395   if (MSVC)
396     # This utility is used to prevent chrashing tests from calling Dr. Watson on
397     # Windows.
398     add_subdirectory(utils/KillTheDoctor)
399   endif()
400 endif()
401
402 add_subdirectory(cmake/modules)
403
404 install(DIRECTORY include/
405   DESTINATION include
406   FILES_MATCHING
407   PATTERN "*.def"
408   PATTERN "*.h"
409   PATTERN "*.td"
410   PATTERN "*.inc"
411   PATTERN ".svn" EXCLUDE
412   )
413
414 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
415   DESTINATION include
416   FILES_MATCHING
417   PATTERN "*.def"
418   PATTERN "*.h"
419   PATTERN "*.gen"
420   PATTERN "*.inc"
421   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
422   PATTERN "CMakeFiles" EXCLUDE
423   PATTERN ".svn" EXCLUDE
424   )
425
426 # TODO: make and install documentation.
427
428 set(CPACK_PACKAGE_VENDOR "LLVM")
429 set(CPACK_PACKAGE_VERSION_MAJOR 2)
430 set(CPACK_PACKAGE_VERSION_MINOR 9)
431 add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH)
432 include(CPack)