diff --git a/.travis.yml b/.travis.yml
index 92c2ee7..dd85603 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -17,6 +17,15 @@ branches:
- master
- develop
+matrix:
+ include:
+ - install: true
+ script:
+ - mkdir __build__ && cd __build__
+ - cmake ../test
+ - cmake --build .
+
+
install:
- cd ..
- git clone -b $TRAVIS_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..c0f41f9
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,12 @@
+# Copyright 2018 Mike Dev
+# 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
+
+cmake_minimum_required(VERSION 3.5)
+project(BoostPreprocessor LANGUAGES CXX)
+
+add_library(boost_preprocessor INTERFACE)
+add_library(Boost::preprocessor ALIAS boost_preprocessor)
+
+target_include_directories(boost_preprocessor INTERFACE include)
+
diff --git a/appveyor.yml b/appveyor.yml
index 1fefc07..3d07613 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,5 @@
# Copyright 2017 Edward Diener
+# Copyright 2018 Mike Dev
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
@@ -6,6 +7,10 @@ version: 1.0.{build}-{branch}
shallow_clone: true
+configuration:
+ - boost_test
+ - cmake_self_test
+
branches:
only:
- master
@@ -18,19 +23,38 @@ environment:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
TOOLSET: msvc-14.1
-install:
- - cd ..
- - git clone -b %APPVEYOR_REPO_BRANCH% https://github.com/boostorg/boost.git boost-root
- - cd boost-root
- - git submodule update --init tools/build
- - git submodule update --init libs/config
- - git submodule update --init tools/boostdep
- - xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\preprocessor
- - python tools/boostdep/depinst/depinst.py preprocessor
- - bootstrap
- - b2 headers
-
build: off
-test_script:
- - b2 libs/preprocessor/test toolset=%TOOLSET%
+for:
+-
+ matrix:
+ only:
+ - configuration: cmake_self_test
+
+ test_script:
+ - mkdir __build__
+ - cd __build__
+ - cmake ../test
+ - cmake --build .
+
+-
+ matrix:
+ only:
+ - configuration: boost_test
+
+ install:
+ - cd ..
+ - git clone -b %APPVEYOR_REPO_BRANCH% https://github.com/boostorg/boost.git boost-root
+ - cd boost-root
+ - git submodule update --init tools/build
+ - git submodule update --init libs/config
+ - git submodule update --init tools/boostdep
+ - xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\preprocessor
+ - python tools/boostdep/depinst/depinst.py preprocessor
+ - bootstrap
+ - b2 headers
+
+ test_script:
+ - b2 libs/preprocessor/test toolset=%TOOLSET%
+ - cd ../preprocessor/test
+
diff --git a/doc/ref/expand.html b/doc/ref/expand.html
index 4a1d78b..aa4ba77 100644
--- a/doc/ref/expand.html
+++ b/doc/ref/expand.html
@@ -22,7 +22,7 @@
This macro is useful when a delay is necessary to produce the correct semantics of a macro invocation.
For example, when a macro expands to an argument list to another macro.
- This macro will expand the the argument list on the first pass, and then rescan to expand any more macros.
+ This macro will expand the argument list on the first pass, and then rescan to expand any more macros.
Requirements
diff --git a/include/boost/preprocessor/config/config.hpp b/include/boost/preprocessor/config/config.hpp
index cdb044c..2c1e72f 100644
--- a/include/boost/preprocessor/config/config.hpp
+++ b/include/boost/preprocessor/config/config.hpp
@@ -29,7 +29,11 @@
# define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())
# elif defined(__EDG__) || defined(__EDG_VERSION__)
# if defined(_MSC_VER) && !defined(__clang__) && (defined(__INTELLISENSE__) || __EDG_VERSION__ >= 308)
-# define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MSVC())
+# if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL
+# define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MSVC())
+# else
+# define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())
+# endif
# else
# define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_EDG() | BOOST_PP_CONFIG_STRICT())
# endif
@@ -44,7 +48,11 @@
# elif defined(__BORLANDC__) || defined(__IBMC__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
# define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_BCC())
# elif defined(_MSC_VER)
-# define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MSVC())
+# if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL
+# define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MSVC())
+# else
+# define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())
+# endif
# else
# define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())
# endif
@@ -71,17 +79,18 @@
# define BOOST_PP_VARIADICS_MSVC 0
# if !defined BOOST_PP_VARIADICS
# /* variadic support explicitly disabled for all untested compilers */
-# if defined __GCCXML__ || defined __PATHSCALE__ || defined __DMC__ || defined __CODEGEARC__ || defined __BORLANDC__ || defined __MWERKS__ || ( defined __SUNPRO_CC && __SUNPRO_CC < 0x5120 ) || defined __HP_aCC && !defined __EDG__ || defined __MRC__ || defined __SC__ || defined __PGI
+
+# if defined __GCCXML__ || defined __CUDACC__ || defined __PATHSCALE__ || defined __DMC__ || defined __CODEGEARC__ || defined __BORLANDC__ || defined __MWERKS__ || ( defined __SUNPRO_CC && __SUNPRO_CC < 0x5120 ) || defined __HP_aCC && !defined __EDG__ || defined __MRC__ || defined __SC__ || (defined(__PGI) && !defined(__EDG__))
# define BOOST_PP_VARIADICS 0
-# elif defined(__CUDACC__)
-# define BOOST_PP_VARIADICS 1
# elif defined(_MSC_VER) && defined(__clang__)
# define BOOST_PP_VARIADICS 1
# /* VC++ (C/C++) and Intel C++ Compiler >= 17.0 with MSVC */
# elif defined _MSC_VER && _MSC_VER >= 1400 && (!defined __EDG__ || defined(__INTELLISENSE__) || defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1700)
# define BOOST_PP_VARIADICS 1
-# undef BOOST_PP_VARIADICS_MSVC
-# define BOOST_PP_VARIADICS_MSVC 1
+# if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL
+# undef BOOST_PP_VARIADICS_MSVC
+# define BOOST_PP_VARIADICS_MSVC 1
+# endif
# /* Wave (C/C++), GCC (C++) */
# elif defined __WAVE__ && __WAVE_HAS_VARIADICS__ || defined __GNUC__ && defined __GXX_EXPERIMENTAL_CXX0X__ && __GXX_EXPERIMENTAL_CXX0X__
# define BOOST_PP_VARIADICS 1
@@ -94,7 +103,7 @@
# elif !BOOST_PP_VARIADICS + 1 < 2
# undef BOOST_PP_VARIADICS
# define BOOST_PP_VARIADICS 1
-# if defined _MSC_VER && _MSC_VER >= 1400 && !defined(__clang__) && (defined(__INTELLISENSE__) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1700) || !(defined __EDG__ || defined __GCCXML__ || defined __CUDACC__ || defined __PATHSCALE__ || defined __DMC__ || defined __CODEGEARC__ || defined __BORLANDC__ || defined __MWERKS__ || defined __SUNPRO_CC || defined __HP_aCC || defined __MRC__ || defined __SC__ || defined __IBMCPP__ || defined __PGI))
+# if defined _MSC_VER && _MSC_VER >= 1400 && !defined(__clang__) && (defined(__INTELLISENSE__) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1700) || !(defined __EDG__ || defined __GCCXML__ || defined __CUDACC__ || defined __PATHSCALE__ || defined __DMC__ || defined __CODEGEARC__ || defined __BORLANDC__ || defined __MWERKS__ || defined __SUNPRO_CC || defined __HP_aCC || defined __MRC__ || defined __SC__ || defined __IBMCPP__ || defined __PGI)) && (!defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL)
# undef BOOST_PP_VARIADICS_MSVC
# define BOOST_PP_VARIADICS_MSVC 1
# endif
diff --git a/include/boost/preprocessor/stringize.hpp b/include/boost/preprocessor/stringize.hpp
index 64dd5fd..e072dbd 100644
--- a/include/boost/preprocessor/stringize.hpp
+++ b/include/boost/preprocessor/stringize.hpp
@@ -28,6 +28,10 @@
# define BOOST_PP_STRINGIZE(text) BOOST_PP_STRINGIZE_I(text)
# endif
#
+#if BOOST_PP_VARIADICS
+# define BOOST_PP_STRINGIZE_I(...) #__VA_ARGS__
+#else
# define BOOST_PP_STRINGIZE_I(text) #text
+#endif
#
# endif
diff --git a/include/boost/preprocessor/wstringize.hpp b/include/boost/preprocessor/wstringize.hpp
index 5d1a83a..9f89673 100644
--- a/include/boost/preprocessor/wstringize.hpp
+++ b/include/boost/preprocessor/wstringize.hpp
@@ -23,7 +23,11 @@
# define BOOST_PP_WSTRINGIZE_OO(par) BOOST_PP_WSTRINGIZE_I ## par
# endif
#
+#if BOOST_PP_VARIADICS
+# define BOOST_PP_WSTRINGIZE_I(...) BOOST_PP_WSTRINGIZE_II(#__VA_ARGS__)
+#else
# define BOOST_PP_WSTRINGIZE_I(text) BOOST_PP_WSTRINGIZE_II(#text)
+#endif
# define BOOST_PP_WSTRINGIZE_II(str) L ## str
#
# endif
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..b56c870
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,16 @@
+# Copyright 2018 Mike Dev
+# 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.Preprocessor (yet).
+# It only tests, if the CMakeLists.txt file works as expected
+
+cmake_minimum_required( VERSION 3.5 )
+
+project( BoostPreprocessorCMakeSelfTest )
+
+add_subdirectory( .. ${CMAKE_CURRENT_BINARY_DIR}/boost_preprocessor )
+
+add_executable( boost_preprocessor_cmake_self_test config_info.cpp )
+target_link_libraries( boost_preprocessor_cmake_self_test Boost::preprocessor )
+
diff --git a/test/Jamfile.v2 b/test/Jamfile.v2
index 562ee9e..e12d73a 100644
--- a/test/Jamfile.v2
+++ b/test/Jamfile.v2
@@ -34,22 +34,23 @@ alias preprocessor : :
alias preprocessor
:
- [ compile arithmetic.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile array.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile comparison.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile control.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile debug.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile facilities.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile iteration.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile list.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile logical.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile punctuation.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile repetition.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile selection.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile seq.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile slot.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile tuple.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile variadic.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
+ [ compile arithmetic.cpp ]
+ [ compile array.cpp ]
+ [ compile comparison.cpp ]
+ [ compile control.cpp ]
+ [ compile debug.cpp ]
+ [ compile facilities.cpp ]
+ [ compile iteration.cpp ]
+ [ compile list.cpp ]
+ [ compile logical.cpp ]
+ [ compile punctuation.cpp ]
+ [ compile repetition.cpp ]
+ [ compile selection.cpp ]
+ [ compile seq.cpp ]
+ [ compile slot.cpp ]
+ [ compile stringize.cpp ]
+ [ compile tuple.cpp ]
+ [ compile variadic.cpp ]
;
alias preprocessor_nvm
@@ -67,65 +68,70 @@ alias preprocessor_nvm
[ compile selection.cpp : BOOST_PP_VARIADICS=0 : selection_nvm ]
[ compile seq.cpp : BOOST_PP_VARIADICS=0 : seq_nvm ]
[ compile slot.cpp : BOOST_PP_VARIADICS=0 : slot_nvm ]
+ [ compile stringize.cpp : BOOST_PP_VARIADICS=0 : stringize_nvm ]
[ compile tuple.cpp : BOOST_PP_VARIADICS=0 : tuple_nvm ]
;
alias preprocessor_c
:
[ compile arithmetic.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: arithmetic_c
]
[ compile array.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: array_c
]
[ compile comparison.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: comparison_c
]
[ compile control.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: control_c
]
[ compile debug.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: debug_c
]
[ compile facilities.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: facilities_c
]
[ compile list.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: list_c
]
[ compile logical.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: logical_c
]
[ compile punctuation.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: punctuation_c
]
[ compile selection.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: selection_c
]
[ compile seq.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: seq_c
]
[ compile slot.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: slot_c
]
+ [ compile stringize.c
+ :
+ : stringize_c
+ ]
[ compile tuple.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: tuple_c
]
[ compile variadic.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: variadic_c
]
;
@@ -133,63 +139,55 @@ alias preprocessor_c
alias preprocessor_c_nvm
:
[ compile arithmetic.c
- : BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
+ : BOOST_PP_VARIADICS=0
: arithmetic_c_nvm
]
[ compile array.c
- : BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
+ : BOOST_PP_VARIADICS=0
: array_c_nvm
]
[ compile comparison.c
: BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
: comparison_c_nvm
]
[ compile control.c
: BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
: control_c_nvm
]
[ compile debug.c
: BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
: debug_c_nvm
]
[ compile facilities.c
: BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
: facilities_c_nvm
]
[ compile list.c
: BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
: list_c_nvm
]
[ compile logical.c
: BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
: logical_c_nvm
]
[ compile selection.c
: BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
: selection_c_nvm
]
[ compile seq.c
: BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
: seq_c_nvm
]
[ compile slot.c
: BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
: slot_c_nvm
]
+ [ compile stringize.c
+ : BOOST_PP_VARIADICS=0
+ : stringize_c_nvm
+ ]
[ compile tuple.c
: BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
: tuple_c_nvm
]
;
@@ -211,28 +209,28 @@ alias preprocessor_isempty : :
alias preprocessor_isempty
:
- [ compile isempty.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile-fail isempty_variadic_standard_failure.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
- [ compile-fail isempty_variadic_standard_failure2.cpp : gcc:-std=c++0x clang-linux:-std=c++0x ]
+ [ compile isempty.cpp ]
+ [ compile-fail isempty_variadic_standard_failure.cpp : BOOST_PP_VARIADICS=1 ]
+ [ compile-fail isempty_variadic_standard_failure2.cpp : BOOST_PP_VARIADICS=1 ]
;
alias preprocessor_isempty_nvm
:
- [ compile isempty.cpp : BOOST_PP_VARIADICS=0 : isempty_nvm ]
+ [ compile isempty.cpp : BOOST_PP_VARIADICS=0 : isempty_nvm ]
;
alias preprocessor_isempty_c
:
[ compile isempty.c
- : gcc:-std=c99 clang-linux:-std=c99
+ :
: isempty_c
]
[ compile-fail isempty_variadic_standard_failure.c
- : gcc:-std=c99 clang-linux:-std=c99
+ : BOOST_PP_VARIADICS=1
: isempty_variadic_standard_failure_c
]
[ compile-fail isempty_variadic_standard_failure2.c
- : gcc:-std=c99 clang-linux:-std=c99
+ : BOOST_PP_VARIADICS=1
: isempty_variadic_standard_failure2_c
]
;
@@ -241,7 +239,6 @@ alias preprocessor_isempty_c_nvm
:
[ compile isempty.c
: BOOST_PP_VARIADICS=0
- gcc:-std=c99 clang-linux:-std=c99
: isempty_c_nvm
]
;
diff --git a/test/stringize.c b/test/stringize.c
new file mode 100644
index 0000000..0ac19ec
--- /dev/null
+++ b/test/stringize.c
@@ -0,0 +1,12 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 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)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
diff --git a/test/stringize.cpp b/test/stringize.cpp
new file mode 100644
index 0000000..0ac19ec
--- /dev/null
+++ b/test/stringize.cpp
@@ -0,0 +1,12 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 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)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
diff --git a/test/stringize.cxx b/test/stringize.cxx
new file mode 100644
index 0000000..527279b
--- /dev/null
+++ b/test/stringize.cxx
@@ -0,0 +1,38 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 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)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
+# include
+# include
+# if !defined __cplusplus
+#include
+#endif
+# include
+
+#define VDATA 1,2,3,4
+#define NDATA
+#define DATA data
+#define FDATA(x) BOOST_PP_INC(x)
+
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+BEGIN sizeof(BOOST_PP_STRINGIZE(NDATA)) / sizeof(char) == 1 END
+BEGIN sizeof(BOOST_PP_WSTRINGIZE(NDATA)) / sizeof(wchar_t) == 1 END
+#endif
+BEGIN sizeof(BOOST_PP_STRINGIZE(DATA)) / sizeof(char) == 5 END
+BEGIN sizeof(BOOST_PP_STRINGIZE(FDATA(1))) / sizeof(char) == 2 END
+BEGIN sizeof(BOOST_PP_STRINGIZE(FDATA(9))) / sizeof(char) == 3 END
+BEGIN sizeof(BOOST_PP_WSTRINGIZE(DATA)) / sizeof(wchar_t) == 5 END
+BEGIN sizeof(BOOST_PP_WSTRINGIZE(FDATA(1))) / sizeof(wchar_t) == 2 END
+BEGIN sizeof(BOOST_PP_WSTRINGIZE(FDATA(9))) / sizeof(wchar_t) == 3 END
+#if BOOST_PP_VARIADICS
+BEGIN sizeof(BOOST_PP_STRINGIZE(VDATA)) / sizeof(char) == 8 END
+BEGIN sizeof(BOOST_PP_WSTRINGIZE(VDATA)) / sizeof(wchar_t) == 8 END
+#endif