add quick and dirty cmake buildsystem

This commit is contained in:
Daniel Wolf 2021-02-22 20:00:37 -05:00
parent 99703d8129
commit 87f2b3589d
Signed by: nephatrine
GPG Key ID: F402AF4822FB01F5
17 changed files with 1950 additions and 0 deletions

269
.cmake-format Normal file
View File

@ -0,0 +1,269 @@
# ----------------------------------
# Options affecting listfile parsing
# ----------------------------------
with section("parse"):
# Specify structure for custom cmake functions
additional_commands = {
'nx_generate_export_header': {
'flags': ['DEFINE_NO_DEPRECATED'],
'kwargs': {
'BASE_NAME': '*',
'CUSTOM_CONTENT_FROM_VARIABLE': '*',
'DEFINE_SYMBOL': '*',
'DEPRECATED_MACRO_NAME': '*',
'EXPORT_FILE_NAME': '*',
'EXPORT_MACRO_CNAME': '*',
'EXPORT_MACRO_NAME': '*',
'INCLUDE_GUARD_NAME': '*',
'NO_DEPRECATED_MACRO_NAME': '*',
'NO_EXPORT_MACRO_NAME': '*',
'PREFIX_NAME': '*',
'STATIC_DEFINE': '*'
}
},
'nx_generate_version_header': {
'flags': ['QUERY_GIT'],
'kwargs': {
'BASE_NAME': '*',
'CUSTOM_CONTENT_FROM_VARIABLE': '*',
'INCLUDE_GUARD_NAME': '*',
'PREFIX_NAME': '*',
'VERSION_FILE_NAME': '*',
'VERSION_MACRO_NAME': '*'
}
}
}
# Override configurations per-command where available
override_spec = {}
# Specify variable tags.
vartags = []
# Specify property tags.
proptags = []
# -----------------------------
# Options affecting formatting.
# -----------------------------
with section("format"):
# Disable formatting entirely, making cmake-format a no-op
disable = False
# How wide to allow formatted cmake files
line_width = 140
# How many spaces to tab for indent
tab_size = 4
# If true, lines are indented using tab characters (utf-8 0x09) instead of
# <tab_size> space characters (utf-8 0x20). In cases where the layout would
# require a fractional tab character, the behavior of the fractional
# indentation is governed by <fractional_tab_policy>
use_tabchars = True
# If <use_tabchars> is True, then the value of this variable indicates how
# fractional indentions are handled during whitespace replacement. If set to
# 'use-space', fractional indentation is left as spaces (utf-8 0x20). If set
# to `round-up` fractional indentation is replaced with a single tab character
# (utf-8 0x09) effectively shifting the column to the next tabstop
fractional_tab_policy = 'round-up'
# If an argument group contains more than this many sub-groups (parg or kwarg
# groups) then force it to a vertical layout.
max_subgroups_hwrap = 2
# If a positional argument group contains more than this many arguments, then
# force it to a vertical layout.
max_pargs_hwrap = 6
# If a cmdline positional group consumes more than this many lines without
# nesting, then invalidate the layout (and nest)
max_rows_cmdline = 2
# If true, separate flow control names from their parentheses with a space
separate_ctrl_name_with_space = False
# If true, separate function names from parentheses with a space
separate_fn_name_with_space = False
# If a statement is wrapped to more than one line, than dangle the closing
# parenthesis on its own line.
dangle_parens = False
# If the trailing parenthesis must be 'dangled' on its on line, then align it
# to this reference: `prefix`: the start of the statement, `prefix-indent`:
# the start of the statement, plus one indentation level, `child`: align to
# the column of the arguments
dangle_align = 'prefix'
# If the statement spelling length (including space and parenthesis) is
# smaller than this amount, then force reject nested layouts.
min_prefix_chars = 4
# If the statement spelling length (including space and parenthesis) is larger
# than the tab width by more than this amount, then force reject un-nested
# layouts.
max_prefix_chars = 10
# If a candidate layout is wrapped horizontally but it exceeds this many
# lines, then reject the layout.
max_lines_hwrap = 2
# What style line endings to use in the output.
line_ending = 'unix'
# Format command names consistently as 'lower' or 'upper' case
command_case = 'canonical'
# Format keywords consistently as 'lower' or 'upper' case
keyword_case = 'unchanged'
# A list of command names which should always be wrapped
always_wrap = []
# If true, the argument lists which are known to be sortable will be sorted
# lexicographicall
enable_sort = True
# If true, the parsers may infer whether or not an argument list is sortable
# (without annotation).
autosort = False
# By default, if cmake-format cannot successfully fit everything into the
# desired linewidth it will apply the last, most agressive attempt that it
# made. If this flag is True, however, cmake-format will print error, exit
# with non-zero status code, and write-out nothing
require_valid_layout = False
# A dictionary mapping layout nodes to a list of wrap decisions. See the
# documentation for more information.
layout_passes = {}
# ------------------------------------------------
# Options affecting comment reflow and formatting.
# ------------------------------------------------
with section("markup"):
# What character to use for bulleted lists
bullet_char = '*'
# What character to use as punctuation after numerals in an enumerated list
enum_char = '.'
# If comment markup is enabled, don't reflow the first comment block in each
# listfile. Use this to preserve formatting of your copyright/license
# statements.
first_comment_is_literal = True
# If comment markup is enabled, don't reflow any comment block which matches
# this (regex) pattern. Default is `None` (disabled).
literal_comment_pattern = None
# Regular expression to match preformat fences in comments default=
# ``r'^\s*([`~]{3}[`~]*)(.*)$'``
fence_pattern = '^\\s*([`~]{3}[`~]*)(.*)$'
# Regular expression to match rulers in comments default=
# ``r'^\s*[^\w\s]{3}.*[^\w\s]{3}$'``
ruler_pattern = '^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$'
# If a comment line matches starts with this pattern then it is explicitly a
# trailing comment for the preceeding argument. Default is '#<'
explicit_trailing_pattern = '#<'
# If a comment line starts with at least this many consecutive hash
# characters, then don't lstrip() them off. This allows for lazy hash rulers
# where the first hash char is not separated by space
hashruler_min_length = 10
# If true, then insert a space between the first hash char and remaining hash
# chars in a hash ruler, and normalize its length to fill the column
canonicalize_hashrulers = True
# enable comment markup parsing and reflow
enable_markup = True
# ----------------------------
# Options affecting the linter
# ----------------------------
with section("lint"):
# a list of lint codes to disable
disabled_codes = []
# regular expression pattern describing valid function names
function_pattern = '[0-9a-z_]+'
# regular expression pattern describing valid macro names
macro_pattern = '[0-9A-Z_]+'
# regular expression pattern describing valid names for variables with global
# (cache) scope
global_var_pattern = '[A-Z][0-9A-Z_]+'
# regular expression pattern describing valid names for variables with global
# scope (but internal semantic)
internal_var_pattern = '_[A-Z][0-9A-Z_]+'
# regular expression pattern describing valid names for variables with local
# scope
local_var_pattern = '[a-z][a-z0-9_]+'
# regular expression pattern describing valid names for privatedirectory
# variables
private_var_pattern = '_[0-9a-z_]+'
# regular expression pattern describing valid names for public directory
# variables
public_var_pattern = '[A-Z][0-9A-Z_]+'
# regular expression pattern describing valid names for function/macro
# arguments and loop variables.
argument_var_pattern = '[a-z][a-z0-9_]+'
# regular expression pattern describing valid names for keywords used in
# functions or macros
keyword_pattern = '[A-Z][0-9A-Z_]+'
# In the heuristic for C0201, how many conditionals to match within a loop in
# before considering the loop a parser.
max_conditionals_custom_parser = 2
# Require at least this many newlines between statements
min_statement_spacing = 1
# Require no more than this many newlines between statements
max_statement_spacing = 2
max_returns = 6
max_branches = 12
max_arguments = 5
max_localvars = 15
max_statements = 50
# -------------------------------
# Options affecting file encoding
# -------------------------------
with section("encode"):
# If true, emit the unicode byte-order mark (BOM) at the start of the file
emit_byteorder_mark = False
# Specify the encoding of the input file. Defaults to utf-8
input_encoding = 'utf-8'
# Specify the encoding of the output file. Defaults to utf-8. Note that cmake
# only claims to support utf-8 so be careful when using anything else
output_encoding = 'utf-8'
# -------------------------------------
# Miscellaneous configurations options.
# -------------------------------------
with section("misc"):
# A dictionary containing any per-command configuration overrides. Currently
# only `command_case` is supported.
per_command = {}

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
.vs/*
build*/*
*.kate-swp

367
CMakeLists.txt Normal file
View File

@ -0,0 +1,367 @@
# -------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © 2021 Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -------------------------------
cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
project(
KyuII
VERSION 3.21
LANGUAGES C)
# Policies
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.14")
cmake_policy(SET CMP0087 NEW)
endif()
# CMake Includes
include(CMakeDependentOption)
set(CMAKE_SHARED_MODULE_PREFIX "")
# Project Includes
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/tools")
include(NXGenerateExportHeader)
include(NXGenerateVersionHeader)
include(NXGetRuntimeDependencies)
# Platform-Specifics
option(KYUII_BUILD_UNIMPLEMENTED "Build Unimplemented Components" OFF)
set(KYUII_PLATFORM_CD OFF)
set(KYUII_PLATFORM_COMMON OFF)
set(KYUII_PLATFORM_IN OFF)
set(KYUII_PLATFORM_NET OFF)
set(KYUII_PLATFORM_SND OFF)
set(KYUII_PLATFORM_SYS OFF)
set(KYUII_PLATFORM_SYS_DYN OFF)
set(KYUII_PLATFORM_VID OFF)
set(KYUII_PLATFORM_VID_DYN OFF)
if(WIN32)
list(APPEND KYUII_ENGINE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/win32/conproc.c" "${CMAKE_CURRENT_SOURCE_DIR}/win32/q2.rc")
list(APPEND KYUII_ENGINE_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/win32/conproc.h" "${CMAKE_CURRENT_SOURCE_DIR}/win32/resource.h")
set(KYUII_PLATFORM_CD ON)
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/win32/cd_win.c")
set(KYUII_PLATFORM_COMMON ON)
list(APPEND KYUII_COMMON_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/win32/q_shwin.c")
list(APPEND KYUII_COMMON_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/win32/winquake.h")
list(APPEND KYUII_COMMON_LIBS "Winmm")
set(KYUII_PLATFORM_IN ON)
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/win32/in_win.c")
set(KYUII_PLATFORM_NET ON)
list(APPEND KYUII_ENGINE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/win32/net_wins.c")
list(APPEND KYUII_ENGINE_LIBS "Ws2_32")
set(KYUII_PLATFORM_SND ON)
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/win32/snd_win.c")
set(KYUII_PLATFORM_SYS ON)
set(KYUII_PLATFORM_SYS_DYN ON)
list(APPEND KYUII_ENGINE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/win32/sys_win.c")
set(KYUII_PLATFORM_VID ON)
set(KYUII_PLATFORM_VID_DYN ON)
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/win32/vid_dll.c" "${CMAKE_CURRENT_SOURCE_DIR}/win32/vid_menu.c")
elseif(UNIX)
set(KYUII_PLATFORM_CD ON)
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/linux/cd_linux.c")
set(KYUII_PLATFORM_COMMON ON)
list(APPEND KYUII_COMMON_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/linux/glob.c" "${CMAKE_CURRENT_SOURCE_DIR}/linux/q_shlinux.c")
list(APPEND KYUII_COMMON_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/linux/glob.h")
set(KYUII_PLATFORM_IN ON)
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/linux/in_linux.c")
set(KYUII_PLATFORM_NET ON)
list(APPEND KYUII_ENGINE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/linux/net_udp.c")
set(KYUII_PLATFORM_SND ON)
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/linux/snd_linux.c")
set(KYUII_PLATFORM_SYS ON)
set(KYUII_PLATFORM_SYS_DYN ON)
list(APPEND KYUII_ENGINE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/linux/sys_linux.c")
set(KYUII_PLATFORM_VID ON)
set(KYUII_PLATFORM_VID_DYN ON)
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/linux/vid_menu.c" "${CMAKE_CURRENT_SOURCE_DIR}/linux/vid_so.c")
else()
set(KYUII_PLATFORM_CD ${KYUII_BUILD_UNIMPLEMENTED})
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/null/cd_null.c")
set(KYUII_PLATFORM_COMMON ${KYUII_BUILD_UNIMPLEMENTED})
list(APPEND KYUII_COMMON_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/null/q_shnull.c")
set(KYUII_PLATFORM_IN ${KYUII_BUILD_UNIMPLEMENTED})
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/null/in_null.c")
set(KYUII_PLATFORM_NET ${KYUII_BUILD_UNIMPLEMENTED})
list(APPEND KYUII_ENGINE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/null/net_null.c")
set(KYUII_PLATFORM_SND ${KYUII_BUILD_UNIMPLEMENTED})
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/null/snddma_null.c")
set(KYUII_PLATFORM_SYS ${KYUII_BUILD_UNIMPLEMENTED})
list(APPEND KYUII_ENGINE_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/null/sys_null.c")
set(KYUII_PLATFORM_VID ${KYUII_BUILD_UNIMPLEMENTED})
list(APPEND KYUII_CLIENT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/null/vid_null.c")
endif()
# Shared Functions - Engine, Game, Refresh
nx_generate_version_header(${PROJECT_NAME} QUERY_GIT)
list(APPEND KYUII_SHARED_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/game/q_shared.c")
list(APPEND KYUII_SHARED_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/game/q_shared.h" "${CMAKE_CURRENT_BINARY_DIR}/kyuii_version.h")
add_library(Shared INTERFACE)
target_compile_definitions(Shared INTERFACE C_ONLY)
target_include_directories(Shared INTERFACE "${CMAKE_CURRENT_BINARY_DIR}")
if(UNIX)
target_compile_definitions(Shared INTERFACE stricmp=strcasecmp)
target_link_libraries(Shared INTERFACE m)
endif()
target_sources(Shared INTERFACE ${KYUII_SHARED_SOURCE})
add_library(KyuII::Shared ALIAS Shared)
# Common Functions - Engine, Refresh
add_library(Common INTERFACE)
target_link_libraries(Common INTERFACE KyuII::Shared ${KYUII_COMMON_LIBS})
target_sources(Common INTERFACE ${KYUII_COMMON_SOURCE})
add_library(KyuII::Common ALIAS Common)
# Game API - Engine, Game
set(gameapi_VERSION 3.21)
nx_generate_version_header(gameapi)
nx_generate_export_header(gameapi STATIC_DEFINE GAME_HARD_LINKED)
list(APPEND KYUII_GAMEAPI_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/game/m_flash.c")
list(APPEND KYUII_GAMEAPI_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/game/game.h" "${CMAKE_CURRENT_BINARY_DIR}/gameapi_export.h"
"${CMAKE_CURRENT_BINARY_DIR}/gameapi_version.h")
add_library(GameAPI INTERFACE)
target_link_libraries(GameAPI INTERFACE KyuII::Shared)
target_sources(GameAPI INTERFACE ${KYUII_GAMEAPI_SOURCE})
add_library(KyuII::GameAPI ALIAS GameAPI)
# Refresh API - Engine, Refresh
set(refapi_VERSION 3.21)
nx_generate_version_header(refapi)
nx_generate_export_header(refapi STATIC_DEFINE REF_HARD_LINKED)
list(APPEND KYUII_REFAPI_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/client/ref.h" "${CMAKE_CURRENT_BINARY_DIR}/refapi_export.h"
"${CMAKE_CURRENT_BINARY_DIR}/refapi_version.h")
add_library(RefAPI INTERFACE)
target_link_libraries(RefAPI INTERFACE KyuII::Common)
target_sources(RefAPI INTERFACE ${KYUII_REFAPI_SOURCE})
add_library(KyuII::RefAPI ALIAS RefAPI)
# Game Libraries
cmake_dependent_option(KYUII_USE_DYNAMIC_GAME "Use Dynamic Game Modules" ON "KYUII_PLATFORM_SYS_DYN" OFF)
set(KYUII_DEFAULT_GAME ON)
cmake_dependent_option(KYUII_BUILD_GAMEQ2 "Build Quake II Game Module" ON "KYUII_DEFAULT_GAME" OFF)
if(KYUII_BUILD_GAMEQ2 AND NOT KYUII_USE_DYNAMIC_GAME)
set(KYUII_DEFAULT_GAME OFF)
endif()
cmake_dependent_option(KYUII_BUILD_GAMECTF "Build CTF Game Module" ON "KYUII_DEFAULT_GAME" OFF)
if(KYUII_BUILD_GAMECTF AND NOT KYUII_USE_DYNAMIC_GAME)
set(KYUII_DEFAULT_GAME OFF)
endif()
if(KYUII_BUILD_GAMEQ2)
add_subdirectory(game)
endif()
if(KYUII_BUILD_GAMECTF)
add_subdirectory(ctf)
endif()
# Refresh Libraries
find_package(OpenGL)
cmake_dependent_option(KYUII_USE_DYNAMIC_REFRESH "Use Dynamic Refresh Modules" ON "KYUII_PLATFORM_VID_DYN" OFF)
set(KYUII_DEFAULT_REFRESH ON)
cmake_dependent_option(KYUII_BUILD_REFGL "Build OpenGL Refresh Module" ${OPENGL_FOUND} "KYUII_DEFAULT_REFRESH" OFF)
if(KYUII_BUILD_REFGL AND NOT KYUII_USE_DYNAMIC_REFRESH)
set(KYUII_DEFAULT_REFRESH OFF)
endif()
cmake_dependent_option(KYUII_BUILD_REFSOFT "Build Software Refresh Module" ON "KYUII_DEFAULT_REFRESH" OFF)
if(KYUII_BUILD_REFSOFT AND NOT KYUII_USE_DYNAMIC_REFRESH)
set(KYUII_DEFAULT_REFRESH OFF)
endif()
if(KYUII_BUILD_REFGL)
add_subdirectory(ref_gl)
endif()
if(KYUII_BUILD_REFSOFT)
add_subdirectory(ref_soft)
endif()
# Common Engine
set(KYUII_DEDICATED_ONLY OFF)
set(KYUII_NETCLIENT_ONLY OFF)
if(NOT KYUII_PLATFORM_VID_DYN AND NOT TARGET KyuII::RefHL)
set(KYUII_DEDICATED_ONLY ON)
endif()
if(NOT KYUII_PLATFORM_SYS_DYN AND NOT TARGET KyuII::GameHL)
set(KYUII_NETCLIENT_ONLY ON)
endif()
cmake_dependent_option(KYUII_BUILD_KYUNET "Build Dedicated Client" ${KYUII_NETCLIENT_ONLY}
"NOT KYUII_DEDICATED_ONLY;KYUII_PLATFORM_SYS;KYUII_PLATFORM_COMMON;KYUII_PLATFORM_NET;KYUII_PLATFORM_IN" OFF)
cmake_dependent_option(KYUII_BUILD_KYUNODE "Build Dedicated Server" ON
"NOT KYUII_NETCLIENT_ONLY;KYUII_PLATFORM_SYS;KYUII_PLATFORM_COMMON;KYUII_PLATFORM_NET" OFF)
cmake_dependent_option(KYUII_BUILD_KYUII "Build Full Engine" ON
"NOT KYUII_DEDICATED_ONLY;NOT KYUII_NETCLIENT_ONLY;KYUII_PLATFORM_SYS;KYUII_PLATFORM_COMMON;KYUII_PLATFORM_IN" OFF)
list(
APPEND
KYUII_ENGINE_SOURCE
"${CMAKE_CURRENT_SOURCE_DIR}/qcommon/cmd.c"
"${CMAKE_CURRENT_SOURCE_DIR}/qcommon/cmodel.c"
"${CMAKE_CURRENT_SOURCE_DIR}/qcommon/common.c"
"${CMAKE_CURRENT_SOURCE_DIR}/qcommon/crc.c"
"${CMAKE_CURRENT_SOURCE_DIR}/qcommon/cvar.c"
"${CMAKE_CURRENT_SOURCE_DIR}/qcommon/files.c"
"${CMAKE_CURRENT_SOURCE_DIR}/qcommon/md4.c"
"${CMAKE_CURRENT_SOURCE_DIR}/qcommon/net_chan.c"
"${CMAKE_CURRENT_SOURCE_DIR}/qcommon/pmove.c")
list(APPEND KYUII_ENGINE_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/qcommon/crc.h" "${CMAKE_CURRENT_SOURCE_DIR}/qcommon/qcommon.h"
"${CMAKE_CURRENT_SOURCE_DIR}/qcommon/qfiles.h")
list(
APPEND
KYUII_SERVER_SOURCE
"${CMAKE_CURRENT_SOURCE_DIR}/server/sv_ccmds.c"
"${CMAKE_CURRENT_SOURCE_DIR}/server/sv_ents.c"
"${CMAKE_CURRENT_SOURCE_DIR}/server/sv_game.c"
"${CMAKE_CURRENT_SOURCE_DIR}/server/sv_init.c"
"${CMAKE_CURRENT_SOURCE_DIR}/server/sv_main.c"
"${CMAKE_CURRENT_SOURCE_DIR}/server/sv_send.c"
"${CMAKE_CURRENT_SOURCE_DIR}/server/sv_user.c"
"${CMAKE_CURRENT_SOURCE_DIR}/server/sv_world.c")
list(APPEND KYUII_SERVER_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/server/server.h")
list(APPEND KYUII_SERVER_NULL "${CMAKE_CURRENT_SOURCE_DIR}/server/sv_null.c")
list(
APPEND
KYUII_CLIENT_SOURCE
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_cin.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_ents.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_fx.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_input.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_inv.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_main.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_newfx.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_parse.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_pred.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_scrn.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_tent.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cl_view.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/console.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/keys.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/menu.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/qmenu.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/snd_dma.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/snd_mem.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/snd_mix.c"
"${CMAKE_CURRENT_SOURCE_DIR}/client/x86.c")
list(
APPEND
KYUII_CLIENT_HEADER
"${CMAKE_CURRENT_SOURCE_DIR}/client/adivtab.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/anorms.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/asm_i386.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/block16.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/block8.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/cdaudio.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/client.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/console.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/input.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/keys.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/qmenu.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/screen.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/snd_loc.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/sound.h"
"${CMAKE_CURRENT_SOURCE_DIR}/client/vid.h")
list(APPEND KYUII_CLIENT_NULL "${CMAKE_CURRENT_SOURCE_DIR}/null/cd_null.c" "${CMAKE_CURRENT_SOURCE_DIR}/null/cl_null.c"
"${CMAKE_CURRENT_SOURCE_DIR}/null/in_null.c" "${CMAKE_CURRENT_SOURCE_DIR}/null/snddma_null.c")
if(KYUII_USE_DYNAMIC_GAME OR KYUII_USE_DYNAMIC_REFRESH)
list(APPEND KYUII_ENGINE_LIBS ${CMAKE_DL_LIBS})
endif()
if(KYUII_USE_DYNAMIC_GAME)
list(APPEND KYUII_SERVER_LIBS KyuII::GameAPI)
else()
list(APPEND KYUII_SERVER_LIBS KyuII::GameHL)
endif()
if(KYUII_USE_DYNAMIC_REFRESH)
list(APPEND KYUII_CLIENT_LIBS KyuII::RefAPI)
else()
list(APPEND KYUII_CLIENT_LIBS KyuII::RefHL)
endif()
if(KYUII_BUILD_KYUII)
add_executable(KyuII WIN32 ${KYUII_ENGINE_SOURCE} ${KYUII_CLIENT_SOURCE} ${KYUII_SERVER_SOURCE})
target_link_libraries(KyuII PRIVATE ${KYUII_ENGINE_LIBS} ${KYUII_CLIENT_LIBS} ${KYUII_SERVER_LIBS})
install(TARGETS KyuII RUNTIME DESTINATION kyuii)
nx_add_runtime_executable(KyuII)
endif()
if(KYUII_BUILD_KYUNODE)
add_executable(KyuNode WIN32 ${KYUII_ENGINE_SOURCE} ${KYUII_CLIENT_NULL} ${KYUII_SERVER_SOURCE})
target_compile_definitions(KyuNode PRIVATE DEDICATED_ONLY)
target_link_libraries(KyuNode PRIVATE ${KYUII_ENGINE_LIBS} KyuII::Common ${KYUII_SERVER_LIBS})
install(TARGETS KyuNode RUNTIME DESTINATION kyuii)
nx_add_runtime_executable(KyuNode)
endif()
if(KYUII_BUILD_KYUNET)
add_executable(KyuNet WIN32 ${KYUII_ENGINE_SOURCE} ${KYUII_CLIENT_SOURCE} ${KYUII_SERVER_NULL})
target_compile_definitions(KyuNet PRIVATE NETCLIENT_ONLY)
target_link_libraries(KyuNet PRIVATE ${KYUII_ENGINE_LIBS} ${KYUII_CLIENT_LIBS} KyuII::GameAPI)
install(TARGETS KyuNet RUNTIME DESTINATION kyuii)
nx_add_runtime_executable(KyuNet)
endif()
nx_get_runtime_dependencies()
nx_scope_project()

103
ctf/CMakeLists.txt Normal file
View File

@ -0,0 +1,103 @@
# -------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © 2021 Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -------------------------------
cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
project(
KyuII-GameCTF
VERSION 3.21
LANGUAGES C)
if(NOT TARGET KyuII::Shared)
message(FATAL_ERROR "${PROJECT_NAME}: No Shared Functions Found")
endif()
if(NOT TARGET KyuII::GameAPI)
message(FATAL_ERROR "${PROJECT_NAME}: No GameAPI Functions Found")
endif()
set(CMAKE_SHARED_MODULE_PREFIX "")
if(NOT DEFINED KYUII_BUILD_GAMECTF)
option(KYUII_BUILD_GAMECTF "Build CTF Game Module" ON)
endif()
if(NOT DEFINED KYUII_USE_DYNAMIC_GAME)
option(KYUII_USE_DYNAMIC_GAME "Use Dynamic Game Modules" ON)
endif()
set(KYUII_GAMECTF_SOURCE
"${CMAKE_CURRENT_SOURCE_DIR}/g_ai.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_chase.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_cmds.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_combat.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_ctf.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_func.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_items.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_main.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_misc.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_monster.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_phys.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_save.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_spawn.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_svcmds.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_target.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_trigger.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_utils.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_weapon.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_move.c"
"${CMAKE_CURRENT_SOURCE_DIR}/p_client.c"
"${CMAKE_CURRENT_SOURCE_DIR}/p_hud.c"
"${CMAKE_CURRENT_SOURCE_DIR}/p_menu.c"
"${CMAKE_CURRENT_SOURCE_DIR}/p_trail.c"
"${CMAKE_CURRENT_SOURCE_DIR}/p_view.c"
"${CMAKE_CURRENT_SOURCE_DIR}/p_weapon.c")
set(KYUII_GAMECTF_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/g_ctf.h" "${CMAKE_CURRENT_SOURCE_DIR}/g_local.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_player.h" "${CMAKE_CURRENT_SOURCE_DIR}/p_menu.h")
if(NOT DEFINED KYUII_GAME_MODULE_NAME)
if(WIN32)
set(KYUII_GAME_MODULE_NAME "gamex86")
elseif(UNIX)
set(KYUII_GAME_MODULE_NAME "gamei386")
else()
set(KYUII_GAME_MODULE_NAME "game")
endif()
endif()
if(KYUII_BUILD_GAMECTF)
if(KYUII_USE_DYNAMIC_GAME)
add_library(GameCTF MODULE ${KYUII_GAMECTF_SOURCE})
set_target_properties(GameCTF PROPERTIES DEFINE_SYMBOL GAMEAPI_EXPORTS OUTPUT_NAME ${KYUII_GAME_MODULE_NAME})
target_compile_definitions(GameCTF PRIVATE GAMEVERSION="${PROJECT_NAME}-${PROJECT_VERSION}")
target_link_libraries(GameCTF PRIVATE KyuII::GameAPI)
install(
TARGETS GameCTF
RUNTIME DESTINATION kyuii/ctf
LIBRARY DESTINATION kyuii/ctf)
nx_add_runtime_library(GameCTF)
endif()
add_library(GameCTF_HL INTERFACE)
target_compile_definitions(GameCTF_HL INTERFACE GAME_HARD_LINKED GAMEVERSION="${PROJECT_NAME}-${PROJECT_VERSION}")
target_link_libraries(GameCTF_HL INTERFACE KyuII::GameAPI)
target_sources(GameCTF_HL INTERFACE ${KYUII_GAMECTF_SOURCE})
if(NOT TARGET KyuII::GameHL)
add_library(KyuII::GameHL ALIAS GameCTF_HL)
endif()
endif()
nx_scope_project()

151
game/CMakeLists.txt Normal file
View File

@ -0,0 +1,151 @@
# -------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © 2021 Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -------------------------------
cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
project(
KyuII-GameQ2
VERSION 3.21
LANGUAGES C)
if(NOT TARGET KyuII::Shared)
message(FATAL_ERROR "${PROJECT_NAME}: No Shared Functions Found")
endif()
if(NOT TARGET KyuII::GameAPI)
message(FATAL_ERROR "${PROJECT_NAME}: No GameAPI Functions Found")
endif()
set(CMAKE_SHARED_MODULE_PREFIX "")
if(NOT DEFINED KYUII_BUILD_GAMEQ2)
option(KYUII_BUILD_GAMEQ2 "Build Quake II Game Module" ON)
endif()
if(NOT DEFINED KYUII_USE_DYNAMIC_GAME)
option(KYUII_USE_DYNAMIC_GAME "Use Dynamic Game Modules" ON)
endif()
set(KYUII_GAMEQ2_SOURCE
"${CMAKE_CURRENT_SOURCE_DIR}/g_ai.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_chase.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_cmds.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_combat.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_func.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_items.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_main.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_misc.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_monster.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_phys.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_save.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_spawn.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_svcmds.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_target.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_trigger.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_turret.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_utils.c"
"${CMAKE_CURRENT_SOURCE_DIR}/g_weapon.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_actor.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_berserk.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_boss2.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_boss3.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_boss31.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_boss32.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_brain.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_chick.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_flipper.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_float.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_flyer.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_gladiator.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_gunner.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_hover.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_infantry.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_insane.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_medic.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_move.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_mutant.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_parasite.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_soldier.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_supertank.c"
"${CMAKE_CURRENT_SOURCE_DIR}/m_tank.c"
"${CMAKE_CURRENT_SOURCE_DIR}/p_client.c"
"${CMAKE_CURRENT_SOURCE_DIR}/p_hud.c"
"${CMAKE_CURRENT_SOURCE_DIR}/p_trail.c"
"${CMAKE_CURRENT_SOURCE_DIR}/p_view.c"
"${CMAKE_CURRENT_SOURCE_DIR}/p_weapon.c")
set(KYUII_GAMEQ2_HEADER
"${CMAKE_CURRENT_SOURCE_DIR}/g_local.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_actor.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_berserk.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_boss2.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_boss31.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_boss32.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_brain.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_chick.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_flipper.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_float.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_flyer.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_gladiator.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_gunner.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_hover.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_infantry.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_insane.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_medic.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_mutant.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_parasite.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_player.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_rider.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_soldier.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_supertank.h"
"${CMAKE_CURRENT_SOURCE_DIR}/m_tank.h")
if(NOT DEFINED KYUII_GAME_MODULE_NAME)
if(WIN32)
set(KYUII_GAME_MODULE_NAME "gamex86")
elseif(UNIX)
set(KYUII_GAME_MODULE_NAME "gamei386")
else()
set(KYUII_GAME_MODULE_NAME "game")
endif()
endif()
if(KYUII_BUILD_GAMEQ2)
if(KYUII_USE_DYNAMIC_GAME)
add_library(GameQ2 MODULE ${KYUII_GAMEQ2_SOURCE})
set_target_properties(
GameQ2
PROPERTIES DEFINE_SYMBOL GAMEAPI_EXPORTS
OUTPUT_NAME ${KYUII_GAME_MODULE_NAME}
VERSION ${PROJECT_VERSION})
target_compile_definitions(GameQ2 PRIVATE GAMEVERSION="${PROJECT_NAME}-${PROJECT_VERSION}")
target_link_libraries(GameQ2 PRIVATE KyuII::GameAPI)
install(
TARGETS GameQ2
RUNTIME DESTINATION kyuii/baseq2
LIBRARY DESTINATION kyuii/baseq2)
nx_add_runtime_library(GameQ2)
endif()
add_library(GameQ2_HL INTERFACE)
target_compile_definitions(GameQ2_HL INTERFACE GAME_HARD_LINKED GAMEVERSION="${PROJECT_NAME}-${PROJECT_VERSION}")
target_link_libraries(GameQ2_HL INTERFACE KyuII::GameAPI)
target_sources(GameQ2_HL INTERFACE ${KYUII_GAMEQ2_SOURCE})
if(NOT TARGET KyuII::GameHL)
add_library(KyuII::GameHL ALIAS GameQ2_HL)
endif()
endif()
nx_scope_project()

91
ref_gl/CMakeLists.txt Normal file
View File

@ -0,0 +1,91 @@
# -------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © 2021 Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -------------------------------
cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
project(
KyuII-RefGL
VERSION 3.21
LANGUAGES C)
if(NOT TARGET KyuII::Shared)
message(FATAL_ERROR "${PROJECT_NAME}: No Shared Functions Found")
endif()
if(NOT TARGET KyuII::RefAPI)
message(FATAL_ERROR "${PROJECT_NAME}: No RefAPI Functions Found")
endif()
set(CMAKE_SHARED_MODULE_PREFIX "")
if(NOT DEFINED KYUII_BUILD_REFGL)
option(KYUII_BUILD_REFGL "Build OpenGL Refresh Module" ON)
endif()
if(NOT DEFINED KYUII_USE_DYNAMIC_REFRESH)
option(KYUII_USE_DYNAMIC_REFRESH "Use Dynamic Refresh Modules" ON)
endif()
set(KYUII_REFGL_SOURCE
"${CMAKE_CURRENT_SOURCE_DIR}/gl_draw.c"
"${CMAKE_CURRENT_SOURCE_DIR}/gl_image.c"
"${CMAKE_CURRENT_SOURCE_DIR}/gl_light.c"
"${CMAKE_CURRENT_SOURCE_DIR}/gl_mesh.c"
"${CMAKE_CURRENT_SOURCE_DIR}/gl_model.c"
"${CMAKE_CURRENT_SOURCE_DIR}/gl_rmain.c"
"${CMAKE_CURRENT_SOURCE_DIR}/gl_rmisc.c"
"${CMAKE_CURRENT_SOURCE_DIR}/gl_rsurf.c"
"${CMAKE_CURRENT_SOURCE_DIR}/gl_warp.c")
set(KYUII_REFGL_HEADER
"${CMAKE_CURRENT_SOURCE_DIR}/anorms.h" "${CMAKE_CURRENT_SOURCE_DIR}/anormtab.h" "${CMAKE_CURRENT_SOURCE_DIR}/gl_local.h"
"${CMAKE_CURRENT_SOURCE_DIR}/gl_model.h" "${CMAKE_CURRENT_SOURCE_DIR}/qgl.h" "${CMAKE_CURRENT_SOURCE_DIR}/warpsin.h")
if(WIN32)
list(APPEND KYUII_REFGL_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/../win32/glw_imp.c" "${CMAKE_CURRENT_SOURCE_DIR}/../win32/qgl_win.c")
list(APPEND KYUII_REFGL_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/../win32/glw_win.h")
elseif(UNIX)
list(APPEND KYUII_REFGL_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/../linux/gl_glx.c" "${CMAKE_CURRENT_SOURCE_DIR}/../linux/qgl_linux.c")
list(APPEND KYUII_REFGL_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/../linux/glw_linux.h")
list(APPEND KYUII_REFGL_LIBS Xxf86vm Xxf86dga Xext X11)
endif()
if(NOT DEFINED KYUII_REFGL_MODULE_NAME)
if(UNIX AND NOT WIN32)
set(KYUII_REFGL_MODULE_NAME "ref_glx")
else()
set(KYUII_REFGL_MODULE_NAME "ref_gl")
endif()
endif()
if(KYUII_BUILD_REFGL)
if(KYUII_USE_DYNAMIC_REFRESH)
add_library(RefGL MODULE ${KYUII_REFGL_SOURCE})
set_target_properties(RefGL PROPERTIES DEFINE_SYMBOL REFAPI_EXPORTS OUTPUT_NAME ${KYUII_REFGL_MODULE_NAME})
target_link_libraries(RefGL PRIVATE KyuII::RefAPI ${KYUII_REFGL_LIBS} ${CMAKE_DL_LIBS})
install(
TARGETS RefGL
RUNTIME DESTINATION kyuii
LIBRARY DESTINATION kyuii)
nx_add_runtime_library(RefGL)
elseif(NOT TARGET KyuII::RefHL)
add_library(RefHL INTERFACE)
target_compile_definitions(RefHL INTERFACE REF_HARD_LINKED)
target_link_libraries(RefHL INTERFACE KyuII::RefAPI ${KYUII_REFGL_LIBS} ${CMAKE_DL_LIBS})
target_sources(RefHL INTERFACE ${KYUII_REFGL_SOURCE})
add_library(KyuII::RefHL ALIAS RefHL)
endif()
endif()
nx_scope_project()

105
ref_soft/CMakeLists.txt Normal file
View File

@ -0,0 +1,105 @@
# -------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © 2021 Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -------------------------------
cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
project(
KyuII-RefSoft
VERSION 3.21
LANGUAGES C)
if(NOT TARGET KyuII::Shared)
message(FATAL_ERROR "${PROJECT_NAME}: No Shared Functions Found")
endif()
if(NOT TARGET KyuII::RefAPI)
message(FATAL_ERROR "${PROJECT_NAME}: No RefAPI Functions Found")
endif()
set(CMAKE_SHARED_MODULE_PREFIX "")
if(NOT DEFINED KYUII_BUILD_REFSOFT)
option(KYUII_BUILD_REFSOFT "Build Software Refresh Module" ON)
endif()
if(NOT DEFINED KYUII_USE_DYNAMIC_REFRESH)
option(KYUII_USE_DYNAMIC_REFRESH "Use Dynamic Refresh Modules" ON)
endif()
set(KYUII_REFSOFT_SOURCE
"${CMAKE_CURRENT_SOURCE_DIR}/r_aclip.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_alias.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_bsp.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_draw.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_edge.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_image.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_light.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_main.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_misc.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_model.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_part.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_poly.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_polyse.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_rast.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_scan.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_sprite.c"
"${CMAKE_CURRENT_SOURCE_DIR}/r_surf.c")
set(KYUII_REFSOFT_HEADER
"${CMAKE_CURRENT_SOURCE_DIR}/adivtab.h"
"${CMAKE_CURRENT_SOURCE_DIR}/anorms.h"
"${CMAKE_CURRENT_SOURCE_DIR}/asm_draw.h"
"${CMAKE_CURRENT_SOURCE_DIR}/d_ifacea.h"
"${CMAKE_CURRENT_SOURCE_DIR}/r_local.h"
"${CMAKE_CURRENT_SOURCE_DIR}/r_model.h"
"${CMAKE_CURRENT_SOURCE_DIR}/rand1k.h")
if(WIN32)
list(APPEND KYUII_REFSOFT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/../win32/rw_ddraw.c" "${CMAKE_CURRENT_SOURCE_DIR}/../win32/rw_dib.c"
"${CMAKE_CURRENT_SOURCE_DIR}/../win32/rw_imp.c")
list(APPEND KYUII_REFSOFT_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/../win32/rw_win.h")
elseif(UNIX)
list(APPEND KYUII_REFSOFT_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/../linux/rw_x11.c")
list(APPEND KYUII_REFSOFT_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/../linux/rw_linux.h")
list(APPEND KYUII_REFSOFT_LIBS Xxf86dga Xext X11)
endif()
if(NOT DEFINED KYUII_REFSOFT_MODULE_NAME)
if(UNIX AND NOT WIN32)
set(KYUII_REFSOFT_MODULE_NAME "ref_softx")
else()
set(KYUII_REFSOFT_MODULE_NAME "ref_soft")
endif()
endif()
if(KYUII_BUILD_REFSOFT)
if(KYUII_USE_DYNAMIC_REFRESH)
add_library(RefSoft MODULE ${KYUII_REFSOFT_SOURCE})
set_target_properties(RefSoft PROPERTIES DEFINE_SYMBOL REFAPI_EXPORTS OUTPUT_NAME ${KYUII_REFSOFT_MODULE_NAME})
target_link_libraries(RefSoft PRIVATE KyuII::RefAPI ${KYUII_REFSOFT_LIBS})
install(
TARGETS RefSoft
RUNTIME DESTINATION kyuii
LIBRARY DESTINATION kyuii)
nx_add_runtime_library(RefSoft)
elseif(NOT TARGET KyuII::RefHL)
add_library(RefHL INTERFACE)
target_compile_definitions(RefHL INTERFACE REF_HARD_LINKED)
target_link_libraries(RefHL INTERFACE KyuII::RefAPI ${KYUII_REFSOFT_LIBS})
target_sources(RefHL INTERFACE ${KYUII_REFSOFT_SOURCE})
add_library(KyuII::RefHL ALIAS RefHL)
endif()
endif()
nx_scope_project()

154
tools/GitWatch.cmake Normal file
View File

@ -0,0 +1,154 @@
# -------------------------------
# SPDX-License-Identifier: MIT
#
# Copyright © 2020 Andrew Hardin
# Copyright © 2021 Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the “Software”), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# -------------------------------
# -------------------------------
# Adapted from Andrew Hardin's cmake-git-version-tracking script. https://github.com/andrew-hardin/cmake-git-version-tracking
# -------------------------------
if(NOT DEFINED GIT_EXECUTABLE)
find_program(GIT_EXECUTABLE NAMES git)
endif()
set(NX_GITWATCH_FILE "${CMAKE_CURRENT_LIST_FILE}")
set(NX_GITWATCH_VARS "GIT_RETRIEVED_STATE" "GIT_BRANCH_NAME" "GIT_COMMIT_HASH" "GIT_IS_DIRTY" "GIT_COMMIT_DATE" "GIT_COMMIT_TIME")
macro(_nx_git_command)
set(nGitResult 255)
set(sGitOutput "")
if(GIT_EXECUTABLE)
execute_process(
COMMAND "${GIT_EXECUTABLE}" ${ARGV}
WORKING_DIRECTORY "${sWorkingDirectory}"
RESULT_VARIABLE nGitResult
OUTPUT_VARIABLE sGitOutput
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
if(NOT nGitResult EQUAL 0)
set(ENV{GIT_RETRIEVED_STATE} "false")
endif()
endmacro()
function(nx_git_update sWorkingDirectory)
set(ENV{GIT_RETRIEVED_STATE} "true")
_nx_git_command(rev-parse --abbrev-ref HEAD)
if(NOT nGitResult EQUAL 0 OR sGitOutput STREQUAL "")
set(ENV{GIT_BRANCH_NAME} "unknown")
else()
set(ENV{GIT_BRANCH_NAME} "${sGitOutput}")
endif()
_nx_git_command(log -1 --format=%h)
if(NOT nGitResult EQUAL 0 OR sGitOutput STREQUAL "")
set(ENV{GIT_COMMIT_HASH} "unknown")
else()
set(ENV{GIT_COMMIT_HASH} "${sGitOutput}")
endif()
_nx_git_command(log -1 --format=%cd --date=format:%Y%m%d)
if(NOT nGitResult EQUAL 0 OR sGitOutput STREQUAL "")
set(ENV{GIT_COMMIT_DATE} "unknown")
else()
set(ENV{GIT_COMMIT_DATE} "${sGitOutput}")
endif()
_nx_git_command(log -1 --format=%cd --date=format:%H%M%S)
if(NOT nGitResult EQUAL 0 OR sGitOutput STREQUAL "")
set(ENV{GIT_COMMIT_TIME} "unknown")
else()
set(ENV{GIT_COMMIT_TIME} "${sGitOutput}")
endif()
_nx_git_command(status --porcelain -uno)
if(NOT nGitResult EQUAL 0 OR sGitOutput STREQUAL "")
set(ENV{GIT_IS_DIRTY} "false")
else()
set(ENV{GIT_IS_DIRTY} "true")
endif()
endfunction()
function(nx_git_watcher)
if(NOT DEFINED _NX_GIT_INTERNAL)
return()
endif()
nx_git_update("${NX_GIT_SOURCE_DIR}")
if(EXISTS "${NX_GIT_FILE_INPUT}")
file(READ "${NX_GIT_FILE_INPUT}" sGitInput)
string(SHA256 sGitState "${sGitInput}")
endif()
foreach(vGitWatch ${NX_GITWATCH_VARS})
string(SHA256 sGitState "${sGitState}$ENV{${vGitWatch}}")
endforeach()
set(bGitChanged ON)
if(EXISTS "${NX_GIT_FILE_STATE}")
file(READ "${NX_GIT_FILE_STATE}" sGitPrevious)
if(sGitPrevious STREQUAL "${sGitState}")
set(bGitChanged OFF)
endif()
endif()
if(bGitChanged)
file(WRITE "${NX_GIT_FILE_STATE}" "${sGitState}")
endif()
if(bGitChanged OR NOT EXISTS "${NX_GIT_FILE_OUTPUT}")
foreach(vGitWatch ${NX_GITWATCH_VARS})
set(NX_${vGitWatch} $ENV{${vGitWatch}})
endforeach()
configure_file("${NX_GIT_FILE_INPUT}" "${NX_GIT_FILE_OUTPUT}")
endif()
endfunction()
function(nx_git_check)
nx_git_update("${CMAKE_CURRENT_SOURCE_DIR}")
foreach(vGitWatch ${NX_GITWATCH_VARS})
set(NX_${vGitWatch}
$ENV{${vGitWatch}}
PARENT_SCOPE)
endforeach()
endfunction()
function(nx_git_configure sGitInput sGitOutput)
get_filename_component(sGitTarget "${sGitInput}" NAME)
string(MAKE_C_IDENTIFIER "${sGitTarget}" sGitTarget)
add_custom_target(
${sGitTarget} ALL
BYPRODUCTS "${sGitOutput}"
DEPENDS "${sGitInput}"
COMMENT "[GitWatcher] Retrieving Git State"
COMMAND
${CMAKE_COMMAND} -D_NX_GIT_INTERNAL=ON -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DNX_GIT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
-DNX_GIT_FILE_INPUT=${sGitInput} -DNX_GIT_FILE_OUTPUT="${sGitOutput}"
-DNX_GIT_FILE_STATE="${CMAKE_CURRENT_BINARY_DIR}/git.state" -P "${NX_GITWATCH_FILE}")
configure_file("${sGitInput}" "${sGitOutput}")
endfunction()
nx_git_watcher()

View File

@ -0,0 +1,144 @@
# -------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © 2021 Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -------------------------------
include(NXIncludeGuard)
include(NXScopePropagate)
nx_include_guard()
# ===================================================================
set(NXGenerateExportHeader_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}")
function(nx_generate_export_header sBaseName)
nx_scope_initialize()
string(TOUPPER "${sBaseName}" sBaseName)
string(MAKE_C_IDENTIFIER "${sBaseName}" sBaseName)
list(APPEND _NX_PROPAGATE_LOCAL "${sBaseName}_SHARED_DEFINE" "${sBaseName}_STATIC_DEFINE")
set(GEH_BASE_NAME ${sBaseName})
set(GEH_DEFINE_NO_DEPRECATED 0)
unset(GEH_CUSTOM_CONTENT)
unset(GEH_CUSTOM_CONTENT_FROM_VARIABLE)
unset(GEH_DEPRECATED_MACRO_NAME)
unset(GEH_EXPORT_FILE_NAME)
unset(GEH_EXPORT_MACRO_NAME)
unset(GEH_EXPORT_MACRO_CNAME)
unset(GEH_INCLUDE_GUARD_NAME)
unset(GEH_NO_DEPRECATED_MACRO_NAME)
unset(GEH_NO_EXPORT_MACRO_NAME)
unset(GEH_PREFIX_NAME)
unset(GEH_STATIC_DEFINE)
unset(GEH_DEFINE_SYMBOL)
set(lsParseModes
BASE_NAME
EXPORT_MACRO_NAME
EXPORT_MACRO_CNAME
EXPORT_FILE_NAME
DEPRECATED_MACRO_NAME
NO_EXPORT_MACRO_NAME
INCLUDE_GUARD_NAME
STATIC_DEFINE
NO_DEPRECATED_MACRO_NAME
PREFIX_NAME
CUSTOM_CONTENT_FROM_VARIABLE
DEFINE_SYMBOL)
set(lsParseToggles DEFINE_NO_DEPRECATED)
set(sParseMode "EXPORT_FILE_NAME")
foreach(sArgument ${ARGN})
if("${sArgument}" IN_LIST lsParseModes)
set(sParseMode "${sArgument}")
elseif("${sArgument}" IN_LIST lsParseToggles)
set(GEH_${sArgument} 1)
else()
set(GEH_${sParseMode} "${sArgument}")
endif()
endforeach()
if(NOT DEFINED GEH_EXPORT_FILE_NAME)
string(TOLOWER "${GEH_BASE_NAME}_export.h" GEH_EXPORT_FILE_NAME)
endif()
if(NOT DEFINED GEH_INCLUDE_GUARD_NAME)
get_filename_component(GEH_INCLUDE_GUARD_NAME "${GEH_EXPORT_FILE_NAME}" NAME)
string(TOUPPER "${CMAKE_PROJECT_NAME}" GEH_INCLUDE_GUARD_PREFIX)
string(TOUPPER "${GEH_INCLUDE_GUARD_NAME}" GEH_INCLUDE_GUARD_NAME)
if(NOT GEH_INCLUDE_GUARD_NAME MATCHES "^${GEH_INCLUDE_GUARD_PREFIX}")
set(GEH_INCLUDE_GUARD_NAME "${GEH_INCLUDE_GUARD_PREFIX}_${GEH_INCLUDE_GUARD_NAME}")
endif()
string(MAKE_C_IDENTIFIER "${GEH_INCLUDE_GUARD_NAME}" GEH_INCLUDE_GUARD_NAME)
set(GEH_INCLUDE_GUARD_NAME "${GEH_PREFIX_NAME}${GEH_INCLUDE_GUARD_NAME}")
endif()
if(NOT DEFINED GEH_STATIC_DEFINE)
if(DEFINED ${sBaseName}_STATIC_DEFINE)
set(GEH_STATIC_DEFINE "${${sBaseName}_STATIC_DEFINE}")
else()
set(GEH_STATIC_DEFINE "${GEH_PREFIX_NAME}${GEH_BASE_NAME}_STATIC_DEFINE")
endif()
endif()
if(NOT DEFINED ${sBaseName}_STATIC_DEFINE)
set(${sBaseName}_STATIC_DEFINE "${GEH_STATIC_DEFINE}")
endif()
if(NOT DEFINED GEH_DEFINE_SYMBOL)
if(DEFINED ${sBaseName}_SHARED_DEFINE)
set(GEH_DEFINE_SYMBOL "${${sBaseName}_SHARED_DEFINE}")
else()
set(GEH_DEFINE_SYMBOL "${GEH_PREFIX_NAME}${GEH_BASE_NAME}_EXPORTS")
endif()
endif()
if(NOT DEFINED ${sBaseName}_SHARED_DEFINE)
set(${sBaseName}_SHARED_DEFINE "${GEH_DEFINE_SYMBOL}")
endif()
if(NOT DEFINED GEH_EXPORT_MACRO_NAME)
set(GEH_EXPORT_MACRO_NAME "${GEH_PREFIX_NAME}${GEH_BASE_NAME}_EXPORT")
endif()
if(NOT DEFINED GEH_EXPORT_MACRO_CNAME)
set(GEH_EXPORT_MACRO_CNAME "${GEH_PREFIX_NAME}${GEH_BASE_NAME}_CEXPORT")
endif()
if(NOT DEFINED GEH_NO_EXPORT_MACRO_NAME)
set(GEH_NO_EXPORT_MACRO_NAME "${GEH_PREFIX_NAME}${GEH_BASE_NAME}_NO_EXPORT")
endif()
if(NOT DEFINED GEH_DEPRECATED_MACRO_NAME)
set(GEH_DEPRECATED_MACRO_NAME "${GEH_PREFIX_NAME}${GEH_BASE_NAME}_DEPRECATED")
endif()
if(NOT DEFINED GEH_NO_DEPRECATED_MACRO_NAME)
set(GEH_NO_DEPRECATED_MACRO_NAME "${GEH_PREFIX_NAME}${GEH_BASE_NAME}_NO_DEPRECATED")
endif()
if(DEFINED GEH_CUSTOM_CONTENT_FROM_VARIABLE)
if(DEFINED ${GEH_CUSTOM_CONTENT_FROM_VARIABLE})
set(GEH_CUSTOM_CONTENT "${${GEH_CUSTOM_CONTENT_FROM_VARIABLE}}")
endif()
endif()
if(NOT DEFINED _CURRENT_YEAR)
string(TIMESTAMP _CURRENT_YEAR "%Y")
string(TIMESTAMP _CURRENT_DATE "%Y%m%d")
endif()
configure_file("${NXGenerateExportHeader_DIRECTORY}/NXGenerateExportHeader.configure" "${GEH_EXPORT_FILE_NAME}")
nx_scope_propagate()
endfunction()

View File

@ -0,0 +1,84 @@
/*-------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © @_CURRENT_YEAR@ Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -----------------------------*/
#ifndef @GEH_INCLUDE_GUARD_NAME@
#define @GEH_INCLUDE_GUARD_NAME@
#ifndef @GEH_STATIC_DEFINE@
# ifndef @GEH_EXPORT_MACRO_NAME@
# if defined( _WIN32 )
# ifdef @GEH_DEFINE_SYMBOL@
# define @GEH_EXPORT_MACRO_NAME@ __declspec( dllexport )
# else
# define @GEH_EXPORT_MACRO_NAME@ __declspec( dllimport )
# endif
# elif defined( __GNUC__ ) || defined( __clang__ )
# ifdef @GEH_DEFINE_SYMBOL@
# define @GEH_EXPORT_MACRO_NAME@ __attribute__( ( visibility( "default" ) ) )
# endif
# endif
# endif
# ifndef @GEH_NO_EXPORT_MACRO_NAME@
# if !defined( _WIN32 ) && ( defined( __GNUC__ ) || defined( __clang__ ) )
# ifdef @GEH_DEFINE_SYMBOL@
# define @GEH_NO_EXPORT_MACRO_NAME@ __attribute__( ( visibility( "hidden" ) ) )
# endif
# endif
# endif
#endif
#ifndef @GEH_EXPORT_MACRO_NAME@
# define @GEH_EXPORT_MACRO_NAME@
#endif
#ifndef @GEH_EXPORT_MACRO_CNAME@
# ifdef __cplusplus
# define @GEH_EXPORT_MACRO_CNAME@ extern "C" @GEH_EXPORT_MACRO_NAME@
# else
# define @GEH_EXPORT_MACRO_CNAME@ extern @GEH_EXPORT_MACRO_NAME@
# endif
#endif
#ifndef @GEH_NO_EXPORT_MACRO_NAME@
# define @GEH_NO_EXPORT_MACRO_NAME@
#endif
#ifndef @GEH_DEPRECATED_MACRO_NAME@
# if defined( __cplusplus ) && ( __cplusplus >= 201402L )
# define @GEH_DEPRECATED_MACRO_NAME@ [[deprecated]]
# define @GEH_DEPRECATED_MACRO_NAME@_MSG( msg ) [[deprecated( msg )]]
# elif defined( _MSC_VER )
# define @GEH_DEPRECATED_MACRO_NAME@ __declspec( deprecated )
# define @GEH_DEPRECATED_MACRO_NAME@_MSG( msg ) __declspec( deprecated( msg ) )
# elif defined( __GNUC__ ) || defined( __clang__ )
# define @GEH_DEPRECATED_MACRO_NAME@ __attribute__( ( __deprecated__ ) )
# define @GEH_DEPRECATED_MACRO_NAME@_MSG( msg ) __attribute__( ( __deprecated__( msg ) ) )
# elif defined( __cplusplus ) && ( __cplusplus >= 201103L )
# define @GEH_DEPRECATED_MACRO_NAME@ [[deprecated]]
# define @GEH_DEPRECATED_MACRO_NAME@_MSG( msg ) [[deprecated( msg )]]
# else
# define @GEH_DEPRECATED_MACRO_NAME@
# define @GEH_DEPRECATED_MACRO_NAME@_MSG( msg )
# endif
#endif
#if @GEH_DEFINE_NO_DEPRECATED@ /* DEFINE_NO_DEPRECATED */
# ifndef @GEH_NO_DEPRECATED_MACRO_NAME@
# define @GEH_NO_DEPRECATED_MACRO_NAME@
# endif
#endif
@GEH_CUSTOM_CONTENT@
#endif

View File

@ -0,0 +1,133 @@
# -------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © 2021 Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -------------------------------
include(NXIncludeGuard)
include(NXScopePropagate)
nx_include_guard()
# ===================================================================
set(NXGenerateVersionHeader_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}")
function(nx_generate_version_header sBaseName)
nx_scope_initialize()
if(DEFINED ${sBaseName}_VERSION)
set(GVH_VERSION ${${sBaseName}_VERSION})
elseif(DEFINED PROJECT_VERSION)
set(GVH_VERSION ${PROJECT_VERSION})
else()
set(GVH_VERSION "0.0.0")
endif()
string(REPLACE "." ";" lsVersionComponents "${GVH_VERSION}")
list(LENGTH lsVersionComponents nVersionComponents)
if(nVersionComponents GREATER 0 AND NOT DEFINED sProjectAPIMAJOR)
list(GET lsVersionComponents 0 GVH_VERSION_MAJOR)
else()
set(GVH_VERSION_MAJOR 0)
endif()
if(nVersionComponents GREATER 1 AND NOT DEFINED sProjectAPIMINOR)
list(GET lsVersionComponents 1 GVH_VERSION_MINOR)
else()
set(GVH_VERSION_MINOR 0)
endif()
if(nVersionComponents GREATER 2 AND NOT DEFINED sProjectAPIPATCH)
list(GET lsVersionComponents 2 GVH_VERSION_PATCH)
else()
set(GVH_VERSION_PATCH 0)
endif()
set(GVH_VERSION_HEX "${GVH_VERSION_MAJOR}*65536 + ${GVH_VERSION_MINOR}*256 + ${GVH_VERSION_PATCH}")
if(CMAKE_VERSION VERSION_LESS 3.13)
math(EXPR GVH_VERSION_HEX "${GVH_VERSION_HEX}")
else()
math(EXPR GVH_VERSION_HEX "${GVH_VERSION_HEX}" OUTPUT_FORMAT HEXADECIMAL)
endif()
string(TOUPPER "${sBaseName}" sBaseName)
string(MAKE_C_IDENTIFIER "${sBaseName}" sBaseName)
set(GVH_BASE_NAME ${sBaseName})
set(GVH_QUERY_GIT 0)
unset(GVH_CUSTOM_CONTENT)
unset(GVH_CUSTOM_CONTENT_FROM_VARIABLE)
unset(GVH_INCLUDE_GUARD_NAME)
unset(GVH_PREFIX_NAME)
unset(GVH_VERSION_FILE_NAME)
unset(GVH_VERSION_MACRO_NAME)
set(lsParseModes BASE_NAME VERSION_MACRO_NAME VERSION_FILE_NAME INCLUDE_GUARD_NAME PREFIX_NAME CUSTOM_CONTENT_FROM_VARIABLE)
set(lsParseToggles QUERY_GIT)
set(sParseMode "VERSION_FILE_NAME")
foreach(sArgument ${ARGN})
if("${sArgument}" IN_LIST lsParseModes)
set(sParseMode "${sArgument}")
elseif("${sArgument}" IN_LIST lsParseToggles)
set(GVH_${sArgument} 1)
else()
set(GVH_${sParseMode} "${sArgument}")
endif()
endforeach()
if(NOT DEFINED GVH_VERSION_FILE_NAME)
string(TOLOWER "${GVH_BASE_NAME}_version.h" GVH_VERSION_FILE_NAME)
endif()
if(NOT DEFINED GVH_INCLUDE_GUARD_NAME)
get_filename_component(GVH_INCLUDE_GUARD_NAME "${GVH_VERSION_FILE_NAME}" NAME)
string(TOUPPER "${CMAKE_PROJECT_NAME}" GVH_INCLUDE_GUARD_PREFIX)
string(TOUPPER "${GVH_INCLUDE_GUARD_NAME}" GVH_INCLUDE_GUARD_NAME)
if(NOT GVH_INCLUDE_GUARD_NAME MATCHES "^${GVH_INCLUDE_GUARD_PREFIX}")
set(GVH_INCLUDE_GUARD_NAME "${GVH_INCLUDE_GUARD_PREFIX}_${GVH_INCLUDE_GUARD_NAME}")
endif()
string(MAKE_C_IDENTIFIER "${GVH_INCLUDE_GUARD_NAME}" GVH_INCLUDE_GUARD_NAME)
set(GVH_INCLUDE_GUARD_NAME "${GVH_PREFIX_NAME}${GVH_INCLUDE_GUARD_NAME}")
endif()
if(NOT DEFINED GVH_VERSION_MACRO_NAME)
set(GVH_VERSION_MACRO_NAME "${GVH_PREFIX_NAME}${GVH_BASE_NAME}_VERSION")
endif()
if(DEFINED GVH_CUSTOM_CONTENT_FROM_VARIABLE)
if(DEFINED ${GVH_CUSTOM_CONTENT_FROM_VARIABLE})
set(GVH_CUSTOM_CONTENT "${${GVH_CUSTOM_CONTENT_FROM_VARIABLE}}")
endif()
endif()
if(NOT DEFINED _CURRENT_YEAR)
string(TIMESTAMP _CURRENT_YEAR "%Y")
string(TIMESTAMP _CURRENT_DATE "%Y%m%d")
endif()
if(GVH_QUERY_GIT)
if(NOT DEFINED NX_GIT_WATCH_VARS)
include(GitWatch)
endif()
configure_file("${NXGenerateVersionHeader_DIRECTORY}/NXGenerateVersionHeaderGit.configure" "${GVH_VERSION_FILE_NAME}.configure"
@ONLY)
nx_git_configure("${CMAKE_CURRENT_BINARY_DIR}/${GVH_VERSION_FILE_NAME}.configure" "${GVH_VERSION_FILE_NAME}")
else()
configure_file("${NXGenerateVersionHeader_DIRECTORY}/NXGenerateVersionHeader.configure" "${GVH_VERSION_FILE_NAME}")
endif()
nx_scope_propagate()
endfunction()

View File

@ -0,0 +1,29 @@
/*-------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © @_CURRENT_YEAR@ Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -----------------------------*/
#ifndef @GVH_INCLUDE_GUARD_NAME@
#define @GVH_INCLUDE_GUARD_NAME@
#define @GVH_VERSION_MACRO_NAME@_MM @GVH_VERSION_MAJOR@.@GVH_VERSION_MINOR@
#define @GVH_VERSION_MACRO_NAME@_STRING "@GVH_VERSION@"
#define @GVH_VERSION_MACRO_NAME@_MAJOR @GVH_VERSION_MAJOR@
#define @GVH_VERSION_MACRO_NAME@_MINOR @GVH_VERSION_MINOR@
#define @GVH_VERSION_MACRO_NAME@_PATCH @GVH_VERSION_PATCH@
#define @GVH_VERSION_MACRO_NAME@ @GVH_VERSION_HEX@
@GVH_CUSTOM_CONTENT@
#endif

View File

@ -0,0 +1,44 @@
/*-------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © @_CURRENT_YEAR@ Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -----------------------------*/
#ifndef @GVH_INCLUDE_GUARD_NAME@
#define @GVH_INCLUDE_GUARD_NAME@
#define @GVH_VERSION_MACRO_NAME@_MM @GVH_VERSION_MAJOR@.@GVH_VERSION_MINOR@
#define @GVH_VERSION_MACRO_NAME@_STRING "@GVH_VERSION@"
#define @GVH_VERSION_MACRO_NAME@_MAJOR @GVH_VERSION_MAJOR@
#define @GVH_VERSION_MACRO_NAME@_MINOR @GVH_VERSION_MINOR@
#define @GVH_VERSION_MACRO_NAME@_PATCH @GVH_VERSION_PATCH@
#define @GVH_VERSION_MACRO_NAME@ @GVH_VERSION_HEX@
#ifdef NX_GIT_RETRIEVED_STATE
# undef NX_GIT_RETRIEVED_STATE
#endif
#@__placeholder__@cmakedefine NX_GIT_RETRIEVED_STATE
#ifdef NX_GIT_RETRIEVED_STATE
# define @GVH_VERSION_MACRO_NAME@_FULL "@GVH_VERSION@+git${NX_GIT_COMMIT_HASH}"
# define @GVH_VERSION_MACRO_NAME@_BRANCH "${NX_GIT_BRANCH_NAME}"
# define @GVH_VERSION_MACRO_NAME@_COMMIT "${NX_GIT_COMMIT_HASH}"
# define @GVH_VERSION_MACRO_NAME@_TIMESTAMP "${NX_GIT_COMMIT_DATE}${NX_GIT_COMMIT_TIME}"
# define @GVH_VERSION_MACRO_NAME@_DIRTY ${NX_GIT_IS_DIRTY}
#else
# define @GVH_VERSION_MACRO_NAME@_FULL "@GVH_VERSION@"
#endif
@GVH_CUSTOM_CONTENT@
#endif

View File

@ -0,0 +1,87 @@
# -------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © 2021 Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -------------------------------
include(NXIncludeGuard)
include(NXScopePropagate)
nx_include_guard()
# ===================================================================
set(NXGetRuntimeDependencies_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}")
function(nx_add_runtime_executable sTargetName)
nx_scope_initialize()
if(TARGET ${sTargetName})
list(APPEND _NX_PROPAGATE_GLOBAL "_NX_GATHER_EXECUTABLES")
list(APPEND _NX_PROPAGATE_SORT "_NX_GATHER_EXECUTABLES")
list(APPEND _NX_GATHER_EXECUTABLES "${sTargetName}")
endif()
nx_scope_propagate()
endfunction()
function(nx_add_runtime_library sTargetName)
nx_scope_initialize()
if(TARGET ${sTargetName})
list(APPEND _NX_PROPAGATE_GLOBAL "_NX_GATHER_LIBRARIES")
list(APPEND _NX_PROPAGATE_SORT "_NX_GATHER_LIBRARIES")
list(APPEND _NX_GATHER_LIBRARIES "${sTargetName}")
endif()
nx_scope_propagate()
endfunction()
function(nx_get_runtime_dependencies)
nx_scope_initialize()
if(WIN32 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.16")
unset(GRD_TARGET_LIST)
unset(GRD_SYSTEM_LIST)
if(DEFINED _NX_GATHER_EXECUTABLES)
set(GRD_TARGET_LIST "${GRD_TARGET_LIST}EXECUTABLES ")
foreach(sTargetName ${_NX_GATHER_EXECUTABLES})
set(GRD_TARGET_LIST "${GRD_TARGET_LIST}$<TARGET_FILE:${sTargetName}> ")
endforeach()
endif()
if(DEFINED _NX_GATHER_LIBRARIES)
set(GRD_TARGET_LIST "${GRD_TARGET_LIST}LIBRARIES ")
foreach(sTargetName ${_NX_GATHER_LIBRARIES})
set(GRD_TARGET_LIST "${GRD_TARGET_LIST}$<TARGET_FILE:${sTargetName}> ")
endforeach()
endif()
foreach(sPathName ${CMAKE_SYSTEM_LIBRARY_PATH} ${CMAKE_MINGW_SYSTEM_LIBRARY_PATH})
set(GRD_SYSTEM_LIST "${GRD_SYSTEM_LIST}\"${sPathName}\" ")
endforeach()
if(NOT DEFINED _CURRENT_YEAR)
string(TIMESTAMP _CURRENT_YEAR "%Y")
string(TIMESTAMP _CURRENT_DATE "%Y%m%d")
endif()
configure_file("${NXGetRuntimeDependencies_DIRECTORY}/NXGetRuntimeDependencies.configure" "_NXGetRuntimeDependencies.cmake" @ONLY)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_BINARY_DIR}")
include(_NXGetRuntimeDependencies)
endif()
nx_scope_propagate()
endfunction()

View File

@ -0,0 +1,36 @@
# -------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © @_CURRENT_YEAR@ Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -------------------------------
install(CODE [[
message(STATUS "Dependency Locations: @CMAKE_SYSTEM_LIBRARY_PATH@;@CMAKE_MINGW_SYSTEM_LIBRARY_PATH@;$ENV{MINGW_RUNTIME_PATH}")
file(GET_RUNTIME_DEPENDENCIES
RESOLVED_DEPENDENCIES_VAR _NX_DEPS_RESOLVED
UNRESOLVED_DEPENDENCIES_VAR _NX_DEPS_UNRESOLVED
@GRD_TARGET_LIST@
DIRECTORIES @GRD_SYSTEM_LIST@$ENV{MINGW_RUNTIME_PATH}
PRE_EXCLUDE_REGEXES "api-ms-.*" "ext-ms-.*"
POST_EXCLUDE_REGEXES ".*system32/.*\\.dll"
)
foreach(_dep ${_NX_DEPS_RESOLVED})
message(STATUS " [x] Resolved: ${_dep}")
file(INSTALL ${_dep} DESTINATION ${CMAKE_INSTALL_PREFIX}/kyuii)
endforeach()
foreach(_dep ${_NX_DEPS_UNRESOLVED})
message(STATUS " [ ] Not Found: ${_dep}")
endforeach()
]])

View File

@ -0,0 +1,44 @@
# -------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © 2021 Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -------------------------------
macro(nx_include_guard)
get_filename_component(vIncludeGuard "${CMAKE_CURRENT_LIST_FILE}" NAME)
string(TOUPPER "${vIncludeGuard}_INCLUDE_GUARD" vIncludeGuard)
string(MAKE_C_IDENTIFIER "${vIncludeGuard}" vIncludeGuard)
if(DEFINED ${vIncludeGuard})
return()
endif()
if(DEFINED _NX_SCOPE)
list(APPEND _NX_PROPAGATE_SET "${vIncludeGuard}")
endif()
set(${vIncludeGuard} ON)
endmacro()
macro(nx_function_guard sFunctionName)
string(TOUPPER "${sFunctionName}_FUNCTION_GUARD" vFunctionGuard)
string(MAKE_C_IDENTIFIER "${vFunctionGuard}" vFunctionGuard)
if(DEFINED ${vFunctionGuard})
return()
endif()
if(DEFINED _NX_SCOPE)
list(APPEND _NX_PROPAGATE_SET "${vFunctionGuard}")
endif()
set(${vFunctionGuard} ON)
endmacro()

View File

@ -0,0 +1,106 @@
# -------------------------------
# SPDX-License-Identifier: ISC
#
# Copyright © 2021 Daniel Wolf <<nephatrine@gmail.com>>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# -------------------------------
macro(nx_scope_initialize)
if(NOT DEFINED _NX_SCOPE)
set(_NX_SCOPE ON)
else()
set(_NX_PROPAGATE ON)
endif()
endmacro()
macro(nx_scope_propagate)
if(DEFINED _NX_PROPAGATE_SORT AND _NX_PROPAGATE_SORT)
list(REMOVE_DUPLICATES _NX_PROPAGATE_SORT)
endif()
foreach(vPropagate "_NX_PROPAGATE_RESET" "_NX_PROPAGATE_GLOBAL" "_NX_PROPAGATE_SET" "_NX_PROPAGATE_LOCAL" ${_NX_PROPAGATE_SORT})
if(DEFINED ${vPropagate} AND ${vPropagate})
list(SORT ${vPropagate})
list(REMOVE_DUPLICATES ${vPropagate})
endif()
endforeach()
foreach(vPropagate "_NX_PROPAGATE_RESET" "_NX_PROPAGATE_GLOBAL" "_NX_PROPAGATE_SORT" ${_NX_PROPAGATE_GLOBAL} ${_NX_PROPAGATE_SET}
${_NX_PROPAGATE_LOCAL})
if(DEFINED ${vPropagate})
set(${vPropagate}
"${${vPropagate}}"
PARENT_SCOPE)
else()
unset(${vPropagate} PARENT_SCOPE)
endif()
endforeach()
if(DEFINED _NX_PROPAGATE)
set(_NX_PROPAGATE_SET
"${_NX_PROPAGATE_SET}"
PARENT_SCOPE)
endif()
endmacro()
macro(nx_scope_project)
if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL "${CMAKE_SOURCE_DIR}")
foreach(vPropagate "_NX_PROPAGATE_RESET" "_NX_PROPAGATE_GLOBAL")
if(DEFINED ${vPropagate} AND ${vPropagate})
list(SORT ${vPropagate})
list(REMOVE_DUPLICATES ${vPropagate})
endif()
endforeach()
foreach(vPropagate "_NX_PROPAGATE_RESET" "_NX_PROPAGATE_GLOBAL" ${_NX_PROPAGATE_GLOBAL})
if(DEFINED ${vPropagate})
set(${vPropagate}
"${${vPropagate}}"
PARENT_SCOPE)
else()
unset(${vPropagate} PARENT_SCOPE)
endif()
endforeach()
endif()
endmacro()
function(nx_set_global vName sValue)
nx_scope_initialize()
list(APPEND _NX_PROPAGATE_GLOBAL "${vName}")
set(${vName} "${sValue}")
message(STATUS "SET: ${vName} to '${sValue}'")
nx_scope_propagate()
endfunction()
function(nx_append_global vName sValue)
nx_scope_initialize()
list(APPEND _NX_PROPAGATE_GLOBAL "${vName}")
list(APPEND _NX_PROPAGATE_SORT "${vName}")
list(APPEND ${vName} "${sValue}")
nx_scope_propagate()
endfunction()
function(nx_set_project vName sValue)
nx_scope_initialize()
list(APPEND _NX_PROPAGATE_SET "${vName}")
set(${vName} "${sValue}")
nx_scope_propagate()
endfunction()
function(nx_set_local vName sValue)
nx_scope_initialize()
list(APPEND _NX_PROPAGATE_LOCAL "${vName}")
set(${vName} "${sValue}")
nx_scope_propagate()
endfunction()