Move library stuff out of the toplevel CMakeLists.txt file.
[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.8)
5
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   )
12
13 set(PACKAGE_VERSION "2.9")
14
15 include(VersionFromVCS)
16
17 option(LLVM_APPEND_VC_REV
18   "Append the version control system revision id to LLVM version" OFF)
19
20 if( LLVM_APPEND_VC_REV )
21   add_version_info_from_vcs(PACKAGE_VERSION)
22 endif()
23
24 set(PACKAGE_NAME llvm)
25 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
26 set(PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu")
27
28 if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
29   message(FATAL_ERROR "In-source builds are not allowed.
30 CMake would overwrite the makefiles distributed with LLVM.
31 Please create a directory and run cmake from there, passing the path
32 to this source directory as the last argument.
33 This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
34 Please delete them.")
35 endif()
36
37 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
38
39 set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
40 set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include)
41 set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
42 set(LLVM_TOOLS_BINARY_DIR ${LLVM_BINARY_DIR}/bin)
43 set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
44 set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
45
46 if( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
47   file(GLOB_RECURSE
48     tablegenned_files_on_include_dir
49     "${LLVM_MAIN_SRC_DIR}/include/llvm/*.gen")
50   file(GLOB_RECURSE
51     tablegenned_files_on_lib_dir
52     "${LLVM_MAIN_SRC_DIR}/lib/Target/*.inc")
53   if( tablegenned_files_on_include_dir OR tablegenned_files_on_lib_dir)
54     message(FATAL_ERROR "Apparently there is a previous in-source build,
55 probably as the result of running `configure' and `make' on
56 ${LLVM_MAIN_SRC_DIR}.
57 This may cause problems. The suspicious files are:
58 ${tablegenned_files_on_lib_dir}
59 ${tablegenned_files_on_include_dir}
60 Please clean the source directory.")
61   endif()
62 endif()
63
64 set(LLVM_ALL_TARGETS
65   Alpha
66   ARM
67   Blackfin
68   CBackend
69   CellSPU
70   CppBackend
71   Mips
72   MBlaze
73   MSP430
74   PowerPC
75   PTX
76   Sparc
77   SystemZ
78   X86
79   XCore
80   )
81
82 if( MSVC )
83   set(LLVM_TARGETS_TO_BUILD X86
84     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
85 else( MSVC )
86   set(LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS}
87     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
88 endif( MSVC )
89
90 option(LLVM_ENABLE_CBE_PRINTF_A "Set to ON if CBE is enabled for printf %a output" ON)
91 if(LLVM_ENABLE_CBE_PRINTF_A)
92   set(ENABLE_CBE_PRINTF_A 1)
93 endif()
94
95 option(LLVM_ENABLE_TIMESTAMPS "Enable embedding timestamp information in build" ON)
96 if(LLVM_ENABLE_TIMESTAMPS)
97   set(ENABLE_TIMESTAMPS 1)
98 endif()
99
100 option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
101 set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
102 set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
103
104 set(LLVM_TARGET_ARCH "host"
105   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
106
107 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
108
109 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
110   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
111 endif()
112
113 set(LLVM_ENUM_TARGETS "")
114 foreach(c ${LLVM_TARGETS_TO_BUILD})
115   list(FIND LLVM_ALL_TARGETS ${c} idx)
116   if( idx LESS 0 )
117     message(FATAL_ERROR "The target `${c}' does not exist.
118     It should be one of\n${LLVM_ALL_TARGETS}")
119   else()
120     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
121   endif()
122 endforeach(c)
123
124 # Produce llvm/Config/Targets.def
125 configure_file(
126   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
127   ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
128   )
129
130 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
131
132 include(AddLLVMDefinitions)
133
134 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
135
136 include(config-ix)
137
138 include(HandleLLVMOptions)
139
140 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
141   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
142 else()
143   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
144 endif()
145
146 configure_file(
147   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
148   ${LLVM_BINARY_DIR}/include/llvm/Config/config.h)
149
150 configure_file(
151   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
152   ${LLVM_BINARY_DIR}/include/llvm/Config/llvm-config.h)
153
154 configure_file(
155   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/DataTypes.h.cmake
156   ${LLVM_BINARY_DIR}/include/llvm/Support/DataTypes.h)
157
158 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
159 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
160 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
161
162 # MSVC has a gazillion warnings with this.
163 if( MSVC )
164   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
165 else( MSVC )
166   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
167 endif()
168
169 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
170 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
171
172 set(CMAKE_INCLUDE_CURRENT_DIR ON)
173
174 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
175
176 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
177    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/Support/Solaris.h")
178 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
179
180 include(AddLLVM)
181 include(TableGen)
182
183 if( MINGW )
184   get_system_libs(LLVM_SYSTEM_LIBS_LIST)
185   foreach(l ${LLVM_SYSTEM_LIBS_LIST})
186     set(LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS} -l${l}")
187   endforeach()
188   set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
189   set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
190 endif()
191
192 if( MINGW )
193   # People report that -O3 is unreliable on MinGW. The traditional
194   # build also uses -O2 for that reason:
195   llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
196 endif()
197
198 # Put this before tblgen. Else we have a circular dependence.
199 add_subdirectory(lib/Support)
200
201 set(LLVM_TABLEGEN "tblgen" CACHE
202   STRING "Native TableGen executable. Saves building one when cross-compiling.")
203 # Effective tblgen executable to be used:
204 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
205
206 add_subdirectory(utils/TableGen)
207
208 if( CMAKE_CROSSCOMPILING )
209   # This adds a dependency on target `tblgen', so must go after utils/TableGen
210   include( CrossCompileLLVM )
211 endif( CMAKE_CROSSCOMPILING )
212
213 add_subdirectory(include/llvm)
214
215 add_subdirectory(lib)
216
217 add_subdirectory(utils/FileCheck)
218 add_subdirectory(utils/FileUpdate)
219 add_subdirectory(utils/count)
220 add_subdirectory(utils/not)
221 add_subdirectory(utils/llvm-lit)
222
223 add_subdirectory(projects)
224
225 option(LLVM_BUILD_TOOLS
226   "Build the LLVM tools. If OFF, just generate build targets." ON)
227 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
228 if( LLVM_INCLUDE_TOOLS )
229   add_subdirectory(tools)
230 endif()
231
232 option(LLVM_BUILD_EXAMPLES
233   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
234 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
235 if( LLVM_INCLUDE_EXAMPLES )
236   add_subdirectory(examples)
237 endif()
238
239 option(LLVM_BUILD_TESTS
240   "Build LLVM unit tests. If OFF, just generate build targes." OFF)
241 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
242 if( LLVM_INCLUDE_TESTS )
243   add_subdirectory(test)
244   add_subdirectory(utils/unittest)
245   add_subdirectory(unittests)
246   if (MSVC)
247     # This utility is used to prevent chrashing tests from calling Dr. Watson on
248     # Windows.
249     add_subdirectory(utils/KillTheDoctor)
250   endif()
251 endif()
252
253 add_subdirectory(cmake/modules)
254
255 install(DIRECTORY include/
256   DESTINATION include
257   FILES_MATCHING
258   PATTERN "*.def"
259   PATTERN "*.h"
260   PATTERN "*.td"
261   PATTERN "*.inc"
262   PATTERN ".svn" EXCLUDE
263   )
264
265 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
266   DESTINATION include
267   FILES_MATCHING
268   PATTERN "*.def"
269   PATTERN "*.h"
270   PATTERN "*.gen"
271   PATTERN "*.inc"
272   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
273   PATTERN "CMakeFiles" EXCLUDE
274   PATTERN ".svn" EXCLUDE
275   )
276
277 # TODO: make and install documentation.
278
279 set(CPACK_PACKAGE_VENDOR "LLVM")
280 set(CPACK_PACKAGE_VERSION_MAJOR 2)
281 set(CPACK_PACKAGE_VERSION_MINOR 9)
282 add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH)
283 include(CPack)
284
285 # Workaround for MSVS10 to avoid the Dialog Hell
286 # FIXME: This could be removed with future version of CMake.
287 if(MSVC_VERSION EQUAL 1600)
288   set(LLVM_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/LLVM.sln")
289   if( EXISTS "${LLVM_SLN_FILENAME}" )
290     file(APPEND "${LLVM_SLN_FILENAME}" "\n# This should be regenerated!\n")
291   endif()
292 endif()