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