This is an automated email from the ASF dual-hosted git repository.

szaszm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit ef58807d70da2ce723f2e4ad8f0a04b0ee858515
Author: Martin Zink <martinz...@apache.org>
AuthorDate: Fri May 10 15:50:12 2024 +0200

    MINIFICPP-2371 Build fix for >= libc++17
    
    Closes #1786
    
    Signed-off-by: Marton Szasz <sza...@apache.org>
---
 .github/workflows/ci.yml                      |  3 --
 bootstrap/package_manager.py                  |  5 ++
 bootstrap/system_dependency.py                |  1 +
 cmake/Date.cmake                              |  6 +++
 extensions/expression-language/CMakeLists.txt | 29 +++++++++++
 libminifi/include/utils/TimeUtil.h            |  2 +-
 thirdparty/date/826_libcpp_17_build_fix.patch | 69 +++++++++++++++++++++++++++
 7 files changed, 111 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 7ca9c8bba..1e14505d6 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -90,9 +90,6 @@ jobs:
           echo -e "127.0.0.1\t$HOSTNAME" | sudo tee -a /etc/hosts > /dev/null
       - name: build
         run: |
-          export PATH="/usr/local/opt/flex/bin:/usr/local/opt/bison/bin:$PATH"
-          export LDFLAGS="-L/usr/local/opt/flex/lib,-L/usr/local/opt/bison/lib"
-          export CPPFLAGS="-I/usr/local/opt/flex/include"
           python -m venv venv && source venv/bin/activate && pip install -r 
requirements.txt && python main.py --noninteractive --skip-compiler-install 
--cmake-options="-DCMAKE_C_FLAGS=${CPPFLAGS} ${CFLAGS} 
-DCMAKE_CXX_FLAGS=${CPPFLAGS} ${CXXFLAGS}" 
--minifi-options="${MACOS_MINIFI_OPTIONS}"
         working-directory: bootstrap
       - name: cache save
diff --git a/bootstrap/package_manager.py b/bootstrap/package_manager.py
index b5257c55f..d9ecdb510 100644
--- a/bootstrap/package_manager.py
+++ b/bootstrap/package_manager.py
@@ -105,6 +105,11 @@ class BrewPackageManager(PackageManager):
         lines = [line.split('@', 1)[0] for line in lines]
         return set(lines)
 
+    def run_cmd(self, cmd: str) -> bool:
+        add_m4_to_path_cmd = 'export PATH="$(brew --prefix m4)/bin:$PATH"'
+        result = subprocess.run(f"{add_m4_to_path_cmd} && {cmd}", shell=True, 
text=True)
+        return result.returncode == 0
+
 
 class AptPackageManager(PackageManager):
     def __init__(self, no_confirm):
diff --git a/bootstrap/system_dependency.py b/bootstrap/system_dependency.py
index 74a864f74..f4c273f3b 100644
--- a/bootstrap/system_dependency.py
+++ b/bootstrap/system_dependency.py
@@ -27,6 +27,7 @@ def _create_system_dependencies(minifi_options: 
MinifiOptions) -> Dict[str, Set[
     if minifi_options.is_enabled("ENABLE_EXPRESSION_LANGUAGE"):
         system_dependencies['bison'] = {'bison'}
         system_dependencies['flex'] = {'flex'}
+        system_dependencies['m4'] = {'m4'}
     if minifi_options.is_enabled("ENABLE_LIBARCHIVE"):
         system_dependencies['libarchive'] = {'libarchive'}
     if minifi_options.is_enabled("ENABLE_PCAP"):
diff --git a/cmake/Date.cmake b/cmake/Date.cmake
index 696f51ba4..3224e4187 100644
--- a/cmake/Date.cmake
+++ b/cmake/Date.cmake
@@ -45,9 +45,15 @@ if (WIN32)
         COMPONENT bin)
 endif()
 
+set(PATCH_FILE 
"${CMAKE_SOURCE_DIR}/thirdparty/date/826_libcpp_17_build_fix.patch")
+set(PC ${Bash_EXECUTABLE}  -c "set -x &&\
+        (\\\"${Patch_EXECUTABLE}\\\" -p1 -R -s -f --dry-run -i 
\\\"${PATCH_FILE}\\\" || \\\"${Patch_EXECUTABLE}\\\" -p1 -N -i 
\\\"${PATCH_FILE}\\\")")
+
+
 FetchContent_Declare(date_src
     URL             
https://github.com/HowardHinnant/date/archive/refs/tags/v3.0.1.tar.gz
     URL_HASH        
SHA256=7a390f200f0ccd207e8cff6757e04817c1a0aec3e327b006b7eb451c57ee3538
+    PATCH_COMMAND "${PC}"
 )
 FetchContent_GetProperties(date_src)
 if (NOT date_src_POPULATED)
diff --git a/extensions/expression-language/CMakeLists.txt 
b/extensions/expression-language/CMakeLists.txt
index 0b357cea1..8f89c9958 100644
--- a/extensions/expression-language/CMakeLists.txt
+++ b/extensions/expression-language/CMakeLists.txt
@@ -64,6 +64,32 @@ if(WIN32)
     list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/winflexbison")
 endif()
 
+# On macOS brew installed bison and flex are preferred
+if (CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin")
+    execute_process(
+            COMMAND brew --prefix bison
+            RESULT_VARIABLE BREW_BISON
+            OUTPUT_VARIABLE BREW_BISON_PREFIX
+            OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    if (BREW_BISON EQUAL 0 AND EXISTS "${BREW_BISON_PREFIX}")
+        message(STATUS "Found Bison keg installed by Homebrew at 
${BREW_BISON_PREFIX}")
+        set(BISON_EXECUTABLE "${BREW_BISON_PREFIX}/bin/bison")
+    endif()
+
+    execute_process(
+            COMMAND brew --prefix flex
+            RESULT_VARIABLE BREW_FLEX
+            OUTPUT_VARIABLE BREW_FLEX_PREFIX
+            OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    if (BREW_FLEX EQUAL 0 AND EXISTS "${BREW_FLEX_PREFIX}")
+        message(STATUS "Found Flex keg installed by Homebrew at 
${BREW_FLEX_PREFIX}")
+        set(FLEX_EXECUTABLE "${BREW_FLEX_PREFIX}/bin/flex")
+        set(BREW_FLEX_INCLUDE "${BREW_FLEX_PREFIX}/include")
+    endif()
+endif()
+
 find_package(BISON REQUIRED)
 find_package(FLEX REQUIRED)
 
@@ -107,6 +133,9 @@ add_minifi_library(minifi-expression-language-extensions 
SHARED ${SOURCES} ${BIS
 
 target_link_libraries(minifi-expression-language-extensions ${LIBMINIFI})
 target_link_libraries(minifi-expression-language-extensions RapidJSON 
CURL::libcurl)
+if (BREW_FLEX_INCLUDE)
+    target_include_directories(minifi-expression-language-extensions PRIVATE 
${BREW_FLEX_INCLUDE})
+endif()
 
 register_extension(minifi-expression-language-extensions "EXPRESSION LANGUAGE 
EXTENSIONS" EXPRESSION-LANGUAGE-EXTENSIONS "This enables NiFi expression 
language" "extensions/expression-language/tests")
 register_extension_linter(minifi-expression-language-extensions-linter)
diff --git a/libminifi/include/utils/TimeUtil.h 
b/libminifi/include/utils/TimeUtil.h
index 7cd022d9f..72f828431 100644
--- a/libminifi/include/utils/TimeUtil.h
+++ b/libminifi/include/utils/TimeUtil.h
@@ -44,7 +44,7 @@
 
 #define TIME_FORMAT "%Y-%m-%d %H:%M:%S"
 
-#if defined(_LIBCPP_VERSION)
+#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 170000
 namespace org::apache::nifi::minifi::detail {
 template<typename T>
 concept has_spaceship_operator = requires(T t, T u) { t <=> u; };  // 
NOLINT(readability/braces)
diff --git a/thirdparty/date/826_libcpp_17_build_fix.patch 
b/thirdparty/date/826_libcpp_17_build_fix.patch
new file mode 100644
index 000000000..4d0647996
--- /dev/null
+++ b/thirdparty/date/826_libcpp_17_build_fix.patch
@@ -0,0 +1,69 @@
+diff --git a/include/date/date.h b/include/date/date.h
+index 7b6b4e4..db91ed6 100644
+--- a/include/date/date.h
++++ b/include/date/date.h
+@@ -4228,7 +4228,7 @@ inline
+ std::basic_ostream<CharT, Traits>&
+ operator<<(std::basic_ostream<CharT, Traits>& os, const local_time<Duration>& 
ut)
+ {
+-    return (os << sys_time<Duration>{ut.time_since_epoch()});
++    return (date::operator<<(os, sys_time<Duration>{ut.time_since_epoch()}));
+ }
+ 
+ namespace detail
+diff --git a/include/date/ptz.h b/include/date/ptz.h
+index ebd6e04..8b9a046 100644
+--- a/include/date/ptz.h
++++ b/include/date/ptz.h
+@@ -593,7 +593,7 @@ time_zone::name() const
+     auto print_offset = [](seconds off)
+         {
+             std::string nm;
+-            hh_mm_ss<seconds> offset{-off};
++            date::hh_mm_ss<seconds> offset{-off};
+             if (offset.is_negative())
+                 nm += '-';
+             nm += std::to_string(offset.hours().count());
+diff --git a/include/date/tz.h b/include/date/tz.h
+index 4921068..bacd055 100644
+--- a/include/date/tz.h
++++ b/include/date/tz.h
+@@ -231,8 +231,8 @@ nonexistent_local_time::make_msg(local_time<Duration> tp, 
const local_info& i)
+        << i.first.abbrev << " and\n"
+        << local_seconds{i.second.begin.time_since_epoch()} + i.second.offset 
<< ' '
+        << i.second.abbrev
+-       << " which are both equivalent to\n"
+-       << i.first.end << " UTC";
++       << " which are both equivalent to\n";
++    date::operator<<(os, i.first.end) << " UTC";
+     return os.str();
+ }
+ 
+diff --git a/include/date/tz_private.h b/include/date/tz_private.h
+index aec01d0..1a01f17 100644
+--- a/include/date/tz_private.h
++++ b/include/date/tz_private.h
+@@ -289,8 +289,7 @@ struct transition
+     std::ostream&
+     operator<<(std::ostream& os, const transition& t)
+     {
+-        using date::operator<<;
+-        os << t.timepoint << "Z ";
++        date::operator<<(os, t.timepoint) << "Z ";
+         if (t.info->offset >= std::chrono::seconds{0})
+             os << '+';
+         os << make_time(t.info->offset);
+diff --git a/src/tz.cpp b/src/tz.cpp
+index 26babbd..98daeb4 100644
+--- a/src/tz.cpp
++++ b/src/tz.cpp
+@@ -2625,8 +2625,7 @@ operator<<(std::ostream& os, const time_zone& z)
+ std::ostream&
+ operator<<(std::ostream& os, const leap_second& x)
+ {
+-    using namespace date;
+-    return os << x.date_ << "  +";
++    return date::operator<<(os, x.date_) << "  +";
+ }
+ 
+ #if USE_OS_TZDB

Reply via email to