Přemysl Eric Janouch
fcd1b8e011
This adds yet another build dependency, but it's better than the alternatives of handling it in code.
115 lines
4.2 KiB
CMake
115 lines
4.2 KiB
CMake
# 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})
|
|
|
|
# Icon generation utilities
|
|
# TODO: Shove this into liberty as a CMake module, similar to AddThreads,
|
|
# and remove the copies in the parent CMakeLists.txt as well as in tdv.
|
|
if (NOT ${CMAKE_VERSION} VERSION_LESS 3.18.0)
|
|
set (find_program_REQUIRE REQUIRED)
|
|
endif ()
|
|
|
|
function (icon_to_png name svg size output_dir output)
|
|
set (_dimensions ${size}x${size})
|
|
set (_png_path ${output_dir}/hicolor/${_dimensions}/apps)
|
|
set (_png ${_png_path}/${name}.png)
|
|
set (${output} ${_png} PARENT_SCOPE)
|
|
|
|
find_program (rsvg_convert_EXECUTABLE rsvg-convert ${find_program_REQUIRE})
|
|
add_custom_command (OUTPUT ${_png}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${_png_path}
|
|
COMMAND ${rsvg_convert_EXECUTABLE} --output=${_png}
|
|
--width=${size} --height=${size} ${svg}
|
|
DEPENDS ${svg}
|
|
COMMENT "Generating ${name} ${_dimensions} application icon" VERBATIM)
|
|
endfunction ()
|
|
|
|
function (icon_for_win32 ico pngs pngs_raw)
|
|
set (_raws)
|
|
foreach (png ${pngs_raw})
|
|
list (APPEND _raws "--raw=${png}")
|
|
endforeach ()
|
|
|
|
find_program (icotool_EXECUTABLE icotool ${find_program_REQUIRE})
|
|
add_custom_command (OUTPUT ${ico}
|
|
COMMAND ${icotool_EXECUTABLE} -c -o ${ico} ${_raws} -- ${pngs}
|
|
DEPENDS ${pngs} ${pngs_raw}
|
|
COMMENT "Generating Windows program icon" VERBATIM)
|
|
endfunction ()
|
|
|
|
# Produce a beep sample
|
|
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 (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
|
|
set (root "${PROJECT_SOURCE_DIR}/..")
|
|
|
|
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)
|