diff --git a/.github/workflows/clang_linux.yml b/.github/workflows/clang_linux.yml index 9714c27c9a..ab28e8b3f4 100644 --- a/.github/workflows/clang_linux.yml +++ b/.github/workflows/clang_linux.yml @@ -54,4 +54,4 @@ jobs: restore-keys: ${{ runner.os }}-cache-clang-${{ matrix.id }}- - name: Run - run: docker run -e CI -e TRAVIS_BUILD_DIR="$PWD" -e PROJ_CMAKE_BUILD_OPTIONS="$PROJ_CMAKE_BUILD_OPTIONS" -e WORK_DIR="$PWD" -e TRAVIS_OS_NAME=linux -e BUILD_NAME=linux_clang -v $PWD:$PWD ubuntu:20.04 $PWD/.github/workflows/clang_linux/start.sh + run: docker run -e PROJ_GITHUB_SHA=${{ github.sha }} -e CI -e TRAVIS_BUILD_DIR="$PWD" -e PROJ_CMAKE_BUILD_OPTIONS="$PROJ_CMAKE_BUILD_OPTIONS" -e WORK_DIR="$PWD" -e TRAVIS_OS_NAME=linux -e BUILD_NAME=linux_clang -v $PWD:$PWD ubuntu:20.04 $PWD/.github/workflows/clang_linux/start.sh diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index df23c397b4..cd208a890d 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -160,6 +160,8 @@ jobs: builder: ${{ steps.buildx.outputs.name }} context: . file: ${{ matrix.dockerfile }} + build-args: | + PROJ_GITHUB_SHA=${{ github.sha }} platforms: linux/${{ steps.prep.outputs.ARCH }} tags: ${{ steps.prep_tags.outputs.tags }} labels: | diff --git a/.github/workflows/emscripten.yml b/.github/workflows/emscripten.yml index 966139727f..ced9601256 100644 --- a/.github/workflows/emscripten.yml +++ b/.github/workflows/emscripten.yml @@ -35,7 +35,7 @@ jobs: - name: Run docker build run: | docker run --user $(id -u):$(id -g) --rm \ - -e GITHUB_SHA=${{ github.sha }} \ + -e PROJ_GITHUB_SHA=${{ github.sha }} \ -v "$PWD":/build/proj_src \ -v "$PWD"/wasm_out:/build/install \ proj-emscripten-builder diff --git a/.github/workflows/fedora_rawhide.yml b/.github/workflows/fedora_rawhide.yml index 92767bccfc..8f984ad93a 100644 --- a/.github/workflows/fedora_rawhide.yml +++ b/.github/workflows/fedora_rawhide.yml @@ -34,4 +34,4 @@ jobs: restore-keys: ${{ runner.os }}-cache-fedora_rawhide- - name: Run - run: docker run -e CI -e WORK_DIR="$PWD" -v $PWD:$PWD fedora:rawhide $PWD/.github/workflows/fedora_rawhide/start.sh + run: docker run -e PROJ_GITHUB_SHA=${{ github.sha }} -e CI -e WORK_DIR="$PWD" -v $PWD:$PWD fedora:rawhide $PWD/.github/workflows/fedora_rawhide/start.sh diff --git a/.github/workflows/linux_gcc_32bit.yml b/.github/workflows/linux_gcc_32bit.yml index db81e0f77e..454ac77fe4 100644 --- a/.github/workflows/linux_gcc_32bit.yml +++ b/.github/workflows/linux_gcc_32bit.yml @@ -34,4 +34,4 @@ jobs: restore-keys: ${{ runner.os }}-cache-gcc32bit- - name: Run - run: docker run -e CI -e WORK_DIR="$PWD" -v $PWD:$PWD ubuntu:20.04 $PWD/.github/workflows/linux_gcc_32bit/start.sh + run: docker run -e PROJ_GITHUB_SHA=${{ github.sha }} -e CI -e WORK_DIR="$PWD" -v $PWD:$PWD ubuntu:20.04 $PWD/.github/workflows/linux_gcc_32bit/start.sh diff --git a/.github/workflows/mingw_w64.yml b/.github/workflows/mingw_w64.yml index 6de48a6c39..fce660d9bd 100644 --- a/.github/workflows/mingw_w64.yml +++ b/.github/workflows/mingw_w64.yml @@ -34,4 +34,4 @@ jobs: restore-keys: ${{ runner.os }}-cache-mingw_w64- - name: Build - run: docker run -e CI -e TRAVIS_OS_NAME=linux -e BUILD_NAME=mingw_w64 -e WORK_DIR="$PWD" -v $PWD:$PWD ubuntu:22.04 $PWD/.github/workflows/mingw_w64/start.sh + run: docker run -e PROJ_GITHUB_SHA=${{ github.sha }} -e CI -e TRAVIS_OS_NAME=linux -e BUILD_NAME=mingw_w64 -e WORK_DIR="$PWD" -v $PWD:$PWD ubuntu:22.04 $PWD/.github/workflows/mingw_w64/start.sh diff --git a/Dockerfile b/Dockerfile index 797f99e00e..cede9e21ce 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,6 +7,8 @@ LABEL maintainer="Howard Butler " ARG DESTDIR="/build" +ARG PROJ_GITHUB_SHA + # Setup build env RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --fix-missing --no-install-recommends \ diff --git a/cmake/ProjConfig.cmake b/cmake/ProjConfig.cmake index aa5c7c2ca3..230e05c84a 100644 --- a/cmake/ProjConfig.cmake +++ b/cmake/ProjConfig.cmake @@ -51,4 +51,54 @@ if(EXISTS ${AUTOCONF_PROJ_CONFIG_H}) "before CMake's build.") endif() +# Get the git hash to write it in the release message. +set(PROJ_GIT_HASH "") +if(DEFINED ENV{PROJ_GITHUB_SHA}) + string(SUBSTRING "$ENV{PROJ_GITHUB_SHA}" 0 7 PROJ_GIT_HASH) +else() + find_package(Git QUIET) + if(Git_FOUND AND EXISTS "${PROJ_SOURCE_DIR}/.git") + # Get the short hash + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD + WORKING_DIRECTORY "${PROJ_SOURCE_DIR}" + RESULT_VARIABLE GIT_REV_RESULT + OUTPUT_VARIABLE PROJ_GIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + + if(GIT_REV_RESULT EQUAL 0) + # Check if the working directory is dirty + execute_process( + COMMAND ${GIT_EXECUTABLE} status --porcelain --untracked-files=no + WORKING_DIRECTORY "${PROJ_SOURCE_DIR}" + RESULT_VARIABLE GIT_STATUS_RESULT + OUTPUT_VARIABLE GIT_STATUS_OUTPUT + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + + # If the command succeeds and outputs anything, the tree is dirty + if(GIT_STATUS_RESULT EQUAL 0 AND NOT GIT_STATUS_OUTPUT STREQUAL "") + string(APPEND PROJ_GIT_HASH "*") + endif() + else() + set(PROJ_GIT_HASH "") + endif() + endif() +endif() +if(PROJ_GIT_HASH) + add_compile_definitions(PROJ_GIT_HASH=\"${PROJ_GIT_HASH}\") +endif() +message(PROJ_GIT_HASH=\"${PROJ_GIT_HASH}\") + +# Tell CMake to re-configure if the Git HEAD or index changes +if(Git_FOUND AND EXISTS "${PROJ_SOURCE_DIR}/.git") + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS + "${PROJ_SOURCE_DIR}/.git/HEAD" # for the hash + "${PROJ_SOURCE_DIR}/.git/index" # for the * + ) +endif() + configure_file(cmake/proj_config.cmake.in src/proj_config.h) diff --git a/scripts/ci/emscripten/build_wasm.sh b/scripts/ci/emscripten/build_wasm.sh index 213846514e..37f9d431f7 100644 --- a/scripts/ci/emscripten/build_wasm.sh +++ b/scripts/ci/emscripten/build_wasm.sh @@ -250,17 +250,6 @@ fi # Helper functions to extract some info from PROJ in C and C++ log_step "6.5 Creating C Wrapper Functions" -# --- Determine Git Revision --- -GIT_REV="" -if [ -n "${GITHUB_SHA}" ]; then - GIT_REV="${GITHUB_SHA}" -else - if git rev-parse HEAD >/dev/null 2>&1; then - GIT_REV=$(git rev-parse HEAD) - fi -fi -echo "GIT_REV=${GIT_REV}" - WRAPPER_FILE="${TEMP_BUILD_DIR}/proj_wrappers.cpp" WRAPPER_OBJ_FILE="${TEMP_BUILD_DIR}/proj_wrappers.o" @@ -319,10 +308,6 @@ const char* get_compilation_date() { return "$DDD" ; } -const char* get_build_git_revision() { - return "${GIT_REV}"; -} - int get_ptr_size() { return sizeof(void*); } @@ -349,7 +334,7 @@ FINAL_LIBS="${INSTALL_DIR}/lib/libproj.a \ ${WRAPPER_OBJ_FILE}" # include all exported symbols -echo -e "_malloc\n_free\n_get_compilation_date\n_get_build_git_revision\n_get_ptr_size" > ${INSTALL_DIR}/exported_symbols.txt +echo -e "_malloc\n_free\n_get_compilation_date\n_get_ptr_size" > ${INSTALL_DIR}/exported_symbols.txt grep "^proj_\|^geod_" ${PROJ_SRC_DIR}/scripts/reference_exported_symbols.txt | grep -v "(" | sed 's/^/_/' >> ${INSTALL_DIR}/exported_symbols.txt head ${INSTALL_DIR}/exported_symbols.txt diff --git a/src/release.cpp b/src/release.cpp index 0c6f1d749f..5c10635b3a 100644 --- a/src/release.cpp +++ b/src/release.cpp @@ -6,8 +6,15 @@ #define STR_HELPER(x) #x #define STR(x) STR_HELPER(x) -char const pj_release[] = "Rel. " STR(PROJ_VERSION_MAJOR) "." STR( - PROJ_VERSION_MINOR) "." STR(PROJ_VERSION_PATCH) ", " - "September 15th, 2026"; +#ifdef PROJ_GIT_HASH +#define PROJ_GIT_REV_STR " (" PROJ_GIT_HASH ")" +#else +#define PROJ_GIT_REV_STR "" +#endif + +char const pj_release[] = + "Rel. " STR(PROJ_VERSION_MAJOR) "." STR(PROJ_VERSION_MINOR) "." STR( + PROJ_VERSION_PATCH) PROJ_GIT_REV_STR ", " + "September 15th, 2026"; const char *pj_get_release() { return pj_release; }