From f0396fccd5195b2bcd738dd5bb023a346902176f Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Sun, 14 Dec 2025 19:52:46 -0600 Subject: [PATCH] updated build system --- CHANGELOG.md | 3 ++- CMakeLists.txt | 4 ++-- cmake/libraries/boost.cmake | 19 +++++++++---------- cmake/libraries/fuse.cmake | 2 +- cmake/settings.cmake | 2 +- docker/aarch64/alpine | 7 ++++--- docker/x86_64/alpine | 7 ++++--- docker/x86_64/flutter | 1 + docker/x86_64/mingw64 | 22 ++++++++++++++-------- scripts/docker_common.sh | 4 ++++ scripts/env.sh | 8 +++++++- scripts/libraries.sh | 6 ++++-- support/src/utils/unix.cpp | 31 +++++++++++++++++++++---------- 13 files changed, 74 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ba7e886..5107fc30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,10 @@ * \#21 [unit test] Complete WinFSP unit tests * \#65 [bug] Mount state is not being removed after unmount on Windows +* \#66 [bug] UI fails to install plist if LaunchAgents directory does not exist ### Changes from v2.0.7-release - + * Fixed Windows setup icon location --- diff --git a/CMakeLists.txt b/CMakeLists.txt index b382cef6..b4d68a35 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -139,8 +139,6 @@ if(PROJECT_BUILD) find_package(ICU REQUIRED COMPONENTS data i18n io uc) else() message(STATUS "-=[CMake Settings]=-") - message(STATUS " C standard: ${CMAKE_C_STANDARD}") - message(STATUS " C++ standard: ${CMAKE_CXX_STANDARD}") message(STATUS " CPU architecture: ${PROJECT_MARCH}") if(PROJECT_ENABLE_FUSE) message(STATUS " FUSE version: ${PROJECT_FUSE}") @@ -157,6 +155,8 @@ endif() DEPENDS ${PROJECT_DEPENDENCIES} COMMAND cd build && cmake ${CMAKE_CURRENT_SOURCE_DIR} + -DCMAKE_C_STANDARD=${CMAKE_C_STANDARD} + -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} -DCMAKE_GENERATOR=${CMAKE_GENERATOR} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DPROJECT_3RD_PARTY_DIR=${PROJECT_3RD_PARTY_DIR} diff --git a/cmake/libraries/boost.cmake b/cmake/libraries/boost.cmake index f3609603..74291967 100644 --- a/cmake/libraries/boost.cmake +++ b/cmake/libraries/boost.cmake @@ -94,29 +94,28 @@ if(PROJECT_ENABLE_BOOST) set(BOOST_LINK "static,shared") endif() + if(PROJECT_ENABLE_LIBBITCOIN_SYSTEM) + set(BOOST_CXX_STANDARD 20) + else() + set(BOOST_CXX_STANDARD ${CMAKE_CXX_STANDARD}) + endif() + set(BOOST_BUILD_ARGS --openssldir=$ENV{OPENSSL_ROOT_DIR} --prefix=${PROJECT_EXTERNAL_BUILD_ROOT} address-model=64 architecture=${BOOST_ARCH} - cxxstd=20 cxxstd-dialect=gnu - cxxflags=-std=gnu++${CMAKE_CXX_STANDARD} - cxxstd=${CMAKE_CXX_STANDARD} + cxxflags=-std=gnu++${BOOST_CXX_STANDARD} + cxxstd=${BOOST_CXX_STANDARD} define=BOOST_ASIO_HAS_STD_STRING_VIEW define=BOOST_SYSTEM_NO_DEPRECATED link=${BOOST_LINK} - linkflags=-std=gnu++${CMAKE_CXX_STANDARD} + linkflags=-std=gnu++${BOOST_CXX_STANDARD} threading=multi variant=${BOOST_BUILD_TYPE_LOWER} ) - if(PROJECT_ENABLE_LIBBITCOIN_SYSTEM) - set(BOOST_URL_HASH SHA256=${BOOST2_HASH}) - else() - set(BOOST_URL_HASH SHA256=${BOOST_HASH}) - endif() - ExternalProject_Add(boost_project PREFIX external URL ${PROJECT_3RD_PARTY_DIR}/boost_${BOOST_MAJOR_VERSION}_${BOOST_MINOR_VERSION}_${BOOST_PATCH_VERSION}.tar.gz diff --git a/cmake/libraries/fuse.cmake b/cmake/libraries/fuse.cmake index 6e45d35e..a9ea346f 100644 --- a/cmake/libraries/fuse.cmake +++ b/cmake/libraries/fuse.cmake @@ -21,7 +21,7 @@ if(PROJECT_ENABLE_FUSE AND NOT PROJECT_IS_MINGW) endif() else() if (PROJECT_IS_DARWIN) - find_library(OSXFUSE NO_CACHE NAMES OSXFUSE) + find_library(OSXFUSE NO_CACHE NAMES MACFUSE OSXFUSE) if (NOT OSXFUSE) message(FATAL_ERROR "FUSE for macOS not found (https://macfuse.github.io)") endif () diff --git a/cmake/settings.cmake b/cmake/settings.cmake index 8a0898b8..7c9dd40e 100644 --- a/cmake/settings.cmake +++ b/cmake/settings.cmake @@ -4,7 +4,7 @@ set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) -set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) diff --git a/docker/aarch64/alpine b/docker/aarch64/alpine index 192e70b4..fc0c15aa 100644 --- a/docker/aarch64/alpine +++ b/docker/aarch64/alpine @@ -1,11 +1,12 @@ #comment -FROM arm64v8/alpine:3.22.2 +FROM arm64v8/alpine:3.23 MAINTAINER Scott E. Graves CMD bash RUN apk update RUN apk upgrade RUN apk add \ + 7zip \ autoconf \ automake \ bash \ @@ -80,5 +81,5 @@ RUN apk add \ zstd-static \ xz-static -RUN ln -sf /usr/bin/aclocal-1.17 /usr/bin/aclocal-1.16 -RUN ln -sf /usr/bin/automake-1.17 /usr/bin/automake-1.16 +RUN ln -sf /usr/bin/aclocal-1.18 /usr/bin/aclocal-1.16 +RUN ln -sf /usr/bin/automake-1.18 /usr/bin/automake-1.16 diff --git a/docker/x86_64/alpine b/docker/x86_64/alpine index 8974cfcf..fa109de7 100644 --- a/docker/x86_64/alpine +++ b/docker/x86_64/alpine @@ -1,11 +1,12 @@ #comment -FROM alpine:3.22.2 +FROM alpine:3.23 MAINTAINER Scott E. Graves CMD bash RUN apk update RUN apk upgrade RUN apk add \ + 7zip \ autoconf \ automake \ bash \ @@ -80,5 +81,5 @@ RUN apk add \ zstd-static \ xz-static -RUN ln -sf /usr/bin/aclocal-1.17 /usr/bin/aclocal-1.16 -RUN ln -sf /usr/bin/automake-1.17 /usr/bin/automake-1.16 +RUN ln -sf /usr/bin/aclocal-1.18 /usr/bin/aclocal-1.16 +RUN ln -sf /usr/bin/automake-1.18 /usr/bin/automake-1.16 diff --git a/docker/x86_64/flutter b/docker/x86_64/flutter index e086270b..03ff3697 100644 --- a/docker/x86_64/flutter +++ b/docker/x86_64/flutter @@ -1,3 +1,4 @@ +#comment FROM debian:latest ARG UID=0 diff --git a/docker/x86_64/mingw64 b/docker/x86_64/mingw64 index e3cb821d..94f3859a 100644 --- a/docker/x86_64/mingw64 +++ b/docker/x86_64/mingw64 @@ -1,16 +1,17 @@ #comment -FROM alpine:3.22.2 +FROM alpine:3.23 RUN apk update RUN apk upgrade RUN apk add \ + 7zip \ autoconf \ automake \ bash \ binutils \ bison \ bzip2 \ - clang17-extra-tools \ + clang21-extra-tools \ cmake \ curl \ file \ @@ -63,7 +64,10 @@ ENV MY_MINGW_PREFIX=${MINGW_PREFIX} ARG NUM_JOBS=2 ENV MY_NUM_JOBS=${NUM_JOBS} -ARG CXX_STANDARD=20 +ARG C_STANDARD=11 +ENV MY_C_STANDARD=${C_STANDARD} + +ARG CXX_STANDARD=23 ENV MY_CXX_STANDARD=${CXX_STANDARD} ARG TOOLCHAIN_FILE_CMAKE=/cmake_toolchain.cmake @@ -259,6 +263,7 @@ RUN cd /3rd_party/mingw64 && sha256sum -c ./pkg-config-${MY_PKG_CONFIG_VERSION}. && tar xvzf /3rd_party/mingw64/pkg-config-${MY_PKG_CONFIG_VERSION}.tar.gz \ && cd pkg-config-${MY_PKG_CONFIG_VERSION} \ && ./configure \ + CFLAGS='-std=gnu11' \ --disable-nls \ --disable-shared \ --prefix=/usr/local \ @@ -273,7 +278,7 @@ RUN python3 -m pip install --break-system-packages -U mako RUN python3 -m pip install --break-system-packages -U meson RUN python3 -m pip install --break-system-packages -U packaging -ENV CXXFLAGS="-std=gnu++20" +ENV CXXFLAGS="-std=gnu++${MY_CXX_STANDARD}" ENV LDFLAGS="-L${MY_MINGW_DIR}/lib -L${MY_MINGW_DIR}/lib64" ENV PATH="${MY_MINGW_DIR}/bin:/usr/local/bin:${PATH}" ENV PKG_CONFIG_PATH="${MY_MINGW_DIR}/lib/pkgconfig:${MY_MINGW_DIR}/lib64/pkgconfig" @@ -490,7 +495,7 @@ RUN if [ -f "/3rd_party/boost_${MY_BOOST2_MAJOR_VERSION}_${MY_BOOST2_MINOR_VERSI && ./bootstrap.sh \ --with-libraries=atomic,chrono,date_time,filesystem,iostreams,locale,log,program_options,random,regex,serialization,system,test,thread \ address-model=64 \ - cxxstd=${MY_CXX_STANDARD} \ + cxxstd=20 \ cxxstd-dialect=gnu \ architecture=x86 \ link=static,shared \ @@ -504,7 +509,7 @@ RUN if [ -f "/3rd_party/boost_${MY_BOOST2_MAJOR_VERSION}_${MY_BOOST2_MINOR_VERSI --prefix=${MY_MINGW_DIR} \ -j${MY_NUM_JOBS} \ address-model=64 \ - cxxstd=${MY_CXX_STANDARD} \ + cxxstd=20 \ cxxstd-dialect=gnu \ architecture=x86 \ link=static,shared \ @@ -547,8 +552,8 @@ RUN if [ -f "/3rd_party/boost_${MY_BOOST_MAJOR_VERSION}_${MY_BOOST_MINOR_VERSION -j${MY_NUM_JOBS} \ address-model=64 \ architecture=x86 \ - cxxstd=${MY_CXX_STANDARD} \ - cxxstd-dialect=gnu \ + cxxstd=${MY_CXX_STANDARD} \ + cxxstd-dialect=gnu \ link=static,shared \ target-os=windows \ threading=multi \ @@ -837,6 +842,7 @@ RUN if [ -f "/3rd_party/libevent-${MY_LIBEVENT_VERSION}-stable.tar.gz" ]; then \ -DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \ -DCMAKE_C_FLAGS="-include winsock2.h -include ws2tcpip.h -include iphlpapi.h" \ -DCMAKE_INSTALL_PREFIX=${MY_MINGW_DIR} \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ -DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \ -DEVENT__DISABLE_OPENSSL=ON \ -DEVENT__DISABLE_SAMPLES=ON \ diff --git a/scripts/docker_common.sh b/scripts/docker_common.sh index ae0559aa..c1e0d9b9 100755 --- a/scripts/docker_common.sh +++ b/scripts/docker_common.sh @@ -25,6 +25,8 @@ cp -f ${PROJECT_SOURCE_DIR}/docker/${PROJECT_BUILD_ARCH}/${DOCKER_NAME} Dockerfi if [ "${PROJECT_BUILD_ARCH}" == "aarch64" ]; then docker build ${APP_VERSION_BUILD_ARGS} \ --platform linux/arm64 \ + --build-arg C_STANDARD=${PROJECT_C_STANDARD} \ + --build-arg CXX_STANDARD=${PROJECT_CXX_STANDARD} \ --build-arg NUM_JOBS=${NUM_JOBS} \ --build-arg UID=$(id -u) \ --build-arg GID=$(id -g) \ @@ -32,6 +34,8 @@ if [ "${PROJECT_BUILD_ARCH}" == "aarch64" ]; then -t ${DOCKER_TAG} . || exit 1 else docker build ${APP_VERSION_BUILD_ARGS} \ + --build-arg C_STANDARD=${PROJECT_C_STANDARD} \ + --build-arg CXX_STANDARD=${PROJECT_CXX_STANDARD} \ --build-arg NUM_JOBS=${NUM_JOBS} \ --build-arg UID=$(id -u) \ --build-arg GID=$(id -g) \ diff --git a/scripts/env.sh b/scripts/env.sh index 7166d2a4..1da53a3b 100755 --- a/scripts/env.sh +++ b/scripts/env.sh @@ -7,6 +7,8 @@ PROJECT_IS_MINGW=$4 PROJECT_IS_MINGW_UNIX=$5 DISABLE_CREATE_DIRS=$6 +PROJECT_CXX_STANDARD=23 +PROJECT_C_STANDARD=11 PROJECT_FLUTTER_BASE_HREF="/" if [ "${PROJECT_IS_MINGW}" != "1" ]; then @@ -46,7 +48,7 @@ for PROJECT_LIBRARY in "${PROJECT_LIBRARIES[@]}"; do done PROJECT_APP_LIST=() -PROJECT_CMAKE_OPTS="" +PROJECT_CMAKE_OPTS="-DCMAKE_C_STANDARD=${PROJECT_C_STANDARD} -DCMAKE_CXX_STANDARD=${PROJECT_CXX_STANDARD}" PROJECT_ENABLE_V2_ERRORS=OFF PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF PROJECT_IS_ALPINE=0 @@ -340,6 +342,8 @@ export PROJECT_CMAKE_BUILD_TYPE_LOWER export PROJECT_CMAKE_OPTS export PROJECT_COMPANY_NAME export PROJECT_COPYRIGHT +export PROJECT_CXX_STANDARD +export PROJECT_C_STANDARD export PROJECT_DESC export PROJECT_DIST_DIR export PROJECT_ENABLE_V2_ERRORS @@ -391,6 +395,8 @@ echo " Build arch2: ${PROJECT_BUILD_ARCH2}" echo " Build clean: ${PROJECT_BUILD_CLEAN}" echo " Build dir: ${PROJECT_BUILD_DIR}" echo " Build shared libraries: ${PROJECT_BUILD_SHARED_LIBS}" +echo " C std: ${PROJECT_C_STANDARD}" +echo " CXX std: ${PROJECT_CXX_STANDARD}" echo " CMake options: -G\"Unix Makefiles\" -DPROJECT_COMPANY_NAME=\"${PROJECT_COMPANY_NAME}\" -DPROJECT_COPYRIGHT=\"${PROJECT_COPYRIGHT}\" -DPROJECT_DESC=\"${PROJECT_DESC}\" -DPROJECT_URL=\"${PROJECT_URL}\" ${PROJECT_CMAKE_OPTS} " echo " CMake toolchain file: ${PROJECT_TOOLCHAIN_FILE_CMAKE}" echo " Cmake Build type: ${PROJECT_CMAKE_BUILD_TYPE}" diff --git a/scripts/libraries.sh b/scripts/libraries.sh index 660ce959..78f7698f 100755 --- a/scripts/libraries.sh +++ b/scripts/libraries.sh @@ -52,9 +52,8 @@ PROJECT_DOWNLOADS[EXPAT]="https://github.com/libexpat/libexpat/archive/refs/tags PROJECT_DOWNLOADS[GCC]="https://mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-${PROJECT_VERSIONS[GCC]}/gcc-${PROJECT_VERSIONS[GCC]}.tar.gz;gcc-${PROJECT_VERSIONS[GCC]}.tar.gz;3rd_party/mingw64" PROJECT_DOWNLOADS[GTEST]="https://github.com/google/googletest/archive/refs/tags/v${PROJECT_VERSIONS[GTEST]}.tar.gz;googletest-${PROJECT_VERSIONS[GTEST]}.tar.gz;3rd_party" PROJECT_DOWNLOADS[ICU]="https://github.com/unicode-org/icu/archive/refs/tags/release-${PROJECT_VERSIONS[ICU]}.tar.gz;icu-release-${PROJECT_VERSIONS[ICU]}.tar.gz;3rd_party/mingw64" -PROJECT_DOWNLOADS[JSON]="https://github.com/nlohmann/json/archive/refs/tags/v${PROJECT_VERSIONS[JSON]}.tar.gz;json-${PROJECT_VERSIONS[JSON]}.tar.gz;3rd_party" PROJECT_DOWNLOADS[INNOSETUP]="https://files.jrsoftware.org/is/6/innosetup-${PROJECT_VERSIONS[INNOSETUP]}.exe;innosetup-${PROJECT_VERSIONS[INNOSETUP]}.exe;3rd_party/mingw64" -PROJECT_DOWNLOADS[WINFSP]="https://github.com/winfsp/winfsp/releases/download/v${PROJECT_VERSIONS[WINFSP2]}/winfsp-${PROJECT_VERSIONS[WINFSP]}.msi;winfsp-${PROJECT_VERSIONS[WINFSP]}.msi;3rd_party" +PROJECT_DOWNLOADS[JSON]="https://github.com/nlohmann/json/archive/refs/tags/v${PROJECT_VERSIONS[JSON]}.tar.gz;json-${PROJECT_VERSIONS[JSON]}.tar.gz;3rd_party" PROJECT_DOWNLOADS[LIBSODIUM]="https://github.com/jedisct1/libsodium/archive/refs/tags/${PROJECT_VERSIONS[LIBSODIUM]}-RELEASE.tar.gz;libsodium-${PROJECT_VERSIONS[LIBSODIUM]}.tar.gz;3rd_party" PROJECT_DOWNLOADS[MINGW]="https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/mingw-w64-v${PROJECT_VERSIONS[MINGW]}.tar.bz2;;mingw-w64-v${PROJECT_VERSIONS[MINGW]}.tar.bz2;3rd_party/mingw64" PROJECT_DOWNLOADS[OPENSSL]="https://github.com/openssl/openssl/releases/download/openssl-${PROJECT_VERSIONS[OPENSSL]}/openssl-${PROJECT_VERSIONS[OPENSSL]}.tar.gz;openssl-${PROJECT_VERSIONS[OPENSSL]}.tar.gz;3rd_party" @@ -64,5 +63,8 @@ PROJECT_DOWNLOADS[ROCKSDB]="https://github.com/facebook/rocksdb/archive/refs/tag PROJECT_DOWNLOADS[SPDLOG]="https://github.com/gabime/spdlog/archive/refs/tags/v${PROJECT_VERSIONS[SPDLOG]}.tar.gz;spdlog-${PROJECT_VERSIONS[SPDLOG]}.tar.gz;3rd_party" PROJECT_DOWNLOADS[SQLITE]="https://www.sqlite.org/2025/sqlite-amalgamation-${PROJECT_VERSIONS[SQLITE]}.zip;sqlite-amalgamation-${PROJECT_VERSIONS[SQLITE]}.zip;3rd_party" PROJECT_DOWNLOADS[STDUUID]="https://github.com/mariusbancila/stduuid/archive/refs/tags/v${PROJECT_VERSIONS[STDUUID]}.tar.gz;stduuid-${PROJECT_VERSIONS[STDUUID]}.tar.gz;3rd_party" +PROJECT_DOWNLOADS[WINFSP]="https://github.com/winfsp/winfsp/releases/download/v${PROJECT_VERSIONS[WINFSP2]}/winfsp-${PROJECT_VERSIONS[WINFSP]}.msi;winfsp-${PROJECT_VERSIONS[WINFSP]}.msi;3rd_party" PROJECT_DOWNLOADS[ZLIB]="https://github.com/madler/zlib/archive/refs/tags/v${PROJECT_VERSIONS[ZLIB]}.tar.gz;zlib-${PROJECT_VERSIONS[ZLIB]}.tar.gz;3rd_party/mingw64" export PROJECT_DOWNLOADS + +export VLC_WIN64_DOWNLOAD diff --git a/support/src/utils/unix.cpp b/support/src/utils/unix.cpp index 03b67b51..f5e33c91 100644 --- a/support/src/utils/unix.cpp +++ b/support/src/utils/unix.cpp @@ -311,11 +311,24 @@ auto use_getpwuid(uid_t uid, passwd_callback_t callback) -> result { #if defined(PROJECT_ENABLE_PUGIXML) auto generate_launchd_plist(const plist_cfg &cfg, bool overwrite_existing) -> bool { + REPERTORY_USES_FUNCTION_NAME(); + auto file = utils::path::combine(cfg.plist_path, {cfg.label + ".plist"}); if (utils::file::file{file}.exists() && not overwrite_existing) { return true; } + auto parent_directory = utils::path::get_parent_path(file); + if (not utils::file::directory{parent_directory}.create_directory()) { + utils::error::handle_error(function_name, + utils::error::create_error_message({ + "failed to create plist parent directory", + parent_directory, + std::to_string(errno), + })); + return false; + } + pugi::xml_document doc; auto decl = doc.append_child(pugi::node_declaration); decl.append_attribute("version") = "1.0"; @@ -370,26 +383,24 @@ auto generate_launchd_plist(const plist_cfg &cfg, bool overwrite_existing) #if defined(PROJECT_ENABLE_SPDLOG) || defined(PROJECT_ENABLE_FMT) auto launchctl_command(std::string_view label, launchctl_type type) -> int { + auto launch_agents_dir = utils::path::combine("~", { + "Library", + "LaunchAgents", + }); switch (type) { case launchctl_type::bootout: return system( fmt::format("launchctl bootout gui/{} '{}' 1>/dev/null 2>&1", getuid(), - utils::path::combine("~", - { - "/Library/LaunchAgents", - fmt::format("{}.plist", label), - })) + utils::path::combine(launch_agents_dir, + {fmt::format("{}.plist", label)})) .c_str()); case launchctl_type::bootstrap: return system( fmt::format("launchctl bootstrap gui/{} '{}' 1>/dev/null 2>&1", getuid(), - utils::path::combine("~", - { - "/Library/LaunchAgents", - fmt::format("{}.plist", label), - })) + utils::path::combine(launch_agents_dir, + {fmt::format("{}.plist", label)})) .c_str()); case launchctl_type::kickstart: