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