Fix relocations with weak definitions.
[llvm.git] / CMakeLists.txt
blob2d1f66bfc111907afe452859cc6fbaffecbd89de
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 # Run-time build mode; It is used for unittests.
31 if(MSVC_IDE)
32   # Expect "$(Configuration)", "$(OutDir)", etc.
33   # It is expanded by msbuild or similar.
34   set(RUNTIME_BUILD_MODE "${CMAKE_CFG_INTDIR}")
35 elseif(NOT CMAKE_BUILD_TYPE STREQUAL "")
36   # Expect "Release" "Debug", etc.
37   # Or unittests could not run.
38   set(RUNTIME_BUILD_MODE ${CMAKE_BUILD_TYPE})
39 else()
40   # It might be "."
41   set(RUNTIME_BUILD_MODE "${CMAKE_CFG_INTDIR}")
42 endif()
44 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
46 set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
47 set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include)
48 set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
49 set(LLVM_TOOLS_BINARY_DIR ${LLVM_BINARY_DIR}/bin)
50 set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
51 set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
53 if( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
54   file(GLOB_RECURSE
55     tablegenned_files_on_include_dir
56     "${LLVM_MAIN_SRC_DIR}/include/llvm/*.gen")
57   file(GLOB_RECURSE
58     tablegenned_files_on_lib_dir
59     "${LLVM_MAIN_SRC_DIR}/lib/Target/*.inc")
60   if( tablegenned_files_on_include_dir OR tablegenned_files_on_lib_dir)
61     message(FATAL_ERROR "Apparently there is a previous in-source build,
62 probably as the result of running `configure' and `make' on
63 ${LLVM_MAIN_SRC_DIR}.
64 This may cause problems. The suspicious files are:
65 ${tablegenned_files_on_lib_dir}
66 ${tablegenned_files_on_include_dir}
67 Please clean the source directory.")
68   endif()
69 endif()
71 set(LLVM_ALL_TARGETS
72   Alpha
73   ARM
74   Blackfin
75   CBackend
76   CellSPU
77   CppBackend
78   Mips
79   MBlaze
80   MSP430
81   PowerPC
82   PTX
83   Sparc
84   SystemZ
85   X86
86   XCore
87   )
89 if( MSVC )
90   set(LLVM_TARGETS_TO_BUILD X86
91     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
92 else( MSVC )
93   set(LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS}
94     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
95 endif( MSVC )
97 set(CLANG_RESOURCE_DIR "" CACHE STRING
98   "Relative directory from the Clang binary to its resource files.")
100 set(C_INCLUDE_DIRS "" CACHE STRING
101   "Colon separated list of directories clang will search for headers.")
103 set(LLVM_TARGET_ARCH "host"
104   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
106 set(LIT_ARGS_DEFAULT "-sv")
107 if (MSVC OR XCODE)
108   set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
109 endif()
110 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}"
111     CACHE STRING "Default options for lit")
113 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
115 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
116   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
117 else()
118   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
119 endif()
121 if( LLVM_ENABLE_ASSERTIONS )
122   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
123   if( NOT MSVC )
124     add_definitions( -D_DEBUG )
125   endif()
126   # On Release builds cmake automatically defines NDEBUG, so we
127   # explicitly undefine it:
128   if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
129     add_definitions( -UNDEBUG )
130   endif()
131 else()
132   if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
133     add_definitions( -DNDEBUG )
134   endif()
135 endif()
137 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
138   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
139 endif()
141 set(LLVM_ENUM_TARGETS "")
142 foreach(c ${LLVM_TARGETS_TO_BUILD})
143   list(FIND LLVM_ALL_TARGETS ${c} idx)
144   if( idx LESS 0 )
145     message(FATAL_ERROR "The target `${c}' does not exist.
146     It should be one of\n${LLVM_ALL_TARGETS}")
147   else()
148     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
149   endif()
150 endforeach(c)
152 # Produce llvm/Config/Targets.def
153 configure_file(
154   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
155   ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
156   )
158 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
160 include(AddLLVMDefinitions)
162 if(WIN32)
163   if(CYGWIN)
164     set(LLVM_ON_WIN32 0)
165     set(LLVM_ON_UNIX 1)
166   else(CYGWIN)
167     set(LLVM_ON_WIN32 1)
168     set(LLVM_ON_UNIX 0)
169   endif(CYGWIN)
170   set(LTDL_SHLIB_EXT ".dll")
171   set(EXEEXT ".exe")
172   # Maximum path length is 160 for non-unicode paths
173   set(MAXPATHLEN 160)
174 else(WIN32)
175   if(UNIX)
176     set(LLVM_ON_WIN32 0)
177     set(LLVM_ON_UNIX 1)
178     if(APPLE)
179       set(LTDL_SHLIB_EXT ".dylib")
180     else(APPLE)
181       set(LTDL_SHLIB_EXT ".so")
182     endif(APPLE)
183     set(EXEEXT "")
184     # FIXME: Maximum path length is currently set to 'safe' fixed value
185     set(MAXPATHLEN 2024)
186   else(UNIX)
187     MESSAGE(SEND_ERROR "Unable to determine platform")
188   endif(UNIX)
189 endif(WIN32)
191 include(config-ix)
193 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
195 set(ENABLE_PIC 0)
196 if( LLVM_ENABLE_PIC )
197  if( XCODE )
198    # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
199    # know how to disable this, so just force ENABLE_PIC off for now.
200    message(STATUS "Warning: -fPIC not supported with Xcode.")
201  else( XCODE )
202    if( SUPPORTS_FPIC_FLAG )
203       message(STATUS "Building with -fPIC")
204       add_llvm_definitions(-fPIC)
205       set(ENABLE_PIC 1)
206    else( SUPPORTS_FPIC_FLAG )
207       message(STATUS "Warning: -fPIC not supported.")
208    endif()
209  endif()
210 endif()
212 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
213 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
214 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
216 # set(CMAKE_VERBOSE_MAKEFILE true)
218 add_llvm_definitions( -D__STDC_LIMIT_MACROS )
219 add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
221 # MSVC has a gazillion warnings with this.
222 if( MSVC )
223   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
224 else( MSVC )
225   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
226 endif()
228 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
229 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
231 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
232   # TODO: support other platforms and toolchains.
233   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
234   if( LLVM_BUILD_32_BITS )
235     message(STATUS "Building 32 bits executables and libraries.")
236     add_llvm_definitions( -m32 )
237     list(APPEND CMAKE_EXE_LINKER_FLAGS -m32)
238     list(APPEND CMAKE_SHARED_LINKER_FLAGS -m32)
239   endif( LLVM_BUILD_32_BITS )
240 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
242 if( MSVC )
243   include(ChooseMSVCCRT)
245   add_llvm_definitions( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS )
246   add_llvm_definitions( -D_SCL_SECURE_NO_WARNINGS -DCRT_NONSTDC_NO_WARNINGS )
247   add_llvm_definitions( -D_SCL_SECURE_NO_DEPRECATE )
248   add_llvm_definitions( -wd4146 -wd4503 -wd4996 -wd4800 -wd4244 -wd4624 )
249   add_llvm_definitions( -wd4355 -wd4715 -wd4180 -wd4345 -wd4224 -wd4267 -wd4291 )
250   add_llvm_definitions( -wd4275 )
251   
252   # Promote "enumerator in switch of enum is not handled" to level 1 warning.
253   add_llvm_definitions( -w14062 )
255   # Suppress 'new behavior: elements of array 'array' will be default initialized'
256   add_llvm_definitions( -wd4351 )
258   # Enable warnings
259   if (LLVM_ENABLE_WARNINGS)
260     add_llvm_definitions( /W4 /Wall )
261     if (LLVM_ENABLE_PEDANTIC)
262       # No MSVC equivalent available
263     endif (LLVM_ENABLE_PEDANTIC)
264   endif (LLVM_ENABLE_WARNINGS)
265   if (LLVM_ENABLE_WERROR)
266     add_llvm_definitions( /WX )
267   endif (LLVM_ENABLE_WERROR)
268 elseif( CMAKE_COMPILER_IS_GNUCXX )
269   if (LLVM_ENABLE_WARNINGS)
270     add_llvm_definitions( -Wall -W -Wno-unused-parameter -Wwrite-strings )
271     if (LLVM_ENABLE_PEDANTIC)
272       add_llvm_definitions( -pedantic -Wno-long-long )
273     endif (LLVM_ENABLE_PEDANTIC)
274   endif (LLVM_ENABLE_WARNINGS)
275   if (LLVM_ENABLE_WERROR)
276     add_llvm_definitions( -Werror )
277   endif (LLVM_ENABLE_WERROR)
278 endif( MSVC )
280 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
282 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
283    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/Support/Solaris.h")
284 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
286 include(AddLLVM)
287 include(TableGen)
289 if( MINGW )
290   get_system_libs(LLVM_SYSTEM_LIBS_LIST)
291   foreach(l ${LLVM_SYSTEM_LIBS_LIST})
292     set(LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS} -l${l}")
293   endforeach()
294   set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
295   set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
296 endif()
298 add_subdirectory(lib/Support)
300 # Everything else depends on Support:
301 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
303 set(LLVM_TABLEGEN "tblgen" CACHE
304   STRING "Native TableGen executable. Saves building one when cross-compiling.")
305 # Effective tblgen executable to be used:
306 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
308 add_subdirectory(utils/TableGen)
310 if( CMAKE_CROSSCOMPILING )
311   # This adds a dependency on target `tblgen', so must go after utils/TableGen
312   include( CrossCompileLLVM )
313 endif( CMAKE_CROSSCOMPILING )
315 add_subdirectory(include/llvm)
317 add_subdirectory(lib/VMCore)
318 add_subdirectory(lib/CodeGen)
319 add_subdirectory(lib/CodeGen/SelectionDAG)
320 add_subdirectory(lib/CodeGen/AsmPrinter)
321 add_subdirectory(lib/Bitcode/Reader)
322 add_subdirectory(lib/Bitcode/Writer)
323 add_subdirectory(lib/Transforms/Utils)
324 add_subdirectory(lib/Transforms/Instrumentation)
325 add_subdirectory(lib/Transforms/InstCombine)
326 add_subdirectory(lib/Transforms/Scalar)
327 add_subdirectory(lib/Transforms/IPO)
328 add_subdirectory(lib/Transforms/Hello)
329 add_subdirectory(lib/Linker)
330 add_subdirectory(lib/Analysis)
331 add_subdirectory(lib/Analysis/IPA)
332 add_subdirectory(lib/MC)
333 add_subdirectory(lib/MC/MCParser)
334 add_subdirectory(lib/MC/MCDisassembler)
335 add_subdirectory(lib/Object)
337 add_subdirectory(utils/FileCheck)
338 add_subdirectory(utils/count)
339 add_subdirectory(utils/not)
340 add_subdirectory(utils/llvm-lit)
342 set(LLVM_ENUM_ASM_PRINTERS "")
343 set(LLVM_ENUM_ASM_PARSERS "")
344 set(LLVM_ENUM_DISASSEMBLERS "")
345 foreach(t ${LLVM_TARGETS_TO_BUILD})
346   message(STATUS "Targeting ${t}")
347   add_subdirectory(lib/Target/${t})
348   add_subdirectory(lib/Target/${t}/TargetInfo)
349   set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
350   file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
351   if( asmp_file )
352     set(LLVM_ENUM_ASM_PRINTERS
353       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
354   endif()
355   if( EXISTS ${td}/InstPrinter/CMakeLists.txt )
356     add_subdirectory(lib/Target/${t}/InstPrinter)
357   endif()
358   if( EXISTS ${td}/AsmParser/CMakeLists.txt )
359     add_subdirectory(lib/Target/${t}/AsmParser)
360     set(LLVM_ENUM_ASM_PARSERS
361       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
362   endif()
363   if( EXISTS ${td}/Disassembler/CMakeLists.txt )
364     add_subdirectory(lib/Target/${t}/Disassembler)
365     set(LLVM_ENUM_DISASSEMBLERS
366       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
367   endif()
368   set(CURRENT_LLVM_TARGET)
369 endforeach(t)
371 # Produce llvm/Config/AsmPrinters.def
372 configure_file(
373   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
374   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
375   )
377 # Produce llvm/Config/AsmParsers.def
378 configure_file(
379   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
380   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
381   )
383 # Produce llvm/Config/Disassemblers.def
384 configure_file(
385   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
386   ${LLVM_BINARY_DIR}/include/llvm/Config/Disassemblers.def
387   )
389 add_subdirectory(lib/ExecutionEngine)
390 add_subdirectory(lib/ExecutionEngine/Interpreter)
391 add_subdirectory(lib/ExecutionEngine/JIT)
392 add_subdirectory(lib/ExecutionEngine/MCJIT)
393 add_subdirectory(lib/Target)
394 add_subdirectory(lib/AsmParser)
395 add_subdirectory(lib/Archive)
397 add_subdirectory(projects)
399 option(LLVM_BUILD_TOOLS
400   "Build the LLVM tools. If OFF, just generate build targets." ON)
401 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
402 if( LLVM_INCLUDE_TOOLS )
403   add_subdirectory(tools)
404 endif()
406 option(LLVM_BUILD_EXAMPLES
407   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
408 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
409 if( LLVM_INCLUDE_EXAMPLES )
410   add_subdirectory(examples)
411 endif()
413 option(LLVM_BUILD_TESTS
414   "Build LLVM unit tests. If OFF, just generate build targes." OFF)
415 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
416 if( LLVM_INCLUDE_TESTS )
417   add_subdirectory(test)
418   add_subdirectory(utils/unittest)
419   add_subdirectory(unittests)
420   if (MSVC)
421     # This utility is used to prevent chrashing tests from calling Dr. Watson on
422     # Windows.
423     add_subdirectory(utils/KillTheDoctor)
424   endif()
425 endif()
427 add_subdirectory(cmake/modules)
429 install(DIRECTORY include/
430   DESTINATION include
431   FILES_MATCHING
432   PATTERN "*.def"
433   PATTERN "*.h"
434   PATTERN "*.td"
435   PATTERN "*.inc"
436   PATTERN ".svn" EXCLUDE
437   )
439 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
440   DESTINATION include
441   FILES_MATCHING
442   PATTERN "*.def"
443   PATTERN "*.h"
444   PATTERN "*.gen"
445   PATTERN "*.inc"
446   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
447   PATTERN "CMakeFiles" EXCLUDE
448   PATTERN ".svn" EXCLUDE
449   )
451 # TODO: make and install documentation.
453 set(CPACK_PACKAGE_VENDOR "LLVM")
454 set(CPACK_PACKAGE_VERSION_MAJOR 2)
455 set(CPACK_PACKAGE_VERSION_MINOR 9)
456 add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH)
457 include(CPack)
459 # Workaround for MSVS10 to avoid the Dialog Hell
460 # FIXME: This could be removed with future version of CMake.
461 if(MSVC_VERSION EQUAL 1600)
462   set(LLVM_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/LLVM.sln")
463   if( EXISTS "${LLVM_SLN_FILENAME}" )
464     file(APPEND "${LLVM_SLN_FILENAME}" "\n# This should be regenerated!\n")
465   endif()
466 endif()