From 0dd21864716ec0ea42b05871346203b86f86fe7f Mon Sep 17 00:00:00 2001 From: ShadesAndGrays Date: Wed, 22 Jul 2026 19:51:33 +0100 Subject: [PATCH] fixed export --- .gitignore | 1 + CMakeLists.txt | 200 +++++++++++++---------------- archive/CMakeLists.txt | 284 +++++++++++++++++++++++++++++++++++++++++ tests/CMakeLists.txt | 2 +- vendor/asset-packer | 2 +- 5 files changed, 375 insertions(+), 114 deletions(-) create mode 100644 archive/CMakeLists.txt diff --git a/.gitignore b/.gitignore index 4af05aa..9c44277 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ build/ build-desktop/ build-web/ +dist/ bin/ web/ debug/ diff --git a/CMakeLists.txt b/CMakeLists.txt index ed0618c..77f8301 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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: /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 + $ + $ + $ + $ + $ + $ +) 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) diff --git a/archive/CMakeLists.txt b/archive/CMakeLists.txt new file mode 100644 index 0000000..33bc0f0 --- /dev/null +++ b/archive/CMakeLists.txt @@ -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: /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 + $ + $ +) + + +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 + $ + $ +) + +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 + $ + $ + $ +) + +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 + $ + $ +) + +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 + $ + $/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) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5babd33..c8374ef 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -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}) diff --git a/vendor/asset-packer b/vendor/asset-packer index 674c7d1..46c3aae 160000 --- a/vendor/asset-packer +++ b/vendor/asset-packer @@ -1 +1 @@ -Subproject commit 674c7d1dae989b9851dee04e687be42beaaecd9b +Subproject commit 46c3aae3e2ffc275b54c9a62299133a15390661a