From f6cdf2914c6feddea6deebfaac0028bea2fbf17e Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Sat, 27 Jan 2024 12:21:37 -0600 Subject: [PATCH] mingw64 build fixes --- cmake/settings.cmake | 9 ++- cmake/unittests.cmake | 92 +++++++++++----------- docker/64_bit/mingw64 | 19 ++++- scripts/make_common.sh | 9 +-- scripts/{make_mingw64.sh => make_win32.sh} | 17 ++-- 5 files changed, 89 insertions(+), 57 deletions(-) rename scripts/{make_mingw64.sh => make_win32.sh} (60%) diff --git a/cmake/settings.cmake b/cmake/settings.cmake index 9f6a0b4a..0c83b361 100644 --- a/cmake/settings.cmake +++ b/cmake/settings.cmake @@ -12,9 +12,16 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_MODULE_PATH - ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules + ${CMAKE_MODULE_PATH} ) +if (MINGW) + set(CMAKE_MODULE_PATH + /mingw64/lib/cmake + /mingw64/lib64/cmake + ${CMAKE_MODULE_PATH} + ) +endif() set(THREADS_PREFER_PTHREAD_FLAG ON) if (NOT CMAKE_BUILD_TYPE) diff --git a/cmake/unittests.cmake b/cmake/unittests.cmake index 04cefdfc..5df35488 100644 --- a/cmake/unittests.cmake +++ b/cmake/unittests.cmake @@ -2,42 +2,6 @@ if (REPERTORY_ENABLE_TESTING) enable_testing() - set(GTEST_PROJECT_NAME gtest_${GTEST_VERSION}) - set(GTEST_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${GTEST_PROJECT_NAME}) - if (MACOS) - set(GTEST_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") - set(GTEST_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") - else() - set(GTEST_C_FLAGS ${CMAKE_C_FLAGS}) - set(GTEST_CXX_FLAGS ${CMAKE_CXX_FLAGS}) - endif() - ExternalProject_Add(gtest_project - DOWNLOAD_NO_PROGRESS 1 - URL https://github.com/google/googletest/archive/refs/tags/v${GTEST_VERSION}.tar.gz - PREFIX ${GTEST_BUILD_ROOT} - CMAKE_ARGS - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_C_FLAGS=${GTEST_C_FLAGS} - -DCMAKE_CXX_FLAGS=${GTEST_CXX_FLAGS} - -DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE} - -DCMAKE_BUILD_TYPE=${EXTERNAL_BUILD_TYPE} - INSTALL_COMMAND ${CMAKE_COMMAND} -E echo "Skipping install step." - ) - - set(GTEST_INCLUDE_DIRS - ${GTEST_BUILD_ROOT}/src/gtest_project/googletest/include - ${GTEST_BUILD_ROOT}/src/gtest_project/googlemock/include - ) - - if(UNIX) - set(GTEST_LIBRARIES - ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/libgmock.a - ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/libgtest.a - ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/libgtest_main.a - ) - endif() - file(GLOB_RECURSE UNITTEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/tests/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/*.hpp @@ -47,15 +11,55 @@ if (REPERTORY_ENABLE_TESTING) ) add_project_executable(unittests "${UNITTEST_SOURCES}") - add_dependencies(unittests - gtest_project - zlib_project - ) - target_compile_definitions(unittests PUBLIC - GTEST_LINKED_AS_SHARED_LIBRARY=1 - REPERTORY_TESTING - ) + if (MINGW) + find_package(GTest REQUIRED) + else() + set(GTEST_PROJECT_NAME gtest_${GTEST_VERSION}) + set(GTEST_BUILD_ROOT ${EXTERNAL_BUILD_ROOT}/builds/${GTEST_PROJECT_NAME}) + if (MACOS) + set(GTEST_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") + set(GTEST_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") + else() + set(GTEST_C_FLAGS ${CMAKE_C_FLAGS}) + set(GTEST_CXX_FLAGS ${CMAKE_CXX_FLAGS}) + endif() + ExternalProject_Add(gtest_project + DOWNLOAD_NO_PROGRESS 1 + URL https://github.com/google/googletest/archive/refs/tags/v${GTEST_VERSION}.tar.gz + PREFIX ${GTEST_BUILD_ROOT} + CMAKE_ARGS + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_C_FLAGS=${GTEST_C_FLAGS} + -DCMAKE_CXX_FLAGS=${GTEST_CXX_FLAGS} + -DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE} + -DCMAKE_BUILD_TYPE=${EXTERNAL_BUILD_TYPE} + INSTALL_COMMAND ${CMAKE_COMMAND} -E echo "Skipping install step." + ) + + set(GTEST_INCLUDE_DIRS + ${GTEST_BUILD_ROOT}/src/gtest_project/googletest/include + ${GTEST_BUILD_ROOT}/src/gtest_project/googlemock/include + ) + + set(GTEST_LIBRARIES + ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/libgmock.a + ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/libgtest.a + ${GTEST_BUILD_ROOT}/src/gtest_project-build/lib/libgtest_main.a + ) + + add_dependencies(unittests + gtest_project + zlib_project + ) + + target_compile_definitions(unittests PUBLIC + GTEST_LINKED_AS_SHARED_LIBRARY=1 + REPERTORY_TESTING + ) + endif() + target_include_directories(unittests PUBLIC ${GTEST_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/tests diff --git a/docker/64_bit/mingw64 b/docker/64_bit/mingw64 index 982fd7eb..367eba0a 100644 --- a/docker/64_bit/mingw64 +++ b/docker/64_bit/mingw64 @@ -938,8 +938,25 @@ RUN set -ex \ && cd ${MY_WORKDIR} \ && rm -r wxWidgets-${MY_WXWIDGETS_VERSION} +ARG GTEST_VERSION=1.14.0 +ENV MY_GTEST_VERSION=${GTEST_VERSION} +RUN set -ex \ + \ + && wget -q https://github.com/google/googletest/archive/refs/tags/v${GTEST_VERSION}.tar.gz -O - | tar -xz \ + && cd googletest-${MY_GTEST_VERSION} \ + && mkdir build \ + && cd build \ + && cmake .. -DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_STATIC_LIBS=ON \ + -DCMAKE_INSTALL_PREFIX=${MY_MINGW} \ + && make -j${MY_NUM_JOBS} \ + && make install \ + && cd ${MY_WORKDIR} \ + && rm -r googletest-${MY_GTEST_VERSION} + RUN set -ex \ \ && mv ${MY_MINGW}/lib/*.dll ${MY_MINGW}/bin \ && chmod 0777 -R ${MY_MINGW} - diff --git a/scripts/make_common.sh b/scripts/make_common.sh index f26addb1..c35bd9f9 100755 --- a/scripts/make_common.sh +++ b/scripts/make_common.sh @@ -3,13 +3,12 @@ BUILD_TYPE=$1 BUILD_CLEAN=$2 IS_MINGW=$3 -IS_WIN32=$4 if [ "${BUILD_TYPE}" == "" ]; then BUILD_TYPE=Release fi -if [ "${IS_MINGW}" == "1" ] || [ "${IS_WIN32}" == "1" ]; then +if [ "${IS_MINGW}" == "1" ]; then BUILD_ROOT=build2 else BUILD_ROOT=build @@ -41,7 +40,7 @@ if [ "${IS_MINGW}" == "1" ]; then CMAKE_ADDITIONAL_OPTS=-DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN} fi -if [ "${IS_MINGW}" == "1" ] || [ "${IS_WIN32}" == "1" ]; then +if [ "${IS_MINGW}" == "1" ]; then EXE_EXT=.exe fi @@ -55,7 +54,7 @@ pushd .. ln -sf ${BUILD_FOLDER}/compile_commands.json . ln -sf ${BUILD_FOLDER}/repertory${EXE_EXT} . ln -sf ${BUILD_FOLDER}/unittests${EXE_EXT} . -if [ "${IS_MINGW}" == "1" ] || [ "${IS_WIN32}" == "1" ]; then +if [ "${IS_MINGW}" == "1" ]; then ln -sf ${BUILD_FOLDER}/winfsp-x64.dll . fi popd @@ -71,7 +70,7 @@ pushd ../${BUILD_ROOT} ln -sf ${BUILD_FOLDER}/compile_commands.json . ln -sf ${BUILD_FOLDER}/repertory${EXE_EXT} . ln -sf ${BUILD_FOLDER}/unittests${EXE_EXT} . -if [ "${IS_MINGW}" == "1" ] || [ "${IS_WIN32}" == "1" ]; then +if [ "${IS_MINGW}" == "1" ]; then ln -sf ${BUILD_FOLDER}/winfsp-x64.dll . fi popd diff --git a/scripts/make_mingw64.sh b/scripts/make_win32.sh similarity index 60% rename from scripts/make_mingw64.sh rename to scripts/make_win32.sh index 6df33d5d..7e60b743 100755 --- a/scripts/make_mingw64.sh +++ b/scripts/make_win32.sh @@ -1,10 +1,15 @@ #!/bin/bash -# #!/bin/bash -# -# pushd "$(dirname "$0")/.." -# scripts/make_common.sh "${1}" "${2}" 1 -# popd # +NUM_JOBS=${MY_NUM_JOBS} +if [[ -z "${NUM_JOBS}" ]]; then + NUM_JOBS=$(getconf _NPROCESSORS_ONLN 2> /dev/null || getconf NPROCESSORS_ONLN 2> /dev/null || echo 1) + if [ "${NUM_JOBS}" -gt "2" ]; then + NUM_JOBS=$(expr ${NUM_JOBS} - 2) + elif [ "${NUM_JOBS}" -gt "1" ]; then + NUM_JOBS=$(expr ${NUM_JOBS} - 1) + fi +fi + BUILD_TYPE=$1 BUILD_CLEAN=$2 @@ -18,6 +23,6 @@ docker stop repertory_${NAME} docker rm repertory_${NAME} docker build --build-arg NUM_JOBS=${MY_NUM_JOBS} -t repertory:${NAME} - < ${SOURCE_DIR}/docker/${BUILD_ARCH}/${NAME} && docker run -td -u $(id -u):$(id -g) --name repertory_${NAME} -w ${SOURCE_DIR} -v ${SOURCE_DIR}:${SOURCE_DIR}:rw,z repertory:${NAME} && - docker exec repertory_${NAME} /bin/bash -c "${SOURCE_DIR}/scripts/make_common.sh ${BUILD_TYPE} "${BUILD_CLEAN}" 1" + docker exec repertory_${NAME} /bin/bash -c "${SOURCE_DIR}/scripts/make_common.sh ${BUILD_TYPE} \"${BUILD_CLEAN}\" 1" docker stop repertory_${NAME} docker rm repertory_${NAME}