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