diff --git a/CMakeLists.txt b/CMakeLists.txt index 913d39de..086ea1d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ endif() set(CMAKE_CXX_STANDARD 17) +# Set HELLOIMGUI_BASEPATH / HELLOIMGUI_CMAKE_PATH include(${CMAKE_CURRENT_LIST_DIR}/hello_imgui_cmake/utils/cache_hello_imgui_paths.cmake) ############################################################################### @@ -89,6 +90,7 @@ option(HELLOIMGUI_USE_SDL_OPENGL3 "Build HelloImGui for SDL+OpenGL3" OFF) # HELLOIMGUI_IMGUI_SOURCE_DIR: folder containing the sources for imgui (by default in the submodule external/imgui) if (NOT DEFINED HELLOIMGUI_IMGUI_SOURCE_DIR) set(HELLOIMGUI_IMGUI_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/external/imgui" CACHE STRING "Source dir of ImGui") + message(WARNING "Defined HELLOIMGUI_IMGUI_SOURCE_DIR=${HELLOIMGUI_IMGUI_SOURCE_DIR}") endif() # if HELLOIMGUI_BUILD_IMGUI, imgui will be built as part of the build of HelloImGui if (NOT DEFINED HELLOIMGUI_BUILD_IMGUI) @@ -166,57 +168,6 @@ option(HELLOIMGUI_USE_GLAD "Use Glad OpenGl loader" ${need_opengl_loader}) ############################################################################### -#------------------------------------------------------------------------------ -# Backend check: If no backend option is selected, -# either select Glfw automatically if possible, or fail -#------------------------------------------------------------------------------ -# -if (NOT HELLOIMGUI_WITH_GLFW - AND NOT HELLOIMGUI_WITH_SDL - AND NOT HELLOIMGUI_USE_SDL_OPENGL3 - AND NOT HELLOIMGUI_USE_GLFW_OPENGL3 - AND NOT EMSCRIPTEN - ) - set(backend_message " - In order to select your own backend, use one of the cmake options below: - -DHELLOIMGUI_WITH_GLFW=ON # To download and build glfw automatically - -DHELLOIMGUI_WITH_SDL=ON # To download and build SDL automatically - -DHELLOIMGUI_USE_GLFW_OPENGL3=ON # To use your own version of GLFW (it should be findable via find_package(glfw3)) - -DHELLOIMGUI_USE_SDL_OPENGL3=ON # To use your own version of SDL (it should be findable via find_package(SDL2)) - - (Note: under Linux, it is advised to use system-wide libraries, and not to use - -DHELLOIMGUI_WITH_GLFW=ON or -DHELLOIMGUI_WITH_SDL=ON) - ") - if (NOT HELLOIMGUI_USE_GLFW_SYSTEM_LIB) - set(HELLOIMGUI_WITH_GLFW ON) - message(STATUS " - HelloImGui: using Glfw as default default backend (it will be downloaded and built inside {CMAKE_CURRENT_BINARY_DIR}/_deps/glfw-*) - ${backend_message} - ") - else() - # Check if Glfw can be found - find_package(glfw3 QUIET) - if (glfw3_FOUND) - set(HELLOIMGUI_USE_GLFW_OPENGL3 ON) - message(STATUS - "HelloImGui: using Glfw as default default backend (it was found via find_package(glfw3)) - ${backend_message} - ") - else() - set(glfw_help_msg " - you can install glfw via your package manager (apt, pacman, etc). - For example, on Ubuntu, you can run: - sudo apt install libglfw3-dev - on macOS you can run: - brew install glfw3 - ") - message(FATAL_ERROR " - HelloImGui: no backend selected, and could not find Glfw via find_package(glfw3). - ${backend_message} ${glfw_help_msg} - ") - endif() - endif() -endif() ############################################################################### @@ -242,43 +193,7 @@ if (HELLOIMGUI_WITH_SDL) set(HELLOIMGUI_USE_SDL_OPENGL3 ON) endif() -# Shall we fetch glfw? (fill shall_fetch_glfw) -set(shall_fetch_glfw OFF) -if (HELLOIMGUI_WITH_GLFW - AND NOT HELLOIMGUI_USE_GLFW_SYSTEM_LIB - AND NOT TARGET glfw - AND NOT EMSCRIPTEN - ) - find_package(glfw3 QUIET) - if (NOT glfw3_FOUND) - set(shall_fetch_glfw ON) - endif() -endif() - - -#------------------------------------------------------------------------------ -# Download backend glfw or sdl if required -#------------------------------------------------------------------------------ -if (shall_fetch_glfw) - message(STATUS "HelloImGui: downloading and building glfw") - include(FetchContent) - Set(FETCHCONTENT_QUIET FALSE) - FetchContent_Declare(glfw - GIT_REPOSITORY https://github.com/glfw/glfw.git - GIT_TAG 3.3.8 - GIT_PROGRESS TRUE - ) - set(need_fetch_make_available_glfw ON) -endif() -if (NOT (HELLOIMGUI_USE_SDL_OPENGL3 OR HELLOIMGUI_USE_GLFW_OPENGL3 OR HELLOIMGUI_CREATE_ANDROID_STUDIO_PROJECT)) - message(FATAL_ERROR "Select at least one backend: use either - -DHELLOIMGUI_USE_SDL_OPENGL3=ON - -DHELLOIMGUI_USE_GLFW_OPENGL3=ON - -DHELLOIMGUI_USE_QT=ON - -DHELLOIMGUI_CREATE_ANDROID_STUDIO_PROJECT=ON - ") -endif() #------------------------------------------------------------------------------ # MSVC: Select the solution folder where hello_imgui should be placed @@ -297,23 +212,12 @@ include(cmake/StandardProjectSettings.cmake) include(cmake/StaticAnalyzers.cmake) include(msvc/msvc_target_group) - if (EMSCRIPTEN) include(${HELLOIMGUI_BASEPATH}/hello_imgui_cmake/emscripten/hello_imgui_emscripten_global_options.cmake) endif() - -add_subdirectory(external) add_subdirectory(src) -#------------------------------------------------------------------------------ -# imgui_test_engine integration -#------------------------------------------------------------------------------ -if (HELLOIMGUI_WITH_TEST_ENGINE) - include(${CMAKE_CURRENT_LIST_DIR}/src/hello_imgui_test_engine_integration/hello_imgui_test_engine_cmake.cmake) - add_imgui_test_engine() -endif() - #------------------------------------------------------------------------------ # automation tests (set cache var HELLOIMGUI_BUILD_AUTOMATION_TEST to enable) # by default, they should only be built standalone, (run cmake inside .github/ci_automation_tests) diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt deleted file mode 100644 index 0c05e001..00000000 --- a/external/CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -# glad OpenGL loader -if (HELLOIMGUI_USE_GLAD) - include(${CMAKE_CURRENT_LIST_DIR}/OpenGL_Loaders/glad.cmake) -endif() - -# imgui is built by default -# You can use your own : -# In this case, make sure that a target named imgui is available -# and add this code to your CMakeLists: -# -# set(HELLOIMGUI_BUILD_IMGUI OFF CACHE BOOL "" FORCE) -# set(HELLOIMGUI_IMGUI_SOURCE_DIR "path/to/your/imgui" CACHE STRING "" FORCE) -# -if (HELLOIMGUI_BUILD_IMGUI) - # if HELLOIMGUI_IMGUI_SOURCE_DIR is CMAKE_CURRENT_LIST_DIR/imgui - # and the submodule is not present, update submodules - if (HELLOIMGUI_IMGUI_SOURCE_DIR STREQUAL ${CMAKE_CURRENT_LIST_DIR}/imgui) - if (NOT EXISTS ${HELLOIMGUI_IMGUI_SOURCE_DIR}/imgui.h) - # Run git submodule update --init --recursive - message(WARNING "Updating imgui submodule") - execute_process(COMMAND git submodule update --init --recursive - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) - endif() - endif() - - file(GLOB imgui_sources ${HELLOIMGUI_IMGUI_SOURCE_DIR}/*.h ${HELLOIMGUI_IMGUI_SOURCE_DIR}/*.cpp) - set(imgui_sources ${imgui_sources} ${HELLOIMGUI_IMGUI_SOURCE_DIR}/misc/cpp/imgui_stdlib.cpp ${HELLOIMGUI_IMGUI_SOURCE_DIR}/misc/cpp/imgui_stdlib.h) - if (HELLO_IMGUI_IMGUI_SHARED) - add_library(imgui SHARED ${imgui_sources}) - install(TARGETS imgui DESTINATION ./lib/) - else() - add_library(imgui ${imgui_sources}) - endif() - target_include_directories(imgui PUBLIC ${HELLOIMGUI_IMGUI_SOURCE_DIR}) - if (MSVC) - hello_imgui_msvc_target_set_folder(imgui ${HELLOIMGUI_SOLUTIONFOLDER}/external) - endif() - - # Install - if(PROJECT_IS_TOP_LEVEL) - install(FILES ${imgui_sources} DESTINATION imgui) - install(DIRECTORY ${HELLOIMGUI_IMGUI_SOURCE_DIR}/backends DESTINATION imgui) - install(DIRECTORY ${HELLOIMGUI_IMGUI_SOURCE_DIR}/misc/cpp DESTINATION imgui/misc) - install(DIRECTORY ${HELLOIMGUI_IMGUI_SOURCE_DIR}/misc/freetype DESTINATION imgui/misc) - endif() -endif() - diff --git a/external/OpenGL_Loaders/glad.cmake b/external/OpenGL_Loaders/glad.cmake index 085a8345..1d5ae66c 100644 --- a/external/OpenGL_Loaders/glad.cmake +++ b/external/OpenGL_Loaders/glad.cmake @@ -1,27 +1,31 @@ -set(GLAD_DIR ${CMAKE_CURRENT_LIST_DIR}/glad CACHE INTERNAL "Directory of glad") -set(GLAD_FILES - ${GLAD_DIR}/src/glad.c - ${GLAD_DIR}/include/glad/glad.h - ${GLAD_DIR}/include/KHR/khrplatform.h) -add_library(glad ${GLAD_FILES}) -target_include_directories(glad PUBLIC SYSTEM ${GLAD_DIR}/include) -if(WIN32) - target_link_libraries(glad PUBLIC opengl32.lib) -else() - target_link_libraries(glad PUBLIC ${OPENGL_LIBRARIES}) -endif() -get_target_property(library_type glad TYPE) -target_compile_definitions(glad PUBLIC HELLOIMGUI_USE_GLAD) -if (library_type STREQUAL SHARED_LIBRARY) - # If glad is a shared lobrary, define the macro GLAD_API_EXPORT on the command line. - target_compile_definitions(glad PRIVATE GLAD_GLAPI_EXPORT) - target_compile_definitions(glad PUBLIC GLAD_GLAPI_EXPORT PRIVATE GLAD_GLAPI_EXPORT_BUILD) -endif() +set(_him_glad_cmake_dir ${CMAKE_CURRENT_LIST_DIR} CACHE INTERNAL "") -if (MSVC) - hello_imgui_msvc_target_set_folder(glad ${HELLOIMGUI_SOLUTIONFOLDER}/external/OpenGL_Loaders) -endif() +function(him_install_glad) + set(GLAD_DIR ${_him_glad_cmake_dir}/glad CACHE INTERNAL "Directory of glad") + set(GLAD_FILES + ${GLAD_DIR}/src/glad.c + ${GLAD_DIR}/include/glad/glad.h + ${GLAD_DIR}/include/KHR/khrplatform.h) + add_library(glad ${GLAD_FILES}) + target_include_directories(glad PUBLIC SYSTEM ${GLAD_DIR}/include) + if(WIN32) + target_link_libraries(glad PUBLIC opengl32.lib) + else() + target_link_libraries(glad PUBLIC ${OPENGL_LIBRARIES}) + endif() + get_target_property(library_type glad TYPE) + target_compile_definitions(glad PUBLIC HELLOIMGUI_USE_GLAD) + if (library_type STREQUAL SHARED_LIBRARY) + # If glad is a shared lobrary, define the macro GLAD_API_EXPORT on the command line. + target_compile_definitions(glad PRIVATE GLAD_GLAPI_EXPORT) + target_compile_definitions(glad PUBLIC GLAD_GLAPI_EXPORT PRIVATE GLAD_GLAPI_EXPORT_BUILD) + endif() -if(PROJECT_IS_TOP_LEVEL) - install(TARGETS glad DESTINATION ./lib/) -endif() + if (MSVC) + hello_imgui_msvc_target_set_folder(glad ${HELLOIMGUI_SOLUTIONFOLDER}/external/OpenGL_Loaders) + endif() + + if(PROJECT_IS_TOP_LEVEL) + install(TARGETS glad DESTINATION ./lib/) + endif() +endfunction() diff --git a/src/hello_imgui/CMakeLists.txt b/src/hello_imgui/CMakeLists.txt index e9c23a44..fa290e2a 100644 --- a/src/hello_imgui/CMakeLists.txt +++ b/src/hello_imgui/CMakeLists.txt @@ -2,6 +2,9 @@ # Global variables and + objective-c++ for apple ################################################################################################### include(FetchContent) +include(${HELLOIMGUI_BASEPATH}/external/OpenGL_Loaders/glad.cmake) +include(${HELLOIMGUI_BASEPATH}/src/hello_imgui_test_engine_integration/hello_imgui_test_engine_cmake.cmake) + # Set target name set(helloimgui_target hello_imgui) @@ -36,6 +39,138 @@ function(him_add_target) endfunction() +################################################################################################### +# Build imgui: API = him_build_imgui +################################################################################################### +function(him_build_imgui) + _him_do_build_imgui() + if (HELLOIMGUI_WITH_TEST_ENGINE) + add_imgui_test_engine() + endif() +endfunction() + +function(_him_do_build_imgui) + # imgui is built by default + # You can use your own : + # In this case, make sure that a target named imgui is available + # and add this code to your CMakeLists: + # + # set(HELLOIMGUI_BUILD_IMGUI OFF CACHE BOOL "" FORCE) + # set(HELLOIMGUI_IMGUI_SOURCE_DIR "path/to/your/imgui" CACHE STRING "" FORCE) + # + if (HELLOIMGUI_BUILD_IMGUI) + # if HELLOIMGUI_IMGUI_SOURCE_DIR is CMAKE_CURRENT_LIST_DIR/imgui + # and the submodule is not present, update submodules + if (HELLOIMGUI_IMGUI_SOURCE_DIR STREQUAL ${HELLOIMGUI_BASEPATH}/external/imgui) + if (NOT EXISTS ${HELLOIMGUI_IMGUI_SOURCE_DIR}/imgui.h) + # Run git submodule update --init --recursive + message(WARNING "Updating imgui submodule") + execute_process(COMMAND git submodule update --init --recursive + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + endif() + endif() + + file(GLOB imgui_sources ${HELLOIMGUI_IMGUI_SOURCE_DIR}/*.h ${HELLOIMGUI_IMGUI_SOURCE_DIR}/*.cpp) + set(imgui_sources ${imgui_sources} + ${HELLOIMGUI_IMGUI_SOURCE_DIR}/misc/cpp/imgui_stdlib.cpp + ${HELLOIMGUI_IMGUI_SOURCE_DIR}/misc/cpp/imgui_stdlib.h) + if (HELLO_IMGUI_IMGUI_SHARED) + add_library(imgui SHARED ${imgui_sources}) + install(TARGETS imgui DESTINATION ./lib/) + else() + add_library(imgui ${imgui_sources}) + endif() + target_include_directories(imgui PUBLIC ${HELLOIMGUI_IMGUI_SOURCE_DIR}) + if (MSVC) + hello_imgui_msvc_target_set_folder(imgui ${HELLOIMGUI_SOLUTIONFOLDER}/external) + endif() + + # Install + if(PROJECT_IS_TOP_LEVEL) + install(FILES ${imgui_sources} DESTINATION imgui) + install(DIRECTORY ${HELLOIMGUI_IMGUI_SOURCE_DIR}/backends DESTINATION imgui) + install(DIRECTORY ${HELLOIMGUI_IMGUI_SOURCE_DIR}/misc/cpp DESTINATION imgui/misc) + install(DIRECTORY ${HELLOIMGUI_IMGUI_SOURCE_DIR}/misc/freetype DESTINATION imgui/misc) + endif() + endif() + +endfunction() + + + +################################################################################################### +# Sanity checks: API = him_sanity_checks +################################################################################################### +function(him_sanity_checks) + _him_try_select_glfw_if_no_backend_selected() + _him_shout_if_no_backend() +endfunction() + +function(_him_try_select_glfw_if_no_backend_selected) + #------------------------------------------------------------------------------ + # Backend check: If no backend option is selected, + # either select Glfw automatically if possible, or fail + #------------------------------------------------------------------------------ + # + if (NOT HELLOIMGUI_WITH_GLFW + AND NOT HELLOIMGUI_WITH_SDL + AND NOT HELLOIMGUI_USE_SDL_OPENGL3 + AND NOT HELLOIMGUI_USE_GLFW_OPENGL3 + AND NOT EMSCRIPTEN + ) + set(backend_message " + In order to select your own backend, use one of the cmake options below: + -DHELLOIMGUI_WITH_GLFW=ON # To download and build glfw automatically + -DHELLOIMGUI_WITH_SDL=ON # To download and build SDL automatically + -DHELLOIMGUI_USE_GLFW_OPENGL3=ON # To use your own version of GLFW (it should be findable via find_package(glfw3)) + -DHELLOIMGUI_USE_SDL_OPENGL3=ON # To use your own version of SDL (it should be findable via find_package(SDL2)) + + (Note: under Linux, it is advised to use system-wide libraries, and not to use + -DHELLOIMGUI_WITH_GLFW=ON or -DHELLOIMGUI_WITH_SDL=ON) + ") + if (NOT HELLOIMGUI_USE_GLFW_SYSTEM_LIB) + set(HELLOIMGUI_WITH_GLFW ON) + message(STATUS " + HelloImGui: using Glfw as default default backend (it will be downloaded and built inside {CMAKE_CURRENT_BINARY_DIR}/_deps/glfw-*) + ${backend_message} + ") + else() + # Check if Glfw can be found + find_package(glfw3 QUIET) + if (glfw3_FOUND) + set(HELLOIMGUI_USE_GLFW_OPENGL3 ON) + message(STATUS + "HelloImGui: using Glfw as default default backend (it was found via find_package(glfw3)) + ${backend_message} + ") + else() + set(glfw_help_msg " + you can install glfw via your package manager (apt, pacman, etc). + For example, on Ubuntu, you can run: + sudo apt install libglfw3-dev + on macOS you can run: + brew install glfw3 + ") + message(FATAL_ERROR " + HelloImGui: no backend selected, and could not find Glfw via find_package(glfw3). + ${backend_message} ${glfw_help_msg} + ") + endif() + endif() + endif() +endfunction() + +function(_him_shout_if_no_backend) + if (NOT (HELLOIMGUI_USE_SDL_OPENGL3 OR HELLOIMGUI_USE_GLFW_OPENGL3 OR HELLOIMGUI_CREATE_ANDROID_STUDIO_PROJECT)) + message(FATAL_ERROR "Select at least one backend: use either + -DHELLOIMGUI_USE_SDL_OPENGL3=ON + -DHELLOIMGUI_USE_GLFW_OPENGL3=ON + -DHELLOIMGUI_USE_QT=ON + -DHELLOIMGUI_CREATE_ANDROID_STUDIO_PROJECT=ON + ") + endif() +endfunction() + ################################################################################################### # Apple related options: API = him_add_apple_options ################################################################################################### @@ -159,6 +294,9 @@ function(him_use_opengl3_backend target) target_compile_definitions(${helloimgui_target} PUBLIC HELLOIMGUI_USE_GLAD IMGUI_IMPL_OPENGL_LOADER_GLAD) target_link_libraries(${helloimgui_target} PUBLIC glad) endif() + if (HELLOIMGUI_USE_GLAD) + him_install_glad() + endif() endfunction() function(_him_link_opengles_sdl target) @@ -176,6 +314,7 @@ function(_him_link_opengles_sdl target) ) endfunction() + ################################################################################################### # SDL backend: API = him_use_sdl2_backend ################################################################################################### @@ -291,9 +430,7 @@ endfunction() # Glfw backend: API = him_use_glfw_backend ################################################################################################### function(him_use_glfw_backend target) - if (need_fetch_make_available_glfw) - _him_fetch_make_available_glfw() - endif() + _him_fetch_glfw_if_needed() if (NOT TARGET glfw) # if glfw is not built as part of the whole build, find it find_package(glfw3 CONFIG REQUIRED) endif() @@ -306,12 +443,36 @@ function(him_use_glfw_backend target) target_compile_definitions(${helloimgui_target} PUBLIC HELLOIMGUI_USE_GLFW) endfunction() -function(_him_fetch_make_available_glfw) - set(GLFW_BUILD_EXAMPLES OFF) - set(GLFW_BUILD_TESTS OFF) - set(GLFW_BUILD_DOCS OFF) - set(GLFW_INSTALL OFF) - FetchContent_MakeAvailable(glfw) +function(_him_fetch_glfw_if_needed) + set(shall_fetch_glfw OFF) + if (HELLOIMGUI_WITH_GLFW + AND NOT HELLOIMGUI_USE_GLFW_SYSTEM_LIB + AND NOT TARGET glfw + AND NOT EMSCRIPTEN + ) + find_package(glfw3 QUIET) + if (NOT glfw3_FOUND) + set(shall_fetch_glfw ON) + endif() + endif() + + if (shall_fetch_glfw) + message(STATUS "HelloImGui: downloading and building glfw") + include(FetchContent) + Set(FETCHCONTENT_QUIET FALSE) + FetchContent_Declare(glfw + GIT_REPOSITORY https://github.com/glfw/glfw.git + GIT_TAG 3.3.8 + GIT_PROGRESS TRUE + ) + + set(GLFW_BUILD_EXAMPLES OFF) + set(GLFW_BUILD_TESTS OFF) + set(GLFW_BUILD_DOCS OFF) + set(GLFW_INSTALL OFF) + FetchContent_MakeAvailable(glfw) + endif() + endfunction() @@ -346,6 +507,8 @@ endfunction() # Main: API = him_main ################################################################################################### function(him_main) + him_sanity_checks() + him_build_imgui() him_add_target() if (HELLOIMGUI_USE_SDL_OPENGL3)