aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: 0aa0760d0282ca6c500e009582eb61e19d3902e6 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
cmake_minimum_required (VERSION 3.10)
project (desktop-tools VERSION 0.1.0 DESCRIPTION "Desktop tools" LANGUAGES C)

# Moar warnings
set (CMAKE_C_STANDARD 99)
set (CMAKE_C_STANDARD_REQUIRED ON)
set (CMAKE_C_EXTENSIONS OFF)

if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
	# -Wunused-function is pretty annoying here, as everything is static
	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wno-unused-function")
endif ()

# Dependencies
set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/liberty/cmake)
include (AddThreads)

find_package (PkgConfig REQUIRED)
pkg_check_modules (x REQUIRED x11 xext xextproto)
pkg_check_modules (pulse REQUIRED libpulse)
pkg_check_modules (dbus REQUIRED dbus-1)
pkg_check_modules (libusb libusb-1.0)
pkg_check_modules (gdm gdm glib-2.0 gio-2.0)
include_directories (
	${x_INCLUDE_DIRS} ${pulse_INCLUDE_DIRS} ${dbus_INCLUDE_DIRS})
link_directories (
	${x_LIBRARY_DIRS} ${pulse_LIBRARY_DIRS} ${dbus_LIBRARY_DIRS})

option (WITH_USB "Compile with USB utilities" ${libusb_FOUND})
option (WITH_GDM "Compile with GDM utilities" ${gdm_FOUND})

# Generate a configuration file
configure_file (${PROJECT_SOURCE_DIR}/config.h.in
	${PROJECT_BINARY_DIR}/config.h)
include_directories (${PROJECT_BINARY_DIR})

# Build
set (targets wmstatus paswitch siprandom)
if ("${CMAKE_SYSTEM_NAME}" STREQUAL Linux)
	# These use Linux i2c APIs, but can be made to work on macOS
	list (APPEND targets brightness input-switch)
	# Only iexec could be made to use kqueue
	list (APPEND targets fancontrol-ng priod iexec)
elseif ("${CMAKE_SYSTEM_NAME}" MATCHES BSD)
	# Need this for SIGWINCH in FreeBSD and OpenBSD respectively;
	# our POSIX version macros make it undefined
	add_definitions (-D__BSD_VISIBLE=1 -D_BSD_SOURCE=1)
elseif (APPLE)
	add_definitions (-D_DARWIN_C_SOURCE)
endif ()

foreach (name big-brother ${targets})
	add_executable (${name} ${name}.c)
endforeach ()

target_link_libraries (big-brother ${x_LIBRARIES})
target_link_libraries (paswitch ${pulse_LIBRARIES})
target_link_libraries (wmstatus
	${x_LIBRARIES} ${pulse_LIBRARIES} ${dbus_LIBRARIES})
add_threads (wmstatus)

if (WITH_USB)
	add_executable (elksmart-comm elksmart-comm.c)
	target_include_directories (elksmart-comm PUBLIC ${libusb_INCLUDE_DIRS})
	target_link_directories (elksmart-comm PUBLIC ${libusb_LIBRARY_DIRS})
	target_link_libraries (elksmart-comm ${libusb_LIBRARIES})
endif ()
if (WITH_GDM)
	add_executable (gdm-switch-user gdm-switch-user.c)
	target_include_directories (gdm-switch-user PUBLIC ${gdm_INCLUDE_DIRS})
	target_link_directories (gdm-switch-user PUBLIC ${gdm_LIBRARY_DIRS})
	target_link_libraries (gdm-switch-user ${gdm_LIBRARIES})
endif ()

# The files to be installed
include (GNUInstallDirs)

# We have to put this under /usr on Open Build Service RPM distros, no idea why
set (SYSTEMD_UNITDIR /lib/systemd/system
	CACHE PATH "Base directory for systemd unit files")

if ("${CMAKE_SYSTEM_NAME}" STREQUAL Linux)
	configure_file (${PROJECT_SOURCE_DIR}/fancontrol-ng.service.in
		${PROJECT_BINARY_DIR}/fancontrol-ng.service @ONLY)
	install (FILES fancontrol-ng.conf.example
		DESTINATION ${CMAKE_INSTALL_DATADIR}/fancontrol-ng)

	configure_file (${PROJECT_SOURCE_DIR}/priod.service.in
		${PROJECT_BINARY_DIR}/priod.service @ONLY)
	install (FILES priod.conf.example
		DESTINATION ${CMAKE_INSTALL_DATADIR}/priod)

	# System-wide unit files should be installed under /lib and not /usr/lib
	install (FILES
		${PROJECT_BINARY_DIR}/fancontrol-ng.service
		${PROJECT_BINARY_DIR}/priod.service
		DESTINATION "${SYSTEMD_UNITDIR}")
endif ()

if (WITH_GDM)
	install (TARGETS gdm-switch-user DESTINATION ${CMAKE_INSTALL_BINDIR})
endif ()

# These should be accessible by users, but need to touch system devices.
# Use the setuid bit, for simplicity.
foreach (target brightness input-switch elksmart-comm)
	if (${target} IN_LIST targets)
		list (REMOVE_ITEM targets ${target})
		install (TARGETS ${target} DESTINATION ${CMAKE_INSTALL_BINDIR}
			PERMISSIONS
				OWNER_WRITE OWNER_READ OWNER_EXECUTE
				GROUP_READ GROUP_EXECUTE
				WORLD_READ WORLD_EXECUTE
				SETUID)
	endif ()
endforeach ()

install (TARGETS ${targets} DESTINATION ${CMAKE_INSTALL_BINDIR})
install (PROGRAMS shellify DESTINATION ${CMAKE_INSTALL_BINDIR})
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})

# CPack
set (CPACK_PACKAGE_VENDOR "Premysl Eric Janouch")
set (CPACK_PACKAGE_CONTACT "Přemysl Eric Janouch <p@janouch.name>")
set (CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
set (CPACK_GENERATOR "TGZ;ZIP")
set (CPACK_PACKAGE_FILE_NAME
	"${PROJECT_NAME}-${PROJECT_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
set (CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME}-${PROJECT_VERSION}")
set (CPACK_SOURCE_GENERATOR "TGZ;ZIP")
set (CPACK_SOURCE_IGNORE_FILES "/\\\\.git;/build;/CMakeLists.txt.user")
set (CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}")

set (CPACK_SET_DESTDIR TRUE)
include (CPack)