kamm@786: project(runtime) kamm@786: kamm@786: cmake_minimum_required(VERSION 2.6) kamm@786: kamm@786: find_program(GCC_EXE gcc DOC "path to gcc binary") kamm@786: if(NOT GCC_EXE) kamm@786: message(STATUS "gcc needs to be on your path to build the runtime") kamm@786: endif(NOT GCC_EXE) kamm@786: kamm@786: option(BUILD_SHARED_LIBS "build the runtime as shared libraries (linux only)") kamm@786: option(BUILD_BC_LIBS "build the runtime as bytecode libraries") kamm@786: option(BUILD_SINGLE_LIB "build single runtime library" ON) kamm@786: set(D_FLAGS -g -w -d CACHE STRING "runtime build flags, separated by ;") kamm@786: elrood@808: if(BUILD_SHARED_LIBS) elrood@808: list(APPEND D_FLAGS -fPIC) elrood@808: endif(BUILD_SHARED_LIBS) elrood@808: elrood@808: # build tango for D1, druntime for D2 kamm@786: if(D_VERSION EQUAL 1) kamm@786: set(RUNTIME tango) kamm@786: elseif(D_VERSION EQUAL 2) kamm@786: set(RUNTIME druntime) kamm@786: else(D_VERSION EQUAL 1) kamm@786: message(FATAL_ERROR "set d version to 1 or 2") kamm@786: endif(D_VERSION EQUAL 1) kamm@791: get_directory_property(PROJECT_PARENT_DIR DIRECTORY ${PROJECT_SOURCE_DIR} PARENT_DIRECTORY) kamm@791: set(RUNTIME_DIR ${PROJECT_PARENT_DIR}/${RUNTIME} CACHE PATH "runtime source dir" FORCE) kamm@786: kamm@791: if(D_VERSION EQUAL 1) kamm@791: set(LDC_EXE ldc) kamm@791: # copy imports to runtime dir kamm@791: add_custom_command( kamm@791: OUTPUT ldc-imports kamm@791: COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/import/ldc ${RUNTIME_DIR}/ldc kamm@791: COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/internal/ldc/bitmanip.d ${RUNTIME_DIR}/ldc kamm@791: COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/internal/ldc/vararg.d ${RUNTIME_DIR}/ldc kamm@791: ) kamm@791: set(LDC_IMPORTS ldc-imports) kamm@791: # library names kamm@791: set(RUNTIME_CC tango-cc-tango) kamm@791: set(RUNTIME_GC tango-gc-basic) kamm@791: set(RUNTIME_DC ldc-runtime) kamm@791: set(RUNTIME_AIO tango-ldc) kamm@791: # set paths to source files, or fill lists directly kamm@791: set(RUNTIME_DC_DIR ${PROJECT_SOURCE_DIR}/internal) kamm@791: set(RUNTIME_GC_DIR ${RUNTIME_DIR}/lib/gc/basic) kamm@791: file(GLOB CORE_D ${RUNTIME_DIR}/lib/common/tango/core/*.d) kamm@791: file(GLOB CORE_C ${RUNTIME_DIR}/lib/common/tango/stdc/*.c) kamm@791: elseif(D_VERSION EQUAL 2) kamm@791: set(LDC_EXE ldc2) kamm@791: set(RUNTIME_CC druntime-core) kamm@791: set(RUNTIME_GC druntime-gc-basic) kamm@791: set(RUNTIME_DC druntime-rt-ldc) kamm@791: set(RUNTIME_AIO druntime-ldc) kamm@791: set(RUNTIME_DC_DIR ${RUNTIME_DIR}/src/compiler/ldc) kamm@791: set(RUNTIME_GC_DIR ${RUNTIME_DIR}/src/gc/basic) kamm@791: file(GLOB CORE_D ${RUNTIME_DIR}/src/common/core/*.d) kamm@791: file(GLOB CORE_C ${RUNTIME_DIR}/src/common/core/stdc/*.c) kamm@791: endif(D_VERSION EQUAL 1) kamm@786: kamm@786: # should only be necessary if run independently from ldc cmake project kamm@786: if(NOT LDC_LOC) kamm@786: if(NOT LDC_EXE) kamm@786: if(D_VERSION EQUAL 1) kamm@786: set(LDC_EXE ldc) kamm@786: elseif(D_VERSION EQUAL 2) kamm@786: set(LDC_EXE ldc2) kamm@786: endif(D_VERSION EQUAL 1) kamm@786: endif(NOT LDC_EXE) kamm@786: kamm@786: find_program(LDC_LOC ${LDC_EXE} ../bin DOC "path to ldc binary") kamm@786: if(NOT LDC_LOC) kamm@786: message(SEND_ERROR "ldc not found") kamm@786: endif(NOT LDC_LOC) kamm@786: endif(NOT LDC_LOC) kamm@786: kamm@786: configure_file(${PROJECT_PARENT_DIR}/${LDC_EXE}.conf.in ${PROJECT_BINARY_DIR}/../bin/${LDC_EXE}.conf) kamm@786: kamm@786: # patch runtime source, uses LDC_EXE for ldc / ldc2 kamm@786: find_program(PATCH_EXE patch DOC "path to patch tool") kamm@786: if(NOT PATCH_EXE) kamm@786: message(STATUS "patch tool not found, can't automatically patch runtime sources for ldc") kamm@786: else(NOT PATCH_EXE) kamm@786: add_custom_command( kamm@786: OUTPUT patch-runtime kamm@786: COMMAND ${PATCH_EXE} -t -N -p0 -i ${PROJECT_SOURCE_DIR}/${LDC_EXE}.diff kamm@786: WORKING_DIRECTORY ${RUNTIME_DIR} kamm@786: ) elrood@808: # rebuild cache to include sources added by patch kamm@791: add_custom_command( kamm@791: OUTPUT recache kamm@791: COMMAND ${CMAKE_COMMAND} -H${PROJECT_PARENT_DIR} -B${PROJECT_BINARY_DIR}/.. kamm@791: ) kamm@791: add_custom_target(patch DEPENDS patch-runtime recache ${LDC_IMPORTS}) kamm@786: endif(NOT PATCH_EXE) kamm@786: kamm@786: file(GLOB GC_D ${RUNTIME_GC_DIR}/*.d) kamm@786: file(GLOB_RECURSE DCRT_D ${RUNTIME_DC_DIR}/*.d) kamm@786: file(GLOB DCRT_C ${RUNTIME_DC_DIR}/*.c) kamm@786: kamm@786: # compile d file into outdir, include incdir, and append names of generated .o and .bc to outlist_o and _bc elrood@808: macro(dc INPUT_D OUTLIST_O OUTLIST_BC OUTDIR INCDIR MOREFLAGS) kamm@786: get_filename_component(BASENAME ${INPUT_D} NAME_WE) kamm@786: set(OUTPUT_O ${PROJECT_BINARY_DIR}/${OUTDIR}/${BASENAME}.o) kamm@786: set(OUTPUT_BC ${PROJECT_BINARY_DIR}/${OUTDIR}/${BASENAME}.bc) kamm@786: list(APPEND ${OUTLIST_O} ${OUTPUT_O}) kamm@786: list(APPEND ${OUTLIST_BC} ${OUTPUT_BC}) kamm@786: add_custom_command( kamm@786: OUTPUT kamm@786: ${OUTPUT_O} kamm@786: ${OUTPUT_BC} elrood@808: COMMAND ${LDC_LOC} -c -I${INCDIR} -output-bc ${INPUT_D} -of${OUTPUT_O} ${D_FLAGS} ${MOREFLAGS} kamm@786: DEPENDS ${LDC_LOC} kamm@786: ) kamm@786: endmacro(dc) kamm@786: kamm@791: # dc_dir include for core and gc only necessary with druntime kamm@786: foreach(f ${CORE_D}) elrood@808: dc(${f} CORE_O CORE_BC core ${RUNTIME_DC_DIR} "") kamm@786: endforeach(f) kamm@786: kamm@786: foreach(f ${GC_D}) elrood@808: dc(${f} GC_O GC_BC gc "${RUNTIME_GC_DIR} ${RUNTIME_DC_DIR}" "-disable-invariants") kamm@786: endforeach(f) kamm@786: kamm@786: foreach(f ${DCRT_D}) elrood@808: dc(${f} DCRT_O DCRT_BC dcrt ${RUNTIME_DC_DIR} "") kamm@786: endforeach(f) kamm@786: kamm@786: if(BUILD_SINGLE_LIB) kamm@786: add_library(${RUNTIME_AIO} ${CORE_O} ${CORE_C} ${GC_O} ${DCRT_O} ${DCRT_C}) kamm@786: set(LIBS ${RUNTIME_AIO}) kamm@786: else(BUILD_SINGLE_LIB) kamm@786: add_library(${RUNTIME_CC} ${CORE_O} ${CORE_C}) kamm@786: add_library(${RUNTIME_GC} ${GC_O}) kamm@786: add_library(${RUNTIME_DC} ${DCRT_O} ${DCRT_C}) kamm@786: set(LIBS kamm@786: ${RUNTIME_CC} kamm@786: ${RUNTIME_GC} kamm@786: ${RUNTIME_DC} kamm@786: ) kamm@786: endif(BUILD_SINGLE_LIB) kamm@786: kamm@786: if(BUILD_BC_LIBS) kamm@786: find_program(LLVM_AR_EXE llvm-ar ${LLVM_INSTDIR}/bin DOC "path to llvm-ar tool") kamm@786: if(NOT LLVM_AR_EXE) kamm@786: message(SEND_ERROR "llvm-ar not found") kamm@786: endif(NOT LLVM_AR_EXE) kamm@786: kamm@786: add_library(${RUNTIME_CC}-c ${CORE_C}) kamm@786: add_library(${RUNTIME_DC}-c ${DCRT_C}) kamm@786: list(APPEND LIBS kamm@786: ${RUNTIME_CC}-c kamm@786: ${RUNTIME_DC}-c kamm@786: ) kamm@786: add_custom_command( kamm@786: OUTPUT bclibs kamm@786: COMMAND ${LLVM_AR_EXE} rs lib${RUNTIME_CC}-bc.a ${CORE_BC} kamm@786: COMMAND ${LLVM_AR_EXE} rs lib${RUNTIME_GC}-bc.a ${GC_BC} kamm@786: # cannot parse genobj.bc if built with -g kamm@786: # COMMAND ${LLVM_AR_EXE} rs lib${RUNTIME_DC}-bc.a ${DCRT_BC} kamm@786: WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/../lib kamm@786: DEPENDS kamm@786: ${CORE_BC} kamm@786: ${GC_BC} kamm@786: ${DCRT_BC} kamm@786: ) kamm@786: set(BCLIBS bclibs) kamm@786: endif(BUILD_BC_LIBS) kamm@786: kamm@786: set_target_properties( kamm@786: ${LIBS} PROPERTIES kamm@786: LINKER_LANGUAGE C kamm@786: ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../lib kamm@786: LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../lib kamm@786: ) kamm@786: kamm@786: # BCLIBS is empty if BUILD_BC_LIBS is not selected kamm@786: add_custom_target(runtime DEPENDS ${LIBS} ${BCLIBS})