
Today I learned that CMake will error if the project shares a dependency with a nested CMake file (which could be from an entirely-separate project that you have no control over). I'm starting to really hate CMake.
117 lines
3.6 KiB
CMake
117 lines
3.6 KiB
CMake
cmake_minimum_required(VERSION 3.12)
|
|
|
|
option(PKG_CONFIG_STATIC_LIBS "On platforms with pkg-config, static-link the dependencies (good for Windows builds, so you don't need to bundle DLL files)" OFF)
|
|
option(MSVC_LINK_STATIC_RUNTIME "Link the static MSVC runtime library (Visual Studio only)" OFF)
|
|
|
|
option(FORCE_LOCAL_LIBS "Compile the built-in version of GLFW3 instead of using the system-provided one" OFF)
|
|
|
|
project(DoConfig LANGUAGES C CXX)
|
|
|
|
add_executable(DoConfig WIN32
|
|
"icon.rc"
|
|
"DoConfig.cpp"
|
|
"imgui/imconfig.h"
|
|
"imgui/imgui.cpp"
|
|
"imgui/imgui.h"
|
|
"imgui/imgui_demo.cpp"
|
|
"imgui/imgui_draw.cpp"
|
|
"imgui/imgui_impl_glfw.cpp"
|
|
"imgui/imgui_impl_glfw.h"
|
|
"imgui/imgui_impl_opengl3.cpp"
|
|
"imgui/imgui_impl_opengl3.h"
|
|
"imgui/imgui_internal.h"
|
|
"imgui/imgui_widgets.cpp"
|
|
"imgui/imstb_rectpack.h"
|
|
"imgui/imstb_textedit.h"
|
|
"imgui/imstb_truetype.h"
|
|
)
|
|
|
|
set_target_properties(DoConfig PROPERTIES
|
|
C_STANDARD 90
|
|
C_STANDARD_REQUIRED ON
|
|
C_EXTENSIONS OFF
|
|
CXX_STANDARD 98
|
|
CXX_STANDARD_REQUIRED ON
|
|
CXX_EXTENSIONS OFF
|
|
)
|
|
|
|
target_link_libraries(DoConfig PRIVATE ${CMAKE_DL_LIBS})
|
|
|
|
target_include_directories(DoConfig PRIVATE "../external/glad/include")
|
|
target_compile_definitions(DoConfig PRIVATE IMGUI_IMPL_OPENGL_LOADER_GLAD)
|
|
|
|
if(PKG_CONFIG_STATIC_LIBS)
|
|
target_link_options(DoConfig PRIVATE "-static")
|
|
endif()
|
|
|
|
if(MSVC)
|
|
# Disable warnings that normally fire up on MSVC when using "unsafe" functions instead of using MSVC's "safe" _s functions
|
|
target_compile_definitions(DoConfig PRIVATE _CRT_SECURE_NO_WARNINGS)
|
|
|
|
# Use `main` instead of `WinMain`
|
|
set_target_properties(DoConfig PROPERTIES LINK_FLAGS "/ENTRY:mainCRTStartup")
|
|
|
|
# This is messy as hell, and has been replaced by CMAKE_MSVC_RUNTIME_LIBRARY,
|
|
# but that's a very recent CMake addition, so we're still doing it this way for now
|
|
if(MSVC_LINK_STATIC_RUNTIME)
|
|
# Statically-link the CRT (vcpkg static libs do this)
|
|
foreach(flag_var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
|
if(${flag_var} MATCHES "/MD")
|
|
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
endif()
|
|
|
|
|
|
################
|
|
# Dependencies #
|
|
################
|
|
|
|
# glad
|
|
|
|
if(NOT TARGET glad)
|
|
add_subdirectory("../external/glad" "glad" EXCLUDE_FROM_ALL)
|
|
endif()
|
|
|
|
target_link_libraries(DoConfig PRIVATE glad)
|
|
|
|
# GLFW3
|
|
|
|
if(NOT FORCE_LOCAL_LIBS)
|
|
find_package(PkgConfig QUIET)
|
|
endif()
|
|
|
|
if(NOT FORCE_LOCAL_LIBS)
|
|
find_package(glfw3)
|
|
|
|
if (PKG_CONFIG_FOUND)
|
|
pkg_check_modules(glfw3 QUIET IMPORTED_TARGET glfw3)
|
|
endif()
|
|
endif()
|
|
|
|
if(TARGET PkgConfig::glfw3)
|
|
# pkg-config
|
|
if (PKG_CONFIG_STATIC_LIBS)
|
|
message(STATUS "Using system GLFW3 (pkg-config, static)")
|
|
target_compile_options(DoConfig PRIVATE ${glfw3_STATIC_CFLAGS})
|
|
target_link_libraries(DoConfig PRIVATE ${glfw3_STATIC_LINK_LIBRARIES})
|
|
else()
|
|
message(STATUS "Using system GLFW3 (pkg-config, dynamic)")
|
|
target_compile_options(DoConfig PRIVATE ${glfw3_CFLAGS})
|
|
target_link_libraries(DoConfig PRIVATE ${glfw3_LINK_LIBRARIES})
|
|
endif()
|
|
elseif(TARGET glfw)
|
|
# CMake
|
|
message(STATUS "Using system GLFW3 (CMake)")
|
|
target_link_libraries(DoConfig PRIVATE glfw)
|
|
else()
|
|
# Compile it ourselves
|
|
message(STATUS "Using local GLFW3")
|
|
set(GLFW_BUILD_EXAMPLES OFF CACHE INTERNAL "" FORCE)
|
|
set(GLFW_BUILD_TESTS OFF CACHE INTERNAL "" FORCE)
|
|
set(GLFW_BUILD_DOCS OFF CACHE INTERNAL "" FORCE)
|
|
set(GLFW_INSTALL OFF CACHE INTERNAL "" FORCE)
|
|
add_subdirectory("../external/glfw" "glfw" EXCLUDE_FROM_ALL)
|
|
target_link_libraries(DoConfig PRIVATE glfw)
|
|
endif()
|