Skip to content

Refactor CMake builds #159

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

Open
wants to merge 3 commits into
base: shared_build_test
Choose a base branch
from
Open
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
39 changes: 9 additions & 30 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -374,39 +374,18 @@ jobs:
[[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci .
rm -rf boost-ci-cloned
- name: Setup Boost
env: {B2_DONT_BOOTSTRAP: 1}
env:
B2_DONT_BOOTSTRAP: 1
BCM_GENERATOR: ${{matrix.generator}}
BCM_BUILD_TYPE: ${{matrix.build_type}}
BCM_SHARED_LIBS: ${{matrix.build_shared}}
run: source ci/github/install.sh

- name: Run CMake tests
run: |
cd "$BOOST_ROOT"
mkdir __build_cmake_test__ && cd __build_cmake_test__
cmake -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DBUILD_TESTING=ON -DBoost_VERBOSE=ON ..
cmake --build . --target tests --config ${{matrix.build_type}}
ctest --output-on-failure --build-config ${{matrix.build_type}}
run: ci/cmake_test.sh

- name: Run CMake subdir 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_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}} ..
cmake --build . --config ${{matrix.build_type}}
ctest --output-on-failure --build-config ${{matrix.build_type}}

- name: Install Library
run: |
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 --build . --target install --config ${{matrix.build_type}}
run: ci/cmake_subdir_test.sh

- 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 --build . --config ${{matrix.build_type}}
ctest --output-on-failure --build-config ${{matrix.build_type}}
run: ci/cmake_install_test.sh
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 ;
35 changes: 35 additions & 0 deletions ci/cmake_build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#! /bin/bash
#
# Copyright 2022 Alexander Grund
# Distributed under 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)
#
# Bash script to perform a CMake build of Boost
#
# Requires the following env vars:
# - BOOST_ROOT & SELF (setup step)
# - BCM_GENERATOR
# - BCM_BUILD_TYPE
# - BCM_SHARED_LIBS
# - BCM_ARGS
# - BCM_TARGET

set -e

. "$(dirname "${BASH_SOURCE[0]}")"/set_num_jobs.sh

cd "$BOOST_ROOT"
buildDir=__build
while [ -d "$buildDir" ]; do
buildDir="${buildDir}_2"
done
mkdir "$buildDir" && cd "$buildDir"

echo "Configuring..."
set -x
cmake -G "$BCM_GENERATOR" -DCMAKE_BUILD_TYPE=$BCM_BUILD_TYPE -DBUILD_SHARED_LIBS=$BCM_SHARED_LIBS -DBOOST_INCLUDE_LIBRARIES=$SELF -DBoost_VERBOSE=ON "${BCM_ARGS[@]}" ..
set +x

echo "Building..."
cmake --build . --target $BCM_TARGET --config $BCM_BUILD_TYPE -j$B2_JOBS
48 changes: 48 additions & 0 deletions ci/cmake_install_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#! /bin/bash
#
# Copyright 2022 Alexander Grund
# Distributed under 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)
#
# Bash script to test consuming a Boost library via CMakes add_subdirectory command
#
# Requires the following env vars:
# - BOOST_ROOT & SELF (setup step)
# - BCM_GENERATOR
# - BCM_BUILD_TYPE
# - BCM_SHARED_LIBS

set -eu

echo "Installing Boost via CMake"
BCM_INSTALL_PATH=/tmp/boost_install

BCM_ARGS=(
-DCMAKE_INSTALL_PREFIX=$BCM_INSTALL_PATH
)
BCM_TARGET=install

. "$(dirname "${BASH_SOURCE[0]}")"/cmake_build.sh

cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_test"
# New unified folder used for the subdir and install test with BOOST_CI_INSTALL_TEST to distinguish in CMake
if [ -d "$cmake_test_folder" ]; then
echo "Using the unified test folder $cmake_test_folder"

else
cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_install_test"
echo "Using the dedicated install test folder $cmake_test_folder"
fi

cd "$cmake_test_folder"
mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__

echo "Configuring..."
cmake -G "$BCM_GENERATOR" -DCMAKE_BUILD_TYPE=$BCM_BUILD_TYPE -DBUILD_SHARED_LIBS=$BCM_SHARED_LIBS -DBOOST_CI_INSTALL_TEST=ON -DCMAKE_PREFIX_PATH=$BCM_INSTALL_PATH ..

echo "Building..."
cmake --build . --config $BCM_BUILD_TYPE -j$B2_JOBS

echo "Testing..."
ctest --output-on-failure --build-config $BCM_BUILD_TYPE
40 changes: 40 additions & 0 deletions ci/cmake_subdir_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#! /bin/bash
#
# Copyright 2022 Alexander Grund
# Distributed under 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)
#
# Bash script to test consuming a Boost library via CMakes add_subdirectory command
#
# Requires the following env vars:
# - BOOST_ROOT & SELF (setup step)
# - BCM_GENERATOR
# - BCM_BUILD_TYPE
# - BCM_SHARED_LIBS

set -eu

. "$(dirname "${BASH_SOURCE[0]}")"/set_num_jobs.sh

cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_test"
# New unified folder used for the subdir and install test with BOOST_CI_INSTALL_TEST to distinguish in CMake
if [ -d "$cmake_test_folder" ]; then
echo "Using the unified test folder $cmake_test_folder"

else
cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_subdir_test"
echo "Using the dedicated subdir test folder $cmake_test_folder"
fi

cd "$cmake_test_folder"
mkdir __build_cmake_subdir_test__ && cd __build_cmake_subdir_test__

echo "Configuring..."
cmake -G "$BCM_GENERATOR" -DCMAKE_BUILD_TYPE=$BCM_BUILD_TYPE -DBUILD_SHARED_LIBS=$BCM_SHARED_LIBS -DBOOST_CI_INSTALL_TEST=OFF ..

echo "Building..."
cmake --build . --config $BCM_BUILD_TYPE -j$B2_JOBS

echo "Testing..."
ctest --output-on-failure --build-config $BCM_BUILD_TYPE
26 changes: 26 additions & 0 deletions ci/cmake_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#! /bin/bash
#
# Copyright 2022 Alexander Grund
# Distributed under 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)
#
# Bash script to perform a CMake build of Boost
#
# Requires the following env vars:
# - BOOST_ROOT & SELF (setup step)
# - BCM_GENERATOR
# - BCM_BUILD_TYPE
# - BCM_SHARED_LIBS

set -e

BCM_ARGS=(
-DBUILD_TESTING=ON
)
BCM_TARGET=tests

. "$(dirname "${BASH_SOURCE[0]}")"/cmake_build.sh

echo "Testing..."
ctest --output-on-failure --build-config $BCM_BUILD_TYPE
6 changes: 1 addition & 5 deletions ci/enforce.sh
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,7 @@ if [ -z "$B2_CXXSTD" ]; then
export B2_CXXSTD=11
fi

# default parallel build jobs: number of CPUs available + 1
if [ -z "${B2_JOBS}" ]; then
cpus=$(grep -c 'processor' /proc/cpuinfo || python -c 'import multiprocessing as mp; print(mp.cpu_count())' || echo "2")
export B2_JOBS=$((cpus + 1))
fi
. "$(dirname "${BASH_SOURCE[0]}")"/set_num_jobs.sh

# Build cmdline arguments for B2 as an array to preserve quotes
if [ -z "$B2_CI_VERSION" ]; then
Expand Down
3 changes: 3 additions & 0 deletions ci/github/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,6 @@ echo "B2_COMPILER=$B2_COMPILER" >> $GITHUB_ENV
[ -z "$B2_TSAN" ] || echo "B2_TSAN=$B2_TSAN" >> $GITHUB_ENV
[ -z "$B2_UBSAN" ] || echo "B2_UBSAN=$B2_UBSAN" >> $GITHUB_ENV
[ -z "$B2_FLAGS" ] || echo "B2_FLAGS=$B2_FLAGS" >> $GITHUB_ENV
[ -z "$BCM_GENERATOR" ] || echo "BCM_GENERATOR=$BCM_GENERATOR" >> $GITHUB_ENV
[ -z "$BCM_BUILD_TYPE" ] || echo "BCM_BUILD_TYPE=$BCM_BUILD_TYPE" >> $GITHUB_ENV
[ -z "$BCM_SHARED_LIBS" ] || echo "BCM_SHARED_LIBS=$BCM_SHARED_LIBS" >> $GITHUB_ENV
17 changes: 17 additions & 0 deletions ci/set_num_jobs.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#
# Copyright 2017 - 2019 James E. King III
# Copyright 2022 Alexander Grund
#
# Distributed under 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)
#
# Determine a good number of (build) jobs to use and stores it in B2_JOBS
#

if [ -z "${B2_JOBS:-}" ]; then
# default parallel build jobs: number of CPUs available + 1.
# In case of failure 2 CPUs are assumed
cpus=$(grep -c 'processor' /proc/cpuinfo || python -c 'import multiprocessing as mp; print(mp.cpu_count())' || echo "2")
export B2_JOBS=$((cpus + 1))
fi
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
Loading