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