aboutsummaryrefslogtreecommitdiff
path: root/xW/CMakeLists.txt
blob: c6a715a6b89130f63961681818f2501424971367 (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
# The last version with Windows XP support is 3.13, we want to keep that
cmake_minimum_required (VERSION 3.10)

file (READ ../xK-version project_version)
configure_file (../xK-version xK-version.tag COPYONLY)
string (STRIP "${project_version}" project_version)

# This is an entirely separate CMake project--the main executables only build
# on Windows within Cygwin, and this Windows executable only builds on Linux
# cross-compiled, so you'd want to build them independently anyway.
project (xW VERSION "${project_version}"
	DESCRIPTION "Win32 frontend for xC" LANGUAGES CXX)

set (CMAKE_CXX_STANDARD 17)

add_definitions (-DUNICODE -D_UNICODE)
add_compile_options ("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options ("$<$<CXX_COMPILER_ID:GNU>:-Wall;-Wextra>")
add_compile_options ("$<$<CXX_COMPILER_ID:Clang>:-Wall;-Wextra>")
add_link_options ("$<$<CXX_COMPILER_ID:GNU>:-static;-municode>")
add_link_options ("$<$<CXX_COMPILER_ID:Clang>:-static;-municode>")

set (project_config ${PROJECT_BINARY_DIR}/config.h)
configure_file (${PROJECT_SOURCE_DIR}/config.h.in ${project_config})
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})

# Produce a beep sample
if (NOT ${CMAKE_VERSION} VERSION_LESS 3.18.0)
	set (find_program_REQUIRE REQUIRED)
endif ()

find_program (sox_EXECUTABLE sox ${find_program_REQUIRE})
add_custom_command (OUTPUT beep.wav
	COMMAND ${sox_EXECUTABLE} -b 16 -Dr 44100 -n beep.wav
		synth 0.1 0 25 triangle 800 vol 0.5 fade t 0 -0 0.005 pad 0 0.05
	COMMENT "Generating a beep sample" VERBATIM)

# Rasterize SVG icons
set (root "${PROJECT_SOURCE_DIR}/..")
set (CMAKE_MODULE_PATH ${root}/liberty/cmake)
include (IconUtils)

set (icon_ico_list)
foreach (icon xW xW-highlighted)
	set (icon_png_list)
	foreach (icon_size 16 32 48)
		icon_to_png (${icon} ${PROJECT_SOURCE_DIR}/${icon}.svg
			${icon_size} ${PROJECT_BINARY_DIR}/icons icon_png)
		list (APPEND icon_png_list ${icon_png})
	endforeach ()
	icon_to_png (${icon} ${PROJECT_SOURCE_DIR}/${icon}.svg
		256 ${PROJECT_BINARY_DIR}/icons icon_png)

	set (icon_ico ${PROJECT_BINARY_DIR}/${icon}.ico)
	icon_for_win32 (${icon_ico} "${icon_png_list}" "${icon_png}")
	list (APPEND icon_ico_list ${icon_ico})
endforeach ()

set_property (SOURCE xW.rc
	APPEND PROPERTY OBJECT_DEPENDS ${icon_ico_list} beep.wav)

# Build the main executable and link it
find_program (awk_EXECUTABLE awk ${find_program_REQUIRE})
add_custom_command (OUTPUT xC-proto.cpp
	COMMAND ${CMAKE_COMMAND} -E env LC_ALL=C ${awk_EXECUTABLE}
		-f ${root}/liberty/tools/lxdrgen.awk
		-f ${root}/liberty/tools/lxdrgen-cpp.awk
		-v PrefixCamel=Relay
		${root}/xC.lxdr > xC-proto.cpp
	DEPENDS
		${root}/liberty/tools/lxdrgen.awk
		${root}/liberty/tools/lxdrgen-cpp.awk
		${root}/xC.lxdr
	COMMENT "Generating xC relay protocol code" VERBATIM)
add_custom_target (xC-proto DEPENDS ${PROJECT_BINARY_DIR}/xC-proto.cpp)

add_executable (xW WIN32 xW.cpp xW.rc xW.manifest ${project_config}
	${root}/liberty/tools/lxdrgen-cpp-win32.cpp)
target_link_libraries (xW comctl32 ws2_32 winmm)
add_dependencies (xW xC-proto)

# At least with MinGW, this is a fully independent portable executable
install (TARGETS xW DESTINATION .)
set (CPACK_GENERATOR ZIP)
include (CPack)