|
25 | 25 | # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
26 | 26 | # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF |
27 | 27 | # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 28 | + |
| 29 | +if(ARCH_ID MATCHES "x86-64" OR ARCH_ID MATCHES "amd64") |
| 30 | + set(RUST_ARCH "x86_64") |
| 31 | +elseif(ARCH_ID MATCHES "(arm64|armv8a|armv8-a)") |
| 32 | + set(RUST_ARCH "aarch64") |
| 33 | +elseif(ARCH_ID MATCHES "armv7-a") |
| 34 | + set(RUST_ARCH "armv7") |
| 35 | +elseif(ARCH_ID MATCHES "i386") |
| 36 | + set(RUST_ARCH "i686") |
| 37 | +elseif(ARCH_ID MATCHES "riscv64") |
| 38 | + set(RUST_ARCH "riscv64gc") |
| 39 | +else() |
| 40 | + set(RUST_ARCH "${ARCH_ID}") |
| 41 | +endif() |
| 42 | + |
| 43 | +if(MINGW) |
| 44 | + set(RUST_PLATFORM "pc-windows") |
| 45 | + set(RUST_TOOLCHAIN "-gnu") |
| 46 | +elseif(MSVC) |
| 47 | + set(RUST_PLATFORM "pc-windows") |
| 48 | + set(RUST_TOOLCHAIN "-msvc") |
| 49 | +elseif(APPLE) |
| 50 | + set(RUST_PLATFORM "apple-darwin") |
| 51 | + set(RUST_TOOLCHAIN "") |
| 52 | +elseif(FREEBSD) |
| 53 | + set(RUST_PLATFORM "unknown-freebsd") |
| 54 | + set(RUST_TOOLCHAIN "") |
| 55 | +elseif(OPENBSD) |
| 56 | + set(RUST_PLATFORM "unknown-openbsd") |
| 57 | + set(RUST_TOOLCHAIN "") |
| 58 | +elseif(ANDROID) |
| 59 | + set(RUST_PLATFORM "linux-android") |
| 60 | + if(RUST_ARCH MATCHES "(arm|armv7)") |
| 61 | + set(RUST_TOOLCHAIN "eabi") |
| 62 | + else() |
| 63 | + set(RUST_TOOLCHAIN "") |
| 64 | + endif() |
| 65 | +elseif(DRAGONFLY) |
| 66 | + set(RUST_PLATFORM "unknown-dragonfly") |
| 67 | + set(RUST_TOOLCHAIN "") |
| 68 | +elseif(CMAKE_SYSTEM_NAME MATCHES "(SunOS|Solaris)") |
| 69 | + if(RUST_ARCH MATCHES "x86_64") |
| 70 | + set(RUST_PLATFORM "pc-solaris") |
| 71 | + set(RUST_TOOLCHAIN "") |
| 72 | + elseif(RUST_ARCH MATCHES "sparcv9") |
| 73 | + set(RUST_PLATFORM "sun-solaris") |
| 74 | + set(RUST_TOOLCHAIN "") |
| 75 | + endif() |
| 76 | +else() |
| 77 | + set(RUST_PLATFORM "unknown-linux") |
| 78 | + if(RUST_ARCH MATCHES "armv7") |
| 79 | + # Rust does support non-HF, yet Monero assumes HF for armv7 |
| 80 | + set(RUST_TOOLCHAIN "-gnueabihf") |
| 81 | + else() |
| 82 | + set(RUST_TOOLCHAIN "-gnu") |
| 83 | + endif() |
| 84 | +endif() |
| 85 | + |
| 86 | +set(RUST_TARGET "${RUST_ARCH}-${RUST_PLATFORM}${RUST_TOOLCHAIN}") |
| 87 | +message(STATUS "Using Rust target ${RUST_TARGET}") |
| 88 | + |
| 89 | +if(CMAKE_BUILD_TYPE STREQUAL "Debug") |
| 90 | + if(SANITIZE) |
| 91 | + message(STATUS "Using Rust ASAN") |
| 92 | + # Rust ASAN is an experimental feature included in nightly at time of writing |
| 93 | + set(CARGO_CMD RUSTFLAGS=-Zsanitizer=address cargo +nightly build --target "${RUST_TARGET}") |
| 94 | + else() |
| 95 | + set(CARGO_CMD cargo build --target "${RUST_TARGET}") |
| 96 | + endif() |
| 97 | + set(TARGET_DIR "debug") |
| 98 | +else () |
| 99 | + set(CARGO_CMD cargo build --target "${RUST_TARGET}" --release) |
| 100 | + set(TARGET_DIR "release") |
| 101 | +endif () |
| 102 | + |
| 103 | +set(FCMP_PP_RUST_HEADER_DIR "${MONERO_GENERATED_HEADERS_DIR}/fcmp_pp_rust") |
| 104 | +set(FCMP_PP_RUST_HEADER "${FCMP_PP_RUST_HEADER_DIR}/fcmp++.h") |
| 105 | +set(FCMP_PP_RUST_LIB "${CMAKE_CURRENT_BINARY_DIR}/libfcmp_pp_rust.a") |
| 106 | + |
| 107 | +# Removing OUTPUT files makes sure custom command runs every time |
| 108 | +file(REMOVE_RECURSE "${FCMP_PP_RUST_HEADER_DIR}") |
| 109 | +file(MAKE_DIRECTORY "${FCMP_PP_RUST_HEADER_DIR}") |
| 110 | + |
| 111 | +file(REMOVE "${FCMP_PP_RUST_LIB}") |
| 112 | + |
| 113 | +add_custom_command( |
| 114 | + COMMENT "Building fcmp++ rust lib" |
| 115 | + OUTPUT ${FCMP_PP_RUST_HEADER} |
| 116 | + OUTPUT ${FCMP_PP_RUST_LIB} |
| 117 | + COMMAND ${CMAKE_COMMAND} -E env CARGO_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR} ${CARGO_CMD} |
| 118 | + COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/fcmp++.h ${FCMP_PP_RUST_HEADER} |
| 119 | + COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/${RUST_TARGET}/${TARGET_DIR}/libfcmp_pp_rust.a ${FCMP_PP_RUST_LIB} |
| 120 | + COMMAND echo "Finished copying fcmp++ rust targets" |
| 121 | + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} |
| 122 | + VERBATIM |
| 123 | +) |
| 124 | + |
| 125 | +add_custom_target(fcmp_pp_rust DEPENDS ${FCMP_PP_RUST_LIB}) |
0 commit comments