Small cleanups.
[oota-llvm.git] / CMakeLists.txt
1 # See docs/CMake.html for instructions about how to build LLVM with CMake.
2
3 project(LLVM)
4 cmake_minimum_required(VERSION 2.6.1)
5
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")
10
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()
19
20 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
21
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)" )
28
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()
46
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   )
64
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 )
72
73 set(LLVM_TARGET_ARCH "host"
74   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
75
76 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
77
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()
83
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()
99
100 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
101   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
102 endif()
103
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)
114
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   )
120
121 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
122
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   )
129
130 include(AddLLVMDefinitions)
131
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)
160
161 include(config-ix)
162
163 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
164
165 set(ENABLE_PIC 0)
166 if( LLVM_ENABLE_PIC )
167  if( XCODE )
168    # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
169    # know how to disable this, so just force ENABLE_PIC off for now.
170    message(STATUS "Warning: -fPIC not supported with Xcode.")
171  else( XCODE )
172    if( SUPPORTS_FPIC_FLAG )
173       message(STATUS "Building with -fPIC")
174       add_llvm_definitions(-fPIC)
175       set(ENABLE_PIC 1)
176    else( SUPPORTS_FPIC_FLAG )
177       message(STATUS "Warning: -fPIC not supported.")
178    endif()
179  endif()
180 endif()
181
182 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
183 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
184 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
185
186 # set(CMAKE_VERBOSE_MAKEFILE true)
187
188 add_llvm_definitions( -D__STDC_LIMIT_MACROS )
189 add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
190
191 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
192   # TODO: support other platforms and toolchains.
193   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
194   if( LLVM_BUILD_32_BITS )
195     message(STATUS "Building 32 bits executables and libraries.")
196     add_llvm_definitions( -m32 )
197     list(APPEND CMAKE_EXE_LINKER_FLAGS -m32)
198     list(APPEND CMAKE_SHARED_LINKER_FLAGS -m32)
199   endif( LLVM_BUILD_32_BITS )
200 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
201
202 if( MSVC )
203   # List of valid CRTs for MSVC
204   set(MSVC_CRT
205     MD
206     MDd)
207
208   set(LLVM_USE_CRT "" CACHE STRING "Specify VC++ CRT to use for debug/release configurations.")
209   add_llvm_definitions( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS )
210   add_llvm_definitions( -D_SCL_SECURE_NO_WARNINGS -DCRT_NONSTDC_NO_WARNINGS )
211   add_llvm_definitions( -D_SCL_SECURE_NO_DEPRECATE )
212   add_llvm_definitions( -wd4146 -wd4503 -wd4996 -wd4800 -wd4244 -wd4624 )
213   add_llvm_definitions( -wd4355 -wd4715 -wd4180 -wd4345 -wd4224 )
214
215   # Suppress 'new behavior: elements of array 'array' will be default initialized'
216   add_llvm_definitions( -wd4351 )
217
218   if (NOT ${LLVM_USE_CRT} STREQUAL "")
219     list(FIND MSVC_CRT ${LLVM_USE_CRT} idx)
220     if (idx LESS 0)
221       message(FATAL_ERROR "Invalid value for LLVM_USE_CRT: ${LLVM_USE_CRT}. Valid options are one of: ${MSVC_CRT}")
222     endif (idx LESS 0)
223     add_llvm_definitions("/${LLVM_USE_CRT}")
224     message(STATUS "Using VC++ CRT: ${LLVM_USE_CRT}")
225   endif (NOT ${LLVM_USE_CRT} STREQUAL "")
226 endif( MSVC )
227
228 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
229
230 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
231    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/System/Solaris.h")
232 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
233
234 include(AddLLVM)
235 include(TableGen)
236
237 add_subdirectory(lib/Support)
238 add_subdirectory(lib/System)
239
240 # Everything else depends on Support and System:
241 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
242
243 set(LLVM_TABLEGEN "tblgen" CACHE
244   STRING "Native TableGen executable. Saves building one when cross-compiling.")
245 # Effective tblgen executable to be used:
246 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
247
248 add_subdirectory(utils/TableGen)
249
250 if( CMAKE_CROSSCOMPILING )
251   # This adds a dependency on target `tblgen', so must go after utils/TableGen
252   include( CrossCompileLLVM )
253 endif( CMAKE_CROSSCOMPILING )
254
255 add_subdirectory(include/llvm)
256
257 add_subdirectory(lib/VMCore)
258 add_subdirectory(lib/CodeGen)
259 add_subdirectory(lib/CodeGen/SelectionDAG)
260 add_subdirectory(lib/CodeGen/AsmPrinter)
261 add_subdirectory(lib/Bitcode/Reader)
262 add_subdirectory(lib/Bitcode/Writer)
263 add_subdirectory(lib/Transforms/Utils)
264 add_subdirectory(lib/Transforms/Instrumentation)
265 add_subdirectory(lib/Transforms/Scalar)
266 add_subdirectory(lib/Transforms/IPO)
267 add_subdirectory(lib/Transforms/Hello)
268 add_subdirectory(lib/Linker)
269 add_subdirectory(lib/Analysis)
270 add_subdirectory(lib/Analysis/IPA)
271 add_subdirectory(lib/MC)
272 add_subdirectory(test)
273
274 add_subdirectory(utils/FileCheck)
275 add_subdirectory(utils/count)
276 add_subdirectory(utils/not)
277
278 set(LLVM_ENUM_ASM_PRINTERS "")
279 set(LLVM_ENUM_ASM_PARSERS "")
280 foreach(t ${LLVM_TARGETS_TO_BUILD})
281   message(STATUS "Targeting ${t}")
282   add_subdirectory(lib/Target/${t})
283   add_subdirectory(lib/Target/${t}/TargetInfo)
284   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
285     add_subdirectory(lib/Target/${t}/AsmPrinter)
286     set(LLVM_ENUM_ASM_PRINTERS 
287       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
288   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
289   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
290     add_subdirectory(lib/Target/${t}/AsmParser)
291     set(LLVM_ENUM_ASM_PARSERS 
292       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
293   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
294   set(CURRENT_LLVM_TARGET)
295 endforeach(t)
296
297 # Produce llvm/Config/AsmPrinters.def
298 configure_file(
299   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
300   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
301   )
302
303 # Produce llvm/Config/AsmParsers.def
304 configure_file(
305   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
306   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
307   )
308
309 add_subdirectory(lib/ExecutionEngine)
310 add_subdirectory(lib/ExecutionEngine/Interpreter)
311 add_subdirectory(lib/ExecutionEngine/JIT)
312 add_subdirectory(lib/Target)
313 add_subdirectory(lib/AsmParser)
314 add_subdirectory(lib/Archive)
315
316 add_subdirectory(projects)
317
318 option(LLVM_BUILD_TOOLS "Build LLVM tool programs." ON)
319 if(LLVM_BUILD_TOOLS)
320   add_subdirectory(tools)
321 endif()
322
323 option(LLVM_BUILD_EXAMPLES "Build LLVM example programs." ON)
324 if(LLVM_BUILD_EXAMPLES)
325   add_subdirectory(examples)
326 endif ()
327
328 install(DIRECTORY include/
329   DESTINATION include
330   FILES_MATCHING
331   PATTERN "*.def"
332   PATTERN "*.h"
333   PATTERN "*.td"
334   PATTERN "*.inc"
335   PATTERN ".svn" EXCLUDE
336   )
337
338 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
339   DESTINATION include
340   FILES_MATCHING
341   PATTERN "*.def"
342   PATTERN "*.h"
343   PATTERN "*.gen"
344   PATTERN "*.inc"
345   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
346   PATTERN "CMakeFiles" EXCLUDE
347   PATTERN ".svn" EXCLUDE
348   )
349
350 # TODO: make and install documentation.