aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/CMakeLists.txt
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-09-09 02:30:51 +0200
committerStapleButter <thetotalworm@gmail.com>2017-09-09 02:30:51 +0200
commit70e4841d311d68689724768157cc9cbfbde7a9fc (patch)
treeba9499f77d1258530a7e60aa6e1732c41d98161c /src/libui_sdl/libui/CMakeLists.txt
parent81747d6c34eb159481a6ca3f283d065fa3568617 (diff)
another UI attempt, I guess.
sorry.
Diffstat (limited to 'src/libui_sdl/libui/CMakeLists.txt')
-rw-r--r--src/libui_sdl/libui/CMakeLists.txt219
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")