CMake: Localized dependency on Perl.
[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.6svn)
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 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
74
75 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
76   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
77 else()
78   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
79 endif()
80
81 if( LLVM_ENABLE_ASSERTIONS )
82   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
83   if( NOT MSVC )
84     add_definitions( -D_DEBUG )
85   endif()
86   # On Release builds cmake automatically defines NDEBUG, so we
87   # explicitly undefine it:
88   if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
89     add_definitions( -UNDEBUG )
90   endif()
91 else()
92   if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
93     add_definitions( -DNDEBUG )
94   endif()
95 endif()
96
97 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
98   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
99 endif()
100
101 set(LLVM_ENUM_TARGETS "")
102 foreach(c ${LLVM_TARGETS_TO_BUILD})
103   list(FIND LLVM_ALL_TARGETS ${c} idx)
104   if( idx LESS 0 )
105     message(FATAL_ERROR "The target `${c}' does not exists.
106     It should be one of\n${LLVM_ALL_TARGETS}")
107   else()
108     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
109   endif()
110 endforeach(c)
111
112 # Produce llvm/Config/Targets.def
113 configure_file(
114   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
115   ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
116   )
117
118 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
119
120 # Add path for custom modules
121 set(CMAKE_MODULE_PATH
122   ${CMAKE_MODULE_PATH}
123   "${LLVM_MAIN_SRC_DIR}/cmake"
124   "${LLVM_MAIN_SRC_DIR}/cmake/modules"
125   )
126
127 include(AddLLVMDefinitions)
128
129 if(WIN32)
130   if(CYGWIN)
131     set(LLVM_ON_WIN32 0)
132     set(LLVM_ON_UNIX 1)
133   else(CYGWIN)
134     set(LLVM_ON_WIN32 1)
135     set(LLVM_ON_UNIX 0)
136   endif(CYGWIN)
137   set(LTDL_SHLIB_EXT ".dll")
138   set(EXEEXT ".exe")
139   # Maximum path length is 160 for non-unicode paths
140   set(MAXPATHLEN 160)
141 else(WIN32)
142   if(UNIX)
143     set(LLVM_ON_WIN32 0)
144     set(LLVM_ON_UNIX 1)
145     set(LTDL_SHLIB_EXT ".so")
146     set(EXEEXT "")
147     # FIXME: Maximum path length is currently set to 'safe' fixed value
148     set(MAXPATHLEN 2024)
149   else(UNIX)
150     MESSAGE(SEND_ERROR "Unable to determine platform")
151   endif(UNIX)
152 endif(WIN32)
153
154 include(config-ix)
155
156 option(LLVM_ENABLE_PIC "Build Position-Independent Code" OFF)
157
158 set(ENABLE_PIC 0)
159 if( LLVM_ENABLE_PIC )
160   if( SUPPORTS_FPIC_FLAG )
161     message(STATUS "Building with -fPIC")
162     add_llvm_definitions(-fPIC)
163     set(ENABLE_PIC 1)
164  else( SUPPORTS_FPIC_FLAG )
165     message(STATUS "Warning: -fPIC not supported.")
166   endif()
167 endif()
168
169 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
170 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
171 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
172
173 # set(CMAKE_VERBOSE_MAKEFILE true)
174
175 add_llvm_definitions( -D__STDC_LIMIT_MACROS )
176 add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
177
178 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
179   # TODO: support other platforms and toolchains.
180   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
181   if( LLVM_BUILD_32_BITS )
182     message(STATUS "Building 32 bits executables and libraries.")
183     add_llvm_definitions( -m32 )
184     list(APPEND CMAKE_EXE_LINKER_FLAGS -m32)
185     list(APPEND CMAKE_SHARED_LINKER_FLAGS -m32)
186     set( LLVM_PLO_FLAGS -melf_i386 ${LLVM_PLO_FLAGS} )
187   endif( LLVM_BUILD_32_BITS )
188 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
189
190 if( MSVC )
191   # List of valid CRTs for MSVC
192   set(MSVC_CRT
193     MD
194     MDd)
195
196   set(LLVM_USE_CRT "" CACHE STRING "Specify VC++ CRT to use for debug/release configurations.")
197   add_llvm_definitions( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS )
198   add_llvm_definitions( -D_SCL_SECURE_NO_WARNINGS -DCRT_NONSTDC_NO_WARNINGS )
199   add_llvm_definitions( -D_SCL_SECURE_NO_DEPRECATE )
200   add_llvm_definitions( -wd4146 -wd4503 -wd4996 -wd4800 -wd4244 -wd4624 )
201   add_llvm_definitions( -wd4355 -wd4715 -wd4180 -wd4345 -wd4224 )
202
203   # Suppress 'new behavior: elements of array 'array' will be default initialized'
204   add_llvm_definitions( -wd4351 )
205
206   if (NOT ${LLVM_USE_CRT} STREQUAL "")
207     list(FIND MSVC_CRT ${LLVM_USE_CRT} idx)
208     if (idx LESS 0)
209       message(FATAL_ERROR "Invalid value for LLVM_USE_CRT: ${LLVM_USE_CRT}. Valid options are one of: ${MSVC_CRT}")
210     endif (idx LESS 0)
211     add_llvm_definitions("/${LLVM_USE_CRT}")
212     message(STATUS "Using VC++ CRT: ${LLVM_USE_CRT}")
213   endif (NOT ${LLVM_USE_CRT} STREQUAL "")
214 endif( MSVC )
215
216 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
217
218 include(AddLLVM)
219 include(TableGen)
220
221 add_subdirectory(lib/Support)
222 add_subdirectory(lib/System)
223
224 # Everything else depends on Support and System:
225 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
226
227 set(LLVM_TABLEGEN "tblgen" CACHE
228   STRING "Native TableGen executable. Saves building one when cross-compiling.")
229 # Effective tblgen executable to be used:
230 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
231
232 add_subdirectory(utils/TableGen)
233
234 if( CMAKE_CROSSCOMPILING )
235   # This adds a dependency on target `tblgen', so must go after utils/TableGen
236   include( CrossCompileLLVM )
237 endif( CMAKE_CROSSCOMPILING )
238
239 add_subdirectory(include/llvm)
240
241 add_subdirectory(lib/VMCore)
242 add_subdirectory(lib/CodeGen)
243 add_subdirectory(lib/CodeGen/SelectionDAG)
244 add_subdirectory(lib/CodeGen/AsmPrinter)
245 add_subdirectory(lib/Bitcode/Reader)
246 add_subdirectory(lib/Bitcode/Writer)
247 add_subdirectory(lib/Transforms/Utils)
248 add_subdirectory(lib/Transforms/Instrumentation)
249 add_subdirectory(lib/Transforms/Scalar)
250 add_subdirectory(lib/Transforms/IPO)
251 add_subdirectory(lib/Transforms/Hello)
252 add_subdirectory(lib/Linker)
253 add_subdirectory(lib/Analysis)
254 add_subdirectory(lib/Analysis/IPA)
255 add_subdirectory(lib/MC)
256
257 add_subdirectory(utils/FileCheck)
258
259  set(LLVM_ENUM_ASM_PRINTERS "")
260  set(LLVM_ENUM_ASM_PARSERS "")
261  foreach(t ${LLVM_TARGETS_TO_BUILD})
262   message(STATUS "Targeting ${t}")
263   add_subdirectory(lib/Target/${t})
264   add_subdirectory(lib/Target/${t}/TargetInfo)
265   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
266    add_subdirectory(lib/Target/${t}/AsmPrinter)
267     set(LLVM_ENUM_ASM_PRINTERS 
268         "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
269  endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
270   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
271    add_subdirectory(lib/Target/${t}/AsmParser)
272     set(LLVM_ENUM_ASM_PARSERS 
273         "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
274  endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
275 endforeach(t)
276
277 # Produce llvm/Config/AsmPrinters.def
278 configure_file(
279   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
280   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
281   )
282
283 # Produce llvm/Config/AsmParsers.def
284 configure_file(
285   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
286   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
287   )
288
289 add_subdirectory(lib/ExecutionEngine)
290 add_subdirectory(lib/ExecutionEngine/Interpreter)
291 add_subdirectory(lib/ExecutionEngine/JIT)
292 add_subdirectory(lib/Target)
293 add_subdirectory(lib/AsmParser)
294 add_subdirectory(lib/Debugger)
295 add_subdirectory(lib/Archive)
296
297 add_subdirectory(projects)
298 add_subdirectory(tools)
299
300 option(LLVM_EXAMPLES "Build LLVM example programs." OFF)
301 if (LLVM_EXAMPLES)
302   add_subdirectory(examples)
303 endif ()
304
305 install(DIRECTORY include
306   DESTINATION .
307   PATTERN ".svn" EXCLUDE
308   PATTERN "*.cmake" EXCLUDE
309   PATTERN "*.in" EXCLUDE
310   PATTERN "*.tmp" EXCLUDE
311   )
312
313 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include
314   DESTINATION .
315   )
316
317 # TODO: make and install documentation.