diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index b79dae7..3cce3e8 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -13,10 +13,10 @@ on: jobs: beman-submodule-check: - uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-submodule-check.yml@1.6.0 + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-submodule-check.yml@1.7.2 preset-test: - uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-preset-test.yml@1.6.0 + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-preset-test.yml@1.7.2 with: matrix_config: > [ @@ -31,7 +31,7 @@ jobs: ] build-and-test: - uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-build-and-test.yml@1.6.0 + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-build-and-test.yml@1.7.2 with: matrix_config: > { @@ -44,7 +44,7 @@ jobs: "tests": [ "Debug.Default", "Release.Default", "Release.TSan", "Release.MaxSan", "Debug.Werror", "Debug.Dynamic", - "Debug.Coverage" + "Debug.Coverage", "Debug.-DBEMAN_SCAN_VIEW_USE_MODULES=On" ] } ] @@ -78,7 +78,8 @@ jobs: { "stdlibs": ["libstdc++", "libc++"], "tests": [ "Debug.Default", "Release.Default", "Release.TSan", - "Release.MaxSan", "Debug.Werror", "Debug.Dynamic" + "Release.MaxSan", "Debug.Werror", "Debug.Dynamic", + "Debug.-DBEMAN_SCAN_VIEW_USE_MODULES=On" ] } ] @@ -135,11 +136,16 @@ jobs: } vcpkg-ci: - uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-vcpkg-ci.yml@1.6.0 + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-vcpkg-ci.yml@1.7.2 with: port_name: beman-scan-view + feature_combinations: | + [ + {"features": {}}, + {"features": {"modules": true}} + ] create-issue-when-fault: needs: [preset-test, build-and-test] if: failure() && github.event_name == 'schedule' - uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-create-issue-when-fault.yml@1.6.0 + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-create-issue-when-fault.yml@1.7.2 diff --git a/.github/workflows/pre-commit-check.yml b/.github/workflows/pre-commit-check.yml index 15c5280..6ec2693 100644 --- a/.github/workflows/pre-commit-check.yml +++ b/.github/workflows/pre-commit-check.yml @@ -16,4 +16,4 @@ permissions: jobs: pre-commit: - uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-pre-commit.yml@1.6.0 + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-pre-commit.yml@1.7.2 diff --git a/.github/workflows/vcpkg-release.yml b/.github/workflows/vcpkg-release.yml index cbb6b66..11374a2 100644 --- a/.github/workflows/vcpkg-release.yml +++ b/.github/workflows/vcpkg-release.yml @@ -6,7 +6,7 @@ on: types: [published] jobs: vcpkg-release: - uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-vcpkg-release.yml@1.6.0 + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-vcpkg-release.yml@1.7.2 with: port_name: beman-scan-view secrets: diff --git a/CMakeLists.txt b/CMakeLists.txt index 40318cc..d9faef2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.30...4.3) +include(infra/cmake/enable-experimental-import-std.cmake) + project( beman.scan_view DESCRIPTION @@ -24,22 +26,59 @@ option( ${PROJECT_IS_TOP_LEVEL} ) +option( + BEMAN_SCAN_VIEW_USE_MODULES + "Provide beman.scan_view as a C++ module" + OFF +) + +if(BEMAN_SCAN_VIEW_USE_MODULES) + set(CMAKE_CXX_SCAN_FOR_MODULES ON) +endif() + +configure_file( + "${PROJECT_SOURCE_DIR}/include/beman/scan_view/config_generated.hpp.in" + "${PROJECT_BINARY_DIR}/include/beman/scan_view/config_generated.hpp" + @ONLY +) + # for find of beman_install_library and configure_build_telemetry include(infra/cmake/beman-install-library.cmake) include(infra/cmake/BuildTelemetryConfig.cmake) -add_library(beman.scan_view INTERFACE) +if(BEMAN_SCAN_VIEW_USE_MODULES) + add_library(beman.scan_view STATIC) +else() + add_library(beman.scan_view INTERFACE) +endif() add_library(beman::scan_view ALIAS beman.scan_view) -target_sources( - beman.scan_view - PUBLIC FILE_SET HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/include" -) - -set_target_properties( - beman.scan_view - PROPERTIES VERIFY_INTERFACE_HEADER_SETS ${PROJECT_IS_TOP_LEVEL} -) +if(BEMAN_SCAN_VIEW_USE_MODULES) + target_sources( + beman.scan_view + PUBLIC + FILE_SET CXX_MODULES + FILE_SET HEADERS + BASE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}/include" + "${CMAKE_CURRENT_BINARY_DIR}/include" + ) + set_target_properties(beman.scan_view PROPERTIES CXX_MODULE_STD ON) + target_compile_features(beman.scan_view PUBLIC cxx_std_23) +else() + target_sources( + beman.scan_view + PUBLIC + FILE_SET HEADERS + BASE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}/include" + "${CMAKE_CURRENT_BINARY_DIR}/include" + ) + set_target_properties( + beman.scan_view + PROPERTIES VERIFY_INTERFACE_HEADER_SETS ${PROJECT_IS_TOP_LEVEL} + ) +endif() add_subdirectory(include/beman/scan_view) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a6a7e67..274e508 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -10,4 +10,10 @@ foreach(example ${ALL_EXAMPLES}) beman.scan_view.examples.${example} PRIVATE beman::scan_view ) + if(BEMAN_SCAN_VIEW_USE_MODULES) + set_target_properties( + beman.scan_view.examples.${example} + PROPERTIES CXX_MODULE_STD ON + ) + endif() endforeach() diff --git a/examples/basic_example.cpp b/examples/basic_example.cpp index eee75de..09db63f 100644 --- a/examples/basic_example.cpp +++ b/examples/basic_example.cpp @@ -1,9 +1,19 @@ -#include -#include -#include +#include + +#if BEMAN_SCAN_VIEW_USE_MODULES() + +import std; + +#else + + #include + #include + #include + + #if __cpp_lib_print >= 202207L + #include + #endif -#if __cpp_lib_print >= 202207L - #include #endif #include diff --git a/examples/complex_example.cpp b/examples/complex_example.cpp index d9a0f5e..f29487b 100644 --- a/examples/complex_example.cpp +++ b/examples/complex_example.cpp @@ -1,14 +1,24 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#if __cpp_lib_print >= 202207L - #include +#include + +#if BEMAN_SCAN_VIEW_USE_MODULES() + +import std; + +#else + + #include + #include + #include + #include + #include + #include + #include + #include + + #if __cpp_lib_print >= 202207L + #include + #endif + #endif #include diff --git a/include/beman/scan_view/CMakeLists.txt b/include/beman/scan_view/CMakeLists.txt index f814c2b..638d1f1 100644 --- a/include/beman/scan_view/CMakeLists.txt +++ b/include/beman/scan_view/CMakeLists.txt @@ -1,3 +1,24 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -target_sources(beman.scan_view PUBLIC FILE_SET HEADERS FILES scan.hpp) +if(BEMAN_SCAN_VIEW_USE_MODULES) + target_sources( + beman.scan_view + PUBLIC + FILE_SET CXX_MODULES FILES scan_view.cppm + FILE_SET HEADERS + FILES + config.hpp + scan.hpp + "${PROJECT_BINARY_DIR}/include/beman/scan_view/config_generated.hpp" + ) +else() + target_sources( + beman.scan_view + PUBLIC + FILE_SET HEADERS + FILES + config.hpp + scan.hpp + "${PROJECT_BINARY_DIR}/include/beman/scan_view/config_generated.hpp" + ) +endif() diff --git a/include/beman/scan_view/config.hpp b/include/beman/scan_view/config.hpp new file mode 100644 index 0000000..e89f3f6 --- /dev/null +++ b/include/beman/scan_view/config.hpp @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#ifndef BEMAN_SCAN_VIEW_CONFIG_HPP +#define BEMAN_SCAN_VIEW_CONFIG_HPP + +#if !defined(__has_include) || __has_include() + #include +#else + #define BEMAN_SCAN_VIEW_USE_MODULES() 0 +#endif + +#endif diff --git a/include/beman/scan_view/config_generated.hpp.in b/include/beman/scan_view/config_generated.hpp.in new file mode 100644 index 0000000..d989458 --- /dev/null +++ b/include/beman/scan_view/config_generated.hpp.in @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#ifndef BEMAN_SCAN_VIEW_CONFIG_GENERATED_HPP +#define BEMAN_SCAN_VIEW_CONFIG_GENERATED_HPP + +#cmakedefine01 BEMAN_SCAN_VIEW_USE_MODULES() + +#endif diff --git a/include/beman/scan_view/scan.hpp b/include/beman/scan_view/scan.hpp index 88c6f4f..369e32a 100644 --- a/include/beman/scan_view/scan.hpp +++ b/include/beman/scan_view/scan.hpp @@ -3,13 +3,25 @@ #ifndef BEMAN_SCAN_VIEW_SCAN_HPP #define BEMAN_SCAN_VIEW_SCAN_HPP -#include -#include -#include -#include -#include -#include -#include +#include + +#if BEMAN_SCAN_VIEW_USE_MODULES() && !defined(BEMAN_SCAN_VIEW_INCLUDED_FROM_INTERFACE_UNIT) + +import beman.scan_view; + +#else + + #if !BEMAN_SCAN_VIEW_USE_MODULES() + + #include + #include + #include + #include + #include + #include + #include + + #endif // !BEMAN_SCAN_VIEW_USE_MODULES() namespace beman::scan_view { @@ -19,11 +31,11 @@ namespace detail { // just move-constructible; we preserve the old behavior in pre-C++23 modes. template concept movable_box_object = -#if __cpp_lib_ranges >= 202207L + #if __cpp_lib_ranges >= 202207L std::move_constructible -#else + #else std::copy_constructible -#endif + #endif && std::is_object_v; // Primary template - uses std::optional and introduces an empty state in case assignment fails. @@ -46,9 +58,9 @@ class movable_box { movable_box(movable_box&&) = default; constexpr movable_box& operator=(const movable_box& other) noexcept(std::is_nothrow_copy_constructible_v) -#if __cpp_lib_ranges >= 202207L + #if __cpp_lib_ranges >= 202207L requires std::copy_constructible -#endif + #endif { if (this != std::addressof(other)) { if (other.has_value()) @@ -88,13 +100,13 @@ using maybe_const = std::conditional_t; template struct perfect_forward_impl; -template +template struct perfect_forward_impl, BoundArgs...> { private: std::tuple bound_args_; public: - template , Args&&...>>> + template , Args&&...> > > explicit constexpr perfect_forward_impl(Args&&... bound_args) : bound_args_(std::forward(bound_args)...) {} perfect_forward_impl(const perfect_forward_impl&) = default; @@ -103,44 +115,44 @@ struct perfect_forward_impl, BoundArgs...> { perfect_forward_impl& operator=(const perfect_forward_impl&) = default; perfect_forward_impl& operator=(perfect_forward_impl&&) = default; - template >> + template > > constexpr auto operator()(Args&&... args) & noexcept(noexcept(Op()(std::get(bound_args_)..., std::forward(args)...))) -> decltype(Op()(std::get(bound_args_)..., std::forward(args)...)) { return Op()(std::get(bound_args_)..., std::forward(args)...); } - template >> + template > > auto operator()(Args&&...) & = delete; - template >> + template > > constexpr auto operator()(Args&&... args) const& noexcept(noexcept(Op()(std::get(bound_args_)..., std::forward(args)...))) -> decltype(Op()(std::get(bound_args_)..., std::forward(args)...)) { return Op()(std::get(bound_args_)..., std::forward(args)...); } - template >> + template > > auto operator()(Args&&...) const& = delete; - template >> + template > > constexpr auto operator()(Args&&... args) && noexcept(noexcept(Op()(std::get(std::move(bound_args_))..., std::forward(args)...))) -> decltype(Op()(std::get(std::move(bound_args_))..., std::forward(args)...)) { return Op()(std::get(std::move(bound_args_))..., std::forward(args)...); } - template >> + template > > auto operator()(Args&&...) && = delete; - template >> + template > > constexpr auto operator()(Args&&... args) const&& noexcept(noexcept(Op()(std::get(std::move(bound_args_))..., std::forward(args)...))) -> decltype(Op()(std::get(std::move(bound_args_))..., std::forward(args)...)) { return Op()(std::get(std::move(bound_args_))..., std::forward(args)...); } - template >> + template > > auto operator()(Args&&...) const&& = delete; }; @@ -166,9 +178,9 @@ struct compose_t : perfect_forward { template constexpr auto compose(Fn1&& f1, Fn2&& f2) noexcept( - noexcept(compose_t, std::decay_t>(std::forward(f1), std::forward(f2)))) - -> decltype(compose_t, std::decay_t>(std::forward(f1), std::forward(f2))) { - return compose_t, std::decay_t>(std::forward(f1), std::forward(f2)); + noexcept(compose_t, std::decay_t >(std::forward(f1), std::forward(f2)))) + -> decltype(compose_t, std::decay_t >(std::forward(f1), std::forward(f2))) { + return compose_t, std::decay_t >(std::forward(f1), std::forward(f2)); } // CRTP base that one can derive from in order to be considered a range adaptor closure @@ -182,25 +194,25 @@ struct range_adaptor_closure; // Type that wraps an arbitrary function object and makes it into a range adaptor closure, // i.e. something that can be called via the `x | f` notation. template -struct range_adaptor_closure_t : Fn, range_adaptor_closure> { +struct range_adaptor_closure_t : Fn, range_adaptor_closure > { constexpr explicit range_adaptor_closure_t(Fn&& f) : Fn(std::move(f)) {} }; template concept RangeAdaptorClosure = - std::derived_from, range_adaptor_closure>>; + std::derived_from, range_adaptor_closure > >; template struct range_adaptor_closure { template - requires std::same_as> && std::invocable + requires std::same_as > && std::invocable [[nodiscard]] friend constexpr decltype(auto) operator|(View&& view, Closure&& closure) noexcept(std::is_nothrow_invocable_v) { return std::invoke(std::forward(closure), std::forward(view)); } template - requires std::same_as> && + requires std::same_as > && std::constructible_from, Closure> && std::constructible_from, OtherClosure> [[nodiscard]] friend constexpr auto @@ -211,11 +223,11 @@ struct range_adaptor_closure { } }; -template > +template > struct bind_back_op; -template -struct bind_back_op> { +template +struct bind_back_op > { template constexpr auto operator()(Fn&& f, BoundArgs&& bound_args, Args&&... args) const noexcept(noexcept(std::invoke( std::forward(f), std::forward(args)..., std::get(std::forward(bound_args))...))) @@ -228,20 +240,20 @@ struct bind_back_op> { }; template -struct bind_back_t : perfect_forward>, Fn, BoundArgs> { - using perfect_forward>, Fn, BoundArgs>::perfect_forward; +struct bind_back_t : perfect_forward >, Fn, BoundArgs> { + using perfect_forward >, Fn, BoundArgs>::perfect_forward; }; template - requires std::is_constructible_v, Fn> && std::is_move_constructible_v> && + requires std::is_constructible_v, Fn> && std::is_move_constructible_v > && (std::is_constructible_v, Args> && ...) && - (std::is_move_constructible_v> && ...) + (std::is_move_constructible_v > && ...) constexpr auto -bind_back(Fn&& f, Args&&... args) noexcept(noexcept(bind_back_t, std::tuple...>>( +bind_back(Fn&& f, Args&&... args) noexcept(noexcept(bind_back_t, std::tuple...> >( std::forward(f), std::forward_as_tuple(std::forward(args)...)))) - -> decltype(bind_back_t, std::tuple...>>( + -> decltype(bind_back_t, std::tuple...> >( std::forward(f), std::forward_as_tuple(std::forward(args)...))) { - return bind_back_t, std::tuple...>>( + return bind_back_t, std::tuple...> >( std::forward(f), std::forward_as_tuple(std::forward(args)...)); } @@ -255,22 +267,22 @@ enum class scan_view_kind : bool { unseeded, seeded }; template concept scannable_impl = // exposition only - std::movable && std::convertible_to && std::invocable> && - std::assignable_from>>; + std::movable && std::convertible_to && std::invocable > && + std::assignable_from > >; template concept scannable = // exposition only - std::invocable> && - std::convertible_to>, - std::decay_t>>> && - scannable_impl>>>; + std::invocable > && + std::convertible_to >, + std::decay_t > > > && + scannable_impl > > >; template requires std::ranges::view && std::is_object_v && std::is_object_v && scannable -class scan_view : public std::ranges::view_interface> { +class scan_view : public std::ranges::view_interface > { private: // [range.scan.iterator], class template scan_view::iterator template @@ -321,7 +333,7 @@ class scan_view : public std::ranges::view_interface> { return std::ranges::size(base_); } -#if __cpp_lib_ranges_reserve_hint >= 202502L + #if __cpp_lib_ranges_reserve_hint >= 202502L constexpr auto reserve_hint() requires std::ranges::approximately_sized_range { @@ -333,11 +345,11 @@ class scan_view : public std::ranges::view_interface> { { return std::ranges::reserve_hint(base_); } -#endif + #endif }; template -scan_view(R&&, F) -> scan_view, F, std::ranges::range_value_t>; +scan_view(R&&, F) -> scan_view, F, std::ranges::range_value_t >; template scan_view(R&&, F, T) -> scan_view, F, T, scan_view_kind::seeded>; @@ -350,7 +362,7 @@ class scan_view::iterator { using Base = detail::maybe_const; // exposition only using Func = detail::maybe_const; // exposition only using ResultType = std::decay_t< // exposition only - std::invoke_result_t>>; + std::invoke_result_t > >; struct Holder { // exposition only std::ranges::sentinel_t end_ = std::ranges::sentinel_t(); // exposition only @@ -394,7 +406,7 @@ class scan_view::iterator { using difference_type = std::ranges::range_difference_t; iterator() - requires std::default_initializable> + requires std::default_initializable > = default; constexpr iterator(Parent& parent, std::ranges::iterator_t current) : current_{std::move(current)}, parent_{init(parent)} { @@ -407,7 +419,7 @@ class scan_view::iterator { } } constexpr iterator(iterator i) - requires Const && std::convertible_to, std::ranges::iterator_t> + requires Const && std::convertible_to, std::ranges::iterator_t > : current_{std::move(i.current_)}, parent_{std::move(i.parent_)}, sum_{std::move(i.sum_)} {} constexpr const std::ranges::iterator_t& base() const& noexcept { return current_; } @@ -424,7 +436,7 @@ class scan_view::iterator { constexpr void operator++(int) { ++*this; } friend constexpr bool operator==(const iterator& x, const iterator& y) - requires std::equality_comparable> + requires std::equality_comparable > { return x.current_ == y.current_; } @@ -462,7 +474,10 @@ template -constexpr bool std::ranges::enable_borrowed_range> = +constexpr bool std::ranges::enable_borrowed_range > = std::ranges::enable_borrowed_range && beman::scan_view::detail::tidy_func; +#endif // #if BEMAN_SCAN_VIEW_USE_MODULES() && + // !defined(BEMAN_SCAN_VIEW_INCLUDED_FROM_INTERFACE_UNIT) + #endif // BEMAN_SCAN_VIEW_SCAN_HPP diff --git a/include/beman/scan_view/scan_view.cppm b/include/beman/scan_view/scan_view.cppm new file mode 100644 index 0000000..0f4bc6e --- /dev/null +++ b/include/beman/scan_view/scan_view.cppm @@ -0,0 +1,15 @@ +module; + +#include + +export module beman.scan_view; + +import std; + +#define BEMAN_SCAN_VIEW_INCLUDED_FROM_INTERFACE_UNIT +export { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Winclude-angled-in-module-purview" +#include +#pragma clang diagnostic pop +} diff --git a/infra/.beman_submodule b/infra/.beman_submodule index a2ad45f..4e9900c 100644 --- a/infra/.beman_submodule +++ b/infra/.beman_submodule @@ -1,3 +1,3 @@ [beman_submodule] remote=https://github.com/bemanproject/infra.git -commit_hash=1b14bad2cd2cf0e44d1aeb608557e0e35ce27eaa +commit_hash=b7b533a00ba72049c7c583f4344dfb7c04342a0f diff --git a/infra/.github/CODEOWNERS b/infra/.github/CODEOWNERS index 4ff90a4..439303d 100644 --- a/infra/.github/CODEOWNERS +++ b/infra/.github/CODEOWNERS @@ -1 +1 @@ -* @ednolan @neatudarius @rishyak @wusatosi @JeffGarland +* @ednolan @rishyak @wusatosi @JeffGarland diff --git a/infra/.github/workflows/pre-commit.yml b/infra/.github/workflows/pre-commit.yml index 9646831..7051c13 100644 --- a/infra/.github/workflows/pre-commit.yml +++ b/infra/.github/workflows/pre-commit.yml @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception name: Lint Check (pre-commit) on: diff --git a/infra/.pre-commit-config.yaml b/infra/.pre-commit-config.yaml index 8052e18..6fe1e85 100644 --- a/infra/.pre-commit-config.yaml +++ b/infra/.pre-commit-config.yaml @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 diff --git a/infra/cmake/BuildTelemetry.cmake b/infra/cmake/BuildTelemetry.cmake index c2ff343..cc94f40 100755 --- a/infra/cmake/BuildTelemetry.cmake +++ b/infra/cmake/BuildTelemetry.cmake @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception include_guard(GLOBAL) include(${CMAKE_CURRENT_LIST_DIR}/BuildTelemetryConfig.cmake) diff --git a/infra/cmake/BuildTelemetryConfig.cmake b/infra/cmake/BuildTelemetryConfig.cmake index 15aae48..2160c34 100755 --- a/infra/cmake/BuildTelemetryConfig.cmake +++ b/infra/cmake/BuildTelemetryConfig.cmake @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception include_guard(GLOBAL) set(BUILD_TELEMETRY_DIR ${CMAKE_CURRENT_LIST_DIR}) diff --git a/infra/cmake/Config.cmake.in b/infra/cmake/Config.cmake.in index 3f1341c..df903cf 100644 --- a/infra/cmake/Config.cmake.in +++ b/infra/cmake/Config.cmake.in @@ -1,5 +1,5 @@ -# cmake/Config.cmake.in -*-makefile-*- # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +# cmake/Config.cmake.in -*-makefile-*- include(CMakeFindDependencyMacro) diff --git a/infra/cmake/beman-install-library.cmake b/infra/cmake/beman-install-library.cmake index dc5a4d1..df2dbe9 100644 --- a/infra/cmake/beman-install-library.cmake +++ b/infra/cmake/beman-install-library.cmake @@ -122,7 +122,9 @@ function(beman_install_library name) endif() if(NOT BEMAN_INSTALL_DESTINATION) - set(BEMAN_INSTALL_DESTINATION "${_config_install_dir}/modules") + set(BEMAN_INSTALL_DESTINATION + "${CMAKE_INSTALL_DATADIR}/${name}/modules" + ) endif() string(REPLACE "beman." "" install_component_name "${name}") @@ -210,7 +212,7 @@ function(beman_install_library name) # NOTE: There's currently no convention for this location! CK CXX_MODULES_BMI DESTINATION - ${_config_install_dir}/bmi-${CMAKE_CXX_COMPILER_ID}_$ + ${CMAKE_INSTALL_DATADIR}/${name}/bmi-${CMAKE_CXX_COMPILER_ID}_$ COMPONENT "${install_component_name}_Development" ) else() diff --git a/infra/cmake/enable-experimental-import-std.cmake b/infra/cmake/enable-experimental-import-std.cmake new file mode 100644 index 0000000..20fc302 --- /dev/null +++ b/infra/cmake/enable-experimental-import-std.cmake @@ -0,0 +1,190 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +if(CMAKE_VERSION VERSION_EQUAL "3.30.0") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.30.1") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.30.2") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.30.3") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.30.4") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.30.5") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.30.6") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.30.7") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.30.8") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.30.9") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.0") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.1") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.10") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.11") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.12") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.2") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.3") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.4") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.5") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.6") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.7") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "0e5b6991-d74f-4b3d-a41c-cf096e0b2508" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.8") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "3.31.9") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.0.0") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "a9e1cf81-9932-4810-974b-6eccaf14e457" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.0.1") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "a9e1cf81-9932-4810-974b-6eccaf14e457" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.0.2") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "a9e1cf81-9932-4810-974b-6eccaf14e457" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.0.3") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.0.4") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.0.5") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.0.6") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.0.7") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.1.0") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.1.1") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.1.2") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.1.3") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.1.4") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.1.5") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.1.6") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.2.0") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.2.1") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.2.2") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.2.3") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.2.4") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.2.5") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "d0edc3af-4c50-42ea-a356-e2862fe7a444" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.3.0") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "451f2fe2-a8a2-47c3-bc32-94786d8fc91b" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.3.1") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "451f2fe2-a8a2-47c3-bc32-94786d8fc91b" + ) +elseif(CMAKE_VERSION VERSION_EQUAL "4.3.2") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD + "451f2fe2-a8a2-47c3-bc32-94786d8fc91b" + ) +endif() diff --git a/infra/cmake/telemetry.sh b/infra/cmake/telemetry.sh index 323982e..cb5fd88 100755 --- a/infra/cmake/telemetry.sh +++ b/infra/cmake/telemetry.sh @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #!/usr/bin/env bash set -o nounset diff --git a/infra/cmake/use-fetch-content.cmake b/infra/cmake/use-fetch-content.cmake index 73594be..3c7136d 100644 --- a/infra/cmake/use-fetch-content.cmake +++ b/infra/cmake/use-fetch-content.cmake @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception cmake_minimum_required(VERSION 3.24) include(FetchContent) diff --git a/port/portfile.cmake.in b/port/portfile.cmake.in index da379f2..f008d49 100644 --- a/port/portfile.cmake.in +++ b/port/portfile.cmake.in @@ -6,9 +6,16 @@ vcpkg_from_github( HEAD_REF main ) +vcpkg_check_features( + OUT_FEATURE_OPTIONS FEATURE_OPTIONS + FEATURES + modules BEMAN_SCAN_VIEW_USE_MODULES +) + vcpkg_cmake_configure( SOURCE_PATH "${SOURCE_PATH}" OPTIONS + ${FEATURE_OPTIONS} -DBEMAN_SCAN_VIEW_BUILD_TESTS=OFF -DBEMAN_SCAN_VIEW_BUILD_EXAMPLES=OFF ) @@ -20,9 +27,11 @@ vcpkg_cmake_config_fixup( CONFIG_PATH lib/cmake/beman.scan_view ) -file(REMOVE_RECURSE - "${CURRENT_PACKAGES_DIR}/debug" - "${CURRENT_PACKAGES_DIR}/lib" -) +if(NOT "modules" IN_LIST FEATURES) + file(REMOVE_RECURSE + "${CURRENT_PACKAGES_DIR}/debug" + "${CURRENT_PACKAGES_DIR}/lib" + ) +endif() vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") diff --git a/port/vcpkg.json.in b/port/vcpkg.json.in index aee3e92..94dd030 100644 --- a/port/vcpkg.json.in +++ b/port/vcpkg.json.in @@ -13,5 +13,10 @@ "name": "vcpkg-cmake-config", "host": true } - ] + ], + "features": { + "modules": { + "description": "Provide beman.scan_view as a C++ module" + } + } } diff --git a/tests/beman/scan_view/CMakeLists.txt b/tests/beman/scan_view/CMakeLists.txt index 95f0145..10af86b 100644 --- a/tests/beman/scan_view/CMakeLists.txt +++ b/tests/beman/scan_view/CMakeLists.txt @@ -9,5 +9,12 @@ target_link_libraries( PRIVATE beman::scan_view GTest::gtest GTest::gtest_main ) +if(BEMAN_SCAN_VIEW_USE_MODULES) + set_target_properties( + beman.scan_view.tests.basic + PROPERTIES CXX_MODULE_STD ON + ) +endif() + include(GoogleTest) gtest_discover_tests(beman.scan_view.tests.basic DISCOVERY_TIMEOUT 60) diff --git a/tests/beman/scan_view/basic.test.cpp b/tests/beman/scan_view/basic.test.cpp index 262440d..aee8ab3 100644 --- a/tests/beman/scan_view/basic.test.cpp +++ b/tests/beman/scan_view/basic.test.cpp @@ -1,12 +1,22 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#include -#include -#include -#include +#include #include +#if BEMAN_SCAN_VIEW_USE_MODULES() + +import std; + +#else + + #include + #include + #include + #include + +#endif + #include namespace exe = beman::scan_view;