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: tomas@1103: include(FindPkgConfig) tomas@1103: if(NOT PKG_CONFIG_FOUND) tomas@1103: message(FATAL_ERROR "pkg-config not found") tomas@1103: else(NOT PKG_CONFIG_FOUND) tomas@1103: pkg_search_module(LIBCONFIGPP libconfig++) tomas@1103: if(NOT LIBCONFIGPP_FOUND) tomas@1139: set(LIBCONFIG_CXXFLAGS "" CACHE STRING "libconfig++ compiler flags") tomas@1139: set(LIBCONFIG_LDFLAGS "" CACHE STRING "libconfig++ linker flags") tomas@1139: else(NOT LIBCONFIGPP_FOUND) tomas@1139: set(LIBCONFIG_CXXFLAGS ${LIBCONFIGPP_CFLAGS} CACHE STRING "libconfig++ compiler flags") tomas@1139: set(LIBCONFIG_LDFLAGS ${LIBCONFIGPP_LDFLAGS} CACHE STRING "libconfig++ linker flags") tomas@1103: endif(NOT LIBCONFIGPP_FOUND) tomas@1103: endif(NOT PKG_CONFIG_FOUND) tomas@1103: 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( tomas@1021: COMMAND /bin/sh ${PROJECT_SOURCE_DIR}/find-alt-triple.sh ${HOST_TARGET} tomas@1021: OUTPUT_VARIABLE HOST_ALT_TARGET tomas@1021: OUTPUT_STRIP_TRAILING_WHITESPACE tomas@1021: ) tomas@1021: 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@1519: execute_process( kamm@1519: COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --includedir kamm@1519: OUTPUT_VARIABLE LLVM_INCLUDEDIR kamm@1519: OUTPUT_STRIP_TRAILING_WHITESPACE kamm@1519: ) tomas@1105: tomas@758: set(D_VERSION 1 CACHE STRING "D language version") elrood@828: set(PROGRAM_PREFIX CACHE STRING "prepended to ldc binary name") elrood@828: set(PROGRAM_SUFFIX CACHE STRING "appended to ldc binary name") kamm@785: option(USE_BOEHM_GC "use the Boehm garbage collector internally") tomas@821: option(GENERATE_OFFTI "generate complete ClassInfo.offTi arrays") tomas@1558: option(USE_METADATA "use metadata and related custom optimization passes") kamm@785: tomas@758: if(D_VERSION EQUAL 1) tomas@758: set(DMDFE_PATH dmd) tomas@758: set(LDC_EXE ldc) robert@1453: set(LDMD_EXE ldmd) tomas@758: add_definitions(-DDMDV1) tomas@758: elseif(D_VERSION EQUAL 2) tomas@758: set(DMDFE_PATH dmd2) tomas@758: set(LDC_EXE ldc2) robert@1453: set(LDMD_EXE ldmd2) 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} fvbommel@1065: ${PROJECT_BINARY_DIR}/gen 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@1051: COMPILE_FLAGS ${LLVM_CXXFLAGS} 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") tomas@1021: set(DEFAULT_ALT_TARGET ${HOST_ALT_TARGET} CACHE STRING "default alt target") kamm@753: kamm@1519: include_directories(. ${DMDFE_PATH} ${DMDFE_PATH}/root ${PROJECT_BINARY_DIR}/${DMDFE_PATH} ${PROJECT_BINARY_DIR} ${LLVM_INCLUDEDIR}) kamm@753: kamm@1518: set(EXTRA_LLVM_MODULES "" CACHE STRING "extra llvm components to link in (see llvm-config --components)") kamm@1518: separate_arguments(EXTRA_LLVM_MODULES) kamm@1518: execute_process( kamm@1518: COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --libfiles bitwriter linker ipo instrumentation backend ${EXTRA_LLVM_MODULES} kamm@1518: OUTPUT_VARIABLE LLVM_LIBS kamm@1518: OUTPUT_STRIP_TRAILING_WHITESPACE kamm@1518: ) kamm@1518: kamm@1518: # build a define that contains all LLVM targets required and is usable for kamm@1518: # preprocessor code generation. start with the native target. kamm@1520: find_path(LLVM_CONFIG_FILE_PATH config.h PATHS ${LLVM_INCLUDEDIR}/llvm/Config ${LLVM_INCLUDEDIR}/Config NO_DEFAULT_PATH) kamm@1522: if(LLVM_CONFIG_FILE_PATH STREQUAL "LLVM_CONFIG_FILE_PATH-NOTFOUND") kamm@1522: message("Couldn't find your llvm Config.h file in ${LLVM_INCLUDEDIR}, no native target will be initialized.") kamm@1522: else(LLVM_CONFIG_FILE_PATH STREQUAL "LLVM_CONFIG_FILE_PATH-NOTFOUND") kamm@1522: file(STRINGS ${LLVM_CONFIG_FILE_PATH}/config.h LLVM_NATIVE_ARCH REGEX "^#define LLVM_NATIVE_ARCH") kamm@1522: if(LLVM_NATIVE_ARCH) kamm@1522: string(REGEX REPLACE "^#define LLVM_NATIVE_ARCH (.*)Target$" "\\1" LLVM_NATIVE_ARCH ${LLVM_NATIVE_ARCH}) benny@1547: message(STATUS "Found native target ${LLVM_NATIVE_ARCH}") kamm@1522: set(LLVM_MODULES_DEFINE "LLVM_TARGET(${LLVM_NATIVE_ARCH})") kamm@1522: else(LLVM_NATIVE_ARCH) kamm@1522: 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.") kamm@1522: endif(LLVM_NATIVE_ARCH) kamm@1522: endif(LLVM_CONFIG_FILE_PATH STREQUAL "LLVM_CONFIG_FILE_PATH-NOTFOUND") kamm@1518: # chain the extra target list to the define kamm@1518: foreach(EXTRA_TARGET ${EXTRA_LLVM_MODULES}) kamm@1518: set(LLVM_MODULES_DEFINE "${LLVM_MODULES_DEFINE} LLVM_TARGET(${EXTRA_TARGET})") kamm@1518: endforeach(EXTRA_TARGET) kamm@1518: set_source_files_properties( kamm@1518: ${PROJECT_SOURCE_DIR}/gen/main.cpp PROPERTIES kamm@1518: COMPILE_DEFINITIONS LDC_TARGETS=${LLVM_MODULES_DEFINE} kamm@1518: ) kamm@1518: kamm@1518: tomas@758: file(GLOB FE_SRC ${DMDFE_PATH}/*.c) tomas@1194: file(GLOB FE_SRC_ROOT ${DMDFE_PATH}/root/*.c) fvbommel@1275: file(GLOB_RECURSE 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} tomas@1194: ${FE_SRC_ROOT} 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@750: ) kamm@753: kamm@753: if(UNIX) kamm@753: add_definitions(-DPOSIX) elrood@829: set(CONF_INST_DIR bin) kamm@753: endif(UNIX) kamm@753: kamm@785: if(USE_BOEHM_GC) kamm@883: add_definitions(-DREDIRECT_MALLOC=GC_malloc -DIGNORE_FREE) kamm@785: endif(USE_BOEHM_GC) kamm@785: tomas@821: if(GENERATE_OFFTI) tomas@821: add_definitions(-DGENERATE_OFFTI) tomas@821: endif(GENERATE_OFFTI) tomas@821: tomas@1558: if(USE_METADATA) tomas@1558: add_definitions(-DUSE_METADATA) tomas@1558: endif(USE_METADATA) tomas@1558: 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}\\") tomas@1021: add_definitions(-DDEFAULT_ALT_TARGET_TRIPLE=\\"${DEFAULT_ALT_TARGET}\\") tomas@1103: add_definitions(-DLDC_INSTALL_PREFIX=\\"${CMAKE_INSTALL_PREFIX}\\") kamm@753: else(CMAKE_MINOR_VERSION LESS 6) kamm@753: add_definitions(-DDEFAULT_TARGET_TRIPLE="${DEFAULT_TARGET}") tomas@1021: add_definitions(-DDEFAULT_ALT_TARGET_TRIPLE="${DEFAULT_ALT_TARGET}") tomas@1103: add_definitions(-DLDC_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}") kamm@753: endif(CMAKE_MINOR_VERSION LESS 6) kamm@753: tomas@758: add_executable(${LDC_EXE} ${LDC_SOURCE_FILES}) kamm@753: kamm@853: # generate revision info fvbommel@1064: configure_file( fvbommel@1064: ${PROJECT_SOURCE_DIR}/revisions.pl.in fvbommel@1064: ${PROJECT_BINARY_DIR}/revisions.pl fvbommel@1064: @ONLY fvbommel@1064: ) fvbommel@1074: add_custom_target( fvbommel@1074: gen_revs_h kamm@853: COMMAND ${PERL_EXECUTABLE} ${PROJECT_BINARY_DIR}/revisions.pl fvbommel@1074: DEPENDS ${PROJECT_BINARY_DIR}/revisions.pl fvbommel@1113: COMMENT "Generating revisions.h and llvm-version.h" fvbommel@1064: WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/gen kamm@853: ) kamm@853: add_dependencies(${LDC_EXE} gen_revs_h) kamm@853: # kamm@853: elrood@828: set(LDC_EXE_NAME ${PROGRAM_PREFIX}${LDC_EXE}${PROGRAM_SUFFIX}) elrood@828: kamm@753: set_target_properties( tomas@758: ${LDC_EXE} PROPERTIES elrood@828: OUTPUT_NAME ${LDC_EXE_NAME} kamm@753: RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin tomas@1103: COMPILE_FLAGS "${LLVM_CXXFLAGS} ${LIBCONFIG_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 fvbommel@1107: target_link_libraries(${LDC_EXE} "${LLVM_LDFLAGS} ${LLVM_LIBS}" ${LIBCONFIG_LDFLAGS}) kamm@753: if(WIN32) wilsonk@1256: target_link_libraries(${LDC_EXE} config++ imagehlp psapi) elrood@828: set(CONF_INST_DIR bin) kamm@753: endif(WIN32) kamm@750: kamm@785: if(USE_BOEHM_GC) kamm@883: target_link_libraries(${LDC_EXE} ${PROJECT_SOURCE_DIR}/libgc.a) kamm@785: endif(USE_BOEHM_GC) kamm@750: kamm@785: get_target_property(LDC_LOC ${LDC_EXE} LOCATION) kamm@785: kamm@753: # TODO: testrun kamm@785: elrood@828: install(TARGETS ${LDC_EXE} DESTINATION bin) robert@1453: install(FILES ${PROJECT_SOURCE_DIR}/bin/${LDMD_EXE} DESTINATION bin) elrood@829: install(FILES ${PROJECT_BINARY_DIR}/bin/${LDC_EXE}.conf DESTINATION ${CONF_INST_DIR}) kamm@1129: install(FILES ${PROJECT_BINARY_DIR}/bin/${LDC_EXE}.rebuild.conf DESTINATION ${CONF_INST_DIR}) elrood@829: install(DIRECTORY ${PROJECT_BINARY_DIR}/lib DESTINATION . USE_SOURCE_PERMISSIONS) elrood@828: elrood@829: add_subdirectory(runtime EXCLUDE_FROM_ALL)