diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e722098..8f357db2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,6 +147,19 @@ endif() if(BUILD_TESTING) enable_testing() add_subdirectory(demo) + if(BUILD_SHARED_LIBS) + add_test(NAME test-pkg-config + COMMAND ${CMAKE_COMMAND} + -DLTM_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} + -DLTM_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}/pkg-config-test + -DCMAKE_GENERATOR=${CMAKE_GENERATOR} + -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM} + -DCMAKE_GENERATOR_TOOLSET=${CMAKE_GENERATOR_TOOLSET} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -P ${CMAKE_CURRENT_SOURCE_DIR}/demo/test_pkgconfig.cmake + ) + endif() endif() #----------------------------------------------------------------------------- @@ -170,6 +183,13 @@ if(BUILD_SHARED_LIBS) # Let the user override the default directory of the pkg-config file (usually this shouldn't be required to be changed) set(CMAKE_INSTALL_PKGCONFIGDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig" CACHE PATH "Folder where to install .pc files") + foreach(DIR LIBDIR INCLUDEDIR) + set(LTM_PKGCONFIG_${DIR} "${CMAKE_INSTALL_${DIR}}") + if(NOT IS_ABSOLUTE "${LTM_PKGCONFIG_${DIR}}") + set(LTM_PKGCONFIG_${DIR} "\${prefix}/${CMAKE_INSTALL_${DIR}}") + endif() + endforeach() + configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc diff --git a/demo/test_pkgconfig.cmake b/demo/test_pkgconfig.cmake new file mode 100644 index 00000000..2d387309 --- /dev/null +++ b/demo/test_pkgconfig.cmake @@ -0,0 +1,56 @@ +# SPDX-License-Identifier: Unlicense + +# Keep absolute install paths outside the source and build trees. These paths +# need not exist: the test configures packages but does not install anything. +get_filename_component(ROOT "${LTM_BINARY_DIR}" ABSOLUTE) +set(PARENT "") +while(NOT PARENT STREQUAL ROOT) + set(PARENT "${ROOT}") + get_filename_component(ROOT "${ROOT}" DIRECTORY) +endwhile() + +foreach(LAYOUT relative absolute absolute-include absolute-lib) + set(BUILD_DIR "${LTM_BINARY_DIR}/${LAYOUT}") + set(INCLUDEDIR include) + set(LIBDIR lib) + set(EXPECTED_INCLUDEDIR "\${prefix}/include/libtommath") + set(EXPECTED_LIBDIR "\${prefix}/lib") + if(LAYOUT STREQUAL absolute OR LAYOUT STREQUAL absolute-include) + set(INCLUDEDIR "${ROOT}libtommath-pkg-config-test/${LAYOUT}/headers") + set(EXPECTED_INCLUDEDIR "${INCLUDEDIR}/libtommath") + endif() + if(LAYOUT STREQUAL absolute OR LAYOUT STREQUAL absolute-lib) + set(LIBDIR "${ROOT}libtommath-pkg-config-test/${LAYOUT}/libraries") + set(EXPECTED_LIBDIR "${LIBDIR}") + endif() + + file(MAKE_DIRECTORY "${BUILD_DIR}") + execute_process( + COMMAND "${CMAKE_COMMAND}" "${LTM_SOURCE_DIR}" + -G "${CMAKE_GENERATOR}" + "-DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}" + "-DCMAKE_GENERATOR_TOOLSET=${CMAKE_GENERATOR_TOOLSET}" + "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}" + "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" + "-DCMAKE_INSTALL_PREFIX=${BUILD_DIR}/prefix" + "-DCMAKE_INSTALL_INCLUDEDIR=${INCLUDEDIR}" + "-DCMAKE_INSTALL_LIBDIR=${LIBDIR}" + -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON + -DBUILD_SHARED_LIBS=ON + -DBUILD_TESTING=OFF + WORKING_DIRECTORY "${BUILD_DIR}" + RESULT_VARIABLE RESULT + ) + if(NOT RESULT EQUAL 0) + message(FATAL_ERROR "Could not configure ${LAYOUT} installation") + endif() + + file(READ "${BUILD_DIR}/libtommath.pc" CONFIG) + foreach(DIR INCLUDEDIR LIBDIR) + string(TOLOWER "${DIR}" VARIABLE) + string(FIND "${CONFIG}" "${VARIABLE}=${EXPECTED_${DIR}}\n" MATCH) + if(MATCH EQUAL -1) + message(FATAL_ERROR "Incorrect ${VARIABLE} in ${LAYOUT} libtommath.pc") + endif() + endforeach() +endforeach() diff --git a/libtommath.pc.in b/libtommath.pc.in index ad8f5c3b..126d0201 100644 --- a/libtommath.pc.in +++ b/libtommath.pc.in @@ -1,6 +1,6 @@ prefix=@CMAKE_INSTALL_PREFIX@ -libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ -includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@PROJECT_NAME@ +libdir=@LTM_PKGCONFIG_LIBDIR@ +includedir=@LTM_PKGCONFIG_INCLUDEDIR@/@PROJECT_NAME@ Name: LibTomMath Description: public domain library for manipulating large integer numbers diff --git a/makefile.shared b/makefile.shared index 20bd8e03..057faeb5 100644 --- a/makefile.shared +++ b/makefile.shared @@ -64,8 +64,8 @@ $(LIBNAME): $(OBJECTS) install: $(LIBNAME) .install_common $(LIBTOOL) --mode=install install -m 644 $(LIBNAME) $(DESTDIR)$(LIBPATH)/$(LIBNAME) install -m 644 $(HEADERS_PUB) $(DESTDIR)$(INCPATH) - sed -e 's,^prefix=.*,prefix=$(PREFIX),' -e 's,^Version:.*,Version: $(VERSION_PC),' -e 's,@CMAKE_INSTALL_LIBDIR@,lib,' \ - -e 's,@CMAKE_INSTALL_INCLUDEDIR@/@PROJECT_NAME@,include/tommath,' libtommath.pc.in > libtommath.pc + sed -e 's,^prefix=.*,prefix=$(PREFIX),' -e 's,^Version:.*,Version: $(VERSION_PC),' -e 's,^libdir=.*,libdir=$${prefix}/lib,' \ + -e 's,^includedir=.*,includedir=$${prefix}/include/tommath,' libtommath.pc.in > libtommath.pc install -d $(DESTDIR)$(LIBPATH)/pkgconfig install -m 644 libtommath.pc $(DESTDIR)$(LIBPATH)/pkgconfig/