Compare commits

...

80 Commits

Author SHA1 Message Date
13de873d87 Work around Boost removing modular include dirs for release. 2019-03-08 18:42:27 -06:00
2e65c250f5 Update copyright date. 2019-01-21 22:33:23 -06:00
a2608f26a3 Rework ARM detection to favor versioned predefs.
This reworks the order in which the compiler predefs are checked to use
the ones that provide version info. Also add the arch predefs for older
compilers that don't define the predefs with version info for arm4,
arm5, arm6, and arm7.

Continuation of #94
2019-01-21 22:13:42 -06:00
7e31244f01 Fix bad include of sub-BSD os headers from main BSD header.
Fixes #85
2019-01-14 00:21:46 -06:00
6fea8a4b90 Fix NetBSD def name. 2019-01-13 11:56:08 -06:00
fee815d6d7 Missed release note for iOS platform type fix. 2019-01-13 09:00:06 -06:00
2e35ba95c8 Fixes use of deprecated TARGET_IPHONE_SIMULATOR.
The TARGET_IPHONE_SIMULATOR predef was deprecated in favor of
TARGET_OS_SIMULATOR. We now use both predefs to detect device vs.
simulator.

Fixes #83
2019-01-13 08:53:22 -06:00
cb4f8140f1 Add history note for B2 standalone project. 2019-01-11 22:05:53 -06:00
f2de8d8211 Another tweak for standalone and symetric build. 2019-01-11 21:36:07 -06:00
a340a52605 Add PLAT_ANDROID and deprecate OS_ANDROID.
Fixes #41 #81
2019-01-10 13:27:41 -06:00
48d9231a1b Convert build files to rootless parity with hash-predef. 2019-01-09 16:27:04 -06:00
eb682657a2 Add detection of ARM from __aarch64__ predef.
Fixes #94
2019-01-07 16:28:30 -06:00
c53294180d Refresh from Hash. 2019-01-07 08:33:58 -06:00
9ead140e5b Minor tweaks to cmake support to make hash-boost conversion easier. 2019-01-07 08:18:59 -06:00
d33798214d Cleanups of cmake build use support. 2019-01-03 21:57:47 -06:00
f862009841 [CMake] Generate cmake target that other libraries can use (#86)
Generates cmake target that other libraries can use to express
their dependency on this library and retrieve any configuration
information such as the include directory.
2019-01-02 07:26:48 -06:00
d58fcca2d5 os/linux: add more linux detection defines. (#91)
Some releases of g++, on some platforms, whilst running under some
standards, may not define neither linux, nor __linux. Add detections
for __linux__ and __gnu_linux__ for robustness.
2018-11-26 08:15:55 -06:00
aa94d69718 Add history note for Cygwin OS predef. 2018-11-06 09:35:15 -06:00
62a50d3892 Add version information to os/cygwin detection (#88) 2018-11-06 08:56:11 -06:00
32d4581c16 Deprecation message for detail endian headers. 2018-09-03 15:42:43 -05:00
92881c4c7a Bump version for next release. 2018-09-02 14:30:00 -05:00
07df9dd360 Always define BOOST_COMP_NVCC instead of BOOST_COMP_NVCC_EMULATED (#84)
Currently BOOST_COMP_NVCC is never set but always BOOST_COMP_NVCC_EMULATED
because the NVCC preprocessor emulates the host compiler being used
(gcc/clang/msvc/...) which are detected earlier.

The nvcc compilation process is somewhat special as can be read here:
https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#cuda-compilation-trajectory
The nvcc compiler precompiles the input two times. Once for the device code
being compiled by the cicc device compiler and once for the host code
compiled by the real host compiler. NVCC uses gcc/clang/msvc/...
depending on the host compiler being set on the command line.

Predef (as a preprocessor only lib) detects the one doing the preprocessing
as compiler and expects it to be the one doing the real compilation.
This is not true for NVCC which is only doing the preprocessing and which
is using another compiler for parts of its work. So for NVCC it should be
allowed to set BOOST_COMP_NVCC additionally to the already detected host
compiler because both is true: It is gcc/clang/... compiling the code, but it
is also NVCC doing th preprocessing and adding some other quirks you may
want to detect.

This behavior is similar to what boost config is doing in `select_compiler_config.hpp`.
There the NVCC detection is not handled as a real compiler (part of the
#if-#elif) but as additional option before the real compiler.
2018-08-30 14:41:44 -05:00
d8f410b4d0 Live patch project during CI testing. 2018-08-26 10:32:47 -05:00
759400b413 Rebase from hash-predef source. 2018-08-25 23:36:20 -05:00
560ff5298e Bump version, add history. 2018-06-23 21:37:05 -05:00
75b04d80e7 Avoid local project-config in git. 2018-06-23 17:28:51 -05:00
bb82002af6 Merge branch 'develop' 2018-06-23 16:34:17 -05:00
5d8818ddcb architecture: add support for __ARM_ARCH macro (#74)
gcc-6 defines __ARM_ARCH
2018-06-12 07:40:29 -05:00
11569d270c add detection for PTX architecture (#73) 2018-06-12 07:39:43 -05:00
c8c0134926 Don't test Appveyor PR branch. (#79)
Another PR test.
2018-05-16 07:19:08 -05:00
c37ef8b959 Remove clang-6, as PR test. (#78) 2018-05-15 09:36:27 -05:00
aba0bb4470 Need full recursive rmdir as it might not be empty. 2018-05-14 23:21:10 -05:00
02d09e78b6 Fix typo on ci script call. 2018-05-14 23:12:18 -05:00
7c0c1f2cb0 Don't do git command on lib dir, and add latest clangs. 2018-05-14 23:07:07 -05:00
d7bad38b5d Make the lib test generic to main or PRs. 2018-05-14 22:59:34 -05:00
9e73c55298 Switch to local CI scripts to make progress on CI errors. 2018-05-13 22:59:56 -05:00
7a4ca9dc90 add nvcc compiler detection (#72) 2018-05-13 10:22:00 -05:00
e8681a9b37 Add support for detecting CUDA (#71)
* add support for detecting CUDA
* add test for new make macro
2018-05-13 10:21:13 -05:00
9e31c6455c Remove undefined BOOST_ARCH_AMD64 (#75)
Remove reference to BOOST_ARCH_AMD64 as it has not been defined since commit b10e3490e.
2018-05-13 10:19:21 -05:00
0bccaa9ead issue-76: fix syntax error in jamfile (#77) 2018-05-13 10:17:57 -05:00
c8c26821b9 Merge remote-tracking branch 'origin/develop' 2017-11-10 09:01:39 -06:00
5e8f5d5a4b properly obtain the FreeBSD version (BOOST_OS_BSD_FREE) (#69) 2017-11-10 07:04:25 -06:00
74f88005cc rename library/c/cloudlibc.h to library/c/cloudabi.h (#68)
fix typo in cloudlibc detection
2017-11-09 22:48:35 -06:00
4a230ebe85 add detection for OpenBSD 5.x and 6.x (#67)
This fixes #66
2017-11-08 23:01:35 -06:00
e62a9c68b1 Merge remote-tracking branch 'origin/develop' 2017-10-25 13:44:21 -05:00
e31d12f25d Fix typo in header guard. 2017-10-25 12:32:20 -05:00
2bba31c5f4 Merge remote-tracking branch 'origin/develop' 2017-10-24 07:30:44 -05:00
e87cef64fe History note for CloudABI/LIB addition. 2017-10-23 17:07:20 -05:00
6f8a9ae440 platform detection for CloudABI with cloudlibc detection (#65) 2017-10-23 13:54:01 -05:00
a7cdea8faf Merge branch 'develop' of https://github.com/boostorg/predef into
develop

Conflicts:
	include/boost/predef/platform/windows_runtime.h
	include/boost/predef/platform/windows_uwp.h
2017-10-23 09:34:04 -05:00
1c0b55c2f9 Some tweak for 1.7 release.
* Bump version to 1.7
* Tweak docs for UWP detection.
* Add 1.7 history items.
2017-10-23 09:25:43 -05:00
0ab200d19e make BOOST_PLAT_WINDOWS_DESKTOP available in older SDKs for backwards compatibility (#64) 2017-10-18 07:00:02 -05:00
7c17b932e4 detect mingw32 and mingw64 as separate entities (#61) 2017-10-16 18:41:33 -05:00
de79c6d341 fix typo s/BOOST_ARCH_PARISK/BOOST_ARCH_PARISC (#63) 2017-10-11 08:16:56 -05:00
7c99dfbbd5 Revert "isolate all headers to ensure that none rely on inclusions from another (#60)" (#62)
This reverts commit 284cde95a2.
2017-10-04 14:13:28 -05:00
284cde95a2 isolate all headers to ensure that none rely on inclusions from another (#60) 2017-10-04 10:20:45 -05:00
bca18299d2 correct Windows UWP platform detection (#57) 2017-10-03 20:36:17 -05:00
aa4604a3bd Remove executable attribute from file. (#53) 2017-09-17 09:21:38 -05:00
ba45bd73f3 Seems we need to avoid duplicate project names. 2017-08-01 12:24:55 -05:00
ada62932d0 Merge remote-tracking branch 'origin/develop' 2017-06-27 21:21:56 -05:00
6a24a3a4bb Changes for version 1.6. 2017-06-05 09:14:37 -05:00
9afb15401b Handle Intel version 9999 == 12.1.0 (fixes #38). 2017-06-05 09:09:13 -05:00
0d9d5591da Merge branch 'develop' of https://github.com/boostorg/predef.git into develop 2017-06-01 22:31:30 -05:00
db499c07df Add WORKAROUND style definitions for public use. 2017-06-01 22:31:09 -05:00
9f6191e0bc Merge pull request #50 from gongminmin/develop
Adds support for MSVC ARM64 target.
2017-06-01 07:03:32 -05:00
4c822c49c2 Adds support for MSVC ARM64 target. 2017-06-01 00:08:56 -07:00
f109e20ad1 Fix missing non-detection test for new iOS platform. 2017-05-28 23:31:06 -05:00
d81ab5cc34 Merge pull request #49 from ruslo/pr.ios
Detect iOS simulator/device
2017-05-28 21:20:00 -05:00
cda33c33d9 Try mingw testing again. 2017-05-28 16:39:29 -05:00
6dfdf9d4dd Add testing with language flags. 2017-05-28 15:53:55 -05:00
5e76979e05 No MinGW for now, as it fails for some unknown reason. 2017-05-28 13:59:25 -05:00
541ec7edef MinGW64 5.x doesn't seem to actually exist in Appveyor. 2017-05-27 18:42:14 -05:00
87c4de2da2 Lets try MinGW builds. 2017-05-27 14:35:24 -05:00
693e973635 Never mind.. Travis empty job bug is not fixed. 2017-05-27 10:09:23 -05:00
77c66456dc Remove caching. Free limits are too low for Boost. 2017-05-27 10:01:09 -05:00
43758299bc Remove no longer needed empty job workaround. 2017-05-27 09:50:52 -05:00
ec6c26ef68 Detect iOS simulator/device 2017-05-22 12:28:47 +03:00
0f86c9b95e Add latest toolsets for CI testing. 2017-05-21 22:57:26 -05:00
523e866076 Merge remote-tracking branch 'origin/develop' 2017-05-21 21:43:36 -05:00
0bb6e754cb Fix header guard to correct type of predef.
Addresses PR #48 from @ruslo (Ruslan Baratov) but with shorter "PLAT" to
match the other platform headers.
2017-05-21 16:37:34 -05:00
63 changed files with 3167 additions and 154 deletions

7
.gitignore vendored
View File

@ -1,2 +1,5 @@
/bin
/boost-build.jam
bin
boost-build.jam
project-config.jam
*.pyc
.vscode/settings.json

View File

@ -5,7 +5,13 @@
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.python.pydev.PyDevBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.python.pydev.pythonNature</nature>
</natures>
</projectDescription>

5
.pydevproject Normal file
View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?eclipse-pydev version="1.0"?><pydev_project>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python interpreter</pydev_property>
</pydev_project>

View File

@ -2,7 +2,7 @@
# 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)
#
# Copyright Rene Rivera 2015-2016.
# Copyright Rene Rivera 2015-2018.
# Setting up notifications like this is optional as the default behavior
# of Travis is to notify the commiter of problems. But setting a specific
@ -13,13 +13,6 @@ notifications:
recipients:
- grafikrobot@gmail.com
# For now the CI scripts only support the two main branches available
# on the boost super-project.
branches:
only:
- master
- develop
# We specify a generic language instead of C++ as Travis sets up
# additional environment vars that point to its default toolset
# instead of the one we install. The extra env doesn't interfere,
@ -28,7 +21,7 @@ branches:
language: generic
# Speficy the default as Linux here, to avoid duplication in the matrix
# below. We use Trausty as that's the latest we can use. And it's better
# below. We use Trusty as that's the latest we can use. And it's better
# supported by the whole range of C++ toolsets we like to test on.
dist: trusty
os: linux
@ -55,17 +48,48 @@ matrix:
exclude:
- env: TRAVIS_EMPTY_JOB_WORKAROUND=true
include:
# Check CMake project use support.
- env: TEST_CMAKE
# Skip all the unneeded steps from the normal unit test jobs
install: true
before_script: true
before_cache: true
before_cache: true
after_success: true
after_failure: true
after_script: true
# Build CMake simple test project that uses Predef.
script:
- mkdir __build__ && cd __build__
- cmake ../test/test_cmake
- cmake --build .
- env: TOOLSET=clang-3.4
- env: TOOLSET=clang-3.5
- env: TOOLSET=clang-3.6
- env: TOOLSET=clang-3.7
- env: TOOLSET=clang-3.8
- env: TOOLSET=clang-3.9
- env: TOOLSET=clang-4.0
- env: TOOLSET=clang-5.0
- env: TOOLSET=gcc-4.7
- env: TOOLSET=gcc-4.8
- env: TOOLSET=gcc-4.9
- env: TOOLSET=gcc-5
- env: TOOLSET=gcc-6
- env: TOOLSET=gcc-7
- env: TOOLSET=gcc-8
- env: TOOLSET=gcc-8 CXXFLAGS=-std=c++03
- env: TOOLSET=gcc-8 CXXFLAGS=-std=c++11
- env: TOOLSET=gcc-8 CXXFLAGS=-std=c++14
- env: TOOLSET=gcc-8 CXXFLAGS=-std=c++17
- env: TOOLSET=gcc-8 CXXFLAGS=-std=c++2a
- env: TOOLSET=gcc-8 CXXFLAGS=-std=gnu++03
- env: TOOLSET=gcc-8 CXXFLAGS=-std=gnu++11
- env: TOOLSET=gcc-8 CXXFLAGS=-std=gnu++14
- env: TOOLSET=gcc-8 CXXFLAGS=-std=gnu++17
- env: TOOLSET=gcc-8 CXXFLAGS=-std=gnu++2a
- env: TOOLSET=xcode-6.1
os: osx
- env: TOOLSET=xcode-6.4
@ -74,25 +98,32 @@ matrix:
- env: TOOLSET=xcode-7.3
os: osx
osx_image: xcode7.3
- env: TOOLSET=xcode-8.0
- env: TOOLSET=xcode-8.3
os: osx
osx_image: xcode8
osx_image: xcode8.3
- env: TOOLSET=xcode-9.4 CXXFLAGS=-std=c++03
os: osx
osx_image: xcode9.4
- env: TOOLSET=xcode-9.4 CXXFLAGS=-std=c++11
os: osx
osx_image: xcode9.4
- env: TOOLSET=xcode-9.4 CXXFLAGS=-std=c++14
os: osx
osx_image: xcode9.4
- env: TOOLSET=xcode-9.4 CXXFLAGS=-std=c++17
os: osx
osx_image: xcode9.4
- env: TOOLSET=xcode-9.4 CXXFLAGS=-std=c++2a
os: osx
osx_image: xcode9.4
- env: TOOLSET=xcode-10.0
os: osx
osx_image: xcode10.0
# These are the standard steps to bootstrap the Boost CI scripts
# and to forward the actions to the scripts.
before_install:
# Fetch the scripts to do the actual building/testing.
- |
wget "https://raw.githubusercontent.com/boostorg/regression/develop/ci/src/ci_boost_common.py" -P ..
wget "https://raw.githubusercontent.com/boostorg/regression/develop/ci/src/ci_boost_library_test.py" -P ..
install: python "${TRAVIS_BUILD_DIR}/../ci_boost_library_test.py" install
before_script: python "${TRAVIS_BUILD_DIR}/../ci_boost_library_test.py" before_script
script: python "${TRAVIS_BUILD_DIR}/../ci_boost_library_test.py" script
before_cache: python "${TRAVIS_BUILD_DIR}/../ci_boost_library_test.py" before_cache
after_success: python "${TRAVIS_BUILD_DIR}/../ci_boost_library_test.py" after_success
after_failure: python "${TRAVIS_BUILD_DIR}/../ci_boost_library_test.py" after_failure
after_script: python "${TRAVIS_BUILD_DIR}/../ci_boost_library_test.py" after_script
cache:
directories:
- $HOME/boostorg/boost
install: python "${TRAVIS_BUILD_DIR}/tools/ci/library_test.py" install
before_script: python "${TRAVIS_BUILD_DIR}/tools/ci/library_test.py" before_script
script: python "${TRAVIS_BUILD_DIR}/tools/ci/library_test.py" script
before_cache: python "${TRAVIS_BUILD_DIR}/tools/ci/library_test.py" before_cache
after_success: python "${TRAVIS_BUILD_DIR}/tools/ci/library_test.py" after_success
after_failure: python "${TRAVIS_BUILD_DIR}/tools/ci/library_test.py" after_failure
after_script: python "${TRAVIS_BUILD_DIR}/tools/ci/library_test.py" after_script

38
CMakeLists.txt Normal file
View File

@ -0,0 +1,38 @@
# Copyright Mike Dev 2018
# Copyright Rene Rivera 2018
# 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
# NOTE:
# CMake support for Boost.Predef is currently experimental at best and the
# interface is likely to change in the future
#
# This file provides minimal cmake support (no unit-tests,
# no installation) for integration into a "host" cmake project
# via the "add_subdirectory( <path-to-boost-predef> )" command.
#
# Other cmake targets can then use the public target name
# "Boost::predef" in order to express their dependency
# on this library. I.e:
#
# target_link_libraries( <my-exe/lib> PUBLIC Boost::predef )
# Only need the basic minimum of project, add_library, and
# target_include_directories commands.
cmake_minimum_required( VERSION 3.0 )
# Don't set VERSION, as that's a pita to keep up to date with the version
# header. And don't set LANGUAGES as we are multi-language and header
# only, so it's irrelevant.
project( BoostPredef )
# Simple INTERFACE, and header only, library target.
add_library( boost_predef INTERFACE )
# The only usage requirement is include dir for consumers.
target_include_directories( boost_predef INTERFACE include )
# Add an alias to be compatible with consumers that may have used the
# FindBoost script.
add_library( Boost::predef ALIAS boost_predef )

View File

@ -27,18 +27,104 @@ environment:
matrix:
- TOOLSET: vs-2008
platform: 32
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: vs-2010
platform: 32
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: vs-2012
platform: 32
- TOOLSET: vs-2012
COMMENT: UWP DESKTOP
CXXFLAGS: /D_WIN32_WINNT=0x0602 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
platform: 32
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: vs-2012
COMMENT: UWP STORE
CXXFLAGS: /D_WIN32_WINNT=0x0602 /DWINAPI_FAMILY=WINAPI_FAMILY_APP
platform: 32
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: vs-2013
platform: 32
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: vs-2013
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: vs-2013
COMMENT: UWP DESKTOP
CXXFLAGS: /D_WIN32_WINNT=0x0603 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: vs-2013
COMMENT: UWP PHONE
CXXFLAGS: /D_WIN32_WINNT=0x0603 /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: vs-2013
COMMENT: UWP STORE
CXXFLAGS: /D_WIN32_WINNT=0x0603 /DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: vs-2015
platform: 32
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: vs-2015
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: vs-2017
platform: 32
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: vs-2017
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: vs-2017
CXXFLAGS: /std:c++14
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: vs-2017
CXXFLAGS: /std:c++latest
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: vs-2017
COMMENT: UWP DESKTOP
CXXFLAGS: /D_WIN32_WINNT=0x0A00 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: vs-2017
COMMENT: UWP PHONE
CXXFLAGS: /D_WIN32_WINNT=0x0A00 /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: vs-2017
COMMENT: UWP STORE
CXXFLAGS: /D_WIN32_WINNT=0x0A00 /DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: vs-2017
COMMENT: UWP SERVER
CXXFLAGS: /D_WIN32_WINNT=0x0A00 /DWINAPI_FAMILY=WINAPI_FAMILY_SERVER
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: vs-2017
COMMENT: UWP SYSTEM
CXXFLAGS: /D_WIN32_WINNT=0x0A00 /DWINAPI_FAMILY=WINAPI_FAMILY_SYSTEM
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: mingw-5
platform: 32
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: mingw64-6
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: mingw64-6
COMMENT: UWP DESKTOP
CXXFLAGS: -D_WIN32_WINNT=0x0602 -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: mingw64-6
COMMENT: UWP STORE
CXXFLAGS: -D_WIN32_WINNT=0x0602 -DWINAPI_FAMILY=WINAPI_FAMILY_APP
platform: 64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
# We can also set up configurations for testing which map to
# the b2 build variants.
@ -46,27 +132,18 @@ configuration:
- debug
- release
# These are the standard steps to bootstrap the Boost CI scripts
# and to forward the actions to the scripts.
init:
# Fetch the scripts to do the actual building/testing.
- cd %APPVEYOR_BUILD_FOLDER%/..
- appveyor DownloadFile "https://raw.githubusercontent.com/boostorg/regression/develop/ci/src/ci_boost_common.py"
- appveyor DownloadFile "https://raw.githubusercontent.com/boostorg/regression/develop/ci/src/ci_boost_library_test.py"
- cd %APPVEYOR_BUILD_FOLDER%
install: python ../ci_boost_library_test.py install
before_build: python ../ci_boost_library_test.py before_build
build_script: python ../ci_boost_library_test.py build_script
after_build: python ../ci_boost_library_test.py after_build
before_test: python ../ci_boost_library_test.py before_test
test_script: python ../ci_boost_library_test.py test_script
after_test: python ../ci_boost_library_test.py after_test
on_success: python ../ci_boost_library_test.py on_success
on_failure: python ../ci_boost_library_test.py on_failure
on_finish: python ../ci_boost_library_test.py on_finish
# No need to test PR branch as the PR itself is already tested.
skip_branch_with_pr: true
# We cache the boost repo, which is cleaned before caching.
# This saves some time as cloning the git submodules fresh
# takes a few minutes on Windows.
cache:
- C:\projects\boostorg\boost -> appveyor.yml
init:
- cd %APPVEYOR_BUILD_FOLDER%
install: python tools/ci/library_test.py install
before_build: python tools/ci/library_test.py before_build
build_script: python tools/ci/library_test.py build_script
after_build: python tools/ci/library_test.py after_build
before_test: python tools/ci/library_test.py before_test
test_script: python tools/ci/library_test.py test_script
after_test: python tools/ci/library_test.py after_test
on_success: python tools/ci/library_test.py on_success
on_failure: python tools/ci/library_test.py on_failure
on_finish: python tools/ci/library_test.py on_finish

View File

@ -1,6 +1,43 @@
# Copyright Rene Rivera 2014
# Copyright Rene Rivera 2014-2019
# 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)
#|
This B2 project provides support for using the Predef library externally as
a standalone project or by embedding in your B2 project tree. To use
externally you would need a `use-project` declaration and to use the
project as a dependency where needed:
----
use-project /hash-predef : /path/to/hash-predef/root ;
exe my_thing : main.cpp : <dependency>/hash-predef ;
----
To use in your project tree you would only need to place the Predef tree
in a subdirectory and reference the project location as a dependency where
needed.
----
exe my_thin : main.cpp : <dependency>libs/hash-predef ;
----
|#
import project ;
path-constant BOOST_PREDEF_ROOT : . ;
path-constant BOOST_PREDEF_INCLUDE : include ;
constant PREDEF_DIST : boost ;
project /boost/predef
: usage-requirements
<include>$(BOOST_PREDEF_INCLUDE) ;
if [ project.is-jamroot-module $(__name__) ]
{
local attributes = [ project.attributes $(__name__) ] ;
$(attributes).set "build-dir" : bin ;
}
alias libs ;

View File

@ -7,6 +7,46 @@ http://www.boost.org/LICENSE_1_0.txt)
[section History]
[heading 1.10]
* Fix bad include of sub-BSD os headers from main BSD header.
* Fix use of deprecated `TARGET_IPHONE_SIMULATOR` instead of newer
`TARGET_OS_SIMULATOR`.
* Add `BOOST_PLAT_ANDROID` to resolve conflict between Linux and Android
OS predefs. The `BOOST_OS_ANDROID` predef is now deprecated and will be
removed in a future release.
* Add support for consuming Predef as a CMake project.
* Add support for consuming Predef as a standalone B2 project.
[heading 1.9]
* Fixes for `BOOST_COMP_NVCC*` predefs. (from Benjamin Worpitz)
* Add specific version information for Cygwin OS predef. (from James E. King III)
[heading 1.8]
* Add support for __ARM_ARCH macro. (from Tim Blechmann)
* Add detection for PTX architecture. (from Benjamin Worpitz)
* Add nvcc compiler detection. (from Benjamin Worpitz)
* Add support for detecting CUDA. (from Benjamin Worpitz)
* Remove reference to obsolete BOOST_ARCH_AMD64. (from Peter Kolbus)
[heading 1.7]
* Fix BOOST_ARCH_PARISK/BOOST_ARCH_PARISC typo.
* Improved Windows Universal Platform detection. (from James E. King, III)
* Add detection for CloudABI with cloudlibc. (from James E. King, III)
[heading 1.6]
* Fix Intel C/C++ version 9999 detection to be 12.1.0.
* Addition of `BOOST_PREDEF_WORKAROUND` and `BOOST_PREDEF_TESTED_AT` macros
for defect workarounds and detection.
* Add ARM64 MSVC SIMD detection. (from Minmin Gong)
* Add detection of iOS simulator vs device as a platform choice. (from Ruslan
Baratov)
* Fix MinGW incorrect header guard. (from Ruslan Baratov)
[heading 1.5]
* Fix Intel C/C++ compiler version specification.

View File

@ -1,8 +1,8 @@
[article Boost.Predef
[quickbook 1.7]
[version 1.5]
[version 1.10]
[authors [Rivera, Rene]]
[copyright 2005-2016 Rene Rivera]
[copyright 2005-2019 Rene Rivera]
[copyright 2015 Charly Chevalier]
[copyright 2015 Joel Falcou]
[purpose Identification and specification of predefined macros.]
@ -114,12 +114,8 @@ done:
* Additionally, even if there is no auto-configure style option.. It would be
good to add optionally included headers so that user can get consistent
version number definitions for libraries they use.
* Having a consistent set of version number definitions opens the door to
improving the user level syntax of libraries that do checks against version
numbers. Specifically Boost Config's `BOOST_WORKAROUND` macro would benefit
from a more readable syntax. As would the `BOOST_TESTED_AT` detail macro.
* And obviously there's lots of work to do in reformulating the existing
Boost libraries to use the Predef library once it's accepted.
Boost libraries to use the Predef library.
* And there's the continuing work of adding definitions for present and
future compilers, platforms, architectures, languages, and libraries.
@ -239,7 +235,7 @@ commonly emulated by other compilers by defining the same base macros. To
account for this detection headers are allowed to define `*_EMULATED` predefs
when this situation is detected. The emulated predefs will be set to the
version number of the detection instead of the regular predef macro for that
detection. For example MSVC will set `BOOST_COMP_MSVC_EMULATED` but not set `BOOST_COM_MSVC`, and it will also set `BOOST_COMP_MSVC_AVAILABLE`.
detection. For example MSVC will set `BOOST_COMP_MSVC_EMULATED` but not set `BOOST_COMP_MSVC`, and it will also set `BOOST_COMP_MSVC_AVAILABLE`.
[heading Using the `BOOST_VERSION_NUMBER` macro]
@ -405,7 +401,7 @@ We also need to provide the `*_AVAILABLE` versions of the predef.
And for convenience we also want to provide a `*_NAME` macro:
``
#define BOOST_catagory_tag_NAME "Name"
#define BOOST_category_tag_NAME "Name"
``
The testing of the predef macros is automated to generate checks for all
@ -511,7 +507,7 @@ uses a simple 3-digit version macro (M,N,P). It can be decomposed
and defined as:
``
#define BOOST_CCOMP_EDG BOOST_PREDEF_MAKE_N_N_N(__EDG_VERSION__)
#define BOOST_COMP_EDG BOOST_PREDEF_MAKE_N_N_N(__EDG_VERSION__)
``
The decomposition macros are split into three types: decimal

View File

@ -1,5 +1,5 @@
[/
Copyright 2014 Rene Rivera
Copyright 2014-2017 Rene Rivera
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)
@ -8,6 +8,5 @@ http://www.boost.org/LICENSE_1_0.txt)
[section To Do]
* Improve reference documentation.
* Provide BOOST_WORKAROUND style macros for public use.
[endsect]

View File

@ -19,6 +19,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#include <boost/predef/architecture/mips.h>
#include <boost/predef/architecture/parisc.h>
#include <boost/predef/architecture/ppc.h>
#include <boost/predef/architecture/ptx.h>
#include <boost/predef/architecture/pyramid.h>
#include <boost/predef/architecture/rs6k.h>
#include <boost/predef/architecture/sparc.h>

View File

@ -1,5 +1,5 @@
/*
Copyright Rene Rivera 2008-2015
Copyright Rene Rivera 2008-2019
Copyright Franz Detro 2014
Copyright (c) Microsoft Corporation 2014
Distributed under the Boost Software License, Version 1.0.
@ -21,28 +21,68 @@ http://www.boost.org/LICENSE_1_0.txt)
[table
[[__predef_symbol__] [__predef_version__]]
[[`__arm__`] [__predef_detection__]]
[[`__arm64`] [__predef_detection__]]
[[`__thumb__`] [__predef_detection__]]
[[`__ARM_ARCH`] [__predef_detection__]]
[[`__TARGET_ARCH_ARM`] [__predef_detection__]]
[[`__TARGET_ARCH_THUMB`] [__predef_detection__]]
[[`_M_ARM`] [__predef_detection__]]
[[`__arm__`] [__predef_detection__]]
[[`__arm64`] [__predef_detection__]]
[[`__thumb__`] [__predef_detection__]]
[[`_M_ARM64`] [__predef_detection__]]
[[`__aarch64__`] [__predef_detection__]]
[[`__AARCH64EL__`] [__predef_detection__]]
[[`__ARM_ARCH_7__`] [__predef_detection__]]
[[`__ARM_ARCH_7A__`] [__predef_detection__]]
[[`__ARM_ARCH_7R__`] [__predef_detection__]]
[[`__ARM_ARCH_7M__`] [__predef_detection__]]
[[`__ARM_ARCH_6K__`] [__predef_detection__]]
[[`__ARM_ARCH_6Z__`] [__predef_detection__]]
[[`__ARM_ARCH_6KZ__`] [__predef_detection__]]
[[`__ARM_ARCH_6T2__`] [__predef_detection__]]
[[`__ARM_ARCH_5TE__`] [__predef_detection__]]
[[`__ARM_ARCH_5TEJ__`] [__predef_detection__]]
[[`__ARM_ARCH_4T__`] [__predef_detection__]]
[[`__ARM_ARCH_4__`] [__predef_detection__]]
[[`__arm64`] [8.0.0]]
[[`__ARM_ARCH`] [V.0.0]]
[[`__TARGET_ARCH_ARM`] [V.0.0]]
[[`__TARGET_ARCH_THUMB`] [V.0.0]]
[[`_M_ARM`] [V.0.0]]
[[`__arm64`] [8.0.0]]
[[`_M_ARM64`] [8.0.0]]
[[`__aarch64__`] [8.0.0]]
[[`__AARCH64EL__`] [8.0.0]]
[[`__ARM_ARCH_7__`] [7.0.0]]
[[`__ARM_ARCH_7A__`] [7.0.0]]
[[`__ARM_ARCH_7R__`] [7.0.0]]
[[`__ARM_ARCH_7M__`] [7.0.0]]
[[`__ARM_ARCH_6K__`] [6.0.0]]
[[`__ARM_ARCH_6Z__`] [6.0.0]]
[[`__ARM_ARCH_6KZ__`] [6.0.0]]
[[`__ARM_ARCH_6T2__`] [6.0.0]]
[[`__ARM_ARCH_5TE__`] [5.0.0]]
[[`__ARM_ARCH_5TEJ__`] [5.0.0]]
[[`__ARM_ARCH_4T__`] [4.0.0]]
[[`__ARM_ARCH_4__`] [4.0.0]]
]
*/
#define BOOST_ARCH_ARM BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if defined(__arm__) || defined(__arm64) || defined(__thumb__) || \
defined(__TARGET_ARCH_ARM) || defined(__TARGET_ARCH_THUMB) || \
defined(_M_ARM)
#if \
defined(__ARM_ARCH) || defined(__TARGET_ARCH_ARM) || \
defined(__TARGET_ARCH_THUMB) || defined(_M_ARM) || \
defined(__arm__) || defined(__arm64) || defined(__thumb__) || \
defined(_M_ARM64) || defined(__aarch64__) || defined(__AARCH64EL__) || \
defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \
defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || \
defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || \
defined(__ARM_ARCH_6KZ__) || defined(__ARM_ARCH_6T2__) || \
defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__) || \
defined(__ARM_ARCH_4T__) || defined(__ARM_ARCH_4__)
# undef BOOST_ARCH_ARM
# if !defined(BOOST_ARCH_ARM) && defined(__arm64)
# define BOOST_ARCH_ARM BOOST_VERSION_NUMBER(8,0,0)
# if !defined(BOOST_ARCH_ARM) && defined(__ARM_ARCH)
# define BOOST_ARCH_ARM BOOST_VERSION_NUMBER(__ARM_ARCH,0,0)
# endif
# if !defined(BOOST_ARCH_ARM) && defined(__TARGET_ARCH_ARM)
# define BOOST_ARCH_ARM BOOST_VERSION_NUMBER(__TARGET_ARCH_ARM,0,0)
@ -53,6 +93,29 @@ http://www.boost.org/LICENSE_1_0.txt)
# if !defined(BOOST_ARCH_ARM) && defined(_M_ARM)
# define BOOST_ARCH_ARM BOOST_VERSION_NUMBER(_M_ARM,0,0)
# endif
# if !defined(BOOST_ARCH_ARM) && ( \
defined(__arm64) || defined(_M_ARM64) || defined(__aarch64__) || \
defined(__AARCH64EL__) )
# define BOOST_ARCH_ARM BOOST_VERSION_NUMBER(8,0,0)
# endif
# if !defined(BOOST_ARCH_ARM) && ( \
defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \
defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) )
# define BOOST_ARCH_ARM BOOST_VERSION_NUMBER(7,0,0)
# endif
# if !defined(BOOST_ARCH_ARM) && ( \
defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || \
defined(__ARM_ARCH_6KZ__) || defined(__ARM_ARCH_6T2__) )
# define BOOST_ARCH_ARM BOOST_VERSION_NUMBER(6,0,0)
# endif
# if !defined(BOOST_ARCH_ARM) && ( \
defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__) )
# define BOOST_ARCH_ARM BOOST_VERSION_NUMBER(5,0,0)
# endif
# if !defined(BOOST_ARCH_ARM) && ( \
defined(__ARM_ARCH_4T__) || defined(__ARM_ARCH_4__) )
# define BOOST_ARCH_ARM BOOST_VERSION_NUMBER(4,0,0)
# endif
# if !defined(BOOST_ARCH_ARM)
# define BOOST_ARCH_ARM BOOST_VERSION_NUMBER_AVAILABLE
# endif

View File

@ -12,7 +12,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#include <boost/predef/make.h>
/*`
[heading `BOOST_ARCH_PARISK`]
[heading `BOOST_ARCH_PARISC`]
[@http://en.wikipedia.org/wiki/PA-RISC_family HP/PA RISC] architecture.

View File

@ -0,0 +1,44 @@
/*
Copyright Benjamin Worpitz 2018
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)
*/
#ifndef BOOST_PREDEF_ARCHITECTURE_PTX_H
#define BOOST_PREDEF_ARCHITECTURE_PTX_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
/*`
[heading `BOOST_ARCH_PTX`]
[@https://en.wikipedia.org/wiki/Parallel_Thread_Execution PTX] architecture.
[table
[[__predef_symbol__] [__predef_version__]]
[[`__CUDA_ARCH__`] [__predef_detection__]]
[[`__CUDA_ARCH__`] [V.R.0]]
]
*/
#define BOOST_ARCH_PTX BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if defined(__CUDA_ARCH__)
# undef BOOST_ARCH_PTX
# define BOOST_ARCH_PTX BOOST_PREDEF_MAKE_10_VR0(__CUDA_ARCH__)
#endif
#if BOOST_ARCH_PTX
# define BOOST_ARCH_PTX_AVAILABLE
#endif
#define BOOST_ARCH_PTX_NAME "PTX"
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_ARCH_PTX,BOOST_ARCH_PTX_NAME)

View File

@ -32,6 +32,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#include <boost/predef/compiler/metrowerks.h>
#include <boost/predef/compiler/microtec.h>
#include <boost/predef/compiler/mpw.h>
#include <boost/predef/compiler/nvcc.h>
#include <boost/predef/compiler/palm.h>
#include <boost/predef/compiler/pgi.h>
#include <boost/predef/compiler/sgi_mipspro.h>

View File

@ -38,7 +38,7 @@ Version number available as major, minor, and patch.
# define BOOST_COMP_DEC_DETECTION BOOST_PREDEF_MAKE_10_VVRR0PP00(__DECC_VER)
# endif
# if !defined(BOOST_COMP_DEC_DETECTION)
# define BOOST_COM_DEC_DETECTION BOOST_VERSION_NUMBER_AVAILABLE
# define BOOST_COMP_DEC_DETECTION BOOST_VERSION_NUMBER_AVAILABLE
# endif
#endif

View File

@ -1,5 +1,5 @@
/*
Copyright Rene Rivera 2008-2015
Copyright Rene Rivera 2008-2017
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)
@ -34,6 +34,13 @@ Version number available as major, minor, and patch.
#if defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || \
defined(__ECC)
/*`
[note Because of an Intel mistake in the release version numbering when
`__INTEL_COMPILER` is `9999` it is detected as version 12.1.0.]
*/
# if !defined(BOOST_COMP_INTEL_DETECTION) && defined(__INTEL_COMPILER) && (__INTEL_COMPILER == 9999)
# define BOOST_COMP_INTEL_DETECTION BOOST_VERSION_NUMBER(12,1,0)
# endif
# if !defined(BOOST_COMP_INTEL_DETECTION) && defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE)
# define BOOST_COMP_INTEL_DETECTION BOOST_VERSION_NUMBER( \
BOOST_VERSION_NUMBER_MAJOR(BOOST_PREDEF_MAKE_10_VVRR(__INTEL_COMPILER)), \

View File

@ -0,0 +1,73 @@
/*
Copyright Benjamin Worpitz 2018
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)
*/
#ifndef BOOST_PREDEF_COMPILER_NVCC_H
#define BOOST_PREDEF_COMPILER_NVCC_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
/*`
[heading `BOOST_COMP_NVCC`]
[@https://en.wikipedia.org/wiki/NVIDIA_CUDA_Compiler NVCC] compiler.
Version number available as major, minor, and patch beginning with version 7.5.
[table
[[__predef_symbol__] [__predef_version__]]
[[`__NVCC__`] [__predef_detection__]]
[[`__CUDACC_VER_MAJOR__`, `__CUDACC_VER_MINOR__`, `__CUDACC_VER_BUILD__`] [V.R.P]]
]
*/
#define BOOST_COMP_NVCC BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if defined(__NVCC__)
# if !defined(__CUDACC_VER_MAJOR__) || !defined(__CUDACC_VER_MINOR__) || !defined(__CUDACC_VER_BUILD__)
# define BOOST_COMP_NVCC_DETECTION BOOST_VERSION_NUMBER_AVAILABLE
# else
# define BOOST_COMP_NVCC_DETECTION BOOST_VERSION_NUMBER(__CUDACC_VER_MAJOR__, __CUDACC_VER_MINOR__, __CUDACC_VER_BUILD__)
# endif
#endif
#ifdef BOOST_COMP_NVCC_DETECTION
/*
Always define BOOST_COMP_NVCC instead of BOOST_COMP_NVCC_EMULATED
The nvcc compilation process is somewhat special as can be read here:
https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#cuda-compilation-trajectory
The nvcc compiler precompiles the input two times. Once for the device code
being compiled by the cicc device compiler and once for the host code
compiled by the real host compiler. NVCC uses gcc/clang/msvc/...
depending on the host compiler being set on the command line.
Predef (as a preprocessor only lib) detects the one doing the preprocessing
as compiler and expects it to be the one doing the real compilation.
This is not true for NVCC which is only doing the preprocessing and which
is using another compiler for parts of its work. So for NVCC it should be
allowed to set BOOST_COMP_NVCC additionally to the already detected host
compiler because both is true: It is gcc/clang/... compiling the code, but it
is also NVCC doing the preprocessing and adding some other quirks you may
want to detect.
This behavior is similar to what boost config is doing in `select_compiler_config.hpp`.
There the NVCC detection is not handled as a real compiler (part of the
#if-#elif) but as additional option before the real compiler.
*/
# undef BOOST_COMP_NVCC
# define BOOST_COMP_NVCC BOOST_COMP_NVCC_DETECTION
# define BOOST_COMP_NVCC_AVAILABLE
# include <boost/predef/detail/comp_detected.h>
#endif
#define BOOST_COMP_NVCC_NAME "NVCC"
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_COMP_NVCC,BOOST_COMP_NVCC_NAME)

View File

@ -1,5 +1,5 @@
/*
Copyright Rene Rivera 2013
Copyright Rene Rivera 2013-2018
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)
@ -8,6 +8,8 @@ http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_PREDEF_DETAIL_ENDIAN_COMPAT_H
#define BOOST_PREDEF_DETAIL_ENDIAN_COMPAT_H
#pragma message("The use of BOOST_*_ENDIAN and BOOST_BYTE_ORDER is deprecated. Please include <boost/predef/other/endian.h> and use BOOST_ENDIAN_*_BYTE instead")
#include <boost/predef/other/endian.h>
#if BOOST_ENDIAN_BIG_BYTE

View File

@ -24,6 +24,7 @@ http://www.boost.org/LICENSE_1_0.txt)
[[`__ARM_NEON__`] [__predef_detection__]]
[[`__aarch64__`] [__predef_detection__]]
[[`_M_ARM`] [__predef_detection__]]
[[`_M_ARM64`] [__predef_detection__]]
]
[table
@ -32,6 +33,7 @@ http://www.boost.org/LICENSE_1_0.txt)
[[`__ARM_NEON__`] [BOOST_HW_SIMD_ARM_NEON_VERSION]]
[[`__aarch64__`] [BOOST_HW_SIMD_ARM_NEON_VERSION]]
[[`_M_ARM`] [BOOST_HW_SIMD_ARM_NEON_VERSION]]
[[`_M_ARM64`] [BOOST_HW_SIMD_ARM_NEON_VERSION]]
]
*/
@ -39,7 +41,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#define BOOST_HW_SIMD_ARM BOOST_VERSION_NUMBER_NOT_AVAILABLE
#undef BOOST_HW_SIMD_ARM
#if !defined(BOOST_HW_SIMD_ARM) && (defined(__ARM_NEON__) || defined(__aarch64__) || defined (_M_ARM))
#if !defined(BOOST_HW_SIMD_ARM) && (defined(__ARM_NEON__) || defined(__aarch64__) || defined (_M_ARM) || defined (_M_ARM64))
# define BOOST_HW_SIMD_ARM BOOST_HW_SIMD_ARM_NEON_VERSION
#endif

View File

@ -13,5 +13,6 @@ http://www.boost.org/LICENSE_1_0.txt)
#include <boost/predef/language/stdc.h>
#include <boost/predef/language/stdcpp.h>
#include <boost/predef/language/objc.h>
#include <boost/predef/language/cuda.h>
#endif

View File

@ -0,0 +1,52 @@
/*
Copyright Benjamin Worpitz 2018
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)
*/
#ifndef BOOST_PREDEF_LANGUAGE_CUDA_H
#define BOOST_PREDEF_LANGUAGE_CUDA_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
/*`
[heading `BOOST_LANG_CUDA`]
[@https://en.wikipedia.org/wiki/CUDA CUDA C/C++] language.
If available, the version is detected as VV.RR.P.
[table
[[__predef_symbol__] [__predef_version__]]
[[`__CUDACC__`] [__predef_detection__]]
[[`__CUDA__`] [__predef_detection__]]
[[`CUDA_VERSION`] [VV.RR.P]]
]
*/
#define BOOST_LANG_CUDA BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if defined(__CUDACC__) || defined(__CUDA__)
# undef BOOST_LANG_CUDA
# include <cuda.h>
# if defined(CUDA_VERSION)
# define BOOST_LANG_CUDA BOOST_PREDEF_MAKE_10_VVRRP(CUDA_VERSION)
# else
# define BOOST_LANG_CUDA BOOST_VERSION_NUMBER_AVAILABLE
# endif
#endif
#if BOOST_LANG_CUDA
# define BOOST_LANG_CUDA_AVAILABLE
#endif
#define BOOST_LANG_CUDA_NAME "CUDA C/C++"
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_LANG_CUDA,BOOST_LANG_CUDA_NAME)

View File

@ -12,6 +12,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#include <boost/predef/library/c/_prefix.h>
#include <boost/predef/library/c/cloudabi.h>
#include <boost/predef/library/c/gnu.h>
#include <boost/predef/library/c/uc.h>
#include <boost/predef/library/c/vms.h>

View File

@ -0,0 +1,53 @@
/*
* Copyright (C) 2017 James E. King III
*
* 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)
*/
#ifndef BOOST_PREDEF_LIBRARY_C_CLOUDABI_H
#define BOOST_PREDEF_LIBRARY_C_CLOUDABI_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
#include <boost/predef/library/c/_prefix.h>
#if defined(__CloudABI__)
#include <stddef.h>
#endif
/*`
[heading `BOOST_LIB_C_CLOUDABI`]
[@https://github.com/NuxiNL/cloudlibc cloudlibc] - CloudABI's standard C library.
Version number available as major, and minor.
[table
[[__predef_symbol__] [__predef_version__]]
[[`__cloudlibc__`] [__predef_detection__]]
[[`__cloudlibc_major__`, `__cloudlibc_minor__`] [V.R.0]]
]
*/
#define BOOST_LIB_C_CLOUDABI BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if defined(__cloudlibc__)
# undef BOOST_LIB_C_CLOUDABI
# define BOOST_LIB_C_CLOUDABI \
BOOST_VERSION_NUMBER(__cloudlibc_major__,__cloudlibc_minor__,0)
#endif
#if BOOST_LIB_C_CLOUDABI
# define BOOST_LIB_C_CLOUDABI_AVAILABLE
#endif
#define BOOST_LIB_C_CLOUDABI_NAME "cloudlibc"
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_LIB_C_CLOUDABI,BOOST_LIB_C_CLOUDABI_NAME)

View File

@ -46,10 +46,14 @@ Macros are:
#define BOOST_PREDEF_MAKE_0X_VVRRPP(V) BOOST_VERSION_NUMBER((V&0xFF0000)>>16,(V&0xFF00)>>8,(V&0xFF))
/*` `BOOST_PREDEF_MAKE_10_VPPP(V)` */
#define BOOST_PREDEF_MAKE_10_VPPP(V) BOOST_VERSION_NUMBER(((V)/1000)%10,0,(V)%1000)
/*` `BOOST_PREDEF_MAKE_10_VR0(V)` */
#define BOOST_PREDEF_MAKE_10_VR0(V) BOOST_VERSION_NUMBER(((V)/100)%10,((V)/10)%10,0)
/*` `BOOST_PREDEF_MAKE_10_VRP(V)` */
#define BOOST_PREDEF_MAKE_10_VRP(V) BOOST_VERSION_NUMBER(((V)/100)%10,((V)/10)%10,(V)%10)
/*` `BOOST_PREDEF_MAKE_10_VRP000(V)` */
#define BOOST_PREDEF_MAKE_10_VRP000(V) BOOST_VERSION_NUMBER(((V)/100000)%10,((V)/10000)%10,((V)/1000)%10)
/*` `BOOST_PREDEF_MAKE_10_VRPPPP(V)` */
#define BOOST_PREDEF_MAKE_10_VRPPPP(V) BOOST_VERSION_NUMBER(((V)/100000)%10,((V)/10000)%10,(V)%10000)
/*` `BOOST_PREDEF_MAKE_10_VRPP(V)` */
#define BOOST_PREDEF_MAKE_10_VRPP(V) BOOST_VERSION_NUMBER(((V)/1000)%10,((V)/100)%10,(V)%100)
/*` `BOOST_PREDEF_MAKE_10_VRR(V)` */
@ -62,8 +66,12 @@ Macros are:
#define BOOST_PREDEF_MAKE_10_VV00(V) BOOST_VERSION_NUMBER(((V)/100)%100,0,0)
/*` `BOOST_PREDEF_MAKE_10_VVRR(V)` */
#define BOOST_PREDEF_MAKE_10_VVRR(V) BOOST_VERSION_NUMBER(((V)/100)%100,(V)%100,0)
/*` `BOOST_PREDEF_MAKE_10_VVRRP(V)` */
#define BOOST_PREDEF_MAKE_10_VVRRP(V) BOOST_VERSION_NUMBER(((V)/1000)%100,((V)/10)%100,(V)%10)
/*` `BOOST_PREDEF_MAKE_10_VVRRPP(V)` */
#define BOOST_PREDEF_MAKE_10_VVRRPP(V) BOOST_VERSION_NUMBER(((V)/10000)%100,((V)/100)%100,(V)%100)
/*` `BOOST_PREDEF_MAKE_10_VVRRPPP(V)` */
#define BOOST_PREDEF_MAKE_10_VVRRPPP(V) BOOST_VERSION_NUMBER(((V)/100000)%100,((V)/1000)%100,(V)%1000)
/*` `BOOST_PREDEF_MAKE_10_VVRR0PP00(V)` */
#define BOOST_PREDEF_MAKE_10_VVRR0PP00(V) BOOST_VERSION_NUMBER(((V)/10000000)%100,((V)/100000)%100,((V)/100)%100)
/*` `BOOST_PREDEF_MAKE_10_VVRR0PPPP(V)` */

View File

@ -13,7 +13,6 @@ http://www.boost.org/LICENSE_1_0.txt)
#include <boost/predef/os/aix.h>
#include <boost/predef/os/amigaos.h>
#include <boost/predef/os/android.h>
#include <boost/predef/os/beos.h>
#include <boost/predef/os/bsd.h>
#include <boost/predef/os/cygwin.h>
@ -30,4 +29,6 @@ http://www.boost.org/LICENSE_1_0.txt)
#include <boost/predef/os/vms.h>
#include <boost/predef/os/windows.h>
#include <boost/predef/os/android.h>
#endif

View File

@ -5,8 +5,8 @@ Distributed under the Boost Software License, Version 1.0.
http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_PREDEF_OS_ADROID_H
#define BOOST_PREDEF_OS_ADROID_H
#ifndef BOOST_PREDEF_OS_ANDROID_H
#define BOOST_PREDEF_OS_ANDROID_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
@ -14,6 +14,9 @@ http://www.boost.org/LICENSE_1_0.txt)
/*`
[heading `BOOST_OS_ANDROID`]
NOTE: `BOOST_OS_ANDROID` is deprecated, and will be removed in a following release.
Please use `BOOST_PLAT_ANDROID` instead.
[@http://en.wikipedia.org/wiki/Android_%28operating_system%29 Android] operating system.
[table

View File

@ -89,7 +89,7 @@ of BSD. If the above variants is detected the corresponding macro is also set.]
#define BOOST_OS_BSD_NAME "BSD"
#else
#endif
#include <boost/predef/os/bsd/bsdi.h>
#include <boost/predef/os/bsd/dragonfly.h>
@ -97,7 +97,5 @@ of BSD. If the above variants is detected the corresponding macro is also set.]
#include <boost/predef/os/bsd/open.h>
#include <boost/predef/os/bsd/net.h>
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_OS_BSD,BOOST_OS_BSD_NAME)

View File

@ -34,13 +34,20 @@ http://www.boost.org/LICENSE_1_0.txt)
# define BOOST_OS_BSD_AVAILABLE
# endif
# undef BOOST_OS_BSD_FREE
# include <sys/param.h>
# if defined(__FreeBSD_version)
# if __FreeBSD_version < 500000
# if __FreeBSD_version == 491000
# define BOOST_OS_BSD_FREE \
BOOST_PREDEF_MAKE_10_VRP000(__FreeBSD_version)
BOOST_VERSION_NUMBER(4, 10, 0)
# elif __FreeBSD_version == 492000
# define BOOST_OS_BSD_FREE \
BOOST_VERSION_NUMBER(4, 11, 0)
# elif __FreeBSD_version < 500000
# define BOOST_OS_BSD_FREE \
BOOST_PREDEF_MAKE_10_VRPPPP(__FreeBSD_version)
# else
# define BOOST_OS_BSD_FREE \
BOOST_PREDEF_MAKE_10_VRR000(__FreeBSD_version)
BOOST_PREDEF_MAKE_10_VVRRPPP(__FreeBSD_version)
# endif
# else
# define BOOST_OS_BSD_FREE BOOST_VERSION_NUMBER_AVAILABLE

View File

@ -76,7 +76,7 @@ http://www.boost.org/LICENSE_1_0.txt)
# include <boost/predef/detail/os_detected.h>
#endif
#define BOOST_OS_BSD_NET_NAME "DragonFly BSD"
#define BOOST_OS_BSD_NET_NAME "NetBSD"
#endif

View File

@ -50,6 +50,26 @@ http://www.boost.org/LICENSE_1_0.txt)
[[`OpenBSD4_7`] [4.7.0]]
[[`OpenBSD4_8`] [4.8.0]]
[[`OpenBSD4_9`] [4.9.0]]
[[`OpenBSD5_0`] [5.0.0]]
[[`OpenBSD5_1`] [5.1.0]]
[[`OpenBSD5_2`] [5.2.0]]
[[`OpenBSD5_3`] [5.3.0]]
[[`OpenBSD5_4`] [5.4.0]]
[[`OpenBSD5_5`] [5.5.0]]
[[`OpenBSD5_6`] [5.6.0]]
[[`OpenBSD5_7`] [5.7.0]]
[[`OpenBSD5_8`] [5.8.0]]
[[`OpenBSD5_9`] [5.9.0]]
[[`OpenBSD6_0`] [6.0.0]]
[[`OpenBSD6_1`] [6.1.0]]
[[`OpenBSD6_2`] [6.2.0]]
[[`OpenBSD6_3`] [6.3.0]]
[[`OpenBSD6_4`] [6.4.0]]
[[`OpenBSD6_5`] [6.5.0]]
[[`OpenBSD6_6`] [6.6.0]]
[[`OpenBSD6_7`] [6.7.0]]
[[`OpenBSD6_8`] [6.8.0]]
[[`OpenBSD6_9`] [6.9.0]]
]
*/
@ -153,6 +173,66 @@ http://www.boost.org/LICENSE_1_0.txt)
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD4_9)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(4,9,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD5_0)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(5,0,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD5_1)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(5,1,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD5_2)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(5,2,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD5_3)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(5,3,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD5_4)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(5,4,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD5_5)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(5,5,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD5_6)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(5,6,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD5_7)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(5,7,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD5_8)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(5,8,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD5_9)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(5,9,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD6_0)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(6,0,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD6_1)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(6,1,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD6_2)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(6,2,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD6_3)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(6,3,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD6_4)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(6,4,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD6_5)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(6,5,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD6_6)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(6,6,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD6_7)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(6,7,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD6_8)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(6,8,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN) && defined(OpenBSD6_9)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER(6,9,0)
# endif
# if !defined(BOOST_OS_BSD_OPEN)
# define BOOST_OS_BSD_OPEN BOOST_VERSION_NUMBER_AVAILABLE
# endif

View File

@ -20,6 +20,8 @@ http://www.boost.org/LICENSE_1_0.txt)
[[__predef_symbol__] [__predef_version__]]
[[`__CYGWIN__`] [__predef_detection__]]
[[`CYGWIN_VERSION_API_MAJOR`, `CYGWIN_VERSION_API_MINOR`] [V.R.0]]
]
*/
@ -28,8 +30,11 @@ http://www.boost.org/LICENSE_1_0.txt)
#if !defined(BOOST_PREDEF_DETAIL_OS_DETECTED) && ( \
defined(__CYGWIN__) \
)
# include <cygwin/version.h>
# undef BOOST_OS_CYGWIN
# define BOOST_OS_CYGWIN BOOST_VERSION_NUMBER_AVAILABLE
# define BOOST_OS_CYGWIN \
BOOST_VERSION_NUMBER(CYGWIN_VERSION_API_MAJOR,\
CYGWIN_VERSION_API_MINOR, 0)
#endif
#if BOOST_OS_CYGWIN

View File

@ -21,13 +21,16 @@ http://www.boost.org/LICENSE_1_0.txt)
[[`linux`] [__predef_detection__]]
[[`__linux`] [__predef_detection__]]
[[`__linux__`] [__predef_detection__]]
[[`__gnu_linux__`] [__predef_detection__]]
]
*/
#define BOOST_OS_LINUX BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if !defined(BOOST_PREDEF_DETAIL_OS_DETECTED) && ( \
defined(linux) || defined(__linux) \
defined(linux) || defined(__linux) || \
defined(__linux__) || defined(__gnu_linux__) \
)
# undef BOOST_OS_LINUX
# define BOOST_OS_LINUX BOOST_VERSION_NUMBER_AVAILABLE

View File

@ -148,8 +148,7 @@ information and acquired knowledge:
# undef BOOST_ENDIAN_BIG_BYTE
# define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE
# endif
# if BOOST_ARCH_AMD64 || \
BOOST_ARCH_IA64 || \
# if BOOST_ARCH_IA64 || \
BOOST_ARCH_X86 || \
BOOST_ARCH_BLACKFIN
# undef BOOST_ENDIAN_LITTLE_BYTE

View File

@ -0,0 +1,87 @@
/*
Copyright Rene Rivera 2017
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)
*/
#ifndef BOOST_PREDEF_WORKAROUND_H
#define BOOST_PREDEF_WORKAROUND_H
/*`
[heading `BOOST_PREDEF_WORKAROUND`]
``
BOOST_PREDEF_WORKAROUND(symbol,comp,major,minor,patch)
``
Usage:
``
#if BOOST_PREDEF_WORKAROUND(BOOST_COMP_CLANG,<,3,0,0)
// Workaround for old clang compilers..
#endif
``
Defines a comparison against two version numbers that depends on the definion
of `BOOST_STRICT_CONFIG`. When `BOOST_STRICT_CONFIG` is defined this will expand
to a value convertible to `false`. Which has the effect of disabling all code
conditionally guarded by `BOOST_PREDEF_WORKAROUND`. When `BOOST_STRICT_CONFIG`
is undefine this expand to test the given `symbol` version value with the
`comp` comparison against `BOOST_VERSION_NUMBER(major,minor,patch)`.
*/
#ifdef BOOST_STRICT_CONFIG
# define BOOST_PREDEF_WORKAROUND(symbol, comp, major, minor, patch) (0)
#else
# include <boost/predef/version_number.h>
# define BOOST_PREDEF_WORKAROUND(symbol, comp, major, minor, patch) \
( (symbol) != (0) ) && \
( (symbol) comp (BOOST_VERSION_NUMBER( (major) , (minor) , (patch) )) )
#endif
/*`
[heading `BOOST_PREDEF_TESTED_AT`]
``
BOOST_PREDEF_TESTED_AT(symbol,major,minor,patch)
``
Usage:
``
#if BOOST_PREDEF_TESTED_AT(BOOST_COMP_CLANG,3,5,0)
// Needed for clang, and last checked for 3.5.0.
#endif
``
Defines a comparison against two version numbers that depends on the definion
of `BOOST_STRICT_CONFIG` and `BOOST_DETECT_OUTDATED_WORKAROUNDS`.
When `BOOST_STRICT_CONFIG` is defined this will expand to a value convertible
to `false`. Which has the effect of disabling all code
conditionally guarded by `BOOST_PREDEF_TESTED_AT`. When `BOOST_STRICT_CONFIG`
is undefined this expand to either:
* A value convertible to `true` when `BOOST_DETECT_OUTDATED_WORKAROUNDS` is not
defined.
* A value convertible `true` when the expansion of
`BOOST_PREDEF_WORKAROUND(symbol, <=, major, minor, patch)` is `true` and
`BOOST_DETECT_OUTDATED_WORKAROUNDS` is defined.
* A compile error when the expansion of
`BOOST_PREDEF_WORKAROUND(symbol, >, major, minor, patch)` is true and
`BOOST_DETECT_OUTDATED_WORKAROUNDS` is defined.
*/
#ifdef BOOST_STRICT_CONFIG
# define BOOST_PREDEF_TESTED_AT(symbol, major, minor, patch) (0)
#else
# ifdef BOOST_DETECT_OUTDATED_WORKAROUNDS
# define BOOST_PREDEF_TESTED_AT(symbol, major, minor, patch) ( \
BOOST_PREDEF_WORKAROUND(symbol, <=, major, minor, patch) \
? 1 \
: (1%0) )
# else
# define BOOST_PREDEF_TESTED_AT(symbol, major, minor, patch) \
( (symbol) >= BOOST_VERSION_NUMBER_AVAILABLE )
# endif
#endif
#endif

View File

@ -11,11 +11,19 @@ http://www.boost.org/LICENSE_1_0.txt)
#define BOOST_PREDEF_PLATFORM_H
#endif
#include <boost/predef/platform/android.h>
#include <boost/predef/platform/cloudabi.h>
#include <boost/predef/platform/mingw.h>
#include <boost/predef/platform/mingw32.h>
#include <boost/predef/platform/mingw64.h>
#include <boost/predef/platform/windows_uwp.h>
#include <boost/predef/platform/windows_desktop.h>
#include <boost/predef/platform/windows_store.h>
#include <boost/predef/platform/windows_phone.h>
#include <boost/predef/platform/windows_runtime.h>
#include <boost/predef/platform/windows_server.h>
#include <boost/predef/platform/windows_store.h>
#include <boost/predef/platform/windows_system.h>
#include <boost/predef/platform/windows_runtime.h> // deprecated
#include <boost/predef/platform/ios.h>
/*#include <boost/predef/platform/.h>*/
#endif

View File

@ -0,0 +1,43 @@
/*
Copyright Rene Rivera 2015-2019
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)
*/
#ifndef BOOST_PREDEF_PLAT_ANDROID_H
#define BOOST_PREDEF_PLAT_ANDROID_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
/*`
[heading `BOOST_PLAT_ANDROID`]
[@http://en.wikipedia.org/wiki/Android_%28operating_system%29 Android] platform.
[table
[[__predef_symbol__] [__predef_version__]]
[[`__ANDROID__`] [__predef_detection__]]
]
*/
#define BOOST_PLAT_ANDROID BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if defined(__ANDROID__)
# undef BOOST_PLAT_ANDROID
# define BOOST_PLAT_ANDROID BOOST_VERSION_NUMBER_AVAILABLE
#endif
#if BOOST_PLAT_ANDROID
# define BOOST_PLAT_ANDROID_AVAILABLE
# include <boost/predef/detail/platform_detected.h>
#endif
#define BOOST_PLAT_ANDROID_NAME "Android"
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_ANDROID,BOOST_PLAT_ANDROID_NAME)

View File

@ -0,0 +1,43 @@
/*
Copyright 2017 James E. King, III
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)
*/
#ifndef BOOST_PREDEF_PLAT_CLOUDABI_H
#define BOOST_PREDEF_PLAT_CLOUDABI_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
/*`
[heading `BOOST_PLAT_CLOUDABI`]
[@https://github.com/NuxiNL/cloudabi CloudABI] platform.
[table
[[__predef_symbol__] [__predef_version__]]
[[`__CloudABI__`] [__predef_detection__]]
]
*/
#define BOOST_PLAT_CLOUDABI BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if defined(__CloudABI__)
# undef BOOST_PLAT_CLOUDABI
# define BOOST_PLAT_CLOUDABI BOOST_VERSION_NUMBER_AVAILABLE
#endif
#if BOOST_PLAT_CLOUDABI
# define BOOST_PLAT_CLOUDABI_AVAILABLE
# include <boost/predef/detail/platform_detected.h>
#endif
#define BOOST_PLAT_CLOUDABI_NAME "CloudABI"
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_CLOUDABI,BOOST_PLAT_CLOUDABI_NAME)

View File

@ -0,0 +1,62 @@
/*
Copyright Ruslan Baratov 2017
Copyright Rene Rivera 2017
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)
*/
#ifndef BOOST_PREDEF_PLAT_IOS_H
#define BOOST_PREDEF_PLAT_IOS_H
#include <boost/predef/os/ios.h> // BOOST_OS_IOS
#include <boost/predef/version_number.h> // BOOST_VERSION_NUMBER_NOT_AVAILABLE
/*`
[heading `BOOST_PLAT_IOS_DEVICE`]
[heading `BOOST_PLAT_IOS_SIMULATOR`]
[table
[[__predef_symbol__] [__predef_version__]]
[[`TARGET_IPHONE_SIMULATOR`] [__predef_detection__]]
[[`TARGET_OS_SIMULATOR`] [__predef_detection__]]
]
*/
#define BOOST_PLAT_IOS_DEVICE BOOST_VERSION_NUMBER_NOT_AVAILABLE
#define BOOST_PLAT_IOS_SIMULATOR BOOST_VERSION_NUMBER_NOT_AVAILABLE
// https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/TargetConditionals.h
#if BOOST_OS_IOS
# include <TargetConditionals.h>
# if defined(TARGET_OS_SIMULATOR) && (TARGET_OS_SIMULATOR == 1)
# undef BOOST_PLAT_IOS_SIMULATOR
# define BOOST_PLAT_IOS_SIMULATOR BOOST_VERSION_NUMBER_AVAILABLE
# elif defined(TARGET_IPHONE_SIMULATOR) && (TARGET_IPHONE_SIMULATOR == 1)
# undef BOOST_PLAT_IOS_SIMULATOR
# define BOOST_PLAT_IOS_SIMULATOR BOOST_VERSION_NUMBER_AVAILABLE
# else
# undef BOOST_PLAT_IOS_DEVICE
# define BOOST_PLAT_IOS_DEVICE BOOST_VERSION_NUMBER_AVAILABLE
# endif
#endif
#if BOOST_PLAT_IOS_SIMULATOR
# define BOOST_PLAT_IOS_SIMULATOR_AVAILABLE
# include <boost/predef/detail/platform_detected.h>
#endif
#if BOOST_PLAT_IOS_DEVICE
# define BOOST_PLAT_IOS_DEVICE_AVAILABLE
# include <boost/predef/detail/platform_detected.h>
#endif
#define BOOST_PLAT_IOS_SIMULATOR_NAME "iOS Simulator"
#define BOOST_PLAT_IOS_DEVICE_NAME "iOS Device"
#endif // BOOST_PREDEF_PLAT_IOS_H
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_IOS_SIMULATOR,BOOST_PLAT_IOS_SIMULATOR_NAME)
BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_IOS_DEVICE,BOOST_PLAT_IOS_DEVICE_NAME)

View File

@ -5,8 +5,8 @@ Distributed under the Boost Software License, Version 1.0.
http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef BOOST_PREDEF_COMPILER_MINGW_H
#define BOOST_PREDEF_COMPILER_MINGW_H
#ifndef BOOST_PREDEF_PLAT_MINGW_H
#define BOOST_PREDEF_PLAT_MINGW_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
@ -14,7 +14,7 @@ http://www.boost.org/LICENSE_1_0.txt)
/*`
[heading `BOOST_PLAT_MINGW`]
[@http://en.wikipedia.org/wiki/MinGW MinGW] platform.
[@http://en.wikipedia.org/wiki/MinGW MinGW] platform, either variety.
Version number available as major, minor, and patch.
[table
@ -56,7 +56,7 @@ Version number available as major, minor, and patch.
# include <boost/predef/detail/platform_detected.h>
#endif
#define BOOST_PLAT_MINGW_NAME "MinGW"
#define BOOST_PLAT_MINGW_NAME "MinGW (any variety)"
#endif

View File

@ -0,0 +1,63 @@
/*
Copyright Rene Rivera 2008-2015
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)
*/
#ifndef BOOST_PREDEF_PLAT_MINGW32_H
#define BOOST_PREDEF_PLAT_MINGW32_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
/*`
[heading `BOOST_PLAT_MINGW32`]
[@http://www.mingw.org/ MinGW] platform.
Version number available as major, minor, and patch.
[table
[[__predef_symbol__] [__predef_version__]]
[[`__MINGW32__`] [__predef_detection__]]
[[`__MINGW32_VERSION_MAJOR`, `__MINGW32_VERSION_MINOR`] [V.R.0]]
]
*/
#define BOOST_PLAT_MINGW32 BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if defined(__MINGW32__)
# include <_mingw.h>
# if !defined(BOOST_PLAT_MINGW32_DETECTION) && (defined(__MINGW32_VERSION_MAJOR) && defined(__MINGW32_VERSION_MINOR))
# define BOOST_PLAT_MINGW32_DETECTION \
BOOST_VERSION_NUMBER(__MINGW32_VERSION_MAJOR,__MINGW32_VERSION_MINOR,0)
# endif
# if !defined(BOOST_PLAT_MINGW32_DETECTION)
# define BOOST_PLAT_MINGW32_DETECTION BOOST_VERSION_NUMBER_AVAILABLE
# endif
#endif
#ifdef BOOST_PLAT_MINGW32_DETECTION
# define BOOST_PLAT_MINGW32_AVAILABLE
# if defined(BOOST_PREDEF_DETAIL_PLAT_DETECTED)
# define BOOST_PLAT_MINGW32_EMULATED BOOST_PLAT_MINGW32_DETECTION
# else
# undef BOOST_PLAT_MINGW32
# define BOOST_PLAT_MINGW32 BOOST_PLAT_MINGW32_DETECTION
# endif
# include <boost/predef/detail/platform_detected.h>
#endif
#define BOOST_PLAT_MINGW32_NAME "MinGW"
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_MINGW32,BOOST_PLAT_MINGW32_NAME)
#ifdef BOOST_PLAT_MINGW32_EMULATED
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_MINGW32_EMULATED,BOOST_PLAT_MINGW32_NAME)
#endif

View File

@ -0,0 +1,63 @@
/*
Copyright Rene Rivera 2008-2015
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)
*/
#ifndef BOOST_PREDEF_PLAT_MINGW64_H
#define BOOST_PREDEF_PLAT_MINGW64_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
/*`
[heading `BOOST_PLAT_MINGW64`]
[@https://mingw-w64.org/ MinGW-w64] platform.
Version number available as major, minor, and patch.
[table
[[__predef_symbol__] [__predef_version__]]
[[`__MINGW64__`] [__predef_detection__]]
[[`__MINGW64_VERSION_MAJOR`, `__MINGW64_VERSION_MINOR`] [V.R.0]]
]
*/
#define BOOST_PLAT_MINGW64 BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if defined(__MINGW64__)
# include <_mingw.h>
# if !defined(BOOST_PLAT_MINGW64_DETECTION) && (defined(__MINGW64_VERSION_MAJOR) && defined(__MINGW64_VERSION_MINOR))
# define BOOST_PLAT_MINGW64_DETECTION \
BOOST_VERSION_NUMBER(__MINGW64_VERSION_MAJOR,__MINGW64_VERSION_MINOR,0)
# endif
# if !defined(BOOST_PLAT_MINGW64_DETECTION)
# define BOOST_PLAT_MINGW64_DETECTION BOOST_VERSION_NUMBER_AVAILABLE
# endif
#endif
#ifdef BOOST_PLAT_MINGW64_DETECTION
# define BOOST_PLAT_MINGW64_AVAILABLE
# if defined(BOOST_PREDEF_DETAIL_PLAT_DETECTED)
# define BOOST_PLAT_MINGW64_EMULATED BOOST_PLAT_MINGW64_DETECTION
# else
# undef BOOST_PLAT_MINGW64
# define BOOST_PLAT_MINGW64 BOOST_PLAT_MINGW64_DETECTION
# endif
# include <boost/predef/detail/platform_detected.h>
#endif
#define BOOST_PLAT_MINGW64_NAME "MinGW-w64"
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_MINGW64,BOOST_PLAT_MINGW64_NAME)
#ifdef BOOST_PLAT_MINGW64_EMULATED
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_MINGW64_EMULATED,BOOST_PLAT_MINGW64_NAME)
#endif

View File

@ -9,25 +9,31 @@ http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_PREDEF_PLAT_WINDOWS_DESKTOP_H
#define BOOST_PREDEF_PLAT_WINDOWS_DESKTOP_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
#include <boost/predef/os/windows.h>
#include <boost/predef/platform/windows_uwp.h>
#include <boost/predef/version_number.h>
/*`
[heading `BOOST_PLAT_WINDOWS_DESKTOP`]
[@https://docs.microsoft.com/en-us/windows/uwp/get-started/universal-application-platform-guide UWP]
for Windows Desktop development. Also available if the Platform SDK is too
old to support UWP.
[table
[[__predef_symbol__] [__predef_version__]]
[[`!WINAPI_FAMILY`] [__predef_detection__]]
[[`WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP`] [__predef_detection__]]
[[`!BOOST_PLAT_WINDOWS_UWP`] [__predef_detection__]]
]
*/
#define BOOST_PLAT_WINDOWS_DESKTOP BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if BOOST_OS_WINDOWS && \
( !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) )
((defined(WINAPI_FAMILY_DESKTOP_APP) && WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) || \
!BOOST_PLAT_WINDOWS_UWP)
# undef BOOST_PLAT_WINDOWS_DESKTOP
# define BOOST_PLAT_WINDOWS_DESKTOP BOOST_VERSION_NUMBER_AVAILABLE
#endif

View File

@ -9,13 +9,17 @@ http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_PREDEF_PLAT_WINDOWS_PHONE_H
#define BOOST_PREDEF_PLAT_WINDOWS_PHONE_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
#include <boost/predef/os/windows.h>
#include <boost/predef/platform/windows_uwp.h>
#include <boost/predef/version_number.h>
/*`
[heading `BOOST_PLAT_WINDOWS_PHONE`]
[@https://docs.microsoft.com/en-us/windows/uwp/get-started/universal-application-platform-guide UWP]
for Windows Phone development.
[table
[[__predef_symbol__] [__predef_version__]]
@ -25,7 +29,8 @@ http://www.boost.org/LICENSE_1_0.txt)
#define BOOST_PLAT_WINDOWS_PHONE BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if BOOST_OS_WINDOWS && defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
#if BOOST_OS_WINDOWS && \
defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
# undef BOOST_PLAT_WINDOWS_PHONE
# define BOOST_PLAT_WINDOWS_PHONE BOOST_VERSION_NUMBER_AVAILABLE
#endif

View File

@ -9,25 +9,33 @@ http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_PREDEF_PLAT_WINDOWS_RUNTIME_H
#define BOOST_PREDEF_PLAT_WINDOWS_RUNTIME_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
#include <boost/predef/os/windows.h>
#include <boost/predef/platform/windows_phone.h>
#include <boost/predef/platform/windows_store.h>
#include <boost/predef/version_number.h>
/*`
[heading `BOOST_PLAT_WINDOWS_RUNTIME`]
Deprecated.
[@https://docs.microsoft.com/en-us/windows/uwp/get-started/universal-application-platform-guide UWP]
for Windows Phone or Store development. This does not align to the existing development model for
UWP and is deprecated. Use one of the other `BOOST_PLAT_WINDOWS_*`definitions instead.
[table
[[__predef_symbol__] [__predef_version__]]
[[`WINAPI_FAMILY == WINAPI_FAMILY_APP`] [__predef_detection__]]
[[`WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP`] [__predef_detection__]]
[[`BOOST_PLAT_WINDOWS_PHONE`] [__predef_detection__]]
[[`BOOST_PLAT_WINDOWS_STORE`] [__predef_detection__]]
]
*/
#define BOOST_PLAT_WINDOWS_RUNTIME BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if BOOST_OS_WINDOWS && defined(WINAPI_FAMILY) && \
( WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP )
#if BOOST_OS_WINDOWS && \
(BOOST_PLAT_WINDOWS_STORE || BOOST_PLAT_WINDOWS_PHONE)
# undef BOOST_PLAT_WINDOWS_RUNTIME
# define BOOST_PLAT_WINDOWS_RUNTIME BOOST_VERSION_NUMBER_AVAILABLE
#endif

View File

@ -0,0 +1,47 @@
/*
Copyright James E. King III, 2017
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)
*/
#ifndef BOOST_PREDEF_PLAT_WINDOWS_SERVER_H
#define BOOST_PREDEF_PLAT_WINDOWS_SERVER_H
#include <boost/predef/make.h>
#include <boost/predef/os/windows.h>
#include <boost/predef/platform/windows_uwp.h>
#include <boost/predef/version_number.h>
/*`
[heading `BOOST_PLAT_WINDOWS_SERVER`]
[@https://docs.microsoft.com/en-us/windows/uwp/get-started/universal-application-platform-guide UWP]
for Windows Server development.
[table
[[__predef_symbol__] [__predef_version__]]
[[`WINAPI_FAMILY == WINAPI_FAMILY_SERVER`] [__predef_detection__]]
]
*/
#define BOOST_PLAT_WINDOWS_SERVER BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if BOOST_OS_WINDOWS && \
defined(WINAPI_FAMILY_SERVER) && WINAPI_FAMILY == WINAPI_FAMILY_SERVER
# undef BOOST_PLAT_WINDOWS_SERVER
# define BOOST_PLAT_WINDOWS_SERVER BOOST_VERSION_NUMBER_AVAILABLE
#endif
#if BOOST_PLAT_WINDOWS_SERVER
# define BOOST_PLAT_WINDOWS_SERVER_AVAILABLE
# include <boost/predef/detail/platform_detected.h>
#endif
#define BOOST_PLAT_WINDOWS_SERVER_NAME "Windows Server"
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_WINDOWS_SERVER,BOOST_PLAT_WINDOWS_SERVER_NAME)

View File

@ -9,23 +9,30 @@ http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_PREDEF_PLAT_WINDOWS_STORE_H
#define BOOST_PREDEF_PLAT_WINDOWS_STORE_H
#include <boost/predef/version_number.h>
#include <boost/predef/make.h>
#include <boost/predef/os/windows.h>
#include <boost/predef/platform/windows_uwp.h>
#include <boost/predef/version_number.h>
/*`
[heading `BOOST_PLAT_WINDOWS_STORE`]
[@https://docs.microsoft.com/en-us/windows/uwp/get-started/universal-application-platform-guide UWP]
for Windows Store development.
[table
[[__predef_symbol__] [__predef_version__]]
[[`WINAPI_FAMILY == WINAPI_FAMILY_APP`] [__predef_detection__]]
]
[[`WINAPI_FAMILY == WINAPI_FAMILY_PC_APP`] [__predef_detection__]]
[[`WINAPI_FAMILY == WINAPI_FAMILY_APP` (deprecated)] [__predef_detection__]]
]
*/
#define BOOST_PLAT_WINDOWS_STORE BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if BOOST_OS_WINDOWS && defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP
#if BOOST_OS_WINDOWS && \
((defined(WINAPI_FAMILY_PC_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PC_APP) || \
(defined(WINAPI_FAMILY_APP) && WINAPI_FAMILY == WINAPI_FAMILY_APP))
# undef BOOST_PLAT_WINDOWS_STORE
# define BOOST_PLAT_WINDOWS_STORE BOOST_VERSION_NUMBER_AVAILABLE
#endif

View File

@ -0,0 +1,47 @@
/*
Copyright James E. King III, 2017
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)
*/
#ifndef BOOST_PREDEF_PLAT_WINDOWS_SYSTEM_H
#define BOOST_PREDEF_PLAT_WINDOWS_SYSTEM_H
#include <boost/predef/make.h>
#include <boost/predef/os/windows.h>
#include <boost/predef/platform/windows_uwp.h>
#include <boost/predef/version_number.h>
/*`
[heading `BOOST_PLAT_WINDOWS_SYSTEM`]
[@https://docs.microsoft.com/en-us/windows/uwp/get-started/universal-application-platform-guide UWP]
for Windows System development.
[table
[[__predef_symbol__] [__predef_version__]]
[[`WINAPI_FAMILY == WINAPI_FAMILY_SYSTEM`] [__predef_detection__]]
]
*/
#define BOOST_PLAT_WINDOWS_SYSTEM BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if BOOST_OS_WINDOWS && \
defined(WINAPI_FAMILY_SYSTEM) && WINAPI_FAMILY == WINAPI_FAMILY_SYSTEM
# undef BOOST_PLAT_WINDOWS_SYSTEM
# define BOOST_PLAT_WINDOWS_SYSTEM BOOST_VERSION_NUMBER_AVAILABLE
#endif
#if BOOST_PLAT_WINDOWS_SYSTEM
# define BOOST_PLAT_WINDOWS_SYSTEM_AVAILABLE
# include <boost/predef/detail/platform_detected.h>
#endif
#define BOOST_PLAT_WINDOWS_SYSTEM_NAME "Windows Drivers and Tools"
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_WINDOWS_SYSTEM,BOOST_PLAT_WINDOWS_SYSTEM_NAME)

View File

@ -0,0 +1,60 @@
/*
Copyright James E. King III, 2017
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)
*/
#ifndef BOOST_PREDEF_PLAT_WINDOWS_UWP_H
#define BOOST_PREDEF_PLAT_WINDOWS_UWP_H
#include <boost/predef/make.h>
#include <boost/predef/os/windows.h>
#include <boost/predef/version_number.h>
/*`
[heading `BOOST_PLAT_WINDOWS_UWP`]
[@http://docs.microsoft.com/windows/uwp/ Universal Windows Platform]
is available if the current development environment is capable of targeting
UWP development.
[table
[[__predef_symbol__] [__predef_version__]]
[[`__MINGW64_VERSION_MAJOR` from `_mingw.h`] [`>= 3`]]
[[`VER_PRODUCTBUILD` from `ntverp.h`] [`>= 9200`]]
]
*/
#define BOOST_PLAT_WINDOWS_UWP BOOST_VERSION_NUMBER_NOT_AVAILABLE
#define BOOST_PLAT_WINDOWS_SDK_VERSION BOOST_VERSION_NUMBER_NOT_AVAILABLE
#if BOOST_OS_WINDOWS
// MinGW (32-bit) has no ntverp.h header
#if !defined(__MINGW32__)
# include <ntverp.h>
# undef BOOST_PLAT_WINDOWS_SDK_VERSION
# define BOOST_PLAT_WINDOWS_SDK_VERSION BOOST_VERSION_NUMBER(0, 0, VER_PRODUCTBUILD)
#endif
// 9200 is Windows SDK 8.0 from ntverp.h which introduced family support
#if ((BOOST_PLAT_WINDOWS_SDK_VERSION >= BOOST_VERSION_NUMBER(0, 0, 9200)) || \
(defined(__MINGW64__) && __MINGW64_VERSION_MAJOR >= 3))
# undef BOOST_PLAT_WINDOWS_UWP
# define BOOST_PLAT_WINDOWS_UWP BOOST_VERSION_NUMBER_AVAILABLE
#endif
#endif
#if BOOST_PLAT_WINDOWS_UWP
# define BOOST_PLAT_WINDOWS_UWP_AVAILABLE
# include <boost/predef/detail/platform_detected.h>
# include <winapifamily.h> // Windows SDK
#endif
#define BOOST_PLAT_WINDOWS_UWP_NAME "Universal Windows Platform"
#endif
#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_PLAT_WINDOWS_UWP, BOOST_PLAT_WINDOWS_UWP_NAME)

View File

@ -10,6 +10,6 @@ http://www.boost.org/LICENSE_1_0.txt)
#include <boost/predef/version_number.h>
#define BOOST_PREDEF_VERSION BOOST_VERSION_NUMBER(1,5,0)
#define BOOST_PREDEF_VERSION BOOST_VERSION_NUMBER(1,10,0)
#endif

52
test/build.jam Executable file → Normal file
View File

@ -1,49 +1,26 @@
#!/usr/bin/env b2 -a --verbose-test
# Copyright Rene Rivera 2011-2016
# Copyright Rene Rivera 2011-2019
# 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)
import ../check/predef : require check : predef-require predef-check ;
import ../tools/check/predef : require check : predef-require predef-check ;
import path ;
local predef-include-root ;
local predef-dependency ;
local modular-predef-h = [ glob $(BOOST_PREDEF_ROOT)/include/boost/predef.h ] ;
local BOOST_RELEASE_LAYOUT ;
if ! $(modular-predef-h)
# This deals with the unfortunate aspect of a Boost monolithic release
# not having the modular include dirs. This is a kludge that just removes
# the direct depdndency to the header if it can't find it.
local PREDEF_H = $(BOOST_PREDEF_INCLUDE)/boost/predef.h ;
if ! [ path.exists $(PREDEF_H) ]
{
BOOST_RELEASE_LAYOUT = yes ;
PREDEF_H = ;
}
# When using modular layout, header files are not present in $root/boost
# unlink links are created, therefore instead of direct dependency on
# a header, we need to use dependency on metatarget.
if $(BOOST_RELEASE_LAYOUT)
{
predef-dependency = $(predef-include-root)/boost/predef.h ;
}
else if $(BOOST_PREDEF_ROOT)
{
predef-include-root = $(BOOST_PREDEF_ROOT)/include ;
predef-dependency = $(predef-include-root)/boost/predef.h ;
}
else if $(BOOST_MODULARLAYOUT)
{
predef-include-root = $(BOOST_ROOT) ;
predef-dependency = /boost//predef-headers ;
}
else
{
predef-dependency = $(predef-include-root)/boost/predef.h ;
}
project test
project
: requirements
<include>$(predef-include-root)
<include>$(BOOST_PREDEF_INCLUDE)
# Add explicit dependency since we don't have header scanner for
# .m and .mm files.
<dependency>$(predef-dependency)
<dependency>$(PREDEF_H)
;
using testing ;
@ -59,6 +36,11 @@ test-suite predef :
[ compile macos_vs_bsd.c : [ predef-require "BOOST_OS_MACOS" : cpp ] ]
[ run check_value.cpp : : : <test-info>always_show_run_output
[ predef-check "BOOST_COMP_CLANG > 0.0.0" "BOOST_OS_LINUX == 0" : : <cxxflags>-DCHECK_VALUE=true ] ]
[ run workaround.cpp ]
[ compile workaround_strict_config.cpp ]
[ run tested_at.cpp ]
[ compile-fail tested_at_outdated.cpp : <test-info>always_show_run_output ]
[ compile platform_windows.cpp ]
;
# Minimal testing done for predef for CI. Since

View File

@ -38,12 +38,16 @@ void test_BOOST_VERSION_NUMBER()
PREDEF_CHECK(BOOST_PREDEF_MAKE_0X_VRRPP000(0xFFFFF000) == BOOST_VERSION_NUMBER(0xF,0xFF,0xFF));
PREDEF_CHECK(BOOST_PREDEF_MAKE_0X_VVRRPP(0xFFFFFF) == BOOST_VERSION_NUMBER(0xFF,0xFF,0xFF));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VR0(980) == BOOST_VERSION_NUMBER(9,8,0));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VRP(999) == BOOST_VERSION_NUMBER(9,9,9));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VPPP(9999) == BOOST_VERSION_NUMBER(9,0,999));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VVRRPP(999999) == BOOST_VERSION_NUMBER(99,99,99));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VVRR(9999) == BOOST_VERSION_NUMBER(99,99,0));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VVRRP(98765) == BOOST_VERSION_NUMBER(98,76,5));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VRPP(9999) == BOOST_VERSION_NUMBER(9,9,99));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VRRPP(99999) == BOOST_VERSION_NUMBER(9,99,99));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VRPPPP(460002) == BOOST_VERSION_NUMBER(4,6,2));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VRPPPP(491000) == BOOST_VERSION_NUMBER(4,9,1000));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VRP000(999000) == BOOST_VERSION_NUMBER(9,9,9));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VRR000(999000) == BOOST_VERSION_NUMBER(9,99,0));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VVRR00PP00(2199009900u) == BOOST_VERSION_NUMBER(21,99,99));
@ -52,6 +56,8 @@ void test_BOOST_VERSION_NUMBER()
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VV00(9900) == BOOST_VERSION_NUMBER(99,00,00));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VVRR0PPPP(999909999) == BOOST_VERSION_NUMBER(99,99,9999));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VRR(999) == BOOST_VERSION_NUMBER(9,99,00));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VVRRPPP(903122) == BOOST_VERSION_NUMBER(9,3,122));
PREDEF_CHECK(BOOST_PREDEF_MAKE_10_VVRRPPP(1101002) == BOOST_VERSION_NUMBER(11,1,2));
PREDEF_CHECK(BOOST_PREDEF_MAKE_DATE(1971,1,1) == BOOST_VERSION_NUMBER(1,1,1));
PREDEF_CHECK(BOOST_PREDEF_MAKE_YYYYMMDD(19700101) == BOOST_VERSION_NUMBER(0,1,1));

177
test/platform_windows.cpp Normal file
View File

@ -0,0 +1,177 @@
/*
Copyright James E. King, III - 2017
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)
*/
#include <boost/predef/platform.h>
//
// This file is used to verify the BOOST_PLAT_WINDOWS_* logic.
//
// To exercise all of the combinations the CI build needs many
// jobs where it defines all the different possible WINAPI_FAMILY
// values on all supported platforms.
//
//
// UWP is available on Windows SDK 8.0 or later, or on MinGW-w64 major release 3 or later
//
#if (defined(__MINGW64__) && (__MINGW64_VERSION_MAJOR >= 3)) || (BOOST_PLAT_WINDOWS_SDK_VERSION >= 9200)
#if !BOOST_PLAT_WINDOWS_UWP
#error "BOOST_PLAT_WINDOWS_UWP should be available"
#endif
#else
#if BOOST_PLAT_WINDOWS_UWP
#error "BOOST_PLAT_WINDOWS_UWP should not be available"
#endif
#endif
#if !BOOST_PLAT_WINDOWS_UWP
//
// If BOOST_PLAT_WINDOWS_UWP is not available, none of the other BOOST_PLAT_WINDOWS_* are either
// except for BOOST_PLAT_WINDOWS_DESKTOP which is available for backwards compatibility.
//
#if BOOST_OS_WINDOWS && !BOOST_PLAT_WINDOWS_DESKTOP
#error "BOOST_PLAT_WINDOWS_DESKTOP should be available"
#endif
#if BOOST_PLAT_WINDOWS_PHONE
#error "BOOST_PLAT_WINDOWS_PHONE should not be available"
#endif
#if BOOST_PLAT_WINDOWS_RUNTIME /* deprecated */
#error "BOOST_PLAT_WINDOWS_RUNTIME should not be available"
#endif
#if BOOST_PLAT_WINDOWS_SERVER
#error "BOOST_PLAT_WINDOWS_SERVER should not be available"
#endif
#if BOOST_PLAT_WINDOWS_STORE
#error "BOOST_PLAT_WINDOWS_STORE should not be available"
#endif
#if BOOST_PLAT_WINDOWS_SYSTEM
#error "BOOST_PLAT_WINDOWS_SYSTEM should not be available"
#endif
#else // !BOOST_PLAT_WINDOWS_UWP
//
// If BOOST_PLAT_WINDOWS_UWP is available, and the SDK supports a particular family,
// and if WINAPI_FAMILY is set to it, then it and only it should be available.
//
#if !defined(WINAPI_FAMILY)
#error "windows_uwp.h should have included <winapifamily.h> which should have defined supported families"
#endif
#if WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP
#if !BOOST_PLAT_WINDOWS_DESKTOP
#error "BOOST_PLAT_WINDOWS_DESKTOP should be available"
#endif
#if BOOST_PLAT_WINDOWS_PHONE
#error "BOOST_PLAT_WINDOWS_PHONE should not be available"
#endif
#if BOOST_PLAT_WINDOWS_RUNTIME /* deprecated */
#error "BOOST_PLAT_WINDOWS_RUNTIME should not be available"
#endif
#if BOOST_PLAT_WINDOWS_SERVER
#error "BOOST_PLAT_WINDOWS_SERVER should not be available"
#endif
#if BOOST_PLAT_WINDOWS_STORE
#error "BOOST_PLAT_WINDOWS_STORE should not be available"
#endif
#if BOOST_PLAT_WINDOWS_SYSTEM
#error "BOOST_PLAT_WINDOWS_SYSTEM should not be available"
#endif
#endif
#if defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
#if BOOST_PLAT_WINDOWS_DESKTOP
#error "BOOST_PLAT_WINDOWS_DESKTOP should not be available"
#endif
#if !BOOST_PLAT_WINDOWS_PHONE
#error "BOOST_PLAT_WINDOWS_PHONE should be available"
#endif
#if !BOOST_PLAT_WINDOWS_RUNTIME /* deprecated */
#error "BOOST_PLAT_WINDOWS_RUNTIME should be available"
#endif
#if BOOST_PLAT_WINDOWS_SERVER
#error "BOOST_PLAT_WINDOWS_SERVER should not be available"
#endif
#if BOOST_PLAT_WINDOWS_STORE
#error "BOOST_PLAT_WINDOWS_STORE should not be available"
#endif
#if BOOST_PLAT_WINDOWS_SYSTEM
#error "BOOST_PLAT_WINDOWS_SYSTEM should not be available"
#endif
#endif
#if defined(WINAPI_FAMILY_SERVER_APP) && WINAPI_FAMILY == WINAPI_FAMILY_SERVER_APP
#if BOOST_PLAT_WINDOWS_DESKTOP
#error "BOOST_PLAT_WINDOWS_DESKTOP should not be available"
#endif
#if BOOST_PLAT_WINDOWS_PHONE
#error "BOOST_PLAT_WINDOWS_PHONE should not be available"
#endif
#if BOOST_PLAT_WINDOWS_RUNTIME /* deprecated */
#error "BOOST_PLAT_WINDOWS_RUNTIME should not be available"
#endif
#if !BOOST_PLAT_WINDOWS_SERVER
#error "BOOST_PLAT_WINDOWS_SERVER should be available"
#endif
#if BOOST_PLAT_WINDOWS_STORE
#error "BOOST_PLAT_WINDOWS_STORE should not be available"
#endif
#if BOOST_PLAT_WINDOWS_SYSTEM
#error "BOOST_PLAT_WINDOWS_SYSTEM should not be available"
#endif
#endif
// Store is WINAPI_FAMILY_APP in MinGW-w64 and in Windows SDK 8.0
// then in Windows SDK 8.1 it was deprecated in favor of WINAPI_FAMILY_PC_APP
#if ((defined(WINAPI_FAMILY_PC_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PC_APP) || \
(defined(WINAPI_FAMILY_APP) && WINAPI_FAMILY == WINAPI_FAMILY_APP))
#if BOOST_PLAT_WINDOWS_DESKTOP
#error "BOOST_PLAT_WINDOWS_DESKTOP should not be available"
#endif
#if BOOST_PLAT_WINDOWS_PHONE
#error "BOOST_PLAT_WINDOWS_PHONE should not be available"
#endif
#if !BOOST_PLAT_WINDOWS_RUNTIME /* deprecated */
#error "BOOST_PLAT_WINDOWS_RUNTIME should be available"
#endif
#if BOOST_PLAT_WINDOWS_SERVER
#error "BOOST_PLAT_WINDOWS_SERVER should not be available"
#endif
#if !BOOST_PLAT_WINDOWS_STORE
#error "BOOST_PLAT_WINDOWS_STORE should be available"
#endif
#if BOOST_PLAT_WINDOWS_SYSTEM
#error "BOOST_PLAT_WINDOWS_SYSTEM should not be available"
#endif
#endif
#if defined(WINAPI_FAMILY_SYSTEM_APP) && WINAPI_FAMILY == WINAPI_FAMILY_SYSTEM_APP
#if BOOST_PLAT_WINDOWS_DESKTOP
#error "BOOST_PLAT_WINDOWS_DESKTOP should not be available"
#endif
#if BOOST_PLAT_WINDOWS_PHONE
#error "BOOST_PLAT_WINDOWS_PHONE should not be available"
#endif
#if BOOST_PLAT_WINDOWS_RUNTIME /* deprecated */
#error "BOOST_PLAT_WINDOWS_RUNTIME should not be available"
#endif
#if BOOST_PLAT_WINDOWS_SERVER
#error "BOOST_PLAT_WINDOWS_SERVER should not be available"
#endif
#if BOOST_PLAT_WINDOWS_STORE
#error "BOOST_PLAT_WINDOWS_STORE should not be available"
#endif
#if !BOOST_PLAT_WINDOWS_SYSTEM
#error "BOOST_PLAT_WINDOWS_SYSTEM should be available"
#endif
#endif
#endif // !BOOST_PLAT_WINDOWS_UWP

View File

@ -0,0 +1,29 @@
# Copyright Mike Dev 2018
# Copyright Rene Rivera 2018
# 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
# NOTE:
# This does NOT run the unit tests for Boost.Predef.
# It only tests, if the CMakeLists.txt file in predef's
# root directory works as expected (i.e. it provides the
# target Boost::predef which in turn provides the
# correct include directory )
# We have very simple cmake requirements we we still require the new style
# declarative targets.
cmake_minimum_required( VERSION 3.0 )
project( PredefCMakeSelfTest )
# Process cmake file at root of library and use
# ${CMAKE_CURRENT_BINARY_DIR}/libs/predef as workspace
add_subdirectory( ../.. ${CMAKE_CURRENT_BINARY_DIR}/libs/predef )
# The executable just includes a predef header to verify that it's used.
add_executable( predef_cmake_test_prj main.cpp )
# The executable needs to "use" the Predef "library" to get the usage
# requirements added to the executable build.
target_link_libraries( predef_cmake_test_prj Boost::predef )

19
test/test_cmake/main.cpp Normal file
View File

@ -0,0 +1,19 @@
/*
Copyright Mike Dev 2018
Copyright 2018 Rene Rivera
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
*/
/*
Dummy executable, just to make sure that we can find the Boost Predef header
files.
*/
#include <boost/predef.h>
int main()
{
return 0;
}

62
test/tested_at.cpp Normal file
View File

@ -0,0 +1,62 @@
/*
Copyright Rene Rivera 2011-2017
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)
*/
#include <boost/predef/version_number.h>
#include <boost/predef/other/workaround.h>
#include <exception>
#include <vector>
#include <string>
#include <iostream>
namespace
{
struct test_info
{
std::string value;
bool passed;
test_info(std::string const & v, bool p) : value(v), passed(p) {}
test_info(test_info const & o) : value(o.value), passed(o.passed) {}
};
std::vector<test_info> test_results;
}
#define PREDEF_CHECK(X) test_results.push_back(test_info(#X,(X)))
void test_BOOST_PREDEF_TESTED_AT()
{
PREDEF_CHECK(BOOST_PREDEF_TESTED_AT(BOOST_VERSION_NUMBER(15,15,15),0xF,0xF,0xF));
PREDEF_CHECK(BOOST_PREDEF_TESTED_AT(BOOST_VERSION_NUMBER(1,0,0),1,0,0));
PREDEF_CHECK(BOOST_PREDEF_TESTED_AT(BOOST_VERSION_NUMBER(0,9,0),1,0,0));
PREDEF_CHECK(BOOST_PREDEF_TESTED_AT(BOOST_VERSION_NUMBER(2,0,0),1,0,0));
PREDEF_CHECK(!BOOST_PREDEF_TESTED_AT(BOOST_VERSION_NUMBER_NOT_AVAILABLE,1,0,0));
}
int main()
{
test_BOOST_PREDEF_TESTED_AT();
unsigned fail_count = 0;
std::vector<test_info>::iterator i = test_results.begin();
std::vector<test_info>::iterator e = test_results.end();
for (; i != e; ++i)
{
std::cout
<< (i->passed ? "[passed]" : "[failed]")
<< " " << i->value
<< std::endl;
fail_count += i->passed ? 0 : 1;
}
std::cout
<< std::endl
<< "TOTAL: "
<< "passed " << (test_results.size()-fail_count) << ", "
<< "failed " << (fail_count) << ", "
<< "of " << (test_results.size())
<< std::endl;
return fail_count;
}

View File

@ -0,0 +1,18 @@
/*
Copyright Rene Rivera 2011-2017
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)
*/
#include <boost/predef/version_number.h>
#define BOOST_DETECT_OUTDATED_WORKAROUNDS
#include <boost/predef/other/workaround.h>
int main()
{
#if BOOST_PREDEF_TESTED_AT(BOOST_VERSION_NUMBER(2,0,0),1,0,0)
return 1;
#else
return 0;
#endif
}

62
test/workaround.cpp Normal file
View File

@ -0,0 +1,62 @@
/*
Copyright Rene Rivera 2011-2017
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)
*/
#include <boost/predef/version_number.h>
#include <boost/predef/other/workaround.h>
#include <exception>
#include <vector>
#include <string>
#include <iostream>
namespace
{
struct test_info
{
std::string value;
bool passed;
test_info(std::string const & v, bool p) : value(v), passed(p) {}
test_info(test_info const & o) : value(o.value), passed(o.passed) {}
};
std::vector<test_info> test_results;
}
#define PREDEF_CHECK(X) test_results.push_back(test_info(#X,(X)))
void test_BOOST_PREDEF_WORKAROUND()
{
PREDEF_CHECK(BOOST_PREDEF_WORKAROUND(BOOST_VERSION_NUMBER(15,15,15),==,0xF,0xF,0xF));
PREDEF_CHECK(BOOST_PREDEF_WORKAROUND(BOOST_VERSION_NUMBER(0,9,0),<,1,0,0));
PREDEF_CHECK(BOOST_PREDEF_WORKAROUND(BOOST_VERSION_NUMBER(0,9,0),!=,1,0,0));
PREDEF_CHECK(BOOST_PREDEF_WORKAROUND(BOOST_VERSION_NUMBER_MIN,<,1,0,0));
PREDEF_CHECK(BOOST_PREDEF_WORKAROUND(BOOST_VERSION_NUMBER_MIN,>,0,0,0));
}
int main()
{
test_BOOST_PREDEF_WORKAROUND();
unsigned fail_count = 0;
std::vector<test_info>::iterator i = test_results.begin();
std::vector<test_info>::iterator e = test_results.end();
for (; i != e; ++i)
{
std::cout
<< (i->passed ? "[passed]" : "[failed]")
<< " " << i->value
<< std::endl;
fail_count += i->passed ? 0 : 1;
}
std::cout
<< std::endl
<< "TOTAL: "
<< "passed " << (test_results.size()-fail_count) << ", "
<< "failed " << (fail_count) << ", "
<< "of " << (test_results.size())
<< std::endl;
return fail_count;
}

View File

@ -0,0 +1,17 @@
/*
Copyright Rene Rivera 2011-2017
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)
*/
#include <boost/predef/version_number.h>
#define BOOST_STRICT_CONFIG
#include <boost/predef/other/workaround.h>
int main()
{
#if BOOST_PREDEF_WORKAROUND(BOOST_VERSION_NUMBER_AVAILABLE,==,0,0,1)
fail();
#endif
return 0;
}

View File

@ -43,7 +43,7 @@ rule check ( expressions + : language ? : true-properties * : false-properties *
else
{
# Create the check run if we don't have one yet.
local key = [ MD5 $(language)::$(expression) ] ;
local key = [ MD5 "$(language)::$(expression)" ] ;
if ! ( $(key) in $(_checks_) )
{
_checks_ += $(key) ;
@ -102,8 +102,8 @@ local rule change_term_to_def ( term )
if $(parts[3])
{
local version_number = [ regex.split $(parts[3]) "[.]" ] ;
if ! $(version_number[3]) { version_number += "0" ; }
if ! $(version_number[2]) { version_number += "0" ; }
if ! $(version_number[3]) { version_number += "0" ; }
parts = $(parts[1-2]) BOOST_VERSION_NUMBER($(version_number:J=",")) ;
}
return <define>CHECK=\"$(parts:J=" ")\" ;

428
tools/ci/build_log.py Normal file
View File

@ -0,0 +1,428 @@
#!/usr/bin/env python
# Copyright 2008 Rene Rivera
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
import re
import optparse
import time
import xml.dom.minidom
import xml.dom.pulldom
from xml.sax.saxutils import unescape, escape
import os.path
from pprint import pprint
from __builtin__ import exit
class BuildOutputXMLParsing(object):
'''
XML parsing utilities for dealing with the Boost Build output
XML format.
'''
def get_child_data( self, root, tag = None, id = None, name = None, strip = False, default = None ):
return self.get_data(self.get_child(root,tag=tag,id=id,name=name),strip=strip,default=default)
def get_data( self, node, strip = False, default = None ):
data = None
if node:
data_node = None
if not data_node:
data_node = self.get_child(node,tag='#text')
if not data_node:
data_node = self.get_child(node,tag='#cdata-section')
data = ""
while data_node:
data += data_node.data
data_node = data_node.nextSibling
if data_node:
if data_node.nodeName != '#text' \
and data_node.nodeName != '#cdata-section':
data_node = None
if not data:
data = default
else:
if strip:
data = data.strip()
return data
def get_child( self, root, tag = None, id = None, name = None, type = None ):
return self.get_sibling(root.firstChild,tag=tag,id=id,name=name,type=type)
def get_sibling( self, sibling, tag = None, id = None, name = None, type = None ):
n = sibling
while n:
found = True
if type and found:
found = found and type == n.nodeType
if tag and found:
found = found and tag == n.nodeName
if (id or name) and found:
found = found and n.nodeType == xml.dom.Node.ELEMENT_NODE
if id and found:
if n.hasAttribute('id'):
found = found and n.getAttribute('id') == id
else:
found = found and n.hasAttribute('id') and n.getAttribute('id') == id
if name and found:
found = found and n.hasAttribute('name') and n.getAttribute('name') == name
if found:
return n
n = n.nextSibling
return None
class BuildOutputProcessor(BuildOutputXMLParsing):
def __init__(self, inputs):
self.test = {}
self.target_to_test = {}
self.target = {}
self.parent = {}
self.timestamps = []
for input in inputs:
self.add_input(input)
def add_input(self, input):
'''
Add a single build XML output file to our data.
'''
events = xml.dom.pulldom.parse(input)
context = []
for (event,node) in events:
if event == xml.dom.pulldom.START_ELEMENT:
context.append(node)
if node.nodeType == xml.dom.Node.ELEMENT_NODE:
x_f = self.x_name_(*context)
if x_f:
events.expandNode(node)
# expanding eats the end element, hence walking us out one level
context.pop()
# call handler
(x_f[1])(node)
elif event == xml.dom.pulldom.END_ELEMENT:
context.pop()
def x_name_(self, *context, **kwargs):
node = None
names = [ ]
for c in context:
if c:
if not isinstance(c,xml.dom.Node):
suffix = '_'+c.replace('-','_').replace('#','_')
else:
suffix = '_'+c.nodeName.replace('-','_').replace('#','_')
node = c
names.append('x')
names = map(lambda x: x+suffix,names)
if node:
for name in names:
if hasattr(self,name):
return (name,getattr(self,name))
return None
def x_build_test(self, node):
'''
Records the initial test information that will eventually
get expanded as we process the rest of the results.
'''
test_node = node
test_name = test_node.getAttribute('name')
test_target = self.get_child_data(test_node,tag='target',strip=True)
## print ">>> %s %s" %(test_name,test_target)
self.test[test_name] = {
'library' : "/".join(test_name.split('/')[0:-1]),
'test-name' : test_name.split('/')[-1],
'test-type' : test_node.getAttribute('type').lower(),
'test-program' : self.get_child_data(test_node,tag='source',strip=True),
'target' : test_target,
'info' : self.get_child_data(test_node,tag='info',strip=True),
'dependencies' : [],
'actions' : [],
}
# Add a lookup for the test given the test target.
self.target_to_test[self.test[test_name]['target']] = test_name
return None
def x_build_targets_target( self, node ):
'''
Process the target dependency DAG into an ancestry tree so we can look up
which top-level library and test targets specific build actions correspond to.
'''
target_node = node
name = self.get_child_data(target_node,tag='name',strip=True)
path = self.get_child_data(target_node,tag='path',strip=True)
jam_target = self.get_child_data(target_node,tag='jam-target',strip=True)
#~ Map for jam targets to virtual targets.
self.target[jam_target] = {
'name' : name,
'path' : path
}
#~ Create the ancestry.
dep_node = self.get_child(self.get_child(target_node,tag='dependencies'),tag='dependency')
while dep_node:
child = self.get_data(dep_node,strip=True)
child_jam_target = '<p%s>%s' % (path,child.split('//',1)[1])
self.parent[child_jam_target] = jam_target
dep_node = self.get_sibling(dep_node.nextSibling,tag='dependency')
return None
def x_build_action( self, node ):
'''
Given a build action log, process into the corresponding test log and
specific test log sub-part.
'''
action_node = node
name = self.get_child(action_node,tag='name')
if name:
name = self.get_data(name)
#~ Based on the action, we decide what sub-section the log
#~ should go into.
action_type = None
if re.match('[^%]+%[^.]+[.](compile)',name):
action_type = 'compile'
elif re.match('[^%]+%[^.]+[.](link|archive)',name):
action_type = 'link'
elif re.match('[^%]+%testing[.](capture-output)',name):
action_type = 'run'
elif re.match('[^%]+%testing[.](expect-failure|expect-success)',name):
action_type = 'result'
else:
# TODO: Enable to see what other actions can be included in the test results.
# action_type = None
action_type = 'other'
#~ print "+ [%s] %s %s :: %s" %(action_type,name,'','')
if action_type:
#~ Get the corresponding test.
(target,test) = self.get_test(action_node,type=action_type)
#~ Skip action that have no corresponding test as they are
#~ regular build actions and don't need to show up in the
#~ regression results.
if not test:
##print "??? [%s] %s %s :: %s" %(action_type,name,target,test)
return None
##print "+++ [%s] %s %s :: %s" %(action_type,name,target,test)
#~ Collect some basic info about the action.
action = {
'command' : self.get_action_command(action_node,action_type),
'output' : self.get_action_output(action_node,action_type),
'info' : self.get_action_info(action_node,action_type)
}
#~ For the test result status we find the appropriate node
#~ based on the type of test. Then adjust the result status
#~ accordingly. This makes the result status reflect the
#~ expectation as the result pages post processing does not
#~ account for this inversion.
action['type'] = action_type
if action_type == 'result':
if re.match(r'^compile',test['test-type']):
action['type'] = 'compile'
elif re.match(r'^link',test['test-type']):
action['type'] = 'link'
elif re.match(r'^run',test['test-type']):
action['type'] = 'run'
#~ The result sub-part we will add this result to.
if action_node.getAttribute('status') == '0':
action['result'] = 'succeed'
else:
action['result'] = 'fail'
# Add the action to the test.
test['actions'].append(action)
# Set the test result if this is the result action for the test.
if action_type == 'result':
test['result'] = action['result']
return None
def x_build_timestamp( self, node ):
'''
The time-stamp goes to the corresponding attribute in the result.
'''
self.timestamps.append(self.get_data(node).strip())
return None
def get_test( self, node, type = None ):
'''
Find the test corresponding to an action. For testing targets these
are the ones pre-declared in the --dump-test option. For libraries
we create a dummy test as needed.
'''
jam_target = self.get_child_data(node,tag='jam-target')
base = self.target[jam_target]['name']
target = jam_target
while target in self.parent:
target = self.parent[target]
#~ print "--- TEST: %s ==> %s" %(jam_target,target)
#~ main-target-type is a precise indicator of what the build target is
#~ originally meant to be.
#main_type = self.get_child_data(self.get_child(node,tag='properties'),
# name='main-target-type',strip=True)
main_type = None
if main_type == 'LIB' and type:
lib = self.target[target]['name']
if not lib in self.test:
self.test[lib] = {
'library' : re.search(r'libs/([^/]+)',lib).group(1),
'test-name' : os.path.basename(lib),
'test-type' : 'lib',
'test-program' : os.path.basename(lib),
'target' : lib
}
test = self.test[lib]
else:
target_name_ = self.target[target]['name']
if self.target_to_test.has_key(target_name_):
test = self.test[self.target_to_test[target_name_]]
else:
test = None
return (base,test)
#~ The command executed for the action. For run actions we omit the command
#~ as it's just noise.
def get_action_command( self, action_node, action_type ):
if action_type != 'run':
return self.get_child_data(action_node,tag='command')
else:
return ''
#~ The command output.
def get_action_output( self, action_node, action_type ):
return self.get_child_data(action_node,tag='output',default='')
#~ Some basic info about the action.
def get_action_info( self, action_node, action_type ):
info = {}
#~ The jam action and target.
info['name'] = self.get_child_data(action_node,tag='name')
info['path'] = self.get_child_data(action_node,tag='path')
#~ The timing of the action.
info['time-start'] = action_node.getAttribute('start')
info['time-end'] = action_node.getAttribute('end')
info['time-user'] = action_node.getAttribute('user')
info['time-system'] = action_node.getAttribute('system')
#~ Testing properties.
test_info_prop = self.get_child_data(self.get_child(action_node,tag='properties'),name='test-info')
info['always_show_run_output'] = test_info_prop == 'always_show_run_output'
#~ And for compiles some context that may be hidden if using response files.
if action_type == 'compile':
info['define'] = []
define = self.get_child(self.get_child(action_node,tag='properties'),name='define')
while define:
info['define'].append(self.get_data(define,strip=True))
define = self.get_sibling(define.nextSibling,name='define')
return info
class BuildConsoleSummaryReport(object):
HEADER = '\033[35m\033[1m'
INFO = '\033[34m'
OK = '\033[32m'
WARNING = '\033[33m'
FAIL = '\033[31m'
ENDC = '\033[0m'
def __init__(self, bop, opt):
self.bop = bop
def generate(self):
self.summary_info = {
'total' : 0,
'success' : 0,
'failed' : [],
}
self.header_print("======================================================================")
self.print_test_log()
self.print_summary()
self.header_print("======================================================================")
@property
def failed(self):
return len(self.summary_info['failed']) > 0
def print_test_log(self):
self.header_print("Tests run..")
self.header_print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
for k in sorted(self.bop.test.keys()):
test = self.bop.test[k]
if len(test['actions']) > 0:
self.summary_info['total'] += 1
##print ">>>> {0}".format(test['test-name'])
if 'result' in test:
succeed = test['result'] == 'succeed'
else:
succeed = test['actions'][-1]['result'] == 'succeed'
if succeed:
self.summary_info['success'] += 1
else:
self.summary_info['failed'].append(test)
if succeed:
self.ok_print("[PASS] {0}",k)
else:
self.fail_print("[FAIL] {0}",k)
for action in test['actions']:
self.print_action(succeed, action)
def print_action(self, test_succeed, action):
'''
Print the detailed info of failed or always print tests.
'''
#self.info_print(">>> {0}",action.keys())
if not test_succeed or action['info']['always_show_run_output']:
output = action['output'].strip()
if output != "":
p = self.fail_print if action['result'] == 'fail' else self.p_print
self.info_print("")
self.info_print("({0}) {1}",action['info']['name'],action['info']['path'])
p("")
p("{0}",action['command'].strip())
p("")
for line in output.splitlines():
p("{0}",line.encode('utf-8'))
def print_summary(self):
self.header_print("")
self.header_print("Testing summary..")
self.header_print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
self.p_print("Total: {0}",self.summary_info['total'])
self.p_print("Success: {0}",self.summary_info['success'])
if self.failed:
self.fail_print("Failed: {0}",len(self.summary_info['failed']))
for test in self.summary_info['failed']:
self.fail_print(" {0}/{1}",test['library'],test['test-name'])
def p_print(self, format, *args, **kargs):
print format.format(*args,**kargs)
def info_print(self, format, *args, **kargs):
print self.INFO+format.format(*args,**kargs)+self.ENDC
def header_print(self, format, *args, **kargs):
print self.HEADER+format.format(*args,**kargs)+self.ENDC
def ok_print(self, format, *args, **kargs):
print self.OK+format.format(*args,**kargs)+self.ENDC
def warn_print(self, format, *args, **kargs):
print self.WARNING+format.format(*args,**kargs)+self.ENDC
def fail_print(self, format, *args, **kargs):
print self.FAIL+format.format(*args,**kargs)+self.ENDC
class Main(object):
def __init__(self,args=None):
op = optparse.OptionParser(
usage="%prog [options] input+")
op.add_option( '--output',
help="type of output to generate" )
( opt, inputs ) = op.parse_args(args)
bop = BuildOutputProcessor(inputs)
output = None
if opt.output == 'console':
output = BuildConsoleSummaryReport(bop, opt)
if output:
output.generate()
self.failed = output.failed
if __name__ == '__main__':
m = Main()
if m.failed:
exit(-1)

887
tools/ci/common.py Normal file
View File

@ -0,0 +1,887 @@
#!/usr/bin/env python
# Copyright Rene Rivera 2016
#
# 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)
import sys
import inspect
import optparse
import os.path
import string
import time
import subprocess
import codecs
import shutil
import threading
toolset_info = {
'clang-3.4' : {
'ppa' : ["ppa:h-rayflood/llvm"],
'package' : 'clang-3.4',
'command' : 'clang++-3.4',
'toolset' : 'clang',
'version' : ''
},
'clang-3.5' : {
'ppa' : ["ppa:h-rayflood/llvm"],
'package' : 'clang-3.5',
'command' : 'clang++-3.5',
'toolset' : 'clang',
'version' : ''
},
'clang-3.6' : {
'ppa' : ["ppa:h-rayflood/llvm"],
'package' : 'clang-3.6',
'command' : 'clang++-3.6',
'toolset' : 'clang',
'version' : ''
},
'clang-3.7' : {
'deb' : ["http://apt.llvm.org/trusty/","llvm-toolchain-trusty-3.7","main"],
'apt-key' : ['http://apt.llvm.org/llvm-snapshot.gpg.key'],
'package' : 'clang-3.7',
'command' : 'clang++-3.7',
'toolset' : 'clang',
'version' : ''
},
'clang-3.8' : {
'deb' : ["http://apt.llvm.org/trusty/","llvm-toolchain-trusty-3.8","main"],
'apt-key' : ['http://apt.llvm.org/llvm-snapshot.gpg.key'],
'package' : 'clang-3.8',
'command' : 'clang++-3.8',
'toolset' : 'clang',
'version' : ''
},
'clang-3.9' : {
'deb' : ["http://apt.llvm.org/trusty/","llvm-toolchain-trusty-3.9","main"],
'apt-key' : ['http://apt.llvm.org/llvm-snapshot.gpg.key'],
'package' : 'clang-3.9',
'command' : 'clang++-3.9',
'toolset' : 'clang',
'version' : ''
},
'clang-4.0' : {
'deb' : ["http://apt.llvm.org/trusty/","llvm-toolchain-trusty-4.0","main"],
'apt-key' : ['http://apt.llvm.org/llvm-snapshot.gpg.key'],
'package' : 'clang-4.0',
'command' : 'clang++-4.0',
'toolset' : 'clang',
'version' : ''
},
'clang-5.0' : {
'deb' : ["http://apt.llvm.org/trusty/","llvm-toolchain-trusty-5.0","main"],
'apt-key' : ['http://apt.llvm.org/llvm-snapshot.gpg.key'],
'package' : 'clang-5.0',
'command' : 'clang++-5.0',
'toolset' : 'clang',
'version' : ''
},
'clang-6.0' : {
'deb' : ["http://apt.llvm.org/trusty/","llvm-toolchain-trusty-6.0","main"],
'apt-key' : ['http://apt.llvm.org/llvm-snapshot.gpg.key'],
'package' : 'clang-6.0',
'command' : 'clang++-6.0',
'toolset' : 'clang',
'version' : ''
},
'gcc-4.7' : {
'ppa' : ["ppa:ubuntu-toolchain-r/test"],
'package' : 'g++-4.7',
'command' : 'g++-4.7',
'toolset' : 'gcc',
'version' : ''
},
'gcc-4.8' : {
'bin' : 'gcc-4.8',
'ppa' : ["ppa:ubuntu-toolchain-r/test"],
'package' : 'g++-4.8',
'command' : 'g++-4.8',
'toolset' : 'gcc',
'version' : ''
},
'gcc-4.9' : {
'ppa' : ["ppa:ubuntu-toolchain-r/test"],
'package' : 'g++-4.9',
'command' : 'g++-4.9',
'toolset' : 'gcc',
'version' : ''
},
'gcc-5.1' : {
'ppa' : ["ppa:ubuntu-toolchain-r/test"],
'package' : 'g++-5',
'command' : 'g++-5',
'toolset' : 'gcc',
'version' : ''
},
'gcc-5' : {
'ppa' : ["ppa:ubuntu-toolchain-r/test"],
'package' : 'g++-5',
'command' : 'g++-5',
'toolset' : 'gcc',
'version' : ''
},
'gcc-6' : {
'ppa' : ["ppa:ubuntu-toolchain-r/test"],
'package' : 'g++-6',
'command' : 'g++-6',
'toolset' : 'gcc',
'version' : ''
},
'gcc-7' : {
'ppa' : ["ppa:ubuntu-toolchain-r/test"],
'package' : 'g++-7',
'command' : 'g++-7',
'toolset' : 'gcc',
'version' : ''
},
'gcc-8' : {
'ppa' : ["ppa:ubuntu-toolchain-r/test"],
'package' : 'g++-8',
'command' : 'g++-8',
'toolset' : 'gcc',
'version' : ''
},
'mingw-5' : {
'toolset' : 'gcc',
'command' : 'C:\\\\MinGW\\\\bin\\\\g++.exe',
'version' : ''
},
'mingw64-6' : {
'toolset' : 'gcc',
'command' : 'C:\\\\mingw-w64\\\\x86_64-6.3.0-posix-seh-rt_v5-rev1\\\\mingw64\\\\bin\\\\g++.exe',
'version' : ''
},
'vs-2008' : {
'toolset' : 'msvc',
'command' : '',
'version' : '9.0'
},
'vs-2010' : {
'toolset' : 'msvc',
'command' : '',
'version' : '10.0'
},
'vs-2012' : {
'toolset' : 'msvc',
'command' : '',
'version' : '11.0'
},
'vs-2013' : {
'toolset' : 'msvc',
'command' : '',
'version' : '12.0'
},
'vs-2015' : {
'toolset' : 'msvc',
'command' : '',
'version' : '14.0'
},
'vs-2017' : {
'toolset' : 'msvc',
'command' : '',
'version' : '14.1'
},
'xcode-6.1' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-6.2' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-6.3' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-6.4' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-7.0' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-7.1' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-7.2' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-7.3' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-8.0' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-8.1' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-8.2' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-8.3' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-9.0' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-9.1' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-9.2' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-9.3' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-9.4' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
'xcode-10.0' : {
'command' : 'clang++',
'toolset' : 'clang',
'version' : ''
},
}
class SystemCallError(Exception):
def __init__(self, command, result):
self.command = command
self.result = result
def __str__(self, *args, **kwargs):
return "'%s' ==> %s"%("' '".join(self.command), self.result)
class utils:
call_stats = []
@staticmethod
def call(*command, **kargs):
utils.log( "%s> '%s'"%(os.getcwd(), "' '".join(command)) )
t = time.time()
result = subprocess.call(command, **kargs)
t = time.time()-t
if result != 0:
print "Failed: '%s' ERROR = %s"%("' '".join(command), result)
utils.call_stats.append((t,os.getcwd(),command,result))
utils.log( "%s> '%s' execution time %s seconds"%(os.getcwd(), "' '".join(command), t) )
return result
@staticmethod
def print_call_stats():
utils.log("================================================================================")
for j in sorted(utils.call_stats, reverse=True):
utils.log("{:>12.4f}\t{}> {} ==> {}".format(*j))
utils.log("================================================================================")
@staticmethod
def check_call(*command, **kargs):
cwd = os.getcwd()
result = utils.call(*command, **kargs)
if result != 0:
raise(SystemCallError([cwd].extend(command), result))
@staticmethod
def makedirs( path ):
if not os.path.exists( path ):
os.makedirs( path )
@staticmethod
def log_level():
frames = inspect.stack()
level = 0
for i in frames[ 3: ]:
if i[0].f_locals.has_key( '__log__' ):
level = level + i[0].f_locals[ '__log__' ]
return level
@staticmethod
def log( message ):
sys.stdout.flush()
sys.stderr.flush()
sys.stderr.write( '# ' + ' ' * utils.log_level() + message + '\n' )
sys.stderr.flush()
@staticmethod
def rmtree(path):
if os.path.exists( path ):
#~ shutil.rmtree( unicode( path ) )
if sys.platform == 'win32':
os.system( 'del /f /s /q "%s" >nul 2>&1' % path )
shutil.rmtree( unicode( path ) )
else:
os.system( 'rm -f -r "%s"' % path )
@staticmethod
def retry( f, max_attempts=5, sleep_secs=10 ):
for attempts in range( max_attempts, -1, -1 ):
try:
return f()
except Exception, msg:
utils.log( '%s failed with message "%s"' % ( f.__name__, msg ) )
if attempts == 0:
utils.log( 'Giving up.' )
raise
utils.log( 'Retrying (%d more attempts).' % attempts )
time.sleep( sleep_secs )
@staticmethod
def web_get( source_url, destination_file, proxy = None ):
import urllib
proxies = None
if proxy is not None:
proxies = {
'https' : proxy,
'http' : proxy
}
src = urllib.urlopen( source_url, proxies = proxies )
f = open( destination_file, 'wb' )
while True:
data = src.read( 16*1024 )
if len( data ) == 0: break
f.write( data )
f.close()
src.close()
@staticmethod
def unpack_archive( archive_path ):
utils.log( 'Unpacking archive ("%s")...' % archive_path )
archive_name = os.path.basename( archive_path )
extension = archive_name[ archive_name.find( '.' ) : ]
if extension in ( ".tar.gz", ".tar.bz2" ):
import tarfile
import stat
mode = os.path.splitext( extension )[1][1:]
tar = tarfile.open( archive_path, 'r:%s' % mode )
for tarinfo in tar:
tar.extract( tarinfo )
if sys.platform == 'win32' and not tarinfo.isdir():
# workaround what appears to be a Win32-specific bug in 'tarfile'
# (modification times for extracted files are not set properly)
f = os.path.join( os.curdir, tarinfo.name )
os.chmod( f, stat.S_IWRITE )
os.utime( f, ( tarinfo.mtime, tarinfo.mtime ) )
tar.close()
elif extension in ( ".zip" ):
import zipfile
z = zipfile.ZipFile( archive_path, 'r', zipfile.ZIP_DEFLATED )
for f in z.infolist():
destination_file_path = os.path.join( os.curdir, f.filename )
if destination_file_path[-1] == "/": # directory
if not os.path.exists( destination_file_path ):
os.makedirs( destination_file_path )
else: # file
result = open( destination_file_path, 'wb' )
result.write( z.read( f.filename ) )
result.close()
z.close()
else:
raise 'Do not know how to unpack archives with extension \"%s\"' % extension
@staticmethod
def make_file(filename, *text):
text = string.join( text, '\n' )
with codecs.open( filename, 'w', 'utf-8' ) as f:
f.write( text )
@staticmethod
def append_file(filename, *text):
with codecs.open( filename, 'a', 'utf-8' ) as f:
f.write( string.join( text, '\n' ) )
@staticmethod
def mem_info():
if sys.platform == "darwin":
utils.call("top","-l","1","-s","0","-n","0")
elif sys.platform.startswith("linux"):
utils.call("free","-m","-l")
@staticmethod
def query_boost_version(boost_root):
'''
Read in the Boost version from a given boost_root.
'''
boost_version = None
if os.path.exists(os.path.join(boost_root,'Jamroot')):
with codecs.open(os.path.join(boost_root,'Jamroot'), 'r', 'utf-8') as f:
for line in f.readlines():
parts = line.split()
if len(parts) >= 5 and parts[1] == 'BOOST_VERSION':
boost_version = parts[3]
break
if not boost_version:
boost_version = 'default'
return boost_version
@staticmethod
def git_clone(owner, repo, branch, commit = None, repo_dir = None, submodules = False, url_format = "https://github.com/%(owner)s/%(repo)s.git"):
'''
This clone mimicks the way Travis-CI clones a project's repo. So far
Travis-CI is the most limiting in the sense of only fetching partial
history of the repo.
'''
if not repo_dir:
repo_dir = os.path.join(os.getcwd(), owner+','+repo)
utils.makedirs(os.path.dirname(repo_dir))
if not os.path.exists(os.path.join(repo_dir,'.git')):
utils.check_call("git","clone",
"--depth=1",
"--branch=%s"%(branch),
url_format%{'owner':owner,'repo':repo},
repo_dir)
os.chdir(repo_dir)
else:
os.chdir(repo_dir)
utils.check_call("git","pull",
# "--depth=1", # Can't do depth as we get merge errors.
"--quiet","--no-recurse-submodules")
if commit:
utils.check_call("git","checkout","-qf",commit)
if os.path.exists(os.path.join('.git','modules')):
if sys.platform == 'win32':
utils.check_call('dir',os.path.join('.git','modules'))
else:
utils.check_call('ls','-la',os.path.join('.git','modules'))
if submodules:
utils.check_call("git","submodule","--quiet","update",
"--quiet","--init","--recursive",
)
utils.check_call("git","submodule","--quiet","foreach","git","fetch")
return repo_dir
class parallel_call(threading.Thread):
'''
Runs a synchronous command in a thread waiting for it to complete.
'''
def __init__(self, *command, **kargs):
super(parallel_call,self).__init__()
self.command = command
self.command_kargs = kargs
self.start()
def run(self):
self.result = utils.call(*self.command, **self.command_kargs)
def join(self):
super(parallel_call,self).join()
if self.result != 0:
raise(SystemCallError(self.command, self.result))
def set_arg(args, k, v = None):
if not args.get(k):
args[k] = v
return args[k]
class script_common(object):
'''
Main script to run continuous integration.
'''
def __init__(self, ci_klass, **kargs):
self.ci = ci_klass(self)
opt = optparse.OptionParser(
usage="%prog [options] [commands]")
#~ Debug Options:
opt.add_option( '--debug-level',
help="debugging level; controls the amount of debugging output printed",
type='int' )
opt.add_option( '-j',
help="maximum number of parallel jobs to use for building with b2",
type='int', dest='jobs')
opt.add_option('--branch')
opt.add_option('--commit')
kargs = self.init(opt,kargs)
kargs = self.ci.init(opt, kargs)
set_arg(kargs,'debug_level',0)
set_arg(kargs,'jobs',2)
set_arg(kargs,'branch',None)
set_arg(kargs,'commit',None)
set_arg(kargs,'repo',None)
set_arg(kargs,'repo_dir',None)
set_arg(kargs,'actions',None)
set_arg(kargs,'pull_request', None)
#~ Defaults
for (k,v) in kargs.iteritems():
setattr(self,k,v)
( _opt_, self.actions ) = opt.parse_args(None,self)
if not self.actions or self.actions == []:
self.actions = kargs.get('actions',None)
if not self.actions or self.actions == []:
self.actions = [ 'info' ]
if not self.repo_dir:
self.repo_dir = os.getcwd()
self.build_dir = os.path.join(os.path.dirname(self.repo_dir), "build")
# API keys.
self.bintray_key = os.getenv('BINTRAY_KEY')
try:
self.start()
self.command_info()
self.main()
utils.print_call_stats()
except:
utils.print_call_stats()
raise
def init(self, opt, kargs):
return kargs
def start(self):
pass
def main(self):
for action in self.actions:
action_m = "command_"+action.replace('-','_')
ci_command = getattr(self.ci, action_m, None)
ci_script = getattr(self, action_m, None)
if ci_command or ci_script:
utils.log( "### %s.."%(action) )
if os.path.exists(self.repo_dir):
os.chdir(self.repo_dir)
if ci_command:
ci_command()
elif ci_script:
ci_script()
def b2( self, *args, **kargs ):
cmd = ['b2','--debug-configuration', '-j%s'%(self.jobs)]
cmd.extend(args)
if 'toolset' in kargs:
cmd.append('toolset=' + kargs['toolset'])
if 'parallel' in kargs:
return parallel_call(*cmd)
else:
return utils.check_call(*cmd)
# Common test commands in the order they should be executed..
def command_info(self):
pass
def command_install(self):
utils.makedirs(self.build_dir)
os.chdir(self.build_dir)
def command_install_toolset(self, toolset):
if self.ci and hasattr(self.ci,'install_toolset'):
self.ci.install_toolset(toolset)
def command_before_build(self):
pass
def command_build(self):
pass
def command_before_cache(self):
pass
def command_after_success(self):
pass
class ci_cli(object):
'''
This version of the script provides a way to do manual building. It sets up
additional environment and adds fetching of the git repos that would
normally be done by the CI system.
The common way to use this variant is to invoke something like:
mkdir ci
cd ci
python path-to/library_test.py --branch=develop [--repo=mylib] ...
Status: In working order.
'''
def __init__(self,script):
if sys.platform == 'darwin':
# Requirements for running on OSX:
# https://www.stack.nl/~dimitri/doxygen/download.html#srcbin
# https://tug.org/mactex/morepackages.html
doxygen_path = "/Applications/Doxygen.app/Contents/Resources"
if os.path.isdir(doxygen_path):
os.environ["PATH"] = doxygen_path+':'+os.environ['PATH']
self.script = script
self.repo_dir = os.getcwd()
self.exit_result = 0
def init(self, opt, kargs):
kargs['actions'] = [
# 'clone',
'install',
'before_build',
'build',
'before_cache',
'finish'
]
return kargs
def finish(self, result):
self.exit_result = result
def command_finish(self):
exit(self.exit_result)
class ci_travis(object):
'''
This variant build releases in the context of the Travis-CI service.
'''
def __init__(self,script):
self.script = script
def init(self, opt, kargs):
set_arg(kargs,'repo_dir', os.getenv("TRAVIS_BUILD_DIR"))
set_arg(kargs,'branch', os.getenv("TRAVIS_BRANCH"))
set_arg(kargs,'commit', os.getenv("TRAVIS_COMMIT"))
set_arg(kargs,'repo', os.getenv("TRAVIS_REPO_SLUG").split("/")[1])
set_arg(kargs,'pull_request',
os.getenv('TRAVIS_PULL_REQUEST') \
if os.getenv('TRAVIS_PULL_REQUEST') != 'false' else None)
return kargs
def finish(self, result):
exit(result)
def install_toolset(self, toolset):
'''
Installs specific toolset on CI system.
'''
info = toolset_info[toolset]
if sys.platform.startswith('linux'):
os.chdir(self.script.build_dir)
if 'ppa' in info:
for ppa in info['ppa']:
utils.check_call(
'sudo','add-apt-repository','--yes',ppa)
if 'deb' in info:
utils.make_file('sources.list',
"deb %s"%(' '.join(info['deb'])),
"deb-src %s"%(' '.join(info['deb'])))
utils.check_call('sudo','bash','-c','cat sources.list >> /etc/apt/sources.list')
if 'apt-key' in info:
for key in info['apt-key']:
utils.check_call('wget',key,'-O','apt.key')
utils.check_call('sudo','apt-key','add','apt.key')
utils.check_call(
'sudo','apt-get','update','-qq')
utils.check_call(
'sudo','apt-get','install','-qq',info['package'])
if 'debugpackage' in info and info['debugpackage']:
utils.check_call(
'sudo','apt-get','install','-qq',info['debugpackage'])
# Travis-CI commands in the order they are executed. We need
# these to forward to our common commands, if they are different.
def command_before_install(self):
pass
def command_install(self):
self.script.command_install()
def command_before_script(self):
self.script.command_before_build()
def command_script(self):
self.script.command_build()
def command_before_cache(self):
self.script.command_before_cache()
def command_after_success(self):
self.script.command_after_success()
def command_after_failure(self):
pass
def command_before_deploy(self):
pass
def command_after_deploy(self):
pass
def command_after_script(self):
pass
class ci_circleci(object):
'''
This variant build releases in the context of the CircleCI service.
'''
def __init__(self,script):
self.script = script
def init(self, opt, kargs):
set_arg(kargs,'repo_dir', os.path.join(os.getenv("HOME"),os.getenv("CIRCLE_PROJECT_REPONAME")))
set_arg(kargs,'branch', os.getenv("CIRCLE_BRANCH"))
set_arg(kargs,'commit', os.getenv("CIRCLE_SHA1"))
set_arg(kargs,'repo', os.getenv("CIRCLE_PROJECT_REPONAME").split("/")[1])
set_arg(kargs,'pull_request', os.getenv('CIRCLE_PR_NUMBER'))
return kargs
def finish(self, result):
exit(result)
def command_machine_post(self):
# Apt update for the pckages installs we'll do later.
utils.check_call('sudo','apt-get','-qq','update')
# Need PyYAML to read Travis yaml in a later step.
utils.check_call("pip","install","--user","PyYAML")
def command_checkout_post(self):
os.chdir(self.script.repo_dir)
utils.check_call("git","submodule","update","--quiet","--init","--recursive")
def command_dependencies_pre(self):
# Read in .travis.yml for list of packages to install
# as CircleCI doesn't have a convenient apt install method.
import yaml
utils.check_call('sudo','-E','apt-get','-yqq','update')
utils.check_call('sudo','apt-get','-yqq','purge','texlive*')
with open(os.path.join(self.script.repo_dir,'.travis.yml')) as yml:
travis_yml = yaml.load(yml)
utils.check_call('sudo','apt-get','-yqq',
'--no-install-suggests','--no-install-recommends','--force-yes','install',
*travis_yml['addons']['apt']['packages'])
def command_dependencies_override(self):
self.script.command_install()
def command_dependencies_post(self):
pass
def command_database_pre(self):
pass
def command_database_override(self):
pass
def command_database_post(self):
pass
def command_test_pre(self):
self.script.command_install()
self.script.command_before_build()
def command_test_override(self):
# CircleCI runs all the test subsets. So in order to avoid
# running the after_success we do it here as the build step
# will halt accordingly.
self.script.command_build()
self.script.command_before_cache()
self.script.command_after_success()
def command_test_post(self):
pass
class ci_appveyor(object):
def __init__(self,script):
self.script = script
def init(self, opt, kargs):
set_arg(kargs,'repo_dir',os.getenv("APPVEYOR_BUILD_FOLDER"))
set_arg(kargs,'branch',os.getenv("APPVEYOR_REPO_BRANCH"))
set_arg(kargs,'commit',os.getenv("APPVEYOR_REPO_COMMIT"))
set_arg(kargs,'repo',os.getenv("APPVEYOR_REPO_NAME").split("/")[1])
set_arg(kargs,'address_model',os.getenv("PLATFORM",None))
set_arg(kargs,'variant',os.getenv("CONFIGURATION","debug"))
set_arg(kargs,'pull_request', os.getenv('APPVEYOR_PULL_REQUEST_NUMBER'))
return kargs
def finish(self, result):
exit(result)
# Appveyor commands in the order they are executed. We need
# these to forward to our common commands, if they are different.
def command_install(self):
self.script.command_install()
def command_before_build(self):
os.chdir(self.script.repo_dir)
utils.check_call("git","submodule","update","--quiet","--init","--recursive")
self.script.command_before_build()
def command_build_script(self):
self.script.command_build()
def command_after_build(self):
self.script.command_before_cache()
def command_before_test(self):
pass
def command_test_script(self):
pass
def command_after_test(self):
pass
def command_on_success(self):
self.script.command_after_success()
def command_on_failure(self):
pass
def command_on_finish(self):
pass
def main(script_klass):
if os.getenv('TRAVIS', False):
script_klass(ci_travis)
elif os.getenv('CIRCLECI', False):
script_klass(ci_circleci)
elif os.getenv('APPVEYOR', False):
script_klass(ci_appveyor)
else:
script_klass(ci_cli)

141
tools/ci/library_test.py Normal file
View File

@ -0,0 +1,141 @@
#!/usr/bin/env python
# Copyright Rene Rivera 2016
#
# 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)
import os.path
import shutil
import sys
from common import toolset_info, main, utils, script_common, ci_cli, set_arg
__dirname__ = os.path.dirname(os.path.realpath(__file__))
class script(script_common):
'''
Main script to test a Boost C++ Library.
'''
def __init__(self, ci_klass, **kargs):
script_common.__init__(self, ci_klass, **kargs)
def init(self, opt, kargs):
opt.add_option( '--toolset',
help="single toolset to test with" )
opt.add_option( '--target',
help="test target to build for testing, defaults to TARGET or 'minimal'")
opt.add_option( '--address-model',
help="address model to test, ie 64 or 32" )
opt.add_option( '--variant',
help="variant to test, ie debug, release" )
set_arg(kargs, 'toolset', os.getenv("TOOLSET"))
set_arg(kargs, 'target', os.getenv('TARGET', 'minimal'))
set_arg(kargs, 'address_model', os.getenv("ADDRESS_MODEL",None))
set_arg(kargs, 'variant', os.getenv("VARIANT","debug"))
set_arg(kargs, 'cxxflags', os.getenv("CXXFLAGS",None))
return kargs
def start(self):
script_common.start(self)
# Some setup we need to redo for each invocation.
self.b2_dir = os.path.join(self.build_dir, 'b2')
def command_install(self):
script_common.command_install(self)
# Fetch & install toolset..
utils.log( "Install toolset: %s"%(self.toolset) )
if self.toolset:
self.command_install_toolset(self.toolset)
def command_before_build(self):
script_common.command_before_build(self)
# Fetch dependencies.
utils.git_clone('boostorg','build','develop',repo_dir=self.b2_dir)
# Create config file for b2 toolset.
if not isinstance(self.ci, ci_cli):
cxxflags = None
if self.cxxflags:
cxxflags = self.cxxflags.split()
cxxflags = " <cxxflags>".join(cxxflags)
utils.make_file(os.path.join(self.repo_dir, 'project-config.jam'),
"""
using %(toolset)s : %(version)s : %(command)s : %(cxxflags)s ;
using python : %(pyversion)s : "%(python)s" ;
"""%{
'toolset':toolset_info[self.toolset]['toolset'],
'version':toolset_info[self.toolset]['version'],
'command':toolset_info[self.toolset]['command'],
'cxxflags':"<cxxflags>"+cxxflags if cxxflags else "",
'pyversion':"%s.%s"%(sys.version_info[0],sys.version_info[1]),
'python':sys.executable.replace("\\","\\\\")
})
# "Convert" boostorg-predef into standalone b2 project.
if os.path.exists(os.path.join(self.repo_dir,'build.jam')) and not os.path.exists(os.path.join(self.repo_dir,'project-root.jam')):
os.rename(os.path.join(self.repo_dir,'build.jam'), os.path.join(self.repo_dir,'project-root.jam'))
def command_build(self):
script_common.command_build(self)
# Set up tools.
if not isinstance(self.ci, ci_cli) and toolset_info[self.toolset]['command']:
os.environ['PATH'] = os.pathsep.join([
os.path.dirname(toolset_info[self.toolset]['command']),
os.environ['PATH']])
# Bootstrap Boost Build engine.
os.chdir(self.b2_dir)
if sys.platform == 'win32':
utils.check_call(".\\bootstrap.bat")
else:
utils.check_call("./bootstrap.sh")
os.environ['PATH'] = os.pathsep.join([self.b2_dir, os.environ['PATH']])
os.environ['BOOST_BUILD_PATH'] = self.b2_dir
# Run the limited tests.
print("--- Testing %s ---"%(self.repo_dir))
os.chdir(os.path.join(self.repo_dir,'test'))
toolset_to_test = ""
if self.toolset:
if not isinstance(self.ci, ci_cli):
toolset_to_test = toolset_info[self.toolset]['toolset']
else:
toolset_to_test = self.toolset
self.b2(
'-d1',
'-p0',
'preserve-test-targets=off',
'--dump-tests',
'--verbose-test',
'--build-dir=%s'%(self.build_dir),
'--out-xml=%s'%(os.path.join(self.build_dir,'regression.xml')),
'' if not toolset_to_test else 'toolset=%s'%(toolset_to_test),
'' if not self.address_model else 'address-model=%s'%(self.address_model),
'variant=%s'%(self.variant),
self.target
)
# Generate a readable test report.
import build_log
log_main = build_log.Main([
'--output=console',
os.path.join(self.build_dir,'regression.xml')])
# And exit with an error if the report contains failures.
# This lets the CI notice the error and report a failed build.
# And hence trigger the failure machinery, like sending emails.
if log_main.failed:
self.ci.finish(-1)
def command_before_cache(self):
script_common.command_before_cache(self)
os.chdir(self.b2_dir)
utils.check_call("git","clean","-dfqx")
utils.check_call("git","status","-bs")
# utils.check_call("git","submodule","--quiet","foreach","git","clean","-dfqx")
# utils.check_call("git","submodule","foreach","git","status","-bs")
main(script)