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)
|