mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-25 23:29:55 -06:00
another UI attempt, I guess.
sorry.
This commit is contained in:
219
src/libui_sdl/libui/CMakeLists.txt
Normal file
219
src/libui_sdl/libui/CMakeLists.txt
Normal file
@ -0,0 +1,219 @@
|
||||
# 3 june 2016
|
||||
# see https://cmake.org/gitweb?p=cmake.git;a=commit;h=95cdf132489c79e88a10fdf7a7566fa002c7680b (thanks ngladitz in irc.freenode.net/#cmake)
|
||||
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
|
||||
|
||||
# TODOs
|
||||
# - silence entering/leaving messages?
|
||||
# - uname -s for more refined OS control
|
||||
# - Haiku for haiku
|
||||
# - debian DESTDIR? https://github.com/andlabs/libui/pull/10
|
||||
# - libui-combined* needs to be deleted so that custom command can run every time
|
||||
# - add notelemetry.obj to *ALL TARGETS* on VS2015 and up - https://www.infoq.com/news/2016/06/visual-cpp-telemetry
|
||||
# - switch to 3.1.0 features
|
||||
|
||||
# the docs say we need to set this up prior to project()
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.8")
|
||||
|
||||
# we want to disable incremental linking
|
||||
# see also:
|
||||
# - https://github.com/bulletphysics/bullet3/blob/master/CMakeLists.txt#L43
|
||||
# - https://cmake.org/pipermail/cmake/2010-February/035174.html
|
||||
# this must also go before project()
|
||||
set(MSVC_INCREMENTAL_DEFAULT ON)
|
||||
|
||||
# default to debug builds
|
||||
# do this before project() just to be safe
|
||||
if(NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE DEBUG CACHE STRING "" FORCE)
|
||||
endif()
|
||||
|
||||
project(libui)
|
||||
option(BUILD_SHARED_LIBS "Whether to build libui as a shared library or a static library" ON)
|
||||
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/out")
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/out")
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/out")
|
||||
set(CMAKE_PDB_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/out")
|
||||
|
||||
if(APPLE)
|
||||
set(_OSNAME darwin)
|
||||
set(_HASVERSION TRUE)
|
||||
set(_VERSION "A")
|
||||
|
||||
# always use our rpath
|
||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
||||
# the / is required by some older versions of OS X
|
||||
set(CMAKE_INSTALL_RPATH "@executable_path/")
|
||||
set(CMAKE_MACOSX_RPATH TRUE)
|
||||
elseif(WIN32)
|
||||
set(_OSNAME windows)
|
||||
|
||||
# and don't include the default libraries with ANY of the builds
|
||||
# note the CACHE FORCE stuff is required here
|
||||
set(CMAKE_C_STANDARD_LIBRARIES CACHE STRING "" FORCE)
|
||||
set(CMAKE_CXX_STANDARD_LIBRARIES CACHE STRING "" FORCE)
|
||||
else()
|
||||
set(_OSNAME unix)
|
||||
set(_HASVERSION TRUE)
|
||||
set(_VERSION "0")
|
||||
|
||||
# always use our rpath
|
||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
||||
set(CMAKE_INSTALL_RPATH "\$ORIGIN")
|
||||
endif()
|
||||
|
||||
# common flags
|
||||
if(MSVC)
|
||||
# TODO subsystem version
|
||||
|
||||
# TODO /Wall does too much
|
||||
# TODO -Wno-switch equivalent
|
||||
# TODO /sdl turns C4996 into an ERROR
|
||||
# don't use /analyze; that requires us to write annotations everywhere
|
||||
# TODO undecided flags from qo?
|
||||
# /RTCc is not supplied because it's discouraged as of VS2015; see https://www.reddit.com/r/cpp/comments/46mhne/rtcc_rejects_conformant_code_with_visual_c_2015/d06auq5
|
||||
# /EHsc is to shut the compiler up in some cases
|
||||
# TODO make /EHsc C++-only
|
||||
set(_COMMON_CFLAGS
|
||||
/W4 /wd4100
|
||||
/bigobj /nologo
|
||||
/RTC1 /RTCs /RTCu
|
||||
/EHsc
|
||||
)
|
||||
|
||||
# note the /MANIFEST:NO (which must be / and uppercase); thanks FraGag (https://github.com/andlabs/libui/issues/93#issuecomment-223183436)
|
||||
# TODO warnings on undefined symbols
|
||||
set(_COMMON_LDFLAGS
|
||||
/LARGEADDRESSAWARE
|
||||
/NOLOGO
|
||||
/INCREMENTAL:NO
|
||||
/MANIFEST:NO
|
||||
)
|
||||
|
||||
# TODO autogenerate a .def file?
|
||||
|
||||
# more incremental linking fixes
|
||||
# TODO actually get rid of incremental linking here
|
||||
else()
|
||||
set(_COMMON_CFLAGS
|
||||
-Wall -Wextra -pedantic
|
||||
-Wno-unused-parameter
|
||||
-Wno-switch
|
||||
-fvisibility=hidden
|
||||
)
|
||||
# don't use C_VERSION or CXX_VERSION because they use GNU standards
|
||||
# TODO we can actually do this; set both C_EXTENSIONS and CXX_EXTENSIONS to OFF
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --std=c99")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11")
|
||||
|
||||
set(_COMMON_LDFLAGS
|
||||
-fvisibility=hidden
|
||||
)
|
||||
|
||||
# don't require shipping the MinGW-w64 DLLs
|
||||
if(WIN32)
|
||||
list(APPEND _COMMON_LDFLAGS
|
||||
-static
|
||||
-static-libgcc
|
||||
-static-libstdc++
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# problem:
|
||||
# - target_link_libraries() only supports - for flags
|
||||
# - but cmake only doesn't generate the manifest if the flag has a /
|
||||
macro(_target_link_options_private _target)
|
||||
foreach(_opt IN LISTS ${ARGN})
|
||||
set_property(TARGET ${_target} APPEND_STRING PROPERTY
|
||||
LINK_FLAGS " ${_opt}")
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
add_subdirectory("common")
|
||||
add_subdirectory("${_OSNAME}")
|
||||
add_library(${_LIBUINAME} ${_LIBUI_SOURCES})
|
||||
target_include_directories(${_LIBUINAME}
|
||||
PUBLIC .
|
||||
PRIVATE ${_LIBUI_INCLUEDIRS})
|
||||
target_compile_definitions(${_LIBUINAME}
|
||||
PRIVATE ${_LIBUI_DEFS})
|
||||
# cmake produces this for us by default but only for shared libraries
|
||||
target_compile_definitions(${_LIBUINAME}
|
||||
PRIVATE libui_EXPORTS)
|
||||
target_compile_options(${_LIBUINAME}
|
||||
PUBLIC ${_COMMON_CFLAGS}
|
||||
PRIVATE ${_LIBUI_CFLAGS})
|
||||
# TODO link directories?
|
||||
if(BUILD_SHARED_LIBS)
|
||||
target_link_libraries(${_LIBUINAME}
|
||||
PRIVATE ${_LIBUI_LIBS})
|
||||
endif()
|
||||
# TODO INTERFACE libs don't inherit to grandhcildren?
|
||||
# on Windows the linker for static libraries is different; don't give it the flags
|
||||
if(BUILD_SHARED_LIBS)
|
||||
_target_link_options_private(${_LIBUINAME}
|
||||
_COMMON_LDFLAGS
|
||||
_LIBUI_LDFLAGS)
|
||||
endif()
|
||||
if(NOT BUILD_SHARED_LIBS)
|
||||
_handle_static()
|
||||
# TODO figure out a way to tell libui that it's static
|
||||
target_compile_definitions(${_LIBUINAME}
|
||||
PUBLIC _UI_STATIC)
|
||||
endif()
|
||||
if(NOT MSVC)
|
||||
# on non-MSVC compilers cmake adds an extra lib-
|
||||
# note that we apply this to libui, not to any intermediates
|
||||
set_target_properties(libui PROPERTIES
|
||||
OUTPUT_NAME ui)
|
||||
|
||||
# flags for warning on undefined symbols
|
||||
# TODO figure out why FreeBSD follows linked libraries here
|
||||
# TODO figure out MSVC equivalents
|
||||
if(BUILD_SHARED_LIBS)
|
||||
if(NOT (${CMAKE_SYSTEM_NAME} STREQUAL FreeBSD))
|
||||
# on OS X we don't need to do this; Apple's linker warns about undefined symbols in -shared builds!
|
||||
if(NOT APPLE)
|
||||
target_link_libraries(libui
|
||||
PRIVATE -Wl,--no-undefined -Wl,--no-allow-shlib-undefined
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
if(BUILD_SHARED_LIBS)
|
||||
if(_HASVERSION)
|
||||
set_target_properties(${_LIBUINAME} PROPERTIES
|
||||
SOVERSION "${_VERSION}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
macro(_add_exec _name)
|
||||
add_executable(${_name}
|
||||
WIN32 EXCLUDE_FROM_ALL
|
||||
${ARGN})
|
||||
target_link_libraries(${_name} libui ${_LIBUI_STATIC_RES})
|
||||
_target_link_options_private(${_name}
|
||||
_COMMON_LDFLAGS)
|
||||
# make shared-linked executables PIC too
|
||||
if(BUILD_SHARED_LIBS)
|
||||
set_property(TARGET ${_name} PROPERTY
|
||||
POSITION_INDEPENDENT_CODE True)
|
||||
endif()
|
||||
# TODO see above about INTERFACE
|
||||
if(NOT BUILD_SHARED_LIBS)
|
||||
target_link_libraries(${_name}
|
||||
${_LIBUI_LIBS})
|
||||
endif()
|
||||
|
||||
# TODOfor some reason these don't propagate
|
||||
if(NOT WIN32)
|
||||
target_include_directories(${_name}
|
||||
PUBLIC .)
|
||||
target_compile_options(${_name}
|
||||
PUBLIC ${_COMMON_CFLAGS})
|
||||
endif()
|
||||
endmacro()
|
||||
add_subdirectory("test")
|
||||
add_subdirectory("examples")
|
Reference in New Issue
Block a user