Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add test for shared libraries with dependencies #158

Draft
wants to merge 5 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -391,22 +391,37 @@ jobs:
[ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_subdir_test"
cd "$cmake_test_folder"
mkdir __build_cmake_subdir_test__ && cd __build_cmake_subdir_test__
cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=OFF -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} ..
extra_args=""
# On Windows DLLs need to be either in PATH or in the same folder as the executable, so put all binaries into the same folder
if [[ "$RUNNER_OS" == "Windows" ]] && [[ "${{matrix.build_shared}}" == "ON" ]]; then
extra_args="-DCMAKE_RUNTIME_OUTPUT_DIRECTORY='$(pwd)/bin'"
fi
cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=OFF -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} $extra_args ..
cmake --build . --config ${{matrix.build_type}} -j$B2_JOBS
ctest --output-on-failure --build-config ${{matrix.build_type}}

- name: Install Library
run: |
BCM_INSTALL_PATH=/tmp/boost_install
echo "BCM_INSTALL_PATH=$BCM_INSTALL_PATH" >> $GITHUB_ENV
cd "$BOOST_ROOT"
mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
cmake -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_INSTALL_PREFIX=~/.local -DBoost_VERBOSE=ON -DBoost_DEBUG=ON ..
cmake -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_INSTALL_PREFIX="$BCM_INSTALL_PATH" -DBoost_VERBOSE=ON -DBoost_DEBUG=ON ..
cmake --build . --target install --config ${{matrix.build_type}} -j$B2_JOBS
- name: Run CMake install tests
run: |
cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_test" # New unified folder
[ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_install_test"
cd "$cmake_test_folder"
mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=ON -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_PREFIX_PATH=~/.local ..
cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=ON -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_PREFIX_PATH="$BCM_INSTALL_PATH" ..
cmake --build . --config ${{matrix.build_type}} -j$B2_JOBS
if [[ "${{matrix.build_shared}}" == "ON" ]]; then
# Make sure shared libs can be found at runtime
if [ "$RUNNER_OS" == "Windows" ]; then
export PATH="$BCM_INSTALL_PATH/bin:$PATH"
else
export LD_LIBRARY_PATH="$BCM_INSTALL_PATH/lib:$LD_LIBRARY_PATH"
fi
fi
ctest --output-on-failure --build-config ${{matrix.build_type}}
12 changes: 9 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
25 changes: 25 additions & 0 deletions build/Jamfile.v2
Original file line number Diff line number Diff line change
@@ -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 =
<link>shared:<define>BOOST_BOOST_CI_DYN_LINK=1
<library>/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 ;
33 changes: 13 additions & 20 deletions include/boost/boost-ci/boost_ci.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,17 @@
#include <memory>
#endif

// This define is usually set in boost/<libname>/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
Expand All @@ -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<int>(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);
}
}
47 changes: 47 additions & 0 deletions src/boost_ci.cpp
Original file line number Diff line number Diff line change
@@ -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 <boost/boost-ci/boost_ci.hpp>
// Just some dependency on another Boost library
#include <boost/atomic/atomic.hpp>

// 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<X> 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<int>(new int(answer.load().x));
return *ptr;
#endif
}
}
}
5 changes: 2 additions & 3 deletions test/Jamfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@
import os ;
import testing ;

project boost/ci/test
: requirements
<include>.
project : requirements
<library>/boost/ci//boost_ci
;

local B2_ADDRESS_MODEL = [ os.environ B2_ADDRESS_MODEL ] ;
Expand Down
23 changes: 21 additions & 2 deletions test/cmake_test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down