diff --git a/.gitmodules b/.gitmodules index f7807f5..0d72ced 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,3 +5,9 @@ [submodule "external/LibraryLinkUtilities"] path = external/LibraryLinkUtilities url = https://github.com/WolframResearch/LibraryLinkUtilities +[submodule "external/imgui"] + path = external/imgui + url = https://github.com/ocornut/imgui.git +[submodule "external/glfw"] + path = external/glfw + url = https://github.com/glfw/glfw.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 4952b53..83d5b6b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,6 @@ cmake_minimum_required(VERSION 3.20) # Project # -------------------------------------------------- project(wolfram-engine-wrapper-client LANGUAGES CXX) - set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) @@ -20,6 +19,63 @@ endif() add_subdirectory(external/spdlog) add_subdirectory(external/LibraryLinkUtilities) +# -------------------------------------------------- +# External dependency: GLFW (cross-platform window/input) +# -------------------------------------------------- +set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) +set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) +set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) +set(GLFW_INSTALL OFF CACHE BOOL "" FORCE) +add_subdirectory(external/glfw) + +# -------------------------------------------------- +# External dependency: OpenGL +# -------------------------------------------------- +find_package(OpenGL REQUIRED) + +# -------------------------------------------------- +# External dependency: Dear ImGui (no CMakeLists.txt +# in upstream imgui — we build it manually here) +# -------------------------------------------------- +set(IMGUI_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/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 + # Cross-platform backends: GLFW + OpenGL3 + ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp + ${IMGUI_DIR}/backends/imgui_impl_opengl3.cpp +) + +target_include_directories(imgui PUBLIC + ${IMGUI_DIR} + ${IMGUI_DIR}/backends +) + +target_link_libraries(imgui PUBLIC + glfw + OpenGL::GL +) + +# On macOS, GLFW needs Cocoa/IOKit/CoreVideo frameworks +if(APPLE) + target_link_libraries(imgui PUBLIC + "-framework Cocoa" + "-framework IOKit" + "-framework CoreVideo" + ) +endif() + +# On Linux, link against dl and X11 (GLFW pulls these in but be explicit) +if(UNIX AND NOT APPLE) + target_link_libraries(imgui PUBLIC + ${CMAKE_DL_LIBS} + ) +endif() + # -------------------------------------------------- # Executable # -------------------------------------------------- @@ -31,7 +87,6 @@ add_executable(${PROJECT_NAME} src/main.cpp) file(GLOB_RECURSE SRC_SUBDIRS LIST_DIRECTORIES true "${CMAKE_CURRENT_SOURCE_DIR}/src/*" ) - set(SRC_INCLUDES "") foreach(dir ${SRC_SUBDIRS}) if(IS_DIRECTORY ${dir}) @@ -50,11 +105,9 @@ target_include_directories(${PROJECT_NAME} PRIVATE file(GLOB_RECURSE ALL_CPP "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp" ) - list(REMOVE_ITEM ALL_CPP "${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp" ) - target_sources(${PROJECT_NAME} PRIVATE ${ALL_CPP}) # -------------------------------------------------- @@ -63,6 +116,9 @@ target_sources(${PROJECT_NAME} PRIVATE ${ALL_CPP}) target_link_libraries(${PROJECT_NAME} PRIVATE spdlog::spdlog LLU + imgui + OpenGL::GL + glfw ) # -------------------------------------------------- @@ -77,3 +133,23 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") ) endif() +# -------------------------------------------------- +# Windows-specific: subsystem and runtime +# -------------------------------------------------- +if(WIN32) + # Use CONSOLE subsystem so stdout works; swap to WIN32 if you want + # a pure GUI app with no terminal (requires WinMain entry point) + set_target_properties(${PROJECT_NAME} PROPERTIES + WIN32_EXECUTABLE FALSE + ) +endif() + +# -------------------------------------------------- +# macOS-specific: bundle info (optional, comment out +# if you don't want a .app bundle) +# -------------------------------------------------- +if(APPLE) + set_target_properties(${PROJECT_NAME} PROPERTIES + MACOSX_BUNDLE FALSE # set TRUE to produce a .app + ) +endif() diff --git a/external/glfw b/external/glfw new file mode 160000 index 0000000..7c9ea95 --- /dev/null +++ b/external/glfw @@ -0,0 +1 @@ +Subproject commit 7c9ea952338b792cb2f70d7c663e498725073797 diff --git a/external/imgui b/external/imgui new file mode 160000 index 0000000..c234426 --- /dev/null +++ b/external/imgui @@ -0,0 +1 @@ +Subproject commit c234426f8985a30ac6c464f409ca75bedb38f85d