Compare commits

...
4 Commits
Author SHA1 Message Date
Sergey ChebotarevandGitHub 2358570f2d Remove static (#90) 2025-10-23 11:37:57 +03:00
James E. King III 02ec362f5c Complete python3 fixes for issue #67 2025-07-03 08:55:00 -04:00
Thomas HöhligandJim King 4b8160057a Fix scripts to add python3 support
* fixed libraries include
  * fixed incorrect usage of python2 string
  * fixed python2 to python3 script issues (2to3) like print ""
  * fixed data types
  * fixed python3 usage of str instead of string (join, split etc.)
  * added support to determine the absolute path of the executable
    binary of the current Python interpreter
    * thx @Bagira80 for his support

Fixes issue: #67

Signed-off-by: Thomas Höhlig <thoehlig@benocs.com>
2025-07-02 23:52:03 -04:00
James E. King III 03869de68e Implement reusable Boost.CI workflow for GHA 2025-07-02 22:09:37 -04:00
7 changed files with 95 additions and 506 deletions
+17 -432
View File
@@ -1,12 +1,20 @@
#
# Copyright 2020-2021 Peter Dimov # Copyright 2020-2021 Peter Dimov
# Copyright 2021 Andrey Semashev # Copyright 2021 Andrey Semashev
# Copyright 2021 Alexander Grund # Copyright 2021-2024 Alexander Grund
# Copyright 2022-2025 James E. King III # Copyright 2022-2025 James E. King III
# #
# Distributed under the Boost Software License, Version 1.0. # Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) # (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
#
# This workflow uses the Boost.CI reusable workflow which builds a variety of
# configurations of your project, runs tests, and generates code coverage reports.
#
# To use it, copy this file into your repository as `.github/workflows/ci.yml` and
# customize it appropriately.
#
--- ---
name: CI name: Boost.CI
on: on:
pull_request: pull_request:
@@ -23,434 +31,11 @@ on:
- meta/** - meta/**
- README.md - README.md
concurrency:
group: ${{format('{0}:{1}', github.repository, github.ref)}}
cancel-in-progress: true
env:
UBSAN_OPTIONS: print_stacktrace=1
GIT_FETCH_JOBS: 8
NET_RETRY_COUNT: 5
B2_CI_VERSION: 1
B2_VARIANT: debug,release
B2_LINK: shared,static
LCOV_BRANCH_COVERAGE: 1
jobs: jobs:
posix: call-boost-ci:
defaults: name: Run Boost.CI
run: uses: boostorg/boost-ci/.github/workflows/reusable.yml@master
shell: bash secrets:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
strategy: COVERITY_SCAN_NOTIFICATION_EMAIL: ${{ secrets.COVERITY_SCAN_NOTIFICATION_EMAIL }}
fail-fast: false COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
matrix:
include:
# Linux, gcc
- { compiler: gcc-4.8, cxxstd: '03,11', os: ubuntu-latest, container: 'ubuntu:16.04' }
- { compiler: gcc-4.9, cxxstd: '03,11', os: ubuntu-latest, container: 'ubuntu:16.04' }
- { compiler: gcc-5, cxxstd: '03,11,14,1z', os: ubuntu-latest, container: 'ubuntu:18.04' }
- { compiler: gcc-6, cxxstd: '03,11,14,17', os: ubuntu-latest, container: 'ubuntu:18.04' }
- { compiler: gcc-7, cxxstd: '03,11,14,17', os: ubuntu-latest, container: 'ubuntu:20.04' }
- { compiler: gcc-8, cxxstd: '03,11,14,17,2a', os: ubuntu-latest, container: 'ubuntu:20.04' }
- { compiler: gcc-9, cxxstd: '03,11,14,17,2a', os: ubuntu-latest, container: 'ubuntu:20.04' }
- { compiler: gcc-10, cxxstd: '03,11,14,17,20', os: ubuntu-22.04 }
- { compiler: gcc-11, cxxstd: '03,11,14,17,20', os: ubuntu-22.04 }
- { compiler: gcc-12, cxxstd: '03,11,14,17,20', os: ubuntu-22.04 }
- { compiler: gcc-13, cxxstd: '11,14,17,20,2b', os: ubuntu-24.04 }
- { compiler: gcc-14, cxxstd: '11,14,17,20,2b', os: ubuntu-24.04 }
- { name: GCC w/ sanitizers, sanitize: yes,
compiler: gcc-13, cxxstd: '03,11,14,17,20', os: ubuntu-24.04 }
- { name: Collect coverage, coverage: yes,
compiler: gcc-13, cxxstd: '03,2b', os: ubuntu-24.04, install: 'g++-13-multilib', address-model: '32,64' }
# Linux, clang
- { compiler: clang-3.5, cxxstd: '03,11', os: ubuntu-latest, container: 'ubuntu:16.04' }
- { compiler: clang-3.6, cxxstd: '03,11,14', os: ubuntu-latest, container: 'ubuntu:16.04' }
- { compiler: clang-3.7, cxxstd: '03,11,14', os: ubuntu-latest, container: 'ubuntu:16.04' }
- { compiler: clang-3.8, cxxstd: '03,11,14', os: ubuntu-latest, container: 'ubuntu:16.04' }
- { compiler: clang-3.9, cxxstd: '03,11,14', os: ubuntu-latest, container: 'ubuntu:18.04' }
- { compiler: clang-4.0, cxxstd: '03,11,14', os: ubuntu-latest, container: 'ubuntu:18.04' }
- { compiler: clang-5.0, cxxstd: '03,11,14,1z', os: ubuntu-latest, container: 'ubuntu:18.04' }
- { compiler: clang-6.0, cxxstd: '03,11,14,17', os: ubuntu-latest, container: 'ubuntu:20.04' }
- { compiler: clang-7, cxxstd: '03,11,14,17', os: ubuntu-latest, container: 'ubuntu:20.04' }
- { compiler: clang-8, cxxstd: '03,11,14,17', os: ubuntu-latest, container: 'ubuntu:20.04' }
- { compiler: clang-9, cxxstd: '03,11,14,17,2a', os: ubuntu-latest, container: 'ubuntu:20.04' }
- { compiler: clang-10, cxxstd: '03,11,14,17,20', os: ubuntu-latest, container: 'ubuntu:20.04' }
- { compiler: clang-11, cxxstd: '03,11,14,17,20', os: ubuntu-latest, container: 'ubuntu:20.04' }
- { compiler: clang-12, cxxstd: '03,11,14,17,20', os: ubuntu-latest, container: 'ubuntu:20.04' }
# Clang isn't compatible with libstdc++-13, so use the slightly older one
- { compiler: clang-13, cxxstd: '03,11,14,17,20', os: ubuntu-22.04, install: 'clang-13 g++-12', gcc_toolchain: 12 }
- { compiler: clang-14, cxxstd: '03,11,14,17,20', os: ubuntu-22.04, install: 'clang-14 g++-12', gcc_toolchain: 12 }
- { compiler: clang-15, cxxstd: '03,11,14,17,20', os: ubuntu-22.04, install: 'clang-15 g++-12', gcc_toolchain: 12 }
- { compiler: clang-16, cxxstd: '11,14,17,20,2b', os: ubuntu-24.04 }
# https://github.com/llvm/llvm-project/issues/59827: disabled 2b/23 for clang-17 with libstdc++13 in 24.04
- { compiler: clang-17, cxxstd: '11,14,17,20', os: ubuntu-24.04 }
- { compiler: clang-18, cxxstd: '11,14,17,20,23,2c', os: ubuntu-24.04 }
# libc++
- { compiler: clang-6.0, cxxstd: '03,11,14', os: ubuntu-latest, container: 'ubuntu:18.04', stdlib: libc++, install: 'clang-6.0 libc++-dev libc++abi-dev' }
- { compiler: clang-7, cxxstd: '03,11,14,17', os: ubuntu-latest, container: 'ubuntu:20.04', stdlib: libc++, install: 'clang-7 libc++-7-dev libc++abi-7-dev' }
- { name: Clang w/ sanitizers, sanitize: yes,
compiler: clang-12, cxxstd: '03,11,14,17,20', os: ubuntu-latest, container: 'ubuntu:20.04', stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev' }
- { name: MacOS w/ clang and sanitizers,
compiler: clang, cxxstd: '03,11,14,17,20,2b', os: macos-13, sanitize: yes }
- { compiler: clang, cxxstd: '03,11,14,17,20,2b', os: macos-14 }
- { compiler: clang, cxxstd: '03,11,14,17,20,2b', os: macos-15 }
# Coverity Scan
# requires two github secrets in repo to activate; see ci/github/coverity.sh
# does not run on pull requests, only on pushes into develop and master
- { name: Coverity, coverity: yes,
compiler: clang-12, cxxstd: '03,20', os: ubuntu-latest, container: 'ubuntu:20.04', ccache: no }
# multiarch (bigendian testing) - does not support coverage yet
- { name: Big-endian, multiarch: yes,
compiler: clang, cxxstd: '17', os: ubuntu-22.04, ccache: no, distro: fedora, edition: 34, arch: s390x }
timeout-minutes: 120
runs-on: ${{matrix.os}}
container:
image: ${{matrix.container}}
volumes:
- /node20217:/node20217:rw,rshared
- ${{ startsWith(matrix.container, 'ubuntu:1') && '/node20217:/__e/node20:ro,rshared' || ' ' }}
env: {B2_USE_CCACHE: 1}
steps:
- name: Setup environment
run: |
if [ -f "/etc/debian_version" ]; then
echo "DEBIAN_FRONTEND=noninteractive" >> $GITHUB_ENV
export DEBIAN_FRONTEND=noninteractive
fi
if [ -n "${{matrix.container}}" ] && [ -f "/etc/debian_version" ]; then
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y sudo software-properties-common curl
# Need (newer) git, and the older Ubuntu container may require requesting the key manually using port 80
curl -sSL --retry ${NET_RETRY_COUNT:-5} 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xE1DD270288B4E6030699E45FA1715D88E1DF1F24' | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/git-core_ubuntu_ppa.gpg
for i in {1..${NET_RETRY_COUNT:-3}}; do sudo -E add-apt-repository -y ppa:git-core/ppa && break || sleep 10; done
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
osver=$(lsb_release -sr | cut -f1 -d.)
pkgs="g++ git xz-utils"
# Ubuntu 22+ has only Python 3 in the repos
if [ -n "$osver" ] && [ "$osver" -ge "22" ]; then
pkgs+=" python-is-python3 libpython3-dev"
else
# ubuntu:20.04 has no libpython-dev and I'm not sure why we need it
# pkgs+=" python libpython-dev"
pkgs+=" python"
fi
apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y $pkgs
fi
# For jobs not compatible with ccache, use "ccache: no" in the matrix
if [[ "${{ matrix.ccache }}" == "no" ]]; then
echo "B2_USE_CCACHE=0" >> $GITHUB_ENV
fi
if [[ "${{ matrix.sanitize }}" == "yes" ]]; then
echo "LSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/test/suppressions.txt" >> $GITHUB_ENV
fi
git config --global pack.threads 0
if [[ "${{matrix.container}}" == "ubuntu:1"* ]]; then
# Node 20 doesn't work with Ubuntu 16/18 glibc: https://github.com/actions/checkout/issues/1590
curl -sL https://archives.boost.io/misc/node/node-v20.9.0-linux-x64-glibc-217.tar.xz | tar -xJ --strip-components 1 -C /node20217
fi
- uses: actions/checkout@v4
with:
# For coverage builds fetch the whole history, else only 1 commit using a 'fake ternary'
fetch-depth: ${{ matrix.coverage && '0' || '1' }}
- name: Cache ccache
uses: actions/cache@v4
if: env.B2_USE_CCACHE
with:
path: ~/.ccache
key: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}-${{github.sha}}
restore-keys: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}-
- name: Fetch Boost.CI
uses: actions/checkout@v4
with:
repository: boostorg/boost-ci
ref: master
path: boost-ci-cloned
- name: Get CI scripts folder
run: |
# Copy ci folder if not testing Boost.CI
[[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci .
rm -rf boost-ci-cloned
- name: Install packages
if: startsWith(matrix.os, 'ubuntu')
run: |
SOURCE_KEYS=("${{join(matrix.source_keys, '" "')}}")
SOURCES=("${{join(matrix.sources, '" "')}}")
# Add this by default
SOURCE_KEYS+=('http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x1E9377A2BA9EF27F')
SOURCES+=(ppa:ubuntu-toolchain-r/test)
ci/add-apt-keys.sh "${SOURCE_KEYS[@]}"
# Initial update before adding sources required to get e.g. keys
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
ci/add-apt-repositories.sh "${SOURCES[@]}"
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
if [[ -z "${{matrix.install}}" ]]; then
pkgs="${{matrix.compiler}}"
pkgs="${pkgs/gcc-/g++-}"
else
pkgs="${{matrix.install}}"
fi
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y $pkgs
- name: Setup GCC Toolchain
if: matrix.gcc_toolchain
run: |
GCC_TOOLCHAIN_ROOT="$HOME/gcc-toolchain"
echo "GCC_TOOLCHAIN_ROOT=$GCC_TOOLCHAIN_ROOT" >> $GITHUB_ENV
if ! command -v dpkg-architecture; then
apt-get install -y dpkg-dev
fi
MULTIARCH_TRIPLET="$(dpkg-architecture -qDEB_HOST_MULTIARCH)"
mkdir -p "$GCC_TOOLCHAIN_ROOT"
ln -s /usr/include "$GCC_TOOLCHAIN_ROOT/include"
ln -s /usr/bin "$GCC_TOOLCHAIN_ROOT/bin"
mkdir -p "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET"
ln -s "/usr/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}" "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}"
- name: Setup multiarch
if: matrix.multiarch
env:
BDDE_DISTRO: ${{matrix.distro}}
BDDE_EDITION: ${{matrix.edition}}
BDDE_ARCH: ${{matrix.arch}}
run: ci/github/setup_bdde.sh
- name: Setup Boost
env:
B2_ADDRESS_MODEL: ${{matrix.address-model}}
B2_COMPILER: ${{matrix.compiler}}
B2_CXXSTD: ${{matrix.cxxstd}}
B2_SANITIZE: ${{matrix.sanitize}}
B2_STDLIB: ${{matrix.stdlib}}
# More entries can be added in the same way, see the B2_ARGS assignment in ci/enforce.sh for the possible keys.
# B2_DEFINES: ${{matrix.defines}}
# Variables set here (to non-empty) will override the top-level environment variables, e.g.
# B2_VARIANT: ${{matrix.variant}}
# Set the (B2) target(s) to build, defaults to the test folder of the current library
# Can alternatively be done like this in the build step or in the build command of the build step, e.g. `run: B2_TARGETS=libs/$SELF/doc ci/build.sh`
# B2_TARGETS: libs/foo/test//bar
run: source ci/github/install.sh
- name: Setup coverage collection
if: matrix.coverage
run: ci/github/codecov.sh "setup"
- name: Run tests
if: '!matrix.coverity'
run: ci/build.sh
- name: Upload coverage
if: matrix.coverage
run: ci/codecov.sh "upload"
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- name: Run coverity
if: matrix.coverity && github.event_name == 'push' && (github.ref_name == 'develop' || github.ref_name == 'master')
run: ci/github/coverity.sh
env:
COVERITY_SCAN_NOTIFICATION_EMAIL: ${{ secrets.COVERITY_SCAN_NOTIFICATION_EMAIL }}
COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
windows:
defaults:
run:
shell: cmd
strategy:
fail-fast: false
matrix:
include:
- { toolset: msvc-14.0, cxxstd: '14,latest', addrmd: '32,64', os: windows-2019 }
- { toolset: msvc-14.2, cxxstd: '14,17,20', addrmd: '32,64', os: windows-2019 }
- { toolset: msvc-14.3, cxxstd: '14,17,20,latest',addrmd: '32,64', os: windows-2022 }
- { name: Collect coverage, coverage: yes,
toolset: msvc-14.3, cxxstd: 'latest', addrmd: '64', os: windows-2022 }
- { toolset: clang-win, cxxstd: '14,17,latest', addrmd: '32,64', os: windows-2022 }
- { toolset: gcc, cxxstd: '03,11,14,17,2a', addrmd: '64', os: windows-2022 }
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Fetch Boost.CI
uses: actions/checkout@v4
with:
repository: boostorg/boost-ci
ref: master
path: boost-ci-cloned
- name: Get CI scripts folder
run: |
REM Copy ci folder if not testing Boost.CI
if "%GITHUB_REPOSITORY%" == "%GITHUB_REPOSITORY:boost-ci=%" xcopy /s /e /q /i /y boost-ci-cloned\ci .\ci
rmdir /s /q boost-ci-cloned
- name: Setup Boost
run: ci\github\install.bat
- name: Run tests
if: '!matrix.coverage'
run: ci\build.bat
env:
B2_TOOLSET: ${{matrix.toolset}}
B2_CXXSTD: ${{matrix.cxxstd}}
B2_ADDRESS_MODEL: ${{matrix.addrmd}}
- name: Collect coverage
shell: powershell
if: matrix.coverage
run: ci\opencppcoverage.ps1
env:
B2_TOOLSET: ${{matrix.toolset}}
B2_CXXSTD: ${{matrix.cxxstd}}
B2_ADDRESS_MODEL: ${{matrix.addrmd}}
- name: Upload coverage
if: matrix.coverage
uses: codecov/codecov-action@v5
with:
disable_search: true
fail_ci_if_error: true
files: __out/cobertura.xml
name: github-actions
token: ${{secrets.CODECOV_TOKEN}}
verbose: true
MSYS2:
defaults:
run:
shell: msys2 {0}
strategy:
fail-fast: false
matrix:
include:
- { sys: MINGW32, compiler: gcc, cxxstd: '03,11,17,20' }
- { sys: MINGW64, compiler: gcc, cxxstd: '03,11,17,20' }
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Setup MSYS2 environment
uses: msys2/setup-msys2@v2
with:
msystem: ${{matrix.sys}}
update: true
install: git python
pacboy: gcc:p cmake:p ninja:p
- name: Fetch Boost.CI
uses: actions/checkout@v4
with:
repository: boostorg/boost-ci
ref: master
path: boost-ci-cloned
- name: Get CI scripts folder
run: |
# Copy ci folder if not testing Boost.CI
[[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci .
rm -rf boost-ci-cloned
- name: Setup Boost
env:
B2_COMPILER: ${{matrix.compiler}}
B2_CXXSTD: ${{matrix.cxxstd}}
B2_SANITIZE: ${{matrix.sanitize}}
B2_STDLIB: ${{matrix.stdlib}}
run: ci/github/install.sh
- name: Run tests
run: ci/build.sh
# Run also the CMake tests to avoid having to setup another matrix for CMake on MSYS
- name: Run CMake tests
run: |
cd "$BOOST_ROOT"
mkdir __build_cmake_test__ && cd __build_cmake_test__
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=ON -DBUILD_TESTING=ON -DBoost_VERBOSE=ON ..
cmake --build . --target tests --config Debug -j$B2_JOBS
ctest --output-on-failure --build-config Debug
CMake:
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
include:
- { os: ubuntu-latest, build_shared: ON, build_type: Debug, generator: 'Unix Makefiles' }
- { os: ubuntu-latest, build_shared: OFF, build_type: Debug, generator: 'Unix Makefiles' }
- { os: windows-2025, build_shared: ON, build_type: Debug, generator: 'Visual Studio 17 2022' }
- { os: windows-2025, build_shared: OFF, build_type: Debug, generator: 'Visual Studio 17 2022' }
timeout-minutes: 120
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
- name: Fetch Boost.CI
uses: actions/checkout@v4
with:
repository: boostorg/boost-ci
ref: master
path: boost-ci-cloned
- name: Get CI scripts folder
run: |
# Copy ci folder if not testing Boost.CI
[[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci .
rm -rf boost-ci-cloned
- name: Setup Boost
env: {B2_DONT_BOOTSTRAP: 1}
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}} -j$B2_JOBS
ctest --output-on-failure --build-config ${{matrix.build_type}}
- 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}} -j$B2_JOBS
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}} -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 --build . --config ${{matrix.build_type}} -j$B2_JOBS
ctest --output-on-failure --build-config ${{matrix.build_type}}
+1 -1
View File
@@ -39,7 +39,7 @@
namespace boost { namespace mpl { namespace aux { namespace boost { namespace mpl { namespace aux {
template< typename T > static T const& ptr_to_ref(T*); template< typename T > T const& ptr_to_ref(T*);
}}} }}}
+5 -5
View File
@@ -5,12 +5,12 @@ Pre-processing of MPL-containers can be accomplished using the script
"boost_mpl_preprocess.py". In the simple case call it with a single "boost_mpl_preprocess.py". In the simple case call it with a single
argument which is the path to the source-directory of Boost. argument which is the path to the source-directory of Boost.
python boost_mpl_preprocess.py <path-to-boost-sourcedir> python3 boost_mpl_preprocess.py <path-to-boost-sourcedir>
If the Boost source-directory is the one this script resides in, you If the Boost source-directory is the one this script resides in, you
can just call it without any arguments. can just call it without any arguments.
python boost_mpl_preprocess.py python3 boost_mpl_preprocess.py
Either way, this will pre-process all four MPL-container types (vector, Either way, this will pre-process all four MPL-container types (vector,
list, set, map) and makes them able to hold up to 100 elements. They can list, set, map) and makes them able to hold up to 100 elements. They can
@@ -22,7 +22,7 @@ be different from the one of other MPL-container types and it can also
differ between its 'numbered' and 'variadic' form. differ between its 'numbered' and 'variadic' form.
To see all options, call the script like this: To see all options, call the script like this:
python boost_mpl_preprocess.py --help python3 boost_mpl_preprocess.py --help
Fixing pre-processing of MPL-containers Fixing pre-processing of MPL-containers
@@ -44,12 +44,12 @@ can also fix them explicitly by calling "fix_boost_mpl_preprocess.py"
directly. directly.
If you just want to test if any fixing is needed call it like this: If you just want to test if any fixing is needed call it like this:
python fix_boost_mpl_preprocess.py --check-only <path-to-boost-sourcedir> python3 fix_boost_mpl_preprocess.py --check-only <path-to-boost-sourcedir>
This will tell you if any fixing is needed. In such a case call the script This will tell you if any fixing is needed. In such a case call the script
"fix_boost_mpl_preprocess.py" like this: "fix_boost_mpl_preprocess.py" like this:
python fix_boost_mpl_preprocess.py <path-to-boost-sourcedir> python3 fix_boost_mpl_preprocess.py <path-to-boost-sourcedir>
This will fix the header-comments of all the source-files needed during This will fix the header-comments of all the source-files needed during
pre-processing. Calling "boost_mpl_preprocess.py" afterwards should then pre-processing. Calling "boost_mpl_preprocess.py" afterwards should then
+37 -32
View File
@@ -29,7 +29,7 @@ def create_more_container_files(sourceDir, suffix, maxElements, containers, cont
newFile = os.path.join( sourceDir, container, container + str(i+10) + suffix ) newFile = os.path.join( sourceDir, container, container + str(i+10) + suffix )
shutil.copyfile( os.path.join( sourceDir, container, container + "20" + suffix ), newFile ) shutil.copyfile( os.path.join( sourceDir, container, container + "20" + suffix ), newFile )
# Adjust copy of "template"-file accordingly. # Adjust copy of "template"-file accordingly.
for line in fileinput.input( newFile, inplace=1, mode="rU" ): for line in fileinput.input( newFile, inplace=1, mode="r" ):
line = re.sub(r'20', '%TWENTY%', line.rstrip()) line = re.sub(r'20', '%TWENTY%', line.rstrip())
line = re.sub(r'11', '%ELEVEN%', line.rstrip()) line = re.sub(r'11', '%ELEVEN%', line.rstrip())
line = re.sub(r'10(?![0-9])', '%TEN%', line.rstrip()) line = re.sub(r'10(?![0-9])', '%TEN%', line.rstrip())
@@ -43,7 +43,7 @@ def create_more_container_files(sourceDir, suffix, maxElements, containers, cont
newFile = os.path.join( sourceDir, container, container + str(i+10) + "_c" + suffix ) newFile = os.path.join( sourceDir, container, container + str(i+10) + "_c" + suffix )
shutil.copyfile( os.path.join( sourceDir, container, container + "20_c" + suffix ), newFile ) shutil.copyfile( os.path.join( sourceDir, container, container + "20_c" + suffix ), newFile )
# Adjust copy of "template"-file accordingly. # Adjust copy of "template"-file accordingly.
for line in fileinput.input( newFile, inplace=1, mode="rU" ): for line in fileinput.input( newFile, inplace=1, mode="r" ):
line = re.sub(r'20', '%TWENTY%', line.rstrip()) line = re.sub(r'20', '%TWENTY%', line.rstrip())
line = re.sub(r'11', '%ELEVEN%', line.rstrip()) line = re.sub(r'11', '%ELEVEN%', line.rstrip())
line = re.sub(r'10(?![0-9])', '%TEN%', line.rstrip()) line = re.sub(r'10(?![0-9])', '%TEN%', line.rstrip())
@@ -73,7 +73,7 @@ def adjust_container_limits_for_variadic_sequences(headerDir, containers, maxEle
headerFile = os.path.join( headerDir, "limits", container + ".hpp" ) headerFile = os.path.join( headerDir, "limits", container + ".hpp" )
regexMatch = r'(define\s+BOOST_MPL_LIMIT_' + container.upper() + r'_SIZE\s+)[0-9]+' regexMatch = r'(define\s+BOOST_MPL_LIMIT_' + container.upper() + r'_SIZE\s+)[0-9]+'
regexReplace = r'\g<1>' + re.escape( str(maxElements) ) regexReplace = r'\g<1>' + re.escape( str(maxElements) )
for line in fileinput.input( headerFile, inplace=1, mode="rU" ): for line in fileinput.input( headerFile, inplace=1, mode="r" ):
line = re.sub(regexMatch, regexReplace, line.rstrip()) line = re.sub(regexMatch, regexReplace, line.rstrip())
print(line) print(line)
@@ -118,6 +118,11 @@ def to_existing_absolute_path(string):
def main(): def main():
"""The main function.""" """The main function."""
# Determine the currently running python executable.
python_executable = sys.executable
if python_executable == None or python_executable == "":
python_executable = python
# Find the current Boost source-directory in which this script is located. # Find the current Boost source-directory in which this script is located.
sourceDir = current_boost_dir() sourceDir = current_boost_dir()
if sourceDir == None: if sourceDir == None:
@@ -150,19 +155,19 @@ def main():
# Some verbose debug output. # Some verbose debug output.
if args.verbose: if args.verbose:
print "Arguments extracted from command-line:" print("Arguments extracted from command-line:")
print " verbose = ", args.verbose print(" verbose = ", args.verbose)
print " source directory = ", args.sourceDir print(" source directory = ", args.sourceDir)
print " num elements = ", args.numElements print(" num elements = ", args.numElements)
print " sequence type = ", args.seqType print(" sequence type = ", args.seqType)
print " want: vector = ", args.want_vector print(" want: vector = ", args.want_vector)
print " want: list = ", args.want_list print(" want: list = ", args.want_list)
print " want: set = ", args.want_set print(" want: set = ", args.want_set)
print " want: map = ", args.want_map print(" want: map = ", args.want_map)
# Verify that we received any source-directory. # Verify that we received any source-directory.
if args.sourceDir == None: if args.sourceDir == None:
print "You should specify a valid path to the Boost source-directory." print("You should specify a valid path to the Boost source-directory.")
sys.exit(0) sys.exit(0)
# The directories for header- and source files of Boost.MPL. # The directories for header- and source files of Boost.MPL.
@@ -177,13 +182,13 @@ def main():
sourceDir = os.path.join( args.sourceDir, "preprocessed" ) sourceDir = os.path.join( args.sourceDir, "preprocessed" )
if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ): if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ):
cmdlineParser.print_usage() cmdlineParser.print_usage()
print "error: Cannot find Boost.MPL header/source files in given Boost source-directory!" print("error: Cannot find Boost.MPL header/source files in given Boost source-directory!")
sys.exit(0) sys.exit(0)
# Some verbose debug output. # Some verbose debug output.
if args.verbose: if args.verbose:
print "Chosen header-directory: ", headerDir print("Chosen header-directory: ", headerDir)
print "Chosen source-directory: ", sourceDir print("Chosen source-directory: ", sourceDir)
# Create list of containers for which files shall be pre-processed. # Create list of containers for which files shall be pre-processed.
containers = [] containers = []
@@ -196,23 +201,23 @@ def main():
if args.want_map: if args.want_map:
containers.append('map') containers.append('map')
if containers == []: if containers == []:
print "Nothing to do." print("Nothing to do.")
print "(Why did you prevent generating pre-processed headers for all Boost.MPL container types?)" print("(Why did you prevent generating pre-processed headers for all Boost.MPL container types?)")
sys.exit(0) sys.exit(0)
# Possibly fix the header-comments of input-files needed for pre-processing. # Possibly fix the header-comments of input-files needed for pre-processing.
if args.verbose: if args.verbose:
print "Checking if prior to pre-processing some input-files need fixing." print("Checking if prior to pre-processing some input-files need fixing.")
needFixing = fixmpl.check_input_files(headerDir, sourceDir, containers, args.seqType, args.verbose) needFixing = fixmpl.check_input_files(headerDir, sourceDir, containers, args.seqType, args.verbose)
if needFixing: if needFixing:
if args.verbose: if args.verbose:
print "Fixing of some input-files prior to pre-processing is needed." print("Fixing of some input-files prior to pre-processing is needed.")
print "Will fix them now!" print("Will fix them now!")
fixmpl.fix_input_files(headerDir, sourceDir, containers, args.seqType, args.verbose) fixmpl.fix_input_files(headerDir, sourceDir, containers, args.seqType, args.verbose)
# Some verbose debug output. # Some verbose debug output.
if args.verbose: if args.verbose:
print "Containers for which to pre-process headers: ", containers print("Containers for which to pre-process headers: ", containers)
# Create (additional) input files for generating pre-processed headers of numbered sequence MPL containers. # Create (additional) input files for generating pre-processed headers of numbered sequence MPL containers.
if args.seqType == "both" or args.seqType == "numbered": if args.seqType == "both" or args.seqType == "numbered":
@@ -226,24 +231,24 @@ def main():
if args.seqType == "both" or args.seqType == "numbered": if args.seqType == "both" or args.seqType == "numbered":
if args.want_vector: if args.want_vector:
if args.verbose: if args.verbose:
print "Pre-process headers for Boost.MPL numbered vectors." print("Pre-process headers for Boost.MPL numbered vectors.")
os.system( "python " + os.path.join( sourceDir, "preprocess_vector.py" ) + " all " + args.sourceDir ) os.system( python_executable + " " + os.path.join( sourceDir, "preprocess_vector.py" ) + " all " + args.sourceDir )
if args.want_list: if args.want_list:
if args.verbose: if args.verbose:
print "Pre-process headers for Boost.MPL numbered lists." print("Pre-process headers for Boost.MPL numbered lists.")
os.system( "python " + os.path.join( sourceDir, "preprocess_list.py" ) + " all " + args.sourceDir ) os.system( python_executable + " " + os.path.join( sourceDir, "preprocess_list.py" ) + " all " + args.sourceDir )
if args.want_set: if args.want_set:
if args.verbose: if args.verbose:
print "Pre-process headers for Boost.MPL numbered sets." print("Pre-process headers for Boost.MPL numbered sets.")
os.system( "python " + os.path.join( sourceDir, "preprocess_set.py" ) + " all " + args.sourceDir ) os.system( python_executable + " " + os.path.join( sourceDir, "preprocess_set.py" ) + " all " + args.sourceDir )
if args.want_map: if args.want_map:
if args.verbose: if args.verbose:
print "Pre-process headers for Boost.MPL numbered maps." print("Pre-process headers for Boost.MPL numbered maps.")
os.system( "python " + os.path.join( sourceDir, "preprocess_map.py" ) + " all " + args.sourceDir ) os.system( python_executable + " " + os.path.join( sourceDir, "preprocess_map.py" ) + " all " + args.sourceDir )
if args.seqType == "both" or args.seqType == "variadic": if args.seqType == "both" or args.seqType == "variadic":
if args.verbose: if args.verbose:
print "Pre-process headers for Boost.MPL variadic containers." print("Pre-process headers for Boost.MPL variadic containers.")
os.system( "python " + os.path.join( sourceDir, "preprocess.py" ) + " all " + args.sourceDir ) os.system( python_executable + " " + os.path.join( sourceDir, "preprocess.py" ) + " all " + args.sourceDir )
if __name__ == '__main__': if __name__ == '__main__':
+19 -19
View File
@@ -21,7 +21,7 @@ def check_header_comment(filename):
# Check input file. # Check input file.
name = os.path.basename( filename ) name = os.path.basename( filename )
# Read content of input file. # Read content of input file.
sourcefile = open( filename, "rU" ) sourcefile = open( filename, "r" )
content = sourcefile.read() content = sourcefile.read()
sourcefile.close() sourcefile.close()
# Search content for '$Id$'. # Search content for '$Id$'.
@@ -66,26 +66,26 @@ def check_input_files(headerDir, sourceDir, containers=['vector', 'list', 'set',
result1 = False result1 = False
if seqType == "both" or seqType == "variadic": if seqType == "both" or seqType == "variadic":
if verbose: if verbose:
print "Check if input files for pre-processing Boost.MPL variadic containers need fixing." print("Check if input files for pre-processing Boost.MPL variadic containers need fixing.")
result1 = check_input_files_for_variadic_seq(headerDir, sourceDir) result1 = check_input_files_for_variadic_seq(headerDir, sourceDir)
if verbose: if verbose:
if result1: if result1:
print " At least one input file needs fixing!" print(" At least one input file needs fixing!")
else: else:
print " No input file needs fixing!" print(" No input file needs fixing!")
# Check the input files for containers in their numbered form. # Check the input files for containers in their numbered form.
result2 = False result2 = False
result3 = False result3 = False
if seqType == "both" or seqType == "numbered": if seqType == "both" or seqType == "numbered":
if verbose: if verbose:
print "Check input files for pre-processing Boost.MPL numbered containers." print("Check input files for pre-processing Boost.MPL numbered containers.")
result2 = check_input_files_for_numbered_seq(headerDir, ".hpp", containers) result2 = check_input_files_for_numbered_seq(headerDir, ".hpp", containers)
result3 = check_input_files_for_numbered_seq(sourceDir, ".cpp", containers) result3 = check_input_files_for_numbered_seq(sourceDir, ".cpp", containers)
if verbose: if verbose:
if result2 or result3: if result2 or result3:
print " At least one input file needs fixing!" print(" At least one input file needs fixing!")
else: else:
print " No input file needs fixing!" print(" No input file needs fixing!")
# Return result. # Return result.
return result1 or result2 or result3 return result1 or result2 or result3
@@ -93,7 +93,7 @@ def fix_header_comment(filename, timestamp):
"""Fixes the header-comment of the given file.""" """Fixes the header-comment of the given file."""
# Fix input file. # Fix input file.
name = os.path.basename( filename ) name = os.path.basename( filename )
for line in fileinput.input( filename, inplace=1, mode="rU" ): for line in fileinput.input( filename, inplace=1, mode="r" ):
# If header-comment already contains anything for '$Id$', remove it. # If header-comment already contains anything for '$Id$', remove it.
line = re.sub(r'\$Id:[^$]+\$', r'$Id$', line.rstrip()) line = re.sub(r'\$Id:[^$]+\$', r'$Id$', line.rstrip())
# Replace '$Id$' by a string containing the file's name (and a timestamp)! # Replace '$Id$' by a string containing the file's name (and a timestamp)!
@@ -128,12 +128,12 @@ def fix_input_files(headerDir, sourceDir, containers=['vector', 'list', 'set', '
# Fix the input files for containers in their variadic form. # Fix the input files for containers in their variadic form.
if seqType == "both" or seqType == "variadic": if seqType == "both" or seqType == "variadic":
if verbose: if verbose:
print "Fix input files for pre-processing Boost.MPL variadic containers." print("Fix input files for pre-processing Boost.MPL variadic containers.")
fix_input_files_for_variadic_seq(headerDir, sourceDir, timestamp) fix_input_files_for_variadic_seq(headerDir, sourceDir, timestamp)
# Fix the input files for containers in their numbered form. # Fix the input files for containers in their numbered form.
if seqType == "both" or seqType == "numbered": if seqType == "both" or seqType == "numbered":
if verbose: if verbose:
print "Fix input files for pre-processing Boost.MPL numbered containers." print("Fix input files for pre-processing Boost.MPL numbered containers.")
fix_input_files_for_numbered_seq(headerDir, ".hpp", timestamp, containers) fix_input_files_for_numbered_seq(headerDir, ".hpp", timestamp, containers)
fix_input_files_for_numbered_seq(sourceDir, ".cpp", timestamp, containers) fix_input_files_for_numbered_seq(sourceDir, ".cpp", timestamp, containers)
@@ -164,10 +164,10 @@ def main():
# Some verbose debug output. # Some verbose debug output.
if args.verbose: if args.verbose:
print "Arguments extracted from command-line:" print("Arguments extracted from command-line:")
print " verbose = ", args.verbose print(" verbose = ", args.verbose)
print " check-only = ", args.checkonly print(" check-only = ", args.checkonly)
print " source directory = ", args.sourceDir print(" source directory = ", args.sourceDir)
# The directories for header- and source files of Boost.MPL. # The directories for header- and source files of Boost.MPL.
# NOTE: Assuming 'args.sourceDir' is the source-directory of the entire boost project. # NOTE: Assuming 'args.sourceDir' is the source-directory of the entire boost project.
@@ -181,21 +181,21 @@ def main():
sourceDir = os.path.join( args.sourceDir, "preprocessed" ) sourceDir = os.path.join( args.sourceDir, "preprocessed" )
if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ): if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ):
cmdlineParser.print_usage() cmdlineParser.print_usage()
print "error: Cannot find Boost.MPL header/source files in given Boost source-directory!" print("error: Cannot find Boost.MPL header/source files in given Boost source-directory!")
sys.exit(0) sys.exit(0)
# Some verbose debug output. # Some verbose debug output.
if args.verbose: if args.verbose:
print "Chosen header-directory: ", headerDir print("Chosen header-directory: ", headerDir)
print "Chosen source-directory: ", sourceDir print("Chosen source-directory: ", sourceDir)
if args.checkonly: if args.checkonly:
# Check input files for generating pre-processed headers. # Check input files for generating pre-processed headers.
result = check_input_files(headerDir, sourceDir, verbose = args.verbose) result = check_input_files(headerDir, sourceDir, verbose = args.verbose)
if result: if result:
print "Fixing the input-files used for pre-processing of Boost.MPL headers IS required." print("Fixing the input-files used for pre-processing of Boost.MPL headers IS required.")
else: else:
print "Fixing the input-files used for pre-processing of Boost.MPL headers is NOT required." print("Fixing the input-files used for pre-processing of Boost.MPL headers is NOT required.")
else: else:
# Fix input files for generating pre-processed headers. # Fix input files for generating pre-processed headers.
fix_input_files(headerDir, sourceDir, verbose = args.verbose) fix_input_files(headerDir, sourceDir, verbose = args.verbose)
+12 -13
View File
@@ -12,6 +12,7 @@
# $Revision$ # $Revision$
import fileinput import fileinput
import functools
import os import os
import re import re
import string import string
@@ -22,22 +23,21 @@ max_len = 79
ident = 4 ident = 4
def nearest_ident_pos(text): def nearest_ident_pos(text):
return (len(text)/ident) * ident return int((len(text)/ident) * ident)
def block_format(limits, text, first_sep=' ', sep=',', need_last_ident=1 ): def block_format(limits, text, first_sep=' ', sep=',', need_last_ident=1 ):
if sep == ',' and string.find( text, '<' ) != -1: if sep == ',' and str.find( text, '<' ) != -1:
sep = '%s ' % sep sep = '%s ' % sep
words = string.split( words = str.split(
string.join( string.split( text ), ' ' ) ' '.join( str.split( text ) )
, sep , sep
) )
s = ' ' * limits[0] s = ' ' * limits[0]
max_len = limits[1] max_len = limits[1]
return '%s\n%s' \ return '%s\n%s' \
% ( % (
reduce( functools.reduce(
lambda t,w,max_len=max_len,s=s,sep=sep: lambda t,w,max_len=max_len,s=s,sep=sep:
if_else(t[1] + len(w) < max_len if_else(t[1] + len(w) < max_len
, ('%s%s%s'% (t[0],t[2],w), t[1]+len(w)+len(t[2]), sep) , ('%s%s%s'% (t[0],t[2],w), t[1]+len(w)+len(t[2]), sep)
@@ -52,7 +52,6 @@ def block_format(limits, text, first_sep=' ', sep=',', need_last_ident=1 ):
def handle_args( match ): def handle_args( match ):
if re.compile('^\s*(typedef|struct|static)\s+.*?$').match(match.group(0)): if re.compile('^\s*(typedef|struct|static)\s+.*?$').match(match.group(0)):
return match.group(0) return match.group(0)
return '%s'\ return '%s'\
% block_format( % block_format(
(nearest_ident_pos(match.group(1)),max_len) (nearest_ident_pos(match.group(1)),max_len)
@@ -86,7 +85,7 @@ def handle_inline_args(match):
(nearest_ident_pos(match.group(1))+ident,max_len-len(match.group(9))) (nearest_ident_pos(match.group(1))+ident,max_len-len(match.group(9)))
, match.group(4) , match.group(4)
) )
, string.replace(match.group(1),',',' ') , str.replace(match.group(1),',',' ')
, match.group(9) , match.group(9)
) )
@@ -98,18 +97,18 @@ def handle_simple_list(match):
return if_else(single_arg,'%s<%s>','%s< %s >') %\ return if_else(single_arg,'%s<%s>','%s< %s >') %\
( (
match.group(1) match.group(1)
, string.join(string.split(match.group(2)), '') , ''.join(str.split(match.group(2)))
) )
def handle_static(match): def handle_static(match):
if len(match.group(0)) < max_len: if len(match.group(0)) < max_len:
return match.group(0) return match.group(0)
(first_sep,sep) = if_else(string.find(match.group(0),'+') == -1, (' ',' '),(' ','+')) (first_sep,sep) = if_else(str.find(match.group(0),'+') == -1, (' ',' '),(' ','+'))
return '%s%s\n%s%s' %\ return '%s%s\n%s%s' %\
( (
match.group(1) match.group(1)
, string.join(string.split(match.group(2)), ' ') , ' '.join(str.split(match.group(2)))
, block_format( , block_format(
(nearest_ident_pos(match.group(1))+ident,max_len) (nearest_ident_pos(match.group(1))+ident,max_len)
, match.group(4) , match.group(4)
@@ -120,7 +119,7 @@ def handle_static(match):
) )
def handle_typedefs(match): def handle_typedefs(match):
if string.count(match.group(2), ';') == 1: if str.count(match.group(2), ';') == 1:
return match.group(0) return match.group(0)
join_sep = ';\n%s' % match.group(1) join_sep = ';\n%s' % match.group(1)
@@ -128,7 +127,7 @@ def handle_typedefs(match):
return '%s%s\n' \ return '%s%s\n' \
% ( % (
match.group(1) match.group(1)
, string.join(map(string.strip, string.split(match.group(2), ';')), join_sep) , join_sep.join(list(map(str.strip, str.split(match.group(2), ';'))))
) )
def fix_angle_brackets( match ): def fix_angle_brackets( match ):
+4 -4
View File
@@ -57,10 +57,10 @@ def process_all( root, boost_root, dst_dir, mode ):
def main( all_modes, src_dir, dst_dir ): def main( all_modes, src_dir, dst_dir ):
if len( sys.argv ) < 2: if len( sys.argv ) < 2:
print "\nUsage:\n\t %s <mode> <boost_root> [<source_file>]" % os.path.basename( sys.argv[0] ) print("\nUsage:\n\t %s <mode> <boost_root> [<source_file>]" % os.path.basename( sys.argv[0] ))
print "\nPurpose:\n\t updates preprocessed version(s) of the header(s) in \"%s\" directory" % dst_dir print("\nPurpose:\n\t updates preprocessed version(s) of the header(s) in \"%s\" directory" % dst_dir)
print "\nExample:\n\t the following command will re-generate and update all 'apply.hpp' headers:" print("\nExample:\n\t the following command will re-generate and update all 'apply.hpp' headers:")
print "\n\t\t %s all f:\\cvs\\boost apply.cpp" % os.path.basename( sys.argv[0] ) print("\n\t\t %s all f:\\cvs\\boost apply.cpp" % os.path.basename( sys.argv[0] ))
sys.exit( -1 ) sys.exit( -1 )
if sys.argv[1] == "all": if sys.argv[1] == "all":