cmake_minimum_required (VERSION 2.8.12) if (POLICY CMP0048) # cmake warns if loaded from a min-3.0-required parent dir, so silence the warning: cmake_policy(SET CMP0048 NEW) endif() project("NanoGUI") if (POLICY CMP0058) cmake_policy(SET CMP0058 NEW) endif() if (NOT IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw/src") message(FATAL_ERROR "The NanoGUI dependency repositories (GLFW, etc.) are missing! " "You probably did not clone the project with --recursive. It is possible to recover " "by calling \"git submodule update --init --recursive\"") endif() if (WIN32) set(NANOGUI_USE_GLAD_DEFAULT ON) else() set(NANOGUI_USE_GLAD_DEFAULT OFF) endif() option(NANOGUI_BUILD_EXAMPLE "Build NanoGUI example application?" ON) option(NANOGUI_BUILD_SHARED "Build NanoGUI as a shared library?" ON) option(NANOGUI_BUILD_PYTHON "Build a Python plugin for NanoGUI?" ON) option(NANOGUI_USE_GLAD "Use Glad OpenGL loader library?" ${NANOGUI_USE_GLAD_DEFAULT}) option(NANOGUI_INSTALL "Install NanoGUI on `make install`?" ON) set(NANOGUI_PYTHON_VERSION "" CACHE STRING "Python version to use for compiling the Python plugin") # Required libraries, flags, and include files for compiling and linking against nanogui (all targets) set(NANOGUI_EXTRA_LIBS "") set(NANOGUI_EXTRA_DEFS "") set(NANOGUI_EXTRA_INCS "") # Platform-dependent files for libnanogui set(LIBNANOGUI_EXTRA_SOURCE "") set(LIBNANOGUI_PYTHON_EXTRA_SOURCE "") if(APPLE AND NANOGUI_BUILD_SHARED) set(CMAKE_MACOSX_RPATH ON) endif() include(CheckCXXCompilerFlag) include(CheckCXXSourceRuns) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to 'Release' as none was specified.") set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE) macro(CHECK_CXX_COMPILER_AND_LINKER_FLAGS _RESULT _CXX_FLAGS _LINKER_FLAGS) set(CMAKE_REQUIRED_FLAGS ${_CXX_FLAGS}) set(CMAKE_REQUIRED_LIBRARIES ${_LINKER_FLAGS}) set(CMAKE_REQUIRED_QUIET TRUE) check_cxx_source_runs("int main(int argc, char **argv) { return 0; }" ${_RESULT}) set(CMAKE_REQUIRED_FLAGS "") set(CMAKE_REQUIRED_LIBRARIES "") endmacro() # Compile GLFW set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL " " FORCE) set(GLFW_BUILD_TESTS OFF CACHE BOOL " " FORCE) set(GLFW_BUILD_DOCS OFF CACHE BOOL " " FORCE) set(GLFW_BUILD_INSTALL OFF CACHE BOOL " " FORCE) set(GLFW_INSTALL OFF CACHE BOOL " " FORCE) set(GLFW_USE_CHDIR OFF CACHE BOOL " " FORCE) set(BUILD_SHARED_LIBS ${NANOGUI_BUILD_SHARED} CACHE BOOL " " FORCE) if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") # Quench annoying deprecation warnings when compiling GLFW on OSX set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations") endif() add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw" "ext_build/glfw") # Two targets have now been defined: `glfw_objects`, which will be merged into # NanoGUI at the end, and `glfw`. The `glfw` target is the library itself # (e.g., libglfw.so), but can be skipped as we do not need to link against it # (because we merge `glfw_objects` into NanoGUI). Skipping is required for # XCode, but preferable for all build systems (reduces build artifacts). set_target_properties(glfw PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) # Python support: add NANOGUI_PYTHON flag to all targets if (NANOGUI_BUILD_PYTHON) list(APPEND NANOGUI_EXTRA_DEFS -DNANOGUI_PYTHON) endif() # Shared library mode: add dllimport/dllexport flags to all symbols if (NANOGUI_BUILD_SHARED) list(APPEND NANOGUI_EXTRA_DEFS -DNANOGUI_SHARED -DNVG_SHARED -DGLAD_GLAPI_EXPORT) endif() if (MSVC) # Disable annoying MSVC warnings (all targets) add_definitions(/D "_CRT_SECURE_NO_WARNINGS") # Parallel build on MSVC (all targets) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") if (NOT CMAKE_SIZEOF_VOID_P EQUAL 8) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2") # Disable Eigen vectorization for Windows 32 bit builds (issues with unaligned access segfaults) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DNANOGUI_EIGEN_DONT_ALIGN") endif() endif() # Compile with compiler warnings turned on if(MSVC) if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") endif() elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") endif() if (CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|Intel)$") CHECK_CXX_COMPILER_FLAG("-std=c++14" HAS_CPP14_FLAG) CHECK_CXX_COMPILER_FLAG("-std=c++11" HAS_CPP11_FLAG) if (HAS_CPP14_FLAG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") elseif (HAS_CPP11_FLAG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") else() message(FATAL_ERROR "Unsupported compiler -- pybind11 requires C++11 support!") endif() endif() # Various optimizations for shared library release builds if (NANOGUI_BUILD_SHARED) if (U_CMAKE_BUILD_TYPE MATCHES REL AND CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang)$") # Set the default symbol visibility to hidden if (NOT CMAKE_CXX_FLAGS MATCHES "-fvisibility") set(CMAKE_CXX_FLAGS "-fvisibility=hidden ${CMAKE_CXX_FLAGS}") endif() # Enable link time optimization if (NOT CMAKE_CXX_FLAGS MATCHES "-flto") if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(LTO_CXX_FLAGS "-flto=thin") set(LTO_LINKER_FLAGS "-flto=thin") if (NOT APPLE AND U_CMAKE_BUILD_TYPE MATCHES MINSIZEREL) # Clang Gold plugin does not support -Os set(LTO_CXX_FLAGS "${LTO_CXX_FLAGS} -O3") endif() else() set(LTO_CXX_FLAGS "-flto -fno-fat-lto-objects") set(LTO_LINKER_FLAGS "-flto") endif() CHECK_CXX_COMPILER_AND_LINKER_FLAGS(HAS_LTO ${LTO_CXX_FLAGS} ${LTO_LINKER_FLAGS}) if (HAS_LTO) message(STATUS "NanoGUI: LTO support enabled.") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LTO_LINKER_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LTO_LINKER_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LTO_CXX_FLAGS}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LTO_CXX_FLAGS}") else() message(STATUS "NanoGUI: LTO not supported by the compiler.") endif() endif() elseif(MSVC) set(Configurations RELEASE RELWITHDEBINFO MINSIZEREL) set(LinkTypes EXE SHARED MODULE STATIC) foreach(Configuration ${Configurations}) set("CMAKE_CXX_FLAGS_${Configuration}" "${CMAKE_CXX_FLAGS_${Configuration}} /GL") foreach(LinkType ${LinkTypes}) set("CMAKE_${LinkType}_LINKER_FLAGS_${Configuration}" "${CMAKE_${LinkType}_LINKER_FLAGS_${Configuration}} /LTCG") endforeach() endforeach() message(STATUS "NanoGUI: LTO support enabled.") endif() endif() # Always use libc++ on Clang if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") CHECK_CXX_COMPILER_AND_LINKER_FLAGS(HAS_LIBCPP "-stdlib=libc++" "-stdlib=libc++") if (HAS_LIBCPP) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -stdlib=libc++") CHECK_CXX_COMPILER_AND_LINKER_FLAGS(HAS_LIBCPPABI "-stdlib=libc++" "-stdlib=libc++ -lc++abi") if(HAS_LIBCPPABI) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lc++abi") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -lc++abi") message(STATUS "NanoGUI: using libc++ and libc++abi.") else() message(STATUS "NanoGUI: using libc++.") endif() else() message(STATUS "NanoGUI: NOT using libc++.") endif() endif() if (NANOGUI_USE_GLAD) # Build and include GLAD on Windows list(APPEND LIBNANOGUI_EXTRA_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/ext/glad/src/glad.c" "${CMAKE_CURRENT_SOURCE_DIR}/ext/glad/include/glad/glad.h" "${CMAKE_CURRENT_SOURCE_DIR}/ext/glad/include/KHR/khrplatform.h") if (MSVC) set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/ext/glad/src/glad.c" PROPERTIES COMPILE_FLAGS "/wd4055 ") endif() include_directories(ext/glad/include) list(APPEND NANOGUI_EXTRA_DEFS -DNANOGUI_GLAD) list(APPEND NANOGUI_EXTRA_INCS "${CMAKE_CURRENT_SOURCE_DIR}/ext/glad/include") endif() list(APPEND NANOGUI_EXTRA_INCS "${CMAKE_CURRENT_SOURCE_DIR}/ext/glfw/include" "${CMAKE_CURRENT_SOURCE_DIR}/ext/nanovg/src" ) if (NOT NANOGUI_EIGEN_INCLUDE_DIR) set(NANOGUI_EIGEN_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ext/eigen") list(APPEND NANOGUI_EXTRA_INCS "${NANOGUI_EIGEN_INCLUDE_DIR}") endif() if (${CMAKE_SYSTEM_NAME} MATCHES "BSD") include_directories(/usr/local/include) link_directories(/usr/local/lib) if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") include_directories(/usr/X11R6/include/) link_directories(/usr/X11R6/lib) endif() endif() # Required core libraries on various platforms if (WIN32) list(APPEND NANOGUI_EXTRA_LIBS opengl32) elseif (APPLE) find_library(cocoa_library Cocoa) find_library(opengl_library OpenGL) find_library(corevideo_library CoreVideo) find_library(iokit_library IOKit) list(APPEND NANOGUI_EXTRA_LIBS ${cocoa_library} ${opengl_library} ${corevideo_library} ${iokit_library}) list(APPEND LIBNANOGUI_EXTRA_SOURCE src/darwin.mm) elseif(CMAKE_SYSTEM MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "BSD") list(APPEND NANOGUI_EXTRA_LIBS GL Xxf86vm Xrandr Xinerama Xcursor Xi X11 pthread ) if (NOT CMAKE_SYSTEM_NAME MATCHES "OpenBSD") list(APPEND NANOGUI_EXTRA_LIBS rt) endif() if(CMAKE_SYSTEM MATCHES "Linux") list(APPEND NANOGUI_EXTRA_LIBS dl) endif() endif() include_directories(${NANOGUI_EIGEN_INCLUDE_DIR} ext/glfw/include ext/nanovg/src include ${CMAKE_CURRENT_BINARY_DIR}) # Run simple cmake converter to put font files into the data segment # Glob up resource files file(GLOB resources "${CMAKE_CURRENT_SOURCE_DIR}/resources/*.ttf") # Concatenate resource files into a comma separated string string (REGEX REPLACE "([^\\]|^);" "\\1," resources_string "${resources}") string (REGEX REPLACE "[\\](.)" "\\1" resources_string "${resources_string}") # Create command line for running bin2c cmake script set(bin2c_cmdline -DOUTPUT_C=nanogui_resources.cpp -DOUTPUT_H=nanogui_resources.h "-DINPUT_FILES=${resources_string}" -P "${CMAKE_CURRENT_SOURCE_DIR}/resources/bin2c.cmake") # Run bin2c on resource files add_custom_command( OUTPUT nanogui_resources.cpp nanogui_resources.h COMMAND ${CMAKE_COMMAND} ARGS ${bin2c_cmdline} DEPENDS ${resources} COMMENT "Running bin2c" PRE_BUILD VERBATIM) # Needed to generated files include_directories(${CMAKE_CURRENT_BINARY_DIR}) # Set library type if (NANOGUI_BUILD_SHARED) set(NANOGUI_LIBRARY_TYPE "SHARED") else() set(NANOGUI_LIBRARY_TYPE "STATIC") endif() if (APPLE OR CMAKE_SYSTEM MATCHES "Linux") # Include coroutine support for running the mainloop in detached mode add_definitions(-DCORO_SJLJ) include_directories(ext/coro) list(APPEND LIBNANOGUI_PYTHON_EXTRA_SOURCE ext/coro/coro.c) endif() if (APPLE) # Use automatic reference counting for Objective-C portions add_compile_options(-fobjc-arc) endif() add_definitions(${NANOGUI_EXTRA_DEFS}) # Compile main NanoGUI library add_library(nanogui-obj OBJECT # Merge NanoVG into the NanoGUI library ext/nanovg/src/nanovg.c # Merge GLAD into the NanoGUI library (only if needed) ${LIBNANOGUI_EXTRA_SOURCE} # Fonts etc. nanogui_resources.cpp include/nanogui/glutil.h src/glutil.cpp include/nanogui/common.h src/common.cpp include/nanogui/widget.h src/widget.cpp include/nanogui/theme.h src/theme.cpp include/nanogui/layout.h src/layout.cpp include/nanogui/screen.h src/screen.cpp include/nanogui/label.h src/label.cpp include/nanogui/window.h src/window.cpp include/nanogui/popup.h src/popup.cpp include/nanogui/checkbox.h src/checkbox.cpp include/nanogui/button.h src/button.cpp include/nanogui/popupbutton.h src/popupbutton.cpp include/nanogui/combobox.h src/combobox.cpp include/nanogui/progressbar.h src/progressbar.cpp include/nanogui/slider.h src/slider.cpp include/nanogui/messagedialog.h src/messagedialog.cpp include/nanogui/textbox.h src/textbox.cpp include/nanogui/imagepanel.h src/imagepanel.cpp include/nanogui/imageview.h src/imageview.cpp include/nanogui/vscrollpanel.h src/vscrollpanel.cpp include/nanogui/colorwheel.h src/colorwheel.cpp include/nanogui/colorpicker.h src/colorpicker.cpp include/nanogui/graph.h src/graph.cpp include/nanogui/stackedwidget.h src/stackedwidget.cpp include/nanogui/tabheader.h src/tabheader.cpp include/nanogui/tabwidget.h src/tabwidget.cpp include/nanogui/glcanvas.h src/glcanvas.cpp include/nanogui/formhelper.h include/nanogui/toolbutton.h include/nanogui/opengl.h include/nanogui/nanogui.h include/nanogui/serializer/core.h include/nanogui/serializer/opengl.h include/nanogui/serializer/sparse.h src/serializer.cpp ) # XCode has a serious bug where the XCode project produces an invalid target # that will not get linked if it consists only of objects from object libraries, # it will not generate any products (executables, libraries). The only work # around is to add a dummy source file to the library definition. This is an # XCode, not a CMake bug. See: https://itk.org/Bug/view.php?id=14044 if (CMAKE_GENERATOR STREQUAL Xcode) set(XCODE_DUMMY ${CMAKE_CURRENT_BINARY_DIR}/xcode_dummy.cpp) file(WRITE ${XCODE_DUMMY} "") add_library(nanogui ${NANOGUI_LIBRARY_TYPE} ${XCODE_DUMMY} $ $ ) else() add_library(nanogui ${NANOGUI_LIBRARY_TYPE} $ $ ) endif() if (NANOGUI_BUILD_SHARED) set_property(TARGET nanogui-obj PROPERTY POSITION_INDEPENDENT_CODE ON) endif() # Compile/link flags for NanoGUI set_property(TARGET nanogui-obj APPEND PROPERTY COMPILE_DEFINITIONS "NANOGUI_BUILD;NVG_BUILD") if (NANOGUI_USE_GLAD AND NANOGUI_BUILD_SHARED) set_property(TARGET nanogui-obj APPEND PROPERTY COMPILE_DEFINITIONS "GLAD_GLAPI_EXPORT;GLAD_GLAPI_EXPORT_BUILD") endif() if (NANOGUI_BUILD_SHARED) target_link_libraries(nanogui ${NANOGUI_EXTRA_LIBS}) endif() if (NANOGUI_INSTALL) install(TARGETS nanogui LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) install(DIRECTORY include/nanogui DESTINATION include FILES_MATCHING PATTERN "*.h") endif() if (NANOGUI_BUILD_SHARED) # When GLFW is merged into the NanoGUI library, this flag must be specified set_property(TARGET nanogui-obj APPEND PROPERTY COMPILE_DEFINITIONS "_GLFW_BUILD_DLL;NVG_SHARED") endif() if (NANOGUI_BUILD_SHARED AND NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEB) # Platform-specific strip flags for reducing the library size. if (APPLE) # Strip .dylib library on OSX add_custom_command(TARGET nanogui POST_BUILD COMMAND strip -u -r "$/$") elseif(UNIX) # Strip .so library on Linux add_custom_command(TARGET nanogui POST_BUILD COMMAND strip "$/$") endif() endif() # Quench warnings while compiling NanoVG if (CMAKE_COMPILER_IS_GNUCC) set_source_files_properties(ext/nanovg/src/nanovg.c PROPERTIES COMPILE_FLAGS -Wno-unused-result) elseif(MSVC) set_source_files_properties(ext/nanovg/src/nanovg.c PROPERTIES COMPILE_FLAGS "/wd4005 /wd4456 /wd4457") endif() # Build example application if desired if(NANOGUI_BUILD_EXAMPLE) add_executable(example1 src/example1.cpp) add_executable(example2 src/example2.cpp) add_executable(example3 src/example3.cpp) add_executable(example4 src/example4.cpp) add_executable(example_icons src/example_icons.cpp) target_link_libraries(example1 nanogui ${NANOGUI_EXTRA_LIBS}) target_link_libraries(example2 nanogui ${NANOGUI_EXTRA_LIBS}) target_link_libraries(example3 nanogui ${NANOGUI_EXTRA_LIBS}) target_link_libraries(example4 nanogui ${NANOGUI_EXTRA_LIBS}) target_link_libraries(example_icons nanogui ${NANOGUI_EXTRA_LIBS}) # Copy icons for example application file(COPY resources/icons DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) endif() if (NANOGUI_BUILD_PYTHON) # Detect Python # Try to autodetect Python (can be overridden manually if needed) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/ext/pybind11/tools") set(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5 3.4) find_package(PythonLibsNew ${NANOGUI_PYTHON_VERSION}) if (NOT PYTHONLIBS_FOUND) # Python not found -- disable the plugin set(NANOGUI_BUILD_PYTHON OFF CACHE BOOL "Build a Python plugin for NanoGUI?" FORCE) message(WARNING "NanoGUI: not building the Python plugin!") else() message(STATUS "NanoGUI: building the Python plugin.") endif() endif() if (NANOGUI_BUILD_PYTHON) # Need PIC code in libnanogui even when compiled as a static library set_target_properties(nanogui-obj PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(glfw_objects PROPERTIES POSITION_INDEPENDENT_CODE ON) include_directories("ext/pybind11/include" ${PYTHON_INCLUDE_DIR}) add_library(nanogui-python-obj OBJECT python/main.cpp python/constants_glfw.cpp python/constants_entypo.cpp python/eigen.cpp python/widget.cpp python/layout.cpp python/basics.cpp python/button.cpp python/tabs.cpp python/textbox.cpp python/glcanvas.cpp python/formhelper.cpp python/misc.cpp python/glutil.cpp python/nanovg.cpp python/python.h python/py_doc.h ${LIBNANOGUI_PYTHON_EXTRA_SOURCE}) add_library(nanogui-python SHARED $) set_property(TARGET nanogui-python-obj PROPERTY POSITION_INDEPENDENT_CODE ON) set_target_properties(nanogui-python PROPERTIES OUTPUT_NAME "nanogui") target_link_libraries(nanogui-python nanogui ${NANOGUI_EXTRA_LIBS}) # Quench warnings on GCC if (CMAKE_COMPILER_IS_GNUCC) set_property(TARGET nanogui-python-obj APPEND PROPERTY COMPILE_OPTIONS "-Wno-unused-variable") endif() set_target_properties(nanogui-python PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/python) # The prefix and extension are provided by FindPythonLibsNew.cmake set_target_properties(nanogui-python PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}") set_target_properties(nanogui-python PROPERTIES SUFFIX "${PYTHON_MODULE_EXTENSION}") if (WIN32) # Set output path set_target_properties(nanogui-python PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_RELEASE "Release/python") set_target_properties(nanogui-python PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_DEBUG "Debug/python") set_target_properties(nanogui-python PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL "MinSizeRel/python") set_target_properties(nanogui-python PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "RelWithDebInfo/python") set_target_properties(nanogui-python PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "Release/python") set_target_properties(nanogui-python PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG "Debug/python") set_target_properties(nanogui-python PROPERTIES RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "MinSizeRel/python") set_target_properties(nanogui-python PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "RelWithDebInfo/python") # Link against the Python shared library target_link_libraries(nanogui-python ${PYTHON_LIBRARY}) if (MSVC) # Optimize for size, /bigobj is needed for due to the heavy template metaprogramming in pybind11 set_property(TARGET nanogui-python-obj APPEND PROPERTY COMPILE_OPTIONS "/bigobj" "$<$:/Os>" "$<$:/Os>" "$<$:/Os>") endif() elseif(UNIX) # Optimize for size if (U_CMAKE_BUILD_TYPE MATCHES REL) set_property(TARGET nanogui-python-obj APPEND PROPERTY COMPILE_OPTIONS "-Os") endif() # Strip unnecessary sections of the binary on Linux/Mac OS if(APPLE) set_target_properties(nanogui-python PROPERTIES MACOSX_RPATH ".") set_target_properties(nanogui-python PROPERTIES LINK_FLAGS "-undefined dynamic_lookup ") if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEB) add_custom_command(TARGET nanogui-python POST_BUILD COMMAND strip -u -r $) endif() else() if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEB) add_custom_command(TARGET nanogui-python POST_BUILD COMMAND strip $) endif() endif() endif() if (NANOGUI_INSTALL) install(TARGETS nanogui-python LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) endif() endif() get_directory_property(NANOGUI_HAS_PARENT PARENT_DIRECTORY) if(NANOGUI_HAS_PARENT) # This project is included from somewhere else. Export NANOGUI_EXTRA_LIBS variable set(NANOGUI_EXTRA_LIBS ${NANOGUI_EXTRA_LIBS} PARENT_SCOPE) set(NANOGUI_EXTRA_DEFS ${NANOGUI_EXTRA_DEFS} PARENT_SCOPE) set(NANOGUI_EXTRA_INCS ${NANOGUI_EXTRA_INCS} PARENT_SCOPE) else() # Create documentation for python plugin (optional target for developers) string(REPLACE " " ";" MKDOC_CXX_FLAGS_LIST ${CMAKE_CXX_FLAGS}) get_property(MKDOC_INCLUDE_DIRECTORIES DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) get_property(MKDOC_COMPILE_DEFINITIONS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY COMPILE_DEFINITIONS) foreach (value ${MKDOC_INCLUDE_DIRECTORIES}) list(APPEND MKDOC_CXX_FLAGS_LIST -I${value}) endforeach() # Make sure platform specific code gets kept in py_doc.h (specifically __doc_nanogui_chdir_to_bundle_parent) list(APPEND MKDOC_COMPILE_DEFINITIONS "DOXYGEN_DOCUMENTATION_BUILD") foreach (value ${MKDOC_COMPILE_DEFINITIONS}) list(APPEND MKDOC_CXX_FLAGS_LIST -D${value}) endforeach() add_custom_target(mkdoc COMMAND python3 ${PROJECT_SOURCE_DIR}/docs/mkdoc_rst.py ${MKDOC_CXX_FLAGS_LIST} ${PROJECT_SOURCE_DIR}/include/nanogui/*.h > ${CMAKE_CURRENT_SOURCE_DIR}/python/py_doc.h) endif() # vim: set et ts=2 sw=2 ft=cmake nospell: