set(configure_cmake_args)
if(CMAKE_C_COMPILER)
list(APPEND configure_cmake_args "C_COMPILER" "${CMAKE_C_COMPILER}")
endif()
if(CMAKE_CXX_COMPILER)
list(APPEND configure_cmake_args "CXX_COMPILER" "${CMAKE_CXX_COMPILER}")
endif()
if(CMAKE_C_COMPILER_TARGET)
list(APPEND configure_cmake_args "C_COMPILER_TARGET" "${CMAKE_C_COMPILER_TARGET}")
endif()
if(CMAKE_CXX_COMPILER_TARGET)
list(APPEND configure_cmake_args "CXX_COMPILER_TARGET" "${CMAKE_CXX_COMPILER_TARGET}")
endif()
if(CMAKE_GENERATOR_PLATFORM)
list(APPEND configure_cmake_args "GENERATOR_PLATFORM" "${CMAKE_GENERATOR_PLATFORM}")
endif()
if(CMAKE_OSX_ARCHITECTURES)
list(APPEND configure_cmake_args OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}")
endif()
if(CMAKE_TOOLCHAIN_FILE)
list(APPEND configure_cmake_args TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}")
endif()
add_test(NAME "output_directory_build"
COMMAND
${CMAKE_COMMAND}
-P "${CMAKE_SOURCE_DIR}/test/ConfigureAndBuild.cmake"
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/output directory"
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/build"
GENERATOR "${CMAKE_GENERATOR}"
RUST_TOOLCHAIN "${Rust_TOOLCHAIN}"
CARGO_TARGET "${Rust_CARGO_TARGET}"
SYSTEM_NAME "${CMAKE_SYSTEM_NAME}"
${configure_cmake_args}
COMMAND_EXPAND_LISTS
)
set_tests_properties("output_directory_build" PROPERTIES FIXTURES_SETUP "build_fixture_output_directory")
if(CORROSION_TESTS_INSTALL_CORROSION)
set_tests_properties("output_directory_build" PROPERTIES FIXTURES_REQUIRED "fixture_corrosion_install")
endif()
foreach(output_approach targetprop var targetprop_pdb_fallback)
if(output_approach STREQUAL "targetprop")
set(rust_proj_suffix "1")
elseif(output_approach STREQUAL "var")
set(rust_proj_suffix "2")
elseif(output_approach STREQUAL "targetprop_pdb_fallback")
set(rust_proj_suffix "3")
else()
message(FATAL_ERROR "specify rust project suffix for new output approach ${output_approach}")
endif()
set(bin_name "rust_bin${rust_proj_suffix}${CMAKE_EXECUTABLE_SUFFIX}")
add_test(NAME output_directory_bin_${output_approach}
COMMAND
"${CMAKE_COMMAND}"
-P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/build/custom_bin_${output_approach}/${bin_name}"
)
set_tests_properties("output_directory_bin_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory")
set(lib_name "rust_lib${rust_proj_suffix}")
set(static_lib_name "${CMAKE_STATIC_LIBRARY_PREFIX}${lib_name}${CMAKE_STATIC_LIBRARY_SUFFIX}")
add_test(NAME output_directory_staticlib_${output_approach}
COMMAND
"${CMAKE_COMMAND}"
-P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/build/custom_archive_${output_approach}/${static_lib_name}"
)
set_tests_properties("output_directory_staticlib_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory")
if(MINGW)
# Windows-GNU defines "lib" as prefix for DLLs, but cargo creates foo.dll instead of libfoo.dll
set(dynamic_lib_prefix "")
else()
set(dynamic_lib_prefix "${CMAKE_SHARED_LIBRARY_PREFIX}")
endif()
set(dynamic_lib_name "${dynamic_lib_prefix}${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}")
add_test(NAME output_directory_cdylib_${output_approach}
COMMAND
"${CMAKE_COMMAND}"
-P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/build/custom_lib_${output_approach}/${dynamic_lib_name}"
)
set_tests_properties("output_directory_cdylib_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory")
if(WIN32)
set(implib_name ${CMAKE_IMPORT_LIBRARY_PREFIX}${lib_name}${CMAKE_IMPORT_LIBRARY_SUFFIX})
add_test(NAME output_directory_implib_${output_approach}
COMMAND
"${CMAKE_COMMAND}"
-P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake"
# Implib is an ARCHIVE artifact, see:
# https://cmake.org/cmake/help/v3.25/manual/cmake-buildsystem.7.html#archive-output-artifacts
"${CMAKE_CURRENT_BINARY_DIR}/build/custom_archive_${output_approach}/${implib_name}"
)
set_tests_properties("output_directory_implib_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory")
if(MSVC)
if(output_approach STREQUAL "targetprop")
set(expected_lib_pdb_path "custom_lib_pdb_targetprop")
set(expected_bin_pdb_path "custom_bin_pdb_targetprop")
elseif(output_approach STREQUAL "var")
# When using a CMAKE_ variable instead of a target property, both targets
# end up in the same directory.
set(expected_lib_pdb_path "custom_binlib_pdb_var")
set(expected_bin_pdb_path "custom_binlib_pdb_var")
elseif(output_approach STREQUAL "targetprop_pdb_fallback")
set(expected_lib_pdb_path "custom_lib_targetprop_pdb_fallback")
set(expected_bin_pdb_path "custom_bin_targetprop_pdb_fallback")
else()
message(FATAL_ERROR "specify rust project suffix for new output approach ${output_approach}")
endif()
set(lib_pdb_name "${lib_name}.pdb")
add_test(NAME output_directory_cdylib_pdb_${output_approach}
COMMAND
"${CMAKE_COMMAND}"
-P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/build/${expected_lib_pdb_path}/${lib_pdb_name}"
)
set_tests_properties("output_directory_cdylib_pdb_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory")
set(bin_pdb_name "rust_bin${rust_proj_suffix}.pdb")
add_test(NAME output_directory_bin_pdb_${output_approach}
COMMAND
"${CMAKE_COMMAND}"
-P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/build/${expected_bin_pdb_path}/${bin_pdb_name}"
)
set_tests_properties("output_directory_bin_pdb_${output_approach}" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory")
endif()
endif()
endforeach()
add_test(NAME postbuild_custom_command
COMMAND
"${CMAKE_COMMAND}"
-P "${CMAKE_CURRENT_SOURCE_DIR}/TestFileExists.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/build/another_dir/moved_bin"
)
set_tests_properties("postbuild_custom_command" PROPERTIES FIXTURES_REQUIRED "build_fixture_output_directory")
add_test(NAME "output_directory_cleanup" COMMAND "${CMAKE_COMMAND}" -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/build")
set_tests_properties("output_directory_cleanup" PROPERTIES FIXTURES_CLEANUP "build_fixture_output_directory")