2
# CMakeD - CMake module for D Language
4
# Copyright (c) 2007, Selman Ulug <selman.ulug@gmail.com>
5
# Tim Burrell <tim.burrell@gmail.com>
9
# See Copyright.txt for details.
11
# Modified from CMake 2.6.5 CMakeCInformation.cmake
12
# See http://www.cmake.org/HTML/Copyright.html for details
15
# This file sets the basic flags for the D language in CMake.
16
# It also loads the available platform file for the system-compiler
19
GET_FILENAME_COMPONENT(CMAKE_BASE_NAME ${CMAKE_D_COMPILER} NAME_WE)
20
IF(CMAKE_COMPILER_IS_GDC)
21
SET(CMAKE_BASE_NAME gdc)
22
ELSE(CMAKE_COMPILER_IS_GDC)
23
SET(CMAKE_BASE_NAME dmd)
24
ENDIF(CMAKE_COMPILER_IS_GDC)
25
SET(CMAKE_SYSTEM_AND_D_COMPILER_INFO_FILE
26
${CMAKE_ROOT}/Modules/Platform/${CMAKE_SYSTEM_NAME}-${CMAKE_BASE_NAME}.cmake)
27
INCLUDE(Platform/${CMAKE_SYSTEM_NAME}-${CMAKE_BASE_NAME} OPTIONAL)
29
# This should be included before the _INIT variables are
30
# used to initialize the cache. Since the rule variables
31
# have if blocks on them, users can still define them here.
32
# But, it should still be after the platform file so changes can
33
# be made to those values.
35
IF(CMAKE_USER_MAKE_RULES_OVERRIDE)
36
INCLUDE(${CMAKE_USER_MAKE_RULES_OVERRIDE})
37
ENDIF(CMAKE_USER_MAKE_RULES_OVERRIDE)
39
IF(CMAKE_USER_MAKE_RULES_OVERRIDE_D)
40
INCLUDE(${CMAKE_USER_MAKE_RULES_OVERRIDE_D})
41
ENDIF(CMAKE_USER_MAKE_RULES_OVERRIDE_D)
43
# Create a set of shared library variable specific to D
44
# For 90% of the systems, these are the same flags as the C versions
45
# so if these are not set just copy the flags from the c version
46
IF(NOT CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS)
47
SET(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS})
48
ENDIF(NOT CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS)
50
IF(NOT CMAKE_SHARED_LIBRARY_D_FLAGS)
51
SET(CMAKE_SHARED_LIBRARY_D_FLAGS ${CMAKE_SHARED_LIBRARY_C_FLAGS})
52
ENDIF(NOT CMAKE_SHARED_LIBRARY_D_FLAGS)
54
IF(NOT DEFINED CMAKE_SHARED_LIBRARY_LINK_D_FLAGS)
55
SET(CMAKE_SHARED_LIBRARY_LINK_D_FLAGS ${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS})
56
ENDIF(NOT DEFINED CMAKE_SHARED_LIBRARY_LINK_D_FLAGS)
58
IF(NOT CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG)
59
SET(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG ${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG})
60
ENDIF(NOT CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG)
62
IF(NOT CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP)
63
SET(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP ${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG_SEP})
64
ENDIF(NOT CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP)
66
IF(NOT CMAKE_SHARED_LIBRARY_RPATH_LINK_D_FLAG)
67
SET(CMAKE_SHARED_LIBRARY_RPATH_LINK_D_FLAG ${CMAKE_SHARED_LIBRARY_RPATH_LINK_C_FLAG})
68
ENDIF(NOT CMAKE_SHARED_LIBRARY_RPATH_LINK_D_FLAG)
71
IF(NOT CMAKE_SHARED_MODULE_CREATE_D_FLAGS)
72
SET(CMAKE_SHARED_MODULE_CREATE_D_FLAGS ${CMAKE_SHARED_MODULE_CREATE_C_FLAGS})
73
ENDIF(NOT CMAKE_SHARED_MODULE_CREATE_D_FLAGS)
75
IF(NOT CMAKE_SHARED_MODULE_D_FLAGS)
76
SET(CMAKE_SHARED_MODULE_D_FLAGS ${CMAKE_SHARED_MODULE_C_FLAGS})
77
ENDIF(NOT CMAKE_SHARED_MODULE_D_FLAGS)
79
IF(NOT CMAKE_SHARED_MODULE_RUNTIME_D_FLAG)
80
SET(CMAKE_SHARED_MODULE_RUNTIME_D_FLAG ${CMAKE_SHARED_MODULE_RUNTIME_C_FLAG})
81
ENDIF(NOT CMAKE_SHARED_MODULE_RUNTIME_D_FLAG)
83
IF(NOT CMAKE_SHARED_MODULE_RUNTIME_D_FLAG_SEP)
84
SET(CMAKE_SHARED_MODULE_RUNTIME_D_FLAG_SEP ${CMAKE_SHARED_MODULE_RUNTIME_C_FLAG_SEP})
85
ENDIF(NOT CMAKE_SHARED_MODULE_RUNTIME_D_FLAG_SEP)
87
IF(NOT CMAKE_EXECUTABLE_RUNTIME_D_FLAG)
88
SET(CMAKE_EXECUTABLE_RUNTIME_D_FLAG ${CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG})
89
ENDIF(NOT CMAKE_EXECUTABLE_RUNTIME_D_FLAG)
91
IF(NOT CMAKE_EXECUTABLE_RUNTIME_D_FLAG_SEP)
92
SET(CMAKE_EXECUTABLE_RUNTIME_D_FLAG_SEP ${CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP})
93
ENDIF(NOT CMAKE_EXECUTABLE_RUNTIME_D_FLAG_SEP)
95
IF(NOT CMAKE_EXECUTABLE_RPATH_LINK_D_FLAG)
96
SET(CMAKE_EXECUTABLE_RPATH_LINK_D_FLAG ${CMAKE_SHARED_LIBRARY_RPATH_LINK_D_FLAG})
97
ENDIF(NOT CMAKE_EXECUTABLE_RPATH_LINK_D_FLAG)
99
IF(NOT DEFINED CMAKE_SHARED_LIBRARY_LINK_D_WITH_RUNTIME_PATH)
100
SET(CMAKE_SHARED_LIBRARY_LINK_D_WITH_RUNTIME_PATH ${CMAKE_SHARED_LIBRARY_LINK_C_WITH_RUNTIME_PATH})
101
ENDIF(NOT DEFINED CMAKE_SHARED_LIBRARY_LINK_D_WITH_RUNTIME_PATH)
103
IF(NOT CMAKE_INCLUDE_FLAG_D)
104
SET(CMAKE_INCLUDE_FLAG_D ${CMAKE_INCLUDE_FLAG_C})
105
ENDIF(NOT CMAKE_INCLUDE_FLAG_D)
107
IF(NOT CMAKE_INCLUDE_FLAG_SEP_D)
108
SET(CMAKE_INCLUDE_FLAG_SEP_D ${CMAKE_INCLUDE_FLAG_SEP_C})
109
ENDIF(NOT CMAKE_INCLUDE_FLAG_SEP_D)
111
SET (CMAKE_D_FLAGS "$ENV{DFLAGS} ${CMAKE_D_FLAGS_INIT}" CACHE STRING
112
"Flags for D compiler.")
114
IF(NOT CMAKE_NOT_USING_CONFIG_FLAGS)
115
# default build type is none
116
IF(NOT CMAKE_NO_BUILD_TYPE)
117
SET (CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE_INIT} CACHE STRING
118
"Choose the type of build, options are: None(CMAKE_D_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
119
ENDIF(NOT CMAKE_NO_BUILD_TYPE)
120
SET (CMAKE_D_FLAGS_DEBUG "${CMAKE_D_FLAGS_DEBUG_INIT}" CACHE STRING
121
"Flags used by the compiler during debug builds.")
122
SET (CMAKE_D_FLAGS_MINSIZEREL "${CMAKE_D_FLAGS_MINSIZEREL_INIT}" CACHE STRING
123
"Flags used by the compiler during release minsize builds.")
124
SET (CMAKE_D_FLAGS_RELEASE "${CMAKE_D_FLAGS_RELEASE_INIT}" CACHE STRING
125
"Flags used by the compiler during release builds (/MD /Ob1 /Oi /Ot /Oy /Gs will produce slightly less optimized but smaller files).")
126
SET (CMAKE_D_FLAGS_RELWITHDEBINFO "${CMAKE_D_FLAGS_RELWITHDEBINFO_INIT}" CACHE STRING
127
"Flags used by the compiler during Release with Debug Info builds.")
128
ENDIF(NOT CMAKE_NOT_USING_CONFIG_FLAGS)
130
IF(CMAKE_D_STANDARD_LIBRARIES_INIT)
131
SET(CMAKE_D_STANDARD_LIBRARIES "${CMAKE_D_STANDARD_LIBRARIES_INIT}"
132
CACHE STRING "Libraries linked by default with all D applications.")
133
MARK_AS_ADVANCED(CMAKE_D_STANDARD_LIBRARIES)
134
ENDIF(CMAKE_D_STANDARD_LIBRARIES_INIT)
136
INCLUDE(CMakeCommonLanguageInclude)
138
# now define the following rule variables
140
# CMAKE_D_CREATE_SHARED_LIBRARY
141
# CMAKE_D_CREATE_SHARED_MODULE
142
# CMAKE_D_CREATE_STATIC_LIBRARY
143
# CMAKE_D_COMPILE_OBJECT
144
# CMAKE_D_LINK_EXECUTABLE
146
# variables supplied by the generator at use time
148
# <TARGET_BASE> the target without the suffix
155
# D compiler information
157
# <CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS>
158
# <CMAKE_SHARED_MODULE_CREATE_D_FLAGS>
159
# <CMAKE_D_LINK_FLAGS>
161
# Static library tools
165
IF("$ENV{D_PATH}" STREQUAL "")
166
STRING(LENGTH ${CMAKE_D_COMPILER} CMAKE_D_COMPILER_LENGTH)
167
IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
168
MATH(EXPR CMAKE_D_COMPILER_LENGTH "${CMAKE_D_COMPILER_LENGTH} - 12")
169
ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
170
MATH(EXPR CMAKE_D_COMPILER_LENGTH "${CMAKE_D_COMPILER_LENGTH} - 8")
171
ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
172
STRING(SUBSTRING ${CMAKE_D_COMPILER} 0 ${CMAKE_D_COMPILER_LENGTH} D_PATH)
173
ELSE("$ENV{D_PATH}" STREQUAL "")
174
SET(D_PATH "$ENV{D_PATH}")
175
ENDIF("$ENV{D_PATH}" STREQUAL "")
176
MESSAGE(STATUS "D Compiler Install Prefix (use D_PATH env var to override): ${D_PATH}")
178
IF(CMAKE_COMPILER_IS_GDC)
179
SET(CMAKE_OUTPUT_D_FLAG "-o ")
180
SET(CMAKE_SHARED_LIBRARY_D_FLAGS "-fPIC")
181
SET(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared")
182
SET(CMAKE_INCLUDE_FLAG_D "-I") # -I
183
SET(CMAKE_INCLUDE_FLAG_D_SEP "") # , or empty
184
SET(CMAKE_LIBRARY_PATH_FLAG "-L")
185
SET(CMAKE_LINK_LIBRARY_FLAG "-l")
186
SET(CMAKE_D_VERSION_FLAG "-fversion=")
187
ELSE(CMAKE_COMPILER_IS_GDC)
188
SET(CMAKE_OUTPUT_D_FLAG "-of")
189
SET(CMAKE_D_VERSION_FLAG "-version=")
190
IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
191
SET(CMAKE_INCLUDE_FLAG_D "-I") # -I
192
SET(CMAKE_INCLUDE_FLAG_D_SEP "") # , or empty
193
SET(CMAKE_LINK_LIBRARY_FLAG "-L+")
194
SET(CMAKE_LIBRARY_PATH_FLAG "-L+")
195
SET(CMAKE_LIBRARY_PATH_TERMINATOR "\\")
196
FIND_PROGRAM(DMD_LIBRARIAN "lib.exe")
197
ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
198
SET(CMAKE_SHARED_LIBRARY_D_FLAGS "-fPIC")
199
SET(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared")
200
SET(CMAKE_INCLUDE_FLAG_D "-I") # -I
201
SET(CMAKE_INCLUDE_FLAG_D_SEP "") # , or empty
202
SET(CMAKE_LIBRARY_PATH_FLAG "-L")
203
ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
204
ENDIF(CMAKE_COMPILER_IS_GDC)
206
IF(CMAKE_D_USE_TANGO)
207
IF(CMAKE_COMPILER_IS_GDC)
208
SET(DSTDLIB_TYPE "-fversion=Tango")
209
SET(DSTDLIB_FLAGS "-lgtango")
210
ELSE(CMAKE_COMPILER_IS_GDC)
211
SET(DSTDLIB_TYPE "-version=Tango")
212
SET(DSTDLIB_FLAGS "-L${D_PATH}/lib -ltango -lphobos")
213
ENDIF(CMAKE_COMPILER_IS_GDC)
214
ENDIF(CMAKE_D_USE_TANGO)
215
IF(CMAKE_D_USE_PHOBOS)
216
IF(CMAKE_COMPILER_IS_GDC)
217
SET(DSTDLIB_TYPE "-fversion=Phobos")
218
SET(DSTDLIB_FLAGS "-lgphobos")
219
ELSE(CMAKE_COMPILER_IS_GDC)
220
SET(DSTDLIB_TYPE "-version=Phobos")
221
SET(DSTDLIB_FLAGS "-L${D_PATH}/lib -lphobos")
222
ENDIF(CMAKE_COMPILER_IS_GDC)
223
ENDIF(CMAKE_D_USE_PHOBOS)
225
# create a D shared library
226
IF(NOT CMAKE_D_CREATE_SHARED_LIBRARY)
227
IF(CMAKE_COMPILER_IS_GDC)
228
SET(CMAKE_D_CREATE_SHARED_LIBRARY
229
"<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>")
230
ELSE(CMAKE_COMPILER_IS_GDC)
231
SET(CMAKE_D_CREATE_SHARED_LIBRARY
232
"<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}")
233
ENDIF(CMAKE_COMPILER_IS_GDC)
234
ENDIF(NOT CMAKE_D_CREATE_SHARED_LIBRARY)
236
# create a D shared module just copy the shared library rule
237
IF(NOT CMAKE_D_CREATE_SHARED_MODULE)
238
SET(CMAKE_D_CREATE_SHARED_MODULE ${CMAKE_D_CREATE_SHARED_LIBRARY})
239
ENDIF(NOT CMAKE_D_CREATE_SHARED_MODULE)
241
# create a D static library
242
IF(NOT CMAKE_D_CREATE_STATIC_LIBRARY)
243
IF(CMAKE_COMPILER_IS_GDC)
244
IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
245
SET(CMAKE_D_CREATE_STATIC_LIBRARY
246
"<CMAKE_AR> cr <TARGET>.lib <LINK_FLAGS> <OBJECTS> "
247
"<CMAKE_RANLIB> <TARGET>.lib "
248
"<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS> "
249
"<CMAKE_RANLIB> <TARGET> "
251
ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
252
SET(CMAKE_D_CREATE_STATIC_LIBRARY
253
"<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS> "
254
"<CMAKE_RANLIB> <TARGET> "
256
ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
257
ELSE(CMAKE_COMPILER_IS_GDC)
258
IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
259
SET(CMAKE_D_CREATE_STATIC_LIBRARY
260
"${DMD_LIBRARIAN} -c -p256 <TARGET> <OBJECTS>")
261
ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
262
SET(CMAKE_D_CREATE_STATIC_LIBRARY
263
"<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>"
264
"<CMAKE_RANLIB> <TARGET>")
265
ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
266
ENDIF(CMAKE_COMPILER_IS_GDC)
267
ENDIF(NOT CMAKE_D_CREATE_STATIC_LIBRARY)
269
# compile a D file into an object file
270
IF(NOT CMAKE_D_COMPILE_OBJECT)
271
SET(CMAKE_D_COMPILE_OBJECT
272
"<CMAKE_D_COMPILER> <FLAGS> ${CMAKE_OUTPUT_D_FLAG}<OBJECT> -c <SOURCE>")
273
ENDIF(NOT CMAKE_D_COMPILE_OBJECT)
275
IF(NOT CMAKE_D_LINK_EXECUTABLE)
276
IF(CMAKE_COMPILER_IS_GDC)
277
SET(CMAKE_D_LINK_EXECUTABLE
278
"<CMAKE_D_COMPILER> <FLAGS> <CMAKE_D_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> ${CMAKE_OUTPUT_D_FLAG}<TARGET> <LINK_LIBRARIES> ${DSTDLIB_FLAGS} ${DSTDLIB_TYPE}")
279
ELSE(CMAKE_COMPILER_IS_GDC)
280
IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
281
SET(CMAKE_D_LINK_EXECUTABLE
282
"<CMAKE_D_COMPILER> <FLAGS> <CMAKE_D_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> ${CMAKE_OUTPUT_D_FLAG}<TARGET> <LINK_LIBRARIES>")
283
ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
284
SET(CMAKE_D_LINK_EXECUTABLE
285
"gcc ${DLINK_FLAGS} <CMAKE_D_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES> -lpthread -lm ${DSTDLIB_FLAGS}")
286
ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
287
ENDIF(CMAKE_COMPILER_IS_GDC)
288
ENDIF(NOT CMAKE_D_LINK_EXECUTABLE)
293
CMAKE_D_FLAGS_MINSIZEREL
294
CMAKE_D_FLAGS_RELEASE
295
CMAKE_D_FLAGS_RELWITHDEBINFO
297
SET(CMAKE_D_INFORMATION_LOADED 1)