# Prevent in-source builds if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) message(FATAL_ERROR "In-source builds prohibited. Call CMake from a build/ directory.") endif() cmake_minimum_required(VERSION 3.28) set(APPLICATION_NAME "Antkeeper") set(APPLICATION_VERSION "0.0.1") set(APPLICATION_AUTHOR "C. J. Howard") # Slugify application name string(TOLOWER ${APPLICATION_NAME} APPLICATION_SLUG) string(REPLACE " " "-" APPLICATION_SLUG ${APPLICATION_SLUG}) # Create superbuild project project(${APPLICATION_SLUG}-superbuild VERSION ${APPLICATION_VERSION}) set(APPLICATION_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) set(APPLICATION_VERSION_MINOR ${PROJECT_VERSION_MINOR}) set(APPLICATION_VERSION_PATCH ${PROJECT_VERSION_PATCH}) # Setup package variables set(PACKAGE_NAME ${APPLICATION_NAME}) set(PACKAGE_VERSION ${APPLICATION_VERSION}) set(PACKAGE_VERSION_MAJOR ${APPLICATION_VERSION_MAJOR}) set(PACKAGE_VERSION_MINOR ${APPLICATION_VERSION_MINOR}) set(PACKAGE_VERSION_PATCH ${APPLICATION_VERSION_PATCH}) get_filename_component(PACKAGE_PLATFORM ${CMAKE_BINARY_DIR} NAME CACHE) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(PACKAGE_BUILD_TYPE debug) else() set(PACKAGE_BUILD_TYPE release) endif() set(PACKAGE_FILENAME ${APPLICATION_SLUG}-${PACKAGE_VERSION}-${PACKAGE_PLATFORM}) set(PACKAGE_INSTALL_DIR ${CMAKE_SOURCE_DIR}/bin/${PACKAGE_BUILD_TYPE}/${PACKAGE_FILENAME}) set(PACKAGE_DIST_DIR ${CMAKE_SOURCE_DIR}/dist/${PACKAGE_BUILD_TYPE}) # Create output directories file(MAKE_DIRECTORY ${PACKAGE_INSTALL_DIR}) file(MAKE_DIRECTORY ${PACKAGE_DIST_DIR}) # Check for architecture mismatches if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") if (PACKAGE_PLATFORM MATCHES "64$") message(FATAL_ERROR "Compiler architecture is 32-bit but target architecture is 64-bit.") endif() else() if (PACKAGE_PLATFORM MATCHES "32$") message(FATAL_ERROR "Compiler architecture is 64-bit but target architecture is 32-bit.") endif() endif() # Options option(BLENDER "Path to Blender executable" "") # Set compiler and linker flags if(MSVC) set(CMAKE_CXX_FLAGS "/MP /GR- /GS- /EHsc /D_WIN32_WINNT=0x0501 /DWINVER=0x0501") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} /MTd") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} /MT /O2") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /nologo") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /OPT:REF /OPT:ICF /INCREMENTAL:NO") elseif(CMAKE_COMPILER_IS_GNUCC) set(CMAKE_CXX_FLAGS "") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -g") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3") endif() set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") # Setup module directories set(MODULE_SOURCE_DIR "${PROJECT_SOURCE_DIR}/modules") set(MODULE_BUILD_DIR "${PROJECT_BINARY_DIR}/modules/build") set(MODULE_INSTALL_DIR "${CMAKE_BINARY_DIR}/modules/install") # Include ExternalProject_Add macro include(${CMAKE_ROOT}/Modules/ExternalProject.cmake) # Build SDL2 module ExternalProject_Add(SDL2 SOURCE_DIR ${MODULE_SOURCE_DIR}/SDL2 BINARY_DIR ${MODULE_BUILD_DIR}/SDL2 INSTALL_DIR ${MODULE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${MODULE_INSTALL_DIR}" "-DCMAKE_C_FLAGS='${CMAKE_C_FLAGS}'" "-DCMAKE_C_FLAGS_DEBUG='${CMAKE_C_FLAGS_DEBUG}'" "-DCMAKE_C_FLAGS_RELEASE='${CMAKE_C_FLAGS_RELEASE}'" "-DSDL_ASSERTIONS=disabled" "-DSDL_ATOMIC=OFF" "-DSDL_AUDIO=OFF" "-DSDL_CPUINFO=OFF" "-DSDL_DIRECTX=OFF" "-DSDL_EVENTS=ON" "-DSDL_FILE=OFF" "-DSDL_FILESYSTEM=OFF" "-DSDL_FORCE_STATIC_VCRT=ON" "-DSDL_HAPTIC=OFF" "-DSDL_HIDAPI=ON" "-DSDL_JOYSTICK=ON" "-DSDL_LIBC=ON" "-DSDL_LOADSO=ON" "-DSDL_LOCALE=OFF" "-DSDL_MISC=OFF" "-DSDL_OPENGL=ON" "-DSDL_OPENGLES=OFF" "-DSDL_POWER=OFF" "-DSDL_RENDER=OFF" "-DSDL_SENSOR=OFF" "-DSDL_SHARED=OFF" "-DSDL_STATIC=ON" "-DSDL_TEST=OFF" "-DSDL_THREADS=ON" "-DSDL_TIMERS=OFF" "-DSDL_VIDEO=ON" "-DSDL_VULKAN=OFF" "-DSDL_WASAPI=OFF" BUILD_ALWAYS 0) # Build OpenAL Soft module ExternalProject_Add(openal-soft SOURCE_DIR ${MODULE_SOURCE_DIR}/openal-soft BINARY_DIR ${MODULE_BUILD_DIR}/openal-soft INSTALL_DIR ${MODULE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${MODULE_INSTALL_DIR}" "-DCMAKE_C_FLAGS='${CMAKE_C_FLAGS}'" "-DCMAKE_C_FLAGS_DEBUG='${CMAKE_C_FLAGS_DEBUG}'" "-DCMAKE_C_FLAGS_RELEASE='${CMAKE_C_FLAGS_RELEASE}'" "-DCMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'" "-DCMAKE_CXX_FLAGS_DEBUG='${CMAKE_CXX_FLAGS_DEBUG}'" "-DCMAKE_CXX_FLAGS_RELEASE='${CMAKE_CXX_FLAGS_RELEASE}'" "-DLIBTYPE=STATIC" "-DFORCE_STATIC_VCRT=ON" "-DALSOFT_UTILS=OFF" "-DALSOFT_EXAMPLES=OFF" BUILD_ALWAYS 0) # Build EnTT module ExternalProject_Add(entt SOURCE_DIR ${MODULE_SOURCE_DIR}/entt BINARY_DIR ${MODULE_BUILD_DIR}/entt INSTALL_DIR ${MODULE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${MODULE_INSTALL_DIR}" "-DCMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'" "-DCMAKE_CXX_FLAGS_DEBUG='${CMAKE_CXX_FLAGS_DEBUG}'" "-DCMAKE_CXX_FLAGS_RELEASE='${CMAKE_CXX_FLAGS_RELEASE}'" BUILD_ALWAYS 0) # Build nlohmann-json module ExternalProject_Add(nlohmann-json SOURCE_DIR ${MODULE_SOURCE_DIR}/nlohmann BINARY_DIR ${MODULE_BUILD_DIR}/nlohmann INSTALL_DIR ${MODULE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${MODULE_INSTALL_DIR}" "-DCMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'" "-DCMAKE_CXX_FLAGS_DEBUG='${CMAKE_CXX_FLAGS_DEBUG}'" "-DCMAKE_CXX_FLAGS_RELEASE='${CMAKE_CXX_FLAGS_RELEASE}'" BUILD_ALWAYS 0) # Build dr_wav module ExternalProject_Add(dr_wav SOURCE_DIR ${MODULE_SOURCE_DIR}/dr_wav BINARY_DIR ${MODULE_BUILD_DIR}/dr_wav INSTALL_DIR ${MODULE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${MODULE_INSTALL_DIR}" "-DCMAKE_C_FLAGS='${CMAKE_C_FLAGS}'" "-DCMAKE_C_FLAGS_DEBUG='${CMAKE_C_FLAGS_DEBUG}'" "-DCMAKE_C_FLAGS_RELEASE='${CMAKE_C_FLAGS_RELEASE}'" BUILD_ALWAYS 0) # Build stb module ExternalProject_Add(stb SOURCE_DIR ${MODULE_SOURCE_DIR}/stb BINARY_DIR ${MODULE_BUILD_DIR}/stb INSTALL_DIR ${MODULE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${MODULE_INSTALL_DIR}" "-DCMAKE_C_FLAGS='${CMAKE_C_FLAGS}'" "-DCMAKE_C_FLAGS_DEBUG='${CMAKE_C_FLAGS_DEBUG}'" "-DCMAKE_C_FLAGS_RELEASE='${CMAKE_C_FLAGS_RELEASE}'" BUILD_ALWAYS 0) # Build TinyEXR module ExternalProject_Add(tinyexr SOURCE_DIR ${MODULE_SOURCE_DIR}/tinyexr BINARY_DIR ${MODULE_BUILD_DIR}/tinyexr INSTALL_DIR ${MODULE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${MODULE_INSTALL_DIR}" "-DCMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'" "-DCMAKE_CXX_FLAGS_DEBUG='${CMAKE_CXX_FLAGS_DEBUG}'" "-DCMAKE_CXX_FLAGS_RELEASE='${CMAKE_CXX_FLAGS_RELEASE}'" "-DTINYEXR_BUILD_SAMPLE=OFF" "-DTINYEXR_USE_MINIZ=OFF" "-DTINYEXR_USE_STB_ZLIB=ON" BUILD_ALWAYS 0) # Build glad module ExternalProject_Add(glad SOURCE_DIR ${MODULE_SOURCE_DIR}/glad BINARY_DIR ${MODULE_BUILD_DIR}/glad INSTALL_DIR ${MODULE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${MODULE_INSTALL_DIR}" "-DCMAKE_C_FLAGS='${CMAKE_C_FLAGS}'" "-DCMAKE_C_FLAGS_DEBUG='${CMAKE_C_FLAGS_DEBUG}'" "-DCMAKE_C_FLAGS_RELEASE='${CMAKE_C_FLAGS_RELEASE}'" BUILD_ALWAYS 0) # Build cxxopts module ExternalProject_Add(cxxopts SOURCE_DIR ${MODULE_SOURCE_DIR}/cxxopts BINARY_DIR ${MODULE_BUILD_DIR}/cxxopts INSTALL_DIR ${MODULE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${MODULE_INSTALL_DIR}" "-DCMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'" "-DCMAKE_CXX_FLAGS_DEBUG='${CMAKE_CXX_FLAGS_DEBUG}'" "-DCMAKE_CXX_FLAGS_RELEASE='${CMAKE_CXX_FLAGS_RELEASE}'" "-DCXXOPTS_BUILD_EXAMPLES=OFF" "-DCXXOPTS_BUILD_TESTS=OFF" BUILD_ALWAYS 0) # Build PhysicsFS module ExternalProject_Add(physfs SOURCE_DIR ${MODULE_SOURCE_DIR}/physfs BINARY_DIR ${MODULE_BUILD_DIR}/physfs INSTALL_DIR ${MODULE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${MODULE_INSTALL_DIR}" "-DCMAKE_C_FLAGS='${CMAKE_C_FLAGS}'" "-DCMAKE_C_FLAGS_DEBUG='${CMAKE_C_FLAGS_DEBUG}'" "-DCMAKE_C_FLAGS_RELEASE='${CMAKE_C_FLAGS_RELEASE}'" "-DPHYSFS_ARCHIVE_ZIP=ON" "-DPHYSFS_ARCHIVE_7Z=OFF" "-DPHYSFS_ARCHIVE_GRP=OFF" "-DPHYSFS_ARCHIVE_WAD=OFF" "-DPHYSFS_ARCHIVE_HOG=OFF" "-DPHYSFS_ARCHIVE_MVL=OFF" "-DPHYSFS_ARCHIVE_QPAK=OFF" "-DPHYSFS_ARCHIVE_SLB=OFF" "-DPHYSFS_ARCHIVE_ISO9660=OFF" "-DPHYSFS_ARCHIVE_VDF=OFF" "-DPHYSFS_BUILD_STATIC=ON" "-DPHYSFS_BUILD_SHARED=OFF" "-DPHYSFS_BUILD_TEST=OFF" "-DPHYSFS_BUILD_DOCS=OFF" BUILD_ALWAYS 0) # Build FreeType module ExternalProject_Add(freetype SOURCE_DIR ${MODULE_SOURCE_DIR}/freetype BINARY_DIR ${MODULE_BUILD_DIR}/freetype INSTALL_DIR ${MODULE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${MODULE_INSTALL_DIR}" "-DCMAKE_C_FLAGS='${CMAKE_C_FLAGS}'" "-DCMAKE_C_FLAGS_DEBUG='${CMAKE_C_FLAGS_DEBUG}'" "-DCMAKE_C_FLAGS_RELEASE='${CMAKE_C_FLAGS_RELEASE}'" "-DBUILD_SHARED_LIBS=false" "-DFT_DISABLE_ZLIB=ON" "-DFT_DISABLE_BZIP2=ON" "-DFT_DISABLE_PNG=ON" "-DFT_DISABLE_HARFBUZZ=ON" "-DFT_DISABLE_BROTLI=ON" BUILD_ALWAYS 0) # Build antkeeper-source module ExternalProject_Add(antkeeper-source DEPENDS SDL2 openal-soft entt nlohmann-json dr_wav stb tinyexr glad physfs freetype SOURCE_DIR ${MODULE_SOURCE_DIR}/antkeeper-source BINARY_DIR ${MODULE_BUILD_DIR}/antkeeper-source INSTALL_DIR ${PACKAGE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${PACKAGE_INSTALL_DIR}" "-DPACKAGE_PLATFORM=${PACKAGE_PLATFORM}" "-DCMAKE_PREFIX_PATH=${MODULE_INSTALL_DIR}" "-DAPPLICATION_NAME=${APPLICATION_NAME}" "-DAPPLICATION_VERSION=${APPLICATION_VERSION}" "-DAPPLICATION_AUTHOR=${APPLICATION_AUTHOR}" "-DCMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'" "-DCMAKE_CXX_FLAGS_DEBUG='${CMAKE_CXX_FLAGS_DEBUG}'" "-DCMAKE_CXX_FLAGS_RELEASE='${CMAKE_CXX_FLAGS_RELEASE}'" "-DCMAKE_EXE_LINKER_FLAGS='${CMAKE_EXE_LINKER_FLAGS}'" "-DCMAKE_EXE_LINKER_FLAGS_DEBUG='${CMAKE_EXE_LINKER_FLAGS_DEBUG}'" "-DCMAKE_EXE_LINKER_FLAGS_RELEASE='${CMAKE_EXE_LINKER_FLAGS_RELEASE}'" BUILD_ALWAYS 1) # Build antkeeper-data module (if exists) if(EXISTS ${MODULE_SOURCE_DIR}/antkeeper-data/CMakeLists.txt) ExternalProject_Add(antkeeper-data DEPENDS antkeeper-source SOURCE_DIR ${MODULE_SOURCE_DIR}/antkeeper-data BINARY_DIR ${MODULE_BUILD_DIR}/antkeeper-data INSTALL_DIR ${PACKAGE_INSTALL_DIR} CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_INSTALL_PREFIX=${PACKAGE_INSTALL_DIR}" "-DPACKAGE_PLATFORM=${PACKAGE_PLATFORM}" "-DCMAKE_PREFIX_PATH=${MODULE_INSTALL_DIR}" "-DAPPLICATION_NAME=${APPLICATION_NAME}" "-DAPPLICATION_VERSION=${APPLICATION_VERSION}" "-DAPPLICATION_AUTHOR=${APPLICATION_AUTHOR}" "-DBLENDER=${BLENDER}" BUILD_ALWAYS 1) endif() # Create install target install(DIRECTORY "${PACKAGE_INSTALL_DIR}/" DESTINATION . COMPONENT "package" USE_SOURCE_PERMISSIONS FILES_MATCHING PATTERN "*") # Create clean-build target add_custom_target(clean-build COMMAND git clean -fdX WORKING_DIRECTORY "${PROJECT_BINARY_DIR}") # Create cpack target add_custom_target(cpack COMMAND "${CMAKE_COMMAND}" --build . --target package WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" DEPENDS antkeeper-source VERBATIM) # Create dist target add_custom_target(dist DEPENDS cpack) # Configure CPack variables set(CPACK_PACKAGE_NAME "${APPLICATION_NAME}") set(CPACK_PACKAGE_VERSION_MAJOR "${APPLICATION_VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${APPLICATION_VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${APPLICATION_VERSION_PATCH}") set(CPACK_PACKAGE_FILE_NAME "${APPLICATION_SLUG}-${PACKAGE_VERSION}-${PACKAGE_PLATFORM}") set(CPACK_PACKAGE_DESCRIPTION "") set(CPACK_PACKAGE_CONTACT "${APPLICATION_AUTHOR}") set(CPACK_COMPONENTS_ALL "package") # Configure .tgz and .zip distribution packages set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) #set(CPACK_ARCHIVE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}.zip") #set(CPACK_ARCHIVE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}.zip") # Configure .deb distribution package set(CPACK_DEB_COMPONENT_INSTALL ON) set(CPACK_DEBIAN_PACKAGE_PACKAGE_NAME "${CPACK_PACKAGE_NAME}") set(CPACK_DEBIAN_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}.deb") set(CPACK_DEBIAN_PACKAGE_DEPENDS "") # Configure NSIS installer package #set(CPACK_NSIS_MUI_ICON "${PROJECT_SOURCE_DIR}/data/icons/app-icon.ico") #set(CPACK_PACKAGE_INSTALL_DIRECTORY "App") # Build distribution packages according to target platform set(CPACK_GENERATOR "") if(PACKAGE_PLATFORM MATCHES "linux") set(CPACK_GENERATOR "TGZ;DEB") add_custom_command(TARGET dist COMMAND ${CMAKE_COMMAND} -E make_directory ${PACKAGE_DIST_DIR} COMMAND ${CMAKE_COMMAND} -E copy "${CPACK_PACKAGE_FILE_NAME}-package.tar.gz" "${PACKAGE_DIST_DIR}/${PACKAGE_FILENAME}.tar.gz" COMMAND ${CMAKE_COMMAND} -E copy "${CPACK_DEBIAN_PACKAGE_FILE_NAME}" "${PACKAGE_DIST_DIR}") elseif(PACKAGE_PLATFORM MATCHES "win") set(CPACK_GENERATOR "ZIP;NSIS") add_custom_command(TARGET dist COMMAND ${CMAKE_COMMAND} -E make_directory ${PACKAGE_DIST_DIR} COMMAND ${CMAKE_COMMAND} -E copy "${CPACK_PACKAGE_FILE_NAME}-package.zip" "${PACKAGE_DIST_DIR}/${PACKAGE_FILENAME}.zip" COMMAND ${CMAKE_COMMAND} -E copy "${CPACK_PACKAGE_FILE_NAME}.exe" "${PACKAGE_DIST_DIR}/${PACKAGE_FILENAME}.exe") elseif(PACKAGE_PLATFORM MATCHES "osx") set(CPACK_GENERATOR "ZIP;NSIS") add_custom_command(TARGET dist COMMAND ${CMAKE_COMMAND} -E make_directory ${PACKAGE_DIST_DIR} COMMAND ${CMAKE_COMMAND} -E copy "${CPACK_PACKAGE_FILE_NAME}-package.zip" "${PACKAGE_DIST_DIR}/${PACKAGE_FILENAME}.zip") endif() # Include CPack macro include(CPack)