From 845d679d9801f5dd177b20630fbf8ec581600e52 Mon Sep 17 00:00:00 2001 From: Kai Pastor Date: Sun, 19 Dec 2021 11:07:12 +0100 Subject: Revise pc file construction Use sqlite3, libtiff-4 and libcurl modules instead of plain libs Allow opt out by setting 'USE_PKGCONFIG_MODULES' off. Link native system libs on Windows, and implicit C++ libraries on other systems (e.g. libstc++/libc++). --- CMakeLists.txt | 10 ++++------ cmake/ProjUtilities.cmake | 37 ++++++++++++++++++++++++++----------- proj.pc.in | 1 + 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ac6d0cc..6bdc7cab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -338,13 +338,11 @@ install(FILES ${docfiles} ################################################################################ # pkg-config support ################################################################################ -if(UNIX OR MINGW) - configure_proj_pc() +configure_proj_pc() - install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/proj.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) -endif() +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/proj.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) ################################################################################ # "make dist" workalike diff --git a/cmake/ProjUtilities.cmake b/cmake/ProjUtilities.cmake index 333b01f0..690336b2 100644 --- a/cmake/ProjUtilities.cmake +++ b/cmake/ProjUtilities.cmake @@ -76,27 +76,42 @@ function(configure_proj_pc) set(datadir "$\{datarootdir\}") set(PACKAGE "proj") set(VERSION ${PROJ_VERSION}) - # Build list for Libs.private - set(EXTRA_LIBS - -lstdc++ - -lsqlite3 - ${CMAKE_THREAD_LIBS_INIT} - ) + # Build strings of dependencies (Libs.private, Requires.private) + set(EXTRA_LIBS "${CMAKE_THREAD_LIBS_INIT}") + set(EXTRA_REQUIRES "") + option(USE_PKGCONFIG_REQUIRES "Use 'Requires' instead 'Libs' in proj.pc" ON) + macro(add_module_or_libs MODULE) + if(USE_PKGCONFIG_REQUIRES) + list(APPEND EXTRA_REQUIRES "${MODULE}") + else() + list(APPEND EXTRA_LIBS "${ARGN}") + endif() + endmacro() + add_module_or_libs(sqlite3 -lsqlite3) if(TIFF_ENABLED) - list(APPEND EXTRA_LIBS -ltiff) + add_module_or_libs(libtiff-4 -ltiff) endif() if(CURL_ENABLED) - list(APPEND EXTRA_LIBS -lcurl) + add_module_or_libs(libcurl -lcurl) + endif() + if(WIN32 AND NOT MINGW) + list(APPEND EXTRA_LIBS -lole32 -lshell32) + else() + set(cxx_libs "${CMAKE_CXX_IMPLICIT_LINK_LIBRARIES}") + list(REMOVE_ITEM cxx_libs ${CMAKE_C_IMPLICIT_LINK_LIBRARIES}) + foreach(lib IN LISTS cxx_libs) + list(APPEND EXTRA_LIBS "-l${lib}") + endforeach() endif() - if(HAVE_LIBM) + if(HAVE_LIBM AND NOT "-lm" IN_LIST EXTRA_LIBS) list(APPEND EXTRA_LIBS -lm) endif() if(HAVE_LIBDL) list(APPEND EXTRA_LIBS -ldl) endif() # Join list with a space; list(JOIN) added CMake 3.12 - string(REPLACE ";" " " _tmp_str "${EXTRA_LIBS}") - set(EXTRA_LIBS "${_tmp_str}") + string(REPLACE ";" " " EXTRA_LIBS "${EXTRA_LIBS}") + string(REPLACE ";" " " EXTRA_REQUIRES "${EXTRA_REQUIRES}") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/proj.pc.in diff --git a/proj.pc.in b/proj.pc.in index 54c5bfcc..9855aadc 100644 --- a/proj.pc.in +++ b/proj.pc.in @@ -11,4 +11,5 @@ Requires: Version: @VERSION@ Libs: -L${libdir} -lproj Libs.private: @EXTRA_LIBS@ +Requires.private: @EXTRA_REQUIRES@ Cflags: -I${includedir} -- cgit v1.2.3 From 295c67869270dc9319f965f1c18108fad516296e Mon Sep 17 00:00:00 2001 From: Kai Pastor Date: Sat, 5 Feb 2022 12:01:28 +0100 Subject: Harmonize CI apt setup --- .github/workflows/clang_linux/start.sh | 8 ++++++-- .github/workflows/linux_gcc_32bit/start.sh | 12 ++++++------ .github/workflows/linux_gcc_5_4/start.sh | 12 ++++++------ travis/linux_generic/before_install.sh | 6 +++++- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/.github/workflows/clang_linux/start.sh b/.github/workflows/clang_linux/start.sh index b0a5ac34..81eca492 100755 --- a/.github/workflows/clang_linux/start.sh +++ b/.github/workflows/clang_linux/start.sh @@ -4,8 +4,12 @@ set -e apt-get update -y DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - sudo autoconf automake libtool clang++-10 python3-clang-10 make cmake ccache pkg-config tar zip \ - sqlite3 libsqlite3-dev libtiff-dev libcurl4-openssl-dev jq python3-pip nlohmann-json3-dev libgtest-dev + autoconf automake libtool make cmake ccache pkg-config python3-pip sqlite3 tar zip \ + clang++-10 jq python3-clang-10 \ + libsqlite3-dev \ + libtiff-dev \ + libcurl4-openssl-dev \ + nlohmann-json3-dev libgtest-dev python3 -m pip install --user jsonschema export PATH=$HOME/.local/bin:$PATH diff --git a/.github/workflows/linux_gcc_32bit/start.sh b/.github/workflows/linux_gcc_32bit/start.sh index c54eb5ed..87a98a0b 100755 --- a/.github/workflows/linux_gcc_32bit/start.sh +++ b/.github/workflows/linux_gcc_32bit/start.sh @@ -9,14 +9,14 @@ export TRAVIS_BUILD_DIR="$WORK_DIR" ARCH=i386 dpkg --add-architecture i386 -apt update -y +apt-get update -y DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends -o APT::Immediate-Configure=0 \ - autoconf automake libtool gcc-multilib g++-multilib g++ sqlite3 \ - python3-pip \ - make cmake ccache pkg-config tar zip \ - libsqlite3-dev:$ARCH libtiff-dev:$ARCH libcurl4-openssl-dev:$ARCH \ - jq + autoconf automake libtool make cmake ccache pkg-config python3-pip sqlite3 tar zip \ + gcc-multilib g++-multilib g++ jq dpkg-dev \ + libsqlite3-dev:$ARCH \ + libtiff-dev:$ARCH \ + libcurl4-openssl-dev:$ARCH python3 -m pip install --user jsonschema export PATH=$HOME/.local/bin:$PATH diff --git a/.github/workflows/linux_gcc_5_4/start.sh b/.github/workflows/linux_gcc_5_4/start.sh index fc7abb1e..4b7088d7 100755 --- a/.github/workflows/linux_gcc_5_4/start.sh +++ b/.github/workflows/linux_gcc_5_4/start.sh @@ -6,14 +6,14 @@ export TRAVIS_OS_NAME=linux export BUILD_NAME=linux_gcc export TRAVIS_BUILD_DIR="$WORK_DIR" -apt update -y +apt-get update -y DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - autoconf automake libtool g++ sqlite3 \ - python3-pip python3-setuptools \ - make cmake ccache pkg-config tar zip \ - libsqlite3-dev libtiff-dev libcurl4-openssl-dev \ - jq lcov + autoconf automake libtool make cmake ccache pkg-config python3-pip sqlite3 tar zip \ + g++ jq lcov python3-setuptools \ + libsqlite3-dev \ + libtiff-dev \ + libcurl4-openssl-dev python3 -m pip install --user --upgrade "pip < 21.0" echo `python3 -m pip --version` diff --git a/travis/linux_generic/before_install.sh b/travis/linux_generic/before_install.sh index 114d8a7f..dbd5f5b2 100755 --- a/travis/linux_generic/before_install.sh +++ b/travis/linux_generic/before_install.sh @@ -5,4 +5,8 @@ set -e ./travis/before_install_apt.sh ./travis/before_install_pip.sh -sudo apt-get install -qq sqlite3 libsqlite3-dev libtiff-dev libcurl4-openssl-dev zip +sudo apt-get install -qq \ + sqlite3 zip \ + libsqlite3-dev \ + libtiff-dev \ + libcurl4-openssl-dev -- cgit v1.2.3 From 2b0ecb6f19b1be906a39eac5143d4c40252f0a5a Mon Sep 17 00:00:00 2001 From: Kai Pastor Date: Sat, 5 Feb 2022 12:03:25 +0100 Subject: Adapt testing to recursive pkg-config requirements When pkg-config is called with --static, it will recursively collect all Libs and Libs.private which are discovered via Requires and Requires.private. So these libs must be available for linking even when acutally only lib proj uses static linkage. Libs and pkg-config must be provided for the target triplet. --- .github/workflows/clang_linux/start.sh | 5 +++-- .github/workflows/linux_gcc_32bit/start.sh | 7 +++++-- .github/workflows/linux_gcc_5_4/start.sh | 2 +- test/postinstall/c_app/makefile.mak | 6 +++--- test/postinstall/test_autotools.sh | 5 +++-- test/postinstall/test_pkg-config.sh | 1 + travis/linux_generic/before_install.sh | 3 ++- 7 files changed, 18 insertions(+), 11 deletions(-) diff --git a/.github/workflows/clang_linux/start.sh b/.github/workflows/clang_linux/start.sh index 81eca492..48099fe3 100755 --- a/.github/workflows/clang_linux/start.sh +++ b/.github/workflows/clang_linux/start.sh @@ -7,8 +7,9 @@ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ autoconf automake libtool make cmake ccache pkg-config python3-pip sqlite3 tar zip \ clang++-10 jq python3-clang-10 \ libsqlite3-dev \ - libtiff-dev \ - libcurl4-openssl-dev \ + libtiff-dev libwebp-dev libzstd-dev \ + libcurl4-openssl-dev libnghttp2-dev libidn2-dev librtmp-dev libssh-dev \ + libpsl-dev libssl-dev libkrb5-dev comerr-dev libldap2-dev libbrotli-dev \ nlohmann-json3-dev libgtest-dev python3 -m pip install --user jsonschema diff --git a/.github/workflows/linux_gcc_32bit/start.sh b/.github/workflows/linux_gcc_32bit/start.sh index 87a98a0b..60be6fd3 100755 --- a/.github/workflows/linux_gcc_32bit/start.sh +++ b/.github/workflows/linux_gcc_32bit/start.sh @@ -15,8 +15,9 @@ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends -o AP autoconf automake libtool make cmake ccache pkg-config python3-pip sqlite3 tar zip \ gcc-multilib g++-multilib g++ jq dpkg-dev \ libsqlite3-dev:$ARCH \ - libtiff-dev:$ARCH \ - libcurl4-openssl-dev:$ARCH + libtiff-dev:$ARCH libwebp-dev:$ARCH libzstd-dev:$ARCH \ + libcurl4-openssl-dev:$ARCH libnghttp2-dev:$ARCH libidn2-dev:$ARCH librtmp-dev:$ARCH libssh-dev:$ARCH \ + libpsl-dev:$ARCH libssl-dev:$ARCH libkrb5-dev:$ARCH comerr-dev:$ARCH libldap2-dev:$ARCH libbrotli-dev:$ARCH python3 -m pip install --user jsonschema export PATH=$HOME/.local/bin:$PATH @@ -28,6 +29,8 @@ export TIFF_LIBS="-L/usr/lib/i386-linux-gnu -ltiff" export SQLITE3_CFLAGS=-I/usr/include/i386-linux-gnu export SQLITE3_LIBS="-L/usr/lib/i386-linux-gnu -lsqlite3" +export PKG_CONFIG=i686-linux-gnu-pkg-config + cd "$WORK_DIR" if test -f "$WORK_DIR/ccache.tar.gz"; then diff --git a/.github/workflows/linux_gcc_5_4/start.sh b/.github/workflows/linux_gcc_5_4/start.sh index 4b7088d7..be23392b 100755 --- a/.github/workflows/linux_gcc_5_4/start.sh +++ b/.github/workflows/linux_gcc_5_4/start.sh @@ -13,7 +13,7 @@ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ g++ jq lcov python3-setuptools \ libsqlite3-dev \ libtiff-dev \ - libcurl4-openssl-dev + libcurl4-openssl-dev libidn11-dev librtmp-dev libssl-dev libkrb5-dev comerr-dev libldap2-dev python3 -m pip install --user --upgrade "pip < 21.0" echo `python3 -m pip --version` diff --git a/test/postinstall/c_app/makefile.mak b/test/postinstall/c_app/makefile.mak index 3e29d4b1..01d1c259 100644 --- a/test/postinstall/c_app/makefile.mak +++ b/test/postinstall/c_app/makefile.mak @@ -6,18 +6,18 @@ TESTS = \ test_searchpath.sh \ test_version.sh -override CFLAGS += -g -Wall -Werror $(shell pkg-config proj --cflags) +override CFLAGS += -g -Wall -Werror $(shell ${PKG_CONFIG} proj --cflags) ifeq ($(BUILD_MODE),static) UNAME_S := $(shell uname -s) - _ldflags := $(shell pkg-config proj --libs --static) + _ldflags := $(shell ${PKG_CONFIG} proj --libs --static) ifeq ($(UNAME_S),Linux) # force static linking to libproj _ldflags := $(shell echo $(_ldflags) | sed 's/-lproj/-Wl,-Bstatic -lproj -Wl,-Bdynamic/') endif override LDFLAGS += $(_ldflags) else # default is shared - override LDFLAGS += $(shell pkg-config proj --libs) + override LDFLAGS += $(shell ${PKG_CONFIG} proj --libs) endif all: $(PROGRAM) diff --git a/test/postinstall/test_autotools.sh b/test/postinstall/test_autotools.sh index 28954c4d..c3e0e60b 100755 --- a/test/postinstall/test_autotools.sh +++ b/test/postinstall/test_autotools.sh @@ -12,12 +12,13 @@ main_setup $1 $2 echo "Running post-install tests with autotools/pkg-config (${BUILD_MODE})" if [ ${BUILD_MODE} = shared ]; then - export PKG_CONFIG="pkg-config" + export PKG_CONFIG="${PKG_CONFIG:-pkg-config}" ENABLE_STATIC_PROJ=no else - export PKG_CONFIG="pkg-config --static" + export PKG_CONFIG="${PKG_CONFIG:-pkg-config} --static" ENABLE_STATIC_PROJ=yes fi +echo ,${PKG_CONFIG}, export PKG_CONFIG_PATH=${prefix}/lib/pkgconfig diff --git a/test/postinstall/test_pkg-config.sh b/test/postinstall/test_pkg-config.sh index a9ccabce..d170e189 100755 --- a/test/postinstall/test_pkg-config.sh +++ b/test/postinstall/test_pkg-config.sh @@ -11,6 +11,7 @@ main_setup $1 $2 echo "Running post-install tests with pkg-config (${BUILD_MODE})" +export PKG_CONFIG="${PKG_CONFIG:-pkg-config}" export PKG_CONFIG_PATH=${prefix}/lib/pkgconfig if [ ${BUILD_MODE} = shared ]; then diff --git a/travis/linux_generic/before_install.sh b/travis/linux_generic/before_install.sh index dbd5f5b2..07d5c979 100755 --- a/travis/linux_generic/before_install.sh +++ b/travis/linux_generic/before_install.sh @@ -9,4 +9,5 @@ sudo apt-get install -qq \ sqlite3 zip \ libsqlite3-dev \ libtiff-dev \ - libcurl4-openssl-dev + libcurl4-openssl-dev libnghttp2-dev libidn2-dev librtmp-dev libssh-dev \ + libpsl-dev libssl-dev libkrb5-dev comerr-dev libldap2-dev libbrotli-dev -- cgit v1.2.3