File: WindowsBuildHelpers.cmake

package info (click to toggle)
veyon 4.9.7%2Brepack1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 14,028 kB
  • sloc: cpp: 52,043; ansic: 7,307; python: 228; makefile: 222; sh: 48
file content (96 lines) | stat: -rw-r--r-- 3,516 bytes parent folder | download
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
function(add_windows_resources TARGET)
	set(args_option REQUIRE_ADMINISTRATOR_PRIVILEGES CONSOLE)
	set(args_single NAME DESCRIPTION WINDOWS_ICON)
	set(args_multi)

	cmake_parse_arguments(PARSE_ARGV 1 arg
		"${args_option}"
		"${args_single}"
		"${args_multi}")

	if (NOT arg_NAME)
		message(FATAL_ERROR "No NAME given for target ${TARGET}")
	endif()

	if (NOT arg_DESCRIPTION)
		set(arg_DESCRIPTION "Veyon ${arg_NAME}")
	endif()

	if (arg_CONSOLE)
		set_target_properties(${TARGET} PROPERTIES LINK_FLAGS -mconsole)
	else()
		set_target_properties(${TARGET} PROPERTIES LINK_FLAGS -mwindows)
	endif()

	get_target_property(target_type ${TARGET} TYPE)
	if (target_type STREQUAL "EXECUTABLE")
		set(FILETYPE "VFT_APP")
		set(SUFFIX "exe")
	else()
		set(FILETYPE "VFT_DLL")
		set(SUFFIX "dll")
	endif()

	string(CONCAT RESOURCE_DATA
		"#include <windows.h>\n"
		"CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST ${TARGET}.${SUFFIX}.manifest\n"
		"VS_VERSION_INFO VERSIONINFO\n"
		"	FILEVERSION   ${VERSION_MAJOR},${VERSION_MINOR},${VERSION_PATCH},${VERSION_BUILD}\n"
		"	FILEFLAGSMASK 0x0L\n"
		"	FILEOS        VOS_NT_WINDOWS32\n"
		"	FILETYPE      ${FILETYPE}\n"
		"	FILESUBTYPE   VFT2_UNKNOWN\n"
		"BEGIN\n"
		"	BLOCK \"StringFileInfo\"\n"
		"	BEGIN\n"
		"		BLOCK \"040904E4\"\n"
		"		BEGIN\n"
		"			VALUE \"Comments\",         \"Virtual Eye On Networks (https://veyon.io)\\0\"\n"
		"			VALUE \"CompanyName\",      \"Veyon Solutions\\0\"\n"
		"			VALUE \"ProductName\",      \"Veyon\\0\"\n"
		"			VALUE \"ProductVersion\",   \"${VERSION_STRING}\\0\"\n"
		"			VALUE \"FileDescription\",  \"${arg_DESCRIPTION}\\0\"\n"
		"			VALUE \"FileVersion\",      \"${VERSION_STRING}\\0\"\n"
		"			VALUE \"LegalCopyright\",   \"Copyright (c) 2017-2025 Veyon Solutions / Tobias Junghans\\0\"\n"
		"			VALUE \"OriginalFilename\", \"${TARGET}.${SUFFIX}\\0\"\n"
		"		END\n"
		"	END\n"
		"	BLOCK \"VarFileInfo\"\n"
		"	BEGIN\n"
		"		VALUE \"Translation\", 0x0409, 0x04E4\n"
		"	END\n"
		"END\n")
	if (arg_WINDOWS_ICON)
		string(APPEND RESOURCE_DATA "icon ICON ${arg_WINDOWS_ICON}\n")
	endif()

	file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.${SUFFIX}.rc "${RESOURCE_DATA}")

	set(MANIFEST_TRUSTINFO "")
	if (arg_REQUIRE_ADMINISTRATOR_PRIVILEGES)
		string(CONCAT MANIFEST_TRUSTINFO "	<trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\">\n"
			"		<security>\n"
			"			<requestedPrivileges>\n"
			"				<requestedExecutionLevel level=\"requireAdministrator\" uiAccess=\"false\"/>\n"
			"			</requestedPrivileges>\n"
			"		</security>\n"
			"	</trustInfo>\n")
	endif()

	string(CONCAT MANIFEST_DATA "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
		"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">\n"
		"	<assemblyIdentity version=\"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}\" name=\"Veyon.${arg_NAME}\" type=\"win32\"/>\n"
		"	<description>${arg_DESCRIPTION}</description>\n"
		"	<compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n"
		"		<application>\n"
		"			<supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\"/>\n"
		"		</application>\n"
		"	</compatibility>\n"
		"${MANIFEST_TRUSTINFO}"
		"</assembly>")

	file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.${SUFFIX}.manifest "${MANIFEST_DATA}")

	set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.${SUFFIX}.rc PROPERTIES INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR})
	target_sources(${TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.${SUFFIX}.rc)
endfunction()