Change errs() to dbgs().
[llvm-core.git] / CMakeLists.txt
blob7063640ca4d7f4e95c3f8954fb3e1b13d7a723b9
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(C_INCLUDE_DIRS "" CACHE STRING
74   "Colon separated list of directories clang will search for headers.")
76 set(LLVM_TARGET_ARCH "host"
77   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
79 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
81 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
82   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
83 else()
84   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
85 endif()
87 if( LLVM_ENABLE_ASSERTIONS )
88   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
89   if( NOT MSVC )
90     add_definitions( -D_DEBUG )
91   endif()
92   # On Release builds cmake automatically defines NDEBUG, so we
93   # explicitly undefine it:
94   if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
95     add_definitions( -UNDEBUG )
96   endif()
97 else()
98   if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
99     add_definitions( -DNDEBUG )
100   endif()
101 endif()
103 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
104   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
105 endif()
107 set(LLVM_ENUM_TARGETS "")
108 foreach(c ${LLVM_TARGETS_TO_BUILD})
109   list(FIND LLVM_ALL_TARGETS ${c} idx)
110   if( idx LESS 0 )
111     message(FATAL_ERROR "The target `${c}' does not exist.
112     It should be one of\n${LLVM_ALL_TARGETS}")
113   else()
114     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
115   endif()
116 endforeach(c)
118 # Produce llvm/Config/Targets.def
119 configure_file(
120   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
121   ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
122   )
124 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
126 # Add path for custom modules
127 set(CMAKE_MODULE_PATH
128   ${CMAKE_MODULE_PATH}
129   "${LLVM_MAIN_SRC_DIR}/cmake"
130   "${LLVM_MAIN_SRC_DIR}/cmake/modules"
131   )
133 include(AddLLVMDefinitions)
135 if(WIN32)
136   if(CYGWIN)
137     set(LLVM_ON_WIN32 0)
138     set(LLVM_ON_UNIX 1)
139   else(CYGWIN)
140     set(LLVM_ON_WIN32 1)
141     set(LLVM_ON_UNIX 0)
142   endif(CYGWIN)
143   set(LTDL_SHLIB_EXT ".dll")
144   set(EXEEXT ".exe")
145   # Maximum path length is 160 for non-unicode paths
146   set(MAXPATHLEN 160)
147 else(WIN32)
148   if(UNIX)
149     set(LLVM_ON_WIN32 0)
150     set(LLVM_ON_UNIX 1)
151     if(APPLE)
152       set(LTDL_SHLIB_EXT ".dylib")
153     else(APPLE)
154       set(LTDL_SHLIB_EXT ".so")
155     endif(APPLE)
156     set(EXEEXT "")
157     # FIXME: Maximum path length is currently set to 'safe' fixed value
158     set(MAXPATHLEN 2024)
159   else(UNIX)
160     MESSAGE(SEND_ERROR "Unable to determine platform")
161   endif(UNIX)
162 endif(WIN32)
164 include(config-ix)
166 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
168 set(ENABLE_PIC 0)
169 if( LLVM_ENABLE_PIC )
170  if( XCODE )
171    # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
172    # know how to disable this, so just force ENABLE_PIC off for now.
173    message(STATUS "Warning: -fPIC not supported with Xcode.")
174  else( XCODE )
175    if( SUPPORTS_FPIC_FLAG )
176       message(STATUS "Building with -fPIC")
177       add_llvm_definitions(-fPIC)
178       set(ENABLE_PIC 1)
179    else( SUPPORTS_FPIC_FLAG )
180       message(STATUS "Warning: -fPIC not supported.")
181    endif()
182  endif()
183 endif()
185 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
186 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
187 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
189 # set(CMAKE_VERBOSE_MAKEFILE true)
191 add_llvm_definitions( -D__STDC_LIMIT_MACROS )
192 add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
194 # MSVC has a gazillion warnings with this.
195 if( MSVC )
196   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
197 else( MSVC )
198   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
199 endif()
201 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
202 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
204 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
205   # TODO: support other platforms and toolchains.
206   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
207   if( LLVM_BUILD_32_BITS )
208     message(STATUS "Building 32 bits executables and libraries.")
209     add_llvm_definitions( -m32 )
210     list(APPEND CMAKE_EXE_LINKER_FLAGS -m32)
211     list(APPEND CMAKE_SHARED_LINKER_FLAGS -m32)
212   endif( LLVM_BUILD_32_BITS )
213 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
215 if( MSVC )
216   # List of valid CRTs for MSVC
217   set(MSVC_CRT
218     MD
219     MDd)
221   set(LLVM_USE_CRT "" CACHE STRING "Specify VC++ CRT to use for debug/release configurations.")
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   if (NOT ${LLVM_USE_CRT} STREQUAL "")
232     list(FIND MSVC_CRT ${LLVM_USE_CRT} idx)
233     if (idx LESS 0)
234       message(FATAL_ERROR "Invalid value for LLVM_USE_CRT: ${LLVM_USE_CRT}. Valid options are one of: ${MSVC_CRT}")
235     endif (idx LESS 0)
236     add_llvm_definitions("/${LLVM_USE_CRT}")
237     message(STATUS "Using VC++ CRT: ${LLVM_USE_CRT}")
238   endif (NOT ${LLVM_USE_CRT} STREQUAL "")
240   # Enable warnings
241   if (LLVM_ENABLE_WARNINGS)
242     add_llvm_definitions( /W4 /Wall )
243     if (LLVM_ENABLE_PEDANTIC)
244       # No MSVC equivalent available
245     endif (LLVM_ENABLE_PEDANTIC)
246   endif (LLVM_ENABLE_WARNINGS)
247   if (LLVM_ENABLE_WERROR)
248     add_llvm_definitions( /WX )
249   endif (LLVM_ENABLE_WERROR)
250 elseif( CMAKE_COMPILER_IS_GNUCXX )
251   if (LLVM_ENABLE_WARNINGS)
252     add_llvm_definitions( -Wall -W -Wno-unused-parameter -Wwrite-strings )
253     if (LLVM_ENABLE_PEDANTIC)
254       add_llvm_definitions( -pedantic -Wno-long-long )
255     endif (LLVM_ENABLE_PEDANTIC)
256   endif (LLVM_ENABLE_WARNINGS)
257   if (LLVM_ENABLE_WERROR)
258     add_llvm_definitions( -Werror )
259   endif (LLVM_ENABLE_WERROR)
260 endif( MSVC )
262 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
264 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
265    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/System/Solaris.h")
266 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
268 include(AddLLVM)
269 include(TableGen)
271 add_subdirectory(lib/Support)
272 add_subdirectory(lib/System)
274 # Everything else depends on Support and System:
275 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
277 set(LLVM_TABLEGEN "tblgen" CACHE
278   STRING "Native TableGen executable. Saves building one when cross-compiling.")
279 # Effective tblgen executable to be used:
280 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
282 add_subdirectory(utils/TableGen)
284 if( CMAKE_CROSSCOMPILING )
285   # This adds a dependency on target `tblgen', so must go after utils/TableGen
286   include( CrossCompileLLVM )
287 endif( CMAKE_CROSSCOMPILING )
289 add_subdirectory(include/llvm)
291 add_subdirectory(lib/VMCore)
292 add_subdirectory(lib/CodeGen)
293 add_subdirectory(lib/CodeGen/SelectionDAG)
294 add_subdirectory(lib/CodeGen/AsmPrinter)
295 add_subdirectory(lib/Bitcode/Reader)
296 add_subdirectory(lib/Bitcode/Writer)
297 add_subdirectory(lib/Transforms/Utils)
298 add_subdirectory(lib/Transforms/Instrumentation)
299 add_subdirectory(lib/Transforms/InstCombine)
300 add_subdirectory(lib/Transforms/Scalar)
301 add_subdirectory(lib/Transforms/IPO)
302 add_subdirectory(lib/Transforms/Hello)
303 add_subdirectory(lib/Linker)
304 add_subdirectory(lib/Analysis)
305 add_subdirectory(lib/Analysis/IPA)
306 add_subdirectory(lib/MC)
307 add_subdirectory(test)
309 add_subdirectory(utils/FileCheck)
310 add_subdirectory(utils/count)
311 add_subdirectory(utils/not)
313 set(LLVM_ENUM_ASM_PRINTERS "")
314 set(LLVM_ENUM_ASM_PARSERS "")
315 set(LLVM_ENUM_DISASSEMBLERS "")
316 foreach(t ${LLVM_TARGETS_TO_BUILD})
317   message(STATUS "Targeting ${t}")
318   add_subdirectory(lib/Target/${t})
319   add_subdirectory(lib/Target/${t}/TargetInfo)
320   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
321     add_subdirectory(lib/Target/${t}/AsmPrinter)
322     set(LLVM_ENUM_ASM_PRINTERS 
323       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
324   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
325   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
326     add_subdirectory(lib/Target/${t}/AsmParser)
327     set(LLVM_ENUM_ASM_PARSERS 
328       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
329   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
330   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/Disassembler/CMakeLists.txt )
331     add_subdirectory(lib/Target/${t}/Disassembler)
332     set(LLVM_ENUM_DISASSEMBLERS
333       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
334   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/Disassembler/CMakeLists.txt )
335   set(CURRENT_LLVM_TARGET)
336 endforeach(t)
338 # Produce llvm/Config/AsmPrinters.def
339 configure_file(
340   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
341   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
342   )
344 # Produce llvm/Config/AsmParsers.def
345 configure_file(
346   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
347   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
348   )
350 # Produce llvm/Config/Disassemblers.def
351 configure_file(
352   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
353   ${LLVM_BINARY_DIR}/include/llvm/Config/Disassemblers.def
354   )
356 add_subdirectory(lib/ExecutionEngine)
357 add_subdirectory(lib/ExecutionEngine/Interpreter)
358 add_subdirectory(lib/ExecutionEngine/JIT)
359 add_subdirectory(lib/Target)
360 add_subdirectory(lib/AsmParser)
361 add_subdirectory(lib/Archive)
363 add_subdirectory(projects)
365 option(LLVM_BUILD_TOOLS "Build LLVM tool programs." ON)
366 add_subdirectory(tools)
368 option(LLVM_BUILD_EXAMPLES "Build LLVM example programs." OFF)
369 add_subdirectory(examples)
371 install(DIRECTORY include/
372   DESTINATION include
373   FILES_MATCHING
374   PATTERN "*.def"
375   PATTERN "*.h"
376   PATTERN "*.td"
377   PATTERN "*.inc"
378   PATTERN ".svn" EXCLUDE
379   )
381 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
382   DESTINATION include
383   FILES_MATCHING
384   PATTERN "*.def"
385   PATTERN "*.h"
386   PATTERN "*.gen"
387   PATTERN "*.inc"
388   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
389   PATTERN "CMakeFiles" EXCLUDE
390   PATTERN ".svn" EXCLUDE
391   )
393 # TODO: make and install documentation.