Fix typo: Exectuable -> Executable
[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 set(LIT_ARGS_DEFAULT "-sv")
93 if (MSVC OR XCODE)
94   set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
95 endif()
96 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}"
97     CACHE STRING "Default options for lit")
98
99 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
100
101 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
102   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
103 else()
104   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
105 endif()
106
107 if( LLVM_ENABLE_ASSERTIONS )
108   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
109   if( NOT MSVC )
110     add_definitions( -D_DEBUG )
111   endif()
112   # On Release builds cmake automatically defines NDEBUG, so we
113   # explicitly undefine it:
114   if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
115     add_definitions( -UNDEBUG )
116   endif()
117 else()
118   if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
119     add_definitions( -DNDEBUG )
120   endif()
121 endif()
122
123 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
124   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
125 endif()
126
127 set(LLVM_ENUM_TARGETS "")
128 foreach(c ${LLVM_TARGETS_TO_BUILD})
129   list(FIND LLVM_ALL_TARGETS ${c} idx)
130   if( idx LESS 0 )
131     message(FATAL_ERROR "The target `${c}' does not exist.
132     It should be one of\n${LLVM_ALL_TARGETS}")
133   else()
134     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
135   endif()
136 endforeach(c)
137
138 # Produce llvm/Config/Targets.def
139 configure_file(
140   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
141   ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
142   )
143
144 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
145
146 include(AddLLVMDefinitions)
147
148 if(WIN32)
149   if(CYGWIN)
150     set(LLVM_ON_WIN32 0)
151     set(LLVM_ON_UNIX 1)
152   else(CYGWIN)
153     set(LLVM_ON_WIN32 1)
154     set(LLVM_ON_UNIX 0)
155   endif(CYGWIN)
156   set(LTDL_SHLIB_EXT ".dll")
157   set(EXEEXT ".exe")
158   # Maximum path length is 160 for non-unicode paths
159   set(MAXPATHLEN 160)
160 else(WIN32)
161   if(UNIX)
162     set(LLVM_ON_WIN32 0)
163     set(LLVM_ON_UNIX 1)
164     if(APPLE)
165       set(LTDL_SHLIB_EXT ".dylib")
166     else(APPLE)
167       set(LTDL_SHLIB_EXT ".so")
168     endif(APPLE)
169     set(EXEEXT "")
170     # FIXME: Maximum path length is currently set to 'safe' fixed value
171     set(MAXPATHLEN 2024)
172   else(UNIX)
173     MESSAGE(SEND_ERROR "Unable to determine platform")
174   endif(UNIX)
175 endif(WIN32)
176
177 include(config-ix)
178
179 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
180
181 set(ENABLE_PIC 0)
182 if( LLVM_ENABLE_PIC )
183  if( XCODE )
184    # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
185    # know how to disable this, so just force ENABLE_PIC off for now.
186    message(STATUS "Warning: -fPIC not supported with Xcode.")
187  else( XCODE )
188    if( SUPPORTS_FPIC_FLAG )
189       message(STATUS "Building with -fPIC")
190       add_llvm_definitions(-fPIC)
191       set(ENABLE_PIC 1)
192    else( SUPPORTS_FPIC_FLAG )
193       message(STATUS "Warning: -fPIC not supported.")
194    endif()
195  endif()
196 endif()
197
198 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
199 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
200 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
201
202 # set(CMAKE_VERBOSE_MAKEFILE true)
203
204 add_llvm_definitions( -D__STDC_LIMIT_MACROS )
205 add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
206
207 # MSVC has a gazillion warnings with this.
208 if( MSVC )
209   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
210 else( MSVC )
211   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
212 endif()
213
214 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
215 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
216
217 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
218   # TODO: support other platforms and toolchains.
219   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
220   if( LLVM_BUILD_32_BITS )
221     message(STATUS "Building 32 bits executables and libraries.")
222     add_llvm_definitions( -m32 )
223     list(APPEND CMAKE_EXE_LINKER_FLAGS -m32)
224     list(APPEND CMAKE_SHARED_LINKER_FLAGS -m32)
225   endif( LLVM_BUILD_32_BITS )
226 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
227
228 if( MSVC )
229   include(ChooseMSVCCRT)
230
231   add_llvm_definitions( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS )
232   add_llvm_definitions( -D_SCL_SECURE_NO_WARNINGS -DCRT_NONSTDC_NO_WARNINGS )
233   add_llvm_definitions( -D_SCL_SECURE_NO_DEPRECATE )
234   add_llvm_definitions( -wd4146 -wd4503 -wd4996 -wd4800 -wd4244 -wd4624 )
235   add_llvm_definitions( -wd4355 -wd4715 -wd4180 -wd4345 -wd4224 -wd4267 )
236
237   # Suppress 'new behavior: elements of array 'array' will be default initialized'
238   add_llvm_definitions( -wd4351 )
239
240   # Enable warnings
241   if (LLVM_ENABLE_WARNINGS)
242     add_llvm_definitions( /W4 /Wall )
243     if (LLVM_ENABLE_PEDANTIC)
244       # No MSVC equivalent available
245     endif (LLVM_ENABLE_PEDANTIC)
246   endif (LLVM_ENABLE_WARNINGS)
247   if (LLVM_ENABLE_WERROR)
248     add_llvm_definitions( /WX )
249   endif (LLVM_ENABLE_WERROR)
250 elseif( CMAKE_COMPILER_IS_GNUCXX )
251   if (LLVM_ENABLE_WARNINGS)
252     add_llvm_definitions( -Wall -W -Wno-unused-parameter -Wwrite-strings )
253     if (LLVM_ENABLE_PEDANTIC)
254       add_llvm_definitions( -pedantic -Wno-long-long )
255     endif (LLVM_ENABLE_PEDANTIC)
256   endif (LLVM_ENABLE_WARNINGS)
257   if (LLVM_ENABLE_WERROR)
258     add_llvm_definitions( -Werror )
259   endif (LLVM_ENABLE_WERROR)
260 endif( MSVC )
261
262 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
263
264 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
265    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/System/Solaris.h")
266 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
267
268 include(AddLLVM)
269 include(TableGen)
270
271 if( MINGW )
272   get_system_libs(LLVM_SYSTEM_LIBS_LIST)
273   foreach(l ${LLVM_SYSTEM_LIBS_LIST})
274     set(LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS} -l${l}")
275   endforeach()
276   set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
277   set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
278 endif()
279
280 add_subdirectory(lib/Support)
281 add_subdirectory(lib/System)
282
283 # Everything else depends on Support and System:
284 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
285
286 set(LLVM_TABLEGEN "tblgen" CACHE
287   STRING "Native TableGen executable. Saves building one when cross-compiling.")
288 # Effective tblgen executable to be used:
289 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
290
291 add_subdirectory(utils/TableGen)
292
293 if( CMAKE_CROSSCOMPILING )
294   # This adds a dependency on target `tblgen', so must go after utils/TableGen
295   include( CrossCompileLLVM )
296 endif( CMAKE_CROSSCOMPILING )
297
298 add_subdirectory(include/llvm)
299
300 add_subdirectory(lib/VMCore)
301 add_subdirectory(lib/CodeGen)
302 add_subdirectory(lib/CodeGen/SelectionDAG)
303 add_subdirectory(lib/CodeGen/AsmPrinter)
304 add_subdirectory(lib/Bitcode/Reader)
305 add_subdirectory(lib/Bitcode/Writer)
306 add_subdirectory(lib/Transforms/Utils)
307 add_subdirectory(lib/Transforms/Instrumentation)
308 add_subdirectory(lib/Transforms/InstCombine)
309 add_subdirectory(lib/Transforms/Scalar)
310 add_subdirectory(lib/Transforms/IPO)
311 add_subdirectory(lib/Transforms/Hello)
312 add_subdirectory(lib/Linker)
313 add_subdirectory(lib/Analysis)
314 add_subdirectory(lib/Analysis/IPA)
315 add_subdirectory(lib/MC)
316 add_subdirectory(lib/MC/MCParser)
317 add_subdirectory(lib/MC/MCDisassembler)
318 add_subdirectory(lib/Object)
319
320 add_subdirectory(utils/FileCheck)
321 add_subdirectory(utils/count)
322 add_subdirectory(utils/not)
323 add_subdirectory(utils/llvm-lit)
324
325 set(LLVM_ENUM_ASM_PRINTERS "")
326 set(LLVM_ENUM_ASM_PARSERS "")
327 set(LLVM_ENUM_DISASSEMBLERS "")
328 foreach(t ${LLVM_TARGETS_TO_BUILD})
329   message(STATUS "Targeting ${t}")
330   add_subdirectory(lib/Target/${t})
331   add_subdirectory(lib/Target/${t}/TargetInfo)
332   set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
333   file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
334   if( asmp_file )
335     set(LLVM_ENUM_ASM_PRINTERS 
336       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
337   endif()
338   if( EXISTS ${td}/InstPrinter/CMakeLists.txt )
339     add_subdirectory(lib/Target/${t}/InstPrinter)
340   endif()
341   if( EXISTS ${td}/AsmParser/CMakeLists.txt )
342     add_subdirectory(lib/Target/${t}/AsmParser)
343     set(LLVM_ENUM_ASM_PARSERS 
344       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
345   endif()
346   if( EXISTS ${td}/Disassembler/CMakeLists.txt )
347     add_subdirectory(lib/Target/${t}/Disassembler)
348     set(LLVM_ENUM_DISASSEMBLERS
349       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
350   endif()
351   set(CURRENT_LLVM_TARGET)
352 endforeach(t)
353
354 # Produce llvm/Config/AsmPrinters.def
355 configure_file(
356   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
357   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
358   )
359
360 # Produce llvm/Config/AsmParsers.def
361 configure_file(
362   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
363   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
364   )
365
366 # Produce llvm/Config/Disassemblers.def
367 configure_file(
368   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
369   ${LLVM_BINARY_DIR}/include/llvm/Config/Disassemblers.def
370   )
371
372 add_subdirectory(lib/ExecutionEngine)
373 add_subdirectory(lib/ExecutionEngine/Interpreter)
374 add_subdirectory(lib/ExecutionEngine/JIT)
375 add_subdirectory(lib/Target)
376 add_subdirectory(lib/AsmParser)
377 add_subdirectory(lib/Archive)
378
379 add_subdirectory(projects)
380
381 option(LLVM_BUILD_TOOLS
382   "Build the LLVM tools. If OFF, just generate build targets." ON)
383 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
384 if( LLVM_INCLUDE_TOOLS )
385   add_subdirectory(tools)
386 endif()
387
388 option(LLVM_BUILD_EXAMPLES
389   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
390 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
391 if( LLVM_INCLUDE_EXAMPLES )
392   add_subdirectory(examples)
393 endif()
394
395 option(LLVM_BUILD_TESTS
396   "Build LLVM unit tests. If OFF, just generate build targes." OFF)
397 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
398 if( LLVM_INCLUDE_TESTS )
399   add_subdirectory(test)
400   add_subdirectory(utils/unittest)
401   add_subdirectory(unittests)
402   if (MSVC)
403     # This utility is used to prevent chrashing tests from calling Dr. Watson on
404     # Windows.
405     add_subdirectory(utils/KillTheDoctor)
406   endif()
407 endif()
408
409 add_subdirectory(cmake/modules)
410
411 install(DIRECTORY include/
412   DESTINATION include
413   FILES_MATCHING
414   PATTERN "*.def"
415   PATTERN "*.h"
416   PATTERN "*.td"
417   PATTERN "*.inc"
418   PATTERN ".svn" EXCLUDE
419   )
420
421 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
422   DESTINATION include
423   FILES_MATCHING
424   PATTERN "*.def"
425   PATTERN "*.h"
426   PATTERN "*.gen"
427   PATTERN "*.inc"
428   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
429   PATTERN "CMakeFiles" EXCLUDE
430   PATTERN ".svn" EXCLUDE
431   )
432
433 # TODO: make and install documentation.
434
435 set(CPACK_PACKAGE_VENDOR "LLVM")
436 set(CPACK_PACKAGE_VERSION_MAJOR 2)
437 set(CPACK_PACKAGE_VERSION_MINOR 9)
438 add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH)
439 include(CPack)