diff --git a/.devcontainer/clang17/clang17.Dockerfile b/.devcontainer/clang21/clang21.Dockerfile
similarity index 83%
rename from .devcontainer/clang17/clang17.Dockerfile
rename to .devcontainer/clang21/clang21.Dockerfile
index 9c72e5c5..c81dff5a 100644
--- a/.devcontainer/clang17/clang17.Dockerfile
+++ b/.devcontainer/clang21/clang21.Dockerfile
@@ -1,11 +1,12 @@
-FROM mcr.microsoft.com/devcontainers/base:alpine-3.20
+FROM mcr.microsoft.com/devcontainers/base:dev-alpine3.23
RUN \
apk add --update --no-cache \
- clang17 \
+ clang21 \
libc++-dev \
cmake \
ninja \
+ qbs \
git \
gdb \
linux-headers \
@@ -25,5 +26,6 @@ RUN \
&& echo "end" >>/home/vscode/.gdbinit
ENV \
- CC=/usr/bin/clang \
- CXX=/usr/bin/clang++
+ PATH="/usr/lib/llvm21/bin:${PATH}" \
+ CC=/usr/bin/clang-21 \
+ CXX=/usr/bin/clang++-21
diff --git a/.devcontainer/clang17/devcontainer.json b/.devcontainer/clang21/devcontainer.json
similarity index 60%
rename from .devcontainer/clang17/devcontainer.json
rename to .devcontainer/clang21/devcontainer.json
index 2abe01d6..11216cac 100644
--- a/.devcontainer/clang17/devcontainer.json
+++ b/.devcontainer/clang21/devcontainer.json
@@ -1,7 +1,7 @@
{
- "name": "cocpp19-clang17",
+ "name": "cocpp19-clang21",
"build": {
- "dockerfile": "./clang17.Dockerfile",
+ "dockerfile": "./clang21.Dockerfile",
"context": "."
},
"customizations": {
@@ -9,7 +9,8 @@
"extensions": [
"ms-vscode.cpptools",
"ms-vscode.cmake-tools",
- "ms-python.python"
+ "ms-python.python",
+ "qbs-community.qbs-tools"
]
}
},
diff --git a/.devcontainer/gcc12/gcc12.Dockerfile b/.devcontainer/gcc12/gcc12.Dockerfile
index 155d5a21..a4e67dbe 100644
--- a/.devcontainer/gcc12/gcc12.Dockerfile
+++ b/.devcontainer/gcc12/gcc12.Dockerfile
@@ -8,5 +8,4 @@ RUN \
git \
gdb \
linux-headers \
- py3-pip \
- && pip install conan
+ py3-pip
diff --git a/.github/workflows/conan.yml b/.github/workflows/conan.yml
deleted file mode 100644
index e1fa46f2..00000000
--- a/.github/workflows/conan.yml
+++ /dev/null
@@ -1,72 +0,0 @@
-name: Conan-Tests
-
-on: push
-
-jobs:
- Windows:
- name: Windows
- runs-on: "windows-latest"
- steps:
- - name: Install Conan
- uses: turtlebrowser/get-conan@main
-
- - name: install CMake
- uses: lukka/get-cmake@latest
-
- - name: Install MSVC
- uses: ilammy/msvc-dev-cmd@v1
-
- - name: Checkout source
- uses: actions/checkout@v4
-
- - name: Create conan package
- run: |
- conan create conan/ --build=missing --profile:all=./conan/profiles/msvc2022
-
- - name: Test package components
- shell: pwsh
- run: |
- foreach ($folder in (Get-ChildItem -Path ./conan/tests -Directory | Foreach-Object {$_.Name})) {
- echo "Running ${folder}"
- & script\test_conan.bat "${folder}" --profile:all="$pwd/conan/profiles/msvc2022"
- if ($LASTEXITCODE -ne 0) {
- exit(1)
- }
- }
-
- Linux:
- name: Linux
- runs-on: "ubuntu-latest"
-
- strategy:
- fail-fast: false
- matrix:
- include:
- - name: "GCC12"
- dockerfile: "gcc12.Dockerfile"
- image: "gcc12-conan:latest"
- profile: "gcc12"
- - name: "Clang15 with libstdc++"
- dockerfile: "clang15.Dockerfile"
- image: "clang15-conan:latest"
- profile: "clang15-libstdcpp"
- # - name: "Clang15 with libc++"
- # dockerfile: "clang15.Dockerfile"
- # image: "clang15-conan:latest"
- # profile: "clang15-libcxx"
-
- steps:
- - name: Checkout source
- uses: actions/checkout@v4
-
- - name: Build Dockerfile
- if: ${{ matrix.dockerfile != '' }}
- run: >-
- docker build -t ${{ matrix.image }} -f "conan/docker/${{ matrix.dockerfile }}" "conan/docker/"
-
- - name: Create conan package and test it
- run: >-
- docker run --network="host" --rm
- --mount "src=${GITHUB_WORKSPACE},target=/project,type=bind"
- --workdir /project ${{ matrix.image }}
- script/ci/conan.sh ${{ matrix.profile }}
diff --git a/.github/workflows/qbs_tests.yml b/.github/workflows/qbs_tests.yml
index d07e3e34..c412458d 100644
--- a/.github/workflows/qbs_tests.yml
+++ b/.github/workflows/qbs_tests.yml
@@ -11,25 +11,27 @@ jobs:
fail-fast: false
matrix:
include:
- - image: arbmind/qbs-clang:1.21.0-14
+ - image: arbmind/qbs-clang:3.1.2-18
build_args: "modules.cpp.cxxStandardLibrary:libc++ modules.cpp.staticLibraries:c++,c++abi"
- - image: arbmind/qbs-clang:2.1.2-17
+ - image: arbmind/qbs-clang:3.1.2-21
build_args: "modules.cpp.cxxStandardLibrary:libc++ modules.cpp.staticLibraries:c++,c++abi"
- - image: arbmind/qbs-clang-libstdcpp:1.24.0-15-12
- - image: arbmind/qbs-gcc:1.21.0-11
- - image: arbmind/qbs-gcc:1.24.0-12
- - image: arbmind/qbs-gcc:2.1.2-13
+ - image: arbmind/qbs-clang-libstdcpp:3.1.2-21-15
+ - image: arbmind/qbs-gcc:3.1.2-13
+ - image: arbmind/qbs-gcc:3.1.2-14
+ - image: arbmind/qbs-gcc:3.1.2-15
steps:
- uses: actions/checkout@v4
+ # we have no git in container fetch googletest before
- name: Get Googletest
- run: third_party/git_clone_googletest.sh
+ run: script/git_clone_googletest.sh
- name: Build and run Tests
run: >-
docker run --rm -v ${GITHUB_WORKSPACE}:/project -w /project
--env GTEST_OUTPUT=xml:/project/reports/qbs/
+ --env QBS_GOOGLETEST_SOURCE=/project/script/googletest
${{ matrix.image }}
build
--build-directory /tmp/build
@@ -71,10 +73,6 @@ jobs:
- uses: actions/checkout@v4
- - name: Get Googletest
- run: third_party/git_clone_googletest.sh
- shell: bash
-
- name: Build and run Tests
env:
GTEST_OUTPUT: xml:${{ github.workspace }}\reports\msvc\
diff --git a/.gitignore b/.gitignore
index 318d4cc5..288c0b3a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,4 @@ third_party/*/
build/
artifacts/
CMakeUserPresets.json
+.qtcreator
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bc1b41b7..182b6796 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,28 +1,42 @@
cmake_minimum_required(VERSION 3.24 FATAL_ERROR)
-project (co-cpp19 LANGUAGES CXX)
-enable_testing()
+project(co-cpp19 LANGUAGES CXX)
-include(GNUInstallDirs)
-include(CMakePackageConfigHelpers)
-set(COCPP19_CMAKE_CONFIG_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CoCpp19")
+set(COCPP_MAIN_PROJECT OFF)
-find_package(GTest QUIET)
+if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
+ set(COCPP_MAIN_PROJECT ON)
+endif()
+
+option(COCPP_BuildTests "Build the unit tests when BUILD_TESTING is enabled." ${COCPP_MAIN_PROJECT})
+option(COCPP_Install "Install CMake targets during install step." ${COCPP_MAIN_PROJECT})
+
+if(COCPP_BuildTests)
+ enable_testing()
+endif()
+
+if(COCPP_Install)
+ include(GNUInstallDirs)
+ include(CMakePackageConfigHelpers)
+ set(COCPP19_CMAKE_CONFIG_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CoCpp19")
+endif()
add_subdirectory(third_party)
add_subdirectory(src)
-configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/CoCpp19Config.cmake.in
- "${CMAKE_CURRENT_BINARY_DIR}/CoCpp19Config.cmake"
- INSTALL_DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
-)
-write_basic_package_version_file(
- "${CMAKE_CURRENT_BINARY_DIR}/CoCpp19ConfigVersion.cmake"
- VERSION "1.0.0"
- COMPATIBILITY AnyNewerVersion
-)
-install(FILES
- "${CMAKE_CURRENT_BINARY_DIR}/CoCpp19Config.cmake"
- "${CMAKE_CURRENT_BINARY_DIR}/CoCpp19ConfigVersion.cmake"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT cocpp19
-)
+if(COCPP_Install)
+ configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/CoCpp19Config.cmake.in
+ "${CMAKE_CURRENT_BINARY_DIR}/CoCpp19Config.cmake"
+ INSTALL_DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ )
+ write_basic_package_version_file(
+ "${CMAKE_CURRENT_BINARY_DIR}/CoCpp19ConfigVersion.cmake"
+ VERSION "1.0.0"
+ COMPATIBILITY AnyNewerVersion
+ )
+ install(FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/CoCpp19Config.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/CoCpp19ConfigVersion.cmake"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT cocpp19
+ )
+endif()
diff --git a/CMakePresets.json b/CMakePresets.json
index 455af186..dac2bfdd 100644
--- a/CMakePresets.json
+++ b/CMakePresets.json
@@ -12,9 +12,10 @@
"generator": "Ninja Multi-Config",
"binaryDir": "${sourceDir}/build/${presetName}",
"cacheVariables": {
- "CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
+ "CMAKE_EXPORT_COMPILE_COMMANDS": true,
"CMAKE_CTEST_ARGUMENTS": "--output-on-failure",
- "CMAKE_CONFIGURATION_TYPES": "Debug;Release"
+ "CMAKE_CONFIGURATION_TYPES": "Debug;Release",
+ "INSTALL_GTEST": false
}
},
{
diff --git a/Readme.md b/Readme.md
index 28eb9551..3da998ef 100644
--- a/Readme.md
+++ b/Readme.md
@@ -6,7 +6,6 @@ A versatile collection of compile time optimized tools for C++ programming.
[](https://github.com/basicpp17/co-cpp19/actions/workflows/qbs_tests.yml)
[](https://github.com/basicpp17/co-cpp19/actions/workflows/cmake_tests.yml)
[](https://github.com/basicpp17/co-cpp19/actions/workflows/static_analyse.yml)
-[](https://github.com/basicpp17/co-cpp19/actions/workflows/conan.yml)
## Target Compilers
diff --git a/co-cpp19.qbs b/co-cpp19.qbs
index 214ed38f..88ade5f0 100644
--- a/co-cpp19.qbs
+++ b/co-cpp19.qbs
@@ -3,37 +3,27 @@ import qbs
Project {
name: "Co-Cpp19"
- // to use libc++ set
- // modules.cpp.cxxStandardLibrary:libc++ modules.cpp.staticLibraries:c++,c++abi
+ property string version: "2026.01"
+ property string configProductName: "Co-Cpp19-Config"
+ property bool enableQbsImports: (sourceDirectory === path)
+ property bool enableTests: (sourceDirectory === path)
+ property bool enableThirdParty: (sourceDirectory === path)
- references: [
- "third_party/third_party.qbs",
- "src/array19.lib",
- "src/coro19.lib",
- "src/enum19.lib",
- "src/flags19.lib",
- "src/meta19.lib",
- "src/lookup19.lib",
- "src/optional19.lib",
- "src/partial19.lib",
- "src/serialize19.lib",
- "src/signal19.lib",
- "src/string19.lib",
- "src/strong19.lib",
- "src/tuple19.lib",
- "src/variant19.lib",
- ]
-
- AutotestRunner {}
+ minimumQbsVersion: "3.0"
+ qbsSearchPaths: enableQbsImports ? ["qbs"] : []
+ references: ["src/src.qbs"]
// note: if do not use this .qbs project you need a similar setup
Product {
- name: "cpp19"
+ name: "Co-Cpp19-Config"
+ condition: parent.configProductName === "Co-Cpp19-Config"
Export {
- Depends { name: "cpp" }
- cpp.cxxLanguageVersion: "c++2a"
+ cpp.cxxLanguageVersion: "c++23"
cpp.treatWarningsAsErrors: true
+ // to use libc++ set
+ // modules.cpp.cxxStandardLibrary:libc++
+ // modules.cpp.staticLibraries:c++,c++abi
Properties {
condition: qbs.toolchain.contains('msvc')
@@ -55,11 +45,19 @@ Project {
"-Wno-gnu-zero-variadic-macro-arguments" // accept this extensions for opaque strong types
)
}
+ Depends { name: "cpp" }
}
}
-
+ SubProject {
+ condition: parent.enableTests
+ filePath: "src/tests.qbs"
+ }
+ SubProject {
+ condition: parent.enableThirdParty
+ filePath: "third_party/third_party.qbs"
+ }
Product {
- name: "_Extra Files_"
+ name: "[CoCpp19 Extra Files]"
files: [
".clang-format",
".clang-tidy",
diff --git a/conan/conanfile.py b/conan/conanfile.py
deleted file mode 100644
index 9a2c2670..00000000
--- a/conan/conanfile.py
+++ /dev/null
@@ -1,100 +0,0 @@
-from conan import ConanFile
-from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
-from conan.tools.files import copy, rmdir
-from conan.tools.build import check_min_cppstd
-
-import os
-
-class Cocpp19Conan(ConanFile):
- name = "co-cpp19"
- version = "1.0"
- description = "C++20 Library with the fastest runtime and compile times"
- author = "Hicknhack Software"
- license = "MIT License"
- url = "https://github.com/basicpp17/co-cpp19"
- homepage = "https://github.com/basicpp17/co-cpp19"
- topics = ("algorithm", "container", "common", "utility")
-
- settings = "os", "arch", "compiler", "build_type"
- options = {
- "shared": [True, False],
- "fPIC": [True, False]
- }
- default_options = {
- "shared": False,
- "fPIC": True
- }
- test_requires = "gtest/1.11.0"
- generators = "CMakeDeps"
-
- def layout(self):
- self.folders.root = ".."
- cmake_layout(self)
-
- def export_sources(self):
- folder = os.path.join(self.recipe_folder, "..")
- copy(self, "CMakeLists.txt", folder, self.export_sources_folder)
- copy(self, "CoCpp19Config.cmake.in", folder, self.export_sources_folder)
- copy(self, "LICENSE", folder, self.export_sources_folder)
- copy(self, "src/*", folder, self.export_sources_folder, excludes="*.qbs")
- copy(self, "third_party/CMakeLists.txt", folder, self.export_sources_folder)
- copy(self, "third_party/googletest.cmake", folder, self.export_sources_folder)
-
- def config_options(self):
- if self.settings.os == "Windows":
- del self.options.fPIC
-
- def validate(self):
- check_min_cppstd(self, "20")
-
- def generate(self):
- tc = CMakeToolchain(self)
- tc.generate()
-
- def build(self):
- cmake = CMake(self)
- cmake.configure()
- cmake.build()
-
- def package(self):
- copy(self, "LICENSE", self.source_folder, self.package_folder)
- cmake = CMake(self)
- cmake.install()
- rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
- rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
-
- def package_info(self):
- self.cpp_info.set_property("cmake_find_mode", "both")
- self.cpp_info.set_property("cmake_file_name", "CoCpp19")
- self.cpp_info.set_property("cmake_target_name", "CoCpp19")
-
- components = [
- {"name": "array19"},
- {"name": "coro19", "requires": ["array19"], "libs": ["coro19"]},
- {"name": "enum19", "requires": ["string19"]},
- {"name": "lookup19", "requires": ["array19"]},
- {"name": "meta19", "requires": ["array19"]},
- {"name": "optional19", "requires": ["meta19"]},
- {"name": "partial19", "requires": ["meta19"]},
- {"name": "serialize19", "requires": ["meta19"]},
- {"name": "signal19", "requires": ["array19"]},
- {"name": "string19", "requires": ["tuple19"]},
- {"name": "strong19", "requires": ["string19"]},
- {"name": "tuple19", "requires": ["meta19"]},
- {"name": "variant19", "requires": ["meta19"]}
- ]
- for comp in components:
- name = comp["name"]
- self.cpp_info.components[name].set_property("cmake_target_name", f"CoCpp19::{name}")
- self.cpp_info.components[name].set_property("pkg_config_name", name)
- if "requires" in comp:
- self.cpp_info.components[name].requires = comp["requires"]
- if "libs" in comp:
- self.cpp_info.components[name].libs = comp["libs"]
-
- # self.cpp_info.names["cmake_find_package"] = "CoCpp19"
- # self.cpp_info.names["cmake_find_package_multi"] = "CoCpp19"
-
- def test(self):
- cmake = CMake(self)
- cmake.test(output_on_failure=True)
diff --git a/conan/docker/clang15.Dockerfile b/conan/docker/clang15.Dockerfile
deleted file mode 100644
index 58a8334e..00000000
--- a/conan/docker/clang15.Dockerfile
+++ /dev/null
@@ -1,15 +0,0 @@
-FROM alpine:3.17
-
-RUN \
- apk add --update --no-cache \
- bash \
- build-base \
- clang15 \
- cmake \
- ninja \
- py3-pip \
- && pip install conan
-
-ENV \
- CC=/usr/bin/clang \
- CXX=/usr/bin/clang++
diff --git a/conan/docker/gcc12.Dockerfile b/conan/docker/gcc12.Dockerfile
deleted file mode 100644
index e3fca880..00000000
--- a/conan/docker/gcc12.Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM alpine:3.17
-
-RUN \
- apk add --update --no-cache \
- bash \
- build-base \
- cmake \
- ninja \
- py3-pip \
- && pip install conan
diff --git a/conan/profiles/clang15-libcxx b/conan/profiles/clang15-libcxx
deleted file mode 100644
index a1b80091..00000000
--- a/conan/profiles/clang15-libcxx
+++ /dev/null
@@ -1,11 +0,0 @@
-[settings]
-os=Linux
-arch=x86_64
-compiler=clang
-compiler.libcxx=libc++
-compiler.version=15
-compiler.cppstd=20
-build_type=Release
-
-[options]
-*:shared=False
diff --git a/conan/profiles/clang15-libstdcpp b/conan/profiles/clang15-libstdcpp
deleted file mode 100644
index b44e270f..00000000
--- a/conan/profiles/clang15-libstdcpp
+++ /dev/null
@@ -1,11 +0,0 @@
-[settings]
-os=Linux
-arch=x86_64
-compiler=clang
-compiler.libcxx=libstdc++11
-compiler.version=15
-compiler.cppstd=20
-build_type=Release
-
-[options]
-*:shared=False
diff --git a/conan/profiles/clang18-libstdcpp b/conan/profiles/clang18-libstdcpp
deleted file mode 100644
index c14c03ce..00000000
--- a/conan/profiles/clang18-libstdcpp
+++ /dev/null
@@ -1,11 +0,0 @@
-[settings]
-os=Linux
-arch=x86_64
-compiler=clang
-compiler.libcxx=libstdc++11
-compiler.version=18
-compiler.cppstd=20
-build_type=Release
-
-[options]
-*:shared=False
diff --git a/conan/profiles/gcc12 b/conan/profiles/gcc12
deleted file mode 100644
index 3bad5639..00000000
--- a/conan/profiles/gcc12
+++ /dev/null
@@ -1,11 +0,0 @@
-[settings]
-os=Linux
-arch=x86_64
-compiler=gcc
-compiler.libcxx=libstdc++11
-compiler.version=12
-compiler.cppstd=20
-build_type=Release
-
-[options]
-*:shared=False
diff --git a/conan/profiles/msvc2022 b/conan/profiles/msvc2022
deleted file mode 100644
index d08c7d7d..00000000
--- a/conan/profiles/msvc2022
+++ /dev/null
@@ -1,14 +0,0 @@
-[settings]
-os=Windows
-arch=x86_64
-compiler=msvc
-compiler.version=194
-compiler.cppstd=20
-compiler.runtime=dynamic
-build_type=Release
-
-[options]
-*:shared=False
-
-[conf]
-tools.cmake.cmaketoolchain:generator=Ninja Multi-Config
diff --git a/conan/tests/array19/CMakeLists.txt b/conan/tests/array19/CMakeLists.txt
deleted file mode 100644
index 0828240e..00000000
--- a/conan/tests/array19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(conan-array19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS array19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/array19.lib/array19/array19.tests.cmake")
diff --git a/conan/tests/array19/conanfile.txt b/conan/tests/array19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/array19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/coro19/CMakeLists.txt b/conan/tests/coro19/CMakeLists.txt
deleted file mode 100644
index 471a08b3..00000000
--- a/conan/tests/coro19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(conan-coro19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS coro19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/coro19.lib/coro19/coro19.tests.cmake")
diff --git a/conan/tests/coro19/conanfile.txt b/conan/tests/coro19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/coro19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/enum19/CMakeLists.txt b/conan/tests/enum19/CMakeLists.txt
deleted file mode 100644
index 99104789..00000000
--- a/conan/tests/enum19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(cocpp19-enum19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS enum19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/enum19.lib/enum19/enum19.tests.cmake")
diff --git a/conan/tests/enum19/conanfile.txt b/conan/tests/enum19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/enum19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/lookup19/CMakeLists.txt b/conan/tests/lookup19/CMakeLists.txt
deleted file mode 100644
index cb1ea5fb..00000000
--- a/conan/tests/lookup19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(cocpp19-lookup19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS lookup19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/lookup19.lib/lookup19/lookup19.tests.cmake")
diff --git a/conan/tests/lookup19/conanfile.txt b/conan/tests/lookup19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/lookup19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/meta19/CMakeLists.txt b/conan/tests/meta19/CMakeLists.txt
deleted file mode 100644
index 3d67da4a..00000000
--- a/conan/tests/meta19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(cocpp19-meta19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS meta19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/meta19.lib/meta19/meta19.tests.cmake")
diff --git a/conan/tests/meta19/conanfile.txt b/conan/tests/meta19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/meta19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/optional19/CMakeLists.txt b/conan/tests/optional19/CMakeLists.txt
deleted file mode 100644
index 0b77a217..00000000
--- a/conan/tests/optional19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(cocpp19-optional19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS optional19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/optional19.lib/optional19/optional19.tests.cmake")
diff --git a/conan/tests/optional19/conanfile.txt b/conan/tests/optional19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/optional19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/partial19/CMakeLists.txt b/conan/tests/partial19/CMakeLists.txt
deleted file mode 100644
index de086d8d..00000000
--- a/conan/tests/partial19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(cocpp19-partial19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS partial19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/partial19.lib/partial19/partial19.tests.cmake")
diff --git a/conan/tests/partial19/conanfile.txt b/conan/tests/partial19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/partial19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/serialize19/CMakeLists.txt b/conan/tests/serialize19/CMakeLists.txt
deleted file mode 100644
index 002b29c9..00000000
--- a/conan/tests/serialize19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(cocpp19-serialize19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS serialize19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/serialize19.lib/serialize19/serialize19.tests.cmake")
diff --git a/conan/tests/serialize19/conanfile.txt b/conan/tests/serialize19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/serialize19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/signal19/CMakeLists.txt b/conan/tests/signal19/CMakeLists.txt
deleted file mode 100644
index 625b5844..00000000
--- a/conan/tests/signal19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(cocpp19-signal19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS signal19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/signal19.lib/signal19/signal19.tests.cmake")
diff --git a/conan/tests/signal19/conanfile.txt b/conan/tests/signal19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/signal19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/string19/CMakeLists.txt b/conan/tests/string19/CMakeLists.txt
deleted file mode 100644
index de5c17a7..00000000
--- a/conan/tests/string19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(cocpp19-string19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS string19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/string19.lib/string19/string19.tests.cmake")
diff --git a/conan/tests/string19/conanfile.txt b/conan/tests/string19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/string19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/strong19/CMakeLists.txt b/conan/tests/strong19/CMakeLists.txt
deleted file mode 100644
index 7917bd55..00000000
--- a/conan/tests/strong19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(cocpp19-strong19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS strong19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/strong19.lib/strong19/strong19.tests.cmake")
diff --git a/conan/tests/strong19/conanfile.txt b/conan/tests/strong19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/strong19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/tuple19/CMakeLists.txt b/conan/tests/tuple19/CMakeLists.txt
deleted file mode 100644
index e32bd13e..00000000
--- a/conan/tests/tuple19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(cocpp19-tuple19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS tuple19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/tuple19.lib/tuple19/tuple19.tests.cmake")
diff --git a/conan/tests/tuple19/conanfile.txt b/conan/tests/tuple19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/tuple19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/conan/tests/variant19/CMakeLists.txt b/conan/tests/variant19/CMakeLists.txt
deleted file mode 100644
index 6f9433b7..00000000
--- a/conan/tests/variant19/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-cmake_minimum_required(VERSION 3.15)
-project(cocpp19-variant19)
-set(CMAKE_CXX_STANDARD 20)
-
-set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})
-find_package(GTest REQUIRED)
-find_package(CoCpp19 COMPONENTS variant19 REQUIRED)
-
-enable_testing()
-
-include("../../../src/variant19.lib/variant19/variant19.tests.cmake")
diff --git a/conan/tests/variant19/conanfile.txt b/conan/tests/variant19/conanfile.txt
deleted file mode 100644
index e60e0d8c..00000000
--- a/conan/tests/variant19/conanfile.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[requires]
-co-cpp19/1.0
-gtest/1.11.0
-
-[generators]
-CMakeDeps
-CMakeToolchain
diff --git a/qbs/imports/online/QbsProject.qbs b/qbs/imports/online/QbsProject.qbs
new file mode 100644
index 00000000..b7c52f3d
--- /dev/null
+++ b/qbs/imports/online/QbsProject.qbs
@@ -0,0 +1,6 @@
+SubProject {
+ property variant source
+
+ condition: source && source.found
+ filePath: source.projectFilePath
+}
diff --git a/qbs/imports/online/Source.qbs b/qbs/imports/online/Source.qbs
new file mode 100644
index 00000000..25d506ce
--- /dev/null
+++ b/qbs/imports/online/Source.qbs
@@ -0,0 +1,32 @@
+import "onlinesource.js" as OnlineSource
+
+Probe {
+ id: probe
+
+ property string name
+ property string uri
+ property string projectFile
+ property path sourceCache
+ property path buildDirectory: project.buildDirectory
+
+ // Results
+ property path sourceDirectory
+ property path projectFilePath
+
+ configure: {
+ var result = OnlineSource.fetch({
+ name: probe.name,
+ uri: probe.uri,
+ projectFile: probe.projectFile,
+ sourceCache: probe.sourceCache,
+ buildDirectory: probe.buildDirectory,
+ });
+ if (result) {
+ sourceDirectory = result.sourceDirectory;
+ if (result.projectFile) projectFilePath = result.projectFile;
+ found = true;
+ } else {
+ found = false;
+ }
+ }
+}
diff --git a/qbs/imports/online/onlinesource.js b/qbs/imports/online/onlinesource.js
new file mode 100644
index 00000000..24eb63ad
--- /dev/null
+++ b/qbs/imports/online/onlinesource.js
@@ -0,0 +1,423 @@
+// MIT License
+// [[
+// Copyright 2026 HicknHack Sotware GmbH
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+// ]]
+var Environment = require("qbs.Environment");
+var File = require("qbs.File");
+var FileInfo = require("qbs.FileInfo");
+var Process = require("qbs.Process");
+var TextFile = require("qbs.TextFile");
+
+/**
+ * Parse a URI string into its components.
+ * Supports:
+ * - gh:user/repo@version#tag
+ * - gl:user/repo@version#tag
+ * - bb:user/repo@version#tag
+ * - https://github.com/user/repo.git@version#tag
+ * - https://example.com/package.zip@version
+ *
+ * @param {string} uri - The URI to parse
+ * @returns {object} Parsed URI components: { scheme, user, repo, version, tag, url, type }
+ */
+function parseUri(uri) {
+ var result = {
+ scheme: null,
+ user: null,
+ repo: null,
+ version: null,
+ tag: null,
+ url: null,
+ type: "git", // "git", "archive", or "local"
+ localPath: null
+ };
+
+ if (!uri || uri.trim() === "")
+ return result;
+
+ // Check for file:// scheme (local path)
+ var fileMatch = uri.match(/^file:\/\/(.+)$/);
+ if (fileMatch) {
+ result.type = "local";
+ result.localPath = fileMatch[1];
+ result.url = uri;
+ return result;
+ }
+
+ // Check for absolute local path (Windows or Unix)
+ if (uri.match(/^[A-Za-z]:[\\/]/) || uri.match(/^\/[^\/]/)) {
+ result.type = "local";
+ result.localPath = uri;
+ result.url = uri;
+ return result;
+ }
+
+ // Extract version (@...) - only the last occurrence
+ var versionMatch = uri.match(/@([^@#]+)(?:#|$)/);
+ if (versionMatch) {
+ result.version = versionMatch[1];
+ uri = uri.replace(/@[^@#]+(?=#|$)/, "");
+ }
+
+ // Extract tag (#...) - only the last occurrence
+ var tagMatch = uri.match(/#([^#]+)$/);
+ if (tagMatch) {
+ result.tag = tagMatch[1];
+ uri = uri.replace(/#[^#]+$/, "");
+ }
+
+ // Check for shorthand schemes
+ var shorthandMatch = uri.match(/^(gh|gl|bb):(.+)$/);
+ if (shorthandMatch) {
+ result.scheme = shorthandMatch[1];
+ var path = shorthandMatch[2];
+ var parts = path.split("/");
+ if (parts.length >= 2) {
+ result.user = parts[0];
+ result.repo = parts.slice(1).join("/");
+ }
+
+ // Convert to full URL
+ switch (result.scheme) {
+ case "gh":
+ result.url = "https://github.com/" + result.user + "/" + result.repo + ".git";
+ break;
+ case "gl":
+ result.url = "https://gitlab.com/" + result.user + "/" + result.repo + ".git";
+ break;
+ case "bb":
+ result.url = "https://bitbucket.org/" + result.user + "/" + result.repo + ".git";
+ break;
+ }
+ result.type = "git";
+ } else if (uri.match(/\.git\/?$/)) {
+ // Full git URL
+ result.url = uri;
+ result.type = "git";
+
+ // Try to extract user/repo from URL
+ var gitMatch = uri.match(/([^\/]+)\/([^\/]+?)(?:\.git)?\/?$/);
+ if (gitMatch) {
+ result.user = gitMatch[1];
+ result.repo = gitMatch[2].replace(/\.git$/, "");
+ }
+ } else if (uri.match(/\.(zip|tar\.gz|tar\.bz2|tar\.xz|tgz)(?:\?|$)/i)) {
+ // Archive URL
+ result.url = uri;
+ result.type = "archive";
+
+ // Try to extract name from URL
+ var archiveMatch = uri.match(/([^\/]+)\.(zip|tar\.gz|tar\.bz2|tar\.xz|tgz)/i);
+ if (archiveMatch) {
+ result.repo = archiveMatch[1];
+ }
+ } else {
+ // Assume it's a git URL without .git extension
+ result.url = uri;
+ result.type = "git";
+ }
+
+ // Default tag to version if not specified
+ if (!result.tag && result.version) {
+ if (result.version.match(/^[0-9a-f]{40}$/i)) {
+ result.tag = result.version;
+ } else {
+ result.tag = "v" + result.version;
+ }
+ }
+
+ return result;
+}
+
+/**
+ * Get the cache directory for a package
+ */
+function getCacheDir(sourceCache, packageName, uriInfo) {
+ var cacheBase = sourceCache;
+ if (!cacheBase || cacheBase.trim() === "") {
+ cacheBase = Environment.getEnv("QBS_SOURCE_CACHE");
+ }
+ if (!cacheBase || cacheBase.trim() === "") {
+ // Default to temp directory
+ cacheBase = FileInfo.joinPaths(Environment.getEnv("TEMP") || "/tmp", "qbs-source-cache");
+ }
+
+ var packageDir = packageName.replace(/\./g, "/");
+ var versionDir = uriInfo.version || uriInfo.tag || "latest";
+
+ return FileInfo.joinPaths(cacheBase, packageDir, versionDir);
+}
+
+/**
+ * Clone a git repository
+ */
+function cloneGitRepo(url, tag, destDir) {
+ console.info("OnlineSource: Cloning " + url + (tag ? " (tag: " + tag + ")" : ""));
+
+ var process = new Process();
+ try {
+ var args = ["clone"];
+
+ // Use shallow clone for tags
+ if (tag) {
+ args.push("--depth", "1");
+ if (tag.match(/^[0-9a-f]{40}$/i)) {
+ args.push("--revision", tag);
+ } else {
+ args.push("--branch", tag);
+ }
+ }
+
+ args.push(url, destDir);
+
+ process.exec("git", args, true);
+
+ if (process.exitCode() !== 0) {
+ throw "Git clone failed: " + process.readStdErr();
+ }
+
+ console.info("OnlineSource: Successfully cloned to " + destDir);
+ return true;
+ } finally {
+ process.close();
+ }
+}
+
+/**
+ * Download and extract an archive
+ */
+function downloadArchive(url, destDir) {
+ console.info("OnlineSource: Downloading " + url);
+
+ File.makePath(destDir);
+
+ var filename = url.match(/([^\/\?]+)(?:\?.*)?$/)[1];
+ var archivePath = FileInfo.joinPaths(destDir, filename);
+
+ var process = new Process();
+ try {
+ // Try curl first, fall back to wget
+ var result = process.exec("curl", ["-L", "-o", archivePath, url], false);
+ if (result !== 0) {
+ result = process.exec("wget", ["-O", archivePath, url], false);
+ }
+
+ if (result !== 0) {
+ throw "Failed to download archive: " + url;
+ }
+
+ // Extract based on extension
+ if (filename.match(/\.zip$/i)) {
+ process.exec("unzip", ["-o", archivePath, "-d", destDir], true);
+ } else if (filename.match(/\.(tar\.gz|tgz)$/i)) {
+ process.exec("tar", ["-xzf", archivePath, "-C", destDir], true);
+ } else if (filename.match(/\.tar\.bz2$/i)) {
+ process.exec("tar", ["-xjf", archivePath, "-C", destDir], true);
+ } else if (filename.match(/\.tar\.xz$/i)) {
+ process.exec("tar", ["-xJf", archivePath, "-C", destDir], true);
+ }
+
+ console.info("OnlineSource: Successfully extracted to " + destDir);
+ return true;
+ } finally {
+ process.close();
+ }
+}
+
+/**
+ * Find Qbs project file in source directory
+ * Returns the path to the main .qbs file, or null if not found
+ */
+function detectQbsProject(sourceDir, projectFile) {
+ // If user specified a project file, use that
+ if (projectFile) {
+ var specifiedPath = FileInfo.joinPaths(sourceDir, projectFile);
+ if (File.exists(specifiedPath)) {
+ return {
+ projectFile: specifiedPath,
+ isQbsProject: true
+ };
+ }
+ console.warn("OnlineSource: Specified project file not found: " + specifiedPath);
+ return null;
+ }
+
+ // Look for .qbs files in root directory
+ var entries = File.directoryEntries(sourceDir, File.Files);
+ var qbsFiles = [];
+ for (var i = 0; i < entries.length; i++) {
+ if (entries[i].match(/\.qbs$/)) {
+ qbsFiles.push(entries[i]);
+ }
+ }
+
+ if (qbsFiles.length === 0) {
+ return null;
+ }
+
+ if (qbsFiles.length === 1) {
+ return {
+ projectFile: FileInfo.joinPaths(sourceDir, qbsFiles[0]),
+ isQbsProject: true
+ };
+ }
+
+ // Multiple .qbs files - look for common patterns
+ var preferredNames = ["project.qbs", sourceDir.split("/").pop() + ".qbs"];
+ for (var j = 0; j < preferredNames.length; j++) {
+ if (qbsFiles.indexOf(preferredNames[j]) !== -1) {
+ return {
+ projectFile: FileInfo.joinPaths(sourceDir, preferredNames[j]),
+ isQbsProject: true
+ };
+ }
+ }
+
+ // Default to first one found
+ console.warn("OnlineSource: Multiple .qbs files found, using: " + qbsFiles[0]);
+ return {
+ projectFile: FileInfo.joinPaths(sourceDir, qbsFiles[0]),
+ isQbsProject: true
+ };
+}
+
+function loadCache(cacheFile) {
+ if (!File.exists(cacheFile))
+ return {};
+
+ try {
+ var file = new TextFile(cacheFile, TextFile.ReadOnly);
+ var content = file.readAll();
+ file.close();
+ var data = JSON.parse(content);
+ var lastModified = Date.parse(data["lastmodified"]);
+ var now = new Date();
+ if ((now - lastModified) > 30000) {
+ console.info("OnlineSource: Cache expired (" + (now - lastModified) + "ms old)");
+ return {};
+ }
+ console.info("OnlineSource: Cache good (" + (now - lastModified) + "ms old)");
+ return data;
+ } catch (e) {
+ console.warn("OnlineSource: Failed to read cache file: " + e);
+ return {};
+ }
+}
+
+function saveCache(cacheFile, data) {
+ try {
+ data["lastmodified"] = new Date().toISOString();
+ File.makePath(FileInfo.path(cacheFile));
+ var file = new TextFile(cacheFile, TextFile.WriteOnly);
+ file.write(JSON.stringify(data, null, 4));
+ file.close();
+ } catch (e) {
+ console.warn("OnlineSource: Failed to write cache file: " + e);
+ }
+}
+
+/**
+ * fetch - Determine source directory and other properties
+ */
+function fetch(options) {
+ var name = options.name;
+ if (!name || name.trim() === "") {
+ console.warn("OnlineSource: No module name provided");
+ return null;
+ }
+
+ var cacheFile = FileInfo.joinPaths(options.buildDirectory, "online-source", "resolution-cache.json");
+ var resolvedModules = loadCache(cacheFile);
+
+ // Check resolution cache first
+ if (resolvedModules[name]) {
+ console.info("OnlineSource: Using cached resolution for '" + name + "'");
+ return resolvedModules[name];
+ }
+
+ var uri = options.uri;
+ if (!uri) {
+ console.warn("OnlineSource: No URI configured for module '" + name + "'");
+ return null;
+ }
+
+ console.info("OnlineSource: Setting up module '" + name + "' from " + uri);
+
+ var uriInfo = parseUri(uri);
+ if (!uriInfo.url && !uriInfo.localPath) {
+ throw "OnlineSource: Invalid URI '" + uri + "' for module '" + name + "'";
+ }
+
+ var sourceDir = Environment.getEnv("QBS_"+ name.toUpperCase() +"_SOURCE");
+
+ if (sourceDir && sourceDir.trim !== "") {
+ console.info("OnlineSource: Using environment path " + sourceDir);
+ }
+ else if (uriInfo.type === "local") { // Handle local paths directly (no caching needed)
+ sourceDir = uriInfo.localPath;
+ if (!File.exists(sourceDir)) {
+ throw "OnlineSource: Local path does not exist: " + sourceDir;
+ }
+ console.info("OnlineSource: Using local path " + sourceDir);
+ }
+ else {
+ var cacheDir = getCacheDir(options.sourceCache, name, uriInfo);
+ sourceDir = cacheDir;
+
+ var alreadyCached = File.exists(cacheDir) && File.exists(FileInfo.joinPaths(cacheDir, ".onlinesource-cached"));
+ if (!alreadyCached) {
+ File.makePath(cacheDir);
+
+ if (uriInfo.type === "git") {
+ cloneGitRepo(uriInfo.url, uriInfo.tag, cacheDir);
+ } else if (uriInfo.type === "archive") {
+ downloadArchive(uriInfo.url, cacheDir);
+
+ // Find the extracted directory (archives often have a single root folder)
+ var entries = File.directoryEntries(cacheDir, File.Dirs | File.NoDotAndDotDot);
+ if (entries.length === 1) {
+ sourceDir = FileInfo.joinPaths(cacheDir, entries[0]);
+ }
+ }
+
+ var markerFile = new TextFile(FileInfo.joinPaths(cacheDir, ".onlinesource-cached"), TextFile.WriteOnly);
+ markerFile.writeLine(new Date().toISOString());
+ markerFile.writeLine(uri);
+ markerFile.close();
+ } else {
+ console.info("OnlineSource: Using cached version at " + cacheDir);
+ }
+ }
+
+ var qbsInfo = detectQbsProject(sourceDir, options.projectFile);
+ if (qbsInfo) {
+ console.info("OnlineSource: Detected Qbs project: " + qbsInfo.projectFile);
+ }
+
+ var result = {
+ sourceDirectory: sourceDir,
+ projectFile: (qbsInfo && qbsInfo.isQbsProject) ? qbsInfo.projectFile : null
+ };
+
+ resolvedModules[name] = result;
+ saveCache(cacheFile, resolvedModules);
+ return result;
+}
diff --git a/script/ci/conan.sh b/script/ci/conan.sh
deleted file mode 100755
index 61acee59..00000000
--- a/script/ci/conan.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-set -e # stop on first error
-
-# default arguments:
-# script/create_conan.sh gcc12
-ConanProfile=${1:-gcc12}
-shift
-
-cd "$(dirname "${BASH_SOURCE[0]}")/../.."
-BASE_DIR="$(pwd)"
-
-script/create_conan.sh "${ConanProfile}"
-
-for test in conan/tests/*/
-do
- script/test_conan.sh "$(basename "${test}")" --profile:all="${BASE_DIR}/conan/profiles/${ConanProfile}"
-done
diff --git a/script/create_conan.sh b/script/create_conan.sh
deleted file mode 100755
index 36b3dfc6..00000000
--- a/script/create_conan.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-set -e # stop on first error
-
-# default arguments:
-# script/create_conan.sh gcc12
-ConanProfile=${1:-gcc12}
-shift
-
-cd "$(dirname "${BASH_SOURCE[0]}")/.."
-BASE_DIR="$(pwd)"
-
-conan create conan --build=missing --profile:all="./conan/profiles/${ConanProfile}"
diff --git a/script/docker_run_cmake_gcc_conan.sh b/script/docker_run_cmake_gcc_conan.sh
deleted file mode 100755
index c1499324..00000000
--- a/script/docker_run_cmake_gcc_conan.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-PROJECT="co-cpp19"
-IMAGE="conanio/gcc12-ubuntu18.04:latest"
-BUILD_VOLUME="${PROJECT}-conan-build"
-
-cd "$(dirname "$0")/.."
-docker run -it --rm --mount "src=$(pwd),target=/project,type=bind" -w /project --mount "src=${BUILD_VOLUME},target=/project/build,type=volume" "${IMAGE}" "$@"
diff --git a/script/git_clone_googletest.sh b/script/git_clone_googletest.sh
new file mode 100755
index 00000000..e5db3ba2
--- /dev/null
+++ b/script/git_clone_googletest.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+# we have not git on docker containers (only compilers)
+set -e
+
+SCRIPT_DIR="$(dirname "$0")"
+REPO="https://github.com/google/googletest.git"
+TAG="v1.17.0"
+
+if [ ! -d "${SCRIPT_DIR}/googletest" ]; then
+ git clone --branch "${TAG}" --depth 1 --no-tags "${REPO}" "${SCRIPT_DIR}/googletest"
+else
+ pushd "${SCRIPT_DIR}/googletest"
+ git fetch origin tag "${TAG}" --depth 1 --no-tags
+ git reset --hard FETCH_HEAD
+ popd
+fi
diff --git a/script/test_conan.bat b/script/test_conan.bat
deleted file mode 100644
index a13473d4..00000000
--- a/script/test_conan.bat
+++ /dev/null
@@ -1,36 +0,0 @@
-@echo off
-setlocal enabledelayedexpansion
-
-:: default arguments:
-:: script/test_conan.bat array19
-if "%~1"=="" (
- set ConanCase=array19
-) else (
- set ConanCase=%1
-)
-
-set "BUILD_PATH=build/conan-%ConanCase%"
-set "SOURCE_PATH=conan/tests/%ConanCase%"
-set "BASE_DIR=%~dp0.."
-set "ConfigPreset=conan-default"
-set "BuildPreset=conan-release"
-set "TestPreset=conan-release"
-
-pushd "%~dp0.."
-
-mkdir "%BUILD_PATH%"
-cd "%BUILD_PATH%"
-
-conan install "%BASE_DIR%/%SOURCE_PATH%" --output-folder=. %2 %3 %4 %5
-if !errorlevel! neq 0 exit /b !errorlevel!
-
-cmake "%BASE_DIR%/%SOURCE_PATH%" --preset "%ConfigPreset%"
-if !errorlevel! neq 0 exit /b !errorlevel!
-
-cmake --build --preset "%BuildPreset%"
-if !errorlevel! neq 0 exit /b !errorlevel!
-
-ctest --preset "%TestPreset%"
-if !errorlevel! neq 0 exit /b !errorlevel!
-
-popd
diff --git a/script/test_conan.sh b/script/test_conan.sh
deleted file mode 100755
index d02b9616..00000000
--- a/script/test_conan.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-set -e # stop on first error
-
-# default arguments:
-# script/test_conan.sh array19
-ConanCase=${1:-array19}
-shift
-
-BUILD_PATH="build/conan-${ConanCase}"
-SOURCE_PATH="conan/tests/${ConanCase}"
-ConfigPreset="conan-release" # "conan-default" for multi config generators
-BuildPreset="conan-release"
-TestPreset="conan-release"
-
-cd "$(dirname "${BASH_SOURCE[0]}")/.."
-BASE_DIR="$(pwd)"
-
-mkdir -p ${BUILD_PATH}
-cd ${BUILD_PATH}
-conan install "${BASE_DIR}/${SOURCE_PATH}" --output-folder=. "$@"
-cmake "${BASE_DIR}/${SOURCE_PATH}" --preset "${ConfigPreset}"
-cmake --build --preset "${BuildPreset}"
-ctest --preset "${TestPreset}"
diff --git a/src/array19.lib/CMakeLists.txt b/src/array19.lib/CMakeLists.txt
index a23e61d1..74778b3f 100644
--- a/src/array19.lib/CMakeLists.txt
+++ b/src/array19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include("array19/array19.cmake")
-include("array19/array19.tests.cmake")
+
+if(COCPP_BuildTests)
+ include("array19/array19.tests.cmake")
+endif()
diff --git a/src/array19.lib/array19.lib.qbs b/src/array19.lib/array19.lib.qbs
deleted file mode 100644
index b0685ebc..00000000
--- a/src/array19.lib/array19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "array19.lib"
-
- references: [
- "array19/array19.qbs",
- "array19/array19.tests.qbs",
- ]
-}
diff --git a/src/array19.lib/array19/array19.cmake b/src/array19.lib/array19/array19.cmake
index 98d49b0c..7d53f7f6 100644
--- a/src/array19.lib/array19/array19.cmake
+++ b/src/array19.lib/array19/array19.cmake
@@ -1,30 +1,33 @@
add_library(array19 INTERFACE)
target_compile_features(array19
- INTERFACE cxx_std_20
+ INTERFACE cxx_std_20
)
target_include_directories(array19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB array19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(array19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${array19_headers}
)
add_library(CoCpp19::array19 ALIAS array19)
-install(TARGETS array19
- EXPORT array19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "array19"
-)
-install(EXPORT array19Targets
- FILE "CoCpp19-array19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "array19"
-)
+
+if(COCPP_Install)
+ install(TARGETS array19
+ EXPORT array19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "array19"
+ )
+ install(EXPORT array19Targets
+ FILE "CoCpp19-array19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "array19"
+ )
+endif()
diff --git a/src/array19.lib/array19/array19.qbs b/src/array19.lib/array19/array19.qbs
index f52d75c7..12cc180c 100644
--- a/src/array19.lib/array19/array19.qbs
+++ b/src/array19.lib/array19/array19.qbs
@@ -1,13 +1,6 @@
+import qbs.FileInfo
Product {
- Depends { name: "cpp19" }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: exportingProduct.sourceDirectory + "/.."
- Depends { name: "cpp19" }
- }
-
files: [
"AllocatedArrayOf.equals.h",
"AllocatedArrayOf.h",
@@ -33,4 +26,12 @@ Product {
"Zip.h",
"adlRange.h",
]
+
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Depends { name: "cpp" }
+ Depends { name: project.configProductName }
+ }
+ Depends { name: project.configProductName }
}
diff --git a/src/array19.lib/array19/array19.tests.cmake b/src/array19.lib/array19/array19.tests.cmake
index 67be8f82..7f992439 100644
--- a/src/array19.lib/array19/array19.tests.cmake
+++ b/src/array19.lib/array19/array19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(array19-test)
file(GLOB array19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(array19-test
- PRIVATE ${array19_test_sources}
+ PRIVATE ${array19_test_sources}
)
target_link_libraries(array19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::array19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::array19
)
add_test(NAME array19 COMMAND array19-test)
diff --git a/src/array19.lib/array19/array19.tests.qbs b/src/array19.lib/array19/array19.tests.qbs
index e86d670f..26eb84d8 100644
--- a/src/array19.lib/array19/array19.tests.qbs
+++ b/src/array19.lib/array19/array19.tests.qbs
@@ -1,18 +1,12 @@
Application {
name: "array19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "array19" }
- Depends { name: "googletest" }
-
- // Depends { name: "cpp" }
- // cpp.combineCxxSources: true
-
+ type: base.concat(["autotest"])
files: [
"*.test.cpp",
]
+
+ Depends { name: "array19" }
+ Depends { name: "googletest" }
}
diff --git a/src/coro19.lib/CMakeLists.txt b/src/coro19.lib/CMakeLists.txt
index 40003bbb..ccbde5c9 100644
--- a/src/coro19.lib/CMakeLists.txt
+++ b/src/coro19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(coro19/coro19.cmake)
-include(coro19/coro19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(coro19/coro19.tests.cmake)
+endif()
diff --git a/src/coro19.lib/coro19.lib.qbs b/src/coro19.lib/coro19.lib.qbs
deleted file mode 100644
index 3bce13ec..00000000
--- a/src/coro19.lib/coro19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "coro19.lib"
-
- references: [
- "coro19/coro19.qbs",
- "coro19/coro19.tests.qbs",
- ]
-}
diff --git a/src/coro19.lib/coro19/coro19.cmake b/src/coro19.lib/coro19/coro19.cmake
index 7666f031..9b3ae7c3 100644
--- a/src/coro19.lib/coro19/coro19.cmake
+++ b/src/coro19.lib/coro19/coro19.cmake
@@ -1,33 +1,36 @@
add_library(coro19 STATIC)
target_link_libraries(coro19
- PUBLIC CoCpp19::array19
+ PUBLIC CoCpp19::array19
)
target_include_directories(coro19
- PUBLIC
+ PUBLIC
$
$
)
file(GLOB coro19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(coro19
- PRIVATE "coro19/coroutine.cpp"
- PUBLIC FILE_SET public_headers
+ PRIVATE "coro19/coroutine.cpp"
+ PUBLIC FILE_SET public_headers
TYPE HEADERS
FILES ${coro19_headers}
)
add_library(CoCpp19::coro19 ALIAS coro19)
-install(TARGETS coro19
- EXPORT coro19Targets
- LIBRARY COMPONENT "coro19"
- ARCHIVE COMPONENT "coro19"
- RUNTIME COMPONENT "coro19"
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "coro19"
-)
-install(EXPORT coro19Targets
- FILE "CoCpp19-coro19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "coro19"
-)
+
+if(COCPP_Install)
+ install(TARGETS coro19
+ EXPORT coro19Targets
+ LIBRARY COMPONENT "coro19"
+ ARCHIVE COMPONENT "coro19"
+ RUNTIME COMPONENT "coro19"
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "coro19"
+ )
+ install(EXPORT coro19Targets
+ FILE "CoCpp19-coro19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "coro19"
+ )
+endif()
diff --git a/src/coro19.lib/coro19/coro19.qbs b/src/coro19.lib/coro19/coro19.qbs
index 2810aa3a..3e99d694 100644
--- a/src/coro19.lib/coro19/coro19.qbs
+++ b/src/coro19.lib/coro19/coro19.qbs
@@ -1,21 +1,7 @@
+import qbs.FileInfo
import qbs.Utilities
StaticLibrary {
- Depends { name: "cpp" }
- Depends { name: "array19" }
- Properties {
- condition: qbs.toolchain.contains('msvc') && !qbs.toolchain.contains('clang-cl') && (Utilities.versionCompare(cpp.compilerVersion, '19.28.29333') < 0)
- cpp.cxxFlags: base.concat("/await") // enable coroutine-ts
- }
- Properties {
- condition: qbs.toolchain.contains('msvc') && qbs.toolchain.contains('clang-cl') && cpp.compilerVersionMajor < 11
- cpp.cxxFlags: base.concat("-Xclang", "-fcoroutines-ts") // enable coroutine-ts
- }
- Properties {
- condition: qbs.toolchain.contains('clang') && cpp.compilerVersionMajor < 11
- cpp.cxxFlags: base.concat("-fcoroutines-ts") // enable coroutine-ts
- }
-
files: [
"CoEnumerator.h",
"CoEnumerator.range.h",
@@ -24,21 +10,11 @@ StaticLibrary {
]
Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
Depends { name: "cpp" }
- cpp.includePaths: [ exportingProduct.sourceDirectory + "/.." ]
Depends { name: "array19" }
-
- Properties {
- condition: qbs.toolchain.contains('msvc') && !qbs.toolchain.contains('clang-cl') && (Utilities.versionCompare(cpp.compilerVersion, '19.28.29333') < 0)
- cpp.cxxFlags: base.concat("/await") // enable coroutine-ts
- }
- Properties {
- condition: qbs.toolchain.contains('msvc') && qbs.toolchain.contains('clang-cl') && cpp.compilerVersionMajor < 11
- cpp.cxxFlags: base.concat("-Xclang", "-fcoroutines-ts") // enable coroutine-ts
- }
- Properties {
- condition: qbs.toolchain.contains('clang') && cpp.compilerVersionMajor < 11
- cpp.cxxFlags: base.concat("-fcoroutines-ts") // enable coroutine-ts
- }
}
+ Depends { name: "cpp" }
+ Depends { name: "array19" }
}
diff --git a/src/coro19.lib/coro19/coro19.tests.cmake b/src/coro19.lib/coro19/coro19.tests.cmake
index 0f0cfa15..c042c091 100644
--- a/src/coro19.lib/coro19/coro19.tests.cmake
+++ b/src/coro19.lib/coro19/coro19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(coro19-test)
file(GLOB coro19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(coro19-test
- PRIVATE ${coro19_test_sources}
+ PRIVATE ${coro19_test_sources}
)
target_link_libraries(coro19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::coro19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::coro19
)
add_test(NAME coro19 COMMAND coro19-test)
diff --git a/src/coro19.lib/coro19/coro19.tests.qbs b/src/coro19.lib/coro19/coro19.tests.qbs
index deff9ec3..3f070057 100644
--- a/src/coro19.lib/coro19/coro19.tests.qbs
+++ b/src/coro19.lib/coro19/coro19.tests.qbs
@@ -1,16 +1,13 @@
Application {
name: "coro19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "coro19" }
- Depends { name: "googletest" }
-
+ type: base.concat(["autotest"])
files: [
"CoEnumerator.rang.test.cpp",
"CoEnumerator.test.cpp",
]
+
+ Depends { name: "coro19" }
+ Depends { name: "googletest" }
}
diff --git a/src/coro19.lib/coro19/coroutine.cpp b/src/coro19.lib/coro19/coroutine.cpp
index 1e90d5ef..252a9a0b 100644
--- a/src/coro19.lib/coro19/coroutine.cpp
+++ b/src/coro19.lib/coro19/coroutine.cpp
@@ -1,7 +1,7 @@
// requires C++ 17 __has_include
-#if __has_include()
+#if defined(_MSC_VER) && __has_include()
# include
#endif
#if __has_include()
diff --git a/src/coro19.lib/coro19/coroutine.h b/src/coro19.lib/coro19/coroutine.h
index 8679bc37..3c2cea5f 100644
--- a/src/coro19.lib/coro19/coroutine.h
+++ b/src/coro19.lib/coro19/coroutine.h
@@ -16,7 +16,7 @@
#pragma once
// requires C++ 17 __has_include
-#if __has_include()
+#if defined(_MSC_VER) && __has_include()
# include
#endif
#if __has_include()
@@ -300,8 +300,7 @@ template struct hash> {
using result_type = size_t;
[[nodiscard]] //
- result_type
- operator()(argument_type const& _Handle) const noexcept {
+ result_type operator()(argument_type const& _Handle) const noexcept {
return hash()(_Handle.address());
}
};
diff --git a/src/enum19.lib/CMakeLists.txt b/src/enum19.lib/CMakeLists.txt
index 1fce7e01..35ab49fb 100644
--- a/src/enum19.lib/CMakeLists.txt
+++ b/src/enum19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(enum19/enum19.cmake)
-include(enum19/enum19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(enum19/enum19.tests.cmake)
+endif()
diff --git a/src/enum19.lib/enum19.lib.qbs b/src/enum19.lib/enum19.lib.qbs
deleted file mode 100644
index 2ff47a67..00000000
--- a/src/enum19.lib/enum19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "enum19.lib"
-
- references: [
- "enum19/enum19.qbs",
- "enum19/enum19.tests.qbs",
- ]
-}
diff --git a/src/enum19.lib/enum19/enum19.cmake b/src/enum19.lib/enum19/enum19.cmake
index f9bbc0f3..9ffeda34 100644
--- a/src/enum19.lib/enum19/enum19.cmake
+++ b/src/enum19.lib/enum19/enum19.cmake
@@ -1,29 +1,32 @@
add_library(enum19 INTERFACE)
target_link_libraries(enum19
- INTERFACE CoCpp19::string19
+ INTERFACE CoCpp19::string19
)
target_include_directories(enum19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB enum19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(enum19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${enum19_headers}
)
add_library(CoCpp19::enum19 ALIAS enum19)
-install(TARGETS enum19
- EXPORT enum19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "enum19"
-)
-install(EXPORT enum19Targets
- FILE "CoCpp19-enum19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "enum19"
-)
+
+if(COCPP_Install)
+ install(TARGETS enum19
+ EXPORT enum19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "enum19"
+ )
+ install(EXPORT enum19Targets
+ FILE "CoCpp19-enum19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "enum19"
+ )
+endif()
diff --git a/src/enum19.lib/enum19/enum19.qbs b/src/enum19.lib/enum19/enum19.qbs
index 79155454..babeccbb 100644
--- a/src/enum19.lib/enum19/enum19.qbs
+++ b/src/enum19.lib/enum19/enum19.qbs
@@ -1,15 +1,6 @@
+import qbs.FileInfo
Product {
- Depends { name: "cpp" }
- Depends { name: "string19" }
- Depends { name: "fmt"; required: false }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: [exportingProduct.sourceDirectory + "/.."]
- Depends { name: "string19" }
- }
-
files: [
"ADL.h",
"Enum.extras.ostream.h",
@@ -20,4 +11,14 @@ Product {
"Enum.ostream.h",
"visitEnumMemberNames.h",
]
+
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Depends { name: "cpp" }
+ Depends { name: "string19" }
+ }
+ Depends { name: "cpp" }
+ Depends { name: "string19" }
+ Depends { name: "fmt"; required: false }
}
diff --git a/src/enum19.lib/enum19/enum19.tests.cmake b/src/enum19.lib/enum19/enum19.tests.cmake
index f2871aae..570d90f8 100644
--- a/src/enum19.lib/enum19/enum19.tests.cmake
+++ b/src/enum19.lib/enum19/enum19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(enum19-test)
file(GLOB enum19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(enum19-test
- PRIVATE ${enum19_test_sources}
+ PRIVATE ${enum19_test_sources}
)
target_link_libraries(enum19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::enum19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::enum19
)
add_test(NAME enum19 COMMAND enum19-test)
diff --git a/src/enum19.lib/enum19/enum19.tests.qbs b/src/enum19.lib/enum19/enum19.tests.qbs
index a9ef9232..ac8ed124 100644
--- a/src/enum19.lib/enum19/enum19.tests.qbs
+++ b/src/enum19.lib/enum19/enum19.tests.qbs
@@ -1,17 +1,14 @@
Application {
name: "enum19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "enum19" }
- Depends { name: "googletest" }
-
+ type: base.concat(["autotest"])
files: [
"Enum.ostream.test.cpp",
"Enum.test.cpp",
"Enum.max.test.cpp",
]
+
+ Depends { name: "enum19" }
+ Depends { name: "googletest" }
}
diff --git a/src/flags19.lib/CMakeLists.txt b/src/flags19.lib/CMakeLists.txt
index fb186ef7..df107ced 100644
--- a/src/flags19.lib/CMakeLists.txt
+++ b/src/flags19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(flags19/flags19.cmake)
-include(flags19/flags19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(flags19/flags19.tests.cmake)
+endif()
diff --git a/src/flags19.lib/flags19.lib.qbs b/src/flags19.lib/flags19.lib.qbs
deleted file mode 100644
index b31b8f86..00000000
--- a/src/flags19.lib/flags19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "flags19.lib"
-
- references: [
- "flags19/flags19.qbs",
- "flags19/flags19.tests.qbs",
- ]
-}
diff --git a/src/flags19.lib/flags19/flags19.cmake b/src/flags19.lib/flags19/flags19.cmake
index e752bf18..a793b605 100644
--- a/src/flags19.lib/flags19/flags19.cmake
+++ b/src/flags19.lib/flags19/flags19.cmake
@@ -1,29 +1,32 @@
add_library(flags19 INTERFACE)
target_link_libraries(flags19
- INTERFACE CoCpp19::enum19
+ INTERFACE CoCpp19::enum19
)
target_include_directories(flags19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB flags19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(flags19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${flags19_headers}
)
add_library(CoCpp19::flags19 ALIAS flags19)
-install(TARGETS flags19
- EXPORT flags19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "flags19"
-)
-install(EXPORT flags19Targets
- FILE "CoCpp19-flags19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "flags19"
-)
+
+if(COCPP_Install)
+ install(TARGETS flags19
+ EXPORT flags19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "flags19"
+ )
+ install(EXPORT flags19Targets
+ FILE "CoCpp19-flags19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "flags19"
+ )
+endif()
diff --git a/src/flags19.lib/flags19/flags19.qbs b/src/flags19.lib/flags19/flags19.qbs
index acdc5386..91ab56c5 100644
--- a/src/flags19.lib/flags19/flags19.qbs
+++ b/src/flags19.lib/flags19/flags19.qbs
@@ -1,19 +1,20 @@
+import qbs.FileInfo
Product {
- Depends { name: "cpp" }
- Depends { name: "enum19" }
- Depends { name: "fmt"; required: false }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: [exportingProduct.sourceDirectory + "/.."]
- Depends { name: "enum19" }
- }
-
files: [
"FlagsOf.fmt.h",
"FlagsOf.h",
"FlagsOf.ostream.h",
"FlagsOf.trait.h",
]
+
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Depends { name: "cpp" }
+ Depends { name: "enum19" }
+ }
+ Depends { name: "cpp" }
+ Depends { name: "enum19" }
+ Depends { name: "fmt"; required: false }
}
diff --git a/src/flags19.lib/flags19/flags19.tests.cmake b/src/flags19.lib/flags19/flags19.tests.cmake
index bd7a4c2e..5fd757d0 100644
--- a/src/flags19.lib/flags19/flags19.tests.cmake
+++ b/src/flags19.lib/flags19/flags19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(flags19-test)
file(GLOB flags19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(flags19-test
- PRIVATE ${flags19_test_sources}
+ PRIVATE ${flags19_test_sources}
)
target_link_libraries(flags19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::flags19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::flags19
)
add_test(NAME flags19 COMMAND flags19-test)
diff --git a/src/flags19.lib/flags19/flags19.tests.qbs b/src/flags19.lib/flags19/flags19.tests.qbs
index ed478e55..6f0c2176 100644
--- a/src/flags19.lib/flags19/flags19.tests.qbs
+++ b/src/flags19.lib/flags19/flags19.tests.qbs
@@ -1,15 +1,12 @@
Application {
name: "flags19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "flags19" }
- Depends { name: "googletest" }
-
+ type: base.concat(["autotest"])
files: [
"FlagsOf.test.cpp",
]
+
+ Depends { name: "flags19" }
+ Depends { name: "googletest" }
}
diff --git a/src/lookup19.lib/CMakeLists.txt b/src/lookup19.lib/CMakeLists.txt
index 3847ef25..3f98806e 100644
--- a/src/lookup19.lib/CMakeLists.txt
+++ b/src/lookup19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(lookup19/lookup19.cmake)
-include(lookup19/lookup19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(lookup19/lookup19.tests.cmake)
+endif()
diff --git a/src/lookup19.lib/lookup19.lib.qbs b/src/lookup19.lib/lookup19.lib.qbs
deleted file mode 100644
index 3d616a73..00000000
--- a/src/lookup19.lib/lookup19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "lookup19.lib"
-
- references: [
- "lookup19/lookup19.qbs",
- "lookup19/lookup19.tests.qbs",
- ]
-}
diff --git a/src/lookup19.lib/lookup19/lookup19.cmake b/src/lookup19.lib/lookup19/lookup19.cmake
index 790f527f..4a15c4ab 100644
--- a/src/lookup19.lib/lookup19/lookup19.cmake
+++ b/src/lookup19.lib/lookup19/lookup19.cmake
@@ -1,30 +1,33 @@
add_library(lookup19 INTERFACE)
target_link_libraries(lookup19
- INTERFACE CoCpp19::array19
+ INTERFACE CoCpp19::array19
)
target_include_directories(lookup19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB lookup19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(lookup19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${lookup19_headers}
)
add_library(CoCpp19::lookup19 ALIAS lookup19)
-install(TARGETS lookup19
- EXPORT lookup19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "lookup19"
-)
-install(EXPORT lookup19Targets
- FILE "CoCpp19-lookup19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "lookup19"
-)
+
+if(COCPP_Install)
+ install(TARGETS lookup19
+ EXPORT lookup19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "lookup19"
+ )
+ install(EXPORT lookup19Targets
+ FILE "CoCpp19-lookup19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "lookup19"
+ )
+endif()
diff --git a/src/lookup19.lib/lookup19/lookup19.qbs b/src/lookup19.lib/lookup19/lookup19.qbs
index c450a24e..51508f5c 100644
--- a/src/lookup19.lib/lookup19/lookup19.qbs
+++ b/src/lookup19.lib/lookup19/lookup19.qbs
@@ -1,18 +1,16 @@
+import qbs.FileInfo
Product {
- Depends { name: "cpp19" }
- Depends { name: "array19" }
+ files: [
+ "OrderedSetOf.h",
+ "OrderedSliceOf.h",
+ ]
Export {
- Depends { name: "cpp" }
- cpp.includePaths: [ exportingProduct.sourceDirectory + "/.." ]
- Depends { name: "cpp19" }
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+ Depends { name: "cpp" }
Depends { name: "array19" }
}
-
- files: [
- "OrderedSetOf.h",
- "OrderedSliceOf.h",
- ]
+ Depends { name: "array19" }
}
diff --git a/src/lookup19.lib/lookup19/lookup19.tests.cmake b/src/lookup19.lib/lookup19/lookup19.tests.cmake
index 3a90ee55..0e723e8d 100644
--- a/src/lookup19.lib/lookup19/lookup19.tests.cmake
+++ b/src/lookup19.lib/lookup19/lookup19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(lookup19-test)
file(GLOB lookup19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(lookup19-test
- PRIVATE ${lookup19_test_sources}
+ PRIVATE ${lookup19_test_sources}
)
target_link_libraries(lookup19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::lookup19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::lookup19
)
add_test(NAME lookup19 COMMAND lookup19-test)
diff --git a/src/lookup19.lib/lookup19/lookup19.tests.qbs b/src/lookup19.lib/lookup19/lookup19.tests.qbs
index af1ad17b..dbd38a27 100644
--- a/src/lookup19.lib/lookup19/lookup19.tests.qbs
+++ b/src/lookup19.lib/lookup19/lookup19.tests.qbs
@@ -1,18 +1,12 @@
Application {
name: "lookup19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "lookup19" }
- Depends { name: "googletest" }
-
- // Depends { name: "cpp" }
- // cpp.combineCxxSources: true
-
+ type: base.concat(["autotest"])
files: [
"OrderedSetOf.test.cpp",
]
+
+ Depends { name: "lookup19" }
+ Depends { name: "googletest" }
}
diff --git a/src/meta19.lib/CMakeLists.txt b/src/meta19.lib/CMakeLists.txt
index 22e50993..82b4316b 100644
--- a/src/meta19.lib/CMakeLists.txt
+++ b/src/meta19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(meta19/meta19.cmake)
-include(meta19/meta19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(meta19/meta19.tests.cmake)
+endif()
diff --git a/src/meta19.lib/meta19.lib.qbs b/src/meta19.lib/meta19.lib.qbs
deleted file mode 100644
index c44fe762..00000000
--- a/src/meta19.lib/meta19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "meta19.lib"
-
- references: [
- "meta19/meta19.qbs",
- "meta19/meta19.tests.qbs",
- ]
-}
diff --git a/src/meta19.lib/meta19/meta19.cmake b/src/meta19.lib/meta19/meta19.cmake
index 7d4d5789..b69ce9de 100644
--- a/src/meta19.lib/meta19/meta19.cmake
+++ b/src/meta19.lib/meta19/meta19.cmake
@@ -1,30 +1,33 @@
add_library(meta19 INTERFACE)
target_link_libraries(meta19
- INTERFACE CoCpp19::array19
+ INTERFACE CoCpp19::array19
)
target_include_directories(meta19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB meta19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(meta19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${meta19_headers}
)
add_library(CoCpp19::meta19 ALIAS meta19)
-install(TARGETS meta19
- EXPORT meta19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "meta19"
-)
-install(EXPORT meta19Targets
- FILE "CoCpp19-meta19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "meta19"
-)
+
+if(COCPP_Install)
+ install(TARGETS meta19
+ EXPORT meta19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "meta19"
+ )
+ install(EXPORT meta19Targets
+ FILE "CoCpp19-meta19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "meta19"
+ )
+endif()
diff --git a/src/meta19.lib/meta19/meta19.qbs b/src/meta19.lib/meta19/meta19.qbs
index 0181e83a..73e1e15e 100644
--- a/src/meta19.lib/meta19/meta19.qbs
+++ b/src/meta19.lib/meta19/meta19.qbs
@@ -1,12 +1,10 @@
+import qbs.FileInfo
Product {
- Depends { name: "array19" }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: [exportingProduct.sourceDirectory + "/.."]
- Depends { name: "array19" }
- }
+ files: [
+ "Unreachable.h",
+ "nullptr_to.h",
+ ]
Group {
name: "Index"
@@ -53,8 +51,11 @@ Product {
"TypePackTemplate.h",
]
}
- files: [
- "Unreachable.h",
- "nullptr_to.h",
- ]
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Depends { name: "cpp" }
+ Depends { name: "array19" }
+ }
+ Depends { name: "array19" }
}
diff --git a/src/meta19.lib/meta19/meta19.tests.cmake b/src/meta19.lib/meta19/meta19.tests.cmake
index e24c0c33..4b364ff5 100644
--- a/src/meta19.lib/meta19/meta19.tests.cmake
+++ b/src/meta19.lib/meta19/meta19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(meta19-test)
file(GLOB meta19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(meta19-test
- PRIVATE ${meta19_test_sources}
+ PRIVATE ${meta19_test_sources}
)
target_link_libraries(meta19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::meta19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::meta19
)
add_test(NAME meta19 COMMAND meta19-test)
diff --git a/src/meta19.lib/meta19/meta19.tests.qbs b/src/meta19.lib/meta19/meta19.tests.qbs
index da1bc8f7..f002ff33 100644
--- a/src/meta19.lib/meta19/meta19.tests.qbs
+++ b/src/meta19.lib/meta19/meta19.tests.qbs
@@ -1,14 +1,11 @@
Application {
name: "meta19.tests"
-
- Depends { name: "meta19" }
- // all tests are compile time only!
-
- Depends { name: "cpp" }
- // cpp.combineCxxSources: true
-
+ consoleApplication: true
files: [
"*.test.cpp",
]
+
+ Depends { name: "meta19" }
+ Depends { name: "cpp" } // note: all tests are compile time only!
}
diff --git a/src/optional19.lib/CMakeLists.txt b/src/optional19.lib/CMakeLists.txt
index c5bcba0d..cc48ca1f 100644
--- a/src/optional19.lib/CMakeLists.txt
+++ b/src/optional19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(optional19/optional19.cmake)
-include(optional19/optional19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(optional19/optional19.tests.cmake)
+endif()
diff --git a/src/optional19.lib/optional19.lib.qbs b/src/optional19.lib/optional19.lib.qbs
deleted file mode 100644
index a1d58466..00000000
--- a/src/optional19.lib/optional19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "optional19.lib"
-
- references: [
- "optional19/optional19.qbs",
- "optional19/optional19.tests.qbs",
- ]
-}
diff --git a/src/optional19.lib/optional19/optional19.cmake b/src/optional19.lib/optional19/optional19.cmake
index 4f73d816..e4d48626 100644
--- a/src/optional19.lib/optional19/optional19.cmake
+++ b/src/optional19.lib/optional19/optional19.cmake
@@ -1,30 +1,33 @@
add_library(optional19 INTERFACE)
target_link_libraries(optional19
- INTERFACE CoCpp19::meta19
+ INTERFACE CoCpp19::meta19
)
target_include_directories(optional19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB optional19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(optional19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${optional19_headers}
)
add_library(CoCpp19::optional19 ALIAS optional19)
-install(TARGETS optional19
- EXPORT optional19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "optional19"
-)
-install(EXPORT optional19Targets
- FILE "CoCpp19-optional19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "optional19"
-)
+
+if(COCPP_Install)
+ install(TARGETS optional19
+ EXPORT optional19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "optional19"
+ )
+ install(EXPORT optional19Targets
+ FILE "CoCpp19-optional19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "optional19"
+ )
+endif()
diff --git a/src/optional19.lib/optional19/optional19.qbs b/src/optional19.lib/optional19/optional19.qbs
index e0931ee8..f3cfc3da 100644
--- a/src/optional19.lib/optional19/optional19.qbs
+++ b/src/optional19.lib/optional19/optional19.qbs
@@ -1,14 +1,6 @@
+import qbs.FileInfo
Product {
- Depends { name: "cpp" }
- Depends { name: "meta19" }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: [exportingProduct.sourceDirectory + "/.."]
- Depends { name: "meta19" }
- }
-
files: [
"Optional.equals.h",
"Optional.h",
@@ -18,4 +10,13 @@ Product {
"PackedOptional.ostream.h",
"PackedOptionalNan.h",
]
+
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Depends { name: "cpp" }
+ Depends { name: "meta19" }
+ }
+ Depends { name: "cpp" }
+ Depends { name: "meta19" }
}
diff --git a/src/optional19.lib/optional19/optional19.tests.cmake b/src/optional19.lib/optional19/optional19.tests.cmake
index 56a1c4ec..287cbccc 100644
--- a/src/optional19.lib/optional19/optional19.tests.cmake
+++ b/src/optional19.lib/optional19/optional19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(optional19-test)
file(GLOB optional19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(optional19-test
- PRIVATE ${optional19_test_sources}
+ PRIVATE ${optional19_test_sources}
)
target_link_libraries(optional19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::optional19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::optional19
)
add_test(NAME optional19 COMMAND optional19-test)
diff --git a/src/optional19.lib/optional19/optional19.tests.qbs b/src/optional19.lib/optional19/optional19.tests.qbs
index c6cdbb98..892773bd 100644
--- a/src/optional19.lib/optional19/optional19.tests.qbs
+++ b/src/optional19.lib/optional19/optional19.tests.qbs
@@ -1,17 +1,14 @@
Application {
name: "optional19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "optional19" }
- Depends { name: "googletest" }
-
+ type: base.concat(["autotest"])
files: [
"Optional.test.cpp",
"PackedOptional.test.cpp",
"PackedOptionalNan.test.cpp",
]
+
+ Depends { name: "optional19" }
+ Depends { name: "googletest" }
}
diff --git a/src/partial19.lib/CMakeLists.txt b/src/partial19.lib/CMakeLists.txt
index 896801c6..c8a67f28 100644
--- a/src/partial19.lib/CMakeLists.txt
+++ b/src/partial19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(partial19/partial19.cmake)
-include(partial19/partial19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(partial19/partial19.tests.cmake)
+endif()
diff --git a/src/partial19.lib/partial19.lib.qbs b/src/partial19.lib/partial19.lib.qbs
deleted file mode 100644
index db9a5cd2..00000000
--- a/src/partial19.lib/partial19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "partial19.lib"
-
- references: [
- "partial19/partial19.qbs",
- "partial19/partial19.tests.qbs",
- ]
-}
diff --git a/src/partial19.lib/partial19/partial19.cmake b/src/partial19.lib/partial19/partial19.cmake
index c718c43e..7298f790 100644
--- a/src/partial19.lib/partial19/partial19.cmake
+++ b/src/partial19.lib/partial19/partial19.cmake
@@ -1,30 +1,33 @@
add_library(partial19 INTERFACE)
target_link_libraries(partial19
- INTERFACE CoCpp19::meta19
+ INTERFACE CoCpp19::meta19
)
target_include_directories(partial19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB partial19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(partial19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${partial19_headers}
)
add_library(CoCpp19::partial19 ALIAS partial19)
-install(TARGETS partial19
- EXPORT partial19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "partial19"
-)
-install(EXPORT partial19Targets
- FILE "CoCpp19-partial19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "partial19"
-)
+
+if(COCPP_Install)
+ install(TARGETS partial19
+ EXPORT partial19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "partial19"
+ )
+ install(EXPORT partial19Targets
+ FILE "CoCpp19-partial19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "partial19"
+ )
+endif()
diff --git a/src/partial19.lib/partial19/partial19.qbs b/src/partial19.lib/partial19/partial19.qbs
index b012d5bd..faf5b9a6 100644
--- a/src/partial19.lib/partial19/partial19.qbs
+++ b/src/partial19.lib/partial19/partial19.qbs
@@ -1,13 +1,6 @@
+import qbs.FileInfo
Product {
- Depends { name: "meta19" }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: [exportingProduct.sourceDirectory + "/.."]
- Depends { name: "meta19" }
- }
-
files: [
"Bitset.h",
"Partial.equals.h",
@@ -17,4 +10,12 @@ Product {
"PartialWhich.fmt.h",
"align.h",
]
+
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Depends { name: "cpp" }
+ Depends { name: "meta19" }
+ }
+ Depends { name: "meta19" }
}
diff --git a/src/partial19.lib/partial19/partial19.tests.cmake b/src/partial19.lib/partial19/partial19.tests.cmake
index 11fc9bdb..d6e89ace 100644
--- a/src/partial19.lib/partial19/partial19.tests.cmake
+++ b/src/partial19.lib/partial19/partial19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(partial19-test)
file(GLOB partial19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(partial19-test
- PRIVATE ${partial19_test_sources}
+ PRIVATE ${partial19_test_sources}
)
target_link_libraries(partial19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::partial19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::partial19
)
add_test(NAME partial19 COMMAND partial19-test)
diff --git a/src/partial19.lib/partial19/partial19.tests.qbs b/src/partial19.lib/partial19/partial19.tests.qbs
index eb5a0ac7..965ec46e 100644
--- a/src/partial19.lib/partial19/partial19.tests.qbs
+++ b/src/partial19.lib/partial19/partial19.tests.qbs
@@ -1,16 +1,13 @@
Application {
name: "partial19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "partial19" }
- Depends { name: "googletest" }
-
+ type: base.concat(["autotest"])
files: [
"Bitset.test.cpp",
"Partial.test.cpp",
]
+
+ Depends { name: "partial19" }
+ Depends { name: "googletest" }
}
diff --git a/src/serialize19.lib/CMakeLists.txt b/src/serialize19.lib/CMakeLists.txt
index 55ec57e4..6a7ede42 100644
--- a/src/serialize19.lib/CMakeLists.txt
+++ b/src/serialize19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(serialize19/serialize19.cmake)
-include(serialize19/serialize19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(serialize19/serialize19.tests.cmake)
+endif()
diff --git a/src/serialize19.lib/serialize19.lib.qbs b/src/serialize19.lib/serialize19.lib.qbs
deleted file mode 100644
index 7b701419..00000000
--- a/src/serialize19.lib/serialize19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "serialize19.lib"
-
- references: [
- "serialize19/serialize19.qbs",
- "serialize19/serialize19.tests.qbs",
- ]
-}
diff --git a/src/serialize19.lib/serialize19/serialize19.cmake b/src/serialize19.lib/serialize19/serialize19.cmake
index 7eb57aaf..fbfe5709 100644
--- a/src/serialize19.lib/serialize19/serialize19.cmake
+++ b/src/serialize19.lib/serialize19/serialize19.cmake
@@ -1,30 +1,33 @@
add_library(serialize19 INTERFACE)
target_link_libraries(serialize19
- INTERFACE CoCpp19::meta19
+ INTERFACE CoCpp19::meta19
)
target_include_directories(serialize19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB serialize19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(serialize19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${serialize19_headers}
)
add_library(CoCpp19::serialize19 ALIAS serialize19)
-install(TARGETS serialize19
- EXPORT serialize19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "serialize19"
-)
-install(EXPORT serialize19Targets
- FILE "CoCpp19-serialize19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "serialize19"
-)
+
+if(COCPP_Install)
+ install(TARGETS serialize19
+ EXPORT serialize19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "serialize19"
+ )
+ install(EXPORT serialize19Targets
+ FILE "CoCpp19-serialize19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "serialize19"
+ )
+endif()
diff --git a/src/serialize19.lib/serialize19/serialize19.qbs b/src/serialize19.lib/serialize19/serialize19.qbs
index d9afb076..606d9481 100644
--- a/src/serialize19.lib/serialize19/serialize19.qbs
+++ b/src/serialize19.lib/serialize19/serialize19.qbs
@@ -1,19 +1,10 @@
+import qbs.FileInfo
Product {
- Depends { name: "cpp" }
- Depends { name: "meta19" }
-
- Depends { name: "optional19"; required: false }
- Depends { name: "partial19"; required: false }
- Depends { name: "strong19"; required: false }
- Depends { name: "tuple19"; required: false }
- Depends { name: "variant19"; required: false }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: [exportingProduct.sourceDirectory + "/.."]
- Depends { name: "meta19" }
- }
+ files: [
+ "dynamicWrite.h",
+ "serialize.h",
+ ]
Group {
name: "Archive"
@@ -66,8 +57,17 @@ Product {
"serialize.std_vector.h",
]
}
- files: [
- "dynamicWrite.h",
- "serialize.h",
- ]
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Depends { name: "cpp" }
+ Depends { name: "meta19" }
+ }
+ Depends { name: "cpp" }
+ Depends { name: "meta19" }
+ Depends { name: "optional19"; required: false }
+ Depends { name: "partial19"; required: false }
+ Depends { name: "strong19"; required: false }
+ Depends { name: "tuple19"; required: false }
+ Depends { name: "variant19"; required: false }
}
diff --git a/src/serialize19.lib/serialize19/serialize19.tests.cmake b/src/serialize19.lib/serialize19/serialize19.tests.cmake
index 992258e4..377e2c1c 100644
--- a/src/serialize19.lib/serialize19/serialize19.tests.cmake
+++ b/src/serialize19.lib/serialize19/serialize19.tests.cmake
@@ -2,15 +2,15 @@
add_executable(serialize19-test)
file(GLOB serialize19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(serialize19-test
- PRIVATE ${serialize19_test_sources}
+ PRIVATE ${serialize19_test_sources}
)
target_link_libraries(serialize19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::serialize19
- PRIVATE CoCpp19::optional19
- PRIVATE CoCpp19::partial19
- PRIVATE CoCpp19::string19
- PRIVATE CoCpp19::tuple19
- PRIVATE CoCpp19::variant19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::serialize19
+ PRIVATE CoCpp19::optional19
+ PRIVATE CoCpp19::partial19
+ PRIVATE CoCpp19::string19
+ PRIVATE CoCpp19::tuple19
+ PRIVATE CoCpp19::variant19
)
add_test(NAME serialize19 COMMAND serialize19-test)
diff --git a/src/serialize19.lib/serialize19/serialize19.tests.qbs b/src/serialize19.lib/serialize19/serialize19.tests.qbs
index 1c6a20cb..99ad665a 100644
--- a/src/serialize19.lib/serialize19/serialize19.tests.qbs
+++ b/src/serialize19.lib/serialize19/serialize19.tests.qbs
@@ -1,17 +1,12 @@
Application {
name: "serialize19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "googletest" }
- Depends { name: "optional19" }
- Depends { name: "partial19" }
- Depends { name: "serialize19" }
- Depends { name: "tuple19" }
- Depends { name: "variant19" }
+ type: base.concat(["autotest"])
+ files: [
+ "Codec.test.cpp",
+ "Endianness.test.cpp",
+ ]
Group {
name: "std"
@@ -35,8 +30,10 @@ Application {
"serialize.Variant.test.cpp",
]
}
- files: [
- "Codec.test.cpp",
- "Endianness.test.cpp",
- ]
+ Depends { name: "googletest" }
+ Depends { name: "optional19" }
+ Depends { name: "partial19" }
+ Depends { name: "serialize19" }
+ Depends { name: "tuple19" }
+ Depends { name: "variant19" }
}
diff --git a/src/signal19.lib/CMakeLists.txt b/src/signal19.lib/CMakeLists.txt
index edcd760c..0eb617b9 100644
--- a/src/signal19.lib/CMakeLists.txt
+++ b/src/signal19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(signal19/signal19.cmake)
-include(signal19/signal19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(signal19/signal19.tests.cmake)
+endif()
diff --git a/src/signal19.lib/signal19.lib.qbs b/src/signal19.lib/signal19.lib.qbs
deleted file mode 100644
index 4ab5ad2a..00000000
--- a/src/signal19.lib/signal19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "signal19.lib"
-
- references: [
- "signal19/signal19.qbs",
- "signal19/signal19.tests.qbs",
- ]
-}
diff --git a/src/signal19.lib/signal19/SignalWith.h b/src/signal19.lib/signal19/SignalWith.h
index 26c7f17f..610e4174 100644
--- a/src/signal19.lib/signal19/SignalWith.h
+++ b/src/signal19.lib/signal19/SignalWith.h
@@ -4,6 +4,7 @@
#include
#include
+#include
namespace signal19 {
@@ -88,9 +89,8 @@ template struct SignalWith final : details::Signal {
/// Type Erasure for CallbackCancellation
struct StoredCancellation {
- using Storage =
- std::aligned_storage_t;
- Storage storage; // fixed size storage
+ using Storage = uint8_t[sizeof(SignalCancellation) + 2 * sizeof(void*)];
+ alignas(SignalCancellation) Storage storage; // fixed size storage
template explicit StoredCancellation(SignalWith& signal, Cb&& cb) {
using Clean = std::remove_const_t>;
diff --git a/src/signal19.lib/signal19/signal19.cmake b/src/signal19.lib/signal19/signal19.cmake
index 407a029f..c316699e 100644
--- a/src/signal19.lib/signal19/signal19.cmake
+++ b/src/signal19.lib/signal19/signal19.cmake
@@ -1,30 +1,33 @@
add_library(signal19 INTERFACE)
target_link_libraries(signal19
- INTERFACE CoCpp19::array19
+ INTERFACE CoCpp19::array19
)
target_include_directories(signal19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB signal19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(signal19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${signal19_headers}
)
add_library(CoCpp19::signal19 ALIAS signal19)
-install(TARGETS signal19
- EXPORT signal19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "signal19"
-)
-install(EXPORT signal19Targets
- FILE "CoCpp19-signal19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "signal19"
-)
+
+if(COCPP_Install)
+ install(TARGETS signal19
+ EXPORT signal19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "signal19"
+ )
+ install(EXPORT signal19Targets
+ FILE "CoCpp19-signal19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "signal19"
+ )
+endif()
diff --git a/src/signal19.lib/signal19/signal19.qbs b/src/signal19.lib/signal19/signal19.qbs
index a34ca299..aace6b93 100644
--- a/src/signal19.lib/signal19/signal19.qbs
+++ b/src/signal19.lib/signal19/signal19.qbs
@@ -1,17 +1,18 @@
+import qbs.FileInfo
Product {
- Depends { name: "cpp" }
- Depends { name: "meta19" }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: [exportingProduct.sourceDirectory + "/.."]
- Depends { name: "meta19" }
- }
-
files: [
"SignalWith.h",
"Subscription.h",
"Subscriptions.h",
]
+
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Depends { name: "cpp" }
+ Depends { name: "meta19" }
+ }
+ Depends { name: "cpp" }
+ Depends { name: "meta19" }
}
diff --git a/src/signal19.lib/signal19/signal19.tests.cmake b/src/signal19.lib/signal19/signal19.tests.cmake
index 07ff1e96..1948d05e 100644
--- a/src/signal19.lib/signal19/signal19.tests.cmake
+++ b/src/signal19.lib/signal19/signal19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(signal19-test)
file(GLOB signal19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(signal19-test
- PRIVATE ${signal19_test_sources}
+ PRIVATE ${signal19_test_sources}
)
target_link_libraries(signal19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::signal19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::signal19
)
add_test(NAME signal19 COMMAND signal19-test)
diff --git a/src/signal19.lib/signal19/signal19.tests.qbs b/src/signal19.lib/signal19/signal19.tests.qbs
index 3c6a310d..a511e7ef 100644
--- a/src/signal19.lib/signal19/signal19.tests.qbs
+++ b/src/signal19.lib/signal19/signal19.tests.qbs
@@ -1,16 +1,13 @@
Application {
name: "signal19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "googletest" }
- Depends { name: "signal19" }
-
+ type: base.concat(["autotest"])
files: [
"SignalWith.test.cpp",
"Subscriptions.test.cpp",
]
+
+ Depends { name: "googletest" }
+ Depends { name: "signal19" }
}
diff --git a/src/src.qbs b/src/src.qbs
new file mode 100644
index 00000000..7753ef5a
--- /dev/null
+++ b/src/src.qbs
@@ -0,0 +1,19 @@
+Project {
+ name: "Src"
+ references: [
+ "array19.lib/array19/array19.qbs",
+ "coro19.lib/coro19/coro19.qbs",
+ "enum19.lib/enum19/enum19.qbs",
+ "flags19.lib/flags19/flags19.qbs",
+ "meta19.lib/meta19/meta19.qbs",
+ "lookup19.lib/lookup19/lookup19.qbs",
+ "optional19.lib/optional19/optional19.qbs",
+ "partial19.lib/partial19/partial19.qbs",
+ "serialize19.lib/serialize19/serialize19.qbs",
+ "signal19.lib/signal19/signal19.qbs",
+ "string19.lib/string19/string19.qbs",
+ "strong19.lib/strong19/strong19.qbs",
+ "tuple19.lib/tuple19/tuple19.qbs",
+ "variant19.lib/variant19/variant19.qbs",
+ ]
+}
diff --git a/src/string19.lib/CMakeLists.txt b/src/string19.lib/CMakeLists.txt
index f2248036..1f2635f3 100644
--- a/src/string19.lib/CMakeLists.txt
+++ b/src/string19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(string19/string19.cmake)
-include(string19/string19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(string19/string19.tests.cmake)
+endif()
diff --git a/src/string19.lib/string19.lib.qbs b/src/string19.lib/string19.lib.qbs
deleted file mode 100644
index d49ae564..00000000
--- a/src/string19.lib/string19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "string19.lib"
-
- references: [
- "string19/string19.qbs",
- "string19/string19.tests.qbs",
- ]
-}
diff --git a/src/string19.lib/string19/string19.cmake b/src/string19.lib/string19/string19.cmake
index f071e8ad..8c3eb1bc 100644
--- a/src/string19.lib/string19/string19.cmake
+++ b/src/string19.lib/string19/string19.cmake
@@ -1,30 +1,33 @@
add_library(string19 INTERFACE)
target_link_libraries(string19
- INTERFACE CoCpp19::tuple19
+ INTERFACE CoCpp19::tuple19
)
target_include_directories(string19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB string19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(string19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${string19_headers}
)
add_library(CoCpp19::string19 ALIAS string19)
-install(TARGETS string19
- EXPORT string19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "string19"
-)
-install(EXPORT string19Targets
- FILE "CoCpp19-string19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "string19"
-)
+
+if(COCPP_Install)
+ install(TARGETS string19
+ EXPORT string19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "string19"
+ )
+ install(EXPORT string19Targets
+ FILE "CoCpp19-string19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "string19"
+ )
+endif()
diff --git a/src/string19.lib/string19/string19.qbs b/src/string19.lib/string19/string19.qbs
index 57918f54..c7bf66c8 100644
--- a/src/string19.lib/string19/string19.qbs
+++ b/src/string19.lib/string19/string19.qbs
@@ -1,13 +1,10 @@
+import qbs.FileInfo
Product {
- Depends { name: "tuple19" }
- Depends { name: "fmt"; required: false }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: [exportingProduct.sourceDirectory + "/.."]
- Depends { name: "tuple19" }
- }
+ files: [
+ "ADL.h",
+ "DynamicString.h",
+ ]
Group {
name: "Rope"
@@ -43,8 +40,12 @@ Product {
"StringView.store.h",
]
}
- files: [
- "ADL.h",
- "DynamicString.h",
- ]
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Depends { name: "cpp" }
+ Depends { name: "tuple19" }
+ }
+ Depends { name: "tuple19" }
+ Depends { name: "fmt"; required: false }
}
diff --git a/src/string19.lib/string19/string19.tests.cmake b/src/string19.lib/string19/string19.tests.cmake
index 74dae857..574b727c 100644
--- a/src/string19.lib/string19/string19.tests.cmake
+++ b/src/string19.lib/string19/string19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(string19-test)
file(GLOB string19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(string19-test
- PRIVATE ${string19_test_sources}
+ PRIVATE ${string19_test_sources}
)
target_link_libraries(string19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::string19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::string19
)
add_test(NAME string19 COMMAND string19-test)
diff --git a/src/string19.lib/string19/string19.tests.qbs b/src/string19.lib/string19/string19.tests.qbs
index d0a59a26..28c9b081 100644
--- a/src/string19.lib/string19/string19.tests.qbs
+++ b/src/string19.lib/string19/string19.tests.qbs
@@ -1,14 +1,8 @@
Application {
name: "string19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "string19" }
- Depends { name: "googletest" }
-
+ type: base.concat(["autotest"])
files: [
"Rope.decimal.test.cpp",
"Rope.join.test.cpp",
@@ -16,4 +10,7 @@ Application {
"StringStore.test.cpp",
"StringView.test.cpp",
]
+
+ Depends { name: "string19" }
+ Depends { name: "googletest" }
}
diff --git a/src/strong19.lib/CMakeLists.txt b/src/strong19.lib/CMakeLists.txt
index 1fb2182e..7551ab95 100644
--- a/src/strong19.lib/CMakeLists.txt
+++ b/src/strong19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(strong19/strong19.cmake)
-include(strong19/strong19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(strong19/strong19.tests.cmake)
+endif()
diff --git a/src/strong19.lib/strong19.lib.qbs b/src/strong19.lib/strong19.lib.qbs
deleted file mode 100644
index 5fff336a..00000000
--- a/src/strong19.lib/strong19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "strong19.lib"
-
- references: [
- "strong19/strong19.qbs",
- "strong19/strong19.tests.qbs",
- ]
-}
diff --git a/src/strong19.lib/strong19/strong19.cmake b/src/strong19.lib/strong19/strong19.cmake
index 790407b8..623dc077 100644
--- a/src/strong19.lib/strong19/strong19.cmake
+++ b/src/strong19.lib/strong19/strong19.cmake
@@ -1,30 +1,33 @@
add_library(strong19 INTERFACE)
target_link_libraries(strong19
- INTERFACE CoCpp19::string19
+ INTERFACE CoCpp19::string19
)
target_include_directories(strong19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB strong19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(strong19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${strong19_headers}
)
add_library(CoCpp19::strong19 ALIAS strong19)
-install(TARGETS strong19
- EXPORT strong19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "strong19"
-)
-install(EXPORT strong19Targets
- FILE "CoCpp19-strong19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "strong19"
-)
+
+if(COCPP_Install)
+ install(TARGETS strong19
+ EXPORT strong19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "strong19"
+ )
+ install(EXPORT strong19Targets
+ FILE "CoCpp19-strong19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "strong19"
+ )
+endif()
diff --git a/src/strong19.lib/strong19/strong19.qbs b/src/strong19.lib/strong19/strong19.qbs
index 7f3e927a..6aac4c21 100644
--- a/src/strong19.lib/strong19/strong19.qbs
+++ b/src/strong19.lib/strong19/strong19.qbs
@@ -1,22 +1,6 @@
+import qbs.FileInfo
Product {
- Depends { name: "string19" }
- Depends { name: "fmt"; required: false }
- Depends { name: "array19"; required: false }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: [exportingProduct.sourceDirectory + "/.."]
- Depends { name: "string19" }
-
- Properties {
- condition: qbs.toolchain.contains('clang')
- cpp.cxxFlags: base.concat(
- "-Wno-gnu-zero-variadic-macro-arguments" // accept this extensions for opaque strong types
- )
- }
- }
-
files: [
"ADL.h",
"Macro.h",
@@ -29,4 +13,20 @@ Product {
"Strong.traits.h",
"WeakOf.h",
]
+
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Properties {
+ condition: qbs.toolchain.contains('clang')
+ cpp.cxxFlags: base.concat(
+ "-Wno-gnu-zero-variadic-macro-arguments" // accept this extensions for opaque strong types
+ )
+ }
+ Depends { name: "cpp" }
+ Depends { name: "string19" }
+ }
+ Depends { name: "string19" }
+ Depends { name: "fmt"; required: false }
+ Depends { name: "array19"; required: false }
}
diff --git a/src/strong19.lib/strong19/strong19.tests.cmake b/src/strong19.lib/strong19/strong19.tests.cmake
index f26ceb3a..c657e856 100644
--- a/src/strong19.lib/strong19/strong19.tests.cmake
+++ b/src/strong19.lib/strong19/strong19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(strong19-test)
file(GLOB strong19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(strong19-test
- PRIVATE ${strong19_test_sources}
+ PRIVATE ${strong19_test_sources}
)
target_link_libraries(strong19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::strong19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::strong19
)
add_test(NAME strong19 COMMAND strong19-test)
diff --git a/src/strong19.lib/strong19/strong19.tests.qbs b/src/strong19.lib/strong19/strong19.tests.qbs
index 30ba95fe..28878aca 100644
--- a/src/strong19.lib/strong19/strong19.tests.qbs
+++ b/src/strong19.lib/strong19/strong19.tests.qbs
@@ -1,17 +1,14 @@
Application {
name: "strong19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "strong19" }
- Depends { name: "googletest" }
-
+ type: base.concat(["autotest"])
files: [
"Strong.extras.ostream.test.cpp",
"Strong.hash.test.cpp",
"Strong.test.cpp",
]
+
+ Depends { name: "strong19" }
+ Depends { name: "googletest" }
}
diff --git a/src/tests.qbs b/src/tests.qbs
new file mode 100644
index 00000000..c1dbd2f6
--- /dev/null
+++ b/src/tests.qbs
@@ -0,0 +1,21 @@
+Project {
+ name: "Tests"
+ references: [
+ "array19.lib/array19/array19.tests.qbs",
+ "coro19.lib/coro19/coro19.tests.qbs",
+ "enum19.lib/enum19/enum19.tests.qbs",
+ "flags19.lib/flags19/flags19.tests.qbs",
+ "meta19.lib/meta19/meta19.tests.qbs",
+ "lookup19.lib/lookup19/lookup19.tests.qbs",
+ "optional19.lib/optional19/optional19.tests.qbs",
+ "partial19.lib/partial19/partial19.tests.qbs",
+ "serialize19.lib/serialize19/serialize19.tests.qbs",
+ "signal19.lib/signal19/signal19.tests.qbs",
+ "string19.lib/string19/string19.tests.qbs",
+ "strong19.lib/strong19/strong19.tests.qbs",
+ "tuple19.lib/tuple19/tuple19.tests.qbs",
+ "variant19.lib/variant19/variant19.tests.qbs",
+ ]
+
+ AutotestRunner {}
+}
diff --git a/src/tuple19.lib/CMakeLists.txt b/src/tuple19.lib/CMakeLists.txt
index e7b1f985..71f4656e 100644
--- a/src/tuple19.lib/CMakeLists.txt
+++ b/src/tuple19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(tuple19/tuple19.cmake)
-include(tuple19/tuple19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(tuple19/tuple19.tests.cmake)
+endif()
diff --git a/src/tuple19.lib/tuple19.lib.qbs b/src/tuple19.lib/tuple19.lib.qbs
deleted file mode 100644
index 7e62508f..00000000
--- a/src/tuple19.lib/tuple19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "tuple19.lib"
-
- references: [
- "tuple19/tuple19.qbs",
- "tuple19/tuple19.tests.qbs",
- ]
-}
diff --git a/src/tuple19.lib/tuple19/Tuple.fmt.h b/src/tuple19.lib/tuple19/Tuple.fmt.h
index 3d3cd742..bcb5dc73 100644
--- a/src/tuple19.lib/tuple19/Tuple.fmt.h
+++ b/src/tuple19.lib/tuple19/Tuple.fmt.h
@@ -8,10 +8,10 @@ namespace tuple19 {
/// use values of the tuple as format arguments
/// note: you still have to craft the proper format string!
-/// usage: vformat(formatStr, tuple19::make_format_args(argsTuple));
-template constexpr auto make_format_args(Tuple const& args) {
+/// usage: vformat(formatStr, tuple19::vargs(argsTuple));
+template constexpr auto vargs(Tuple const& args) {
return [&](std::index_sequence const&) {
- return fmt::make_format_args(args.template at()...);
+ return fmt::vargs{{args.template at()...}};
}(std::make_index_sequence{});
}
diff --git a/src/tuple19.lib/tuple19/tuple19.cmake b/src/tuple19.lib/tuple19/tuple19.cmake
index 62986cc5..b41c11ea 100644
--- a/src/tuple19.lib/tuple19/tuple19.cmake
+++ b/src/tuple19.lib/tuple19/tuple19.cmake
@@ -1,30 +1,33 @@
add_library(tuple19 INTERFACE)
target_link_libraries(tuple19
- INTERFACE CoCpp19::meta19
+ INTERFACE CoCpp19::meta19
)
target_include_directories(tuple19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB tuple19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(tuple19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${tuple19_headers}
)
add_library(CoCpp19::tuple19 ALIAS tuple19)
-install(TARGETS tuple19
- EXPORT tuple19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "tuple19"
-)
-install(EXPORT tuple19Targets
- FILE "CoCpp19-tuple19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "tuple19"
-)
+
+if(COCPP_Install)
+ install(TARGETS tuple19
+ EXPORT tuple19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "tuple19"
+ )
+ install(EXPORT tuple19Targets
+ FILE "CoCpp19-tuple19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "tuple19"
+ )
+endif()
diff --git a/src/tuple19.lib/tuple19/tuple19.qbs b/src/tuple19.lib/tuple19/tuple19.qbs
index 1a5f874f..b0e82021 100644
--- a/src/tuple19.lib/tuple19/tuple19.qbs
+++ b/src/tuple19.lib/tuple19/tuple19.qbs
@@ -1,13 +1,6 @@
+import qbs.FileInfo
Product {
- Depends { name: "meta19" }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: [exportingProduct.sourceDirectory + "/.."]
- Depends { name: "meta19" }
- }
-
files: [
"Tuple.bind.h",
"Tuple.fmt.h",
@@ -16,4 +9,12 @@ Product {
"Tuple.ostream.h",
"Tuple.trait.h",
]
+
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Depends { name: "cpp" }
+ Depends { name: "meta19" }
+ }
+ Depends { name: "meta19" }
}
diff --git a/src/tuple19.lib/tuple19/tuple19.tests.cmake b/src/tuple19.lib/tuple19/tuple19.tests.cmake
index d1e48223..634ff57a 100644
--- a/src/tuple19.lib/tuple19/tuple19.tests.cmake
+++ b/src/tuple19.lib/tuple19/tuple19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(tuple19-test)
file(GLOB tuple19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(tuple19-test
- PRIVATE ${tuple19_test_sources}
+ PRIVATE ${tuple19_test_sources}
)
target_link_libraries(tuple19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::tuple19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::tuple19
)
add_test(NAME tuple19 COMMAND tuple19-test)
diff --git a/src/tuple19.lib/tuple19/tuple19.tests.qbs b/src/tuple19.lib/tuple19/tuple19.tests.qbs
index 3dc5cfe6..8169bb9f 100644
--- a/src/tuple19.lib/tuple19/tuple19.tests.qbs
+++ b/src/tuple19.lib/tuple19/tuple19.tests.qbs
@@ -1,17 +1,14 @@
Application {
name: "tuple19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "tuple19" }
- Depends { name: "googletest" }
-
+ type: base.concat(["autotest"])
files: [
"Tuple.bind.test.cpp",
"Tuple.join.test.cpp",
"Tuple.test.cpp",
]
+
+ Depends { name: "tuple19" }
+ Depends { name: "googletest" }
}
diff --git a/src/variant19.lib/CMakeLists.txt b/src/variant19.lib/CMakeLists.txt
index 15f5824d..0762d380 100644
--- a/src/variant19.lib/CMakeLists.txt
+++ b/src/variant19.lib/CMakeLists.txt
@@ -1,3 +1,6 @@
include(variant19/variant19.cmake)
-include(variant19/variant19.tests.cmake)
+
+if(COCPP_BuildTests)
+ include(variant19/variant19.tests.cmake)
+endif()
diff --git a/src/variant19.lib/variant19.lib.qbs b/src/variant19.lib/variant19.lib.qbs
deleted file mode 100644
index fba4e962..00000000
--- a/src/variant19.lib/variant19.lib.qbs
+++ /dev/null
@@ -1,9 +0,0 @@
-
-Project {
- name: "variant19.lib"
-
- references: [
- "variant19/variant19.qbs",
- "variant19/variant19.tests.qbs",
- ]
-}
diff --git a/src/variant19.lib/variant19/variant19.cmake b/src/variant19.lib/variant19/variant19.cmake
index 1b37b5ed..5f29f171 100644
--- a/src/variant19.lib/variant19/variant19.cmake
+++ b/src/variant19.lib/variant19/variant19.cmake
@@ -1,30 +1,33 @@
add_library(variant19 INTERFACE)
target_link_libraries(variant19
- INTERFACE CoCpp19::meta19
+ INTERFACE CoCpp19::meta19
)
target_include_directories(variant19
- INTERFACE
+ INTERFACE
$
$
)
file(GLOB variant19_headers "${CMAKE_CURRENT_LIST_DIR}/*.h")
target_sources(variant19
- INTERFACE FILE_SET public_headers
+ INTERFACE FILE_SET public_headers
TYPE HEADERS
FILES ${variant19_headers}
)
add_library(CoCpp19::variant19 ALIAS variant19)
-install(TARGETS variant19
- EXPORT variant19Targets
- FILE_SET public_headers
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
- COMPONENT "variant19"
-)
-install(EXPORT variant19Targets
- FILE "CoCpp19-variant19-targets.cmake"
- NAMESPACE "CoCpp19::"
- DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
- COMPONENT "variant19"
-)
+
+if(COCPP_Install)
+ install(TARGETS variant19
+ EXPORT variant19Targets
+ FILE_SET public_headers
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ COMPONENT "variant19"
+ )
+ install(EXPORT variant19Targets
+ FILE "CoCpp19-variant19-targets.cmake"
+ NAMESPACE "CoCpp19::"
+ DESTINATION ${COCPP19_CMAKE_CONFIG_DESTINATION}
+ COMPONENT "variant19"
+ )
+endif()
diff --git a/src/variant19.lib/variant19/variant19.qbs b/src/variant19.lib/variant19/variant19.qbs
index e73d7897..94fa01f7 100644
--- a/src/variant19.lib/variant19/variant19.qbs
+++ b/src/variant19.lib/variant19/variant19.qbs
@@ -1,13 +1,6 @@
+import qbs.FileInfo
Product {
- Depends { name: "meta19" }
-
- Export {
- Depends { name: "cpp" }
- cpp.includePaths: [exportingProduct.sourceDirectory + "/.."]
- Depends { name: "meta19" }
- }
-
files: [
"None.fmt.h",
"None.h",
@@ -18,4 +11,12 @@ Product {
"Variant.ostream.h",
"VariantWhich.fmt.h",
]
+
+ Export {
+ cpp.includePaths: FileInfo.joinPaths(exportingProduct.sourceDirectory, "..")
+
+ Depends { name: "cpp" }
+ Depends { name: "meta19" }
+ }
+ Depends { name: "meta19" }
}
diff --git a/src/variant19.lib/variant19/variant19.tests.cmake b/src/variant19.lib/variant19/variant19.tests.cmake
index 6fc14c23..7b5a7eb5 100644
--- a/src/variant19.lib/variant19/variant19.tests.cmake
+++ b/src/variant19.lib/variant19/variant19.tests.cmake
@@ -2,10 +2,10 @@
add_executable(variant19-test)
file(GLOB variant19_test_sources "${CMAKE_CURRENT_LIST_DIR}/*.test.cpp")
target_sources(variant19-test
- PRIVATE ${variant19_test_sources}
+ PRIVATE ${variant19_test_sources}
)
target_link_libraries(variant19-test
- PRIVATE GTest::gtest_main
- PRIVATE CoCpp19::variant19
+ PRIVATE GTest::gtest_main
+ PRIVATE CoCpp19::variant19
)
add_test(NAME variant19 COMMAND variant19-test)
diff --git a/src/variant19.lib/variant19/variant19.tests.qbs b/src/variant19.lib/variant19/variant19.tests.qbs
index a561c22b..194dfcc5 100644
--- a/src/variant19.lib/variant19/variant19.tests.qbs
+++ b/src/variant19.lib/variant19/variant19.tests.qbs
@@ -1,16 +1,13 @@
Application {
name: "variant19.tests"
- condition: googletest.present
-
consoleApplication: true
- type: ["application", "autotest"]
-
- Depends { name: "variant19" }
- Depends { name: "googletest" }
-
+ type: base.concat(["autotest"])
files: [
"None.test.cpp",
"Variant.test.cpp",
]
+
+ Depends { name: "variant19" }
+ Depends { name: "googletest" }
}
diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt
index 3b06d86d..4a8c0a0b 100644
--- a/third_party/CMakeLists.txt
+++ b/third_party/CMakeLists.txt
@@ -1 +1,3 @@
-include(googletest.cmake)
\ No newline at end of file
+if(COCPP_BuildTests)
+ include(googletest.cmake)
+endif()
diff --git a/third_party/git_clone_googletest.sh b/third_party/git_clone_googletest.sh
deleted file mode 100755
index 7e57fd0f..00000000
--- a/third_party/git_clone_googletest.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-if [ ! -d "$(dirname "$0")/googletest" ]; then
- git clone --depth 1 --no-tags https://github.com/google/googletest.git "$(dirname "$0")/googletest"
-fi
-pushd "$(dirname "$0")/googletest"
-git fetch origin 210aab09deef06e64ab82414697abd0d7cb5978a
-git reset --hard FETCH_HEAD
-popd
diff --git a/third_party/googletest.cmake b/third_party/googletest.cmake
index 485e7b19..64409c53 100644
--- a/third_party/googletest.cmake
+++ b/third_party/googletest.cmake
@@ -1,41 +1,14 @@
include(FetchContent)
+find_package(GTest QUIET)
find_package(Threads REQUIRED)
set(THREADS_PREFER_PTHREAD_FLAG ON)
if(NOT ${GTest_FOUND})
- FetchContent_Declare(
- googletest
- GIT_REPOSITORY https://github.com/google/googletest.git
- GIT_TAG release-1.11.0
- )
- FetchContent_GetProperties(googletest)
- if(NOT googletest_POPULATED)
- FetchContent_Populate(googletest)
-
- set(gtest_SOURCE_DIR "${googletest_SOURCE_DIR}/googletest")
- add_library(gtest STATIC
- "${gtest_SOURCE_DIR}/src/gtest-all.cc"
- )
- target_include_directories(gtest
- PRIVATE "${gtest_SOURCE_DIR}"
- PUBLIC "${gtest_SOURCE_DIR}/include"
- )
- if(NOT ${CMAKE_USE_PTHREADS_INIT})
- target_compile_definitions(gtest
- PUBLIC GTEST_HAS_PTHREAD=0
- )
- endif()
- target_link_libraries(gtest
- PRIVATE Threads::Threads
- )
- add_library(GTest::gtest ALIAS gtest)
-
- add_library(gtest_main STATIC
- "${gtest_SOURCE_DIR}/src/gtest_main.cc"
- )
- target_link_libraries(gtest_main
- PUBLIC gtest
+ FetchContent_Declare(
+ googletest
+ GIT_REPOSITORY https://github.com/google/googletest.git
+ GIT_TAG v1.17.0
+ CMAKE_ARGS -DINSTALL_GTEST:BOOL=OFF
)
- add_library(GTest::gtest_main ALIAS gtest_main)
- endif()
+ FetchContent_MakeAvailable(googletest)
endif()
diff --git a/third_party/googletest.qbs b/third_party/googletest.qbs
index b88c58b3..dcb1e6e8 100644
--- a/third_party/googletest.qbs
+++ b/third_party/googletest.qbs
@@ -1,45 +1,34 @@
import qbs
import qbs.File
import qbs.FileInfo
+import online
StaticLibrary {
name: "googletest"
- Probe {
- id: googletestProbe
- property pathList searchPathes: ["./googletest", "../../googletest"]
- property path sourcePath: product.sourceDirectory
-
- property path basePath // valid if found
-
- configure: {
- for (var i=0; i < searchPathes.length; i++) {
- var c = searchPathes[i];
- if (File.exists(FileInfo.joinPaths(sourcePath, c, "googletest/src/gtest-all.cc"))) {
- found = true;
- basePath = FileInfo.joinPaths(sourcePath, c);
- return;
- }
- }
- }
- }
- condition: googletestProbe.found
-
- files: [
- FileInfo.joinPaths(googletestProbe.basePath, "googlemock/src/gmock-all.cc"),
- FileInfo.joinPaths(googletestProbe.basePath, "googletest/src/gtest-all.cc")
- ]
-
- Depends { name: "cpp" }
cpp.cxxLanguageVersion: "c++17"
cpp.includePaths: [
- FileInfo.joinPaths(googletestProbe.basePath, "googlemock"),
- FileInfo.joinPaths(googletestProbe.basePath, "googlemock/include"),
- FileInfo.joinPaths(googletestProbe.basePath, "googletest"),
- FileInfo.joinPaths(googletestProbe.basePath, "googletest/include"),
+ FileInfo.joinPaths(source.sourceDirectory, "googlemock"),
+ FileInfo.joinPaths(source.sourceDirectory, "googlemock/include"),
+ FileInfo.joinPaths(source.sourceDirectory, "googletest"),
+ FileInfo.joinPaths(source.sourceDirectory, "googletest/include"),
]
cpp.defines: ["GTEST_LANG_CXX11"]
+ condition: source.found
+ files: [
+ FileInfo.joinPaths(source.sourceDirectory, "googlemock/src/gmock-all.cc"),
+ FileInfo.joinPaths(source.sourceDirectory, "googletest/src/gtest-all.cc"),
+ FileInfo.joinPaths(source.sourceDirectory, "googlemock/include/**/*.h"),
+ FileInfo.joinPaths(source.sourceDirectory, "googletest/include/**/*.h"),
+ ]
+
+ online.Source {
+ id: source
+
+ name: "googletest"
+ uri: "gh:google/googletest@1.17.0"
+ }
Properties {
condition: qbs.toolchain.contains('gcc') // also set for clang
cpp.cxxFlags: {
@@ -54,15 +43,21 @@ StaticLibrary {
return flags;
}
}
-
Export {
- Depends { name: "cpp" }
- cpp.includePaths: [
- FileInfo.joinPaths(googletestProbe.basePath, "googlemock/include"),
- FileInfo.joinPaths(googletestProbe.basePath, "googletest/include")
+ property bool useMain: true
+
+ cpp.systemIncludePaths: [
+ FileInfo.joinPaths(source.sourceDirectory, "googlemock/include"),
+ FileInfo.joinPaths(source.sourceDirectory, "googletest/include")
]
cpp.defines: ["GTEST_LANG_CXX11"]
+ Group {
+ name: "Main"
+ condition: product.googletest.useMain
+
+ files: FileInfo.joinPaths(source.sourceDirectory, "googlemock/src/gmock_main.cc")
+ }
Properties {
condition: qbs.toolchain.contains('gcc') // also set for clang
cpp.cxxFlags: base.concat(
@@ -71,13 +66,7 @@ StaticLibrary {
)
cpp.dynamicLibraries: [ "pthread" ]
}
-
- property bool useMain: true
- Group {
- name: "Main"
- condition: product.googletest.useMain
-
- files: FileInfo.joinPaths(googletestProbe.basePath, "googlemock/src/gmock_main.cc")
- }
+ Depends { name: "cpp" }
}
+ Depends { name: "cpp" }
}
diff --git a/third_party/third_party.qbs b/third_party/third_party.qbs
index 4b118717..6a40aa55 100644
--- a/third_party/third_party.qbs
+++ b/third_party/third_party.qbs
@@ -1,15 +1,6 @@
-
Project {
-
+ name: "ThirdParty"
references: [
"googletest.qbs",
]
-
- Product {
- name: "third_party/[Extra Files]"
- files: [
- "git_clone_googletest.sh",
- ]
- }
-
}