Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tweak CMakeLists.txt with necessary OpenGL and GLFW changes to get Linux/Wayland working #135

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
url = https://github.com/wjakob/nanovg_metal
[submodule "ext/glfw"]
path = ext/glfw
url = https://github.com/wjakob/glfw
url = https://github.com/glfw/glfw
[submodule "ext/nanobind"]
path = ext/nanobind
url = https://github.com/wjakob/nanobind
35 changes: 9 additions & 26 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -220,9 +220,7 @@ if (NANOGUI_BUILD_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(GLFW_INSTALL NANOGUI_INSTALL CACHE BOOL " " FORCE) # install GLFW if nanogui install requested
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is odd but I believe has the desired effect.

set(BUILD_SHARED_LIBS ${NANOGUI_BUILD_SHARED} CACHE BOOL " " FORCE)

if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
Expand All @@ -231,18 +229,11 @@ if (NANOGUI_BUILD_GLFW)
endif()

add_subdirectory(ext/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)
list(APPEND NANOGUI_LIBS glfw)

mark_as_advanced(
GLFW_BUILD_DOCS GLFW_BUILD_EXAMPLES GLFW_BUILD_INSTALL GLFW_BUILD_TESTS
GLFW_DOCUMENT_INTERNALS GLFW_INSTALL GLFW_USE_CHDIR GLFW_USE_MENUBAR
GLFW_USE_OSMESA GLFW_VULKAN_STATIC GLFW_USE_RETINA GLFW_USE_MIR
GLFW_BUILD_DOCS GLFW_BUILD_EXAMPLES GLFW_BUILD_TESTS
GLFW_INSTALL GLFW_USE_OSMESA GLFW_VULKAN_STATIC
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed options that GLFW no longer uses.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Been looong time since I looked under hood at NanoGUI. Why did you drop GLFW_USE_MENUBAR? I'm asking because I wonder if this precludes having a nice menu bar with NanoGUI on Wayland. If I'm off in the weeds with this question feel free to say so. I've been deep in CopperSpice and CsScintilla lately.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was removed in GLFW 3.3.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the link!

BUILD_SHARED_LIBS USE_MSVC_RUNTIME_LIBRARY_DLL)
endif()

Expand Down Expand Up @@ -302,9 +293,10 @@ elseif (APPLE)
list(APPEND NANOGUI_EXTRA src/darwin.mm src/autorelease.mm)
set_property(SOURCE src/autorelease.mm PROPERTY COMPILE_FLAGS -fno-objc-arc)
elseif (CMAKE_SYSTEM MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "BSD")
list(APPEND NANOGUI_LIBS X11 pthread)
list(APPEND NANOGUI_LIBS pthread)
if (NANOGUI_BACKEND STREQUAL "OpenGL")
list(APPEND NANOGUI_LIBS GL)
find_package(OpenGL REQUIRED COMPONENTS OpenGL)
list(APPEND NANOGUI_LIBS OpenGL::OpenGL)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a possibility that this will not work with non-GLVND linux systems, though I can't tell how common these systems actually are. CMake's FindOpenGL module doesn't provide clear guidance on the correct cross-platform solution here.

elseif (NANOGUI_BACKEND STREQUAL "GLES 2")
list(APPEND NANOGUI_LIBS GLESv2)
elseif (NANOGUI_BACKEND STREQUAL "GLES 3")
Expand Down Expand Up @@ -379,10 +371,6 @@ if (APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-fobjc-arc)
endif()

if (NANOGUI_BUILD_GLFW)
list(APPEND NANOGUI_EXTRA $<TARGET_OBJECTS:glfw_objects>)
endif()

# Compile main NanoGUI library
add_library(nanogui ${NANOGUI_LIBRARY_TYPE}
# Merge NanoVG into the NanoGUI library
Expand Down Expand Up @@ -515,11 +503,6 @@ if (NANOGUI_INSTALL)
install(DIRECTORY ext/nanovg/src/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/nanovg
FILES_MATCHING PATTERN "*.h")

if (NANOGUI_BUILD_GLFW)
install(DIRECTORY ext/glfw/include/GLFW DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h")
endif()

if (NANOGUI_BUILD_GLAD)
install(DIRECTORY ext/glad/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/glad
FILES_MATCHING PATTERN "*.h")
Expand Down Expand Up @@ -564,10 +547,10 @@ if (NANOGUI_BUILD_EXAMPLES)
add_executable(example4 src/example4.cpp)
add_executable(example_icons src/example_icons.cpp)

target_link_libraries(example1 nanogui)
target_link_libraries(example1 nanogui glfw)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is odd as well, though without it I get error adding symbols: DSO missing from command line. It's something to do with nanogui shared vs static, this error doesn't occur if NANOGUI_BUILD_SHARED=0 is specified.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have two further questions

  1. Did you test this with the switch mentioned in this thread? find_package glfw when NANOGUI_BUILD_GLFW=OFF #104
  2. Why don't we completely rip out GLFW and make the system GLFW a dependency? The custom features were a problem and if they are no longer used I would think it simpler for long term maintenance to remove GLFW from the repo and all of the build logic for it.

Thinking out loud before I've finished the first Diet Dew of the morning . . .

Your target link libraries issue above is because "static" has the GLFW currently built into it while shared builds a GLFW library, parks it somewhere, then, most likely, the CMakeLists.txt doesn't add the library to the project.

If you are using Ubuntu, you can test the above by simply removing that glfw addition and installing the Wayland glfw package:
https://packages.ubuntu.com/search?keywords=glfw
Everything should build and run. If you ldd the executable you will see it uses the system glfw

While I hate stack overflow, this message thread has a good explanation of adding libraries
https://stackoverflow.com/questions/39598323/how-to-properly-link-libraries-with-cmake

This is the path I was on with the WaylandGUI fork. Life gets a lot easier if you just use the system GLFW. There is even a .cmake to make it easy to add.

roland@roland-HP-EliteDesk-800-G2-SFF:/$ sudo find -iname *glfw*
[sudo] password for roland: 
find: ‘./run/user/1000/doc’: Permission denied
find: ‘./run/user/1000/gvfs’: Permission denied
./usr/share/doc-base/glfw3
./usr/share/doc/libglfw3-doc
./usr/share/doc/libglfw3-dev
./usr/share/doc/libglfw3-dev/examples/glfw.rc
./usr/share/doc/libglfw3-dev/examples/glfw.ico.gz
./usr/share/doc/libglfw3-dev/examples/tests/glfwinfo.c.gz
./usr/share/doc/libglfw3-dev/examples/glfw.icns.gz
./usr/share/doc/libglfw3-dev/html/glfw3_8h_source.html
./usr/share/doc/libglfw3-dev/html/structGLFWvidmode.html
./usr/share/doc/libglfw3-dev/html/glfw3native_8h_source.html
./usr/share/doc/libglfw3-dev/html/structGLFWgamepadstate.html
./usr/share/doc/libglfw3-dev/html/glfw3_8h.html
./usr/share/doc/libglfw3-dev/html/structGLFWgammaramp.html
./usr/share/doc/libglfw3-dev/html/structGLFWimage.html
./usr/share/doc/libglfw3-dev/html/glfw3native_8h.html
./usr/share/doc/libglfw3-wayland
./usr/share/lintian/overrides/libglfw3-wayland
./usr/lib/x86_64-linux-gnu/libglfw.so.3
./usr/lib/x86_64-linux-gnu/libglfw.so.3.3
./usr/lib/x86_64-linux-gnu/libglfw.so
./usr/lib/x86_64-linux-gnu/pkgconfig/glfw3.pc
./usr/lib/x86_64-linux-gnu/cmake/glfw3
./usr/lib/x86_64-linux-gnu/cmake/glfw3/glfw3Config.cmake
./usr/lib/x86_64-linux-gnu/cmake/glfw3/glfw3Targets.cmake
./usr/lib/x86_64-linux-gnu/cmake/glfw3/glfw3Targets-none.cmake
./usr/lib/x86_64-linux-gnu/cmake/glfw3/glfw3ConfigVersion.cmake
./usr/include/GLFW
./usr/include/GLFW/glfw3native.h
./usr/include/GLFW/glfw3.h

Just my 0.0002 cents

target_link_libraries(example2 nanogui)
target_link_libraries(example3 nanogui ${NANOGUI_LIBS}) # For OpenGL
target_link_libraries(example4 nanogui)
target_link_libraries(example4 nanogui glfw)
target_link_libraries(example_icons nanogui)

# Copy icons for example application
Expand Down
2 changes: 1 addition & 1 deletion docs/compilation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ file as follows (this assumes that ``nanogui`` lives in the directory
add_subdirectory(ext/nanogui)

# For reliability of parallel build, make the NanoGUI targets dependencies
set_property(TARGET glfw glfw_objects nanogui PROPERTY FOLDER "dependencies")
set_property(TARGET glfw nanogui PROPERTY FOLDER "dependencies")

Required Variables Exposed
----------------------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion ext/glfw
Submodule glfw updated 112 files
2 changes: 1 addition & 1 deletion src/python/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ if (NOT NANOGUI_BUILD_SHARED)
set_target_properties(nanogui PROPERTIES POSITION_INDEPENDENT_CODE ON)

if (NANOGUI_BUILD_GLFW)
set_target_properties(glfw_objects PROPERTIES POSITION_INDEPENDENT_CODE ON)
set_target_properties(glfw PROPERTIES POSITION_INDEPENDENT_CODE ON)
endif()
endif()

Expand Down