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