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