use moveBefore instead of remove+insert, it avoids some
[llvm.git] / CMakeLists.txt
blob8dc2ba7d9640567a43a90d4d70310b32bc1801d4
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.8")
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   MSIL
67   MSP430
68   PIC16
69   PowerPC
70   Sparc
71   SystemZ
72   X86
73   XCore
74   )
76 if( MSVC )
77   set(LLVM_TARGETS_TO_BUILD X86
78     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
79 else( MSVC )
80   set(LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS}
81     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
82 endif( MSVC )
84 set(C_INCLUDE_DIRS "" CACHE STRING
85   "Colon separated list of directories clang will search for headers.")
87 set(LLVM_TARGET_ARCH "host"
88   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
90 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
92 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
93   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
94 else()
95   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
96 endif()
98 if( LLVM_ENABLE_ASSERTIONS )
99   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
100   if( NOT MSVC )
101     add_definitions( -D_DEBUG )
102   endif()
103   # On Release builds cmake automatically defines NDEBUG, so we
104   # explicitly undefine it:
105   if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
106     add_definitions( -UNDEBUG )
107   endif()
108 else()
109   if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
110     add_definitions( -DNDEBUG )
111   endif()
112 endif()
114 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
115   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
116 endif()
118 set(LLVM_ENUM_TARGETS "")
119 foreach(c ${LLVM_TARGETS_TO_BUILD})
120   list(FIND LLVM_ALL_TARGETS ${c} idx)
121   if( idx LESS 0 )
122     message(FATAL_ERROR "The target `${c}' does not exist.
123     It should be one of\n${LLVM_ALL_TARGETS}")
124   else()
125     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
126   endif()
127 endforeach(c)
129 # Produce llvm/Config/Targets.def
130 configure_file(
131   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
132   ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
133   )
135 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
137 include(AddLLVMDefinitions)
139 if(WIN32)
140   if(CYGWIN)
141     set(LLVM_ON_WIN32 0)
142     set(LLVM_ON_UNIX 1)
143   else(CYGWIN)
144     set(LLVM_ON_WIN32 1)
145     set(LLVM_ON_UNIX 0)
146   endif(CYGWIN)
147   set(LTDL_SHLIB_EXT ".dll")
148   set(EXEEXT ".exe")
149   # Maximum path length is 160 for non-unicode paths
150   set(MAXPATHLEN 160)
151 else(WIN32)
152   if(UNIX)
153     set(LLVM_ON_WIN32 0)
154     set(LLVM_ON_UNIX 1)
155     if(APPLE)
156       set(LTDL_SHLIB_EXT ".dylib")
157     else(APPLE)
158       set(LTDL_SHLIB_EXT ".so")
159     endif(APPLE)
160     set(EXEEXT "")
161     # FIXME: Maximum path length is currently set to 'safe' fixed value
162     set(MAXPATHLEN 2024)
163   else(UNIX)
164     MESSAGE(SEND_ERROR "Unable to determine platform")
165   endif(UNIX)
166 endif(WIN32)
168 include(config-ix)
170 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
172 set(ENABLE_PIC 0)
173 if( LLVM_ENABLE_PIC )
174  if( XCODE )
175    # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
176    # know how to disable this, so just force ENABLE_PIC off for now.
177    message(STATUS "Warning: -fPIC not supported with Xcode.")
178  else( XCODE )
179    if( SUPPORTS_FPIC_FLAG )
180       message(STATUS "Building with -fPIC")
181       add_llvm_definitions(-fPIC)
182       set(ENABLE_PIC 1)
183    else( SUPPORTS_FPIC_FLAG )
184       message(STATUS "Warning: -fPIC not supported.")
185    endif()
186  endif()
187 endif()
189 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
190 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
191 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
193 # set(CMAKE_VERBOSE_MAKEFILE true)
195 add_llvm_definitions( -D__STDC_LIMIT_MACROS )
196 add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
198 # MSVC has a gazillion warnings with this.
199 if( MSVC )
200   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
201 else( MSVC )
202   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
203 endif()
205 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
206 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
208 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
209   # TODO: support other platforms and toolchains.
210   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
211   if( LLVM_BUILD_32_BITS )
212     message(STATUS "Building 32 bits executables and libraries.")
213     add_llvm_definitions( -m32 )
214     list(APPEND CMAKE_EXE_LINKER_FLAGS -m32)
215     list(APPEND CMAKE_SHARED_LINKER_FLAGS -m32)
216   endif( LLVM_BUILD_32_BITS )
217 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
219 if( MSVC )
220   include(ChooseMSVCCRT)
222   add_llvm_definitions( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS )
223   add_llvm_definitions( -D_SCL_SECURE_NO_WARNINGS -DCRT_NONSTDC_NO_WARNINGS )
224   add_llvm_definitions( -D_SCL_SECURE_NO_DEPRECATE )
225   add_llvm_definitions( -wd4146 -wd4503 -wd4996 -wd4800 -wd4244 -wd4624 )
226   add_llvm_definitions( -wd4355 -wd4715 -wd4180 -wd4345 -wd4224 )
228   # Suppress 'new behavior: elements of array 'array' will be default initialized'
229   add_llvm_definitions( -wd4351 )
231   # Enable warnings
232   if (LLVM_ENABLE_WARNINGS)
233     add_llvm_definitions( /W4 /Wall )
234     if (LLVM_ENABLE_PEDANTIC)
235       # No MSVC equivalent available
236     endif (LLVM_ENABLE_PEDANTIC)
237   endif (LLVM_ENABLE_WARNINGS)
238   if (LLVM_ENABLE_WERROR)
239     add_llvm_definitions( /WX )
240   endif (LLVM_ENABLE_WERROR)
241 elseif( CMAKE_COMPILER_IS_GNUCXX )
242   if (LLVM_ENABLE_WARNINGS)
243     add_llvm_definitions( -Wall -W -Wno-unused-parameter -Wwrite-strings )
244     if (LLVM_ENABLE_PEDANTIC)
245       add_llvm_definitions( -pedantic -Wno-long-long )
246     endif (LLVM_ENABLE_PEDANTIC)
247   endif (LLVM_ENABLE_WARNINGS)
248   if (LLVM_ENABLE_WERROR)
249     add_llvm_definitions( -Werror )
250   endif (LLVM_ENABLE_WERROR)
251 endif( MSVC )
253 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
255 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
256    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/System/Solaris.h")
257 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
259 include(AddLLVM)
260 include(TableGen)
262 add_subdirectory(lib/Support)
263 add_subdirectory(lib/System)
265 # Everything else depends on Support and System:
266 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
268 set(LLVM_TABLEGEN "tblgen" CACHE
269   STRING "Native TableGen executable. Saves building one when cross-compiling.")
270 # Effective tblgen executable to be used:
271 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
273 add_subdirectory(utils/TableGen)
275 if( CMAKE_CROSSCOMPILING )
276   # This adds a dependency on target `tblgen', so must go after utils/TableGen
277   include( CrossCompileLLVM )
278 endif( CMAKE_CROSSCOMPILING )
280 add_subdirectory(include/llvm)
282 add_subdirectory(lib/VMCore)
283 add_subdirectory(lib/CodeGen)
284 add_subdirectory(lib/CodeGen/SelectionDAG)
285 add_subdirectory(lib/CodeGen/AsmPrinter)
286 add_subdirectory(lib/Bitcode/Reader)
287 add_subdirectory(lib/Bitcode/Writer)
288 add_subdirectory(lib/Transforms/Utils)
289 add_subdirectory(lib/Transforms/Instrumentation)
290 add_subdirectory(lib/Transforms/InstCombine)
291 add_subdirectory(lib/Transforms/Scalar)
292 add_subdirectory(lib/Transforms/IPO)
293 add_subdirectory(lib/Transforms/Hello)
294 add_subdirectory(lib/Linker)
295 add_subdirectory(lib/Analysis)
296 add_subdirectory(lib/Analysis/IPA)
297 add_subdirectory(lib/MC)
298 add_subdirectory(lib/MC/MCParser)
299 add_subdirectory(lib/MC/MCDisassembler)
300 add_subdirectory(test)
302 add_subdirectory(utils/FileCheck)
303 add_subdirectory(utils/count)
304 add_subdirectory(utils/not)
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)
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   )
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   )
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   )
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)
356 add_subdirectory(projects)
358 option(LLVM_BUILD_TOOLS "Build LLVM tool programs." ON)
359 add_subdirectory(tools)
361 option(LLVM_BUILD_EXAMPLES "Build LLVM example programs." OFF)
362 add_subdirectory(examples)
364 add_subdirectory(cmake/modules)
366 install(DIRECTORY include/
367   DESTINATION include
368   FILES_MATCHING
369   PATTERN "*.def"
370   PATTERN "*.h"
371   PATTERN "*.td"
372   PATTERN "*.inc"
373   PATTERN ".svn" EXCLUDE
374   )
376 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
377   DESTINATION include
378   FILES_MATCHING
379   PATTERN "*.def"
380   PATTERN "*.h"
381   PATTERN "*.gen"
382   PATTERN "*.inc"
383   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
384   PATTERN "CMakeFiles" EXCLUDE
385   PATTERN ".svn" EXCLUDE
386   )
388 # TODO: make and install documentation.