summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandru Croitor <alexandru.croitor@qt.io>2020-06-25 13:55:12 +0200
committerAlexandru Croitor <alexandru.croitor@qt.io>2020-06-29 12:22:49 +0200
commit7fcc9cf05500fd3a0a1ba5c2f90a8ad3bcd8e5b0 (patch)
tree7dda5ed8533912e04c225de93cb357ec8222a988
parentcd74c867d32e9647ab5933f10b3b7cdec38d5978 (diff)
CMake: Create a Find module wrapper for OpenGL
Our .prl files embedded an absolute path to the OpenGL.tbd file. This obviously breaks their usage when used on another machine when no SDK exists. To fix that we need to use a "-framework OpenGL" linker flag instead of linking against the absolute path library. To convince CMake to do that, we have to create a wrapping OpenGL target which sets an appropriate INTERFACE_LINK_LIBRARIES property. So create a FindWrapOpenGL find module to do that on darwin platforms. Adjust helper.py and our build system to use it. This tangentially amends 38cd18384f6198c5bc3ea1da9ffc0158e960a778 because it recreates the FindWrapOpenGL module, but for a different purpose. Task-number: QTBUG-85240 Task-number: QTBUG-84781 Change-Id: I3498c19157ae31db5099e6edfb9d71490187f1d3 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r--cmake/FindWrapOpenGL.cmake40
-rw-r--r--src/gui/.prev_configure.cmake4
-rw-r--r--src/gui/CMakeLists.txt3
-rw-r--r--src/gui/configure.cmake4
-rw-r--r--util/cmake/helper.py2
5 files changed, 46 insertions, 7 deletions
diff --git a/cmake/FindWrapOpenGL.cmake b/cmake/FindWrapOpenGL.cmake
new file mode 100644
index 0000000000..fc6ddf7046
--- /dev/null
+++ b/cmake/FindWrapOpenGL.cmake
@@ -0,0 +1,40 @@
+# We can't create the same interface imported target multiple times, CMake will complain if we do
+# that. This can happen if the find_package call is done in multiple different subdirectories.
+if(TARGET WrapOpenGL::WrapOpenGL)
+ set(WrapOpenGL_FOUND ON)
+ return()
+endif()
+
+set(WrapOpenGL_FOUND OFF)
+
+find_package(OpenGL ${WrapOpenGL_FIND_VERSION})
+
+if (OpenGL_FOUND)
+ set(WrapOpenGL_FOUND ON)
+
+ add_library(WrapOpenGL::WrapOpenGL INTERFACE IMPORTED)
+ if(APPLE)
+ # On Darwin platforms FindOpenGL sets IMPORTED_LOCATION to the absolute path of the library
+ # within the framework. This ends up as an absolute path link flag, which we don't want,
+ # because that makes our .prl files un-relocatable.
+ # Extract the framework path instead, and use that in INTERFACE_LINK_LIBRARIES,
+ # which CMake ends up transforming into a reloctable -framework flag.
+ # See https://gitlab.kitware.com/cmake/cmake/-/issues/20871 for details.
+ get_target_property(__opengl_fw_lib_path OpenGL::GL IMPORTED_LOCATION)
+ if(__opengl_fw_lib_path)
+ get_filename_component(__opengl_fw_path "${__opengl_fw_lib_path}" DIRECTORY)
+ endif()
+
+ if(NOT __opengl_fw_path)
+ # Just a safety measure in case if no OpenGL::GL target exists.
+ set(__opengl_fw_path "-framework" "OpenGL")
+ endif()
+
+ target_link_libraries(WrapOpenGL::WrapOpenGL INTERFACE ${__opengl_fw_path})
+ else()
+ target_link_libraries(WrapOpenGL::WrapOpenGL INTERFACE OpenGL::GL)
+ endif()
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(WrapOpenGL DEFAULT_MSG WrapOpenGL_FOUND)
diff --git a/src/gui/.prev_configure.cmake b/src/gui/.prev_configure.cmake
index 76bc14d8c3..0f310c89ea 100644
--- a/src/gui/.prev_configure.cmake
+++ b/src/gui/.prev_configure.cmake
@@ -46,7 +46,7 @@ if(QT_FEATURE_system_zlib)
qt_add_qmake_lib_dependency(libpng zlib)
endif()
qt_find_package(Mtdev PROVIDED_TARGETS PkgConfig::Mtdev MODULE_NAME gui QMAKE_LIB mtdev)
-qt_find_package(OpenGL PROVIDED_TARGETS OpenGL::GL MODULE_NAME gui QMAKE_LIB opengl)
+qt_find_package(WrapOpenGL PROVIDED_TARGETS WrapOpenGL::WrapOpenGL MODULE_NAME gui QMAKE_LIB opengl)
qt_find_package(GLESv2 PROVIDED_TARGETS GLESv2::GLESv2 MODULE_NAME gui QMAKE_LIB opengl_es2)
qt_find_package(Tslib PROVIDED_TARGETS PkgConfig::Tslib MODULE_NAME gui QMAKE_LIB tslib)
qt_find_package(Vulkan PROVIDED_TARGETS Vulkan::Vulkan MODULE_NAME gui QMAKE_LIB vulkan)
@@ -682,7 +682,7 @@ qt_feature("opengles32" PUBLIC
qt_feature("opengl-desktop"
LABEL "Desktop OpenGL"
AUTODETECT NOT WIN32
- CONDITION ( WIN32 AND ( MSVC OR OpenGL_FOUND ) ) OR ( NOT WATCHOS AND NOT WIN32 AND NOT WASM AND OpenGL_FOUND )
+ CONDITION ( WIN32 AND ( MSVC OR WrapOpenGL_FOUND ) ) OR ( NOT WATCHOS AND NOT WIN32 AND NOT WASM AND WrapOpenGL_FOUND )
ENABLE INPUT_opengl STREQUAL 'desktop'
DISABLE INPUT_opengl STREQUAL 'es2' OR INPUT_opengl STREQUAL 'dynamic' OR INPUT_opengl STREQUAL 'no'
)
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index ace304fdef..cfcd759f1e 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -338,8 +338,7 @@ if(QT_FEATURE_opengl)
find_package(GLESv2)
target_link_libraries(Gui PUBLIC GLESv2::GLESv2)
elseif(NOT QT_FEATURE_opengl_dynamic)
- find_package(OpenGL)
- target_link_libraries(Gui PUBLIC OpenGL::GL)
+ target_link_libraries(Gui PUBLIC WrapOpenGL::WrapOpenGL)
endif()
endif()
# special case end
diff --git a/src/gui/configure.cmake b/src/gui/configure.cmake
index 11ffe54a85..cfefd2ebc3 100644
--- a/src/gui/configure.cmake
+++ b/src/gui/configure.cmake
@@ -46,7 +46,7 @@ if(QT_FEATURE_system_zlib)
qt_add_qmake_lib_dependency(libpng zlib)
endif()
qt_find_package(Mtdev PROVIDED_TARGETS PkgConfig::Mtdev MODULE_NAME gui QMAKE_LIB mtdev)
-qt_find_package(OpenGL PROVIDED_TARGETS OpenGL::GL MODULE_NAME gui QMAKE_LIB opengl)
+qt_find_package(WrapOpenGL PROVIDED_TARGETS WrapOpenGL::WrapOpenGL MODULE_NAME gui QMAKE_LIB opengl)
qt_find_package(GLESv2 PROVIDED_TARGETS GLESv2::GLESv2 MODULE_NAME gui QMAKE_LIB opengl_es2)
qt_find_package(Tslib PROVIDED_TARGETS PkgConfig::Tslib MODULE_NAME gui QMAKE_LIB tslib)
qt_find_package(Vulkan PROVIDED_TARGETS Vulkan::Vulkan MODULE_NAME gui QMAKE_LIB vulkan)
@@ -744,7 +744,7 @@ qt_feature("opengles32" PUBLIC
qt_feature("opengl-desktop"
LABEL "Desktop OpenGL"
AUTODETECT NOT WIN32
- CONDITION ( WIN32 AND ( MSVC OR OpenGL_FOUND ) ) OR ( NOT WATCHOS AND NOT WIN32 AND NOT WASM AND OpenGL_FOUND )
+ CONDITION ( WIN32 AND ( MSVC OR WrapOpenGL_FOUND ) ) OR ( NOT WATCHOS AND NOT WIN32 AND NOT WASM AND WrapOpenGL_FOUND )
ENABLE INPUT_opengl STREQUAL 'desktop'
DISABLE INPUT_opengl STREQUAL 'es2' OR INPUT_opengl STREQUAL 'dynamic' OR INPUT_opengl STREQUAL 'no'
)
diff --git a/util/cmake/helper.py b/util/cmake/helper.py
index 45bea028df..56c2c3b128 100644
--- a/util/cmake/helper.py
+++ b/util/cmake/helper.py
@@ -427,7 +427,7 @@ _library_map = [
LibraryMapping("mysql", "MySQL", "MySQL::MySQL"),
LibraryMapping("odbc", "ODBC", "ODBC::ODBC"),
LibraryMapping("opengl_es2", "GLESv2", "GLESv2::GLESv2"),
- LibraryMapping("opengl", "OpenGL", "OpenGL::GL", resultVariable="OpenGL"),
+ LibraryMapping("opengl", "WrapOpenGL", "WrapOpenGL::WrapOpenGL", resultVariable="WrapOpenGL"),
LibraryMapping(
"openssl_headers",
"WrapOpenSSLHeaders",