diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2c1630d4..09f5ec45 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,16 +7,22 @@ cmake_minimum_required(VERSION 3.5...3.16)
project(boost_ci VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
-add_library(boost_boost_ci INTERFACE)
+add_library(boost_boost_ci src/boost_ci.cpp)
add_library(Boost::boost_ci ALIAS boost_boost_ci)
-target_include_directories(boost_boost_ci INTERFACE include)
+target_include_directories(boost_boost_ci PUBLIC include)
target_link_libraries(boost_boost_ci
- INTERFACE
+ PUBLIC
Boost::config
+ PRIVATE
+ Boost::atomic
)
+if(BUILD_SHARED_LIBS)
+ target_compile_definitions(boost_boost_ci PUBLIC BOOST_BOOST_CI_DYN_LINK)
+endif()
+
if(BUILD_TESTING)
add_subdirectory(test)
endif()
diff --git a/build/Jamfile.v2 b/build/Jamfile.v2
new file mode 100644
index 00000000..40239514
--- /dev/null
+++ b/build/Jamfile.v2
@@ -0,0 +1,25 @@
+# Boost CI Test Build Jamfile
+
+# Copyright (c) 2022 Alexander Grund
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE or www.boost.org/LICENSE_1_0.txt)
+
+import configure ;
+
+local requirements =
+ shared:BOOST_BOOST_CI_DYN_LINK=1
+ /boost/atomic//boost_atomic
+ ;
+
+project boost/ci
+ : source-location ../src
+ : requirements $(requirements)
+ : usage-requirements $(requirements)
+ ;
+
+lib boost_ci
+ : boost_ci.cpp
+ ;
+
+boost-install boost_ci ;
diff --git a/include/boost/boost-ci/boost_ci.hpp b/include/boost/boost-ci/boost_ci.hpp
index b2d5f407..b5817fbb 100644
--- a/include/boost/boost-ci/boost_ci.hpp
+++ b/include/boost/boost-ci/boost_ci.hpp
@@ -11,6 +11,17 @@
#include
#endif
+// This define is usually set in boost//config.hpp
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_BOOST_CI_DYN_LINK)
+#ifdef BOOST_BOOST_CI_SOURCE
+#define BOOST_BOOST_CI_DECL BOOST_SYMBOL_EXPORT
+#else
+#define BOOST_BOOST_CI_DECL BOOST_SYMBOL_IMPORT
+#endif
+#else
+#define BOOST_BOOST_CI_DECL
+#endif
+
namespace boost
{
namespace boost_ci
@@ -21,25 +32,7 @@ namespace boost
#define MSVC_VALUE false
#endif
- // Some function to test
- BOOST_NOINLINE int get_answer(const bool isMsvc = MSVC_VALUE)
- {
- int answer;
- // Specifically crafted condition to check for coverage from MSVC and non MSVC builds
- if(isMsvc)
- {
- answer = 21;
- } else
- {
- answer = 42;
- }
-#ifdef BOOST_NO_CXX11_SMART_PTR
- return answer;
-#else
- // Just use some stdlib feature combined with a Boost.Config feature as demonstration
- auto ptr = std::unique_ptr(new int(answer));
- return *ptr;
-#endif
- }
+ // Some function to test. Returns 41 for true, 42 otherwise
+ BOOST_BOOST_CI_DECL int get_answer(bool isMsvc = MSVC_VALUE);
}
}
diff --git a/src/boost_ci.cpp b/src/boost_ci.cpp
new file mode 100644
index 00000000..1c3a43cf
--- /dev/null
+++ b/src/boost_ci.cpp
@@ -0,0 +1,47 @@
+//
+// Copyright (c) 2022 Alexander Grund
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#define BOOST_BOOST_CI_SOURCE
+
+#include
+// Just some dependency on another Boost library
+#include
+
+// Some simple struct big enough so that the atomic is forced to use a lock
+// forcing it to call into the library
+struct X
+{
+ double x, y, z;
+ explicit X(int value = 0): x(value), y(value), z(value) {}
+};
+
+namespace boost
+{
+ namespace boost_ci
+ {
+ // Some function to test
+ int get_answer(const bool isMsvc)
+ {
+ boost::atomic answer;
+ // Specifically crafted condition to check for coverage from MSVC and non MSVC builds
+ if(isMsvc)
+ {
+ answer = X(21);
+ } else
+ {
+ answer = X(42);
+ }
+#ifdef BOOST_NO_CXX11_SMART_PTR
+ return answer.load().x;
+#else
+ // Just use some stdlib feature combined with a Boost.Config feature as demonstration
+ auto ptr = std::unique_ptr(new int(answer.load().x));
+ return *ptr;
+#endif
+ }
+ }
+}
diff --git a/test/Jamfile b/test/Jamfile
index fdbbeaba..db979644 100644
--- a/test/Jamfile
+++ b/test/Jamfile
@@ -8,9 +8,8 @@
import os ;
import testing ;
-project boost/ci/test
- : requirements
- .
+project : requirements
+ /boost/ci//boost_ci
;
local B2_ADDRESS_MODEL = [ os.environ B2_ADDRESS_MODEL ] ;
diff --git a/test/cmake_test/CMakeLists.txt b/test/cmake_test/CMakeLists.txt
index 01efe823..429ada16 100644
--- a/test/cmake_test/CMakeLists.txt
+++ b/test/cmake_test/CMakeLists.txt
@@ -11,8 +11,27 @@ project(cmake_subdir_test LANGUAGES CXX)
if(BOOST_CI_INSTALL_TEST)
find_package(boost_boost_ci REQUIRED)
else()
- add_subdirectory(../.. boostorg/ci)
- add_subdirectory(../../../config boostorg/config)
+ add_subdirectory(../.. boostorg/boost-ci)
+
+ set(deps
+ # Primary dependencies
+ atomic
+ config
+ core
+ # Secondary dependencies
+ align
+ assert
+ predef
+ preprocessor
+ static_assert
+ throw_exception
+ type_traits
+ winapi
+ )
+
+ foreach(dep IN LISTS deps)
+ add_subdirectory(../../../${dep} boostorg/${dep})
+ endforeach()
endif()
add_executable(main main.cpp)