Make more passes preserve dominators (or state that they preserve dominators if
[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 # Run-time build mode; It is used for unittests.
38 if(MSVC_IDE)
39   # Expect "$(Configuration)", "$(OutDir)", etc.
40   # It is expanded by msbuild or similar.
41   set(RUNTIME_BUILD_MODE "${CMAKE_CFG_INTDIR}")
42 elseif(NOT CMAKE_BUILD_TYPE STREQUAL "")
43   # Expect "Release" "Debug", etc.
44   # Or unittests could not run.
45   set(RUNTIME_BUILD_MODE ${CMAKE_BUILD_TYPE})
46 else()
47   # It might be "."
48   set(RUNTIME_BUILD_MODE "${CMAKE_CFG_INTDIR}")
49 endif()
50
51 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
52
53 set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
54 set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include)
55 set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
56 set(LLVM_TOOLS_BINARY_DIR ${LLVM_BINARY_DIR}/bin)
57 set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
58 set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
59
60 if( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
61   file(GLOB_RECURSE
62     tablegenned_files_on_include_dir
63     "${LLVM_MAIN_SRC_DIR}/include/llvm/*.gen")
64   file(GLOB_RECURSE
65     tablegenned_files_on_lib_dir
66     "${LLVM_MAIN_SRC_DIR}/lib/Target/*.inc")
67   if( tablegenned_files_on_include_dir OR tablegenned_files_on_lib_dir)
68     message(FATAL_ERROR "Apparently there is a previous in-source build,
69 probably as the result of running `configure' and `make' on
70 ${LLVM_MAIN_SRC_DIR}.
71 This may cause problems. The suspicious files are:
72 ${tablegenned_files_on_lib_dir}
73 ${tablegenned_files_on_include_dir}
74 Please clean the source directory.")
75   endif()
76 endif()
77
78 set(LLVM_ALL_TARGETS
79   Alpha
80   ARM
81   Blackfin
82   CBackend
83   CellSPU
84   CppBackend
85   Mips
86   MBlaze
87   MSP430
88   PowerPC
89   PTX
90   Sparc
91   SystemZ
92   X86
93   XCore
94   )
95
96 if( MSVC )
97   set(LLVM_TARGETS_TO_BUILD X86
98     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
99 else( MSVC )
100   set(LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS}
101     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
102 endif( MSVC )
103
104 set(CLANG_RESOURCE_DIR "" CACHE STRING
105   "Relative directory from the Clang binary to its resource files.")
106
107 set(C_INCLUDE_DIRS "" CACHE STRING
108   "Colon separated list of directories clang will search for headers.")
109
110 set(LLVM_TARGET_ARCH "host"
111   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
112
113 set(LIT_ARGS_DEFAULT "-sv")
114 if (MSVC OR XCODE)
115   set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
116 endif()
117 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}"
118     CACHE STRING "Default options for lit")
119
120 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
121
122 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
123   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
124 else()
125   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
126 endif()
127
128 if( LLVM_ENABLE_ASSERTIONS )
129   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
130   if( NOT MSVC )
131     add_definitions( -D_DEBUG )
132   endif()
133   # On Release builds cmake automatically defines NDEBUG, so we
134   # explicitly undefine it:
135   if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
136     add_definitions( -UNDEBUG )
137   endif()
138 else()
139   if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
140     add_definitions( -DNDEBUG )
141   endif()
142 endif()
143
144 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
145   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
146 endif()
147
148 set(LLVM_ENUM_TARGETS "")
149 foreach(c ${LLVM_TARGETS_TO_BUILD})
150   list(FIND LLVM_ALL_TARGETS ${c} idx)
151   if( idx LESS 0 )
152     message(FATAL_ERROR "The target `${c}' does not exist.
153     It should be one of\n${LLVM_ALL_TARGETS}")
154   else()
155     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
156   endif()
157 endforeach(c)
158
159 # Produce llvm/Config/Targets.def
160 configure_file(
161   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
162   ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
163   )
164
165 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
166
167 include(AddLLVMDefinitions)
168
169 if(WIN32)
170   if(CYGWIN)
171     set(LLVM_ON_WIN32 0)
172     set(LLVM_ON_UNIX 1)
173   else(CYGWIN)
174     set(LLVM_ON_WIN32 1)
175     set(LLVM_ON_UNIX 0)
176   endif(CYGWIN)
177   set(LTDL_SHLIB_EXT ".dll")
178   set(EXEEXT ".exe")
179   # Maximum path length is 160 for non-unicode paths
180   set(MAXPATHLEN 160)
181 else(WIN32)
182   if(UNIX)
183     set(LLVM_ON_WIN32 0)
184     set(LLVM_ON_UNIX 1)
185     if(APPLE)
186       set(LTDL_SHLIB_EXT ".dylib")
187     else(APPLE)
188       set(LTDL_SHLIB_EXT ".so")
189     endif(APPLE)
190     set(EXEEXT "")
191     # FIXME: Maximum path length is currently set to 'safe' fixed value
192     set(MAXPATHLEN 2024)
193   else(UNIX)
194     MESSAGE(SEND_ERROR "Unable to determine platform")
195   endif(UNIX)
196 endif(WIN32)
197
198 include(config-ix)
199
200 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
201
202 set(ENABLE_PIC 0)
203 if( LLVM_ENABLE_PIC )
204  if( XCODE )
205    # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
206    # know how to disable this, so just force ENABLE_PIC off for now.
207    message(STATUS "Warning: -fPIC not supported with Xcode.")
208  else( XCODE )
209    if( SUPPORTS_FPIC_FLAG )
210       message(STATUS "Building with -fPIC")
211       add_llvm_definitions(-fPIC)
212       set(ENABLE_PIC 1)
213    else( SUPPORTS_FPIC_FLAG )
214       message(STATUS "Warning: -fPIC not supported.")
215    endif()
216  endif()
217 endif()
218
219 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
220 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
221 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
222
223 # set(CMAKE_VERBOSE_MAKEFILE true)
224
225 add_llvm_definitions( -D__STDC_LIMIT_MACROS )
226 add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
227
228 # MSVC has a gazillion warnings with this.
229 if( MSVC )
230   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
231 else( MSVC )
232   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
233 endif()
234
235 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
236 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
237
238 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
239   # TODO: support other platforms and toolchains.
240   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
241   if( LLVM_BUILD_32_BITS )
242     message(STATUS "Building 32 bits executables and libraries.")
243     add_llvm_definitions( -m32 )
244     list(APPEND CMAKE_EXE_LINKER_FLAGS -m32)
245     list(APPEND CMAKE_SHARED_LINKER_FLAGS -m32)
246   endif( LLVM_BUILD_32_BITS )
247 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
248
249 if( MSVC )
250   include(ChooseMSVCCRT)
251
252   # Add definitions that make MSVC much less annoying.
253   add_llvm_definitions(
254     # For some reason MS wants to deprecate a bunch of standard functions...
255     -D_CRT_SECURE_NO_DEPRECATE
256     -D_CRT_SECURE_NO_WARNINGS
257     -D_CRT_NONSTDC_NO_DEPRECATE
258     -D_CRT_NONSTDC_NO_WARNINGS
259     -D_SCL_SECURE_NO_DEPRECATE
260     -D_SCL_SECURE_NO_WARNINGS
261
262     -wd4146 # Suppress 'unary minus operator applied to unsigned type, result still unsigned'
263     -wd4180 # Suppress 'qualifier applied to function type has no meaning; ignored'
264     -wd4224 # Suppress 'nonstandard extension used : formal parameter 'identifier' was previously defined as a type'
265     -wd4244 # Suppress ''argument' : conversion from 'type1' to 'type2', possible loss of data'
266     -wd4267 # Suppress ''var' : conversion from 'size_t' to 'type', possible loss of data'
267     -wd4275 # Suppress 'An exported class was derived from a class that was not exported.'
268     -wd4291 # Suppress ''declaration' : no matching operator delete found; memory will not be freed if initialization throws an exception'
269     -wd4345 # Suppress 'behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized'
270     -wd4351 # Suppress 'new behavior: elements of array 'array' will be default initialized'
271     -wd4355 # Suppress ''this' : used in base member initializer list'
272     -wd4503 # Suppress ''identifier' : decorated name length exceeded, name was truncated'
273     -wd4624 # Suppress ''derived class' : destructor could not be generated because a base class destructor is inaccessible'
274     -wd4715 # Suppress ''function' : not all control paths return a value'
275     -wd4800 # Suppress ''type' : forcing value to bool 'true' or 'false' (performance warning)'
276
277     -w14062 # Promote "enumerator in switch of enum is not handled" to level 1 warning.
278     )
279
280   # Enable warnings
281   if (LLVM_ENABLE_WARNINGS)
282     add_llvm_definitions( /W4 /Wall )
283     if (LLVM_ENABLE_PEDANTIC)
284       # No MSVC equivalent available
285     endif (LLVM_ENABLE_PEDANTIC)
286   endif (LLVM_ENABLE_WARNINGS)
287   if (LLVM_ENABLE_WERROR)
288     add_llvm_definitions( /WX )
289   endif (LLVM_ENABLE_WERROR)
290 elseif( CMAKE_COMPILER_IS_GNUCXX )
291   if (LLVM_ENABLE_WARNINGS)
292     add_llvm_definitions( -Wall -W -Wno-unused-parameter -Wwrite-strings )
293     if (LLVM_ENABLE_PEDANTIC)
294       add_llvm_definitions( -pedantic -Wno-long-long )
295     endif (LLVM_ENABLE_PEDANTIC)
296   endif (LLVM_ENABLE_WARNINGS)
297   if (LLVM_ENABLE_WERROR)
298     add_llvm_definitions( -Werror )
299   endif (LLVM_ENABLE_WERROR)
300 endif( MSVC )
301
302 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
303
304 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
305    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/Support/Solaris.h")
306 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
307
308 include(AddLLVM)
309 include(TableGen)
310
311 if( MINGW )
312   get_system_libs(LLVM_SYSTEM_LIBS_LIST)
313   foreach(l ${LLVM_SYSTEM_LIBS_LIST})
314     set(LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS} -l${l}")
315   endforeach()
316   set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
317   set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
318 endif()
319
320 if( MINGW )
321   # People report that -O3 is unreliable on MinGW. The traditional
322   # build also uses -O2 for that reason:
323   llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
324 endif()
325
326 add_subdirectory(lib/Support)
327
328 # Everything else depends on Support:
329 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
330
331 set(LLVM_TABLEGEN "tblgen" CACHE
332   STRING "Native TableGen executable. Saves building one when cross-compiling.")
333 # Effective tblgen executable to be used:
334 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
335
336 add_subdirectory(utils/TableGen)
337
338 if( CMAKE_CROSSCOMPILING )
339   # This adds a dependency on target `tblgen', so must go after utils/TableGen
340   include( CrossCompileLLVM )
341 endif( CMAKE_CROSSCOMPILING )
342
343 add_subdirectory(include/llvm)
344
345 add_subdirectory(lib/VMCore)
346 add_subdirectory(lib/CodeGen)
347 add_subdirectory(lib/CodeGen/SelectionDAG)
348 add_subdirectory(lib/CodeGen/AsmPrinter)
349 add_subdirectory(lib/Bitcode/Reader)
350 add_subdirectory(lib/Bitcode/Writer)
351 add_subdirectory(lib/Transforms/Utils)
352 add_subdirectory(lib/Transforms/Instrumentation)
353 add_subdirectory(lib/Transforms/InstCombine)
354 add_subdirectory(lib/Transforms/Scalar)
355 add_subdirectory(lib/Transforms/IPO)
356 add_subdirectory(lib/Transforms/Hello)
357 add_subdirectory(lib/Linker)
358 add_subdirectory(lib/Analysis)
359 add_subdirectory(lib/Analysis/IPA)
360 add_subdirectory(lib/MC)
361 add_subdirectory(lib/MC/MCParser)
362 add_subdirectory(lib/MC/MCDisassembler)
363 add_subdirectory(lib/Object)
364
365 add_subdirectory(utils/FileCheck)
366 add_subdirectory(utils/FileUpdate)
367 add_subdirectory(utils/count)
368 add_subdirectory(utils/not)
369 add_subdirectory(utils/llvm-lit)
370
371 set(LLVM_ENUM_ASM_PRINTERS "")
372 set(LLVM_ENUM_ASM_PARSERS "")
373 set(LLVM_ENUM_DISASSEMBLERS "")
374 foreach(t ${LLVM_TARGETS_TO_BUILD})
375   message(STATUS "Targeting ${t}")
376   add_subdirectory(lib/Target/${t})
377   add_subdirectory(lib/Target/${t}/TargetInfo)
378   set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
379   file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
380   if( asmp_file )
381     set(LLVM_ENUM_ASM_PRINTERS
382       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
383   endif()
384   if( EXISTS ${td}/InstPrinter/CMakeLists.txt )
385     add_subdirectory(lib/Target/${t}/InstPrinter)
386   endif()
387   if( EXISTS ${td}/AsmParser/CMakeLists.txt )
388     add_subdirectory(lib/Target/${t}/AsmParser)
389     set(LLVM_ENUM_ASM_PARSERS
390       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
391   endif()
392   if( EXISTS ${td}/Disassembler/CMakeLists.txt )
393     add_subdirectory(lib/Target/${t}/Disassembler)
394     set(LLVM_ENUM_DISASSEMBLERS
395       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
396   endif()
397   set(CURRENT_LLVM_TARGET)
398 endforeach(t)
399
400 # Produce llvm/Config/AsmPrinters.def
401 configure_file(
402   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
403   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
404   )
405
406 # Produce llvm/Config/AsmParsers.def
407 configure_file(
408   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
409   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
410   )
411
412 # Produce llvm/Config/Disassemblers.def
413 configure_file(
414   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
415   ${LLVM_BINARY_DIR}/include/llvm/Config/Disassemblers.def
416   )
417
418 add_subdirectory(lib/ExecutionEngine)
419 add_subdirectory(lib/ExecutionEngine/Interpreter)
420 add_subdirectory(lib/ExecutionEngine/JIT)
421 add_subdirectory(lib/ExecutionEngine/MCJIT)
422 add_subdirectory(lib/Target)
423 add_subdirectory(lib/AsmParser)
424 add_subdirectory(lib/Archive)
425
426 add_subdirectory(projects)
427
428 option(LLVM_BUILD_TOOLS
429   "Build the LLVM tools. If OFF, just generate build targets." ON)
430 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
431 if( LLVM_INCLUDE_TOOLS )
432   add_subdirectory(tools)
433 endif()
434
435 option(LLVM_BUILD_EXAMPLES
436   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
437 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
438 if( LLVM_INCLUDE_EXAMPLES )
439   add_subdirectory(examples)
440 endif()
441
442 option(LLVM_BUILD_TESTS
443   "Build LLVM unit tests. If OFF, just generate build targes." OFF)
444 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
445 if( LLVM_INCLUDE_TESTS )
446   add_subdirectory(test)
447   add_subdirectory(utils/unittest)
448   add_subdirectory(unittests)
449   if (MSVC)
450     # This utility is used to prevent chrashing tests from calling Dr. Watson on
451     # Windows.
452     add_subdirectory(utils/KillTheDoctor)
453   endif()
454 endif()
455
456 add_subdirectory(cmake/modules)
457
458 install(DIRECTORY include/
459   DESTINATION include
460   FILES_MATCHING
461   PATTERN "*.def"
462   PATTERN "*.h"
463   PATTERN "*.td"
464   PATTERN "*.inc"
465   PATTERN ".svn" EXCLUDE
466   )
467
468 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
469   DESTINATION include
470   FILES_MATCHING
471   PATTERN "*.def"
472   PATTERN "*.h"
473   PATTERN "*.gen"
474   PATTERN "*.inc"
475   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
476   PATTERN "CMakeFiles" EXCLUDE
477   PATTERN ".svn" EXCLUDE
478   )
479
480 # TODO: make and install documentation.
481
482 set(CPACK_PACKAGE_VENDOR "LLVM")
483 set(CPACK_PACKAGE_VERSION_MAJOR 2)
484 set(CPACK_PACKAGE_VERSION_MINOR 9)
485 add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH)
486 include(CPack)
487
488 # Workaround for MSVS10 to avoid the Dialog Hell
489 # FIXME: This could be removed with future version of CMake.
490 if(MSVC_VERSION EQUAL 1600)
491   set(LLVM_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/LLVM.sln")
492   if( EXISTS "${LLVM_SLN_FILENAME}" )
493     file(APPEND "${LLVM_SLN_FILENAME}" "\n# This should be regenerated!\n")
494   endif()
495 endif()