The magic for our current brand of .bc files is BC. For older ones it was llvc.
[llvm.git] / CMakeLists.txt
blob5b30309bf331f0adb4f76ed1b59ecf1fcafe7a9d
1 # See docs/CMake.html for instructions about how to build LLVM with CMake.
3 project(LLVM)
4 cmake_minimum_required(VERSION 2.6.1)
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")
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()
20 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
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)" )
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()
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   )
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 )
73 set(LLVM_TARGET_ARCH "host"
74   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
76 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
78 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
79   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
80 else()
81   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
82 endif()
84 if( LLVM_ENABLE_ASSERTIONS )
85   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
86   if( NOT MSVC )
87     add_definitions( -D_DEBUG )
88   endif()
89   # On Release builds cmake automatically defines NDEBUG, so we
90   # explicitly undefine it:
91   if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
92     add_definitions( -UNDEBUG )
93   endif()
94 else()
95   if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
96     add_definitions( -DNDEBUG )
97   endif()
98 endif()
100 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
101   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
102 endif()
104 set(LLVM_ENUM_TARGETS "")
105 foreach(c ${LLVM_TARGETS_TO_BUILD})
106   list(FIND LLVM_ALL_TARGETS ${c} idx)
107   if( idx LESS 0 )
108     message(FATAL_ERROR "The target `${c}' does not exist.
109     It should be one of\n${LLVM_ALL_TARGETS}")
110   else()
111     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
112   endif()
113 endforeach(c)
115 # Produce llvm/Config/Targets.def
116 configure_file(
117   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
118   ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
119   )
121 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
123 # Add path for custom modules
124 set(CMAKE_MODULE_PATH
125   ${CMAKE_MODULE_PATH}
126   "${LLVM_MAIN_SRC_DIR}/cmake"
127   "${LLVM_MAIN_SRC_DIR}/cmake/modules"
128   )
130 include(AddLLVMDefinitions)
132 if(WIN32)
133   if(CYGWIN)
134     set(LLVM_ON_WIN32 0)
135     set(LLVM_ON_UNIX 1)
136   else(CYGWIN)
137     set(LLVM_ON_WIN32 1)
138     set(LLVM_ON_UNIX 0)
139   endif(CYGWIN)
140   set(LTDL_SHLIB_EXT ".dll")
141   set(EXEEXT ".exe")
142   # Maximum path length is 160 for non-unicode paths
143   set(MAXPATHLEN 160)
144 else(WIN32)
145   if(UNIX)
146     set(LLVM_ON_WIN32 0)
147     set(LLVM_ON_UNIX 1)
148     if(APPLE)
149       set(LTDL_SHLIB_EXT ".dylib")
150     else(APPLE)
151       set(LTDL_SHLIB_EXT ".so")
152     endif(APPLE)
153     set(EXEEXT "")
154     # FIXME: Maximum path length is currently set to 'safe' fixed value
155     set(MAXPATHLEN 2024)
156   else(UNIX)
157     MESSAGE(SEND_ERROR "Unable to determine platform")
158   endif(UNIX)
159 endif(WIN32)
161 include(config-ix)
163 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
165 set(ENABLE_PIC 0)
166 if( LLVM_ENABLE_PIC )
167   if( SUPPORTS_FPIC_FLAG )
168     message(STATUS "Building with -fPIC")
169     add_llvm_definitions(-fPIC)
170     set(ENABLE_PIC 1)
171  else( SUPPORTS_FPIC_FLAG )
172     message(STATUS "Warning: -fPIC not supported.")
173   endif()
174 endif()
176 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
177 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
178 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
180 # set(CMAKE_VERBOSE_MAKEFILE true)
182 add_llvm_definitions( -D__STDC_LIMIT_MACROS )
183 add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
185 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
186   # TODO: support other platforms and toolchains.
187   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
188   if( LLVM_BUILD_32_BITS )
189     message(STATUS "Building 32 bits executables and libraries.")
190     add_llvm_definitions( -m32 )
191     list(APPEND CMAKE_EXE_LINKER_FLAGS -m32)
192     list(APPEND CMAKE_SHARED_LINKER_FLAGS -m32)
193   endif( LLVM_BUILD_32_BITS )
194 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
196 if( MSVC )
197   # List of valid CRTs for MSVC
198   set(MSVC_CRT
199     MD
200     MDd)
202   set(LLVM_USE_CRT "" CACHE STRING "Specify VC++ CRT to use for debug/release configurations.")
203   add_llvm_definitions( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS )
204   add_llvm_definitions( -D_SCL_SECURE_NO_WARNINGS -DCRT_NONSTDC_NO_WARNINGS )
205   add_llvm_definitions( -D_SCL_SECURE_NO_DEPRECATE )
206   add_llvm_definitions( -wd4146 -wd4503 -wd4996 -wd4800 -wd4244 -wd4624 )
207   add_llvm_definitions( -wd4355 -wd4715 -wd4180 -wd4345 -wd4224 )
209   # Suppress 'new behavior: elements of array 'array' will be default initialized'
210   add_llvm_definitions( -wd4351 )
212   if (NOT ${LLVM_USE_CRT} STREQUAL "")
213     list(FIND MSVC_CRT ${LLVM_USE_CRT} idx)
214     if (idx LESS 0)
215       message(FATAL_ERROR "Invalid value for LLVM_USE_CRT: ${LLVM_USE_CRT}. Valid options are one of: ${MSVC_CRT}")
216     endif (idx LESS 0)
217     add_llvm_definitions("/${LLVM_USE_CRT}")
218     message(STATUS "Using VC++ CRT: ${LLVM_USE_CRT}")
219   endif (NOT ${LLVM_USE_CRT} STREQUAL "")
220 endif( MSVC )
222 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
224 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
225    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/System/Solaris.h")
226 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
228 include(AddLLVM)
229 include(TableGen)
231 add_subdirectory(lib/Support)
232 add_subdirectory(lib/System)
234 # Everything else depends on Support and System:
235 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
237 set(LLVM_TABLEGEN "tblgen" CACHE
238   STRING "Native TableGen executable. Saves building one when cross-compiling.")
239 # Effective tblgen executable to be used:
240 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
242 add_subdirectory(utils/TableGen)
244 if( CMAKE_CROSSCOMPILING )
245   # This adds a dependency on target `tblgen', so must go after utils/TableGen
246   include( CrossCompileLLVM )
247 endif( CMAKE_CROSSCOMPILING )
249 add_subdirectory(include/llvm)
251 add_subdirectory(lib/VMCore)
252 add_subdirectory(lib/CodeGen)
253 add_subdirectory(lib/CodeGen/SelectionDAG)
254 add_subdirectory(lib/CodeGen/AsmPrinter)
255 add_subdirectory(lib/Bitcode/Reader)
256 add_subdirectory(lib/Bitcode/Writer)
257 add_subdirectory(lib/Transforms/Utils)
258 add_subdirectory(lib/Transforms/Instrumentation)
259 add_subdirectory(lib/Transforms/Scalar)
260 add_subdirectory(lib/Transforms/IPO)
261 add_subdirectory(lib/Transforms/Hello)
262 add_subdirectory(lib/Linker)
263 add_subdirectory(lib/Analysis)
264 add_subdirectory(lib/Analysis/IPA)
265 add_subdirectory(lib/MC)
266 add_subdirectory(test)
268 add_subdirectory(utils/FileCheck)
269 add_subdirectory(utils/count)
270 add_subdirectory(utils/not)
272 set(LLVM_ENUM_ASM_PRINTERS "")
273 set(LLVM_ENUM_ASM_PARSERS "")
274 foreach(t ${LLVM_TARGETS_TO_BUILD})
275   message(STATUS "Targeting ${t}")
276   add_subdirectory(lib/Target/${t})
277   add_subdirectory(lib/Target/${t}/TargetInfo)
278   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
279     add_subdirectory(lib/Target/${t}/AsmPrinter)
280     set(LLVM_ENUM_ASM_PRINTERS 
281       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
282   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
283   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
284     add_subdirectory(lib/Target/${t}/AsmParser)
285     set(LLVM_ENUM_ASM_PARSERS 
286       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
287   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
288   set(CURRENT_LLVM_TARGET)
289 endforeach(t)
291 # Produce llvm/Config/AsmPrinters.def
292 configure_file(
293   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
294   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
295   )
297 # Produce llvm/Config/AsmParsers.def
298 configure_file(
299   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
300   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
301   )
303 add_subdirectory(lib/ExecutionEngine)
304 add_subdirectory(lib/ExecutionEngine/Interpreter)
305 add_subdirectory(lib/ExecutionEngine/JIT)
306 add_subdirectory(lib/Target)
307 add_subdirectory(lib/AsmParser)
308 add_subdirectory(lib/Archive)
310 add_subdirectory(projects)
312 option(LLVM_BUILD_TOOLS "Build LLVM tool programs." ON)
313 if(LLVM_BUILD_TOOLS)
314   add_subdirectory(tools)
315 endif()
317 option(LLVM_BUILD_EXAMPLES "Build LLVM example programs." ON)
318 if(LLVM_BUILD_EXAMPLES)
319   add_subdirectory(examples)
320 endif ()
322 install(DIRECTORY include/
323   DESTINATION include
324   FILES_MATCHING
325   PATTERN "*.def"
326   PATTERN "*.h"
327   PATTERN "*.td"
328   PATTERN "*.inc"
329   PATTERN ".svn" EXCLUDE
330   )
332 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
333   DESTINATION include
334   FILES_MATCHING
335   PATTERN "*.def"
336   PATTERN "*.h"
337   PATTERN "*.gen"
338   PATTERN "*.inc"
339   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
340   PATTERN "CMakeFiles" EXCLUDE
341   PATTERN ".svn" EXCLUDE
342   )
344 # TODO: make and install documentation.