|
| 1 | +cmake_minimum_required(VERSION 3.20) |
| 2 | + |
| 3 | +set(CMAKE_CXX_STANDARD 23) |
| 4 | +set(CMAKE_CXX_EXTENSIONS OFF) |
| 5 | +set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 6 | + |
| 7 | +project(Cpp2Rust) |
| 8 | + |
| 9 | +if (NOT CMAKE_BUILD_TYPE) |
| 10 | + set(CMAKE_BUILD_TYPE Debug) |
| 11 | +endif() |
| 12 | + |
| 13 | +if (MSVC) |
| 14 | + message(FATAL_ERROR "MSVC is not supported") |
| 15 | +else() |
| 16 | + # Set up the flags for GCC/Clang |
| 17 | + set(CMAKE_CXX_FLAGS_RELEASE "-O3 ${CMAKE_CXX_FLAGS_RELEASE}") |
| 18 | + set(CMAKE_CXX_FLAGS_DEBUG "-g -Og ${CMAKE_CXX_FLAGS_DEBUG}") |
| 19 | + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") |
| 20 | + set(CMAKE_CXX_FLAGS "-Wall -Werror ${CMAKE_CXX_FLAGS}") |
| 21 | + |
| 22 | + # Sanitizers |
| 23 | + # set(CMAKE_CXX_FLAGS_DEBUG "-fsanitize=address -fsanitize=undefined -fsanitize=leak ${CMAKE_CXX_FLAGS_DEBUG}") |
| 24 | + # set(CMAKE_EXE_LINKER_FLAGS_DEBUG "-fsanitize=address -fsanitize=undefined -fsanitize=leak ${CMAKE_EXE_LINKER_FLAGS_DEBUG}") |
| 25 | +endif() |
| 26 | + |
| 27 | +find_package(LLVM REQUIRED CONFIG) |
| 28 | +find_package(Clang REQUIRED CONFIG) |
| 29 | +message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}") |
| 30 | +message(STATUS "Using ClangConfig.cmake in: ${Clang_DIR}") |
| 31 | + |
| 32 | +list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") |
| 33 | +list(APPEND CMAKE_MODULE_PATH "${CLANG_CMAKE_DIR}") |
| 34 | +include(AddLLVM) |
| 35 | +include(AddClang) |
| 36 | + |
| 37 | +if (NOT CMAKE_CXX_COMPILER MATCHES "clang") |
| 38 | + set(CMAKE_CXX_COMPILER "${CLANG_CMAKE_DIR}/../../../bin/clang++") |
| 39 | +endif() |
| 40 | + |
| 41 | +message(STATUS "C++ flags: ${CMAKE_CXX_FLAGS}") |
| 42 | +message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") |
| 43 | +message(STATUS "C Compiler: ${CMAKE_C_COMPILER}") |
| 44 | +message(STATUS "C++ Compiler: ${CMAKE_CXX_COMPILER}") |
| 45 | + |
| 46 | +execute_process( |
| 47 | + COMMAND ${CMAKE_CXX_COMPILER} --version |
| 48 | + OUTPUT_VARIABLE CLANG_OUTPUT |
| 49 | + OUTPUT_STRIP_TRAILING_WHITESPACE |
| 50 | +) |
| 51 | +message(STATUS ${CLANG_OUTPUT}) |
| 52 | + |
| 53 | +execute_process( |
| 54 | + COMMAND rustc --version --verbose |
| 55 | + OUTPUT_VARIABLE RUSTC_OUTPUT |
| 56 | + OUTPUT_STRIP_TRAILING_WHITESPACE |
| 57 | +) |
| 58 | +string(REGEX MATCH "LLVM version: .*" RUSTC_LLVM_VERSION_LINE "${RUSTC_OUTPUT}") |
| 59 | +string(REGEX REPLACE "LLVM version: " "" RUSTC_LLVM_VERSION "${RUSTC_LLVM_VERSION_LINE}") |
| 60 | +message(STATUS "rustc using LLVM ${RUSTC_LLVM_VERSION}") |
| 61 | + |
| 62 | +if (NOT RUSTC_LLVM_VERSION STREQUAL LLVM_PACKAGE_VERSION) |
| 63 | + message(WARNING "The LLVM versions used by rustc and clang are different!") |
| 64 | +endif() |
| 65 | + |
| 66 | +set(RUST_STABLE_VERSION "1.94.0") |
| 67 | + |
| 68 | +function(write_rust_toolchain DIR) |
| 69 | + set(_content "[toolchain]\nchannel = \"${RUST_STABLE_VERSION}\"\n") |
| 70 | + set(_file ${DIR}/rust-toolchain.toml) |
| 71 | + if (EXISTS ${_file}) |
| 72 | + file(READ ${_file} _existing) |
| 73 | + endif() |
| 74 | + if (NOT "${_existing}" STREQUAL "${_content}") |
| 75 | + file(WRITE ${_file} ${_content}) |
| 76 | + endif() |
| 77 | +endfunction() |
| 78 | + |
| 79 | +# rule_preprocessor uses nightly |
| 80 | +foreach(_dir libcc2rs rules) |
| 81 | + write_rust_toolchain(${CMAKE_SOURCE_DIR}/${_dir}) |
| 82 | +endforeach() |
| 83 | + |
| 84 | +add_custom_target("install-rust-toolchain" |
| 85 | + COMMAND rustup toolchain install ${RUST_STABLE_VERSION} |
| 86 | + USES_TERMINAL |
| 87 | + ) |
| 88 | + |
| 89 | +add_subdirectory(cpp2rust) |
| 90 | +add_subdirectory(libcc2rs) |
| 91 | +add_subdirectory(tests) |
| 92 | + |
| 93 | +find_program(CLANG_FORMAT clang-format-22 clang-format) |
| 94 | +file(GLOB_RECURSE ALL_CXX_SOURCES |
| 95 | + cpp2rust/*.cpp cpp2rust/*.h tests/*.cpp) |
| 96 | + |
| 97 | +add_custom_target("format" |
| 98 | + COMMAND ${CLANG_FORMAT} -i ${ALL_CXX_SOURCES} |
| 99 | + COMMAND rustup run ${RUST_STABLE_VERSION} cargo fmt --manifest-path ${PROJECT_SOURCE_DIR}/rules/Cargo.toml |
| 100 | + COMMAND rustup run ${RUST_STABLE_VERSION} cargo fmt --manifest-path ${PROJECT_SOURCE_DIR}/rule_preprocessor/Cargo.toml |
| 101 | + COMMAND rustup run ${RUST_STABLE_VERSION} cargo fmt --manifest-path ${PROJECT_SOURCE_DIR}/libcc2rs/Cargo.toml |
| 102 | + DEPENDS "install-rust-toolchain" |
| 103 | + COMMENT "Running clang-format and cargo fmt on all source files" |
| 104 | + VERBATIM |
| 105 | + ) |
| 106 | + |
| 107 | +if (NOT LIT_FLAGS) |
| 108 | + set(LIT_FLAGS "-s;--show-xfail;-vv") |
| 109 | +endif() |
| 110 | + |
| 111 | +add_custom_target("check-libcc2rs" |
| 112 | + COMMAND cargo test |
| 113 | + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/libcc2rs" |
| 114 | + DEPENDS install-rust-toolchain |
| 115 | + USES_TERMINAL |
| 116 | + ) |
| 117 | + |
| 118 | +add_custom_target("check-unit" |
| 119 | + COMMAND "python3" |
| 120 | + "${PROJECT_SOURCE_DIR}/tests/lit/lit.py" |
| 121 | + ${LIT_FLAGS} |
| 122 | + "${PROJECT_SOURCE_DIR}/tests/unit" |
| 123 | + "${PROJECT_SOURCE_DIR}/tests/ub" |
| 124 | + DEPENDS cpp2rust libcc2rs |
| 125 | + USES_TERMINAL |
| 126 | + ) |
| 127 | + |
| 128 | +add_custom_target("check-benchmarks" |
| 129 | + COMMAND "python3" |
| 130 | + "${PROJECT_SOURCE_DIR}/tests/lit/lit.py" |
| 131 | + ${LIT_FLAGS} |
| 132 | + "${PROJECT_SOURCE_DIR}/tests/benchmarks" |
| 133 | + DEPENDS cpp2rust libcc2rs |
| 134 | + USES_TERMINAL |
| 135 | + ) |
| 136 | + |
| 137 | +add_custom_target("check" |
| 138 | + DEPENDS check-libcc2rs check-unit |
| 139 | + ) |
| 140 | + |
| 141 | +add_custom_target("gen-rules" |
| 142 | + COMMAND find ${PROJECT_SOURCE_DIR}/rules -name "ir*.json" -delete |
| 143 | + COMMAND cargo build |
| 144 | + COMMAND ${CMAKE_COMMAND} -E chdir ${PROJECT_SOURCE_DIR}/rule_preprocessor |
| 145 | + ${CMAKE_COMMAND} -E env |
| 146 | + CARGO_TARGET_DIR=${PROJECT_SOURCE_DIR}/rule_preprocessor/target |
| 147 | + cargo clean |
| 148 | + COMMAND ${CMAKE_COMMAND} -E chdir ${PROJECT_SOURCE_DIR}/rule_preprocessor |
| 149 | + ${CMAKE_COMMAND} -E env |
| 150 | + CARGO_TARGET_DIR=${PROJECT_SOURCE_DIR}/rule_preprocessor/target |
| 151 | + cargo run |
| 152 | + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/rules" |
| 153 | + DEPENDS install-rust-toolchain |
| 154 | + USES_TERMINAL |
| 155 | + ) |
0 commit comments