From 51fa3e851f5a64e0cf3eac9f566781e495a384f3 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sat, 26 Nov 2022 23:05:41 -0800 Subject: [PATCH] [build] cmake: Use FetchContent instead of ExternalProject (#4714) Also switch to using thirdparty-fonts instead of generating them. --- googletest/CMakeLists.txt | 38 ++++----- googletest/CMakeLists.txt.in | 15 ---- imgui/.styleguide | 20 +++++ imgui/CMakeLists.txt | 146 +++++++++++++++++++++-------------- imgui/CMakeLists.txt.in | 63 --------------- imgui/src/stb_image.cpp | 7 ++ 6 files changed, 132 insertions(+), 157 deletions(-) delete mode 100644 googletest/CMakeLists.txt.in create mode 100644 imgui/.styleguide delete mode 100644 imgui/CMakeLists.txt.in create mode 100644 imgui/src/stb_image.cpp diff --git a/googletest/CMakeLists.txt b/googletest/CMakeLists.txt index fdbf088ef5..e1122d3776 100644 --- a/googletest/CMakeLists.txt +++ b/googletest/CMakeLists.txt @@ -1,27 +1,21 @@ -# Download and unpack googletest at configure time -configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt) -execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download ) -if(result) - message(FATAL_ERROR "CMake step for googletest failed: ${result}") -endif() -execute_process(COMMAND ${CMAKE_COMMAND} --build . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download ) -if(result) - message(FATAL_ERROR "Build step for googletest failed: ${result}") -endif() +include(FetchContent) -# Prevent overriding the parent project's compiler/linker -# settings on Windows -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_Declare( + googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG e2239ee6043f73722e7aa812a459f54a28552929 # 1.11.0 +) -# Add googletest directly to our build. This defines -# the gtest and gtest_main targets. -add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src - ${CMAKE_CURRENT_BINARY_DIR}/googletest-build - EXCLUDE_FROM_ALL) +FetchContent_GetProperties(googletest) +if(NOT googletest_POPULATED) + FetchContent_Populate(googletest) + + # Prevent overriding the parent project's compiler/linker + # settings on Windows + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + + add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} EXCLUDE_FROM_ALL) +endif() target_compile_features(gtest PUBLIC cxx_std_20) target_compile_features(gtest_main PUBLIC cxx_std_20) diff --git a/googletest/CMakeLists.txt.in b/googletest/CMakeLists.txt.in deleted file mode 100644 index f162039234..0000000000 --- a/googletest/CMakeLists.txt.in +++ /dev/null @@ -1,15 +0,0 @@ -cmake_minimum_required(VERSION 3.3.0) - -project(googletest-download NONE) - -include(ExternalProject) -ExternalProject_Add(googletest - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG e2239ee6043f73722e7aa812a459f54a28552929 # 1.11.0 - SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-src" - BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-build" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" -) diff --git a/imgui/.styleguide b/imgui/.styleguide new file mode 100644 index 0000000000..5e97ca43ad --- /dev/null +++ b/imgui/.styleguide @@ -0,0 +1,20 @@ +cppHeaderFileInclude { + \.h$ + \.inc$ +} + +cppSrcFileInclude { + \.cpp$ +} + +modifiableFileExclude { +} + +generatedFileExclude { +} + +repoRootNameOverride { +} + +includeOtherLibs { +} diff --git a/imgui/CMakeLists.txt b/imgui/CMakeLists.txt index 6b4e9ed616..67f0ab20a9 100644 --- a/imgui/CMakeLists.txt +++ b/imgui/CMakeLists.txt @@ -1,74 +1,106 @@ -# Download and unpack imgui at configure time -configure_file(CMakeLists.txt.in imgui-download/CMakeLists.txt) +INCLUDE(FetchContent) -execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/imgui-download ) -if(result) - message(FATAL_ERROR "CMake step for imgui failed: ${result}") -endif() -execute_process(COMMAND ${CMAKE_COMMAND} --build . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/imgui-download ) -if(result) - message(FATAL_ERROR "Build step for imgui failed: ${result}") +FetchContent_Declare( + glfw3 + GIT_REPOSITORY https://github.com/glfw/glfw.git + GIT_TAG 6b57e08bb0078c9834889eab871bac2368198c15 +) +FetchContent_Declare( + gl3w + GIT_REPOSITORY https://github.com/skaslev/gl3w + GIT_TAG 5f8d7fd191ba22ff2b60c1106d7135bb9a335533 +) +FetchContent_Declare( + imgui + GIT_REPOSITORY https://github.com/ocornut/imgui.git + GIT_TAG aceab9a877de0258d19d29a5d87a51b63a8999bf +) +FetchContent_Declare( + implot + GIT_REPOSITORY https://github.com/epezent/implot.git + GIT_TAG e80e42e8b4136ddb84ccfe04fa28d0c745828952 +) +FetchContent_Declare( + fonts + URL https://github.com/wpilibsuite/thirdparty-fonts/releases/download/v0.1/fonts.zip + URL_HASH SHA256=0d1cc6cfc86953a676993e23adcfb259ae621f3e1cc675761a5c4457472345da +) +FetchContent_Declare( + stb + GIT_REPOSITORY https://github.com/nothings/stb.git + GIT_TAG c9064e317699d2e495f36ba4f9ac037e88ee371a +) + +FetchContent_MakeAvailable( + imgui + implot + fonts + stb +) + +# Add glfw directly to our build. +FetchContent_GetProperties(glfw3) +if(NOT glfw3_POPULATED) + FetchContent_Populate(glfw3) + set(SAVE_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}) + set(BUILD_SHARED_LIBS OFF) + set(GLFW_INSTALL OFF) + add_subdirectory(${glfw3_SOURCE_DIR} ${glfw3_BINARY_DIR} EXCLUDE_FROM_ALL) + set_property(TARGET glfw PROPERTY POSITION_INDEPENDENT_CODE ON) + set(BUILD_SHARED_LIBS ${SAVE_BUILD_SHARED_LIBS}) endif() -# Build font -add_executable(imgui_font_bin2c ${CMAKE_CURRENT_BINARY_DIR}/imgui-src/misc/fonts/binary_to_compressed_c.cpp) -add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ProggyDotted.inc - COMMAND imgui_font_bin2c - ARGS "${CMAKE_CURRENT_BINARY_DIR}/proggyfonts-src/ProggyDotted/ProggyDotted Regular.ttf" ProggyDotted > ${CMAKE_CURRENT_BINARY_DIR}/ProggyDotted.inc - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - MAIN_DEPENDENCY "${CMAKE_CURRENT_BINARY_DIR}/proggyfonts-src/ProggyDotted/ProggyDotted Regular.ttf" - VERBATIM -) -file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/imgui_ProggyDotted.cpp - CONTENT "#include \"imgui_ProggyDotted.h\"\n#include \"ProggyDotted.inc\"\nImFont* ImGui::AddFontProggyDotted(ImGuiIO& io, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges) {\n return io.Fonts->AddFontFromMemoryCompressedTTF(ProggyDotted_compressed_data, ProggyDotted_compressed_size, size_pixels, font_cfg, glyph_ranges);\n}\n" -) -file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/imgui_ProggyDotted.h - CONTENT "#pragma once\n#include \"imgui.h\"\nnamespace ImGui {\nImFont* AddFontProggyDotted(ImGuiIO& io, float size_pixels, const ImFontConfig* font_cfg = nullptr, const ImWchar* glyph_ranges = nullptr);\n}\n" -) -set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/imgui_ProggyDotted.cpp - PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ProggyDotted.inc) - -# stb_image -file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/stb_image.cpp - CONTENT "#define STBI_WINDOWS_UTF8\n#define STB_IMAGE_IMPLEMENTATION\n#include \"stb_image.h\"\n" -) +# Don't use gl3w CMakeLists.txt due to https://github.com/skaslev/gl3w/issues/66 +FetchContent_GetProperties(gl3w) +if(NOT gl3w_POPULATED) + FetchContent_Populate(gl3w) +endif() +if(NOT EXISTS "${gl3w_BINARY_DIR}/src/gl3w.c") + find_package(Python COMPONENTS Interpreter Development REQUIRED) + execute_process( + COMMAND "${Python_EXECUTABLE}" ${gl3w_SOURCE_DIR}/gl3w_gen.py "--root=${gl3w_BINARY_DIR}" + WORKING_DIRECTORY ${gl3w_BINARY_DIR} + ) +endif() # Add imgui directly to our build. -set(SAVE_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}) -set(BUILD_SHARED_LIBS OFF) -set(GLFW_INSTALL OFF) -add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/glfw-src - ${CMAKE_CURRENT_BINARY_DIR}/glfw-build - EXCLUDE_FROM_ALL) -set_property(TARGET glfw PROPERTY POSITION_INDEPENDENT_CODE ON) -set(BUILD_SHARED_LIBS ${SAVE_BUILD_SHARED_LIBS}) -add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/gl3w-src - ${CMAKE_CURRENT_BINARY_DIR}/gl3w-build - EXCLUDE_FROM_ALL) - -set(imgui_srcdir ${CMAKE_CURRENT_BINARY_DIR}/imgui-src) -file(GLOB imgui_sources ${imgui_srcdir}/*.cpp ${imgui_srcdir}/misc/cpp/*.cpp) -set(implot_srcdir ${CMAKE_CURRENT_BINARY_DIR}/implot-src) -file(GLOB implot_sources ${implot_srcdir}/*.cpp) -add_library(imgui STATIC ${imgui_sources} ${implot_sources} ${imgui_srcdir}/backends/imgui_impl_glfw.cpp ${imgui_srcdir}/backends/imgui_impl_opengl3.cpp ${CMAKE_CURRENT_BINARY_DIR}/imgui_ProggyDotted.cpp ${CMAKE_CURRENT_BINARY_DIR}/stb_image.cpp) +file(GLOB imgui_sources ${imgui_SOURCE_DIR}/*.cpp ${imgui_SOURCE_DIR}/misc/cpp/*.cpp) +file(GLOB implot_sources ${implot_SOURCE_DIR}/*.cpp) +file(GLOB fonts_sources ${fonts_SOURCE_DIR}/src/*.cpp) +add_library(imgui STATIC + ${imgui_sources} + ${implot_sources} + ${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp + ${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp + ${gl3w_BINARY_DIR}/src/gl3w.c + ${fonts_sources} + src/stb_image.cpp +) target_compile_definitions(imgui PUBLIC IMGUI_IMPL_OPENGL_LOADER_GL3W) if (MSVC) - target_sources(imgui PRIVATE ${imgui_srcdir}/backends/imgui_impl_dx11.cpp) + target_sources(imgui PRIVATE ${imgui_SOURCE_DIR}/backends/imgui_impl_dx11.cpp) else() if (APPLE) target_compile_options(imgui PRIVATE -fobjc-arc) set_target_properties(imgui PROPERTIES LINK_FLAGS "-framework Metal -framework QuartzCore") - target_sources(imgui PRIVATE ${imgui_srcdir}/backends/imgui_impl_metal.mm) + target_sources(imgui PRIVATE ${imgui_SOURCE_DIR}/backends/imgui_impl_metal.mm) else() - #target_sources(imgui PRIVATE ${imgui_srcdir}/backends/imgui_impl_opengl3.cpp) + #target_sources(imgui PRIVATE ${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp) endif() endif() -target_link_libraries(imgui PUBLIC gl3w glfw) -target_include_directories(imgui PUBLIC "$" "$" "$" "$" "$" "$") +target_link_libraries(imgui PUBLIC glfw) +target_include_directories(imgui + PUBLIC + "$" + "$" + "$" + "$" + "$" + "$" + "$" + PRIVATE + "$" +) set_property(TARGET imgui PROPERTY POSITION_INDEPENDENT_CODE ON) target_compile_features(imgui PUBLIC cxx_std_20) diff --git a/imgui/CMakeLists.txt.in b/imgui/CMakeLists.txt.in deleted file mode 100644 index ef07637839..0000000000 --- a/imgui/CMakeLists.txt.in +++ /dev/null @@ -1,63 +0,0 @@ -cmake_minimum_required(VERSION 3.3.0) - -project(imgui-download NONE) - -include(ExternalProject) -ExternalProject_Add(glfw3 - GIT_REPOSITORY https://github.com/glfw/glfw.git - GIT_TAG 6b57e08bb0078c9834889eab871bac2368198c15 - SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/glfw-src" - BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/glfw-build" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" -) -ExternalProject_Add(gl3w - GIT_REPOSITORY https://github.com/skaslev/gl3w - GIT_TAG 5f8d7fd191ba22ff2b60c1106d7135bb9a335533 - SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/gl3w-src" - BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/gl3w-build" - INSTALL_COMMAND "" - TEST_COMMAND "" -) -ExternalProject_Add(imgui - GIT_REPOSITORY https://github.com/ocornut/imgui.git - GIT_TAG aceab9a877de0258d19d29a5d87a51b63a8999bf - SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/imgui-src" - BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/imgui-build" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" -) -ExternalProject_Add(implot - GIT_REPOSITORY https://github.com/epezent/implot.git - GIT_TAG e80e42e8b4136ddb84ccfe04fa28d0c745828952 - SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/implot-src" - BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/implot-build" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" -) -ExternalProject_Add(proggyfonts - GIT_REPOSITORY https://github.com/bluescan/proggyfonts.git - GIT_TAG v1.1.5 - SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/proggyfonts-src" - BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/proggyfonts-build" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" -) -ExternalProject_Add(stb - GIT_REPOSITORY https://github.com/nothings/stb.git - GIT_TAG c9064e317699d2e495f36ba4f9ac037e88ee371a - SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/stb-src" - BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/stb-build" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" -) diff --git a/imgui/src/stb_image.cpp b/imgui/src/stb_image.cpp new file mode 100644 index 0000000000..92a60b19e0 --- /dev/null +++ b/imgui/src/stb_image.cpp @@ -0,0 +1,7 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +#define STBI_WINDOWS_UTF8 +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h"