Fix tagging name.
[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 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 if( MSVC )
85   set(LLVM_TARGETS_TO_BUILD X86
86     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
87 else( MSVC )
88   set(LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS}
89     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
90 endif( MSVC )
91
92 option(LLVM_ENABLE_CBE_PRINTF_A "Set to ON if CBE is enabled for printf %a output" ON)
93 if(LLVM_ENABLE_CBE_PRINTF_A)
94   set(ENABLE_CBE_PRINTF_A 1)
95 endif()
96
97 option(LLVM_ENABLE_TIMESTAMPS "Enable embedding timestamp information in build" ON)
98 if(LLVM_ENABLE_TIMESTAMPS)
99   set(ENABLE_TIMESTAMPS 1)
100 endif()
101
102 option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
103 set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
104 set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
105
106 set(LLVM_TARGET_ARCH "host"
107   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
108
109 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
110
111 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
112   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
113 endif()
114
115 set(LLVM_ENUM_TARGETS "")
116 foreach(c ${LLVM_TARGETS_TO_BUILD})
117   list(FIND LLVM_ALL_TARGETS ${c} idx)
118   if( idx LESS 0 )
119     message(FATAL_ERROR "The target `${c}' does not exist.
120     It should be one of\n${LLVM_ALL_TARGETS}")
121   else()
122     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
123   endif()
124 endforeach(c)
125
126 # Produce llvm/Config/Targets.def
127 configure_file(
128   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
129   ${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
130   )
131
132 set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
133
134 include(AddLLVMDefinitions)
135
136 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
137
138 # MSVC has a gazillion warnings with this.
139 if( MSVC )
140   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
141 else( MSVC )
142   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
143 endif()
144
145 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
146 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
147
148 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
149   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
150 else()
151   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
152 endif()
153
154 # All options refered to from HandleLLVMOptions have to be specified
155 # BEFORE this include, otherwise options will not be correctly set on
156 # first cmake run
157 include(config-ix)
158 include(HandleLLVMOptions)
159
160 configure_file(
161   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
162   ${LLVM_BINARY_DIR}/include/llvm/Config/config.h)
163
164 configure_file(
165   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
166   ${LLVM_BINARY_DIR}/include/llvm/Config/llvm-config.h)
167
168 configure_file(
169   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/DataTypes.h.cmake
170   ${LLVM_BINARY_DIR}/include/llvm/Support/DataTypes.h)
171
172 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
173 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
174 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
175
176 set(CMAKE_INCLUDE_CURRENT_DIR ON)
177
178 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
179
180 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
181    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/Support/Solaris.h")
182 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
183
184 include(AddLLVM)
185 include(TableGen)
186
187 if( MINGW )
188   get_system_libs(LLVM_SYSTEM_LIBS_LIST)
189   foreach(l ${LLVM_SYSTEM_LIBS_LIST})
190     set(LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS} -l${l}")
191   endforeach()
192   set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
193   set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
194 endif()
195
196 if( MINGW )
197   # People report that -O3 is unreliable on MinGW. The traditional
198   # build also uses -O2 for that reason:
199   llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
200 endif()
201
202 # Put this before tblgen. Else we have a circular dependence.
203 add_subdirectory(lib/Support)
204
205 set(LLVM_TABLEGEN "tblgen" CACHE
206   STRING "Native TableGen executable. Saves building one when cross-compiling.")
207 # Effective tblgen executable to be used:
208 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
209
210 add_subdirectory(utils/TableGen)
211
212 if( CMAKE_CROSSCOMPILING )
213   # This adds a dependency on target `tblgen', so must go after utils/TableGen
214   include( CrossCompileLLVM )
215 endif( CMAKE_CROSSCOMPILING )
216
217 add_subdirectory(include/llvm)
218
219 add_subdirectory(lib)
220
221 add_subdirectory(utils/FileCheck)
222 add_subdirectory(utils/FileUpdate)
223 add_subdirectory(utils/count)
224 add_subdirectory(utils/not)
225 add_subdirectory(utils/llvm-lit)
226
227 add_subdirectory(projects)
228
229 option(LLVM_BUILD_TOOLS
230   "Build the LLVM tools. If OFF, just generate build targets." ON)
231 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
232 if( LLVM_INCLUDE_TOOLS )
233   add_subdirectory(tools)
234 endif()
235
236 option(LLVM_BUILD_EXAMPLES
237   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
238 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
239 if( LLVM_INCLUDE_EXAMPLES )
240   add_subdirectory(examples)
241 endif()
242
243 option(LLVM_BUILD_TESTS
244   "Build LLVM unit tests. If OFF, just generate build targes." OFF)
245 if( LLVM_INCLUDE_TESTS )
246   add_subdirectory(test)
247   add_subdirectory(utils/unittest)
248   add_subdirectory(unittests)
249   if (MSVC)
250     # This utility is used to prevent chrashing tests from calling Dr. Watson on
251     # Windows.
252     add_subdirectory(utils/KillTheDoctor)
253   endif()
254 endif()
255
256 add_subdirectory(cmake/modules)
257
258 install(DIRECTORY include/
259   DESTINATION include
260   FILES_MATCHING
261   PATTERN "*.def"
262   PATTERN "*.h"
263   PATTERN "*.td"
264   PATTERN "*.inc"
265   PATTERN "LICENSE.TXT"
266   PATTERN ".svn" EXCLUDE
267   )
268
269 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
270   DESTINATION include
271   FILES_MATCHING
272   PATTERN "*.def"
273   PATTERN "*.h"
274   PATTERN "*.gen"
275   PATTERN "*.inc"
276   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
277   PATTERN "CMakeFiles" EXCLUDE
278   PATTERN ".svn" EXCLUDE
279   )
280
281 # TODO: make and install documentation.
282
283 set(CPACK_PACKAGE_VENDOR "LLVM")
284 set(CPACK_PACKAGE_VERSION_MAJOR 2)
285 set(CPACK_PACKAGE_VERSION_MINOR 9)
286 add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH)
287 include(CPack)
288
289 # Workaround for MSVS10 to avoid the Dialog Hell
290 # FIXME: This could be removed with future version of CMake.
291 if(MSVC_VERSION EQUAL 1600)
292   set(LLVM_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/LLVM.sln")
293   if( EXISTS "${LLVM_SLN_FILENAME}" )
294     file(APPEND "${LLVM_SLN_FILENAME}" "\n# This should be regenerated!\n")
295   endif()
296 endif()