diff --git a/test/corrosion_install/CMakeLists.txt b/test/corrosion_install/CMakeLists.txt index 0ebe4589..82ed76f2 100644 --- a/test/corrosion_install/CMakeLists.txt +++ b/test/corrosion_install/CMakeLists.txt @@ -9,3 +9,19 @@ if(NOT (CMAKE_CROSSCOMPILING AND MSVC)) "Hello World! I'm generated code" ) endif() + +# Todo: Fix and re-enable tests on Windows +if(NOT CMAKE_CROSSCOMPILING AND NOT WIN32) + corrosion_tests_add_test(install_lib "main-static;main-shared") + + set_tests_properties("install_lib_run_main-static" "install_lib_run_main-shared" + PROPERTIES PASS_REGULAR_EXPRESSION + "The sum is 11" + ) +endif() + +# Further tests we should add: +# - Test installing a Rust executable, that requires a (C/C++) shared library at runtime. +# Note: We should delete the build directory of the subproject +# before running the installed rust executable, to insure the shared library is loaded from the +# installed location and not from the build dir. \ No newline at end of file diff --git a/test/corrosion_install/install_lib/CMakeLists.txt b/test/corrosion_install/install_lib/CMakeLists.txt new file mode 100644 index 00000000..4587ec83 --- /dev/null +++ b/test/corrosion_install/install_lib/CMakeLists.txt @@ -0,0 +1,44 @@ +cmake_minimum_required(VERSION 3.15) +project(test_project VERSION 0.1.0) +include(ExternalProject) + +add_library(static_lib STATIC IMPORTED) +add_library(shared_lib SHARED IMPORTED) +set(install_prefix "${CMAKE_CURRENT_BINARY_DIR}/rust_lib") +set(static_lib_install_path "${install_prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}rust_lib${CMAKE_STATIC_LIBRARY_SUFFIX}") +set(shared_lib_install_path "${install_prefix}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}rust_lib${CMAKE_SHARED_LIBRARY_SUFFIX}") + + +set_target_properties(static_lib PROPERTIES + IMPORTED_LOCATION + "${static_lib_install_path}") + +set_target_properties(shared_lib PROPERTIES + IMPORTED_LOCATION + "${shared_lib_install_path}") + +add_executable(main-static main.cpp) +target_link_libraries(main-static PRIVATE static_lib) + +ExternalProject_Add( + rust_lib + PREFIX "${CMAKE_CURRENT_BINARY_DIR}/rust_lib" + SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/rust_lib" + CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${install_prefix}" + # INSTALL_BYPRODUCTS "${static_lib_install_path}" +) + +# Dummy target since INSTALL_BYPRODUCTS requires CMake 3.26 +add_custom_target(build_rust_project_dummy + COMMAND echo dummy + BYPRODUCTS "${static_lib_install_path}" "${shared_lib_install_path}" + DEPENDS rust_lib) + +add_dependencies(main-static build_rust_project_dummy) + +set(CMAKE_BUILD_RPATH ${install_prefix}/lib) +add_executable(main-shared main.cpp) +target_link_libraries(main-shared + PUBLIC shared_lib) + +add_dependencies(main-shared build_rust_project_dummy) diff --git a/test/corrosion_install/install_lib/main.cpp b/test/corrosion_install/install_lib/main.cpp new file mode 100644 index 00000000..ff1602b2 --- /dev/null +++ b/test/corrosion_install/install_lib/main.cpp @@ -0,0 +1,11 @@ +#include +#include +#include + +extern "C" uint64_t add(uint64_t a, uint64_t b); + +int main(int argc, char **argv) { + uint64_t sum = add(5, 6); + assert(sum == 11); + std::cout << "The sum is " << sum << std::endl; +} diff --git a/test/corrosion_install/install_lib/rust_lib/CMakeLists.txt b/test/corrosion_install/install_lib/rust_lib/CMakeLists.txt new file mode 100644 index 00000000..d05838ba --- /dev/null +++ b/test/corrosion_install/install_lib/rust_lib/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.15) +project(test_project VERSION 0.1.0) +include(../../../test_header.cmake) + +corrosion_import_crate(MANIFEST_PATH Cargo.toml) + +if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") + corrosion_add_target_local_rustflags(rust_lib "-Clink-arg=-Wl,-soname,librust_lib.so") + set_target_properties(rust_lib-shared PROPERTIES IMPORTED_SONAME librust_lib.so) +elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") + corrosion_add_target_local_rustflags(rust_lib -Clink-arg=-Wl,-install_name,@rpath/librust_lib.dylib,-current_version,1.0,-compatibility_version,1.0) + set_target_properties(rust_lib-shared PROPERTIES IMPORTED_NO_SONAME 0) + set_target_properties(rust_lib-shared PROPERTIES IMPORTED_SONAME librust_lib.dylib) +endif() + + +corrosion_install(TARGETS rust_lib) diff --git a/test/corrosion_install/install_lib/rust_lib/Cargo.lock b/test/corrosion_install/install_lib/rust_lib/Cargo.lock new file mode 100644 index 00000000..ecfa2443 --- /dev/null +++ b/test/corrosion_install/install_lib/rust_lib/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "rust_lib" +version = "0.1.0" diff --git a/test/corrosion_install/install_lib/rust_lib/Cargo.toml b/test/corrosion_install/install_lib/rust_lib/Cargo.toml new file mode 100644 index 00000000..eb4a0752 --- /dev/null +++ b/test/corrosion_install/install_lib/rust_lib/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "rust_lib" +version = "0.1.0" +edition = "2018" + +[dependencies] + +[lib] +crate-type = ["staticlib", "cdylib"] diff --git a/test/corrosion_install/install_lib/rust_lib/src/lib.rs b/test/corrosion_install/install_lib/rust_lib/src/lib.rs new file mode 100644 index 00000000..76d40c6c --- /dev/null +++ b/test/corrosion_install/install_lib/rust_lib/src/lib.rs @@ -0,0 +1,5 @@ + +#[no_mangle] +pub extern "C" fn add(left: u64, right: u64) -> u64 { + left + right +}