summarylogtreecommitdiffstats
path: root/support_installing_the_loader.diff
blob: ef1270cd10395bf78a0714155abaa3490d476f8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d0bd4a78..b3112e49 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -22,7 +22,9 @@
 cmake_minimum_required(VERSION 3.0)
 project(OPENXR)
 
+# Enable IDE GUI folders.  "Helper targets" that don't have interesting source code should set their FOLDER property to this
 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+set(LOADER_HELPER_FOLDER "Helper Targets")
 set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "")
 
 add_subdirectory(include)
@@ -40,3 +42,13 @@ if(BASH_COMMAND)
             USES_TERMINAL)
     endif()
 endif()
+
+# uninstall target
+if(NOT TARGET uninstall)
+    configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/cmake/cmake_uninstall.cmake.in"
+                   "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+                   IMMEDIATE
+                   @ONLY)
+    add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
+    set_target_properties(uninstall PROPERTIES FOLDER ${LOADER_HELPER_FOLDER})
+endif()
diff --git a/src/api_layers/CMakeLists.txt b/src/api_layers/CMakeLists.txt
index 143938fc..dfddd3fe 100644
--- a/src/api_layers/CMakeLists.txt
+++ b/src/api_layers/CMakeLists.txt
@@ -170,7 +170,7 @@ else()
     gen_xr_layer_json(
         ${CMAKE_CURRENT_BINARY_DIR}/XrApiLayer_api_dump.json
         api_dump
-        ${CMAKE_CURRENT_BINARY_DIR}/libXrApiLayer_api_dump.so
+        libXrApiLayer_api_dump.so
         1
         "API Layer to record api calls as they occur"
         ""
@@ -182,7 +182,7 @@ else()
     gen_xr_layer_json(
         ${CMAKE_CURRENT_BINARY_DIR}/XrApiLayer_core_validation.json
         core_validation
-        ${CMAKE_CURRENT_BINARY_DIR}/libXrApiLayer_core_validation.so
+        libXrApiLayer_core_validation.so
         1
         "API Layer to record api calls as they occur"
         ""
@@ -213,3 +213,13 @@ add_custom_target(core_validation_json_file DEPENDS
     ${CMAKE_CURRENT_BINARY_DIR}/XrApiLayer_core_validation.json
 )
 
+# Install explicit layers on Linux
+set(TARGET_NAMES
+    XrApiLayer_api_dump
+    XrApiLayer_core_validation)
+if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
+else()
+    foreach(TARGET_NAME ${TARGET_NAMES})
+        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.json DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/openxr/${MAJOR}/api_layers/explicit.d)
+    endforeach()
+endif()
diff --git a/src/common/platform_utils.hpp b/src/common/platform_utils.hpp
index 92621a85..d6c9fccb 100644
--- a/src/common/platform_utils.hpp
+++ b/src/common/platform_utils.hpp
@@ -79,22 +79,23 @@ static inline void PlatformUtilsFreeEnv(char* val) {
 }
 
 // Prefix for the Linux/Apple global runtime JSON file name
-static const std::string rt_dir_prefix = "/usr/local/share/openxr/";
 static const std::string rt_filename = "/active_runtime.json";
 
-static inline bool PlatformGetGlobalRuntimeFileName(uint16_t major_version, std::string& file_name) {
+static inline bool PlatformGetGlobalRuntimeFileName(uint16_t major_version, std::string rt_dir_prefix, std::string& file_name) {
     file_name = rt_dir_prefix;
+    file_name += "/openxr/";
     file_name += std::to_string(major_version);
     file_name += rt_filename;
     return true;
 }
 
-static inline bool PlatformLockGlobalRuntimeFile(uint16_t major_version, GlobalRuntimeFile& global_rt_file) {
+static inline bool PlatformLockGlobalRuntimeFile(uint16_t major_version, std::string rt_dir_prefix,
+                                                 GlobalRuntimeFile& global_rt_file) {
     bool success = false;
     try {
         global_rt_file = {};
         // Get the filename
-        if (PlatformGetGlobalRuntimeFileName(major_version, global_rt_file.file_name)) {
+        if (PlatformGetGlobalRuntimeFileName(major_version, rt_dir_prefix, global_rt_file.file_name)) {
             // Initialize the global runtime file info
             // Open a file descriptor to the file.
             global_rt_file.file_descriptor = open(global_rt_file.file_name.c_str(), O_RDWR);
@@ -245,11 +246,11 @@ static inline void PlatformUtilsFreeEnv(char *val) {
 }
 
 // Prefix for the Linux/Apple global runtime JSON file name
-static const std::string rt_dir_prefix = "/usr/local/share/openxr/";
 static const std::string rt_filename = "/active_runtime.json";
 
-static inline bool PlatformGetGlobalRuntimeFileName(uint16_t major_version, std::string &file_name) {
+static inline bool PlatformGetGlobalRuntimeFileName(uint16_t major_version, std::string rt_dir_prefix, std::string &file_name) {
     file_name = rt_dir_prefix;
+    file_name += "/openxr/";
     file_name += std::to_string(major_version);
     file_name += rt_filename;
     return true;
diff --git a/src/loader/CMakeLists.txt b/src/loader/CMakeLists.txt
index 94c87c8d..bd82e9a1 100644
--- a/src/loader/CMakeLists.txt
+++ b/src/loader/CMakeLists.txt
@@ -22,6 +22,8 @@
 include(GenerateExportHeader)
 set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS false)
 
+include(GNUInstallDirs)
+
 find_package(PythonInterp 3 REQUIRED)
 
 set(LOADER_NAME openxr_loader)
@@ -98,6 +100,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
         PRIVATE FALLBACK_CONFIG_DIRS="${FALLBACK_CONFIG_DIRS}"
         PRIVATE FALLBACK_DATA_DIRS="${FALLBACK_DATA_DIRS}"
         PRIVATE SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}"
+        PRIVATE DATADIR="${CMAKE_INSTALL_FULL_DATADIR}"
     )
     if(NOT(CMAKE_INSTALL_FULL_SYSCONFDIR STREQUAL "/etc"))
         target_compile_definitions(openxr_loader PRIVATE EXTRASYSCONFDIR="/etc")
@@ -108,6 +111,13 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
 
     add_custom_target(lib${LOADER_NAME}.so.${MAJOR}.${MINOR} ALL
         COMMAND ${CMAKE_COMMAND} -E create_symlink lib${LOADER_NAME}.so.${MAJOR}.${MINOR}.${PATCH} lib${LOADER_NAME}.so.${MAJOR}.${MINOR})
+    install(TARGETS ${LOADER_NAME}
+        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+    set(XR_API_VERSION "${MAJOR}.${MINOR}")
+    configure_file("openxr.pc.in" "openxr.pc" @ONLY)
+    install(FILES "${CMAKE_CURRENT_BINARY_DIR}/openxr.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
 elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
     # Always link MSVCRT libraries dynamically
     foreach(configuration in CMAKE_C_FLAGS_DEBUG
diff --git a/src/loader/manifest_file.cpp b/src/loader/manifest_file.cpp
index e311fbc3..153aeb2d 100644
--- a/src/loader/manifest_file.cpp
+++ b/src/loader/manifest_file.cpp
@@ -656,8 +656,9 @@ XrResult RuntimeManifestFile::FindManifestFiles(ManifestFileType type,
                     "", "RuntimeManifestFile::findManifestFiles - found too many default runtime files in registry");
             }
 #else
+            std::string global_rt_prefix = std::string(DATADIR);
             std::string global_rt_filename;
-            PlatformGetGlobalRuntimeFileName(XR_VERSION_MAJOR(XR_CURRENT_API_VERSION), global_rt_filename);
+            PlatformGetGlobalRuntimeFileName(XR_VERSION_MAJOR(XR_CURRENT_API_VERSION), global_rt_prefix, global_rt_filename);
             filenames.push_back(global_rt_filename);
 #endif
             std::string info_message = "RuntimeManifestFile::FindManifestFiles - using global runtime file ";