Files
puzzles/cmake/platforms/unix.cmake
Simon Tatham c0c64dc105 Advertise user-configurable cmake-time config options.
Various cmake variables that I was informally expecting users to set
on the cmake command line (e.g. cmake -DSTRICT=ON, or cmake
-DPUZZLES_GTK_VERSION=2) are now labelled explicitly with the CACHE
tag, and provided with a documentation string indicating what they're
for.

One effect of this is that GUI-like interfaces to your cmake build
directory, such as ccmake or cmake-gui, will show those variables
explicitly to give you a hint that you might want to change them.

Another is that when you do change them, cmake will recognise that it
needs to redo the rest of its configuration. Previously, if you sat in
an existing cmake build directory and did 'cmake -DSTRICT=ON .'
followed by 'cmake -DSTRICT=OFF .', nothing would happen, even though
you obviously meant it to.
2021-04-04 14:58:39 +01:00

108 lines
3.8 KiB
CMake

set(PUZZLES_GTK_VERSION "ANY"
CACHE STRING "Which major version of GTK to build with")
set_property(CACHE PUZZLES_GTK_VERSION
PROPERTY STRINGS ANY 3 2 1)
set(STRICT OFF
CACHE BOOL "Enable extra compiler warnings and make them errors")
set(NAME_PREFIX ""
CACHE STRING "Prefix to prepend to puzzle binary names to avoid clashes \
in a crowded bin directory, e.g. \"sgt-\"")
find_package(PkgConfig REQUIRED)
set(PUZZLES_GTK_FOUND FALSE)
macro(try_gtk_package VER PACKAGENAME)
if(NOT PUZZLES_GTK_FOUND AND
(PUZZLES_GTK_VERSION STREQUAL ANY OR
PUZZLES_GTK_VERSION STREQUAL ${VER}))
pkg_check_modules(GTK ${PACKAGENAME})
if(GTK_FOUND)
set(PUZZLES_GTK_FOUND TRUE)
endif()
endif()
endmacro()
try_gtk_package(3 gtk+-3.0)
try_gtk_package(2 gtk+-2.0)
if(NOT PUZZLES_GTK_FOUND)
message(FATAL_ERROR "Unable to find any usable version of GTK.")
endif()
include_directories(${GTK_INCLUDE_DIRS})
link_directories(${GTK_LIBRARY_DIRS})
set(platform_common_sources gtk.c printing.c)
set(platform_gui_libs ${GTK_LIBRARIES})
set(platform_libs -lm)
set(build_icons TRUE)
if(CMAKE_CROSSCOMPILING)
# The puzzle icons are built by compiling and running a preliminary
# set of puzzle binaries. We can't do that if the binaries won't run
# on the build host.
set(build_icons FALSE)
endif()
if(STRICT AND (CMAKE_C_COMPILER_ID MATCHES "GNU" OR
CMAKE_C_COMPILER_ID MATCHES "Clang"))
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wwrite-strings -std=c99 -pedantic -Werror")
endif()
function(get_platform_puzzle_extra_source_files OUTVAR NAME)
if(build_icons AND EXISTS ${CMAKE_SOURCE_DIR}/icons/${NAME}.sav)
# If we have the equipment to rebuild the puzzles' icon images
# from scratch, do so. Then changes in the puzzle display code
# will cause the icon to auto-update.
build_icon(${NAME})
set(c_icon_file ${CMAKE_BINARY_DIR}/icons/${NAME}-icon.c)
elseif(EXISTS ${CMAKE_SOURCE_DIR}/icons/${NAME}-icon.c)
# Failing that, use a pre-built icon file in the 'icons'
# subdirectory, if there is one. (They don't exist in git, but the
# distribution tarball will have pre-built them and put them in
# there, so that users building from that can still have icons
# even if they don't have the wherewithal to rebuild them.)
set(c_icon_file ${CMAKE_SOURCE_DIR}/icons/${NAME}-icon.c)
else()
# Failing even that, include no-icon.c to satisfy the link-time
# dependencies. The puzzles will build without nice icons.
set(c_icon_file ${CMAKE_SOURCE_DIR}/no-icon.c)
endif()
set(${OUTVAR} ${c_icon_file} PARENT_SCOPE)
endfunction()
function(set_platform_puzzle_target_properties NAME TARGET)
get_target_property(official ${TARGET} official)
get_target_property(exename ${TARGET} exename)
get_target_property(displayname ${TARGET} displayname)
get_target_property(description ${TARGET} description)
set(binary_name ${NAME_PREFIX}${NAME})
set_target_properties(${TARGET} PROPERTIES
OUTPUT_NAME ${binary_name})
if(${official})
if(CMAKE_VERSION VERSION_LESS 3.14)
# CMake 3.13 and earlier required an explicit install destination.
install(TARGETS ${TARGET} RUNTIME DESTINATION bin)
else()
# 3.14 and above selects a sensible default, which we should avoid
# overriding here so that end users can override it using
# CMAKE_INSTALL_BINDIR.
install(TARGETS ${TARGET})
endif()
configure_file(${CMAKE_SOURCE_DIR}/puzzle.desktop.in ${binary_name}.desktop)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/icons/${NAME}-48d24.png
DESTINATION share/pixmaps OPTIONAL RENAME ${binary_name}-48d24.png)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${binary_name}.desktop
DESTINATION share/applications)
endif()
endfunction()
function(build_platform_extras)
endfunction()