aboutsummaryrefslogtreecommitdiff
path: root/cmake/setup.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/setup.cmake')
-rw-r--r--cmake/setup.cmake133
1 files changed, 133 insertions, 0 deletions
diff --git a/cmake/setup.cmake b/cmake/setup.cmake
new file mode 100644
index 0000000..8afa455
--- /dev/null
+++ b/cmake/setup.cmake
@@ -0,0 +1,133 @@
+set(build_individual_puzzles TRUE)
+set(build_cli_programs TRUE)
+set(build_icons FALSE)
+set(need_c_icons FALSE)
+
+# Include one of platforms/*.cmake to define platform-specific stuff.
+# Each of these is expected to:
+# - define get_platform_puzzle_extra_source_files(), used below
+# - define set_platform_puzzle_target_properties(), used below
+# - define build_platform_extras(), called from the top-level CMakeLists.txt
+# - override the above build_* settings, if necessary
+if(CMAKE_SYSTEM_NAME MATCHES "Windows")
+ include(cmake/platforms/windows.cmake)
+elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+ include(cmake/platforms/osx.cmake)
+elseif(CMAKE_SYSTEM_NAME MATCHES "NestedVM")
+ include(cmake/platforms/nestedvm.cmake)
+elseif(CMAKE_C_COMPILER MATCHES "emcc")
+ include(cmake/platforms/emscripten.cmake)
+else() # assume Unix
+ include(cmake/platforms/unix.cmake)
+endif()
+
+# Accumulate lists of the puzzles' bare names and source file
+# locations, for use in build_platform_extras() implementations when
+# they want to build things based on all the puzzles at once.
+set(puzzle_names)
+set(puzzle_sources)
+
+include(icons/icons.cmake)
+
+# The main function called from the top-level CMakeLists.txt to define
+# each puzzle.
+function(puzzle NAME)
+ cmake_parse_arguments(OPT
+ "" "DISPLAYNAME;DESCRIPTION;OBJECTIVE;WINDOWS_EXE_NAME" "" ${ARGN})
+
+ if(NOT DEFINED OPT_WINDOWS_EXE_NAME)
+ set(OPT_WINDOWS_EXE_NAME ${NAME})
+ endif()
+
+ if (CMAKE_SYSTEM_NAME MATCHES "Windows")
+ set(EXENAME ${OPT_WINDOWS_EXE_NAME})
+ else()
+ set(EXENAME ${NAME})
+ endif()
+
+ set(exename_${NAME} ${EXENAME} PARENT_SCOPE)
+ set(displayname_${NAME} ${OPT_DISPLAYNAME} PARENT_SCOPE)
+ set(description_${NAME} ${OPT_DESCRIPTION} PARENT_SCOPE)
+ set(objective_${NAME} ${OPT_OBJECTIVE} PARENT_SCOPE)
+
+ set(official TRUE)
+ if(NAME STREQUAL nullgame)
+ # nullgame is not a playable puzzle; it has to be built (to prove
+ # it still can build), but not installed, or included in the main
+ # list of puzzles, or compiled into all-in-one binaries, etc. In
+ # other words, it's not "officially" part of the puzzle
+ # collection.
+ set(official FALSE)
+ endif()
+ if(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_SOURCE_DIR}/unfinished)
+ # The same goes for puzzles in the 'unfinished' subdirectory,
+ # although we make an exception if configured to on the command
+ # line.
+ list(FIND PUZZLES_ENABLE_UNFINISHED ${NAME} enable_this_one)
+ if(enable_this_one EQUAL -1)
+ set(official FALSE)
+ endif()
+ endif()
+
+ if (official)
+ set(puzzle_names ${puzzle_names} ${NAME} PARENT_SCOPE)
+ set(puzzle_sources ${puzzle_sources} ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.c PARENT_SCOPE)
+ endif()
+
+ get_platform_puzzle_extra_source_files(extra_files ${NAME})
+
+ if (build_individual_puzzles)
+ add_executable(${EXENAME} ${NAME}.c ${extra_files})
+ target_link_libraries(${EXENAME}
+ common ${platform_gui_libs} ${platform_libs})
+ set_platform_puzzle_target_properties(${NAME} ${EXENAME})
+ endif()
+endfunction()
+
+# The main function called from the top-level CMakeLists.txt to define
+# a command-line helper tool.
+function(cliprogram NAME)
+ cmake_parse_arguments(OPT
+ "" "COMPILE_DEFINITIONS" "" ${ARGN})
+
+ if(build_cli_programs)
+ add_executable(${NAME} ${CMAKE_SOURCE_DIR}/nullfe.c
+ ${OPT_UNPARSED_ARGUMENTS})
+ target_link_libraries(${NAME} common ${platform_libs})
+ if(OPT_COMPILE_DEFINITIONS)
+ target_compile_definitions(${NAME} PRIVATE ${OPT_COMPILE_DEFINITIONS})
+ endif()
+ endif()
+endfunction()
+
+# A small wrapper around cliprogram, taking advantage of the common
+# formula that puzzle 'foo' often comes with 'foosolver'.
+function(solver NAME)
+ cliprogram(${NAME}solver ${puzzle_src_prefix}${NAME}.c ${ARGN}
+ COMPILE_DEFINITIONS STANDALONE_SOLVER)
+endfunction()
+
+function(write_generated_games_header)
+ set(generated_include_dir ${CMAKE_CURRENT_BINARY_DIR}/include)
+ set(generated_include_dir ${generated_include_dir} PARENT_SCOPE)
+
+ file(MAKE_DIRECTORY ${generated_include_dir})
+ file(WRITE ${generated_include_dir}/generated-games.h "")
+ list(SORT puzzle_names)
+ foreach(name ${puzzle_names})
+ file(APPEND ${generated_include_dir}/generated-games.h "GAME(${name})\n")
+ endforeach()
+endfunction()
+
+# This has to be run from the unfinished subdirectory, so that the
+# updates to puzzle_names etc will be propagated to the top-level scope.
+macro(export_variables_to_parent_scope)
+ set(puzzle_names ${puzzle_names} PARENT_SCOPE)
+ set(puzzle_sources ${puzzle_sources} PARENT_SCOPE)
+ foreach(name ${puzzle_names})
+ set(exename_${name} ${exename_${name}} PARENT_SCOPE)
+ set(displayname_${name} ${displayname_${name}} PARENT_SCOPE)
+ set(description_${name} ${description_${name}} PARENT_SCOPE)
+ set(objective_${name} ${objective_${name}} PARENT_SCOPE)
+ endforeach()
+endmacro()