diff --git a/CMakeLists.txt b/CMakeLists.txt index 70a7dd3..464c31b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,10 @@ if(PROJECT_IS_ARM64) add_definitions(-DPROJECT_IS_ARM64) endif() +if(PROJECT_IS_DARWIN) + add_definitions(-DPROJECT_IS_DARWIN) +endif() + if(PROJECT_IS_MINGW) option(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES "Enable path sizes of 32767 characters on Windows" OFF) if(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES) @@ -115,6 +119,14 @@ if(PROJECT_BUILD) ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.cpp @ONLY ) + + if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.iss.in") + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.iss.in + ${PROJECT_DIST_DIR}/../${PROJECT_NAME}.iss + @ONLY + ) + endif() else() message(STATUS "-=[CMake Settings]=-") message(STATUS " C standard: ${CMAKE_C_STANDARD}") @@ -164,6 +176,7 @@ endif() -DPROJECT_INTERFACE=1 -DPROJECT_IS_ALPINE=${PROJECT_IS_ALPINE} -DPROJECT_IS_ARM64=${PROJECT_IS_ARM64} + -DPROJECT_IS_DARWIN=${PROJECT_IS_DARWIN} -DPROJECT_IS_MINGW=${PROJECT_IS_MINGW} -DPROJECT_IS_MINGW_UNIX=${PROJECT_IS_MINGW_UNIX} -DPROJECT_MAJOR_VERSION=${PROJECT_MAJOR_VERSION} diff --git a/cmake/flags.cmake b/cmake/flags.cmake index b6691f5..78b1e7e 100644 --- a/cmake/flags.cmake +++ b/cmake/flags.cmake @@ -35,13 +35,9 @@ list(APPEND PROJECT_CXXFLAGS_LIST -Wcast-align -Wconversion -Wdouble-promotion - -Wduplicated-branches - -Wduplicated-cond -Wextra -Wformat=2 - -Wlogical-op -Wmisleading-indentation - -Wno-useless-cast -Wnon-virtual-dtor -Wnull-dereference -Wold-style-cast @@ -52,6 +48,15 @@ list(APPEND PROJECT_CXXFLAGS_LIST -Wunused ) +if (NOT PROJECT_IS_DARWIN) + list(APPEND PROJECT_CXXFLAGS_LIST + -Wduplicated-branches + -Wduplicated-cond + -Wlogical-op + -Wno-useless-cast + ) +endif() + list(APPEND PROJECT_CFLAGS_LIST ${PROJECT_COMMON_FLAG_LIST} -std=c${CMAKE_C_STANDARD} @@ -62,7 +67,7 @@ list(APPEND PROJECT_CXXFLAGS_LIST -std=gnu++${CMAKE_CXX_STANDARD} ) -if(PROJECT_STATIC_LINK) +if(NOT PROJECT_IS_DARWIN AND PROJECT_STATIC_LINK) list(APPEND PROJECT_CMAKE_EXE_LINKER_FLAGS -static-libgcc -static-libstdc++ @@ -89,7 +94,11 @@ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${PROJECT_RELEASE_FLAG_L set(CMAKE_EXE_LINKER_FLAGS "${PROJECT_CMAKE_EXE_LINKER_FLAGS}") -set(EXTERNAL_CMAKE_CXX_FLAGS "-include cstdint -include utility -fext-numeric-literals ${PROJECT_COMMON_FLAG_LIST}") +set(EXTERNAL_CMAKE_CXX_FLAGS "-include cstdint -include utility ${PROJECT_COMMON_FLAG_LIST}") +if (NOT PROJECT_IS_DARWIN) + set(EXTERNAL_CMAKE_CXX_FLAGS "-fext-numeric-literals ${EXTERNAL_CMAKE_CXX_FLAGS}") +endif() + list(APPEND PROJECT_EXTERNAL_CMAKE_FLAGS -DCMAKE_BUILD_TYPE=${PROJECT_CMAKE_BUILD_TYPE} -DCMAKE_COLOR_MAKEFILE=${CMAKE_COLOR_MAKEFILE} diff --git a/cmake/hashes.cmake b/cmake/hashes.cmake index eff34f7..5c15149 100644 --- a/cmake/hashes.cmake +++ b/cmake/hashes.cmake @@ -5,6 +5,7 @@ set(EXPAT_HASH 85372797ff0673a8fc4a6be16466bb5a0ca28c0dcf3c6f7ac1686b4a3ba2aabb) set(GCC_HASH 51b9919ea69c980d7a381db95d4be27edf73b21254eb13d752a08003b4d013b1) set(GTEST_HASH 65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c) set(ICU_HASH a2c443404f00098e9e90acf29dc318e049d2dc78d9ae5f46efb261934a730ce2) +set(INNOSETUP_HASH f3c42116542c4cc57263c5ba6c4feabfc49fe771f2f98a79d2f7628b8762723b) set(JSON_HASH 4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187) set(MINGW_HASH 5afe822af5c4edbf67daaf45eec61d538f49eef6b19524de64897c6b95828caf) set(OPENSSL_HASH 529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f) diff --git a/cmake/libraries.cmake b/cmake/libraries.cmake index eac474a..ac25e56 100644 --- a/cmake/libraries.cmake +++ b/cmake/libraries.cmake @@ -53,7 +53,7 @@ if(PROJECT_BUILD) winspool ws2_32 ) - else() + elseif(NOT PROJECT_IS_DARWIN) link_libraries( uring ) diff --git a/cmake/libraries/openssl.cmake b/cmake/libraries/openssl.cmake index 942aa06..e90d50e 100644 --- a/cmake/libraries/openssl.cmake +++ b/cmake/libraries/openssl.cmake @@ -15,6 +15,12 @@ if(PROJECT_ENABLE_OPENSSL) elseif(NOT PROJECT_IS_MINGW) if(PROJECT_IS_MINGW) set(OPENSSL_COMPILE_TYPE mingw64) + elseif(PROJECT_IS_DARWIN) + if(PROJECT_IS_ARM64) + set(OPENSSL_COMPILE_TYPE darwin64-arm64) + else() + set(OPENSSL_COMPILE_TYPE darwin64-x86_64) + endif() elseif(PROJECT_IS_ARM64) set(OPENSSL_COMPILE_TYPE linux-aarch64) else() diff --git a/cmake/os.cmake b/cmake/os.cmake index 9604d74..7a72524 100644 --- a/cmake/os.cmake +++ b/cmake/os.cmake @@ -2,10 +2,6 @@ if(MSVC) message(FATAL_ERROR "MSVC will not be supported") endif() -if(UNIX AND APPLE) - message(FATAL_ERROR "Apple is not currently supported") -endif() - if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") message(FATAL_ERROR "FreeBSD is not currently supported") endif() diff --git a/cmake/versions.cmake b/cmake/versions.cmake index 1d3f97c..357cbf9 100644 --- a/cmake/versions.cmake +++ b/cmake/versions.cmake @@ -13,6 +13,7 @@ set(EXPAT_VERSION 2.7.1) set(GCC_VERSION 15.1.0) set(GTEST_VERSION 1.17.0) set(ICU_VERSION 76-1) +set(INNOSETUP_VERSION 6.4.3) set(JSON_VERSION 3.12.0) set(MINGW_VERSION 13.0.0) set(OPENSSL_VERSION 3.5.1) diff --git a/docker/x86_64/mingw64 b/docker/x86_64/mingw64 index bf93e5c..86fa77f 100644 --- a/docker/x86_64/mingw64 +++ b/docker/x86_64/mingw64 @@ -12,6 +12,7 @@ RUN apk add \ bzip2 \ clang17-extra-tools \ cmake \ + curl \ file \ flex \ g++ \ @@ -43,6 +44,7 @@ RUN apk add \ ruby \ texinfo \ unzip \ + xvfb \ wget \ wine \ xz \ @@ -102,6 +104,39 @@ RUN echo -e \ "system = 'windows'\n"\ > ${MY_TOOLCHAIN_FILE_MESON} +RUN mkdir -p /opt/bin;echo -e \ + "#!/bin/sh\n"\ + "COUNT=0\n"\ + "echo \"Start waiting on \$@\"\n"\ + "while pgrep \"\$@\" > /dev/null; do \n"\ + " echo \"waiting ...\"\n"\ + " sleep 1;\n"\ + " COUNT=\$((COUNT+1))\n"\ + " if [ \$COUNT -eq 60 ]; then\n"\ + " exit 3;\n"\ + " fi\n"\ + "done\n"\ + "echo \"\$@ completed\"\n"\ + > /opt/bin/waitonprocess && \ + chmod +x /opt/bin/waitonprocess && \ + cat /opt/bin/waitonprocess + +RUN echo -e \ + "#!/bin/sh\n"\ + "Xvfb \$DISPLAY &\n"\ + "tokill=\$!\n"\ + "wine wineboot --init\n"\ + "waitonprocess wineserver\n"\ + "\"\$@\"\n"\ + "retval=\$?\n"\ + "kill -15 \$tokill\n"\ + "wine wineboot --shutdown\n"\ + "return \$retval\n"\ + > /opt/bin/wine-x11-run && \ + chmod +x /opt/bin/wine-x11-run && \ + cat /opt/bin/wine-x11-run + +ENV PATH="/opt/bin:${PATH}" SHELL [ "/bin/bash", "-c" ] RUN mkdir -p \ @@ -799,6 +834,7 @@ RUN if [ -f "/3rd_party/libevent-${MY_LIBEVENT_VERSION}-stable.tar.gz" ]; then \ && cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -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_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \ -DEVENT__DISABLE_OPENSSL=ON \ @@ -1119,6 +1155,31 @@ RUN if [ -f "/3rd_party/libdsm-${MY_LIBDSM_VERSION}.tar.gz" ]; then \ && rm -r libdsm-${MY_LIBDSM_VERSION} \ ; fi -RUN (mv ${MY_MINGW_DIR}/lib/*.dll ${MY_MINGW_DIR}/bin || echo "no dll's found") \ +ENV DISPLAY=:90 +ENV WINEDEBUG=-all,err+all + +ARG INNOSETUP_VERSION +ENV MY_INNOSETUP_VERSION=${INNOSETUP_VERSION} +RUN rm -rf /root/.wine; \ + wine64 reg add 'HKEY_CURRENT_USER\Software\Wine' /v ShowDotFiles /d Y \ + && while [ ! -f /root/.wine/user.reg ]; do sleep 1; done; \ + wine-x11-run wine64 /3rd_party/mingw64/innosetup-${MY_INNOSETUP_VERSION}.exe /SP- /VERYSILENT /ALLUSERS /SUPPRESSMSGBOXES /DOWNLOADISCRYPT=1 + +ARG UID=1000 +ARG GID=1000 +ARG USERNAME=myuser + +RUN addgroup -g $GID $USERNAME && \ + adduser -D -u $UID -G $USERNAME -h /home/$USERNAME $USERNAME + +RUN rsync -av --progress /root/.wine/ /home/$USERNAME/.wine/ && \ + chown -R $UID:$GID -R /home/$USERNAME/.wine/ + +RUN (cp ${MY_MINGW_DIR}/lib/*.dll ${MY_MINGW_DIR}/bin || echo "no dll's found") \ && chmod 0777 -R ${MY_MINGW_DIR} \ - && rm -rf /3rd_party + && rm -rf /3rd_party \ + && rm -rf /root/.wine + +USER $USERNAME +WORKDIR /home/$USERNAME + diff --git a/scripts/deliver.sh b/scripts/deliver.sh index a9f9d21..594611e 100755 --- a/scripts/deliver.sh +++ b/scripts/deliver.sh @@ -62,11 +62,30 @@ if [ "${PROJECT_PRIVATE_KEY}" != "" ] && [ ! -f "./${PROJECT_OUT_FILE}.sig" ]; t error_exit "failed to find file: ${PROJECT_OUT_FILE}.sig" 1 fi -cp -f ./${PROJECT_OUT_FILE} ${DEST_DIR} || error_exit "failed to deliver file: ${PROJECT_OUT_FILE}" 1 -cp -f ./${PROJECT_OUT_FILE}.sha256 ${DEST_DIR} || error_exit "failed to deliver file: ${PROJECT_OUT_FILE}.sha256" 1 +cp -f ./${PROJECT_OUT_FILE} ${DEST_DIR} || + error_exit "failed to deliver file: ${PROJECT_OUT_FILE}" 1 + +cp -f ./${PROJECT_OUT_FILE}.sha256 ${DEST_DIR} || + error_exit "failed to deliver file: ${PROJECT_OUT_FILE}.sha256" 1 + if [ "${PROJECT_PRIVATE_KEY}" != "" ]; then - cp -f ./${PROJECT_OUT_FILE}.sig ${DEST_DIR} || error_exit "failed to deliver file: ${PROJECT_OUT_FILE}.sig" 1 + cp -f ./${PROJECT_OUT_FILE}.sig ${DEST_DIR} || + error_exit "failed to deliver file: ${PROJECT_OUT_FILE}.sig" 1 fi + +if [ "${PROJECT_IS_MINGW}" == "1" ] && [ -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe" ]; then + cp -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe" ${DEST_DIR} || + error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}" 1 + + cp -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe.sha256" ${DEST_DIR} || + error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.sha256" 1 + + if [ "${PROJECT_PRIVATE_KEY}" != "" ]; then + cp -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe.sig" ${DEST_DIR} || + error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.sig" 1 + fi +fi + popd error_exit "delivered ${PROJECT_FILE_PART}" 0 diff --git a/scripts/docker_common.sh b/scripts/docker_common.sh index 6dcba7e..d0b58ca 100755 --- a/scripts/docker_common.sh +++ b/scripts/docker_common.sh @@ -26,10 +26,16 @@ if [ "${PROJECT_BUILD_ARCH}" == "aarch64" ]; then docker build ${APP_VERSION_BUILD_ARGS} \ --platform linux/arm64 \ --build-arg NUM_JOBS=${NUM_JOBS} \ + --build-arg UID=$(id -u) \ + --build-arg GID=$(id -g) \ + --build-arg USERNAME=$(id -un) \ -t ${DOCKER_TAG} . || exit 1 else docker build ${APP_VERSION_BUILD_ARGS} \ --build-arg NUM_JOBS=${NUM_JOBS} \ + --build-arg UID=$(id -u) \ + --build-arg GID=$(id -g) \ + --build-arg USERNAME=$(id -un) \ -t ${DOCKER_TAG} . || exit 1 fi rm Dockerfile diff --git a/scripts/env.sh b/scripts/env.sh index c439c13..638932d 100755 --- a/scripts/env.sh +++ b/scripts/env.sh @@ -47,18 +47,29 @@ done PROJECT_APP_LIST=() PROJECT_CMAKE_OPTS="" -PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF PROJECT_ENABLE_V2_ERRORS=OFF +PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF PROJECT_IS_ALPINE=0 PROJECT_IS_ARM64=0 +PROJECT_IS_DARWIN=0 PROJECT_MINGW64_COPY_DEPENDENCIES=() PROJECT_MSYS2_PACKAGE_LIST=() PROJECT_REQUIRE_ALPINE=OFF PROJECT_STATIC_LINK=OFF +if [ "$(uname -s)" == "Darwin" ]; then + PROJECT_IS_DARWIN=1 +fi + if [ "${PROJECT_BUILD_ARCH}" == "" ]; then - PROJECT_BUILD_ARCH=x86_64 -elif [ "${PROJECT_BUILD_ARCH}" == "aarch64" ]; then + if [ "$(uname -m)" == "arm64" ]; then + PROJECT_BUILD_ARCH=aarch64 + else + PROJECT_BUILD_ARCH=x86_64 + fi +fi + +if [ "${PROJECT_BUILD_ARCH}" == "aarch64" ]; then PROJECT_IS_ARM64=1 fi @@ -173,7 +184,11 @@ if [ "${PROJECT_STATIC_LINK}" == "ON" ]; then PROJECT_BUILD_SHARED_LIBS=OFF PROJECT_ENABLE_BACKWARD_CPP=OFF PROJECT_LINK_TYPE=static - PROJECT_REQUIRE_ALPINE=ON + if [ "${PROJECT_IS_DARWIN}" == "0" ]; then + PROJECT_REQUIRE_ALPINE=ON + else + PROJECT_REQUIRE_ALPINE=OFF + fi else PROJECT_BUILD_SHARED_LIBS=ON PROJECT_LINK_TYPE=shared @@ -186,6 +201,9 @@ PROJECT_DIST_DIR=${PROJECT_SOURCE_DIR}/dist/${PROJECT_CMAKE_BUILD_TYPE_LOWER}/${ if [ "${PROJECT_IS_MINGW}" == "1" ]; then PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/win32 PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/win32 +elif [ "${PROJECT_IS_DARWIN}" == "1" ]; then + PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/darwin + PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/darwin else PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/linux PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/linux @@ -247,6 +265,7 @@ PROJECT_CMAKE_OPTS="-DPROJECT_EXTERNAL_BUILD_ROOT=${PROJECT_EXTERNAL_BUILD_ROOT} PROJECT_CMAKE_OPTS="-DPROJECT_GIT_REV=${PROJECT_GIT_REV} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_IS_ALPINE=${PROJECT_IS_ALPINE} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_IS_ARM64=${PROJECT_IS_ARM64} ${PROJECT_CMAKE_OPTS}" +PROJECT_CMAKE_OPTS="-DPROJECT_IS_DARWIN=${PROJECT_IS_DARWIN} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_IS_MINGW=${PROJECT_IS_MINGW} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_IS_MINGW_UNIX=${PROJECT_IS_MINGW_UNIX} ${PROJECT_CMAKE_OPTS}" PROJECT_CMAKE_OPTS="-DPROJECT_MAJOR_VERSION=${PROJECT_MAJOR_VERSION} ${PROJECT_CMAKE_OPTS}" @@ -277,6 +296,8 @@ PATH="${PROJECT_EXTERNAL_BUILD_ROOT}/bin:${PATH}" if [ "${PROJECT_IS_MINGW}" == "1" ]; then PROJECT_OS=windows +elif [ "${PROJECT_IS_DARWIN}" == "1" ]; then + PROJECT_OS=darwin else PROJECT_OS=linux fi @@ -292,6 +313,8 @@ if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_IS_MINGW_UNIX}" != "1" ]; th MSYS=winsymlinks:nativestrict fi +PROJECT_ENABLE_INNOSETUP=1 + export MSYS export NUM_JOBS export OPENSSL_ROOT_DIR @@ -319,6 +342,7 @@ export PROJECT_FLUTTER_BASE_HREF export PROJECT_GIT_REV export PROJECT_IS_ALPINE export PROJECT_IS_ARM64 +export PROJECT_IS_DARWIN export PROJECT_IS_MINGW export PROJECT_IS_MINGW_UNIX export PROJECT_LINK_TYPE @@ -371,6 +395,7 @@ echo " File part: ${PROJECT_FILE_PART}" echo " Flutter base href: ${PROJECT_FLUTTER_BASE_HREF}" echo " Is ARM64: ${PROJECT_IS_ARM64}" echo " Is Alpine: ${PROJECT_IS_ALPINE}" +echo " Is Darwin: ${PROJECT_IS_DARWIN}" echo " Is MINGW on Unix: ${PROJECT_IS_MINGW_UNIX}" echo " Is MINGW: ${PROJECT_IS_MINGW}" echo " Job count: ${NUM_JOBS}" diff --git a/scripts/libraries.sh b/scripts/libraries.sh index 1fe3c05..42938b7 100755 --- a/scripts/libraries.sh +++ b/scripts/libraries.sh @@ -20,6 +20,7 @@ PROJECT_CLEANUP[EXPAT]="3rd_party/mingw64/expat-*" PROJECT_CLEANUP[GCC]="3rd_party/mingw64/gcc-*" PROJECT_CLEANUP[ICU]="3rd_party/mingw64/icu-release-*" PROJECT_CLEANUP[JSON]="3rd_party/json-*" +PROJECT_CLEANUP[INNOSETUP]="3rd_party/mingw64/innosetup-*" PROJECT_CLEANUP[LIBBITCOIN_SYSTEM_ON]="3rd_party/boost_${PROJECT_VERSIONS[BOOST_MAJOR]}_${PROJECT_VERSIONS[BOOST_MINOR]}_*" PROJECT_CLEANUP[MINGW]="3rd_party/mingw64/mingw-w64-*" PROJECT_CLEANUP[OPENSSL]="3rd_party/openssl-*" @@ -40,6 +41,7 @@ PROJECT_DOWNLOADS[GCC]="https://mirrorservice.org/sites/sourceware.org/pub/gcc/r 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[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" PROJECT_DOWNLOADS[PKG_CONFIG]="https://pkgconfig.freedesktop.org/releases/pkg-config-${PROJECT_VERSIONS[PKG_CONFIG]}.tar.gz;pkg-config-${PROJECT_VERSIONS[PKG_CONFIG]}.tar.gz;3rd_party/mingw64" diff --git a/scripts/make_common.sh b/scripts/make_common.sh index 981a567..e8b864b 100755 --- a/scripts/make_common.sh +++ b/scripts/make_common.sh @@ -43,6 +43,10 @@ make -j${CMAKE_BUILD_PARALLEL_LEVEL} || exit 1 popd popd +if [ -f "${PROJECT_SOURCE_DIR}/LICENSE.md" ]; then + rsync -av --progress "${PROJECT_SOURCE_DIR}/LICENSE.md" "${PROJECT_DIST_DIR}/" +fi + if [ "${PROJECT_IS_MINGW}" != "1" ] && [ "${PROJECT_REQUIRE_ALPINE}" == "ON" ]; then rsync -av --progress /usr/share/icu/74.2/ "${PROJECT_DIST_DIR}/icu/" fi diff --git a/scripts/make_flutter.sh b/scripts/make_flutter.sh index 23fe784..0165e60 100755 --- a/scripts/make_flutter.sh +++ b/scripts/make_flutter.sh @@ -5,7 +5,7 @@ PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}") . "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" "$4" "$5" if [ -f "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/pubspec.yaml" ]; then - if [ "${PROJECT_IS_MINGW}" == "0" ] || [ "${PROJECT_IS_MINGW_UNIX}" == "1" ]; then + if [[ "${PROJECT_IS_DARWIN}" == "0" && ("${PROJECT_IS_MINGW}" == "0" || "${PROJECT_IS_MINGW_UNIX}" == "1") ]]; then FLUTTER_CONTAINER_NAME="${PROJECT_NAME}_flutter" FLUTTER_TAG_NAME="${PROJECT_NAME}:flutter" diff --git a/scripts/make_package.sh b/scripts/make_package.sh index 8afa3e8..a6e0ac4 100755 --- a/scripts/make_package.sh +++ b/scripts/make_package.sh @@ -35,6 +35,16 @@ fi if [ -f "${PROJECT_OUT_FILE}.sig" ]; then rm -f "${PROJECT_OUT_FILE}.sig" || error_exit "failed to delete file: ${PROJECT_OUT_FILE}.sig" 1 fi + +if [ -f "${PROJECT_FILE_PART}_setup.exe" ]; then + rm -f "${PROJECT_FILE_PART}_setup.exe" || error_exit "failed to delete file: ${PROJECT_FILE_PART}_setup.exe" 1 +fi +if [ -f "${PROJECT_FILE_PART}_setup.exe.sha256" ]; then + rm -f "${PROJECT_FILE_PART}_setup.exe.sha256" || error_exit "failed to delete file: ${PROJECT_FILE_PART}_setup.exe.sha256" 1 +fi +if [ -f "${PROJECT_FILE_PART}_setup.exe.sig" ]; then + rm -f "${PROJECT_FILE_PART}_setup.exe.sig" || error_exit "failed to delete file: ${PROJECT_FILE_PART}_setup.exe.sig" 1 +fi popd rsync -av --progress ${PROJECT_DIST_DIR}/ ${TEMP_DIR}/${PROJECT_NAME}/ || error_exit "failed to rsync" 1 @@ -63,4 +73,23 @@ tar cvzf "${PROJECT_OUT_FILE}" -C ${TEMP_DIR} . || error_exit "failed to create create_file_validations "${PROJECT_OUT_FILE}" popd +if [ "${PROJECT_IS_MINGW}" == "1" ] && [ -f "${PROJECT_DIST_DIR}/../${PROJECT_NAME}.iss" ]; then + cp -f "${PROJECT_DIST_DIR}/../${PROJECT_NAME}.iss" "${TEMP_DIR}/${PROJECT_NAME}.iss" + rsync -av --progress --delete ${PROJECT_SOURCE_DIR}/support/3rd_party/*.msi ${TEMP_DIR}/3rd_party/ + + pushd "${TEMP_DIR}" + if [ "${PROJECT_IS_MINGW_UNIX}" == "1" ]; then + wine64 "c:/Program Files (x86)/Inno Setup 6/iscc.exe" "${PROJECT_NAME}.iss" || exit 1 + else + iscc "${PROJECT_NAME}.iss" || exit 1 + fi + + pushd "Output" + create_file_validations "${PROJECT_FILE_PART}_setup.exe" + cp -f * "${PROJECT_DIST_DIR}/" + popd + + popd +fi + error_exit "created package ${PROJECT_FILE_PART}" 0 diff --git a/scripts/make_unix.sh b/scripts/make_unix.sh index ebecf7b..d45bab3 100755 --- a/scripts/make_unix.sh +++ b/scripts/make_unix.sh @@ -11,7 +11,7 @@ fi "${PROJECT_SOURCE_DIR}/scripts/make_flutter.sh" "${PROJECT_BUILD_ARCH}" "${PROJECT_CMAKE_BUILD_TYPE}" "${PROJECT_BUILD_CLEAN}" 0 0 || exit 1 -if [ "${PROJECT_REQUIRE_ALPINE}" == "ON" ] || [ "${PROJECT_IS_ARM64}" == "1" ]; then +if [[ "${PROJECT_IS_DARWIN}" == "0" && ("${PROJECT_REQUIRE_ALPINE}" == "ON" || "${PROJECT_IS_ARM64}" == "1") ]]; then DOCKER_NAME=alpine DOCKER_CONTAINER=${PROJECT_NAME}_${DOCKER_NAME}_${PROJECT_BUILD_ARCH} DOCKER_TAG=${PROJECT_NAME}:${DOCKER_NAME} diff --git a/scripts/versions.sh b/scripts/versions.sh index 8eb67fe..01a8e58 100755 --- a/scripts/versions.sh +++ b/scripts/versions.sh @@ -16,6 +16,7 @@ PROJECT_VERSIONS[EXPAT2]="2_7_1" PROJECT_VERSIONS[GCC]="15.1.0" PROJECT_VERSIONS[GTEST]="1.17.0" PROJECT_VERSIONS[ICU]="76-1" +PROJECT_VERSIONS[INNOSETUP]="6.4.3" PROJECT_VERSIONS[JSON]="3.12.0" PROJECT_VERSIONS[MINGW]="13.0.0" PROJECT_VERSIONS[OPENSSL]="3.5.1" diff --git a/support/3rd_party/json-3.12.0.tar.gz.sha256 b/support/3rd_party/json-3.12.0.tar.gz.sha256 index 2ed5de7..8140ff3 100644 --- a/support/3rd_party/json-3.12.0.tar.gz.sha256 +++ b/support/3rd_party/json-3.12.0.tar.gz.sha256 @@ -1 +1 @@ -4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187 json-3.12.0.tar.gz +4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187 *json-3.12.0.tar.gz diff --git a/support/3rd_party/mingw64/innosetup-6.4.3.exe b/support/3rd_party/mingw64/innosetup-6.4.3.exe new file mode 100644 index 0000000..0a4a23a Binary files /dev/null and b/support/3rd_party/mingw64/innosetup-6.4.3.exe differ diff --git a/support/3rd_party/mingw64/innosetup-6.4.3.exe.sha256 b/support/3rd_party/mingw64/innosetup-6.4.3.exe.sha256 new file mode 100644 index 0000000..84bb469 --- /dev/null +++ b/support/3rd_party/mingw64/innosetup-6.4.3.exe.sha256 @@ -0,0 +1 @@ +f3c42116542c4cc57263c5ba6c4feabfc49fe771f2f98a79d2f7628b8762723b *innosetup-6.4.3.exe diff --git a/support/src/utils/file.cpp b/support/src/utils/file.cpp index 5c86b44..e488920 100644 --- a/support/src/utils/file.cpp +++ b/support/src/utils/file.cpp @@ -55,7 +55,8 @@ auto change_to_process_directory() -> bool { std::string path; path.resize(PATH_MAX + 1); #if defined(__APPLE__) - proc_pidpath(getpid(), path.c_str(), path.size()); + auto res =proc_pidpath(getpid(), reinterpret_cast(path.data()), + static_cast(path.size())); #else // !defined(__APPLE__) auto res = readlink("/proc/self/exe", path.data(), path.size()); if (res == -1) { @@ -148,7 +149,7 @@ auto get_free_drive_space(std::string_view path) #if defined(__APPLE__) struct statvfs st{}; - if (statvfs(path.c_str(), &st) != 0) { + if (statvfs(std::string{path}.c_str(), &st) != 0) { throw utils::error::create_exception( function_name, { "failed to get free disk space", @@ -240,6 +241,20 @@ auto get_times(std::string_view path) -> std::optional { }); } +#if defined(__APPLE__) + ret.accessed = static_cast(st.st_atimespec.tv_nsec) + + static_cast(st.st_atimespec.tv_sec) * + utils::time::NANOS_PER_SECOND; + ret.created = static_cast(st.st_ctimespec.tv_nsec) + + static_cast(st.st_ctimespec.tv_sec) * + utils::time::NANOS_PER_SECOND; + ret.modified = static_cast(st.st_mtimespec.tv_nsec) + + static_cast(st.st_mtimespec.tv_sec) * + utils::time::NANOS_PER_SECOND; + ret.written = static_cast(st.st_mtimespec.tv_nsec) + + static_cast(st.st_mtimespec.tv_sec) * + utils::time::NANOS_PER_SECOND; +#else // !defined(__APPLE__) ret.accessed = static_cast(st.st_atim.tv_nsec) + static_cast(st.st_atim.tv_sec) * utils::time::NANOS_PER_SECOND; @@ -252,7 +267,7 @@ auto get_times(std::string_view path) -> std::optional { ret.written = static_cast(st.st_mtim.tv_nsec) + static_cast(st.st_mtim.tv_sec) * utils::time::NANOS_PER_SECOND; - +#endif // defined(__APPLE__) #endif // defined(_WIN32) return ret; @@ -305,7 +320,7 @@ auto get_total_drive_space(std::string_view path) #if defined(__APPLE__) struct statvfs st{}; - if (statvfs(path.c_str(), &st) != 0) { + if (statvfs(std::string{path}.c_str(), &st) != 0) { throw utils::error::create_exception( function_name, { "failed to get total disk space", @@ -498,8 +513,7 @@ auto write_json_file(std::wstring_view path, const nlohmann::json &data) #endif // defined(PROJECT_ENABLE_JSON) #if defined(PROJECT_ENABLE_LIBDSM) -static constexpr auto validate_smb_path = - [](std::string_view path) -> bool { +static constexpr auto validate_smb_path = [](std::string_view path) -> bool { return (not utils::string::begins_with(path, "///") && utils::string::begins_with(path, "//") && // not utils::string::contains(path, " ") && diff --git a/support/src/utils/unix.cpp b/support/src/utils/unix.cpp index 30ff5b3..407de95 100644 --- a/support/src/utils/unix.cpp +++ b/support/src/utils/unix.cpp @@ -25,11 +25,15 @@ #include "utils/collection.hpp" namespace monitarr::utils { -#if !defined(__APPLE__) +#if defined(__APPLE__) +auto convert_to_uint64(pthread_t thread) -> std::uint64_t { + return reinterpret_cast(thread); +} +#else // defined(__APPLE__) auto convert_to_uint64(const pthread_t &thread) -> std::uint64_t { return static_cast(thread); } -#endif // !defined(__APPLE__) +#endif // defined(__APPLE__) auto get_last_error_code() -> int { return errno; }