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