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@785: find_program(LLVM_CONFIG llvm-config ${LLVM_INSTDIR}/bin DOC "path to llvm-config tool") kamm@785: # get llvm's install dir. a little hackish, we could do something like llvm-config --prefix, but this does as well kamm@785: string(REPLACE "/bin/llvm-config" "" LLVM_DIR ${LLVM_CONFIG}) kamm@753: kamm@785: set(LLVM_INSTDIR ${LLVM_DIR} CACHE PATH "LLVM installation directory" FORCE) kamm@785: if(NOT LLVM_INSTDIR) kamm@785: message(FATAL_ERROR "llvm not found") kamm@785: endif(NOT LLVM_INSTDIR) 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: tomas@758: set(D_VERSION 1 CACHE STRING "D language version") kamm@785: option(USE_BOEHM_GC "use the Boehm garbage collector internally") kamm@785: 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@785: RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${DMDFE_PATH} 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: -DX86_REVERSE_PARAMS kamm@753: -DX86_PASS_IN_EAX kamm@750: ) kamm@753: kamm@753: if(UNIX) kamm@753: add_definitions(-DPOSIX) kamm@753: endif(UNIX) kamm@753: kamm@785: if(USE_BOEHM_GC) kamm@785: add_definitions(-DUSE_BOEHM_GC) kamm@785: endif(USE_BOEHM_GC) kamm@785: kamm@753: if(CMAKE_MINOR_VERSION LESS 6) kamm@785: set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "output dir for built executables") kamm@785: set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib CACHE PATH "output dir for built libraries") 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: endif(WIN32) kamm@750: kamm@785: if(USE_BOEHM_GC) kamm@785: target_link_libraries(${LDC_EXE} gc) kamm@785: endif(USE_BOEHM_GC) kamm@750: kamm@785: get_target_property(LDC_LOC ${LDC_EXE} LOCATION) kamm@785: kamm@753: # TODO: install target kamm@753: # TODO: testrun kamm@785: kamm@785: add_subdirectory(runtime EXCLUDE_FROM_ALL)