Handle InstPrinter's on the CMake build.
[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 include(VersionFromVCS)
15 add_version_info_from_vcs(PACKAGE_VERSION)
16
17 set(PACKAGE_NAME llvm)
18 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
19 set(PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu")
20
21 if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
22   message(FATAL_ERROR "In-source builds are not allowed.
23 CMake would overwrite the makefiles distributed with LLVM.
24 Please create a directory and run cmake from there, passing the path
25 to this source directory as the last argument.
26 This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
27 Please delete them.")
28 endif()
29
30 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
31
32 set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
33 set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include)
34 set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
35 set(LLVM_TOOLS_BINARY_DIR ${LLVM_BINARY_DIR}/bin)
36 set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
37 set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
38
39 if( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
40   file(GLOB_RECURSE
41     tablegenned_files_on_include_dir
42     "${LLVM_MAIN_SRC_DIR}/include/llvm/*.gen")
43   file(GLOB_RECURSE
44     tablegenned_files_on_lib_dir
45     "${LLVM_MAIN_SRC_DIR}/lib/Target/*.inc")
46   if( tablegenned_files_on_include_dir OR tablegenned_files_on_lib_dir)
47     message(FATAL_ERROR "Apparently there is a previous in-source build,
48 probably as the result of running `configure' and `make' on
49 ${LLVM_MAIN_SRC_DIR}.
50 This may cause problems. The suspicious files are:
51 ${tablegenned_files_on_lib_dir}
52 ${tablegenned_files_on_include_dir}
53 Please clean the source directory.")
54   endif()
55 endif()
56
57 set(LLVM_ALL_TARGETS
58   Alpha
59   ARM
60   Blackfin
61   CBackend
62   CellSPU
63   CppBackend
64   Mips
65   MBlaze
66   MSP430
67   PIC16
68   PowerPC
69   PTX
70   Sparc
71   SystemZ
72   X86
73   XCore
74   )
75
76 if( MSVC )
77   set(LLVM_TARGETS_TO_BUILD X86
78     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
79 else( MSVC )
80   set(LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS}
81     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
82 endif( MSVC )
83
84 set(C_INCLUDE_DIRS "" CACHE STRING
85   "Colon separated list of directories clang will search for headers.")
86
87 set(LLVM_TARGET_ARCH "host"
88   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
89
90 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
91
92 if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
93   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
94 else()
95   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
96 endif()
97
98 if( LLVM_ENABLE_ASSERTIONS )
99   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
100   if( NOT MSVC )
101     add_definitions( -D_DEBUG )
102   endif()
103   # On Release builds cmake automatically defines NDEBUG, so we
104   # explicitly undefine it:
105   if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
106     add_definitions( -UNDEBUG )
107   endif()
108 else()
109   if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
110     add_definitions( -DNDEBUG )
111   endif()
112 endif()
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 if(WIN32)
140   if(CYGWIN)
141     set(LLVM_ON_WIN32 0)
142     set(LLVM_ON_UNIX 1)
143   else(CYGWIN)
144     set(LLVM_ON_WIN32 1)
145     set(LLVM_ON_UNIX 0)
146   endif(CYGWIN)
147   set(LTDL_SHLIB_EXT ".dll")
148   set(EXEEXT ".exe")
149   # Maximum path length is 160 for non-unicode paths
150   set(MAXPATHLEN 160)
151 else(WIN32)
152   if(UNIX)
153     set(LLVM_ON_WIN32 0)
154     set(LLVM_ON_UNIX 1)
155     if(APPLE)
156       set(LTDL_SHLIB_EXT ".dylib")
157     else(APPLE)
158       set(LTDL_SHLIB_EXT ".so")
159     endif(APPLE)
160     set(EXEEXT "")
161     # FIXME: Maximum path length is currently set to 'safe' fixed value
162     set(MAXPATHLEN 2024)
163   else(UNIX)
164     MESSAGE(SEND_ERROR "Unable to determine platform")
165   endif(UNIX)
166 endif(WIN32)
167
168 include(config-ix)
169
170 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
171
172 set(ENABLE_PIC 0)
173 if( LLVM_ENABLE_PIC )
174  if( XCODE )
175    # Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
176    # know how to disable this, so just force ENABLE_PIC off for now.
177    message(STATUS "Warning: -fPIC not supported with Xcode.")
178  else( XCODE )
179    if( SUPPORTS_FPIC_FLAG )
180       message(STATUS "Building with -fPIC")
181       add_llvm_definitions(-fPIC)
182       set(ENABLE_PIC 1)
183    else( SUPPORTS_FPIC_FLAG )
184       message(STATUS "Warning: -fPIC not supported.")
185    endif()
186  endif()
187 endif()
188
189 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
190 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
191 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
192
193 # set(CMAKE_VERBOSE_MAKEFILE true)
194
195 add_llvm_definitions( -D__STDC_LIMIT_MACROS )
196 add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
197
198 # MSVC has a gazillion warnings with this.
199 if( MSVC )
200   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
201 else( MSVC )
202   option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
203 endif()
204
205 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
206 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
207
208 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
209   # TODO: support other platforms and toolchains.
210   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
211   if( LLVM_BUILD_32_BITS )
212     message(STATUS "Building 32 bits executables and libraries.")
213     add_llvm_definitions( -m32 )
214     list(APPEND CMAKE_EXE_LINKER_FLAGS -m32)
215     list(APPEND CMAKE_SHARED_LINKER_FLAGS -m32)
216   endif( LLVM_BUILD_32_BITS )
217 endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
218
219 if( MSVC )
220   include(ChooseMSVCCRT)
221
222   add_llvm_definitions( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS )
223   add_llvm_definitions( -D_SCL_SECURE_NO_WARNINGS -DCRT_NONSTDC_NO_WARNINGS )
224   add_llvm_definitions( -D_SCL_SECURE_NO_DEPRECATE )
225   add_llvm_definitions( -wd4146 -wd4503 -wd4996 -wd4800 -wd4244 -wd4624 )
226   add_llvm_definitions( -wd4355 -wd4715 -wd4180 -wd4345 -wd4224 )
227
228   # Suppress 'new behavior: elements of array 'array' will be default initialized'
229   add_llvm_definitions( -wd4351 )
230
231   # Enable warnings
232   if (LLVM_ENABLE_WARNINGS)
233     add_llvm_definitions( /W4 /Wall )
234     if (LLVM_ENABLE_PEDANTIC)
235       # No MSVC equivalent available
236     endif (LLVM_ENABLE_PEDANTIC)
237   endif (LLVM_ENABLE_WARNINGS)
238   if (LLVM_ENABLE_WERROR)
239     add_llvm_definitions( /WX )
240   endif (LLVM_ENABLE_WERROR)
241 elseif( CMAKE_COMPILER_IS_GNUCXX )
242   if (LLVM_ENABLE_WARNINGS)
243     add_llvm_definitions( -Wall -W -Wno-unused-parameter -Wwrite-strings )
244     if (LLVM_ENABLE_PEDANTIC)
245       add_llvm_definitions( -pedantic -Wno-long-long )
246     endif (LLVM_ENABLE_PEDANTIC)
247   endif (LLVM_ENABLE_WARNINGS)
248   if (LLVM_ENABLE_WERROR)
249     add_llvm_definitions( -Werror )
250   endif (LLVM_ENABLE_WERROR)
251 endif( MSVC )
252
253 include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
254
255 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
256    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/System/Solaris.h")
257 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
258
259 include(AddLLVM)
260 include(TableGen)
261
262 if( MINGW )
263   get_system_libs(LLVM_SYSTEM_LIBS_LIST)
264   foreach(l ${LLVM_SYSTEM_LIBS_LIST})
265     set(LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS} -l${l}")
266   endforeach()
267   set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
268   set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES}${LLVM_SYSTEM_LIBS}")
269 endif()
270
271 add_subdirectory(lib/Support)
272 add_subdirectory(lib/System)
273
274 # Everything else depends on Support and System:
275 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} )
276
277 set(LLVM_TABLEGEN "tblgen" CACHE
278   STRING "Native TableGen executable. Saves building one when cross-compiling.")
279 # Effective tblgen executable to be used:
280 set(LLVM_TABLEGEN_EXE ${LLVM_TABLEGEN})
281
282 add_subdirectory(utils/TableGen)
283
284 if( CMAKE_CROSSCOMPILING )
285   # This adds a dependency on target `tblgen', so must go after utils/TableGen
286   include( CrossCompileLLVM )
287 endif( CMAKE_CROSSCOMPILING )
288
289 add_subdirectory(include/llvm)
290
291 add_subdirectory(lib/VMCore)
292 add_subdirectory(lib/CodeGen)
293 add_subdirectory(lib/CodeGen/SelectionDAG)
294 add_subdirectory(lib/CodeGen/AsmPrinter)
295 add_subdirectory(lib/Bitcode/Reader)
296 add_subdirectory(lib/Bitcode/Writer)
297 add_subdirectory(lib/Transforms/Utils)
298 add_subdirectory(lib/Transforms/Instrumentation)
299 add_subdirectory(lib/Transforms/InstCombine)
300 add_subdirectory(lib/Transforms/Scalar)
301 add_subdirectory(lib/Transforms/IPO)
302 add_subdirectory(lib/Transforms/Hello)
303 add_subdirectory(lib/Linker)
304 add_subdirectory(lib/Analysis)
305 add_subdirectory(lib/Analysis/IPA)
306 add_subdirectory(lib/MC)
307 add_subdirectory(lib/MC/MCParser)
308 add_subdirectory(lib/MC/MCDisassembler)
309
310 add_subdirectory(utils/FileCheck)
311 add_subdirectory(utils/count)
312 add_subdirectory(utils/not)
313 add_subdirectory(utils/llvm-lit)
314
315 set(LLVM_ENUM_ASM_PRINTERS "")
316 set(LLVM_ENUM_ASM_PARSERS "")
317 set(LLVM_ENUM_DISASSEMBLERS "")
318 foreach(t ${LLVM_TARGETS_TO_BUILD})
319   message(STATUS "Targeting ${t}")
320   add_subdirectory(lib/Target/${t})
321   add_subdirectory(lib/Target/${t}/TargetInfo)
322   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
323     add_subdirectory(lib/Target/${t}/AsmPrinter)
324     set(LLVM_ENUM_ASM_PRINTERS 
325       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
326   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
327   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/InstPrinter/CMakeLists.txt )
328     add_subdirectory(lib/Target/${t}/InstPrinter)
329     set(LLVM_ENUM_ASM_PRINTERS
330       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
331   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/InstPrinter/CMakeLists.txt )
332   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
333     add_subdirectory(lib/Target/${t}/AsmParser)
334     set(LLVM_ENUM_ASM_PARSERS 
335       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
336   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
337   if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/Disassembler/CMakeLists.txt )
338     add_subdirectory(lib/Target/${t}/Disassembler)
339     set(LLVM_ENUM_DISASSEMBLERS
340       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
341   endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/Disassembler/CMakeLists.txt )
342   set(CURRENT_LLVM_TARGET)
343 endforeach(t)
344
345 # PIC16 contains an odd library:
346 if( LLVM_TARGETS_TO_BUILD MATCHES ".*PIC16.*" )
347   add_subdirectory(lib/Target/PIC16/PIC16Passes)
348 endif()
349
350 # Produce llvm/Config/AsmPrinters.def
351 configure_file(
352   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
353   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
354   )
355
356 # Produce llvm/Config/AsmParsers.def
357 configure_file(
358   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
359   ${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
360   )
361
362 # Produce llvm/Config/Disassemblers.def
363 configure_file(
364   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
365   ${LLVM_BINARY_DIR}/include/llvm/Config/Disassemblers.def
366   )
367
368 add_subdirectory(lib/ExecutionEngine)
369 add_subdirectory(lib/ExecutionEngine/Interpreter)
370 add_subdirectory(lib/ExecutionEngine/JIT)
371 add_subdirectory(lib/Target)
372 add_subdirectory(lib/AsmParser)
373 add_subdirectory(lib/Archive)
374
375 add_subdirectory(projects)
376
377 option(LLVM_BUILD_TOOLS
378   "Build the LLVM tools. If OFF, just generate build targets." ON)
379 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
380 if( LLVM_INCLUDE_TOOLS )
381   add_subdirectory(tools)
382 endif()
383
384 option(LLVM_BUILD_EXAMPLES
385   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
386 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
387 if( LLVM_INCLUDE_EXAMPLES )
388   add_subdirectory(examples)
389 endif()
390
391 option(LLVM_BUILD_TESTS
392   "Build LLVM unit tests. If OFF, just generate build targes." OFF)
393 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
394 if( LLVM_INCLUDE_TESTS )
395   add_subdirectory(test)
396   add_subdirectory(utils/unittest)
397   add_subdirectory(unittests)
398 endif()
399
400 add_subdirectory(cmake/modules)
401
402 install(DIRECTORY include/
403   DESTINATION include
404   FILES_MATCHING
405   PATTERN "*.def"
406   PATTERN "*.h"
407   PATTERN "*.td"
408   PATTERN "*.inc"
409   PATTERN ".svn" EXCLUDE
410   )
411
412 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
413   DESTINATION include
414   FILES_MATCHING
415   PATTERN "*.def"
416   PATTERN "*.h"
417   PATTERN "*.gen"
418   PATTERN "*.inc"
419   # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
420   PATTERN "CMakeFiles" EXCLUDE
421   PATTERN ".svn" EXCLUDE
422   )
423
424 # TODO: make and install documentation.