summaryrefslogtreecommitdiffstats
path: root/cmake/PkgBuildConfig.cmake
blob: c8939e63a2eba8134db70db6c6576245437ed486 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# pkg-config file generation
#

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()

	# Write .pc "header"
	file(WRITE "${PKGCONFIG_FILE}"
		"prefix=\"${CMAKE_INSTALL_PREFIX}\"\n"
		"libdir=\"${CMAKE_INSTALL_FULL_LIBDIR}\"\n"
		"includedir=\"${CMAKE_INSTALL_FULL_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 "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
endfunction()