# Copyright (c) 2025 Dominic Masters # # This software is released under the MIT License. # https://opensource.org/licenses/MIT # Setup cmake_minimum_required(VERSION 3.18) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) option(ENABLE_TESTS "Enable tests" OFF) # Prep cache set(DUSK_CACHE_TARGET "dusk-target") # Build variables set(DUSK_ROOT_DIR "${CMAKE_SOURCE_DIR}") set(DUSK_BUILD_DIR "${CMAKE_BINARY_DIR}") set(DUSK_SOURCES_DIR "${DUSK_ROOT_DIR}/src") set(DUSK_TEST_DIR "${DUSK_ROOT_DIR}/test") set(DUSK_TEMP_DIR "${DUSK_BUILD_DIR}/temp") set(DUSK_TOOLS_DIR "${DUSK_ROOT_DIR}/tools") set(DUSK_DATA_DIR "${DUSK_ROOT_DIR}/data") set(DUSK_ASSETS_DIR "${DUSK_ROOT_DIR}/assets") set(DUSK_BUILT_ASSETS_DIR "${DUSK_BUILD_DIR}/built_assets" CACHE INTERNAL ${DUSK_CACHE_TARGET}) set(DUSK_GENERATED_HEADERS_DIR "${DUSK_BUILD_DIR}/generated") set(DUSK_BUILD_BINARY ${DUSK_BUILD_DIR}/Dusk CACHE INTERNAL ${DUSK_CACHE_TARGET}) set(DUSK_ASSETS "" CACHE INTERNAL ${DUSK_CACHE_TARGET}) set(DUSK_LIBRARY_TARGET_NAME "DuskCore" CACHE INTERNAL ${DUSK_CACHE_TARGET}) set(DUSK_BINARY_TARGET_NAME "Dusk" CACHE INTERNAL ${DUSK_CACHE_TARGET}) set(DUSK_ASSETS_ZIP "${DUSK_BUILD_DIR}/dusk.dsk" CACHE INTERNAL ${DUSK_CACHE_TARGET}) # Set default target system if(NOT DEFINED DUSK_TARGET_SYSTEM) set(DUSK_TARGET_SYSTEM "linux") endif() # Create directories file(MAKE_DIRECTORY ${DUSK_GENERATED_HEADERS_DIR}) file(MAKE_DIRECTORY ${DUSK_TEMP_DIR}) file(MAKE_DIRECTORY ${DUSK_BUILT_ASSETS_DIR}) # Required build packages find_package(Python3 COMPONENTS Interpreter REQUIRED) # Init Project. project(${DUSK_LIBRARY_TARGET_NAME} VERSION 1.0.0 LANGUAGES C ) # Either, create library and binary separately (used for tests), or make them # one in the same so all code is in the binary. if(ENABLE_TESTS) # MainLibrary add_library(${DUSK_LIBRARY_TARGET_NAME} STATIC) # Binary Executable add_executable(${DUSK_BINARY_TARGET_NAME} ${DUSK_SOURCES_DIR}/null.c) # Link library to binary target_link_libraries(${DUSK_BINARY_TARGET_NAME} PUBLIC ${DUSK_LIBRARY_TARGET_NAME} ) else() set(DUSK_LIBRARY_TARGET_NAME "${DUSK_BINARY_TARGET_NAME}" CACHE INTERNAL ${DUSK_CACHE_TARGET}) add_executable(${DUSK_BINARY_TARGET_NAME} ${DUSK_SOURCES_DIR}/null.c) endif() # Toolchains include(cmake/targets/${DUSK_TARGET_SYSTEM}.cmake) # Add tools add_subdirectory(tools) # Include generated headers from tools. target_include_directories(${DUSK_LIBRARY_TARGET_NAME} PUBLIC ${DUSK_GENERATED_HEADERS_DIR} ) # Add main code add_subdirectory(${DUSK_SOURCES_DIR}) # Include generated headers target_include_directories(${DUSK_LIBRARY_TARGET_NAME} PUBLIC ${DUSK_GENERATED_HEADERS_DIR} ) # Handle tests if(ENABLE_TESTS) enable_testing() add_subdirectory(test) endif() # Build assets file(GLOB_RECURSE DUSK_ASSET_FILES CONFIGURE_DEPENDS "${DUSK_ASSETS_DIR}/*") add_custom_command( OUTPUT "${DUSK_ASSETS_ZIP}" COMMAND ${CMAKE_COMMAND} -E make_directory "${DUSK_ASSETS_DIR}" COMMAND ${CMAKE_COMMAND} -E rm -f "${DUSK_ASSETS_ZIP}" COMMAND ${CMAKE_COMMAND} -E tar "cf" "${DUSK_ASSETS_ZIP}" --format=zip -- . WORKING_DIRECTORY "${DUSK_ASSETS_DIR}" DEPENDS ${DUSK_ASSET_FILES} VERBATIM ) add_custom_target(DUSK_ASSETS_BUILT DEPENDS "${DUSK_ASSETS_ZIP}") add_dependencies(${DUSK_LIBRARY_TARGET_NAME} DUSK_ASSETS_BUILT)