Skip to content

Commit aa407ca

Browse files
authored
Merge pull request libgit2#5206 from tiennou/cmake/pkgconfig-building
CMake pkg-config modulification
2 parents 1995fe8 + 564b3ff commit aa407ca

File tree

3 files changed

+121
-35
lines changed

3 files changed

+121
-35
lines changed

cmake/Modules/PkgBuildConfig.cmake

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# pkg-config file generation
2+
#
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.
7+
#
8+
9+
function(pkg_build_config)
10+
set(options)
11+
set(oneValueArgs NAME DESCRIPTION VERSION FILENAME LIBS_SELF)
12+
set(multiValueArgs LIBS PRIVATE_LIBS REQUIRES CFLAGS)
13+
14+
cmake_parse_arguments(PKGCONFIG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
15+
16+
if (NOT DEFINED PKGCONFIG_FILENAME AND DEFINED PKGCONFIG_NAME)
17+
set(PKGCONFIG_FILENAME ${PKGCONFIG_NAME})
18+
endif()
19+
if (NOT DEFINED PKGCONFIG_FILENAME)
20+
message(FATAL_ERROR "Missing FILENAME argument")
21+
endif()
22+
set(PKGCONFIG_FILE "${PROJECT_BINARY_DIR}/${PKGCONFIG_FILENAME}.pc")
23+
24+
if (NOT DEFINED PKGCONFIG_DESCRIPTION)
25+
message(FATAL_ERROR "Missing DESCRIPTION argument")
26+
endif()
27+
28+
if (NOT DEFINED PKGCONFIG_VERSION)
29+
message(FATAL_ERROR "Missing VERSION argument")
30+
endif()
31+
32+
if (DEFINED PKG_BUILD_PREFIX)
33+
set(PKGCONFIG_PREFIX "${PKG_BUILD_PREFIX}")
34+
else()
35+
set(PKGCONFIG_PREFIX "${CMAKE_INSTALL_PREFIX}")
36+
endif()
37+
38+
if(DEFINED PKG_BUILD_LIBDIR)
39+
if (IS_ABSOLUTE ${PKG_BUILD_LIBDIR})
40+
set(PKGCONFIG_LIBDIR ${PKG_BUILD_LIBDIR})
41+
else()
42+
set(PKGCONFIG_LIBDIR "\${prefix}/${PKG_BUILD_LIBDIR}")
43+
endif()
44+
else()
45+
set(PKGCONFIG_LIBDIR "\${prefix}/lib")
46+
endif()
47+
48+
if(DEFINED PKG_BUILD_INCLUDEDIR)
49+
if (IS_ABSOLUTE ${PKG_BUILD_INCLUDEDIR})
50+
set(PKGCONFIG_INCLUDEDIR ${PKG_BUILD_INCLUDEDIR})
51+
else()
52+
set(PKGCONFIG_INCLUDEDIR "\${prefix}/${PKG_BUILD_INCLUDEDIR}")
53+
endif()
54+
else()
55+
set(PKGCONFIG_INCLUDEDIR "\${prefix}/include")
56+
endif()
57+
58+
# Write .pc "header"
59+
file(WRITE "${PKGCONFIG_FILE}"
60+
"prefix=\"${PKGCONFIG_PREFIX}\"\n"
61+
"libdir=\"${PKGCONFIG_LIBDIR}\"\n"
62+
"includedir=\"${PKGCONFIG_INCLUDEDIR}\"\n"
63+
"\n"
64+
"Name: ${PKGCONFIG_NAME}\n"
65+
"Description: ${PKGCONFIG_DESCRIPTION}\n"
66+
"Version: ${PKGCONFIG_VERSION}\n"
67+
)
68+
69+
# Prepare Libs
70+
if(NOT DEFINED PKGCONFIG_LIBS_SELF)
71+
set(PKGCONFIG_LIBS_SELF "${PKGCONFIG_FILE}")
72+
endif()
73+
74+
if(NOT DEFINED PKGCONFIG_LIBS)
75+
set(PKGCONFIG_LIBS "-l${PKGCONFIG_LIBS_SELF}")
76+
else()
77+
list(INSERT PKGCONFIG_LIBS 0 "-l${PKGCONFIG_LIBS_SELF}")
78+
endif()
79+
80+
list(REMOVE_DUPLICATES PKGCONFIG_LIBS)
81+
string(REPLACE ";" " " PKGCONFIG_LIBS "${PKGCONFIG_LIBS}")
82+
file(APPEND "${PKGCONFIG_FILE}" "Libs: -L\${libdir} ${PKGCONFIG_LIBS}\n")
83+
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")
89+
endif()
90+
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")
96+
endif()
97+
98+
# Prepare Cflags
99+
if(DEFINED PKGCONFIG_CFLAGS)
100+
string(REPLACE ";" " " PKGCONFIG_CFLAGS "${PKGCONFIG_CFLAGS}")
101+
else()
102+
set(PKGCONFIG_CFLAGS "")
103+
endif()
104+
file(APPEND "${PKGCONFIG_FILE}" "Cflags: -I\${includedir} ${PKGCONFIG_CFLAGS}\n")
105+
106+
# Install .pc file
107+
install(FILES "${PKGCONFIG_FILE}"
108+
DESTINATION "${PKGCONFIG_PREFIX}/${PKGCONFIG_LIBDIR}/pkgconfig"
109+
)
110+
endfunction()

libgit2.pc.in

Lines changed: 0 additions & 13 deletions
This file was deleted.

src/CMakeLists.txt

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ IF(DEBUG_POOL)
33
ENDIF()
44
ADD_FEATURE_INFO(debugpool GIT_DEBUG_POOL "debug pool allocator")
55

6+
INCLUDE(PkgBuildConfig)
7+
68
# This variable will contain the libraries we need to put into
79
# libgit2.pc's Requires.private. That is, what we're linking to or
810
# what someone who's statically linking us needs to link to.
@@ -25,23 +27,6 @@ SET(BIN_INSTALL_DIR bin CACHE PATH "Where to install binaries to.")
2527
SET(LIB_INSTALL_DIR lib CACHE PATH "Where to install libraries to.")
2628
SET(INCLUDE_INSTALL_DIR include CACHE PATH "Where to install headers to.")
2729

28-
# Set a couple variables to be substituted inside the .pc file.
29-
# We can't just use LIB_INSTALL_DIR in the .pc file, as passing them as absolue
30-
# or relative paths is both valid and supported by cmake.
31-
SET (PKGCONFIG_PREFIX ${CMAKE_INSTALL_PREFIX})
32-
33-
IF(IS_ABSOLUTE ${LIB_INSTALL_DIR})
34-
SET (PKGCONFIG_LIBDIR ${LIB_INSTALL_DIR})
35-
ELSE(IS_ABSOLUTE ${LIB_INSTALL_DIR})
36-
SET (PKGCONFIG_LIBDIR "\${prefix}/${LIB_INSTALL_DIR}")
37-
ENDIF (IS_ABSOLUTE ${LIB_INSTALL_DIR})
38-
39-
IF(IS_ABSOLUTE ${INCLUDE_INSTALL_DIR})
40-
SET (PKGCONFIG_INCLUDEDIR ${INCLUDE_INSTALL_DIR})
41-
ELSE(IS_ABSOLUTE ${INCLUDE_INSTALL_DIR})
42-
SET (PKGCONFIG_INCLUDEDIR "\${prefix}/${INCLUDE_INSTALL_DIR}")
43-
ENDIF(IS_ABSOLUTE ${INCLUDE_INSTALL_DIR})
44-
4530
# Enable tracing
4631
IF (ENABLE_TRACE STREQUAL "ON")
4732
SET(GIT_TRACE 1)
@@ -155,12 +140,14 @@ ELSEIF(REGEX_BACKEND STREQUAL "pcre2")
155140

156141
LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${PCRE2_INCLUDE_DIRS})
157142
LIST(APPEND LIBGIT2_LIBS ${PCRE2_LIBRARIES})
143+
LIST(APPEND LIBGIT2_PC_REQUIRES "libpcre2")
158144
ELSEIF(REGEX_BACKEND STREQUAL "pcre")
159145
ADD_FEATURE_INFO(regex ON "using system PCRE")
160146
SET(GIT_REGEX_PCRE 1)
161147

162148
LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${PCRE_INCLUDE_DIRS})
163149
LIST(APPEND LIBGIT2_LIBS ${PCRE_LIBRARIES})
150+
LIST(APPEND LIBGIT2_PC_REQUIRES "libpcre")
164151
ELSEIF(REGEX_BACKEND STREQUAL "regcomp")
165152
ADD_FEATURE_INFO(regex ON "using system regcomp")
166153
SET(GIT_REGEX_REGCOMP 1)
@@ -397,10 +384,13 @@ IF (SONAME)
397384
ENDIF()
398385
ENDIF()
399386

400-
LIST(REMOVE_DUPLICATES LIBGIT2_PC_REQUIRES)
401-
STRING(REPLACE ";" " " LIBGIT2_PC_REQUIRES "${LIBGIT2_PC_REQUIRES}")
402-
STRING(REPLACE ";" " " LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS}")
403-
CONFIGURE_FILE(${libgit2_SOURCE_DIR}/libgit2.pc.in ${libgit2_BINARY_DIR}/libgit2.pc @ONLY)
387+
PKG_BUILD_CONFIG(NAME libgit2
388+
VERSION ${LIBGIT2_VERSION_STRING}
389+
DESCRIPTION "The git library, take 2"
390+
LIBS_SELF git2
391+
PRIVATE_LIBS ${LIBGIT2_PC_LIBS}
392+
REQUIRES ${LIBGIT2_PC_REQUIRES}
393+
)
404394

405395
IF (MSVC_IDE)
406396
# Precompiled headers
@@ -414,6 +404,5 @@ INSTALL(TARGETS git2
414404
LIBRARY DESTINATION ${LIB_INSTALL_DIR}
415405
ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
416406
)
417-
INSTALL(FILES ${libgit2_BINARY_DIR}/libgit2.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig )
418407
INSTALL(DIRECTORY ${libgit2_SOURCE_DIR}/include/git2 DESTINATION ${INCLUDE_INSTALL_DIR} )
419408
INSTALL(FILES ${libgit2_SOURCE_DIR}/include/git2.h DESTINATION ${INCLUDE_INSTALL_DIR} )

0 commit comments

Comments
 (0)