1 # pkg-config file generation
3 # Uses the following globals:
4 # - PKG_BUILD_PREFIX: the build location (aka prefix). Defaults to CMAKE_INSTALL_PREFIX
5 # - PKG_BUILD_LIBDIR: the libdir location. Defaults to ${prefix}/lib.
6 # - PKG_BUILD_INCLUDEDIR: the includedir location. Defaults to ${prefix}/include.
9 function(pkg_build_config)
11 set(oneValueArgs NAME DESCRIPTION VERSION FILENAME LIBS_SELF)
12 set(multiValueArgs LIBS PRIVATE_LIBS REQUIRES CFLAGS)
14 cmake_parse_arguments(PKGCONFIG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
16 if (NOT DEFINED PKGCONFIG_FILENAME AND DEFINED PKGCONFIG_NAME)
17 set(PKGCONFIG_FILENAME ${PKGCONFIG_NAME})
19 if (NOT DEFINED PKGCONFIG_FILENAME)
20 message(FATAL_ERROR "Missing FILENAME argument")
22 set(PKGCONFIG_FILE "${PROJECT_BINARY_DIR}/${PKGCONFIG_FILENAME}.pc")
24 if (NOT DEFINED PKGCONFIG_DESCRIPTION)
25 message(FATAL_ERROR "Missing DESCRIPTION argument")
28 if (NOT DEFINED PKGCONFIG_VERSION)
29 message(FATAL_ERROR "Missing VERSION argument")
32 if (DEFINED PKG_BUILD_PREFIX)
33 set(PKGCONFIG_PREFIX "${PKG_BUILD_PREFIX}")
35 set(PKGCONFIG_PREFIX "${CMAKE_INSTALL_PREFIX}")
38 if(DEFINED PKG_BUILD_LIBDIR)
39 if (IS_ABSOLUTE ${PKG_BUILD_LIBDIR})
40 set(PKGCONFIG_LIBDIR ${PKG_BUILD_LIBDIR})
42 set(PKGCONFIG_LIBDIR "\${prefix}/${PKG_BUILD_LIBDIR}")
45 set(PKGCONFIG_LIBDIR "\${prefix}/lib")
48 if(DEFINED PKG_BUILD_INCLUDEDIR)
49 if (IS_ABSOLUTE ${PKG_BUILD_INCLUDEDIR})
50 set(PKGCONFIG_INCLUDEDIR ${PKG_BUILD_INCLUDEDIR})
52 set(PKGCONFIG_INCLUDEDIR "\${prefix}/${PKG_BUILD_INCLUDEDIR}")
55 set(PKGCONFIG_INCLUDEDIR "\${prefix}/include")
59 file(WRITE "${PKGCONFIG_FILE}"
60 "prefix=\"${PKGCONFIG_PREFIX}\"\n"
61 "libdir=\"${PKGCONFIG_LIBDIR}\"\n"
62 "includedir=\"${PKGCONFIG_INCLUDEDIR}\"\n"
64 "Name: ${PKGCONFIG_NAME}\n"
65 "Description: ${PKGCONFIG_DESCRIPTION}\n"
66 "Version: ${PKGCONFIG_VERSION}\n"
70 if(NOT DEFINED PKGCONFIG_LIBS_SELF)
71 set(PKGCONFIG_LIBS_SELF "${PKGCONFIG_FILE}")
74 if(NOT DEFINED PKGCONFIG_LIBS)
75 set(PKGCONFIG_LIBS "-l${PKGCONFIG_LIBS_SELF}")
77 list(INSERT PKGCONFIG_LIBS 0 "-l${PKGCONFIG_LIBS_SELF}")
80 list(REMOVE_DUPLICATES PKGCONFIG_LIBS)
81 string(REPLACE ";" " " PKGCONFIG_LIBS "${PKGCONFIG_LIBS}")
82 file(APPEND "${PKGCONFIG_FILE}" "Libs: -L\${libdir} ${PKGCONFIG_LIBS}\n")
84 # Prepare Libs.private
85 if(DEFINED PKGCONFIG_PRIVATE_LIBS)
86 list(REMOVE_DUPLICATES PKGCONFIG_PRIVATE_LIBS)
87 string(REPLACE ";" " " PKGCONFIG_PRIVATE_LIBS "${PKGCONFIG_PRIVATE_LIBS}")
88 file(APPEND "${PKGCONFIG_FILE}" "Libs.private: ${PKGCONFIG_PRIVATE_LIBS}\n")
91 # Prepare Requires.private
92 if(DEFINED PKGCONFIG_REQUIRES)
93 list(REMOVE_DUPLICATES PKGCONFIG_REQUIRES)
94 string(REPLACE ";" " " PKGCONFIG_REQUIRES "${PKGCONFIG_REQUIRES}")
95 file(APPEND "${PKGCONFIG_FILE}" "Requires.private: ${PKGCONFIG_REQUIRES}\n")
99 if(DEFINED PKGCONFIG_CFLAGS)
100 string(REPLACE ";" " " PKGCONFIG_CFLAGS "${PKGCONFIG_CFLAGS}")
102 set(PKGCONFIG_CFLAGS "")
104 file(APPEND "${PKGCONFIG_FILE}" "Cflags: -I\${includedir} ${PKGCONFIG_CFLAGS}\n")
107 install(FILES "${PKGCONFIG_FILE}"
108 DESTINATION "${PKGCONFIG_PREFIX}/${PKGCONFIG_LIBDIR}/pkgconfig"