1 2#################################### 3function(backend NAME DIR TARGET) 4 message(STATUS "In target ${TARGET}: include ${NAME} backend") 5 target_compile_definitions (${TARGET} PRIVATE -D${NAME}_BUILD) 6 if (NOT "${DIR}" STREQUAL "") 7 file (GLOB BACKEND_SRC ${SRCDIR}/generator/${DIR}/*.cpp ${SRCDIR}/generator/${DIR}/*.hh) 8 target_sources (${TARGET} PRIVATE ${BACKEND_SRC}) 9 target_include_directories (${TARGET} PRIVATE ${SRCDIR}/generator/${DIR}) 10 endif() 11endfunction() 12 13#################################### 14function (scan_backends TARGET FLAG) 15 string (FIND "${C_BACKEND}" ${FLAG} POS) 16 if (${POS} GREATER -1) 17 backend (C c ${TARGET}) 18 endif() 19 string (FIND "${CPP_BACKEND}" ${FLAG} POS) 20 if (${POS} GREATER -1) 21 backend (CPP cpp ${TARGET}) 22 endif() 23 string (FIND "${CSHARP_BACKEND}" ${FLAG} POS) 24 if (${POS} GREATER -1) 25 backend (CSHARP csharp ${TARGET}) 26 endif() 27 string (FIND "${DLANG_BACKEND}" ${FLAG} POS) 28 if (${POS} GREATER -1) 29 backend (DLANG dlang ${TARGET}) 30 endif() 31 string (FIND "${FIR_BACKEND}" ${FLAG} POS) 32 if (${POS} GREATER -1) 33 backend (FIR "" ${TARGET}) 34 endif() 35 string (FIND "${INTERP_BACKEND}" ${FLAG} POS) 36 if (${POS} GREATER -1) 37 backend (INTERP interpreter ${TARGET}) 38 endif() 39 string (FIND "${JAVA_BACKEND}" ${FLAG} POS) 40 if (${POS} GREATER -1) 41 backend (JAVA java ${TARGET}) 42 endif() 43 string (FIND "${JULIA_BACKEND}" ${FLAG} POS) 44 if (${POS} GREATER -1) 45 backend (JULIA julia ${TARGET}) 46 endif() 47 string (FIND "${OLDCPP_BACKEND}" ${FLAG} POS) 48 if (${POS} GREATER -1) 49 backend (OCPP "" ${TARGET}) 50 endif() 51 string (FIND "${RUST_BACKEND}" ${FLAG} POS) 52 if (${POS} GREATER -1) 53 backend (RUST rust ${TARGET}) 54 endif() 55 string (FIND "${SOUL_BACKEND}" ${FLAG} POS) 56 if (${POS} GREATER -1) 57 backend (SOUL soul ${TARGET}) 58 endif() 59 string (FIND "${WASM_BACKEND}" ${FLAG} POS) 60 if (${POS} GREATER -1) 61 backend (WASM wasm ${TARGET}) 62 endif() 63 string (FIND "${LLVM_BACKEND}" ${FLAG} POS) 64 if (${POS} GREATER -1) 65 backend (LLVM llvm ${TARGET}) 66 target_compile_definitions (${TARGET} PRIVATE -D${LLVM_VERSION}) 67 target_include_directories (${TARGET} PRIVATE ${SRCDIR}/generator/c ${SRCDIR}/generator/cpp ${LLVM_INCLUDE_DIRS}) 68 endif() 69endfunction() 70 71#################################### 72# Manual LLVM scan 73macro (llvm_config) 74 if ( NOT DEFINED LLVM_CONFIG) 75 set (LLVM_CONFIG llvm-config) 76 endif() 77 find_program (LC ${LLVM_CONFIG}) 78 if (${LC} STREQUAL LC-NOTFOUND) 79 message (FATAL_ERROR "Cannot find program ${LLVM_CONFIG} (llvm-config or derived expected)") 80 endif() 81 execute_process (COMMAND ${LLVM_CONFIG} --version OUTPUT_VARIABLE LLVM_VERSION) 82 string ( STRIP ${LLVM_VERSION} LLVM_PACKAGE_VERSION ) 83 message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") 84 85 execute_process (COMMAND ${LLVM_CONFIG} --includedir OUTPUT_VARIABLE LLVM_INCLUDE) 86 string ( STRIP ${LLVM_INCLUDE} LLVM_INCLUDE_DIRS ) 87 execute_process (COMMAND ${LLVM_CONFIG} --ldflags OUTPUT_VARIABLE LLVM_LDFLAGS_TMP) 88 string ( STRIP ${LLVM_LDFLAGS_TMP} LLVM_LD_FLAGS ) 89 execute_process (COMMAND ${LLVM_CONFIG} --libs OUTPUT_VARIABLE LLVM_LIBS_TMP) 90 string ( STRIP ${LLVM_LIBS_TMP} LLVM_LIBS_TMP2 ) 91 string ( REPLACE "C:\\Program Files\\LLVM\\lib\\" "" LLVM_LIBS ${LLVM_LIBS_TMP2}) 92 execute_process (COMMAND ${LLVM_CONFIG} --system-libs OUTPUT_VARIABLE LLVM_SYS_LIBS_TMP) 93 string ( STRIP ${LLVM_SYS_LIBS_TMP} LLVM_SYS_LIBS) 94 95 string ( APPEND LLVM_LIBS " ${LLVM_SYS_LIBS}") 96 string ( REPLACE " " ";" LLVM_LIBS ${LLVM_LIBS} ) 97endmacro() 98 99#################################### 100# cmake LLVM scan 101macro (llvm_cmake) 102 find_package(LLVM REQUIRED CONFIG) 103 if (COMMAND llvm_map_components_to_libnames) 104 message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") 105 message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") 106 # Find the libraries that correspond to the LLVM components that we wish to use 107 llvm_map_components_to_libnames(LLVM_LIBS all) 108# list(REMOVE_ITEM LLVM_LIBS LTO) 109 else() 110 llvm_config() 111 endif() 112endmacro() 113 114 115#################################### 116macro (include_llvm) 117 set (INCLUDE_LLVM off) 118 if (LLVM_BACKEND) 119 string (FIND "${LLVM_BACKEND}" "STATIC" POS) 120 if (${POS} GREATER -1 AND INCLUDE_STATIC) 121 set (INCLUDE_LLVM on) 122 endif() 123 string (FIND "${LLVM_BACKEND}" "DYNAMIC" POS) 124 if (${POS} GREATER -1 AND INCLUDE_DYNAMIC) 125 set (INCLUDE_LLVM on) 126 endif() 127 string (FIND "${LLVM_BACKEND}" "COMPILER" POS) 128 if (${POS} GREATER -1) 129 set (INCLUDE_LLVM on) 130 endif() 131 endif() 132endmacro() 133 134include_llvm() 135