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 CMakeTestCCompiler.cmake
\r
12 # See http://www.cmake.org/HTML/Copyright.html for details
\r
15 # This file is used by EnableLanguage in cmGlobalGenerator to
\r
16 # determine that that selected D compiler can actually compile
\r
17 # and link the most basic of programs. If not, a fatal error
\r
18 # is set and cmake stops processing commands and will not generate
\r
19 # any makefiles or projects.
\r
21 IF(NOT CMAKE_D_COMPILER_WORKS)
\r
22 MESSAGE(STATUS "Check for working D compiler: ${CMAKE_D_COMPILER}")
\r
23 FILE(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
24 "int main(char[][] args)\n"
\r
25 "{return args.sizeof-1;}\n")
\r
26 STRING(REGEX MATCH "dmd" DMDTEST "${CMAKE_D_COMPILER}")
\r
27 IF(DMDTEST STREQUAL "dmd")
\r
28 IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
29 TRY_COMPILE(CMAKE_D_COMPILER_WORKS ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
30 OUTPUT_VARIABLE OUTPUT)
\r
31 ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
32 TRY_COMPILE(CMAKE_D_COMPILER_WORKS ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
33 CMAKE_FLAGS "-DLINK_LIBRARIES=${D_PATH}/lib/libphobos.a"
\r
34 OUTPUT_VARIABLE OUTPUT)
\r
35 ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
36 ELSE(DMDTEST STREQUAL "dmd")
\r
37 TRY_COMPILE(CMAKE_D_COMPILER_WORKS ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
38 OUTPUT_VARIABLE OUTPUT)
\r
39 ENDIF(DMDTEST STREQUAL "dmd")
\r
40 SET(C_TEST_WAS_RUN 1)
\r
41 ENDIF(NOT CMAKE_D_COMPILER_WORKS)
\r
43 IF(NOT CMAKE_D_COMPILER_WORKS)
\r
44 MESSAGE(STATUS "Check for working D compiler: ${CMAKE_D_COMPILER} -- broken")
\r
45 message(STATUS "To force a specific D compiler set the DC environment variable")
\r
46 message(STATUS " ie - export DC=\"/opt/dmd/bin/dmd\"")
\r
47 message(STATUS "If the D path is not set please use the D_PATH variable")
\r
48 message(STATUS " ie - export D_PATH=\"/opt/dmd\"")
\r
49 FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
\r
50 "Determining if the D compiler works failed with "
\r
51 "the following output:\n${OUTPUT}\n\n")
\r
52 MESSAGE(FATAL_ERROR "The D compiler \"${CMAKE_D_COMPILER}\" "
\r
53 "is not able to compile a simple test program.\nIt fails "
\r
54 "with the following output:\n ${OUTPUT}\n\n"
\r
55 "CMake will not be able to correctly generate this project.")
\r
56 ELSE(NOT CMAKE_D_COMPILER_WORKS)
\r
58 MESSAGE(STATUS "Check for working D compiler: ${CMAKE_D_COMPILER} -- works")
\r
59 FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
\r
60 "Determining if the D compiler works passed with "
\r
61 "the following output:\n${OUTPUT}\n\n")
\r
62 ENDIF(C_TEST_WAS_RUN)
\r
63 SET(CMAKE_D_COMPILER_WORKS 1 CACHE INTERNAL "")
\r
64 # re-configure this file CMakeDCompiler.cmake so that it gets
\r
65 # the value for CMAKE_SIZEOF_VOID_P
\r
66 # configure variables set in this file for fast reload later on
\r
67 IF(EXISTS ${CMAKE_SOURCE_DIR}/cmake/Modules/CMakeDCompiler.cmake.in)
\r
68 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/Modules/CMakeDCompiler.cmake.in
\r
69 ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeDCompiler.cmake IMMEDIATE)
\r
70 ELSE(EXISTS ${CMAKE_SOURCE_DIR}/cmake/Modules/CMakeDCompiler.cmake.in)
\r
71 CONFIGURE_FILE(${CMAKE_ROOT}/Modules/CMakeDCompiler.cmake.in
\r
72 ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeDCompiler.cmake IMMEDIATE)
\r
73 ENDIF(EXISTS ${CMAKE_SOURCE_DIR}/cmake/Modules/CMakeDCompiler.cmake.in)
\r
74 ENDIF(NOT CMAKE_D_COMPILER_WORKS)
\r
76 IF(NOT CMAKE_D_PHOBOS_WORKS)
\r
77 MESSAGE(STATUS "Check for working Phobos")
\r
78 FILE(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
79 "import std.stdio;\n"
\r
80 "int main(char[][] args)\n"
\r
81 "{ writefln(\"%s\", args[0]); return args.sizeof-1;}\n")
\r
82 IF(CMAKE_COMPILER_IS_GDC)
\r
83 IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
84 TRY_COMPILE(CMAKE_D_PHOBOS_WORKS ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
85 #CMAKE_FLAGS "-DLINK_LIBRARIES=gphobos"
\r
86 OUTPUT_VARIABLE OUTPUT)
\r
87 ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
88 TRY_COMPILE(CMAKE_D_PHOBOS_WORKS ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
89 CMAKE_FLAGS "-DLINK_LIBRARIES=gphobos"
\r
90 OUTPUT_VARIABLE OUTPUT)
\r
91 ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
92 ELSE(CMAKE_COMPILER_IS_GDC)
\r
93 IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
94 TRY_COMPILE(CMAKE_D_PHOBOS_WORKS ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
95 OUTPUT_VARIABLE OUTPUT)
\r
96 ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
97 TRY_COMPILE(CMAKE_D_PHOBOS_WORKS ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
98 CMAKE_FLAGS "-DLINK_LIBRARIES=${D_PATH}/lib/libphobos.a"
\r
99 COMPILE_DEFINITIONS "-I${D_PATH}/include -I${D_PATH}/import"
\r
100 OUTPUT_VARIABLE OUTPUT)
\r
101 ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
102 ENDIF(CMAKE_COMPILER_IS_GDC)
\r
103 SET(C_TEST_WAS_RUN 1)
\r
104 ENDIF(NOT CMAKE_D_PHOBOS_WORKS)
\r
106 IF(NOT CMAKE_D_PHOBOS_WORKS)
\r
107 MESSAGE(STATUS "Check for working Phobos -- unavailable")
\r
108 FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
\r
109 "Determining if Phobos works failed with "
\r
110 "the following output:\n${OUTPUT}\n\n")
\r
111 #MESSAGE(FATAL_ERROR "Phobos does not work")
\r
112 ELSE(NOT CMAKE_D_PHOBOS_WORKS)
\r
114 MESSAGE(STATUS "Check for working Phobos -- works")
\r
115 FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
\r
116 "Determining if Phobos works passed with "
\r
117 "the following output:\n${OUTPUT}\n\n")
\r
118 ENDIF(C_TEST_WAS_RUN)
\r
119 SET(CMAKE_D_PHOBOS_WORKS 1 CACHE INTERNAL "")
\r
120 ENDIF(NOT CMAKE_D_PHOBOS_WORKS)
\r
122 IF(NOT CMAKE_D_TANGO_WORKS)
\r
123 MESSAGE(STATUS "Check for working Tango")
\r
124 FILE(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
125 "import tango.io.Stdout;"
\r
126 "int main(char[][] args)\n"
\r
127 "{Stdout.newline();return args.sizeof-1;}\n")
\r
128 IF(CMAKE_COMPILER_IS_GDC)
\r
129 TRY_COMPILE(CMAKE_D_TANGO_WORKS ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
130 CMAKE_FLAGS "-DLINK_LIBRARIES=gtango"
\r
131 OUTPUT_VARIABLE OUTPUT)
\r
132 ELSE(CMAKE_COMPILER_IS_GDC)
\r
133 IF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
134 TRY_COMPILE(CMAKE_D_TANGO_WORKS ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
135 OUTPUT_VARIABLE OUTPUT)
\r
136 ELSE(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
137 TRY_COMPILE(CMAKE_D_TANGO_WORKS ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testDCompiler.d
\r
138 CMAKE_FLAGS "-DLINK_LIBRARIES=${D_PATH}/lib/libtango.a;${D_PATH}/lib/libphobos.a"
\r
139 COMPILE_DEFINITIONS "-I${D_PATH}/include -I${D_PATH}/import"
\r
140 OUTPUT_VARIABLE OUTPUT)
\r
141 ENDIF(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
\r
142 ENDIF(CMAKE_COMPILER_IS_GDC)
\r
143 SET(C_TEST_WAS_RUN 1)
\r
144 ENDIF(NOT CMAKE_D_TANGO_WORKS)
\r
146 IF(NOT CMAKE_D_TANGO_WORKS)
\r
147 MESSAGE(STATUS "Check for working Tango -- unavailable")
\r
148 FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
\r
149 "Determining if Tango works failed with "
\r
150 "the following output:\n${OUTPUT}\n\n")
\r
151 #MESSAGE(FATAL_ERROR "Tango does not work: \n${OUTPUT}\n\n")
\r
152 ELSE(NOT CMAKE_D_TANGO_WORKS)
\r
154 MESSAGE(STATUS "Check for working Tango -- works")
\r
155 FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
\r
156 "Determining if Tango works passed with "
\r
157 "the following output:\n${OUTPUT}\n\n")
\r
158 ENDIF(C_TEST_WAS_RUN)
\r
159 SET(CMAKE_D_TANGO_WORKS 1 CACHE INTERNAL "")
\r
160 ENDIF(NOT CMAKE_D_TANGO_WORKS)
\r
162 # if both tango and phobos are selected try to choose which one is available
163 IF(CMAKE_D_USE_TANGO AND CMAKE_D_USE_PHOBOS)
164 MESSAGE(FATAL_ERROR "Tango AND Phobos selected, please choose one or the other!")
165 ENDIF(CMAKE_D_USE_TANGO AND CMAKE_D_USE_PHOBOS)
167 # ensure the user has the appropriate std lib available
168 IF(CMAKE_D_USE_TANGO AND NOT CMAKE_D_TANGO_WORKS)
169 MESSAGE(FATAL_ERROR "Tango is required for this project, but it is not available!")
170 ENDIF(CMAKE_D_USE_TANGO AND NOT CMAKE_D_TANGO_WORKS)
172 IF(CMAKE_D_USE_PHOBOS AND NOT CMAKE_D_PHOBOS_WORKS)
173 MESSAGE(FATAL_ERROR "Phobos is required for this project, but it is not available!")
174 ENDIF(CMAKE_D_USE_PHOBOS AND NOT CMAKE_D_PHOBOS_WORKS)