aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: 9e048750d2c59914a396fa8507ddeae9dbeb007b (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
cmake_minimum_required (VERSION 3.0...3.27)
project (liberty C CXX)

# Moar warnings
set (CMAKE_CXX_STANDARD 11)
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
	# -Wunused-function is pretty annoying here, as everything is static
	set (wdisabled "-Wno-unused-function")
	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Wall -Wextra ${wdisabled}")
endif ()

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

find_package (PkgConfig REQUIRED)
pkg_check_modules (libssl REQUIRED libssl libcrypto)

if ("${CMAKE_SYSTEM_NAME}" MATCHES "BSD")
	# Our POSIX version macros make these undefined
	add_definitions (-D__BSD_VISIBLE=1 -D_BSD_SOURCE=1)
endif ()

set (common_libraries ${libssl_LIBRARIES})
include_directories (${libssl_INCLUDE_DIRS})
link_directories (${libssl_LIBRARY_DIRS})

# -lrt is only for glibc < 2.17
# -liconv may or may not be a part of libc
foreach (extra iconv rt)
	find_library (extra_lib_${extra} ${extra})
	if (extra_lib_${extra})
		list (APPEND common_libraries ${extra_lib_${extra}})
	endif ()
endforeach ()

# Build some unit tests
include_directories (${PROJECT_SOURCE_DIR})
enable_testing ()
set (tests liberty proto xdg)

pkg_check_modules (libpulse libpulse)
if (libpulse_FOUND)
	list (APPEND tests pulse)
	list (APPEND common_libraries ${libpulse_LIBRARIES})
	include_directories (${libpulse_INCLUDE_DIRS})
	link_directories (${libpulse_LIBRARY_DIRS})
endif ()

foreach (name ${tests})
	add_executable (test-${name} tests/${name}.c ${common_sources})
	add_threads (test-${name})
	target_link_libraries (test-${name} ${common_libraries})
	add_test (NAME test-${name} COMMAND test-${name})
endforeach ()

# --- Tools --------------------------------------------------------------------

# Test the AsciiDoc manual page generator for a successful parse
set (ASCIIMAN ${PROJECT_SOURCE_DIR}/tools/asciiman.awk)
add_custom_command (OUTPUT libertyxdr.7
	COMMAND env LC_ALL=C awk -f ${ASCIIMAN}
		"${PROJECT_SOURCE_DIR}/libertyxdr.adoc" > libertyxdr.7
	DEPENDS libertyxdr.adoc ${ASCIIMAN}
	COMMENT "Generating man page for libertyxdr" VERBATIM)
add_custom_target (docs ALL DEPENDS libertyxdr.7)

# Test CMake script parsing
add_test (test-cmake-parser
	env LC_ALL=C awk -f ${PROJECT_SOURCE_DIR}/tools/cmake-parser.awk
	-f ${PROJECT_SOURCE_DIR}/tools/cmake-dump.awk ${CMAKE_CURRENT_LIST_FILE})

# Test protocol code generation
set (lxdrgen_outputs)
set (lxdrgen_base "${PROJECT_BINARY_DIR}/lxdrgen.lxdr")
foreach (backend c cpp go mjs swift)
	list (APPEND lxdrgen_outputs ${lxdrgen_base}.${backend})
	add_custom_command (OUTPUT ${lxdrgen_base}.${backend}
		COMMAND env LC_ALL=C awk
			-f ${PROJECT_SOURCE_DIR}/tools/lxdrgen.awk
			-f ${PROJECT_SOURCE_DIR}/tools/lxdrgen-${backend}.awk
			-v PrefixCamel=ProtoGen
			${PROJECT_SOURCE_DIR}/tests/lxdrgen.lxdr
			> ${lxdrgen_base}.${backend}
		DEPENDS
			${PROJECT_SOURCE_DIR}/tools/lxdrgen.awk
			${PROJECT_SOURCE_DIR}/tools/lxdrgen-${backend}.awk
			${PROJECT_SOURCE_DIR}/tests/lxdrgen.lxdr
		COMMENT "Generating test protocol code (${backend})" VERBATIM)
endforeach ()
add_custom_target (test-lxdrgen-outputs ALL DEPENDS ${lxdrgen_outputs})

set_source_files_properties (${lxdrgen_base}.c
	PROPERTIES HEADER_FILE_ONLY TRUE)
add_executable (test-lxdrgen-c tests/lxdrgen.c ${lxdrgen_base}.c)
target_include_directories (test-lxdrgen-c PUBLIC ${PROJECT_BINARY_DIR})
add_test (NAME test-lxdrgen-c COMMAND test-lxdrgen-c)

set_source_files_properties (${lxdrgen_base}.cpp
	PROPERTIES HEADER_FILE_ONLY TRUE)
if (WIN32)
	add_executable (test-lxdrgen-cpp tests/lxdrgen.cpp
		${lxdrgen_base}.cpp tools/lxdrgen-cpp-win32.cpp)
else ()
	add_executable (test-lxdrgen-cpp tests/lxdrgen.cpp
		${lxdrgen_base}.cpp tools/lxdrgen-cpp-posix.cpp)
endif ()
target_link_libraries (test-lxdrgen-cpp ${common_libraries})
target_include_directories (test-lxdrgen-cpp PUBLIC ${PROJECT_BINARY_DIR})
add_test (NAME test-lxdrgen-cpp COMMAND test-lxdrgen-cpp)

find_program (GO_EXECUTABLE go)
if (GO_EXECUTABLE)
	add_test (test-lxdrgen-go ${GO_EXECUTABLE} vet ${lxdrgen_base}.go)
else ()
	message (WARNING "Cannot test generated protocol code for Go")
endif ()

find_program (NODE_EXECUTABLE node)
if (NODE_EXECUTABLE)
	add_test (test-lxdrgen-mjs ${NODE_EXECUTABLE} -c ${lxdrgen_base}.mjs)
else ()
	message (WARNING "Cannot test generated protocol code for Javascript")
endif ()

find_program (SWIFTC_EXECUTABLE swiftc)
if (SWIFTC_EXECUTABLE)
	add_test (test-lxdrgen-swift
		${SWIFTC_EXECUTABLE} -typecheck ${lxdrgen_base}.swift)
else ()
	message (WARNING "Cannot test generated protocol code for Swift")
endif ()