diff --git a/cmake/Corrosion.cmake b/cmake/Corrosion.cmake index b2c39992..ab2f79cb 100644 --- a/cmake/Corrosion.cmake +++ b/cmake/Corrosion.cmake @@ -80,6 +80,7 @@ function(_corrosion_set_imported_location_deferred target_name base_property out else() set(output_dir_prop_target_name "${target_name}") endif() + string(REPLACE "__" "::" output_dir_prop_target_name ${output_dir_prop_target_name}) # Append .exe suffix for executable by-products if the target is windows or if it's a host # build and the host is Windows. @@ -165,6 +166,7 @@ endfunction() # artifact. # - filename of the artifact. function(_corrosion_set_imported_location target_name base_property output_directory_property filename) + message(STATUS ${target_name}) cmake_language(EVAL CODE " cmake_language(DEFER CALL @@ -182,6 +184,8 @@ function(_corrosion_copy_byproduct_deferred target_name output_dir_prop_names ca message(FATAL_ERROR "Unexpected additional arguments") endif() + string(REPLACE "::" "__" target_name_cmake_underscore ${target_name}) + foreach(output_dir_prop_name ${output_dir_prop_names}) get_target_property(output_dir ${target_name} "${output_dir_prop_name}") if(output_dir) @@ -249,7 +253,7 @@ function(_corrosion_copy_byproduct_deferred target_name output_dir_prop_names ca list(TRANSFORM src_file_names PREPEND "${cargo_build_dir}/") list(TRANSFORM file_names PREPEND "${output_dir}/" OUTPUT_VARIABLE dst_file_names) message(DEBUG "Adding command to copy byproducts `${file_names}` to ${dst_file_names}") - add_custom_command(TARGET _cargo-build_${target_name} + add_custom_command(TARGET _cargo-build_${target_name_cmake_underscore} POST_BUILD # output_dir may contain a Generator expression. COMMAND ${CMAKE_COMMAND} -E make_directory "${output_dir}" @@ -294,6 +298,7 @@ function(_corrosion_add_library_target) set(ONE_VALUE_KEYWORDS WORKSPACE_MANIFEST_PATH TARGET_NAME + TARGET_NAME_CMAKE OUT_ARCHIVE_OUTPUT_BYPRODUCTS OUT_SHARED_LIB_BYPRODUCTS OUT_PDB_BYPRODUCT @@ -327,6 +332,8 @@ function(_corrosion_add_library_target) endif() set(workspace_manifest_path "${CALT_WORKSPACE_MANIFEST_PATH}") set(target_name "${CALT_TARGET_NAME}") + set(target_name_cmake "${CALT_TARGET_NAME_CMAKE}") + string(REPLACE "::" "__" target_name_cmake_underscore ${target_name_cmake}) set(is_windows "") set(is_windows_gnu "") @@ -388,26 +395,26 @@ function(_corrosion_add_library_target) set("${CALT_OUT_ARCHIVE_OUTPUT_BYPRODUCTS}" "${archive_output_byproducts}" PARENT_SCOPE) if(has_staticlib) - add_library(${target_name}-static STATIC IMPORTED GLOBAL) - add_dependencies(${target_name}-static cargo-build_${target_name}) - set_target_properties(${target_name}-static PROPERTIES COR_FILE_NAME ${static_lib_name}) + add_library(${target_name_cmake_underscore}-static STATIC IMPORTED GLOBAL) + add_dependencies(${target_name_cmake_underscore}-static cargo-build_${target_name_cmake_underscore}) + set_target_properties(${target_name_cmake_underscore}-static PROPERTIES COR_FILE_NAME ${static_lib_name}) - _corrosion_set_imported_location("${target_name}-static" "IMPORTED_LOCATION" + _corrosion_set_imported_location("${target_name_cmake_underscore}-static" "IMPORTED_LOCATION" "ARCHIVE_OUTPUT_DIRECTORY" "${static_lib_name}") # Todo: NO_STD target property? if(NOT COR_NO_STD) set_property( - TARGET ${target_name}-static + TARGET ${target_name_cmake_underscore}-static PROPERTY INTERFACE_LINK_LIBRARIES ${Rust_CARGO_TARGET_LINK_NATIVE_LIBS} ) set_property( - TARGET ${target_name}-static + TARGET ${target_name_cmake_underscore}-static PROPERTY INTERFACE_LINK_OPTIONS ${Rust_CARGO_TARGET_LINK_OPTIONS} ) if(is_macos) - set_property(TARGET ${target_name}-static + set_property(TARGET ${target_name_cmake_underscore}-static PROPERTY INTERFACE_LINK_DIRECTORIES "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib" ) endif() @@ -415,29 +422,29 @@ function(_corrosion_add_library_target) endif() if(has_cdylib) - add_library(${target_name}-shared SHARED IMPORTED GLOBAL) - add_dependencies(${target_name}-shared cargo-build_${target_name}) - set_target_properties(${target_name}-shared PROPERTIES COR_FILE_NAME ${dynamic_lib_name}) + add_library(${target_name_cmake_underscore}-shared SHARED IMPORTED GLOBAL) + add_dependencies(${target_name_cmake_underscore}-shared cargo-build_${target_name_cmake_underscore}) + set_target_properties(${target_name_cmake_underscore}-shared PROPERTIES COR_FILE_NAME ${dynamic_lib_name}) # Todo: (Not new issue): What about IMPORTED_SONAME and IMPORTED_NO_SYSTEM? - _corrosion_set_imported_location("${target_name}-shared" "IMPORTED_LOCATION" + _corrosion_set_imported_location("${target_name_cmake_underscore}-shared" "IMPORTED_LOCATION" "LIBRARY_OUTPUT_DIRECTORY" "${dynamic_lib_name}" ) # In the future we would probably prefer to let Rust set the soname for packages >= 1.0. # This is tracked in issue #333. - set_target_properties(${target_name}-shared PROPERTIES IMPORTED_NO_SONAME TRUE) + set_target_properties(${target_name_cmake_underscore}-shared PROPERTIES IMPORTED_NO_SONAME TRUE) if(is_windows) - _corrosion_set_imported_location("${target_name}-shared" "IMPORTED_IMPLIB" + _corrosion_set_imported_location("${target_name_cmake_underscore}-shared" "IMPORTED_IMPLIB" "ARCHIVE_OUTPUT_DIRECTORY" "${implib_name}" ) - set_target_properties(${target_name}-shared PROPERTIES COR_IMPLIB_FILE_NAME ${implib_name}) + set_target_properties(${target_name_cmake_underscore}-shared PROPERTIES COR_IMPLIB_FILE_NAME ${implib_name}) endif() if(is_macos) - set_property(TARGET ${target_name}-shared + set_property(TARGET ${target_name_cmake_underscore}-shared PROPERTY INTERFACE_LINK_DIRECTORIES "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib" ) endif() @@ -445,22 +452,24 @@ function(_corrosion_add_library_target) if(has_cdylib AND has_staticlib) if(BUILD_SHARED_LIBS) - target_link_libraries(${target_name} INTERFACE ${target_name}-shared) + target_link_libraries(${target_name_cmake} INTERFACE ${target_name_cmake_underscore}-shared) else() - target_link_libraries(${target_name} INTERFACE ${target_name}-static) + target_link_libraries(${target_name_cmake} INTERFACE ${target_name_cmake_underscore}-static) endif() elseif(has_cdylib) - target_link_libraries(${target_name} INTERFACE ${target_name}-shared) + target_link_libraries(${target_name_cmake} INTERFACE ${target_name_cmake_underscore}-shared) else() - target_link_libraries(${target_name} INTERFACE ${target_name}-static) + target_link_libraries(${target_name_cmake} INTERFACE ${target_name_cmake_underscore}-static) endif() endfunction() -function(_corrosion_add_bin_target workspace_manifest_path bin_name out_bin_byproduct out_pdb_byproduct) +function(_corrosion_add_bin_target workspace_manifest_path bin_name target_name_cmake out_bin_byproduct out_pdb_byproduct) if(NOT bin_name) message(FATAL_ERROR "No bin_name in _corrosion_add_bin_target for target ${target_name}") endif() + string(REPLACE "::" "__" target_name_cmake_underscore ${target_name_cmake}) + string(REPLACE "-" "_" bin_name_underscore "${bin_name}") set(pdb_name "${bin_name_underscore}.pdb") @@ -473,15 +482,15 @@ function(_corrosion_add_bin_target workspace_manifest_path bin_name out_bin_bypr # target property set(bin_filename "${bin_name}") set(${out_bin_byproduct} "${bin_filename}" PARENT_SCOPE) - add_dependencies(${bin_name} cargo-build_${bin_name}) + add_dependencies(${target_name_cmake} cargo-build_${target_name_cmake_underscore}) if(Rust_CARGO_TARGET_OS STREQUAL "darwin") - set_property(TARGET ${bin_name} + set_property(TARGET ${target_name_cmake} PROPERTY INTERFACE_LINK_DIRECTORIES "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib" ) endif() - _corrosion_set_imported_location("${bin_name}" "IMPORTED_LOCATION" + _corrosion_set_imported_location("${target_name_cmake}" "IMPORTED_LOCATION" "RUNTIME_OUTPUT_DIRECTORY" "${bin_filename}" ) @@ -531,7 +540,7 @@ set(_CORR_PROP_HOST_BUILD CORROSION_USE_HOST_BUILD CACHE INTERNAL "") # A target may be either a specific bin function(_add_cargo_build out_cargo_build_out_dir) set(options NO_LINKER_OVERRIDE) - set(one_value_args PACKAGE TARGET MANIFEST_PATH WORKSPACE_MANIFEST_PATH) + set(one_value_args PACKAGE TARGET TARGET_NAME_CMAKE MANIFEST_PATH WORKSPACE_MANIFEST_PATH) set(multi_value_args BYPRODUCTS TARGET_KINDS) cmake_parse_arguments( ACB @@ -551,6 +560,8 @@ function(_add_cargo_build out_cargo_build_out_dir) set(package_name "${ACB_PACKAGE}") set(target_name "${ACB_TARGET}") + set(target_name_cmake "${ACB_TARGET_NAME_CMAKE}") + string(REPLACE "::" "__" target_name_cmake_underscore ${target_name_cmake}) set(path_to_toml "${ACB_MANIFEST_PATH}") set(target_kinds "${ACB_TARGET_KINDS}") set(workspace_manifest_path "${ACB_WORKSPACE_MANIFEST_PATH}") @@ -602,22 +613,22 @@ function(_add_cargo_build out_cargo_build_out_dir) set(no_default_features_arg --no-default-features) endif() - set(global_rustflags_target_property "$>") - set(local_rustflags_target_property "$>") + set(global_rustflags_target_property "$>") + set(local_rustflags_target_property "$>") # todo: this probably should be TARGET_GENEX_EVAL - set(features_target_property "$>") + set(features_target_property "$>") set(features_genex "$<$:--features=$>>") # target property overrides corrosion_import_crate argument - set(all_features_target_property "$>") + set(all_features_target_property "$>") set(all_features_arg "$<$:--all-features>") - set(no_default_features_target_property "$>") + set(no_default_features_target_property "$>") set(no_default_features_arg "$<$:--no-default-features>") - set(build_env_variable_genex "$>") - set(hostbuild_override "$>") + set(build_env_variable_genex "$>") + set(hostbuild_override "$>") set(if_not_host_build_condition "$") set(corrosion_link_args "$<${if_not_host_build_condition}:${corrosion_link_args}>") @@ -629,16 +640,16 @@ function(_add_cargo_build out_cargo_build_out_dir) _corrosion_strip_target_triple(${_CORROSION_RUST_CARGO_TARGET} stripped_target_triple) set(target_artifact_dir "$") - set(flags_genex "$>") + set(flags_genex "$>") - set(explicit_linker_property "$") + set(explicit_linker_property "$") set(explicit_linker_defined "$") - set(cargo_profile_target_property "$>") + set(cargo_profile_target_property "$>") # Option to override the rustc/cargo binary to something other than the global default - set(rustc_override "$") - set(cargo_override "$") + set(rustc_override "$") + set(cargo_override "$") set(rustc_bin "$,${rustc_override},${_CORROSION_RUSTC}>") set(cargo_bin "$,${cargo_override},${_CORROSION_CARGO}>") @@ -703,13 +714,13 @@ function(_add_cargo_build out_cargo_build_out_dir) list(APPEND corrosion_cc_rs_flags "SDKROOT=${CMAKE_OSX_SYSROOT}") endif() - corrosion_add_target_local_rustflags("${target_name}" "$<$:-Clink-args=${corrosion_link_args}>") + corrosion_add_target_local_rustflags("${target_name_cmake}" "$<$:-Clink-args=${corrosion_link_args}>") # todo: this should probably also be guarded by if_not_host_build_condition. if(COR_NO_STD) - corrosion_add_target_local_rustflags("${target_name}" "-Cdefault-linker-libraries=no") + corrosion_add_target_local_rustflags("${target_name_cmake}" "-Cdefault-linker-libraries=no") else() - corrosion_add_target_local_rustflags("${target_name}" "-Cdefault-linker-libraries=yes") + corrosion_add_target_local_rustflags("${target_name_cmake}" "-Cdefault-linker-libraries=yes") endif() set(global_joined_rustflags "$") @@ -717,8 +728,8 @@ function(_add_cargo_build out_cargo_build_out_dir) set(local_rustflags_delimiter "$<$:-->") set(local_rustflags_genex "$<$:${local_rustflags_target_property}>") - set(deps_link_languages_prop "$") - set(deps_link_languages "$") + set(deps_link_languages_prop "$") + set(deps_link_languages "$") set(target_uses_cxx "$") unset(default_linker) # With the MSVC ABI rustc only supports directly invoking the linker - Invoking cl as the linker driver is not supported. @@ -737,13 +748,13 @@ function(_add_cargo_build out_cargo_build_out_dir) # Skip adding the linker argument, if the linker is explicitly set, since the # explicit_linker_property will not be set when this function runs. # Passing this rustflag is necessary for clang. - corrosion_add_target_local_rustflags("${target_name}" "$<$:${rustflag_linker_arg}>") + corrosion_add_target_local_rustflags("${target_name_cmake}" "$<$:${rustflag_linker_arg}>") endif() - message(DEBUG "TARGET ${target_name} produces byproducts ${build_byproducts}") + message(DEBUG "TARGET ${target_name_cmake} produces byproducts ${build_byproducts}") add_custom_target( - _cargo-build_${target_name} + _cargo-build_${target_name_cmake_underscore} # Build crate COMMAND ${CMAKE_COMMAND} -E env @@ -790,22 +801,22 @@ function(_add_cargo_build out_cargo_build_out_dir) # ensures that they run before any user defined post build steps on this # target. add_custom_target( - cargo-build_${target_name} + cargo-build_${target_name_cmake_underscore} ALL ) - add_dependencies(cargo-build_${target_name} _cargo-build_${target_name}) + add_dependencies(cargo-build_${target_name_cmake_underscore} _cargo-build_${target_name_cmake_underscore}) # Add custom target before actual build that user defined custom commands (e.g. code generators) can # use as a hook to do something before the build. This mainly exists to not expose the `_cargo-build` targets. - add_custom_target(cargo-prebuild_${target_name}) - add_dependencies(_cargo-build_${target_name} cargo-prebuild_${target_name}) + add_custom_target(cargo-prebuild_${target_name_cmake_underscore}) + add_dependencies(_cargo-build_${target_name_cmake_underscore} cargo-prebuild_${target_name_cmake_underscore}) if(NOT TARGET cargo-prebuild) add_custom_target(cargo-prebuild) endif() - add_dependencies(cargo-prebuild cargo-prebuild_${target_name}) + add_dependencies(cargo-prebuild cargo-prebuild_${target_name_cmake_underscore}) add_custom_target( - cargo-clean_${target_name} + cargo-clean_${target_name_cmake_underscore} COMMAND "${cargo_bin}" clean ${cargo_target_option} -p ${package_name} --manifest-path ${path_to_toml} @@ -816,7 +827,7 @@ function(_add_cargo_build out_cargo_build_out_dir) if (NOT TARGET cargo-clean) add_custom_target(cargo-clean) endif() - add_dependencies(cargo-clean cargo-clean_${target_name}) + add_dependencies(cargo-clean cargo-clean_${target_name_cmake_underscore}) endfunction() #[=======================================================================[.md: @@ -834,6 +845,8 @@ corrosion_import_crate( [IMPORTED_CRATES ] [CRATE_TYPES ... ] [OVERRIDE_CRATE_TYPE = ...] + [BIN_NAMESPACE ] + [LIB_NAMESPACE ] [CRATES ... ] [FEATURES ... ] [FLAGS ... ] @@ -852,6 +865,10 @@ corrosion_import_crate( * **OVERRIDE_CRATE_TYPE**: Override the crate-types of a cargo crate with the given comma-separated values. Internally uses the `rustc` flag [`--crate-type`] to override the crate-type. Valid values for the crate types are the library types `staticlib` and `cdylib`. +* **BIN_NAMESPACE**: If specified, prefixes the CMake target corresponding to all binary crates with `::`. + This allows binary and library crates to have the same name. +* **LIB_NAMESPACE**: If specified, prefixes the CMake target corresponding to all library crates with `::`. + This allows binary and library crates to have the same name. * **CRATES**: Only import the specified crates from a workspace. Values: Crate names. * **FEATURES**: Enable the specified features. Equivalent to [--features] passed to `cargo build`. * **FLAGS**: Arbitrary flags to `cargo build`. @@ -869,7 +886,7 @@ ANCHOR_END: corrosion-import-crate #]=======================================================================] function(corrosion_import_crate) set(OPTIONS ALL_FEATURES NO_DEFAULT_FEATURES NO_STD NO_LINKER_OVERRIDE LOCKED FROZEN) - set(ONE_VALUE_KEYWORDS MANIFEST_PATH PROFILE IMPORTED_CRATES) + set(ONE_VALUE_KEYWORDS MANIFEST_PATH PROFILE IMPORTED_CRATES BIN_NAMESPACE LIB_NAMESPACE) set(MULTI_VALUE_KEYWORDS CRATE_TYPES CRATES FEATURES FLAGS OVERRIDE_CRATE_TYPE) cmake_parse_arguments(COR "${OPTIONS}" "${ONE_VALUE_KEYWORDS}" "${MULTI_VALUE_KEYWORDS}" ${ARGN}) list(APPEND CMAKE_MESSAGE_CONTEXT "corrosion_import_crate") @@ -890,6 +907,8 @@ function(corrosion_import_crate) _corrosion_option_passthrough_helper(NO_LINKER_OVERRIDE COR no_linker_override) _corrosion_option_passthrough_helper(LOCKED COR locked) _corrosion_option_passthrough_helper(FROZEN COR frozen) + _corrosion_arg_passthrough_helper(BIN_NAMESPACE COR bin_namespace) + _corrosion_arg_passthrough_helper(LIB_NAMESPACE COR lib_namespace) _corrosion_arg_passthrough_helper(CRATES COR crate_allowlist) _corrosion_arg_passthrough_helper(CRATE_TYPES COR crate_types) @@ -973,6 +992,8 @@ function(corrosion_import_crate) ${crate_types} ${no_linker_override} ${override_crate_types_arg} + ${bin_namespace} + ${lib_namespace} ) # Not target props yet: diff --git a/cmake/CorrosionGenerator.cmake b/cmake/CorrosionGenerator.cmake index b1a1d84a..6112eb65 100644 --- a/cmake/CorrosionGenerator.cmake +++ b/cmake/CorrosionGenerator.cmake @@ -50,7 +50,9 @@ function(_generator_add_package_targets) PACKAGE_NAME PACKAGE_VERSION TARGETS_JSON - OUT_CREATED_TARGETS) + OUT_CREATED_TARGETS + BIN_NAMESPACE + LIB_NAMESPACE) set(MULTI_VALUE_KEYWORDS CRATE_TYPES OVERRIDE_CRATE_TYPE_ARGS) cmake_parse_arguments(PARSE_ARGV 0 GAPT "${OPTIONS}" "${ONE_VALUE_KEYWORDS}" "${MULTI_VALUE_KEYWORDS}") @@ -112,13 +114,22 @@ function(_generator_add_package_targets) endif() endforeach() endif() - if(TARGET "${target_name}" + + if(("staticlib" IN_LIST kinds OR "cdylib" IN_LIST kinds) AND GAPT_LIB_NAMESPACE) + set(target_name_cmake "${GAPT_LIB_NAMESPACE}::${target_name}") + elseif(("bin" IN_LIST kinds) AND GAPT_BIN_NAMESPACE) + set(target_name_cmake "${GAPT_BIN_NAMESPACE}::${target_name}") + else() + set(target_name_cmake "${target_name}") + endif() + + if(TARGET "${target_name_cmake}" AND ("staticlib" IN_LIST kinds OR "cdylib" IN_LIST kinds OR "bin" IN_LIST kinds) ) message(WARNING "Failed to import Rust crate ${target_name} (kind: `${target_kind}`) because a target " "with the same name already exists. Skipping this target.\n" "Help: If you are importing a package which exposes both a `lib` and " - "a `bin` target, please consider explicitly naming the targets in your `Cargo.toml` manifest.\n" + "a `bin` target, use the LIB_NAMESPACE and BIN_NAMESPACE options to import them into separate namespaces.\n" "Note: If you have multiple different packages which have targets with the same name, please note that " "this is currently not supported by Corrosion. Feel free to open an issue on Github to request " "supporting this scenario." @@ -139,11 +150,12 @@ function(_generator_add_package_targets) set(shared_lib_byproduct "") set(pdb_byproduct "") - add_library(${target_name} INTERFACE) - _corrosion_initialize_properties(${target_name}) + add_library(${target_name_cmake} INTERFACE IMPORTED GLOBAL) + _corrosion_initialize_properties(${target_name_cmake}) _corrosion_add_library_target( WORKSPACE_MANIFEST_PATH "${workspace_manifest_path}" TARGET_NAME "${target_name}" + TARGET_NAME_CMAKE "${target_name_cmake}" LIB_KINDS ${kinds} OUT_ARCHIVE_OUTPUT_BYPRODUCTS archive_byproducts OUT_SHARED_LIB_BYPRODUCTS shared_lib_byproduct @@ -158,6 +170,7 @@ function(_generator_add_package_targets) cargo_build_out_dir PACKAGE ${package_name} TARGET ${target_name} + TARGET_NAME_CMAKE ${target_name_cmake} MANIFEST_PATH "${manifest_path}" WORKSPACE_MANIFEST_PATH "${workspace_manifest_path}" TARGET_KINDS "${kinds}" @@ -167,28 +180,28 @@ function(_generator_add_package_targets) ) if(archive_byproducts) _corrosion_copy_byproducts( - ${target_name} ARCHIVE_OUTPUT_DIRECTORY "${cargo_build_out_dir}" "${archive_byproducts}" + ${target_name_cmake} ARCHIVE_OUTPUT_DIRECTORY "${cargo_build_out_dir}" "${archive_byproducts}" ) endif() if(shared_lib_byproduct) _corrosion_copy_byproducts( - ${target_name} LIBRARY_OUTPUT_DIRECTORY "${cargo_build_out_dir}" "${shared_lib_byproduct}" + ${target_name_cmake} LIBRARY_OUTPUT_DIRECTORY "${cargo_build_out_dir}" "${shared_lib_byproduct}" ) endif() if(pdb_byproduct) _corrosion_copy_byproducts( - ${target_name} "PDB_OUTPUT_DIRECTORY;LIBRARY_OUTPUT_DIRECTORY" "${cargo_build_out_dir}" "${pdb_byproduct}" + ${target_name_cmake} "PDB_OUTPUT_DIRECTORY;LIBRARY_OUTPUT_DIRECTORY" "${cargo_build_out_dir}" "${pdb_byproduct}" ) endif() - list(APPEND corrosion_targets ${target_name}) - set_property(TARGET "${target_name}" PROPERTY COR_CARGO_PACKAGE_NAME "${package_name}" ) + list(APPEND corrosion_targets ${target_name_cmake}) + set_property(TARGET "${target_name_cmake}" PROPERTY COR_CARGO_PACKAGE_NAME "${package_name}" ) # Note: "bin" is mutually exclusive with "staticlib/cdylib", since `bin`s are seperate crates from libraries. elseif("bin" IN_LIST kinds) set(bin_byproduct "") set(pdb_byproduct "") - add_executable(${target_name} IMPORTED GLOBAL) - _corrosion_initialize_properties(${target_name}) - _corrosion_add_bin_target("${workspace_manifest_path}" "${target_name}" + add_executable(${target_name_cmake} IMPORTED GLOBAL) + _corrosion_initialize_properties(${target_name_cmake}) + _corrosion_add_bin_target("${workspace_manifest_path}" "${target_name}" "${target_name_cmake}" "bin_byproduct" "pdb_byproduct" ) @@ -200,6 +213,7 @@ function(_generator_add_package_targets) cargo_build_out_dir PACKAGE "${package_name}" TARGET "${target_name}" + TARGET_NAME_CMAKE ${target_name_cmake} MANIFEST_PATH "${manifest_path}" WORKSPACE_MANIFEST_PATH "${workspace_manifest_path}" TARGET_KINDS "bin" @@ -208,15 +222,15 @@ function(_generator_add_package_targets) ${no_linker_override} ) _corrosion_copy_byproducts( - ${target_name} RUNTIME_OUTPUT_DIRECTORY "${cargo_build_out_dir}" "${bin_byproduct}" + ${target_name_cmake} RUNTIME_OUTPUT_DIRECTORY "${cargo_build_out_dir}" "${bin_byproduct}" ) if(pdb_byproduct) _corrosion_copy_byproducts( - ${target_name} "PDB_OUTPUT_DIRECTORY;RUNTIME_OUTPUT_DIRECTORY" "${cargo_build_out_dir}" "${pdb_byproduct}" + ${target_name_cmake} "PDB_OUTPUT_DIRECTORY;RUNTIME_OUTPUT_DIRECTORY" "${cargo_build_out_dir}" "${pdb_byproduct}" ) endif() - list(APPEND corrosion_targets ${target_name}) - set_property(TARGET "${target_name}" PROPERTY COR_CARGO_PACKAGE_NAME "${package_name}" ) + list(APPEND corrosion_targets ${target_name_cmake}) + set_property(TARGET "${target_name_cmake}" PROPERTY COR_CARGO_PACKAGE_NAME "${package_name}" ) else() # ignore other kinds (like examples, tests, build scripts, ...) endif() @@ -235,7 +249,7 @@ endfunction() # `MANIFEST_PATH`. function(_generator_add_cargo_targets) set(options NO_LINKER_OVERRIDE) - set(one_value_args MANIFEST_PATH IMPORTED_CRATES) + set(one_value_args MANIFEST_PATH IMPORTED_CRATES BIN_NAMESPACE LIB_NAMESPACE) set(multi_value_args CRATES CRATE_TYPES OVERRIDE_CRATE_TYPE_ARGS) cmake_parse_arguments( GGC @@ -247,6 +261,8 @@ function(_generator_add_cargo_targets) list(APPEND CMAKE_MESSAGE_CONTEXT "_add_cargo_targets") _corrosion_option_passthrough_helper(NO_LINKER_OVERRIDE GGC no_linker_override) + _corrosion_arg_passthrough_helper(BIN_NAMESPACE COR bin_namespace) + _corrosion_arg_passthrough_helper(LIB_NAMESPACE COR lib_namespace) _corrosion_arg_passthrough_helper(CRATE_TYPES GGC crate_types) _corrosion_arg_passthrough_helper(OVERRIDE_CRATE_TYPE_ARGS GGC override_crate_types) @@ -309,6 +325,8 @@ function(_generator_add_cargo_targets) ${no_linker_override} ${crate_types} ${override_crate_types} + ${bin_namespace} + ${lib_namespace} ) list(APPEND created_targets "${curr_created_targets}") endforeach() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 20f4e77d..084fddcd 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -181,6 +181,7 @@ add_subdirectory(gensource) add_subdirectory(hostbuild) add_subdirectory(multitarget) add_subdirectory(nostd) +add_subdirectory(one_package_bin_and_lib) add_subdirectory("output directory") add_subdirectory(parse_target_triple) add_subdirectory(rust2cpp) diff --git a/test/one_package_bin_and_lib/CMakeLists.txt b/test/one_package_bin_and_lib/CMakeLists.txt new file mode 100644 index 00000000..bd665cff --- /dev/null +++ b/test/one_package_bin_and_lib/CMakeLists.txt @@ -0,0 +1,6 @@ +corrosion_tests_add_test(one_package_bin_and_lib "my_program") + +set_tests_properties("one_package_bin_and_lib_run_my_program" PROPERTIES PASS_REGULAR_EXPRESSION + "^Ok\r?\n$" + ) + diff --git a/test/one_package_bin_and_lib/one_package_bin_and_lib/CMakeLists.txt b/test/one_package_bin_and_lib/one_package_bin_and_lib/CMakeLists.txt new file mode 100644 index 00000000..bd60b761 --- /dev/null +++ b/test/one_package_bin_and_lib/one_package_bin_and_lib/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.15) +project(test_project VERSION 0.1.0) +include(../../test_header.cmake) + +corrosion_import_crate( + MANIFEST_PATH ${CMAKE_CURRENT_SOURCE_DIR}/Cargo.toml + BIN_NAMESPACE bin LIB_NAMESPACE lib +) + +if(NOT TARGET bin::mycrate) + message(FATAL_ERROR "Unable to import bin::mycrate.") +endif() + +add_executable(my_program main.cpp) +target_link_libraries(my_program PUBLIC lib::mycrate) + diff --git a/test/one_package_bin_and_lib/one_package_bin_and_lib/Cargo.lock b/test/one_package_bin_and_lib/one_package_bin_and_lib/Cargo.lock new file mode 100644 index 00000000..b8e06618 --- /dev/null +++ b/test/one_package_bin_and_lib/one_package_bin_and_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 = "mycrate" +version = "0.1.0" diff --git a/test/one_package_bin_and_lib/one_package_bin_and_lib/Cargo.toml b/test/one_package_bin_and_lib/one_package_bin_and_lib/Cargo.toml new file mode 100644 index 00000000..bfae6412 --- /dev/null +++ b/test/one_package_bin_and_lib/one_package_bin_and_lib/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "mycrate" +version = "0.1.0" +edition = "2018" +description = "descr;\"hello\\" + +[lib] +crate-type = ["staticlib", "rlib"] +name = "mycrate" diff --git a/test/one_package_bin_and_lib/one_package_bin_and_lib/main.cpp b/test/one_package_bin_and_lib/one_package_bin_and_lib/main.cpp new file mode 100644 index 00000000..5102b28e --- /dev/null +++ b/test/one_package_bin_and_lib/one_package_bin_and_lib/main.cpp @@ -0,0 +1,4 @@ +#include +int main() { + std::cout << "Ok"; +} diff --git a/test/one_package_bin_and_lib/one_package_bin_and_lib/src/lib.rs b/test/one_package_bin_and_lib/one_package_bin_and_lib/src/lib.rs new file mode 100644 index 00000000..afc0857d --- /dev/null +++ b/test/one_package_bin_and_lib/one_package_bin_and_lib/src/lib.rs @@ -0,0 +1,3 @@ +pub fn hello() { + println!("Hello world"); +} diff --git a/test/one_package_bin_and_lib/one_package_bin_and_lib/src/main.rs b/test/one_package_bin_and_lib/one_package_bin_and_lib/src/main.rs new file mode 100644 index 00000000..75d1d70c --- /dev/null +++ b/test/one_package_bin_and_lib/one_package_bin_and_lib/src/main.rs @@ -0,0 +1,5 @@ +use mycrate::hello; + +fn main() { + hello(); +}