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