kamm@753: project(ldc) kamm@753: kamm@753: cmake_minimum_required(VERSION 2.6) kamm@753: # actually, 2.4 will work, with a warning kamm@753: # if we required 2.4, 2.6+ would switch to a compatibility mode and cause problems on 2.6+ specifics kamm@753: kamm@753: include(FindPerl) kamm@753: if(NOT PERL) kamm@753: message(FATAL_ERROR "perl not found") kamm@753: endif(NOT PERL) kamm@753: kamm@753: set(LLVM_INSTDIR CACHE PATH "LLVM installation directory") kamm@753: kamm@753: find_program(LLVM_CONFIG llvm-config ${LLVM_INSTDIR}/bin DOC "path to llvm-config tool") kamm@753: if(NOT LLVM_CONFIG) kamm@753: message(FATAL_ERROR "llvm-config not found") kamm@753: endif(NOT LLVM_CONFIG) kamm@749: kamm@753: execute_process( kamm@753: COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --host-target kamm@753: OUTPUT_VARIABLE HOST_TARGET kamm@753: OUTPUT_STRIP_TRAILING_WHITESPACE kamm@753: ) kamm@753: execute_process( kamm@753: COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --cxxflags kamm@753: OUTPUT_VARIABLE LLVM_CXXFLAGS kamm@753: OUTPUT_STRIP_TRAILING_WHITESPACE kamm@753: ) kamm@753: execute_process( kamm@753: COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --ldflags kamm@753: OUTPUT_VARIABLE LLVM_LDFLAGS kamm@753: OUTPUT_STRIP_TRAILING_WHITESPACE kamm@753: ) kamm@753: execute_process( kamm@753: COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --libfiles bitwriter linker ipo instrumentation backend kamm@753: OUTPUT_VARIABLE LLVM_LIBS kamm@753: OUTPUT_STRIP_TRAILING_WHITESPACE kamm@753: ) kamm@753: # get llvm's install dir. a little hackish, we could do something like llvm-config --prefix, but this does as well kamm@753: string(REPLACE "/bin/llvm-config" "" LLVM_INSTDIR ${LLVM_CONFIG}) kamm@753: tomas@758: set(D_VERSION 1 CACHE STRING "D language version") tomas@758: if(D_VERSION EQUAL 1) tomas@758: set(DMDFE_PATH dmd) tomas@758: set(LDC_EXE ldc) tomas@758: add_definitions(-DDMDV1) tomas@758: elseif(D_VERSION EQUAL 2) tomas@758: set(DMDFE_PATH dmd2) tomas@758: set(LDC_EXE ldc2) tomas@758: add_definitions(-DDMDV2) tomas@758: else(D_VERSION EQUAL 1) tomas@758: message(FATAL_ERROR "unsupported D version") tomas@758: endif(D_VERSION EQUAL 1) tomas@758: kamm@753: file(MAKE_DIRECTORY kamm@753: ${PROJECT_BINARY_DIR}/bin tomas@758: ${PROJECT_BINARY_DIR}/${DMDFE_PATH} kamm@750: ) kamm@750: kamm@753: # idgen and impcnvgen kamm@753: set_source_files_properties( tomas@758: ${DMDFE_PATH}/idgen.c tomas@758: ${DMDFE_PATH}/impcnvgen.c kamm@753: PROPERTIES LANGUAGE CXX kamm@753: ) tomas@758: add_executable(idgen ${DMDFE_PATH}/idgen.c) tomas@758: add_executable(impcnvgen ${DMDFE_PATH}/impcnvgen.c) kamm@753: # cmake 2.4 kamm@753: set_target_properties( kamm@753: idgen impcnvgen PROPERTIES kamm@753: LINKER_LANGUAGE CXX kamm@750: ) kamm@753: get_target_property(IDGEN_LOC idgen LOCATION) kamm@753: get_target_property(IMPCNVGEN_LOC impcnvgen LOCATION) kamm@753: # kamm@753: add_custom_command( kamm@753: OUTPUT tomas@758: ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/id.c tomas@758: ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/id.h kamm@753: # 2.4 kamm@753: COMMAND ${IDGEN_LOC} kamm@753: #COMMAND idgen tomas@758: WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${DMDFE_PATH} kamm@753: DEPENDS idgen kamm@750: ) kamm@753: add_custom_command( tomas@758: OUTPUT ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/impcnvtab.c kamm@753: # 2.4 kamm@753: COMMAND ${IMPCNVGEN_LOC} kamm@753: #COMMAND impcnvgen tomas@758: WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${DMDFE_PATH} kamm@753: DEPENDS impcnvgen kamm@753: ) kamm@753: set(LDC_GENERATED tomas@758: ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/id.c tomas@758: ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/id.h tomas@758: ${PROJECT_BINARY_DIR}/${DMDFE_PATH}/impcnvtab.c kamm@753: ) kamm@753: # idgen and impcnvgen done kamm@749: kamm@753: set(DEFAULT_TARGET ${HOST_TARGET} CACHE STRING "default target") kamm@753: tomas@758: include_directories(. ${DMDFE_PATH} ${PROJECT_BINARY_DIR}/${DMDFE_PATH} ${LLVM_INSTDIR}/include) kamm@753: tomas@758: file(GLOB FE_SRC ${DMDFE_PATH}/*.c) kamm@753: file(GLOB GEN_SRC gen/*.cpp) kamm@753: file(GLOB IR_SRC ir/*.cpp) kamm@753: # exclude idgen and impcnvgen and generated sources, just in case kamm@753: list(REMOVE_ITEM FE_SRC tomas@758: ${PROJECT_SOURCE_DIR}/${DMDFE_PATH}/idgen.c tomas@758: ${PROJECT_SOURCE_DIR}/${DMDFE_PATH}/impcnvgen.c tomas@758: ${PROJECT_SOURCE_DIR}/${DMDFE_PATH}/id.c tomas@758: ${PROJECT_SOURCE_DIR}/${DMDFE_PATH}/impcnvtab.c kamm@750: ) kamm@753: set(LDC_SOURCE_FILES kamm@753: ${LDC_GENERATED} kamm@753: ${FE_SRC} kamm@753: ${GEN_SRC} kamm@753: ${IR_SRC} kamm@753: ) kamm@753: set_source_files_properties( kamm@753: ${LDC_SOURCE_FILES} PROPERTIES kamm@753: LANGUAGE CXX kamm@750: ) kamm@749: kamm@753: add_definitions( kamm@753: -DIN_LLVM kamm@753: -D_DH kamm@753: -DOPAQUE_VTBLS kamm@753: -DUSE_BOEHM_GC=0 kamm@753: -DX86_REVERSE_PARAMS kamm@753: -DX86_PASS_IN_EAX kamm@750: ) kamm@753: kamm@753: if(UNIX) kamm@753: add_definitions(-DPOSIX) kamm@753: #set(CONF_SUFFIX conf) kamm@753: endif(UNIX) kamm@753: kamm@753: if(CMAKE_MINOR_VERSION LESS 6) kamm@753: add_definitions(-DDEFAULT_TARGET_TRIPLE=\\"${DEFAULT_TARGET}\\") kamm@753: else(CMAKE_MINOR_VERSION LESS 6) kamm@753: add_definitions(-DDEFAULT_TARGET_TRIPLE="${DEFAULT_TARGET}") kamm@753: endif(CMAKE_MINOR_VERSION LESS 6) kamm@753: tomas@758: add_executable(${LDC_EXE} ${LDC_SOURCE_FILES}) kamm@753: kamm@753: set_target_properties( tomas@758: ${LDC_EXE} PROPERTIES kamm@753: RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin tomas@758: COMPILE_FLAGS "${LLVM_CXXFLAGS} -Wno-deprecated -Wno-write-strings" kamm@750: ) kamm@749: kamm@753: # LDFLAGS should actually be in target property LINK_FLAGS, but this works, and gets around linking problems tomas@758: target_link_libraries(${LDC_EXE} "${LLVM_LDFLAGS} ${LLVM_LIBS}") kamm@753: if(WIN32) tomas@758: target_link_libraries(${LDC_EXE} psapi) kamm@753: #set(CONF_SUFFIX ini) kamm@753: endif(WIN32) kamm@750: kamm@753: # cmake pre 2.6 doesn't support the RUNTIME_OUTPUT_DIRECTORY target property kamm@753: if(CMAKE_MINOR_VERSION LESS 6) tomas@758: get_target_property(LDC_LOC ${LDC_EXE} LOCATION) kamm@753: add_custom_command( tomas@758: TARGET ${LDC_EXE} kamm@753: POST_BUILD kamm@753: COMMAND ${CMAKE_COMMAND} -E copy ${LDC_LOC} ${PROJECT_BINARY_DIR}/bin/ kamm@753: COMMAND ${CMAKE_COMMAND} -E remove ${LDC_LOC} kamm@753: ) kamm@753: endif(CMAKE_MINOR_VERSION LESS 6) kamm@750: kamm@753: #configure_file(${PROJECT_SOURCE_DIR}/ldc.conf.in ${PROJECT_BINARY_DIR}/bin/ldc.${CONF_SUFFIX}) kamm@753: kamm@753: # TODO: runtime build kamm@753: # possible problems: kamm@753: # with an oos-build, how to set up a working environment, with conf/ini and tango in place? kamm@753: # patch tango? how to determine if that's already been done? kamm@753: # std but compatible runtime build, or shared, which doesn't yet work on every platform kamm@753: # kamm@753: # TODO: install target kamm@753: # TODO: testrun