fixed export

This commit is contained in:
2026-07-22 19:51:33 +01:00
parent 12d80df8ad
commit 0dd2186471
5 changed files with 375 additions and 114 deletions
+1
View File
@@ -2,6 +2,7 @@
build/
build-desktop/
build-web/
dist/
bin/
web/
debug/
+88 -112
View File
@@ -1,144 +1,119 @@
cmake_minimum_required(VERSION 4.4.0)
cmake_minimum_required(VERSION 3.25)
project(my_app LANGUAGES CXX)
project(varicle LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
# Default install location: <your-project-folder>/dist
set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/dist" CACHE PATH "Local export directory" FORCE)
# ------------------------------------------------------------------------------
# 1. Platform & Dist Paths
# ------------------------------------------------------------------------------
if(BUILD_FOR_WEB OR EMSCRIPTEN)
set(DIST_PLATFORM "web")
else()
set(DIST_PLATFORM "desktop")
endif()
file( GLOB_RECURSE
SRC
CONFIGURE
"src/*cpp"
"src/*.hpp"
)
#------------------------------------------------------------------------------------------
# Subdirectories
#------------------------------------------------------------------------------------------
set(BUILD_EXAMPLES OFF)
add_subdirectory(vendor/raylib)
add_subdirectory(vendor/asset-packer)
#------------------------------------------------------------------------------------------
# GUI
#------------------------------------------------------------------------------------------
#ImGui
set(IMGUI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/vendor/imgui")
add_library(imgui STATIC
${IMGUI_DIR}/imgui.cpp
${IMGUI_DIR}/imgui_demo.cpp
${IMGUI_DIR}/imgui_draw.cpp
${IMGUI_DIR}/imgui_tables.cpp
${IMGUI_DIR}/imgui_widgets.cpp
)
target_include_directories(imgui PUBLIC ${IMGUI_DIR})
# rlImGui
set(RLIMGUI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/vendor/rlImGui")
add_library(rlImGui STATIC
${RLIMGUI_DIR}/rlImGui.cpp
)
target_include_directories(rlImGui PUBLIC ${RLIMGUI_DIR})
target_link_libraries(rlImGui PUBLIC imgui raylib)
#------------------------------------------------------------------------------------------
# Framework Library
#------------------------------------------------------------------------------------------
# Automatically route 'cmake --install' into 'dist/desktop' or 'dist/web'
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/dist/${DIST_PLATFORM}" CACHE PATH "Dist directory" FORCE)
endif()
include(GNUInstallDirs)
file( GLOB_RECURSE
ENGINE_SRC
CONFIGURE
"src/engine/*cpp"
"src/engine/*.hpp"
# ------------------------------------------------------------------------------
# 2. Vendored Dependencies (Internal)
# ------------------------------------------------------------------------------
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory(vendor/raylib)
add_subdirectory(vendor/asset-packer)
file(GLOB IMGUI_SOURCES "vendor/imgui/*.cpp")
file(GLOB IMGUI_HEADERS "vendor/imgui/*.h")
file(GLOB RLIMGUI_HEADERS "vendor/rlImGui/*.h")
# ------------------------------------------------------------------------------
# 3. Main Framework Target (Single Monolithic Library)
# ------------------------------------------------------------------------------
file(GLOB_RECURSE ENGINE_SRC "src/engine/*.cpp")
# Put ImGui, rlImGui, and Engine sources ALL into one binary!
add_library(${PROJECT_NAME}_lib STATIC
${ENGINE_SRC}
${IMGUI_SOURCES}
vendor/rlImGui/rlImGui.cpp
)
add_library(${PROJECT_NAME}_lib ${ENGINE_SRC})
set_target_properties(${PROJECT_NAME}_lib PROPERTIES OUTPUT_NAME "varicle")
set_target_properties(${PROJECT_NAME}_lib PROPERTIES
OUTPUT_NAME "varicle"
)
target_include_directories(${PROJECT_NAME}_lib PUBLIC src vendor/entt)
target_include_directories(${PROJECT_NAME}_lib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/vendor/imgui>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/vendor/rlImGui>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/vendor/entt>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/vendor/json>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
target_link_libraries(${PROJECT_NAME}_lib PUBLIC
AssetPacker::assetpacker
rlImGui
imgui
raylib
)
## Get Metadata
install(TARGETS ${PROJECT_NAME}_lib
# ------------------------------------------------------------------------------
# 4. Clean Export & Install
# ------------------------------------------------------------------------------
# Install engine library + raylib
install(TARGETS ${PROJECT_NAME}_lib assetpacker_lib
EXPORT ${PROJECT_NAME}Targets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # Static libs (.a / .lib)
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # Shared libs (.so / .dylib)
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # Windows DLLs (.dll)
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/engine
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
## Headers
# Engine
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/engine/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/engine
FILES_MATCHING PATTERN "*.hpp"
)
# Copy header files straight into dist/include for consumer projects
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp")
install(FILES ${IMGUI_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/imgui )
install(FILES ${RLIMGUI_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/rlImGui )
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/vendor/entt/entt" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp")
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/vendor/json/json.hpp" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/json )
# Entt
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/vendor/entt/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/entt
FILES_MATCHING PATTERN "*.hpp" PATTERN "*.h"
# Standard CMake package export
install(EXPORT ${PROJECT_NAME}Targets
FILE ${PROJECT_NAME}Targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)
# install(EXPORT ${PROJECT_NAME}Targets
# FILE ${PROJECT_NAME}Targets.cmake
# NAMESPACE ${PROJECT_NAME}::
# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
# )
# ------------------------------------------------------------------------------
# 5. Standalone Sandbox App / Executable
# ------------------------------------------------------------------------------
file(GLOB_RECURSE APP_SRC "src/*.cpp")
add_executable(${PROJECT_NAME} ${APP_SRC})
#------------------------------------------------------------------------------------------
# Executable
#------------------------------------------------------------------------------------------
target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_lib)
add_executable(${PROJECT_NAME} ${SRC})
# Export ImGui headers so anything linking to 'imgui' gets them automatically
target_include_directories(${PROJECT_NAME} PRIVATE vendor/entt src)
target_link_libraries(${PROJECT_NAME} PRIVATE
AssetPacker::assetpacker
rlImGui
imgui
raylib
)
#------------------------------------------------------------------------------------------
# Make Assets
#------------------------------------------------------------------------------------------
if(EMSCRIPTEN)
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "index" SUFFIX ".html")
target_link_options(${PROJECT_NAME} PRIVATE
"-sUSE_GLFW=3"
"-sASYNCIFY"
"--shell-file" "${CMAKE_CURRENT_SOURCE_DIR}/html/shell_custom.html"
)
endif()
# #------------------------------------------------------------------------------------------
# # Make Assets
# #------------------------------------------------------------------------------------------
#
set(BUILD_ASSET_DIR "${CMAKE_CURRENT_BINARY_DIR}/assets")
set(PACKED_DATA_FILE "${CMAKE_CURRENT_BINARY_DIR}/data.dat")
#
add_custom_target( pack-asset
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_CURRENT_SOURCE_DIR}/assets"
@@ -161,9 +136,9 @@ add_custom_target( pack-asset
)
# ------------------------------------------------------------------------------
# WebAssembly / Emscripten Configurations
# ------------------------------------------------------------------------------
# # ------------------------------------------------------------------------------
# # WebAssembly / Emscripten Configurations
# # ------------------------------------------------------------------------------
if(EMSCRIPTEN)
# Output an HTML page instead of a raw binary
@@ -183,11 +158,12 @@ if(EMSCRIPTEN)
endif()
add_custom_target( run
COMMAND ${PROJECT_NAME}
DEPENDS ${PROJECT_NAME}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
enable_testing()
add_subdirectory(tests)
# enable_testing()
# add_subdirectory(tests)
+284
View File
@@ -0,0 +1,284 @@
cmake_minimum_required(VERSION 3.25)
project(varicle LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
# Default install location: <your-project-folder>/dist
set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/dist" CACHE PATH "Local export directory" FORCE)
endif()
file( GLOB_RECURSE
SRC
CONFIGURE
"src/*cpp"
"src/*.hpp"
)
#------------------------------------------------------------------------------------------
# DiSt
#------------------------------------------------------------------------------------------
if(BUILD_FOR_WEB OR EMSCRIPTEN)
set(DIST_PLATFORM "web")
else()
set(DIST_PLATFORM "desktop")
endif()
set(DIST_DIR "${CMAKE_CURRENT_SOURCE_DIR}/dist/${DIST_PLATFORM}")
#------------------------------------------------------------------------------------------
# Subdirectories
#------------------------------------------------------------------------------------------
set(BUILD_EXAMPLES OFF)
add_subdirectory(vendor/raylib)
add_subdirectory(vendor/asset-packer)
#------------------------------------------------------------------------------------------
# HEADERS AND SOURCE FILES
#------------------------------------------------------------------------------------------
#ImGui
set(IMGUI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/vendor/imgui")
add_library(imgui STATIC
${IMGUI_DIR}/imgui.cpp
${IMGUI_DIR}/imgui_demo.cpp
${IMGUI_DIR}/imgui_draw.cpp
${IMGUI_DIR}/imgui_tables.cpp
${IMGUI_DIR}/imgui_widgets.cpp
)
# target_include_directories(imgui PUBLIC ${IMGUI_DIR})
file(GLOB IMGUI_HEADERS
CONFIGURE_DEPENDS
"${CMAKE_CURRENT_SOURCE_DIR}/vendor/imgui/*.h"
)
target_include_directories(imgui PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/vendor/imGui>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
target_sources(imgui INTERFACE
FILE_SET HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/vendor/
FILES ${IMGUI_HEADERS}
)
# rlImGui
file(GLOB RLIMGUI_HEADERS
CONFIGURE_DEPENDS
"${CMAKE_CURRENT_SOURCE_DIR}/vendor/rlImGui/*.h"
)
set(RLIMGUI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/vendor/rlImGui")
add_library(rlImGui STATIC
${RLIMGUI_DIR}/rlImGui.cpp
)
# target_include_directories(rlImGui PUBLIC ${RLIMGUI_DIR})
target_link_libraries(rlImGui PUBLIC imgui raylib)
target_include_directories(rlImGui PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/vendor/rlImGui>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
target_sources(rlImGui INTERFACE
FILE_SET HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/vendor/
FILES ${RLIMGUI_HEADERS}
)
#------------------------------------------------------------------------------------------
# Framework Library
#------------------------------------------------------------------------------------------
include(GNUInstallDirs)
file( GLOB_RECURSE
ENGINE_SRC
CONFIGURE
"src/engine/*cpp"
"src/engine/*.hpp"
)
add_library(${PROJECT_NAME}_lib ${ENGINE_SRC})
set_target_properties(${PROJECT_NAME}_lib PROPERTIES
OUTPUT_NAME "varicle"
)
target_include_directories(${PROJECT_NAME}_lib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/vendor/entt>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
target_link_libraries(${PROJECT_NAME}_lib PUBLIC
AssetPacker::assetpacker
rlImGui
imgui
raylib
)
target_sources(${PROJECT_NAME}_lib PUBLIC
FILE_SET HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src/
FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/engine
)
# FRAMEWORK DEPENDECIES
#entt
add_library(entt INTERFACE)
target_include_directories(entt INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/vendor/entt>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
target_sources(entt INTERFACE
FILE_SET HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/vendor/entt
FILES ${CMAKE_CURRENT_SOURCE_DIR}/vendor/entt/entt/entt.hpp
)
#json
add_library(json INTERFACE)
target_include_directories(json INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/vendor/json>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>/json
)
target_sources(json INTERFACE
FILE_SET HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/vendor/json
FILES ${CMAKE_CURRENT_SOURCE_DIR}/vendor/json/json.hpp
)
install(TARGETS ${PROJECT_NAME}_lib raylib entt json assetpacker_lib imgui rlImGui
EXPORT ${PROJECT_NAME}Targets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # Static libs (.a / .lib)
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # Shared libs (.so / .dylib)
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # Windows DLLs (.dll)
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/engine
FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(EXPORT ${PROJECT_NAME}Targets
FILE ${PROJECT_NAME}Targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)
# 2. GENERATE the Config file (THIS IS THE MISSING PIECE!)
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/varicleConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/varicleConfig.cmake"
INSTALL_DESTINATION lib/cmake/varicle
)
# 3. INSTALL the Config file alongside varicleTargets.cmake
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/varicleConfig.cmake"
DESTINATION lib/cmake/varicle
)
#------------------------------------------------------------------------------------------
# Executable
#------------------------------------------------------------------------------------------
add_executable(${PROJECT_NAME} ${SRC})
# Export ImGui headers so anything linking to 'imgui' gets them automatically
target_include_directories(${PROJECT_NAME} PRIVATE vendor/entt src)
target_link_libraries(${PROJECT_NAME} PRIVATE
AssetPacker::assetpacker
rlImGui
imgui
raylib
)
#------------------------------------------------------------------------------------------
# Make Assets
#------------------------------------------------------------------------------------------
set(BUILD_ASSET_DIR "${CMAKE_CURRENT_BINARY_DIR}/assets")
set(PACKED_DATA_FILE "${CMAKE_CURRENT_BINARY_DIR}/data.dat")
add_custom_target( pack-asset
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_CURRENT_SOURCE_DIR}/assets"
"${BUILD_ASSET_DIR}"
# 2. Pass relative paths to assetpacker!
# Because WORKING_DIRECTORY is ${CMAKE_CURRENT_BINARY_DIR},
# 'assets' resolves to './assets' and 'data.dat' resolves to './data.dat'
# Set execution context so relative paths inside assetpacker work
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
COMMAND AssetPacker::packer "assets/"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/assets" AssetPacker::packer
COMMENT "Copying assets folder and packing via relative paths..."
VERBATIM
)
# ------------------------------------------------------------------------------
# WebAssembly / Emscripten Configurations
# ------------------------------------------------------------------------------
if(EMSCRIPTEN)
# Output an HTML page instead of a raw binary
set_target_properties(${PROJECT_NAME} PROPERTIES
OUTPUT_NAME "index"
SUFFIX ".html"
)
# Pass Emscripten linker flags
target_link_options(${PROJECT_NAME} PRIVATE
"-sUSE_GLFW=3" # Needed for Raylib web builds
"-sASYNCIFY" # Allows main loop to yield to the browser
"--shell-file" "${CMAKE_CURRENT_SOURCE_DIR}/html/shell_custom.html" # (Optional) Custom HTML shell
# Pre-pack your assets directory into the WebAssembly virtual filesystem
"--preload-file" "${CMAKE_CURRENT_BINARY_DIR}/data.dat@/data.dat"
)
endif()
add_custom_target( run
COMMAND ${PROJECT_NAME}
DEPENDS ${PROJECT_NAME}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
enable_testing()
add_subdirectory(tests)
+1 -1
View File
@@ -7,7 +7,7 @@ foreach(TEST_FILE ${TEST_SOURCES})
# Create individual target for this specific test
add_executable(${TEST_NAME} ${TEST_FILE})
target_link_libraries(${TEST_NAME} PRIVATE my_app_lib)
target_link_libraries(${TEST_NAME} PRIVATE varicle_lib)
# Register each as an individual test with CTest
add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME})