diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 75a212984..315c0842a 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -233,4 +233,9 @@ jobs:
haxe: ${{ inputs.haxe }}
- name: test c/cxx_standard attributes
working-directory: test/cxx_standard
- run: haxelib run hxcpp Build.xml
+ shell: bash
+ run: |
+ for xml in *.xml; do
+ haxelib run hxcpp $xml
+ haxelib run hxcpp $xml clean
+ done
diff --git a/test/cxx_standard/Build_legacy.xml b/test/cxx_standard/Build_legacy.xml
new file mode 100644
index 000000000..e9c4efa99
--- /dev/null
+++ b/test/cxx_standard/Build_legacy.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/cxx_standard/Build_section.xml b/test/cxx_standard/Build_section.xml
new file mode 100644
index 000000000..af4ab0cdb
--- /dev/null
+++ b/test/cxx_standard/Build_section.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/tools/hxcpp/BuildTool.hx b/tools/hxcpp/BuildTool.hx
index 82a2b533e..49ee8b9d1 100644
--- a/tools/hxcpp/BuildTool.hx
+++ b/tools/hxcpp/BuildTool.hx
@@ -164,45 +164,8 @@ class BuildTool
Profile.setEntry("parse xml");
-
-
- if (mDefines.exists("HXCPP_C_STANDARD")) {
- defaultCStandard = Std.parseInt(mDefines.get("HXCPP_C_STANDARD"));
- }
-
- // Hxcpp requires C++11, so the default standard cannot be less than that
- if (mDefines.exists("HXCPP_CXX_STANDARD")) {
- defaultCxxStandard = Std.parseInt(mDefines.get("HXCPP_CXX_STANDARD"));
- if (defaultCxxStandard < 11) {
- Log.warn('Increasing default C++ standard to C++11 instead of C++${defaultCxxStandard}');
- defaultCxxStandard = 11;
- }
- } else if(mDefines.exists("HXCPP_CPP17")) {
- defaultCxxStandard = 17;
- } else if (mDefines.exists("HXCPP_CPP14")) {
- defaultCxxStandard = 14;
- } else {
- defaultCxxStandard = 11;
- }
-
- if (mDefines.exists("HXCPP_OBJC_STANDARD")) {
- defaultObjCStandard = Std.parseInt(mDefines.get("HXCPP_OBJC_STANDARD"));
- }
-
- if (mDefines.exists("HXCPP_OBJCXX_STANDARD")) {
- defaultObjCxxStandard = Std.parseInt(mDefines.get("HXCPP_OBJCXX_STANDARD"));
- if (defaultObjCxxStandard < 11) {
- Log.warn('Increasing default Obj-C++ standard to Obj-C++11 instead of Obj-C++${defaultObjCxxStandard}');
- defaultObjCxxStandard = 11;
- }
- } else {
- defaultObjCxxStandard = 11;
- }
-
include("toolchain/setup.xml");
-
-
if (mDefines.exists("toolchain"))
{
if (!mDefines.exists("BINDIR"))
@@ -1021,10 +984,58 @@ class BuildTool
if (inTags!=null)
group.mTags = inTags;
- group.mCStandard = inXML.has.c_standard ? Std.parseInt(substitute(inXML.att.c_standard)) : defaultCStandard;
- group.mObjCStandard = inXML.has.objc_standard ? Std.parseInt(substitute(inXML.att.objc_standard)) : defaultObjCStandard != null ? defaultObjCStandard : group.mCStandard;
- group.mCxxStandard = inXML.has.cxx_standard ? Std.parseInt(substitute(inXML.att.cxx_standard)) : defaultCxxStandard;
- group.mObjCxxStandard = inXML.has.objcxx_standard ? Std.parseInt(substitute(inXML.att.objcxx_standard)) : defaultObjCxxStandard != null ? defaultObjCxxStandard : group.mCxxStandard;
+ if (mDefines.exists("HXCPP_C_STANDARD")) {
+ defaultCStandard = Std.parseInt(mDefines.get("HXCPP_C_STANDARD"));
+ }
+
+ // Hxcpp requires C++11, so the default standard cannot be less than that
+ if (mDefines.exists("HXCPP_CXX_STANDARD")) {
+ defaultCxxStandard = Std.parseInt(mDefines.get("HXCPP_CXX_STANDARD"));
+ if (defaultCxxStandard < 11) {
+ Log.warn('Increasing default C++ standard to C++11 instead of C++${defaultCxxStandard}');
+ defaultCxxStandard = 11;
+ }
+ } else if(mDefines.exists("HXCPP_CPP17")) {
+ defaultCxxStandard = 17;
+ } else if (mDefines.exists("HXCPP_CPP14")) {
+ defaultCxxStandard = 14;
+ } else {
+ defaultCxxStandard = 11;
+ }
+
+ if (mDefines.exists("HXCPP_OBJC_STANDARD")) {
+ defaultObjCStandard = Std.parseInt(mDefines.get("HXCPP_OBJC_STANDARD"));
+ }
+
+ if (mDefines.exists("HXCPP_OBJCXX_STANDARD")) {
+ defaultObjCxxStandard = Std.parseInt(mDefines.get("HXCPP_OBJCXX_STANDARD"));
+ if (defaultObjCxxStandard < 11) {
+ Log.warn('Increasing default Obj-C++ standard to Obj-C++11 instead of Obj-C++${defaultObjCxxStandard}');
+ defaultObjCxxStandard = 11;
+ }
+ } else {
+ defaultObjCxxStandard = 11;
+ }
+
+ if (inXML.has.c_standard)
+ group.mCStandard = Std.parseInt(substitute(inXML.att.c_standard));
+ else if (group.mCStandard == null)
+ group.mCStandard = defaultCStandard;
+
+ if (inXML.has.objc_standard)
+ group.mObjCStandard = Std.parseInt(substitute(inXML.att.objc_standard));
+ else if (group.mObjCStandard == null)
+ group.mObjCStandard = defaultObjCStandard != null ? defaultObjCStandard : group.mCStandard;
+
+ if (inXML.has.cxx_standard)
+ group.mCxxStandard = Std.parseInt(substitute(inXML.att.cxx_standard));
+ else if (group.mCxxStandard == null)
+ group.mCxxStandard = defaultCxxStandard;
+
+ if (inXML.has.objcxx_standard)
+ group.mObjCxxStandard = Std.parseInt(substitute(inXML.att.objcxx_standard));
+ else if (group.mObjCxxStandard == null)
+ group.mObjCxxStandard = defaultObjCxxStandard != null ? defaultObjCxxStandard : group.mCxxStandard;
for(el in inXML.elements)
{