diff options
author | StapleButter <thetotalworm@gmail.com> | 2017-09-09 02:30:51 +0200 |
---|---|---|
committer | StapleButter <thetotalworm@gmail.com> | 2017-09-09 02:30:51 +0200 |
commit | 70e4841d311d68689724768157cc9cbfbde7a9fc (patch) | |
tree | ba9499f77d1258530a7e60aa6e1732c41d98161c /src/libui_sdl/libui/CMakeLists.txt | |
parent | 81747d6c34eb159481a6ca3f283d065fa3568617 (diff) |
another UI attempt, I guess.
sorry.
Diffstat (limited to 'src/libui_sdl/libui/CMakeLists.txt')
-rw-r--r-- | src/libui_sdl/libui/CMakeLists.txt | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/CMakeLists.txt b/src/libui_sdl/libui/CMakeLists.txt new file mode 100644 index 0000000..eb1696d --- /dev/null +++ b/src/libui_sdl/libui/CMakeLists.txt @@ -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") |