diff options
author | Etienne Samson <samson.etienne@gmail.com> | 2019-08-17 12:17:21 +0200 |
---|---|---|
committer | Etienne Samson <samson.etienne@gmail.com> | 2019-09-14 09:33:33 +0200 |
commit | d80d9d56a7f3150ed205baff6b09c3090dd785af (patch) | |
tree | 97131dbd928516c2afe4914400200aa3f5f6c090 /cmake/Modules | |
parent | c97cf08ae3c1b1deb6a6eb557132ed5424aa4450 (diff) | |
download | libgit2-d80d9d56a7f3150ed205baff6b09c3090dd785af.tar.gz |
cmake: streamline *.pc file handling via a module
Diffstat (limited to 'cmake/Modules')
-rw-r--r-- | cmake/Modules/PkgBuildConfig.cmake | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/cmake/Modules/PkgBuildConfig.cmake b/cmake/Modules/PkgBuildConfig.cmake new file mode 100644 index 000000000..1c0079eb0 --- /dev/null +++ b/cmake/Modules/PkgBuildConfig.cmake @@ -0,0 +1,110 @@ +# pkg-config file generation +# +# Uses the following globals: +# - PKG_BUILD_PREFIX: the build location (aka prefix). Defaults to CMAKE_INSTALL_PREFIX +# - PKG_BUILD_LIBDIR: the libdir location. Defaults to ${prefix}/lib. +# - PKG_BUILD_INCLUDEDIR: the includedir location. Defaults to ${prefix}/include. +# + +function(pkg_build_config) + set(options) + set(oneValueArgs NAME DESCRIPTION VERSION FILENAME LIBS_SELF) + set(multiValueArgs LIBS PRIVATE_LIBS REQUIRES CFLAGS) + + cmake_parse_arguments(PKGCONFIG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (NOT DEFINED PKGCONFIG_FILENAME AND DEFINED PKGCONFIG_NAME) + set(PKGCONFIG_FILENAME ${PKGCONFIG_NAME}) + endif() + if (NOT DEFINED PKGCONFIG_FILENAME) + message(FATAL_ERROR "Missing FILENAME argument") + endif() + set(PKGCONFIG_FILE "${PROJECT_BINARY_DIR}/${PKGCONFIG_FILENAME}.pc") + + if (NOT DEFINED PKGCONFIG_DESCRIPTION) + message(FATAL_ERROR "Missing DESCRIPTION argument") + endif() + + if (NOT DEFINED PKGCONFIG_VERSION) + message(FATAL_ERROR "Missing VERSION argument") + endif() + + if (DEFINED PKG_BUILD_PREFIX) + set(PKGCONFIG_PREFIX "${PKG_BUILD_PREFIX}") + else() + set(PKGCONFIG_PREFIX "${CMAKE_INSTALL_PREFIX}") + endif() + + if(DEFINED PKG_BUILD_LIBDIR) + if (IS_ABSOLUTE ${PKG_BUILD_LIBDIR}) + set(PKGCONFIG_LIBDIR ${PKG_BUILD_LIBDIR}) + else() + set(PKGCONFIG_LIBDIR "\${prefix}/${PKG_BUILD_LIBDIR}") + endif() + else() + set(PKGCONFIG_LIBDIR "\${prefix}/lib") + endif() + + if(DEFINED PKG_BUILD_INCLUDEDIR) + if (IS_ABSOLUTE ${PKG_BUILD_INCLUDEDIR}) + set(PKGCONFIG_INCLUDEDIR ${PKG_BUILD_INCLUDEDIR}) + else() + set(PKGCONFIG_INCLUDEDIR "\${prefix}/${PKG_BUILD_INCLUDEDIR}") + endif() + else() + set(PKGCONFIG_INCLUDEDIR "\${prefix}/include") + endif() + + # Write .pc "header" + file(WRITE "${PKGCONFIG_FILE}" + "prefix=\"${PKGCONFIG_PREFIX}\"\n" + "libdir=\"${PKGCONFIG_LIBDIR}\"\n" + "includedir=\"${PKGCONFIG_INCLUDEDIR}\"\n" + "\n" + "Name: ${PKGCONFIG_NAME}\n" + "Description: ${PKGCONFIG_DESCRIPTION}\n" + "Version: ${PKGCONFIG_VERSION}\n" + ) + + # Prepare Libs + if(NOT DEFINED PKGCONFIG_LIBS_SELF) + set(PKGCONFIG_LIBS_SELF "${PKGCONFIG_FILE}") + endif() + + if(NOT DEFINED PKGCONFIG_LIBS) + set(PKGCONFIG_LIBS "-l${PKGCONFIG_LIBS_SELF}") + else() + list(INSERT PKGCONFIG_LIBS 0 "-l${PKGCONFIG_LIBS_SELF}") + endif() + + list(REMOVE_DUPLICATES PKGCONFIG_LIBS) + string(REPLACE ";" " " PKGCONFIG_LIBS "${PKGCONFIG_LIBS}") + file(APPEND "${PKGCONFIG_FILE}" "Libs: -L\${libdir} ${PKGCONFIG_LIBS}\n") + + # Prepare Libs.private + if(DEFINED PKGCONFIG_PRIVATE_LIBS) + list(REMOVE_DUPLICATES PKGCONFIG_PRIVATE_LIBS) + string(REPLACE ";" " " PKGCONFIG_PRIVATE_LIBS "${PKGCONFIG_PRIVATE_LIBS}") + file(APPEND "${PKGCONFIG_FILE}" "Libs.private: ${PKGCONFIG_PRIVATE_LIBS}\n") + endif() + + # Prepare Requires.private + if(DEFINED PKGCONFIG_REQUIRES) + list(REMOVE_DUPLICATES PKGCONFIG_REQUIRES) + string(REPLACE ";" " " PKGCONFIG_REQUIRES "${PKGCONFIG_REQUIRES}") + file(APPEND "${PKGCONFIG_FILE}" "Requires.private: ${PKGCONFIG_REQUIRES}\n") + endif() + + # Prepare Cflags + if(DEFINED PKGCONFIG_CFLAGS) + string(REPLACE ";" " " PKGCONFIG_CFLAGS "${PKGCONFIG_CFLAGS}") + else() + set(PKGCONFIG_CFLAGS "") + endif() + file(APPEND "${PKGCONFIG_FILE}" "Cflags: -I\${includedir} ${PKGCONFIG_CFLAGS}\n") + + # Install .pc file + install(FILES "${PKGCONFIG_FILE}" + DESTINATION "${PKGCONFIG_PREFIX}/${PKGCONFIG_LIBDIR}/pkgconfig" + ) +endfunction() |