summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/predef/tools
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
commit19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch)
tree42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/predef/tools
parentInitial commit. (diff)
downloadceph-upstream.tar.xz
ceph-upstream.zip
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/predef/tools')
-rw-r--r--src/boost/libs/predef/tools/check/build.jam9
-rw-r--r--src/boost/libs/predef/tools/check/predef.jam202
-rw-r--r--src/boost/libs/predef/tools/check/predef_check.h98
-rw-r--r--src/boost/libs/predef/tools/check/predef_check_as_c.c7
-rw-r--r--src/boost/libs/predef/tools/check/predef_check_as_cpp.cpp7
-rw-r--r--src/boost/libs/predef/tools/check/predef_check_as_objc.m7
-rw-r--r--src/boost/libs/predef/tools/check/predef_check_as_objcpp.mm7
-rw-r--r--src/boost/libs/predef/tools/check/predef_check_cc.h19
-rw-r--r--src/boost/libs/predef/tools/check/predef_check_cc_as_c.c7
-rw-r--r--src/boost/libs/predef/tools/check/predef_check_cc_as_cpp.cpp7
-rw-r--r--src/boost/libs/predef/tools/check/predef_check_cc_as_objc.m7
-rw-r--r--src/boost/libs/predef/tools/check/predef_check_cc_as_objcpp.mm7
12 files changed, 384 insertions, 0 deletions
diff --git a/src/boost/libs/predef/tools/check/build.jam b/src/boost/libs/predef/tools/check/build.jam
new file mode 100644
index 000000000..1ce4f11e9
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/build.jam
@@ -0,0 +1,9 @@
+# Copyright Rene Rivera 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)
+
+exe predef_check_as_c : predef_check_as_c.c : <include>../include ;
+exe predef_check_as_cpp : predef_check_as_cpp.cpp : <include>../include ;
+exe predef_check_as_objc : predef_check_as_objc.m : <include>../include ;
+exe predef_check_as_objcpp : predef_check_as_objcpp.mm : <include>../include ;
diff --git a/src/boost/libs/predef/tools/check/predef.jam b/src/boost/libs/predef/tools/check/predef.jam
new file mode 100644
index 000000000..dd18bfb06
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/predef.jam
@@ -0,0 +1,202 @@
+# Copyright Rene Rivera 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)
+
+# Defines rules that provide requirements based on checking
+# conditions using Boost Predef definitions and version numbers.
+
+import modules ;
+import project ;
+import feature ;
+import string ;
+import toolset ;
+import modules ;
+import path ;
+import "class" : new ;
+import regex ;
+
+# Create a project for our targets.
+project.extension predef check ;
+
+# Feature to pass check expressions to check programs.
+feature.feature predef-expression : : free ;
+
+# Checks the expressions and when used evaluates to the true-properties
+# if the expressions are all true. Otherwise evaluates to the
+# false-properties.
+rule check ( expressions + : language ? : true-properties * : false-properties * )
+{
+ # Default to C++ on the check context.
+ language ?= cpp ;
+
+ local project_target = [ project.target $(__name__) ] ;
+ project.push-current $(project_target) ;
+ local terms ;
+ local result ;
+ for expression in $(expressions)
+ {
+ if $(expression:L) in "and" "or"
+ {
+ terms += $(expression:L) ;
+ }
+ else
+ {
+ # Create the check run if we don't have one yet.
+ local key = [ MD5 "$(language)::$(expression)" ] ;
+ if ! ( $(key) in $(_checks_) )
+ {
+ _checks_ += $(key) ;
+ _message_(/check/predef//predef_check_cc_$(key)) = $(expression) ;
+ check_target $(language) $(key) : [ change_term_to_def $(expression) ] ;
+ }
+
+ terms += /check/predef//predef_check_cc_$(key) ;
+ }
+ }
+ local instance = [ new check-expression-evaluator
+ $(terms) : $(true-properties) : $(false-properties) ] ;
+ result = <conditional>@$(instance).check ;
+ project.pop-current ;
+ return $(result) ;
+}
+
+# Checks the expressions and when used evaluates to <build>no
+# if the expressions are all false. Otherwise evaluates to the
+# nothing.
+rule require ( expressions + : language ? )
+{
+ return [ check $(expressions) : $(language) : : <build>no ] ;
+}
+
+#############################################################################
+
+.c.ext = c ;
+.cpp.ext = cpp ;
+.objc.ext = m ;
+.objcpp.ext = mm ;
+
+# Check targets. Each needs to be compiled for different languages
+# even though they are all the same source code.
+local rule check_target ( language key : requirements * )
+{
+ # Need to use absolute paths because we don't know the
+ # context of the invocation which affects where the paths
+ # originate from.
+ local predef_jam
+ = [ modules.binding $(__name__) ] ;
+ local source_path
+ = $(predef_jam:D)/predef_check_cc_as_$(language).$(.$(language).ext) ;
+ local include_path
+ = $(predef_jam:D)/../../include $(BOOST_ROOT) ;
+ obj predef_check_cc_$(key)
+ : $(source_path)
+ : <include>$(include_path) $(requirements) ;
+ explicit predef_check_cc_$(key) ;
+ return predef_check_cc_$(key) ;
+}
+
+local rule change_term_to_def ( term )
+{
+ local parts = [ regex.split $(term) " " ] ;
+ if $(parts[3])
+ {
+ local version_number = [ regex.split $(parts[3]) "[.]" ] ;
+ 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=" ")\" ;
+}
+
+class check-expression-evaluator
+{
+ import configure ;
+
+ rule __init__ ( expression + : true-properties * : false-properties * )
+ {
+ self.expression = $(expression) ;
+ self.true-properties = $(true-properties) ;
+ self.false-properties = $(false-properties) ;
+ }
+
+ rule check ( properties * )
+ {
+ local to-eval ;
+ local tokens = "and" "or" ;
+ # Go through the expression and: eval the target values,
+ # and normalize to a full expression.
+ for local term in $(self.expression)
+ {
+ if ! ( $(term:L) in $(tokens) )
+ {
+ # A value is a target reference that will evan to "true"
+ # or "false".
+ if $(to-eval[-1]:L) && ! ( $(to-eval[-1]:L) in $(tokens) )
+ {
+ # Default to "and" operation.
+ to-eval += "and" ;
+ }
+ local message = [ modules.peek predef : _message_($(term)) ] ;
+ if [ configure.builds $(term) : $(properties) : $(message) ]
+ {
+ to-eval += "true" ;
+ }
+ else
+ {
+ to-eval += "false" ;
+ }
+ }
+ else
+ {
+ to-eval += $(term) ;
+ }
+ }
+ # Eval full the expression.
+ local eval-result = [ eval $(to-eval) ] ;
+ # And resolve true/false properties.
+ if $(eval-result) = "true"
+ {
+ return $(self.true-properties) ;
+ }
+ else
+ {
+ return $(self.false-properties) ;
+ }
+ }
+
+ rule eval ( e * )
+ {
+ local r ;
+ if $(e[1]) && $(e[2]) && $(e[3])
+ {
+ if $(e[2]) = "and"
+ {
+ if $(e[1]) = "true" && $(e[3]) = "true"
+ {
+ r = [ eval "true" $(e[4-]) ] ;
+ }
+ else
+ {
+ r = [ eval "false" $(e[4-]) ] ;
+ }
+ }
+ else if $(e[2]) = "or"
+ {
+ if $(e[1]) = "true" || $(e[3]) = "true"
+ {
+ r = [ eval "true" $(e[4-]) ] ;
+ }
+ else
+ {
+ r = [ eval "false" $(e[4-]) ] ;
+ }
+ }
+ }
+ else
+ {
+ r = $(e[1]) ;
+ }
+ return $(r) ;
+ }
+}
diff --git a/src/boost/libs/predef/tools/check/predef_check.h b/src/boost/libs/predef/tools/check/predef_check.h
new file mode 100644
index 000000000..a6917c173
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/predef_check.h
@@ -0,0 +1,98 @@
+/*
+Copyright Rene Rivera 2011-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)
+*/
+#include <boost/predef/detail/test_def.h>
+
+const char * str_token(const char ** str, const char * space)
+{
+ unsigned span;
+ char * token;
+ for (; **str != 0; *str += 1)
+ {
+ if (0 == strchr(space, **str))
+ {
+ break;
+ }
+ }
+ span = strcspn(*str, space);
+ token = (char *)malloc(span+1);
+ strncpy(token, *str, span);
+ token[span] = 0;
+ for (*str += span; **str != 0; *str += 1)
+ {
+ if (0 == strchr(space, **str))
+ {
+ break;
+ }
+ }
+ return token;
+}
+
+const char * whitespace = " ";
+const char * dot = ".";
+
+int main(int argc, const char ** argv)
+{
+ unsigned x = 0;
+ int argi = 1;
+ create_predef_entries();
+#if 0
+ qsort(generated_predef_info,generated_predef_info_count,
+ sizeof(predef_info),predef_info_compare);
+ for (x = 0; x < generated_predef_info_count; ++x)
+ {
+ printf("%s: %d\n", generated_predef_info[x].name, generated_predef_info[x].value);
+ }
+#endif
+ int result = -1;
+ for (argi = 1; argi < argc; ++argi)
+ {
+ const char * exp = argv[argi];
+ const char * exp_name = str_token(&exp, whitespace);
+ const char * exp_op = str_token(&exp, whitespace);
+ const char * exp_val = str_token(&exp, whitespace);
+ unsigned exp_version = 0;
+ if (*exp_val != 0)
+ {
+ exp = exp_val;
+ const char * exp_val_a = str_token(&exp, dot);
+ const char * exp_val_b = str_token(&exp, dot);
+ const char * exp_val_c = str_token(&exp, dot);
+ exp_version = BOOST_VERSION_NUMBER(atoi(exp_val_a), atoi(exp_val_b),atoi(exp_val_c));
+ }
+ for (x = 0; x < generated_predef_info_count; ++x)
+ {
+ if (*exp_op == 0 &&
+ generated_predef_info[x].value > 0 &&
+ strcmp(exp_name, generated_predef_info[x].name) == 0)
+ {
+ /* Expression of the form "BOOST_x_yy" is true. */
+ result = 0;
+ break;
+ }
+ else if (*exp_op == 0 &&
+ generated_predef_info[x].value == 0 &&
+ strcmp(exp_name, generated_predef_info[x].name) == 0)
+ {
+ /* Expression of the form "BOOST_x_yy" is false. */
+ return argi;
+ }
+ else if (*exp_op != 0 && *exp_val != 0 &&
+ strcmp(exp_name, generated_predef_info[x].name) == 0)
+ {
+ /* Expression of the form "BOOST_x_yy op val". */
+ result = 0;
+ if (0 == strcmp(">",exp_op) && !(generated_predef_info[x].value > exp_version)) return argi;
+ if (0 == strcmp("<",exp_op) && !(generated_predef_info[x].value < exp_version)) return argi;
+ if (0 == strcmp(">=",exp_op) && !(generated_predef_info[x].value >= exp_version)) return argi;
+ if (0 == strcmp("<=",exp_op) && !(generated_predef_info[x].value <= exp_version)) return argi;
+ if (0 == strcmp("==",exp_op) && !(generated_predef_info[x].value == exp_version)) return argi;
+ if (0 == strcmp("!=",exp_op) && !(generated_predef_info[x].value != exp_version)) return argi;
+ }
+ }
+ }
+ return result;
+}
diff --git a/src/boost/libs/predef/tools/check/predef_check_as_c.c b/src/boost/libs/predef/tools/check/predef_check_as_c.c
new file mode 100644
index 000000000..352c18ba9
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/predef_check_as_c.c
@@ -0,0 +1,7 @@
+/*
+Copyright Rene Rivera 2011-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)
+*/
+#include "predef_check.h"
diff --git a/src/boost/libs/predef/tools/check/predef_check_as_cpp.cpp b/src/boost/libs/predef/tools/check/predef_check_as_cpp.cpp
new file mode 100644
index 000000000..352c18ba9
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/predef_check_as_cpp.cpp
@@ -0,0 +1,7 @@
+/*
+Copyright Rene Rivera 2011-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)
+*/
+#include "predef_check.h"
diff --git a/src/boost/libs/predef/tools/check/predef_check_as_objc.m b/src/boost/libs/predef/tools/check/predef_check_as_objc.m
new file mode 100644
index 000000000..352c18ba9
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/predef_check_as_objc.m
@@ -0,0 +1,7 @@
+/*
+Copyright Rene Rivera 2011-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)
+*/
+#include "predef_check.h"
diff --git a/src/boost/libs/predef/tools/check/predef_check_as_objcpp.mm b/src/boost/libs/predef/tools/check/predef_check_as_objcpp.mm
new file mode 100644
index 000000000..352c18ba9
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/predef_check_as_objcpp.mm
@@ -0,0 +1,7 @@
+/*
+Copyright Rene Rivera 2011-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)
+*/
+#include "predef_check.h"
diff --git a/src/boost/libs/predef/tools/check/predef_check_cc.h b/src/boost/libs/predef/tools/check/predef_check_cc.h
new file mode 100644
index 000000000..da7609ec4
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/predef_check_cc.h
@@ -0,0 +1,19 @@
+/*
+Copyright Rene Rivera 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)
+*/
+#include <boost/predef.h>
+
+#ifdef CHECK
+# if ((CHECK) == 0)
+# error "FAILED"
+# endif
+#endif
+
+int dummy()
+{
+ static int d = 0;
+ return d++;
+}
diff --git a/src/boost/libs/predef/tools/check/predef_check_cc_as_c.c b/src/boost/libs/predef/tools/check/predef_check_cc_as_c.c
new file mode 100644
index 000000000..24fab13e3
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/predef_check_cc_as_c.c
@@ -0,0 +1,7 @@
+/*
+Copyright Rene Rivera 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)
+*/
+#include "predef_check_cc.h"
diff --git a/src/boost/libs/predef/tools/check/predef_check_cc_as_cpp.cpp b/src/boost/libs/predef/tools/check/predef_check_cc_as_cpp.cpp
new file mode 100644
index 000000000..24fab13e3
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/predef_check_cc_as_cpp.cpp
@@ -0,0 +1,7 @@
+/*
+Copyright Rene Rivera 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)
+*/
+#include "predef_check_cc.h"
diff --git a/src/boost/libs/predef/tools/check/predef_check_cc_as_objc.m b/src/boost/libs/predef/tools/check/predef_check_cc_as_objc.m
new file mode 100644
index 000000000..24fab13e3
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/predef_check_cc_as_objc.m
@@ -0,0 +1,7 @@
+/*
+Copyright Rene Rivera 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)
+*/
+#include "predef_check_cc.h"
diff --git a/src/boost/libs/predef/tools/check/predef_check_cc_as_objcpp.mm b/src/boost/libs/predef/tools/check/predef_check_cc_as_objcpp.mm
new file mode 100644
index 000000000..24fab13e3
--- /dev/null
+++ b/src/boost/libs/predef/tools/check/predef_check_cc_as_objcpp.mm
@@ -0,0 +1,7 @@
+/*
+Copyright Rene Rivera 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)
+*/
+#include "predef_check_cc.h"