Wiki Roadmap Timeline Tickets New Ticket Source Search Help / Guide About Trac Login

root/CMakeLists.txt

Revision 1648:18bbb1436153, 9.3 kB (checked in by Kelly Wilson <wilsonk cpsc.ucalgary.ca>, 2 years ago)

Change the ldc.conf file output to match the newer Tango directory structure and only use libtango-user-ldc for the libs to match the 0.99.9 build instructions.

Line 
1 project(ldc)
2
3 cmake_minimum_required(VERSION 2.6)
4 # actually, 2.4 will work, with a warning
5 # if we required 2.4, 2.6+ would switch to a compatibility mode and cause problems on 2.6+ specifics
6
7 include(FindPerl)
8 if(NOT PERL)
9     message(FATAL_ERROR "perl not found")
10 endif(NOT PERL)
11
12 include(FindPkgConfig)
13 if(NOT PKG_CONFIG_FOUND)
14     message(FATAL_ERROR "pkg-config not found")
15 else(NOT PKG_CONFIG_FOUND)
16     pkg_search_module(LIBCONFIGPP libconfig++)
17     if(NOT LIBCONFIGPP_FOUND)
18         set(LIBCONFIG_CXXFLAGS "" CACHE STRING "libconfig++ compiler flags")
19         set(LIBCONFIG_LDFLAGS "" CACHE STRING "libconfig++ linker flags")
20     else(NOT LIBCONFIGPP_FOUND)
21         set(LIBCONFIG_CXXFLAGS ${LIBCONFIGPP_CFLAGS} CACHE STRING "libconfig++ compiler flags")
22         set(LIBCONFIG_LDFLAGS ${LIBCONFIGPP_LDFLAGS} CACHE STRING "libconfig++ linker flags")
23     endif(NOT LIBCONFIGPP_FOUND)
24 endif(NOT PKG_CONFIG_FOUND)
25
26 find_program(LLVM_CONFIG llvm-config ${LLVM_INSTDIR}/bin DOC "path to llvm-config tool")
27 # get llvm's install dir. a little hackish, we could do something like llvm-config --prefix, but this does as well
28 string(REPLACE "/bin/llvm-config" "" LLVM_DIR ${LLVM_CONFIG})
29
30 set(LLVM_INSTDIR ${LLVM_DIR} CACHE PATH "LLVM installation directory" FORCE)
31 if(NOT LLVM_INSTDIR)
32     message(FATAL_ERROR "llvm not found")
33 endif(NOT LLVM_INSTDIR)
34
35 execute_process(
36     COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --host-target
37     OUTPUT_VARIABLE HOST_TARGET
38     OUTPUT_STRIP_TRAILING_WHITESPACE
39 )
40 execute_process(
41     COMMAND /bin/sh ${PROJECT_SOURCE_DIR}/find-alt-triple.sh ${HOST_TARGET}
42     OUTPUT_VARIABLE HOST_ALT_TARGET
43     OUTPUT_STRIP_TRAILING_WHITESPACE
44 )
45 execute_process(
46     COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --cxxflags
47     OUTPUT_VARIABLE LLVM_CXXFLAGS
48     OUTPUT_STRIP_TRAILING_WHITESPACE
49 )
50 execute_process(
51     COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --ldflags
52     OUTPUT_VARIABLE LLVM_LDFLAGS
53     OUTPUT_STRIP_TRAILING_WHITESPACE
54 )
55 execute_process(
56     COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --includedir
57     OUTPUT_VARIABLE LLVM_INCLUDEDIR
58     OUTPUT_STRIP_TRAILING_WHITESPACE
59 )
60
61 set(D_VERSION 1 CACHE STRING "D language version")
62 set(PROGRAM_PREFIX CACHE STRING "prepended to ldc binary name")
63 set(PROGRAM_SUFFIX CACHE STRING "appended to ldc binary name")
64 option(USE_BOEHM_GC "use the Boehm garbage collector internally")
65 option(GENERATE_OFFTI "generate complete ClassInfo.offTi arrays")
66 option(USE_METADATA "use metadata and related custom optimization passes")
67
68 if(D_VERSION EQUAL 1)
69     set(DMDFE_PATH dmd)
70     set(LDC_EXE ldc)
71     set(LDMD_EXE ldmd)
72     add_definitions(-DDMDV1)
73 elseif(D_VERSION EQUAL 2)
74     set(DMDFE_PATH dmd2)
75     set(LDC_EXE ldc2)
76     set(LDMD_EXE ldmd2)
77     add_definitions(-DDMDV2)
78 else(D_VERSION EQUAL 1)
79     message(FATAL_ERROR "unsupported D version")
80 endif(D_VERSION EQUAL 1)
81
82 file(MAKE_DIRECTORY
83     ${PROJECT_BINARY_DIR}/bin
84     ${PROJECT_BINARY_DIR}/${DMDFE_PATH}
85     ${PROJECT_BINARY_DIR}/gen
86 )
87
88 # idgen and impcnvgen
89 set_source_files_properties(
90     ${DMDFE_PATH}/idgen.c
91     ${DMDFE_PATH}/impcnvgen.c
92     PROPERTIES LANGUAGE CXX
93 )
94 add_executable(idgen ${DMDFE_PATH}/idgen.c)
95 add_executable(impcnvgen ${DMDFE_PATH}/impcnvgen.c)
96 # cmake 2.4
97 set_target_properties(
98     idgen impcnvgen PROPERTIES
99     LINKER_LANGUAGE CXX
100     RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${DMDFE_PATH}
101     COMPILE_FLAGS ${LLVM_CXXFLAGS}
102 )
103 get_target_property(IDGEN_LOC idgen LOCATION)
104 get_target_property(IMPCNVGEN_LOC impcnvgen LOCATION)
105 #
106 add_custom_command(
107     OUTPUT
108         ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/id.c
109         ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/id.h
110     # 2.4
111     COMMAND ${IDGEN_LOC}
112     #COMMAND idgen
113     WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${DMDFE_PATH}
114     DEPENDS idgen
115 )
116 add_custom_command(
117     OUTPUT ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/impcnvtab.c
118     # 2.4
119     COMMAND ${IMPCNVGEN_LOC}
120     #COMMAND impcnvgen
121     WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${DMDFE_PATH}
122     DEPENDS impcnvgen
123 )
124 set(LDC_GENERATED
125     ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/id.c
126     ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/id.h
127     ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/impcnvtab.c
128 )
129 # idgen and impcnvgen done
130
131 set(DEFAULT_TARGET ${HOST_TARGET} CACHE STRING "default target")
132 set(DEFAULT_ALT_TARGET ${HOST_ALT_TARGET} CACHE STRING "default alt target")
133
134 include_directories(. ${DMDFE_PATH} ${DMDFE_PATH}/root ${PROJECT_BINARY_DIR}/${DMDFE_PATH} ${PROJECT_BINARY_DIR} ${LLVM_INCLUDEDIR})
135
136 set(EXTRA_LLVM_MODULES "" CACHE STRING "extra llvm components to link in (see llvm-config --components)")
137 separate_arguments(EXTRA_LLVM_MODULES)
138 execute_process(
139         COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --libfiles bitwriter linker ipo instrumentation backend ${EXTRA_LLVM_MODULES}
140         OUTPUT_VARIABLE LLVM_LIBS
141         OUTPUT_STRIP_TRAILING_WHITESPACE
142 )
143
144 # build a define that contains all LLVM targets required and is usable for
145 # preprocessor code generation. start with the native target.
146 find_path(LLVM_CONFIG_FILE_PATH config.h PATHS ${LLVM_INCLUDEDIR}/llvm/Config ${LLVM_INCLUDEDIR}/Config NO_DEFAULT_PATH)
147 if(LLVM_CONFIG_FILE_PATH STREQUAL "LLVM_CONFIG_FILE_PATH-NOTFOUND")
148         message("Couldn't find your llvm Config.h file in ${LLVM_INCLUDEDIR}, no native target will be initialized.")
149 else(LLVM_CONFIG_FILE_PATH STREQUAL "LLVM_CONFIG_FILE_PATH-NOTFOUND")
150         file(STRINGS ${LLVM_CONFIG_FILE_PATH}/config.h LLVM_NATIVE_ARCH REGEX "^#define LLVM_NATIVE_ARCH")
151         if(LLVM_NATIVE_ARCH)
152                 string(REGEX REPLACE "^#define LLVM_NATIVE_ARCH (.*)Target$" "\\1" LLVM_NATIVE_ARCH ${LLVM_NATIVE_ARCH})
153                 message(STATUS "Found native target ${LLVM_NATIVE_ARCH}")
154                 set(LLVM_MODULES_DEFINE "LLVM_TARGET(${LLVM_NATIVE_ARCH})")
155         else(LLVM_NATIVE_ARCH)
156                 message("Couldn't find the LLVM_NATIVE_ARCH define in ${LLVM_CONFIG_FILE_PATH}/config.h. Probably you have an older LLVM and can ignore this warning.")
157         endif(LLVM_NATIVE_ARCH)
158 endif(LLVM_CONFIG_FILE_PATH STREQUAL "LLVM_CONFIG_FILE_PATH-NOTFOUND")
159 # chain the extra target list to the define
160 foreach(EXTRA_TARGET ${EXTRA_LLVM_MODULES})
161     set(LLVM_MODULES_DEFINE "${LLVM_MODULES_DEFINE} LLVM_TARGET(${EXTRA_TARGET})")
162 endforeach(EXTRA_TARGET)
163 set_source_files_properties(
164     ${PROJECT_SOURCE_DIR}/gen/main.cpp PROPERTIES
165     COMPILE_DEFINITIONS LDC_TARGETS=${LLVM_MODULES_DEFINE}
166 )
167
168
169 file(GLOB FE_SRC ${DMDFE_PATH}/*.c)
170 file(GLOB FE_SRC_ROOT ${DMDFE_PATH}/root/*.c)
171 file(GLOB_RECURSE GEN_SRC gen/*.cpp)
172 file(GLOB IR_SRC ir/*.cpp)
173 # exclude idgen and impcnvgen and generated sources, just in case
174 list(REMOVE_ITEM FE_SRC
175     ${PROJECT_SOURCE_DIR}/${DMDFE_PATH}/idgen.c
176     ${PROJECT_SOURCE_DIR}/${DMDFE_PATH}/impcnvgen.c
177     ${PROJECT_SOURCE_DIR}/${DMDFE_PATH}/id.c
178     ${PROJECT_SOURCE_DIR}/${DMDFE_PATH}/impcnvtab.c
179 )
180 set(LDC_SOURCE_FILES
181     ${LDC_GENERATED}
182     ${FE_SRC}
183     ${FE_SRC_ROOT}
184     ${GEN_SRC}
185     ${IR_SRC}
186 )
187 set_source_files_properties(
188     ${LDC_SOURCE_FILES} PROPERTIES
189     LANGUAGE CXX
190 )
191
192 add_definitions(
193     -DIN_LLVM
194     -D_DH
195     -DOPAQUE_VTBLS
196 )
197
198 if(UNIX)
199     add_definitions(-DPOSIX)
200     set(CONF_INST_DIR bin)
201 endif(UNIX)
202
203 if(USE_BOEHM_GC)
204     add_definitions(-DREDIRECT_MALLOC=GC_malloc -DIGNORE_FREE)
205 endif(USE_BOEHM_GC)
206
207 if(GENERATE_OFFTI)
208     add_definitions(-DGENERATE_OFFTI)
209 endif(GENERATE_OFFTI)
210
211 if(USE_METADATA)
212     add_definitions(-DUSE_METADATA)
213 endif(USE_METADATA)
214
215 if(CMAKE_MINOR_VERSION LESS 6)
216     set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "output dir for built executables")
217     set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib CACHE PATH "output dir for built libraries")
218     add_definitions(-DDEFAULT_TARGET_TRIPLE=\\"${DEFAULT_TARGET}\\")
219     add_definitions(-DDEFAULT_ALT_TARGET_TRIPLE=\\"${DEFAULT_ALT_TARGET}\\")
220     add_definitions(-DLDC_INSTALL_PREFIX=\\"${CMAKE_INSTALL_PREFIX}\\")
221 else(CMAKE_MINOR_VERSION LESS 6)
222     add_definitions(-DDEFAULT_TARGET_TRIPLE="${DEFAULT_TARGET}")
223     add_definitions(-DDEFAULT_ALT_TARGET_TRIPLE="${DEFAULT_ALT_TARGET}")
224     add_definitions(-DLDC_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}")
225 endif(CMAKE_MINOR_VERSION LESS 6)
226
227 add_executable(${LDC_EXE} ${LDC_SOURCE_FILES})
228
229 # generate revision info
230 configure_file(
231         ${PROJECT_SOURCE_DIR}/revisions.pl.in
232         ${PROJECT_BINARY_DIR}/revisions.pl
233         @ONLY
234 )
235 add_custom_target(
236     gen_revs_h
237     COMMAND ${PERL_EXECUTABLE} ${PROJECT_BINARY_DIR}/revisions.pl
238     DEPENDS ${PROJECT_BINARY_DIR}/revisions.pl
239     COMMENT "Generating revisions.h and llvm-version.h"
240     WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/gen
241 )
242 add_dependencies(${LDC_EXE} gen_revs_h)
243 #
244
245 set(LDC_EXE_NAME ${PROGRAM_PREFIX}${LDC_EXE}${PROGRAM_SUFFIX})
246
247 set_target_properties(
248     ${LDC_EXE} PROPERTIES
249     OUTPUT_NAME ${LDC_EXE_NAME}
250     RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin
251     COMPILE_FLAGS "${LLVM_CXXFLAGS} ${LIBCONFIG_CXXFLAGS} -Wno-deprecated -Wno-write-strings"
252 )
253
254 # LDFLAGS should actually be in target property LINK_FLAGS, but this works, and gets around linking problems
255 target_link_libraries(${LDC_EXE} "${LLVM_LDFLAGS} ${LLVM_LIBS}" ${LIBCONFIG_LDFLAGS})
256 if(WIN32)
257     target_link_libraries(${LDC_EXE} config++ imagehlp psapi)
258     set(CONF_INST_DIR bin)
259 endif(WIN32)
260
261 if(USE_BOEHM_GC)
262     target_link_libraries(${LDC_EXE} ${PROJECT_SOURCE_DIR}/libgc.a)
263 endif(USE_BOEHM_GC)
264
265 get_target_property(LDC_LOC ${LDC_EXE} LOCATION)
266
267 # TODO: testrun
268
269 install(TARGETS ${LDC_EXE} DESTINATION bin)
270 install(FILES ${PROJECT_SOURCE_DIR}/bin/${LDMD_EXE} DESTINATION bin)
271 install(FILES ${PROJECT_BINARY_DIR}/bin/${LDC_EXE}.conf DESTINATION ${CONF_INST_DIR})
272 install(FILES ${PROJECT_BINARY_DIR}/bin/${LDC_EXE}.rebuild.conf DESTINATION ${CONF_INST_DIR})
273 install(DIRECTORY ${PROJECT_BINARY_DIR}/lib DESTINATION . USE_SOURCE_PERMISSIONS)
274
275 add_subdirectory(runtime EXCLUDE_FROM_ALL)
Note: See TracBrowser for help on using the browser.
Copyright © 2008, LDC Development Team.