2 # CMakeD - CMake module for D Language
\r
4 # Copyright (c) 2007, Selman Ulug <selman.ulug@gmail.com>
\r
5 # Tim Burrell <tim.burrell@gmail.com>
\r
7 # All rights reserved.
\r
9 # See Copyright.txt for details.
\r
11 # Modified from CMake 2.6.5 CMakeCInformation.cmake
\r
12 # See http://www.cmake.org/HTML/Copyright.html for details
\r
15 # This file sets the basic flags for the D language in CMake.
\r
16 # It also loads the available platform file for the system-compiler
\r
19 GET_FILENAME_COMPONENT(CMAKE_BASE_NAME ${CMAKE_D_COMPILER} NAME_WE)
\r
20 IF(CMAKE_COMPILER_IS_GDC)
\r
21 SET(CMAKE_BASE_NAME gdc)
\r
22 ELSE(CMAKE_COMPILER_IS_GDC)
\r
23 SET(CMAKE_BASE_NAME dmd)
\r
24 ENDIF(CMAKE_COMPILER_IS_GDC)
\r
25 SET(CMAKE_SYSTEM_AND_D_COMPILER_INFO_FILE
\r
26 ${CMAKE_ROOT}/Modules/Platform/${CMAKE_SYSTEM_NAME}-${CMAKE_BASE_NAME}.cmake)
\r
27 INCLUDE(Platform/${CMAKE_SYSTEM_NAME}-${CMAKE_BASE_NAME} OPTIONAL)
\r
29 # This should be included before the _INIT variables are
\r
30 # used to initialize the cache. Since the rule variables
\r
31 # have if blocks on them, users can still define them here.
\r
32 # But, it should still be after the platform file so changes can
\r
33 # be made to those values.
\r
35 IF(CMAKE_USER_MAKE_RULES_OVERRIDE)
\r
36 INCLUDE(${CMAKE_USER_MAKE_RULES_OVERRIDE})
\r
37 ENDIF(CMAKE_USER_MAKE_RULES_OVERRIDE)
\r
39 IF(CMAKE_USER_MAKE_RULES_OVERRIDE_D)
\r
40 INCLUDE(${CMAKE_USER_MAKE_RULES_OVERRIDE_D})
\r
41 ENDIF(CMAKE_USER_MAKE_RULES_OVERRIDE_D)
\r
43 # for most systems a module is the same as a shared library
\r
44 # so unless the variable CMAKE_MODULE_EXISTS is set just
\r
45 # copy the values from the LIBRARY variables
\r
46 IF(NOT CMAKE_MODULE_EXISTS)
\r
47 SET(CMAKE_SHARED_MODULE_D_FLAGS ${CMAKE_SHARED_LIBRARY_D_FLAGS})
\r
48 SET(CMAKE_SHARED_MODULE_CREATE_D_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS})
\r
49 ENDIF(NOT CMAKE_MODULE_EXISTS)
\r
51 SET (CMAKE_D_FLAGS "$ENV{CFLAGS} ${CMAKE_D_FLAGS_INIT}" CACHE STRING
\r
52 "Flags for D compiler.")
\r
54 IF(NOT CMAKE_NOT_USING_CONFIG_FLAGS)
\r
55 # default build type is none
\r
56 IF(NOT CMAKE_NO_BUILD_TYPE)
\r
57 SET (CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE_INIT} CACHE STRING
\r
58 "Choose the type of build, options are: None(CMAKE_D_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
\r
59 ENDIF(NOT CMAKE_NO_BUILD_TYPE)
\r
60 SET (CMAKE_D_FLAGS_DEBUG "${CMAKE_D_FLAGS_DEBUG_INIT}" CACHE STRING
\r
61 "Flags used by the compiler during debug builds.")
\r
62 SET (CMAKE_D_FLAGS_MINSIZEREL "${CMAKE_D_FLAGS_MINSIZEREL_INIT}" CACHE STRING
\r
63 "Flags used by the compiler during release minsize builds.")
\r
64 SET (CMAKE_D_FLAGS_RELEASE "${CMAKE_D_FLAGS_RELEASE_INIT}" CACHE STRING
\r
65 "Flags used by the compiler during release builds (/MD /Ob1 /Oi /Ot /Oy /Gs will produce slightly less optimized but smaller files).")
\r
66 SET (CMAKE_D_FLAGS_RELWITHDEBINFO "${CMAKE_D_FLAGS_RELWITHDEBINFO_INIT}" CACHE STRING
\r
67 "Flags used by the compiler during Release with Debug Info builds.")
\r
68 ENDIF(NOT CMAKE_NOT_USING_CONFIG_FLAGS)
\r
70 IF(CMAKE_D_STANDARD_LIBRARIES_INIT)
\r
71 SET(CMAKE_D_STANDARD_LIBRARIES "${CMAKE_D_STANDARD_LIBRARIES_INIT}"
\r
72 CACHE STRING "Libraries linked by defalut with all D applications.")
\r
73 MARK_AS_ADVANCED(CMAKE_D_STANDARD_LIBRARIES)
\r
74 ENDIF(CMAKE_D_STANDARD_LIBRARIES_INIT)
\r
76 INCLUDE(CMakeCommonLanguageInclude)
\r
78 # now define the following rule variables
\r
80 # CMAKE_D_CREATE_SHARED_LIBRARY
\r
81 # CMAKE_D_CREATE_SHARED_MODULE
\r
82 # CMAKE_D_CREATE_STATIC_LIBRARY
\r
83 # CMAKE_D_COMPILE_OBJECT
\r
84 # CMAKE_D_LINK_EXECUTABLE
\r
86 # variables supplied by the generator at use time
\r
88 # <TARGET_BASE> the target without the suffix
\r
95 # D compiler information
\r
96 # <CMAKE_D_COMPILER>
\r
97 # <CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS>
\r
98 # <CMAKE_SHARED_MODULE_CREATE_D_FLAGS>
\r
99 # <CMAKE_D_LINK_FLAGS>
\r
101 # Static library tools
\r
105 IF("$ENV{D_PATH}" STREQUAL "")
\r
106 STRING(LENGTH ${CMAKE_D_COMPILER} CMAKE_D_COMPILER_LENGTH)
\r
107 IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
108 MATH(EXPR CMAKE_D_COMPILER_LENGTH "${CMAKE_D_COMPILER_LENGTH} - 12")
\r
109 ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
110 MATH(EXPR CMAKE_D_COMPILER_LENGTH "${CMAKE_D_COMPILER_LENGTH} - 8")
\r
111 ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
112 STRING(SUBSTRING ${CMAKE_D_COMPILER} 0 ${CMAKE_D_COMPILER_LENGTH} D_PATH)
\r
113 ELSE("$ENV{D_PATH}" STREQUAL "")
\r
114 SET(D_PATH "$ENV{D_PATH}")
\r
115 ENDIF("$ENV{D_PATH}" STREQUAL "")
\r
116 MESSAGE(STATUS "D Compiler Install Prefix (use D_PATH env var to override): ${D_PATH}")
\r
118 IF(CMAKE_COMPILER_IS_GDC)
\r
119 SET(CMAKE_OUTPUT_D_FLAG "-o ")
\r
120 SET(CMAKE_SHARED_LIBRARY_D_FLAGS "-fPIC")
\r
121 SET(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared")
\r
122 SET(CMAKE_INCLUDE_FLAG_D "-I") # -I
\r
123 SET(CMAKE_INCLUDE_FLAG_D_SEP "") # , or empty
\r
124 SET(CMAKE_LIBRARY_PATH_FLAG "-L")
\r
125 SET(CMAKE_LINK_LIBRARY_FLAG "-l")
\r
126 SET(CMAKE_D_VERSION_FLAG "-fversion=")
\r
127 ELSE(CMAKE_COMPILER_IS_GDC)
\r
128 SET(CMAKE_OUTPUT_D_FLAG "-of")
\r
129 SET(CMAKE_D_VERSION_FLAG "-version=")
\r
130 IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
131 SET(CMAKE_INCLUDE_FLAG_D "-I") # -I
\r
132 SET(CMAKE_INCLUDE_FLAG_D_SEP "") # , or empty
\r
133 SET(CMAKE_LINK_LIBRARY_FLAG "-L+")
\r
134 SET(CMAKE_LIBRARY_PATH_FLAG "-L+")
\r
135 SET(CMAKE_LIBRARY_PATH_TERMINATOR "\\")
\r
136 FIND_PROGRAM(DMD_LIBRARIAN "lib.exe")
\r
137 ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
138 SET(CMAKE_SHARED_LIBRARY_D_FLAGS "-fPIC")
\r
139 SET(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared")
\r
140 SET(CMAKE_INCLUDE_FLAG_D "-I") # -I
\r
141 SET(CMAKE_INCLUDE_FLAG_D_SEP "") # , or empty
\r
142 SET(CMAKE_LIBRARY_PATH_FLAG "-L")
\r
143 ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
144 ENDIF(CMAKE_COMPILER_IS_GDC)
\r
146 IF(CMAKE_D_USE_TANGO)
\r
147 IF(CMAKE_COMPILER_IS_GDC)
\r
148 SET(DSTDLIB_TYPE "-fversion=Tango")
\r
149 SET(DSTDLIB_FLAGS "-lgtango")
\r
150 ELSE(CMAKE_COMPILER_IS_GDC)
\r
151 SET(DSTDLIB_TYPE "-version=Tango")
\r
152 SET(DSTDLIB_FLAGS "-L${D_PATH}/lib -ltango -lphobos")
\r
153 ENDIF(CMAKE_COMPILER_IS_GDC)
\r
154 ENDIF(CMAKE_D_USE_TANGO)
\r
155 IF(CMAKE_D_USE_PHOBOS)
\r
156 IF(CMAKE_COMPILER_IS_GDC)
\r
157 SET(DSTDLIB_TYPE "-fversion=Phobos")
\r
158 SET(DSTDLIB_FLAGS "-lgphobos")
\r
159 ELSE(CMAKE_COMPILER_IS_GDC)
\r
160 SET(DSTDLIB_TYPE "-version=Phobos")
\r
161 SET(DSTDLIB_FLAGS "-L${D_PATH}/lib -lphobos")
\r
162 ENDIF(CMAKE_COMPILER_IS_GDC)
\r
163 ENDIF(CMAKE_D_USE_PHOBOS)
\r
165 # create a D shared library
\r
166 IF(NOT CMAKE_D_CREATE_SHARED_LIBRARY)
\r
167 IF(CMAKE_COMPILER_IS_GDC)
\r
168 SET(CMAKE_D_CREATE_SHARED_LIBRARY
\r
169 "<CMAKE_D_COMPILER> <CMAKE_SHARED_LIBRARY_D_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_D_FLAG><TARGET_SONAME> ${CMAKE_OUTPUT_D_FLAG}<TARGET> <OBJECTS> <LINK_LIBRARIES>")
\r
170 ELSE(CMAKE_COMPILER_IS_GDC)
\r
171 SET(CMAKE_D_CREATE_SHARED_LIBRARY
\r
172 "<CMAKE_D_COMPILER> <CMAKE_SHARED_LIBRARY_D_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_D_FLAG><TARGET_SONAME> ${CMAKE_OUTPUT_D_FLAG}<TARGET> <OBJECTS> <LINK_LIBRARIES> ${DSTDLIB_FLAGS}")
\r
173 ENDIF(CMAKE_COMPILER_IS_GDC)
\r
174 ENDIF(NOT CMAKE_D_CREATE_SHARED_LIBRARY)
\r
176 # create a D shared module just copy the shared library rule
\r
177 IF(NOT CMAKE_D_CREATE_SHARED_MODULE)
\r
178 SET(CMAKE_D_CREATE_SHARED_MODULE ${CMAKE_D_CREATE_SHARED_LIBRARY})
\r
179 ENDIF(NOT CMAKE_D_CREATE_SHARED_MODULE)
\r
181 # create a D static library
\r
182 IF(NOT CMAKE_D_CREATE_STATIC_LIBRARY)
\r
183 IF(CMAKE_COMPILER_IS_GDC)
\r
184 IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
185 SET(CMAKE_D_CREATE_STATIC_LIBRARY
\r
186 "<CMAKE_AR> cr <TARGET>.lib <LINK_FLAGS> <OBJECTS> "
\r
187 "<CMAKE_RANLIB> <TARGET>.lib "
\r
188 "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS> "
\r
189 "<CMAKE_RANLIB> <TARGET> "
\r
191 ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
192 SET(CMAKE_D_CREATE_STATIC_LIBRARY
\r
193 "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS> "
\r
194 "<CMAKE_RANLIB> <TARGET> "
\r
196 ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
197 ELSE(CMAKE_COMPILER_IS_GDC)
\r
198 IF(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
\r
199 SET(CMAKE_D_CREATE_STATIC_LIBRARY
\r
200 "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>"
\r
201 "<CMAKE_RANLIB> <TARGET>")
\r
202 ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
\r
203 SET(CMAKE_D_CREATE_STATIC_LIBRARY
\r
204 "${DMD_LIBRARIAN} -c -p256 <TARGET> <OBJECTS>")
\r
205 ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
\r
206 ENDIF(CMAKE_COMPILER_IS_GDC)
\r
207 ENDIF(NOT CMAKE_D_CREATE_STATIC_LIBRARY)
\r
209 # compile a D file into an object file
\r
210 IF(NOT CMAKE_D_COMPILE_OBJECT)
\r
211 SET(CMAKE_D_COMPILE_OBJECT
\r
212 "<CMAKE_D_COMPILER> <FLAGS> ${CMAKE_OUTPUT_D_FLAG}<OBJECT> -c <SOURCE>")
\r
213 ENDIF(NOT CMAKE_D_COMPILE_OBJECT)
\r
215 IF(NOT CMAKE_D_LINK_EXECUTABLE)
\r
216 IF(CMAKE_COMPILER_IS_GDC)
\r
217 SET(CMAKE_D_LINK_EXECUTABLE
\r
218 "<CMAKE_D_COMPILER> <FLAGS> <CMAKE_D_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> ${CMAKE_OUTPUT_D_FLAG}<TARGET> <LINK_LIBRARIES> ${DSTDLIB_FLAGS} ${DSTDLIB_TYPE}")
\r
219 ELSE(CMAKE_COMPILER_IS_GDC)
\r
220 IF(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
\r
221 SET(CMAKE_D_LINK_EXECUTABLE
\r
222 "gcc ${DLINK_FLAGS} <CMAKE_D_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -lpthread -lm ${DSTDLIB_FLAGS}")
\r
223 ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
\r
224 SET(CMAKE_D_LINK_EXECUTABLE
\r
225 "<CMAKE_D_COMPILER> <FLAGS> <CMAKE_D_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> ${CMAKE_OUTPUT_D_FLAG}<TARGET> <LINK_LIBRARIES>")
\r
226 ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
\r
227 ENDIF(CMAKE_COMPILER_IS_GDC)
\r
228 ENDIF(NOT CMAKE_D_LINK_EXECUTABLE)
\r
232 CMAKE_D_FLAGS_DEBUG
\r
233 CMAKE_D_FLAGS_MINSIZEREL
\r
234 CMAKE_D_FLAGS_RELEASE
\r
235 CMAKE_D_FLAGS_RELWITHDEBINFO
\r
237 SET(CMAKE_D_INFORMATION_LOADED 1)
\r