mirror of
https://github.com/maplibre/maplibre-rs.git
synced 2025-12-08 19:05:57 +00:00
4836 lines
254 KiB
HTML
4836 lines
254 KiB
HTML
<!DOCTYPE HTML>
|
||
<html lang="en" class="light" dir="ltr">
|
||
<head>
|
||
<!-- Book generated using mdBook -->
|
||
<meta charset="UTF-8">
|
||
<title>MapLibre Rust Documentation</title>
|
||
<meta name="robots" content="noindex">
|
||
|
||
|
||
<!-- Custom HTML head -->
|
||
|
||
<meta name="description" content="">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<meta name="theme-color" content="#ffffff">
|
||
|
||
<link rel="icon" href="favicon.svg">
|
||
<link rel="shortcut icon" href="favicon.png">
|
||
<link rel="stylesheet" href="css/variables.css">
|
||
<link rel="stylesheet" href="css/general.css">
|
||
<link rel="stylesheet" href="css/chrome.css">
|
||
<link rel="stylesheet" href="css/print.css" media="print">
|
||
|
||
<!-- Fonts -->
|
||
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
|
||
<link rel="stylesheet" href="fonts/fonts.css">
|
||
|
||
<!-- Highlight.js Stylesheets -->
|
||
<link rel="stylesheet" href="highlight.css">
|
||
<link rel="stylesheet" href="tomorrow-night.css">
|
||
<link rel="stylesheet" href="ayu-highlight.css">
|
||
|
||
<!-- Custom theme stylesheets -->
|
||
<link rel="stylesheet" href="diff.css">
|
||
|
||
</head>
|
||
<body class="sidebar-visible no-js">
|
||
<div id="body-container">
|
||
<!-- Provide site root to javascript -->
|
||
<script>
|
||
var path_to_root = "";
|
||
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
|
||
</script>
|
||
|
||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||
<script>
|
||
try {
|
||
var theme = localStorage.getItem('mdbook-theme');
|
||
var sidebar = localStorage.getItem('mdbook-sidebar');
|
||
|
||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||
}
|
||
|
||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||
}
|
||
} catch (e) { }
|
||
</script>
|
||
|
||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||
<script>
|
||
var theme;
|
||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||
var html = document.querySelector('html');
|
||
html.classList.remove('light')
|
||
html.classList.add(theme);
|
||
var body = document.querySelector('body');
|
||
body.classList.remove('no-js')
|
||
body.classList.add('js');
|
||
</script>
|
||
|
||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||
|
||
<!-- Hide / unhide sidebar before it is displayed -->
|
||
<script>
|
||
var body = document.querySelector('body');
|
||
var sidebar = null;
|
||
var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||
if (document.body.clientWidth >= 1080) {
|
||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||
sidebar = sidebar || 'visible';
|
||
} else {
|
||
sidebar = 'hidden';
|
||
}
|
||
sidebar_toggle.checked = sidebar === 'visible';
|
||
body.classList.remove('sidebar-visible');
|
||
body.classList.add("sidebar-" + sidebar);
|
||
</script>
|
||
|
||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||
<div class="sidebar-scrollbox">
|
||
<ol class="chapter"><li class="chapter-item expanded affix "><a href="introduction.html">Introduction</a></li><li class="chapter-item expanded affix "><a href="supported-platforms.html">Supported Platforms</a></li><li class="chapter-item expanded affix "><a href="developer-log.html">Developer Log</a></li><li class="chapter-item expanded "><a href="user-guide/index.html"><strong aria-hidden="true">1.</strong> User Guide</a></li><li class="chapter-item expanded "><a href="development-guide/index.html"><strong aria-hidden="true">2.</strong> Development Guide</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="development-guide/how-to-run.html"><strong aria-hidden="true">2.1.</strong> How to Run Demos</a></li><li class="chapter-item expanded "><a href="development-guide/building-libraries.html"><strong aria-hidden="true">2.2.</strong> Building Libraries</a></li><li class="chapter-item expanded "><a href="development-guide/debugging.html"><strong aria-hidden="true">2.3.</strong> Debugging</a></li></ol></li><li class="chapter-item expanded "><a href="development-documents/index.html"><strong aria-hidden="true">3.</strong> Development Documents</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="development-documents/architecture.html"><strong aria-hidden="true">3.1.</strong> Architecture</a></li><li class="chapter-item expanded "><a href="development-documents/design.html"><strong aria-hidden="true">3.2.</strong> Design</a></li><li class="chapter-item expanded "><a href="development-documents/caching.html"><strong aria-hidden="true">3.3.</strong> Caching</a></li><li class="chapter-item expanded "><a href="development-documents/stencil-masking.html"><strong aria-hidden="true">3.4.</strong> Stencil Masking</a></li><li class="chapter-item expanded "><a href="development-documents/font-rendering.html"><strong aria-hidden="true">3.5.</strong> Font Rendering</a></li><li class="chapter-item expanded "><a href="development-documents/library-packaging.html"><strong aria-hidden="true">3.6.</strong> Library Packaging</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="development-documents/library-packaging/apple.html"><strong aria-hidden="true">3.6.1.</strong> Apple</a></li><li class="chapter-item expanded "><a href="development-documents/library-packaging/android.html"><strong aria-hidden="true">3.6.2.</strong> Android</a></li><li class="chapter-item expanded "><a href="development-documents/library-packaging/web.html"><strong aria-hidden="true">3.6.3.</strong> Web</a></li></ol></li></ol></li><li class="chapter-item expanded "><a href="appendix/index.html"><strong aria-hidden="true">4.</strong> Appendix</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="appendix/link-collection.html"><strong aria-hidden="true">4.1.</strong> Link Collection</a></li></ol></li><li class="chapter-item expanded "><a href="rfc/0001-rfc-process.html"><strong aria-hidden="true">5.</strong> RFCs</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="rfc/0000-template.html"><strong aria-hidden="true">5.1.</strong> 0000-template</a></li><li class="chapter-item expanded "><a href="rfc/0001-rfc-process.html"><strong aria-hidden="true">5.2.</strong> 0001-rfc-process</a></li></ol></li></ol>
|
||
</div>
|
||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||
<div class="sidebar-resize-indicator"></div>
|
||
</div>
|
||
</nav>
|
||
|
||
<!-- Track and set sidebar scroll position -->
|
||
<script>
|
||
var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
|
||
sidebarScrollbox.addEventListener('click', function(e) {
|
||
if (e.target.tagName === 'A') {
|
||
sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
|
||
}
|
||
}, { passive: true });
|
||
var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
|
||
sessionStorage.removeItem('sidebar-scroll');
|
||
if (sidebarScrollTop) {
|
||
// preserve sidebar scroll position when navigating via links within sidebar
|
||
sidebarScrollbox.scrollTop = sidebarScrollTop;
|
||
} else {
|
||
// scroll sidebar to current active section when navigating via "next/previous chapter" buttons
|
||
var activeSection = document.querySelector('#sidebar .active');
|
||
if (activeSection) {
|
||
activeSection.scrollIntoView({ block: 'center' });
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<div id="page-wrapper" class="page-wrapper">
|
||
|
||
<div class="page">
|
||
<div id="menu-bar-hover-placeholder"></div>
|
||
<div id="menu-bar" class="menu-bar sticky">
|
||
<div class="left-buttons">
|
||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||
<i class="fa fa-bars"></i>
|
||
</label>
|
||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||
<i class="fa fa-paint-brush"></i>
|
||
</button>
|
||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||
</ul>
|
||
<button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
|
||
<i class="fa fa-search"></i>
|
||
</button>
|
||
</div>
|
||
|
||
<h1 class="menu-title">MapLibre Rust Documentation</h1>
|
||
|
||
<div class="right-buttons">
|
||
<a href="print.html" title="Print this book" aria-label="Print this book">
|
||
<i id="print-button" class="fa fa-print"></i>
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div id="search-wrapper" class="hidden">
|
||
<form id="searchbar-outer" class="searchbar-outer">
|
||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||
</form>
|
||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||
<div id="searchresults-header" class="searchresults-header"></div>
|
||
<ul id="searchresults">
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||
<script>
|
||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||
});
|
||
</script>
|
||
|
||
<div id="content" class="content">
|
||
<main>
|
||
<p><img src="./logo/maplibre-rs-with-text.svg" alt="" /></p>
|
||
<h1 id="introduction"><a class="header" href="#introduction">Introduction</a></h1>
|
||
<p>maplibre-rs is a portable and performant vector maps renderer. </p>
|
||
<h2 id="name"><a class="header" href="#name">Name</a></h2>
|
||
<p>The name of the library is "maplibre-rs". The camel-case version of it is "MapLibreRs".</p>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="supported-platforms"><a class="header" href="#supported-platforms">Supported Platforms</a></h1>
|
||
<p>For development the following platforms are recommended:</p>
|
||
<ul>
|
||
<li>Linux X11/Wayland</li>
|
||
<li>MacOS</li>
|
||
<li>Latest Firefox Nightly/Chrome Canary with WebGPU (Because WebGPU is a living spec, sometimes a bleeding-edge browser
|
||
release is required)</li>
|
||
</ul>
|
||
<h2 id="short-term-obstacles"><a class="header" href="#short-term-obstacles">Short-term Obstacles</a></h2>
|
||
<div class="table-wrapper"><table><thead><tr><th>Platform</th><th>Obstacles</th></tr></thead><tbody>
|
||
<tr><td>Linux X11</td><td></td></tr>
|
||
<tr><td>Linux Wayland</td><td></td></tr>
|
||
<tr><td>Windows</td><td></td></tr>
|
||
<tr><td>MacOS</td><td></td></tr>
|
||
<tr><td>Android</td><td>* Unable to get window size before resume</td></tr>
|
||
<tr><td>iOS</td><td>* Touches are crashing the app on real devices <br/> * Instanced indices drawing is not supported <br/> * Drawing zero-length indices is prohibited<br/></td></tr>
|
||
<tr><td>Firefox</td><td>* Shared Memory is currently not working because it a parallel web worker corrupts memory</td></tr>
|
||
<tr><td>Chrome</td><td></td></tr>
|
||
<tr><td>Safari</td><td></td></tr>
|
||
<tr><td>Mobile Firefox</td><td></td></tr>
|
||
<tr><td>Mobile Chrome</td><td></td></tr>
|
||
<tr><td>Mobile Safari</td><td></td></tr>
|
||
</tbody></table>
|
||
</div>
|
||
<h2 id="long-term-goals"><a class="header" href="#long-term-goals">Long-term Goals</a></h2>
|
||
<p><a href="https://caniuse.com/webgpu">WebGPU</a> is not enabled by default for all platforms.</p>
|
||
<p>WebGPU Status:</p>
|
||
<ul>
|
||
<li><a href="https://github.com/gpuweb/gpuweb/wiki/Implementation-Status#firefox-and-servo">Firefox</a></li>
|
||
<li><a href="https://chromestatus.com/feature/6213121689518080">Chrome</a></li>
|
||
<li><a href="https://webkit.org/status/#specification-webgpu">WebKit</a></li>
|
||
</ul>
|
||
<div class="table-wrapper"><table><thead><tr><th>Platform</th><th>Linux & Android</th><th>Graphics API</th><th>Note</th></tr></thead><tbody>
|
||
<tr><td>Linux X11</td><td>✅</td><td>Vulkan</td><td></td></tr>
|
||
<tr><td>Linux Wayland</td><td>✅</td><td>Vulkan</td><td></td></tr>
|
||
<tr><td>Windows</td><td>❓</td><td>❓</td><td></td></tr>
|
||
<tr><td>MacOS</td><td>✅</td><td>❓</td><td></td></tr>
|
||
<tr><td>Android</td><td>✅</td><td>Vulkan/OpenGL ES/Angle</td><td>Not tested, but should work on all devices if <a href="https://github.com/gfx-rs/wgpu/blob/master/README.md#supported-platforms">Angle</a> is used. <a href="https://developer.android.com/about/dashboards">Vulkan</a> is not yet supported widely.</td></tr>
|
||
<tr><td>iOS</td><td>✅</td><td>Metal</td><td>Not tested.</td></tr>
|
||
<tr><td>Firefox</td><td>✅</td><td>WebGL/WebGPU</td><td></td></tr>
|
||
<tr><td>Chrome</td><td>✅</td><td>WebGL/WebGPU</td><td>WebGPU is significantly faster because WASM output is smaller.</td></tr>
|
||
<tr><td>Safari</td><td>🛠️</td><td>WebGL/WebGPU</td><td>Safari does not yet support <a href="https://caniuse.com/sharedarraybuffer">Shared Array Buffer</a></td></tr>
|
||
<tr><td>Mobile Firefox</td><td>🆗</td><td>WebGL/WebGPU</td><td></td></tr>
|
||
<tr><td>Mobile Chrome</td><td>🆗</td><td>WebGL</td><td><a href="https://caniuse.com/webgpu">WebGPU</a> is not implemented.</td></tr>
|
||
<tr><td>Mobile Safari</td><td>🛠️</td><td>WebGL</td><td><a href="https://caniuse.com/webgpu">WebGPU</a> is not implemented. Safari does not yet support <a href="https://caniuse.com/sharedarraybuffer">Shared Array Buffer</a></td></tr>
|
||
</tbody></table>
|
||
</div>
|
||
<p>✅ = First Class Support — 🆗= Best Effort Support — 🛠️ = Unsupported, but support
|
||
in progress</p>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="developer-log"><a class="header" href="#developer-log">Developer Log</a></h1>
|
||
<p>I'm regularly releasing blog posts <a href="https://maxammann.org/categories/maplibre/">on my blog</a>.</p>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="user-guide"><a class="header" href="#user-guide">User Guide</a></h1>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="development-guide"><a class="header" href="#development-guide">Development Guide</a></h1>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="running-maplibre-rs-demos-on-various-platforms"><a class="header" href="#running-maplibre-rs-demos-on-various-platforms">Running maplibre-rs demos on various platforms</a></h1>
|
||
<p>During development, you will want to run the maplibre demos on your local machine to test out your changes.
|
||
There are multiple demos of maplibre-rs for different targets. Some targets have prerequisites
|
||
depending on your operating system.</p>
|
||
<ul>
|
||
<li><strong>maplibre-demo</strong> - targets Windows, macOS and Linux, it is built directly with cargo.</li>
|
||
<li><strong>apple</strong> - targets iOS and macOS and relies on the xcode IDE.</li>
|
||
<li><strong>android</strong> - targets Android devices and builds in Android Studio.</li>
|
||
<li><strong>web</strong> - targets the web using a WASM binary.</li>
|
||
<li><strong>maplibre-headless</strong> - <em>TBD</em></li>
|
||
</ul>
|
||
<p>All the targets below require you to install <a href="https://rustup.rs/">rustup</a> to manage your Rust toolchain.</p>
|
||
<blockquote>
|
||
<p><strong>Note</strong>: Make sure you have selected the right toolchain target within rustup. You can use <code>rustup show</code> to see your
|
||
active toolchain. If you want to change the target of the build manually, use the cargo <code>--target</code> parameter.</p>
|
||
</blockquote>
|
||
<h2 id="maplibre-demo"><a class="header" href="#maplibre-demo">Maplibre-demo</a></h2>
|
||
<h3 id="linuxmacos"><a class="header" href="#linuxmacos">Linux/macOS</a></h3>
|
||
<p>The build for desktop is very simple, you just have to run the following command from the root of the
|
||
maplibre-rs project:</p>
|
||
<pre><code class="language-bash">cargo run -p maplibre-demo
|
||
</code></pre>
|
||
<h3 id="windows"><a class="header" href="#windows">Windows</a></h3>
|
||
<p>Windows has two additional prerequisites to be able to run. You will need CMake, Visual Studio C++ build tools and the
|
||
sqlite3 library.</p>
|
||
<p>Install <a href="https://cmake.org/download/">CMake</a> and add it to your path environment variables.</p>
|
||
<p>For the C++ build tools, download the <a href="https://visualstudio.microsoft.com/downloads/">Visual Studio 2022 Build tools</a>
|
||
from the Microsoft website. After the download, while installing the Build tools, make sure that you select the
|
||
<em>C++ build tools</em>.</p>
|
||
<p>To install sqlite3 you need to build the sqlite3.lib manually with the following
|
||
<a href="https://gist.github.com/zeljic/d8b542788b225b1bcb5fce169ee28c55">steps</a>. This will generate a .lib file that
|
||
you will have to add to the SQLITE3_LIB_DIR environment variable.</p>
|
||
<p>Restart your shell to make sure you are using up-to-date environment variables.</p>
|
||
<p>Finally, the command below should execute successfully:</p>
|
||
<pre><code class="language-bash">cargo run -p maplibre-demo
|
||
</code></pre>
|
||
<h2 id="android"><a class="header" href="#android">Android</a></h2>
|
||
<p>Start by installing the
|
||
<a href="https://developer.android.com/studio?gclid=CjwKCAjwj42UBhAAEiwACIhADmF7uHXnEHGnmOgFnjp0Z6n-TnBvutC5faGA89lwouMIXiR6OXK4hBoCq78QAvD_BwE&gclsrc=aw.ds">Android Studio IDE</a>.</p>
|
||
<p>Make sure the NDK is installed. The Native Development Kit (NDK) is a set of tools that allows
|
||
you to use C and C++ code with Android. You have to install manually the version that is used in
|
||
<code>./android/gradle/lib/build.gradle</code>.</p>
|
||
<pre><code>ANDROID STUDIO -> tools -> SDK manager -> SDK tools -> tick show package details -> ndk (side by side)
|
||
</code></pre>
|
||
<p>Open the project within <code>./android/gradle</code> and create a new virtual device with the device manager. Minimum SDK version
|
||
should be 21. This was tested on an x86_64 emulator. Finally, run the demo configuration. It should open your virtual device and
|
||
run the maplibre-rs Android demo on it. Alternatively you can also run it on your own Android device.</p>
|
||
<blockquote>
|
||
<p>Note: If you are building for an x86 Android device, you probably need to install the following target using<br />
|
||
rustup with the following command <code>rustup target add i686-linux-android</code>.</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>Note: Android is configured to support OpenGL ES 3.1 (This API specification is supported by Android 5.0 (API level 21) and higher).
|
||
Your Android device is required to support OpenGL ES 3.1 at least. There are some issues
|
||
<a href="https://stackoverflow.com/questions/40797975/android-emulator-and-opengl-es3-egl-bad-config">here</a> and
|
||
<a href="https://www.reddit.com/r/Arcore/comments/8squbo/opengl_es_31_is_required_for_android_emulator_to/">here</a> that
|
||
discuss configuration of Android Studio for OpenGL ES 3.1 support in emulators.</p>
|
||
</blockquote>
|
||
<h2 id="apple"><a class="header" href="#apple">Apple</a></h2>
|
||
<p>Apple builds rely on the <a href="https://apps.apple.com/us/app/xcode/id497799835?ls=1&mt=12">XCode IDE</a>.
|
||
Start by installing XCode and open the project within <code>./apple/xcode</code>.</p>
|
||
<blockquote>
|
||
<p>Cargo is used in to build the maplibre library in the build phases of the XCode project configuration.</p>
|
||
</blockquote>
|
||
<h3 id="ios"><a class="header" href="#ios">iOS</a></h3>
|
||
<p>You can use XCode to run on a iOS Simulator or a real device. Install a simulator in XCode.
|
||
Version 9 is the minimum version supported theoretically.</p>
|
||
<p>Select the scheme called <em>example (iOS)</em> and click on run. This will start the iOS application.</p>
|
||
<h3 id="macos"><a class="header" href="#macos">macOS</a></h3>
|
||
<p>As you might have seen in the maplibre-demo section, you can build Unix executables directly with Cargo.
|
||
In order to build a proper macOS application (in OSX terminology) you have to use the <code>./apple/xcode</code> project.</p>
|
||
<p>Open the project from the folder <code>./apple/xcode</code> with XCode. Select the scheme called <em>example (macOS)</em> and
|
||
click on run. This will start the macOS application. </p>
|
||
<blockquote>
|
||
<p>The minimum target OSX version for the macOS build is defined inside <em>Build settings -> Deployment -> macOS deployment target</em>.
|
||
If you are using a lower version of OSX, you will not be able to run the application on your computer.</p>
|
||
</blockquote>
|
||
<h2 id="web-webgl-webgpu"><a class="header" href="#web-webgl-webgpu">Web (WebGL, WebGPU)</a></h2>
|
||
<p>You need to first build the library for WebGL or WebGPU. Optionally, you can also enabled multi-threading support,
|
||
which requires that the library is used in a secure environment:
|
||
<a href="https://developer.mozilla.org/en-US/docs/Web/API/isSecureContext">isSecureContext</a>
|
||
and <a href="https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated">crossOriginIsolated</a>.
|
||
The demo runs this such an environment.</p>
|
||
<p>If you have a browser which already supports a recent version of the WebGPU specification then you can build the library
|
||
with WebGPU:</p>
|
||
<pre><code class="language-bash">just web-lib build # WebGPU
|
||
</code></pre>
|
||
<p>If not, then you must enable WebGL support:</p>
|
||
<pre><code class="language-bash">just web-lib build --webgl # WebGL
|
||
just web-lib build --webgl --multithreaded # WebGL + multithreaded
|
||
</code></pre>
|
||
<p>Instead of building it is also possible to watch for changes. The same flags as with <code>web-lib build</code> are supported:</p>
|
||
<pre><code class="language-bash">just web-lib watch --webgl
|
||
</code></pre>
|
||
<p>After building the library you can run the demo server:</p>
|
||
<pre><code class="language-bash">just web-demo start
|
||
</code></pre>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="building-libraries"><a class="header" href="#building-libraries">Building Libraries</a></h1>
|
||
<p>TODO</p>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="debugging"><a class="header" href="#debugging">Debugging</a></h1>
|
||
<ul>
|
||
<li>log crate</li>
|
||
</ul>
|
||
<h2 id="gpu-debugging"><a class="header" href="#gpu-debugging">GPU Debugging</a></h2>
|
||
<ul>
|
||
<li>For WebGL there is SpectorJS is enabled by default right now. For debugging on a desktop environment you can use
|
||
<a href="https://renderdoc.org/">RenderDoc</a>.</li>
|
||
</ul>
|
||
<h2 id="frame-profiling"><a class="header" href="#frame-profiling">Frame Profiling</a></h2>
|
||
<p>maplibre-rs is set up to use the Tracy profiler (https://github.com/wolfpld/tracy). It's mainly designed for C++ but has some Rust support.</p>
|
||
<p>The connection to Rust uses a project that connects to the tracing crate (https://github.com/nagisa/rust_tracy_client). This uses a set of three crates (tracing-tracy, tracy-client, tracy-client-sys).</p>
|
||
<p>Unfortunately, the Tracy project does not use semantic versioning, whereas tracing-tracy, tracy-client, tracy-client sys do.</p>
|
||
<p>The current version of the Rust client is at v0.8.1 of Tracy. See the correlating versions in the table below (original at https://github.com/nagisa/rust_tracy_client#version-support-table):</p>
|
||
<div class="table-wrapper"><table><thead><tr><th>Tracy</th><th>tracy-client-sys</th><th>tracy-client</th><th>tracing-tracy</th></tr></thead><tbody>
|
||
<tr><td>0.7.1</td><td>0.9.0</td><td>0.8.0</td><td>0.2.0</td></tr>
|
||
<tr><td>0.7.3</td><td>0.10.0</td><td>0.9.0</td><td>0.3.0</td></tr>
|
||
<tr><td>0.7.4</td><td>0.11.0</td><td>0.10.0</td><td>0.4.0</td></tr>
|
||
<tr><td>0.7.5</td><td>0.12.0</td><td>0.11.0</td><td>0.5.0</td></tr>
|
||
<tr><td>0.7.6</td><td>0.13.0, 0.14.0</td><td>0.12.*</td><td>0.6.*</td></tr>
|
||
<tr><td>v0.7.7</td><td>0.15.0</td><td>0.12.*</td><td>0.6.*</td></tr>
|
||
<tr><td>v0.7.8</td><td>0.16.0</td><td>0.12.*</td><td>0.6.*</td></tr>
|
||
<tr><td>v0.7.8</td><td>0.16.0</td><td>0.12.*</td><td>0.7.*</td></tr>
|
||
<tr><td>v0.7.8</td><td>0.16.0</td><td>0.12.*</td><td>0.8.*</td></tr>
|
||
<tr><td>v0.8.1</td><td>0.17.*</td><td>0.13.*</td><td>0.9.*</td></tr>
|
||
<tr><td>v0.8.1</td><td>0.17.*</td><td>0.14.*</td><td>0.10.*</td></tr>
|
||
</tbody></table>
|
||
</div><div style="break-before: page; page-break-before: always;"></div><h1 id="development-documents"><a class="header" href="#development-documents">Development Documents</a></h1>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="architecture"><a class="header" href="#architecture">Architecture</a></h1>
|
||
<h2 id="rendering-architecture"><a class="header" href="#rendering-architecture">Rendering Architecture</a></h2>
|
||
<p>The big picture of wgpu is as follows:</p>
|
||
<p><img src="https://raw.githubusercontent.com/gfx-rs/wgpu/8f02b73655aff641361822a8ac0347fc47622b49/etc/big-picture.png" alt="" /></p>
|
||
<p>A simplified version is shown below:</p>
|
||
<p><img src="development-documents/./figures/render-stack.drawio.svg" alt="" /></p>
|
||
<p>A further simplified version:</p>
|
||
<p><img src="development-documents/./figures/simplified-render-stack.drawio.svg" alt="" /></p>
|
||
<p>Notes:</p>
|
||
<ul>
|
||
<li>wgpu is able to create an interface through which we can reach any device with a GPU.</li>
|
||
</ul>
|
||
<p>Notes:</p>
|
||
<ul>
|
||
<li>The ability to use shared memory or the atomic instruction set of WASM comes by enabling compilation features.</li>
|
||
<li><code>threads</code> support here does not introduce threads like we know them from Linux. It introduces </li>
|
||
<li><a href="https://github.com/WebAssembly/threads/blob/main/proposals/threads/Overview.md">support for atomics</a> like
|
||
specified in a working draft to WebAssembly. Threads are simulated using WebWorkers by the browser.</li>
|
||
</ul>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="design"><a class="header" href="#design">Design</a></h1>
|
||
<script src="https://unpkg.com/@panzoom/panzoom@4.5.0/dist/panzoom.min.js"></script>
|
||
<h2 id="domain-model"><a class="header" href="#domain-model">Domain Model</a></h2>
|
||
<div style="overflow: hidden; border-style: solid; width: 110%">
|
||
<img src="development-documents/./figures/domain-model.drawio.svg" class="diagram" alt="diagram" />
|
||
</div>
|
||
<h2 id="data-model"><a class="header" href="#data-model">Data Model</a></h2>
|
||
<div style="overflow: hidden; border-style: solid; width: 110%">
|
||
<img src="development-documents/./figures/data-model.drawio.svg" class="diagram" alt="diagram" />
|
||
</div>
|
||
<h2 id="crate-and-project-structure"><a class="header" href="#crate-and-project-structure">Crate and Project Structure</a></h2>
|
||
<div style="overflow: hidden; border-style: solid; width: 110%">
|
||
<img src="development-documents/./figures/crate-and-projects-structure.drawio.svg" class="diagram" alt="diagram" />
|
||
</div>
|
||
<script>
|
||
Array.from(document.getElementsByClassName('diagram')).forEach(e => {
|
||
panzoom = Panzoom(e, {});
|
||
e.parentElement.addEventListener('wheel', panzoom.zoomWithWheel)
|
||
})
|
||
</script>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="caching"><a class="header" href="#caching">Caching</a></h1>
|
||
<p>The caching for maplibre-rs is handled on the networking layer. This means that data which is fetched over slow IO is cached in
|
||
the format of the network requests. The maplibre-rs library is not introducing a separate serialization format for caching.</p>
|
||
<p>Instead, caching functionality of HTTP client libraries of the web platform are used. This has the advantage that we can
|
||
honor HTTP headers which configure caching. This is very important for fetched tiles, as they can have an expiry date.</p>
|
||
<ul>
|
||
<li>On the web the browser is automatically caching raw tiles.</li>
|
||
<li>On Linux, macOS, iOS and Android we are
|
||
utilizing <a href="https://crates.io/crates/reqwest-middleware-cache/">reqwest-middleware-cache</a>, which writes raw network
|
||
requests to disk.</li>
|
||
</ul>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="stencil-masking"><a class="header" href="#stencil-masking">Stencil Masking</a></h1>
|
||
<p>The following diagram shows a method which has been used in the beginning of maplibre-rs. It is not used currently.</p>
|
||
<p><img src="development-documents/figures/stencil_buffer.drawio.svg" alt="" /></p>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="font-rendering"><a class="header" href="#font-rendering">Font Rendering</a></h1>
|
||
<p>There exists no universally perfect solution to font rendering. Depending on the runtime environment a method needs to
|
||
be chosen. <a href="https://stackoverflow.com/a/5278471">This StackOverflow post</a> outlines some state-of-the-art methods. Some
|
||
more approaches are described <a href="https://aras-p.info/blog/2017/02/15/Font-Rendering-is-Getting-Interesting/">here</a>.</p>
|
||
<p>From my perspective the following approaches could work potentially:</p>
|
||
<ol>
|
||
<li>Tessellate Fonts</li>
|
||
<li>SDF Font Rendering</li>
|
||
<li>GPU Text Rendering directly from Bezier Curves</li>
|
||
<li>Draw text using a Web Canvas and load them to GPU</li>
|
||
</ol>
|
||
<p>There is a thesis which summarizes some methods <a href="https://lup.lub.lu.se/luur/download?func=downloadFile&recordOId=9024910&fileOId=9024911">here</a>.
|
||
A link collection about font related projects can be viewed <a href="development-documents/../appendix/link-collection.html#font-rendering">here</a>.</p>
|
||
<h2 id="approaches"><a class="header" href="#approaches">Approaches</a></h2>
|
||
<h3 id="tessellate-fonts"><a class="header" href="#tessellate-fonts">Tessellate Fonts</a></h3>
|
||
<p>There is <a href="https://github.com/fetisov/ttf2mesh">ttf2mesh</a> which generates meshes. I was already able to generate about 1k
|
||
glyphs with ~40FPS.</p>
|
||
<h3 id="sdf-font-rendering"><a class="header" href="#sdf-font-rendering">SDF Font Rendering</a></h3>
|
||
<p>There is a blogpost by Mapbox <a href="https://blog.mapbox.com/drawing-text-with-signed-distance-fields-in-mapbox-gl-b0933af6f817">here</a>.
|
||
Some more implementation documents are available <a href="https://github.com/mapbox/mapbox-gl-native/wiki/Text-Rendering">here</a>.
|
||
A good foundation for SDF fonts was created by Chlumsky with <a href="https://github.com/Chlumsky/msdfgen">msdfgen</a>.</p>
|
||
<h3 id="gpu-text-rendering-from-bezier-curves"><a class="header" href="#gpu-text-rendering-from-bezier-curves">GPU Text Rendering from Bezier Curves</a></h3>
|
||
<p>The solutions exist:</p>
|
||
<ul>
|
||
<li><a href="https://wdobbie.com/post/gpu-text-rendering-with-vector-textures/">By Will Dobbie</a> with an
|
||
implementation <a href="https://github.com/azsn/gllabel">here</a></li>
|
||
<li><a href="http://sluglibrary.com/">Slug Library</a> which is patented and probably therefore not usable</li>
|
||
</ul>
|
||
<p><a href="https://jcgt.org/published/0006/02/02/paper.pdf">Here</a> is the whitepaper of the Slug library. There is also
|
||
a <a href="http://sluglibrary.com/slug_algorithm.pdf">poster</a> about it. There also exists
|
||
an <a href="https://github.com/mightycow/Sluggish">open implementation</a>.</p>
|
||
<h3 id="draw-text-using-a-web-canvas"><a class="header" href="#draw-text-using-a-web-canvas">Draw text using a Web Canvas</a></h3>
|
||
<p>This approach has the downside that we can not dynamically scale rendered fonts according to the current zoom level.</p>
|
||
<h2 id="other-approaches"><a class="header" href="#other-approaches">Other Approaches</a></h2>
|
||
<ul>
|
||
<li><a href="https://superluminal.eu/16x-aa-font-rendering-using-coverage-masks-part-iii/">16x AA font rendering using coverage masks</a></li>
|
||
</ul>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="library-packaging"><a class="header" href="#library-packaging">Library Packaging</a></h1>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="apple-1"><a class="header" href="#apple-1">Apple</a></h1>
|
||
<p>On Apple maplibre-rs is packaged as:</p>
|
||
<ul>
|
||
<li>Multiple .xcarchive packages which include a framework. Each for a different architecture and platform.</li>
|
||
<li>A single .xcframework package which contains multiple frameworks of different architectures and platforms.</li>
|
||
<li>A swift package which just references the .xcframework package and makes distributing easier.</li>
|
||
</ul>
|
||
<p>The following diffs are extracted from <a href="development-documents/library-packaging/../../../../apple/framework.diff">this diff</a>. They should serve as documentation
|
||
for the XCode project. This is required because XCode is a mess.</p>
|
||
<h2 id="xcode-project-description"><a class="header" href="#xcode-project-description">XCode Project description</a></h2>
|
||
<h3 id="library-entry"><a class="header" href="#library-entry">Library Entry</a></h3>
|
||
<div id="d2h-374920" class="d2h-file-wrapper" data-lang="swift">
|
||
<div class="d2h-file-header">
|
||
<span class="d2h-file-name-wrapper">
|
||
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
|
||
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
|
||
</svg> <span class="d2h-file-name">xcode/maplibre-rs/maplibre.swift</span>
|
||
<span class="d2h-tag d2h-added d2h-added-tag">ADDED</span></span>
|
||
<label class="d2h-file-collapse">
|
||
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||
Viewed
|
||
</label>
|
||
</div>
|
||
<div class="d2h-file-diff">
|
||
<div class="d2h-code-wrapper">
|
||
<table class="d2h-diff-table">
|
||
<tbody class="d2h-diff-tbody">
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -0,0 +1,5 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">1</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn">public class MapLibre {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">2</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> public static func start() {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">3</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> maplibre_apple_main();</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">4</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> }</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">5</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn">}</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>The swift code above is the main entry for the Swift API. From this entry file we can expose more API of maplibre-rs.
|
||
Any C functions which are referenced in the XCode framework's header are available automatically in Swift.</p>
|
||
<h3 id="framework"><a class="header" href="#framework">Framework</a></h3>
|
||
<div class="d2h-file-wrapper" data-lang="pbxproj">
|
||
<div class="d2h-file-header">
|
||
<span class="d2h-file-name-wrapper">
|
||
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
|
||
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
|
||
</svg> <span class="d2h-file-name">{diff/maplibre-rs → xcode}/maplibre-rs.xcodeproj/project.pbxproj</span>
|
||
<span class="d2h-tag d2h-moved d2h-moved-tag">RENAMED</span></span>
|
||
<label class="d2h-file-collapse">
|
||
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||
Viewed
|
||
</label>
|
||
</div>
|
||
<div class="d2h-file-diff">
|
||
<div class="d2h-code-wrapper">
|
||
<table class="d2h-diff-table">
|
||
<tbody class="d2h-diff-tbody">
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">29</div>
|
||
<div class="line-num2">33</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"><br></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">30</div>
|
||
<div class="line-num2">34</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn">/* Begin PBXFrameworksBuildPhase section */</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">31</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452E128132EA6003BD2A5</del> /* Frameworks */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">35</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D5682812903700906D21</ins> /* Frameworks */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">32</div>
|
||
<div class="line-num2">36</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> isa = PBXFrameworksBuildPhase;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">33</div>
|
||
<div class="line-num2">37</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> buildActionMask = 2147483647;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">34</div>
|
||
<div class="line-num2">38</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> files = (</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">39</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> 0B85D5A42812991100906D21 /* libmaplibre_apple.a in Frameworks */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">35</div>
|
||
<div class="line-num2">40</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">36</div>
|
||
<div class="line-num2">41</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> runOnlyForDeploymentPostprocessing = 0;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">37</div>
|
||
<div class="line-num2">42</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">38</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452F128132EB5003BD2A5</del> /* Frameworks */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">43</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D57B281290F800906D21</ins> /* Frameworks */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">39</div>
|
||
<div class="line-num2">44</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> isa = PBXFrameworksBuildPhase;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">40</div>
|
||
<div class="line-num2">45</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> buildActionMask = 2147483647;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">41</div>
|
||
<div class="line-num2">46</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> files = (</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">47</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> 0B85D596281291A400906D21 /* maplibre_rs.framework in Frameworks */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">42</div>
|
||
<div class="line-num2">48</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">43</div>
|
||
<div class="line-num2">49</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> runOnlyForDeploymentPostprocessing = 0;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">44</div>
|
||
<div class="line-num2">50</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">45</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452F628132EB5003BD2A5</del> /* Frameworks */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">51</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D580281290F800906D21</ins> /* Frameworks */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">46</div>
|
||
<div class="line-num2">52</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> isa = PBXFrameworksBuildPhase;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">47</div>
|
||
<div class="line-num2">53</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> buildActionMask = 2147483647;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">48</div>
|
||
<div class="line-num2">54</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> files = (</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">55</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> 0B85D599281291A700906D21 /* maplibre_rs.framework in Frameworks */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">49</div>
|
||
<div class="line-num2">56</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">50</div>
|
||
<div class="line-num2">57</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> runOnlyForDeploymentPostprocessing = 0;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">51</div>
|
||
<div class="line-num2">58</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">59</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn">/* End PBXFrameworksBuildPhase section */</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>The framework needs to link against the static library <code>libmaplibre_apple.a</code>, which has been generated by Cargo.
|
||
In order to allow XCode to dynamically select the library based on the <code>Library Search Path</code> (Build Settings) one needs
|
||
to add a relative file to XCode. The entry in the <code>project.pbxproj</code> should look like that:</p>
|
||
<pre><code class="language-js">B085D5A32812987B00906D21 /* libmaplibre_apple.a */ = {
|
||
isa = PBXFileReference;
|
||
lastKnownFileType = archive.ar;
|
||
path = libmaplibre_apple.a;
|
||
sourceTree = SOURCE_ROOT;
|
||
};
|
||
</code></pre>
|
||
<p>Note the <code>path = libmaplibre_apple.a</code>. This path does not link to a concrete file, but to a file which can be found
|
||
during building.</p>
|
||
<p>A file can be added to the frameworks and library link phase in XCode.</p>
|
||
<h3 id="cargo-build-phase"><a class="header" href="#cargo-build-phase">Cargo Build Phase</a></h3>
|
||
<div class="d2h-file-wrapper" data-lang="pbxproj">
|
||
<div class="d2h-file-header">
|
||
<span class="d2h-file-name-wrapper">
|
||
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
|
||
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
|
||
</svg> <span class="d2h-file-name">{diff/maplibre-rs → xcode}/maplibre-rs.xcodeproj/project.pbxproj</span>
|
||
<span class="d2h-tag d2h-moved d2h-moved-tag">RENAMED</span></span>
|
||
<label class="d2h-file-collapse">
|
||
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||
Viewed
|
||
</label>
|
||
</div>
|
||
<div class="d2h-file-diff">
|
||
<div class="d2h-code-wrapper">
|
||
<table class="d2h-diff-table">
|
||
<tbody class="d2h-diff-tbody">
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">114</div>
|
||
<div class="line-num2">131</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn">/* Begin PBXNativeTarget section */</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">115</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452E328132EA6003BD2A5</del> /* maplibre-rs */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">132</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D56A2812903700906D21</ins> /* maplibre-rs */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">116</div>
|
||
<div class="line-num2">133</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> isa = PBXNativeTarget;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">117</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> buildConfigurationList = <del>0BE452E928132EA6003BD2A5</del> /* Build configuration list for PBXNativeTarget "maplibre-rs" */;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">134</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> buildConfigurationList = <ins>0B85D5702812903700906D21</ins> /* Build configuration list for PBXNativeTarget "maplibre-rs" */;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">118</div>
|
||
<div class="line-num2">135</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> buildPhases = (</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">119</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452DF28132EA6003BD2A5</del> /* Headers */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">120</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452E028132EA6003BD2A5</del> /* Sources */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">121</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452E128132EA6003BD2A5</del> /* Frameworks */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">122</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452E228132EA6003BD2A5</del> /* Resources */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">136</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D5662812903700906D21</ins> /* Headers */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">137</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D5672812903700906D21</ins> /* Sources */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">138</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D5682812903700906D21</ins> /* Frameworks */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">139</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D5692812903700906D21</ins> /* Resources */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">140</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> 0BE452D72812EFC1003BD2A5 /* Cargo Build */,</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">229</div>
|
||
<div class="line-num2">248</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">230</div>
|
||
<div class="line-num2">249</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> runOnlyForDeploymentPostprocessing = 0;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">231</div>
|
||
<div class="line-num2">250</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">232</div>
|
||
<div class="line-num2">251</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn">/* End PBXResourcesBuildPhase section */</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">233</div>
|
||
<div class="line-num2">252</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"><br></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">253</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn">/* Begin PBXShellScriptBuildPhase section */</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">254</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> 0BE452D72812EFC1003BD2A5 /* Cargo Build */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">255</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> isa = PBXShellScriptBuildPhase;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">256</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> buildActionMask = 2147483647;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">257</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> files = (</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">258</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">259</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> inputFileListPaths = (</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">260</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">261</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> inputPaths = (</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">262</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">263</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> name = "Cargo Build";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">264</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> outputFileListPaths = (</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">265</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">266</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> outputPaths = (</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">267</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">268</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> runOnlyForDeploymentPostprocessing = 0;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">269</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> shellPath = /bin/bash;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">270</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> shellScript = ". \"$HOME/.cargo/env\"\n\narch=\"unknown\"\nvendor=\"apple\"\nos_type=\"unknown\"\nenvironment_type=\"\"\n\nmode=\"\"\n\necho \"ARCH: $ARCHS\"\n\nif [[ $CONFIGURATION == \"Release\" ]]\nthen\n mode=\"--release\"\nfi\n\nif [[ $ARCHS == \"x86_64\" ]]\nthen\n arch=\"x86_64\"\nelif [[ $ARCHS == \"arm64\" ]]\nthen\n arch=\"aarch64\"\nfi\n\nif [[ $SDK_NAME == *\"iphoneos\"* ]]\nthen\n os_type=\"ios\"\nelif [[ $SDK_NAME == *\"macos\"* ]]\nthen\n os_type=\"darwin\"\nelif [[ $SDK_NAME == *\"iphonesimulator\"* ]]\nthen\n os_type=\"ios\"\n environment_type=\"sim\"\nfi\n\n\ntriplet=\"$arch-$vendor-$os_type\"\n\nif [ -n \"$environment_type\" ]\nthen\n triplet=\"$triplet-$environment_type\"\nfi\n\necho \"$mode\"\necho \"$triplet\"\n\nenv -i zsh -c \"cargo build -p maplibre-apple $mode --target $triplet --lib\"\n\n";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">271</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">272</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn">/* End PBXShellScriptBuildPhase section */</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>In order to trigger Cargo builds when starting a XCode build we include a <code>Cargo Build</code> script. This build script needs
|
||
to run before the linking phase (drag and drop it to the top).</p>
|
||
<p>The following build script builds based on XCode environment variables the correct static library. We depend on
|
||
the <code>$ARCHS</code>
|
||
environment variable, as the others seem unreliable. Note that this can include multiple architectures, unless the build
|
||
setting <code>ONLY_ACTIVE_ARCH</code> is set to <code>YES</code>.</p>
|
||
<pre><code class="language-bash">arch="unknown"
|
||
vendor="apple"
|
||
os_type="unknown"
|
||
environment_type=""
|
||
|
||
mode=""
|
||
|
||
echo "ARCH: $ARCHS"
|
||
|
||
if [[ $CONFIGURATION == "Release" ]]
|
||
then
|
||
mode="--release"
|
||
fi
|
||
|
||
if [[ $ARCHS == "x86_64" ]]
|
||
then
|
||
arch="x86_64"
|
||
elif [[ $ARCHS == "arm64" ]]
|
||
then
|
||
arch="aarch64"
|
||
fi
|
||
|
||
if [[ $SDK_NAME == *"iphoneos"* ]]
|
||
then
|
||
os_type="ios"
|
||
elif [[ $SDK_NAME == *"macos"* ]]
|
||
then
|
||
os_type="darwin"
|
||
elif [[ $SDK_NAME == *"iphonesimulator"* ]]
|
||
then
|
||
os_type="ios"
|
||
if [[ $ARCHS == "arm64" ]]
|
||
then
|
||
environment_type="sim"
|
||
fi
|
||
fi
|
||
|
||
|
||
triplet="$arch-$vendor-$os_type"
|
||
|
||
if [ -n "$environment_type" ]
|
||
then
|
||
triplet="$triplet-$environment_type"
|
||
fi
|
||
|
||
echo "Mode: $mode"
|
||
echo "Triplet: $triplet"
|
||
echo "Shell: $SHELL"
|
||
|
||
cmd="export HOME=$HOME && . $HOME/.cargo/env && cargo build -p apple $mode --target $triplet --lib"
|
||
|
||
echo "Command: $cmd"
|
||
|
||
env -i /bin/bash -c "$cmd"
|
||
</code></pre>
|
||
<h3 id="build-settings"><a class="header" href="#build-settings">Build Settings</a></h3>
|
||
<div class="d2h-file-wrapper" data-lang="pbxproj">
|
||
<div class="d2h-file-header">
|
||
<span class="d2h-file-name-wrapper">
|
||
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
|
||
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
|
||
</svg> <span class="d2h-file-name">{diff/maplibre-rs → xcode}/maplibre-rs.xcodeproj/project.pbxproj</span>
|
||
<span class="d2h-tag d2h-moved d2h-moved-tag">RENAMED</span></span>
|
||
<label class="d2h-file-collapse">
|
||
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||
Viewed
|
||
</label>
|
||
</div>
|
||
<div class="d2h-file-diff">
|
||
<div class="d2h-code-wrapper">
|
||
<table class="d2h-diff-table">
|
||
<tbody class="d2h-diff-tbody">
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">260</div>
|
||
<div class="line-num2">299</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn">/* End PBXSourcesBuildPhase section */</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">275</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452EA28132EA6003BD2A5</del> /* Debug */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">314</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D5712812903700906D21</ins> /* Debug */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">276</div>
|
||
<div class="line-num2">315</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> isa = XCBuildConfiguration;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">277</div>
|
||
<div class="line-num2">316</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> buildSettings = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">317</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">278</div>
|
||
<div class="line-num2">318</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> ALWAYS_SEARCH_USER_PATHS = NO;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">319</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> BUILD_LIBRARY_FOR_DISTRIBUTION = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">279</div>
|
||
<div class="line-num2">320</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_ANALYZER_NONNULL = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">280</div>
|
||
<div class="line-num2">321</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">281</div>
|
||
<div class="line-num2">322</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -304,11 +345,13 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">304</div>
|
||
<div class="line-num2">345</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">305</div>
|
||
<div class="line-num2">346</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_WARN_UNREACHABLE_CODE = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">306</div>
|
||
<div class="line-num2">347</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">307</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>CODE_SIGN_STYLE</del> = <del>Automatic</del>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">348</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>CODE_SIGN_IDENTITY</ins> = <ins>"Apple Development"</ins>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">349</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> CODE_SIGN_STYLE = Manual;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">308</div>
|
||
<div class="line-num2">350</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> COPY_PHASE_STRIP = NO;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">309</div>
|
||
<div class="line-num2">351</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CURRENT_PROJECT_VERSION = 1;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">310</div>
|
||
<div class="line-num2">352</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> DEBUG_INFORMATION_FORMAT = dwarf;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">311</div>
|
||
<div class="line-num2">353</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> DEFINES_MODULE = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">354</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> DEVELOPMENT_TEAM = "";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">312</div>
|
||
<div class="line-num2">355</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> DYLIB_COMPATIBILITY_VERSION = 1;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">313</div>
|
||
<div class="line-num2">356</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> DYLIB_CURRENT_VERSION = 1;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">314</div>
|
||
<div class="line-num2">357</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> DYLIB_INSTALL_NAME_BASE = "@rpath";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -337,14 +380,28 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">337</div>
|
||
<div class="line-num2">380</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> "@executable_path/Frameworks",</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">338</div>
|
||
<div class="line-num2">381</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> "@loader_path/Frameworks",</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">339</div>
|
||
<div class="line-num2">382</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">383</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> LIBRARY_SEARCH_PATHS = (</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">384</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "$(inherited)",</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">385</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "$(PROJECT_DIR)",</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">386</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">387</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/libs/aarch64-apple-ios/debug";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">388</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=x86_64]" = "$(PROJECT_DIR)/libs/x86_64-apple-ios/debug";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">389</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/libs/aarch64-apple-ios-sim/debug";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">390</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "LIBRARY_SEARCH_PATHS[sdk=macosx*][arch=arm64]" = "$(PROJECT_DIR)/libs/aarch64-apple-darwin/debug";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">391</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "LIBRARY_SEARCH_PATHS[sdk=macosx*][arch=x86_64]" = "$(PROJECT_DIR)/libs/x86_64-apple-darwin/debug";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">392</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> MACH_O_TYPE = staticlib;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">340</div>
|
||
<div class="line-num2">393</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> MARKETING_VERSION = 1.0;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">341</div>
|
||
<div class="line-num2">394</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">342</div>
|
||
<div class="line-num2">395</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> MTL_FAST_MATH = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">343</div>
|
||
<div class="line-num2">396</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> ONLY_ACTIVE_ARCH = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">344</div>
|
||
<div class="line-num2">397</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> PRODUCT_BUNDLE_IDENTIFIER = "org.maplibre.maplibre-rs";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">345</div>
|
||
<div class="line-num2">398</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">399</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> PROVISIONING_PROFILE_SPECIFIER = "";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">400</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">346</div>
|
||
<div class="line-num2">401</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> SDKROOT = iphoneos;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">347</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> SKIP_INSTALL = <del>YES</del>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">402</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> SKIP_INSTALL = <ins>NO</ins>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">403</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">404</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> SUPPORTS_MACCATALYST = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">348</div>
|
||
<div class="line-num2">405</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">349</div>
|
||
<div class="line-num2">406</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> SWIFT_EMIT_LOC_STRINGS = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">350</div>
|
||
<div class="line-num2">407</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> SWIFT_OPTIMIZATION_LEVEL = "-Onone";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -355,10 +412,12 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">355</div>
|
||
<div class="line-num2">412</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">356</div>
|
||
<div class="line-num2">413</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> name = Debug;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">357</div>
|
||
<div class="line-num2">414</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">358</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452EB28132EA6003BD2A5</del> /* Release */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">415</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D5722812903700906D21</ins> /* Release */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">359</div>
|
||
<div class="line-num2">416</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> isa = XCBuildConfiguration;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">360</div>
|
||
<div class="line-num2">417</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> buildSettings = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">418</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">361</div>
|
||
<div class="line-num2">419</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> ALWAYS_SEARCH_USER_PATHS = NO;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">420</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> BUILD_LIBRARY_FOR_DISTRIBUTION = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">362</div>
|
||
<div class="line-num2">421</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_ANALYZER_NONNULL = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">363</div>
|
||
<div class="line-num2">422</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">364</div>
|
||
<div class="line-num2">423</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -387,11 +446,13 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">387</div>
|
||
<div class="line-num2">446</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">388</div>
|
||
<div class="line-num2">447</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_WARN_UNREACHABLE_CODE = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">389</div>
|
||
<div class="line-num2">448</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">390</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>CODE_SIGN_STYLE</del> = <del>Automatic</del>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">449</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>CODE_SIGN_IDENTITY</ins> = <ins>"Apple Development"</ins>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">450</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> CODE_SIGN_STYLE = Manual;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">391</div>
|
||
<div class="line-num2">451</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> COPY_PHASE_STRIP = NO;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">392</div>
|
||
<div class="line-num2">452</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> CURRENT_PROJECT_VERSION = 1;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">393</div>
|
||
<div class="line-num2">453</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">394</div>
|
||
<div class="line-num2">454</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> DEFINES_MODULE = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">455</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> DEVELOPMENT_TEAM = "";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">395</div>
|
||
<div class="line-num2">456</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> DYLIB_COMPATIBILITY_VERSION = 1;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">396</div>
|
||
<div class="line-num2">457</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> DYLIB_CURRENT_VERSION = 1;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">397</div>
|
||
<div class="line-num2">458</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> DYLIB_INSTALL_NAME_BASE = "@rpath";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -414,13 +475,28 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">414</div>
|
||
<div class="line-num2">475</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> "@executable_path/Frameworks",</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">415</div>
|
||
<div class="line-num2">476</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> "@loader_path/Frameworks",</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">416</div>
|
||
<div class="line-num2">477</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">478</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> LIBRARY_SEARCH_PATHS = (</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">479</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "$(inherited)",</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">480</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "$(PROJECT_DIR)",</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">481</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> );</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">482</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/libs/aarch64-apple-ios/release";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">483</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=x86_64]" = "$(PROJECT_DIR)/libs/x86_64-apple-ios/release";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">484</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/libs/aarch64-apple-ios-sim/release";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">485</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "LIBRARY_SEARCH_PATHS[sdk=macosx*][arch=arm64]" = "$(PROJECT_DIR)/libs/aarch64-apple-darwin/release";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">486</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "LIBRARY_SEARCH_PATHS[sdk=macosx*][arch=x86_64]" = "$(PROJECT_DIR)/libs/x86_64-apple-darwin/release";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">487</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> MACH_O_TYPE = staticlib;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">417</div>
|
||
<div class="line-num2">488</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> MARKETING_VERSION = 1.0;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">418</div>
|
||
<div class="line-num2">489</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> MTL_ENABLE_DEBUG_INFO = NO;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">419</div>
|
||
<div class="line-num2">490</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> MTL_FAST_MATH = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">491</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> ONLY_ACTIVE_ARCH = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">420</div>
|
||
<div class="line-num2">492</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> PRODUCT_BUNDLE_IDENTIFIER = "org.maplibre.maplibre-rs";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">421</div>
|
||
<div class="line-num2">493</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">494</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> PROVISIONING_PROFILE_SPECIFIER = "";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">495</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">422</div>
|
||
<div class="line-num2">496</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> SDKROOT = iphoneos;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">423</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> SKIP_INSTALL = <del>YES</del>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">497</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> SKIP_INSTALL = <ins>NO</ins>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">498</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">499</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> SUPPORTS_MACCATALYST = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">424</div>
|
||
<div class="line-num2">500</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> SWIFT_COMPILATION_MODE = wholemodule;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">425</div>
|
||
<div class="line-num2">501</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> SWIFT_EMIT_LOC_STRINGS = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">426</div>
|
||
<div class="line-num2">502</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> SWIFT_OPTIMIZATION_LEVEL = "-O";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -432,7 +508,7 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">432</div>
|
||
<div class="line-num2">508</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">433</div>
|
||
<div class="line-num2">509</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> name = Release;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">510</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>Explanations for the settings:</p>
|
||
<ul>
|
||
<li><code>BUILD_LIBRARY_FOR_DISTRIBUTION</code>: Define that this is a library (effect unknown to me)</li>
|
||
<li><code>CODE_SIGN_STYLE</code>: The framework is not signed</li>
|
||
<li><code>DEVELOPMENT_TEAM</code>: No development team is set</li>
|
||
<li><code>LIBRARY_SEARCH_PATHS[sdk=x][arch=y]</code>: We set the path for the <code>libmaplibre_apple.a</code> lies</li>
|
||
<li><code>MACH_O_TYPE</code> / <code>SKIP_INSTALL</code>: If this is not set to <code>staticlib</code> and <code>NO</code>, then the <code>libmaplibre_apple.a</code> binary is not included in the final framework xcarchive.</li>
|
||
<li><code>SUPPORTED_PLATFORMS</code>: Explicitly says that this library works on any platform. </li>
|
||
<li><code>SUPPORTS_MACCATALYST</code>: Explicitly says that this library works on Mac Catalyst.</li>
|
||
</ul>
|
||
<p>The same settings are done for Release and Debug.</p>
|
||
<h2 id="xcframework-packaging"><a class="header" href="#xcframework-packaging">xcframework packaging</a></h2>
|
||
<p>Creating a xcframework is usually quite straight forward. Just execute the following:</p>
|
||
<pre><code class="language-bash">xargs xcodebuild -create-xcframework -framework ./a -framework ./b -output out.xcframework
|
||
</code></pre>
|
||
<p>Unfortunately, it is not possible to bundle some frameworks together like:</p>
|
||
<ul>
|
||
<li>macOS-arm64 and macOS-x86_64</li>
|
||
</ul>
|
||
<p>In order to package these architectures and platforms together a fat binary needs to be created using the <code>lipo</code> tool.
|
||
This means from two frameworks we create a unified framework with a fat binary.
|
||
There are two important steps:</p>
|
||
<ol>
|
||
<li>Create a fat binary using <code>lipo -create binA binB -output binfat</code></li>
|
||
<li>Copy for example the arm64 framework and add the <code>.swiftmodule</code> definitions from the x86_64 framework</li>
|
||
</ol>
|
||
<h2 id="single-uiapplication"><a class="header" href="#single-uiapplication">Single UIApplication</a></h2>
|
||
<p>Right now <code>winit</code> only allows the usage of a <code>UIApplication</code>. This means the application needs to run in fullscreen.
|
||
<a href="https://github.com/maplibre/maplibre-rs/issues/28">Tracking Issue</a></p>
|
||
<h2 id="example-app"><a class="header" href="#example-app">Example App</a></h2>
|
||
<p>The following settings are important for the example application within the XCode project.</p>
|
||
<h3 id="info-plist-for-applications"><a class="header" href="#info-plist-for-applications">Info Plist for Applications</a></h3>
|
||
<div class="d2h-file-wrapper" data-lang="pbxproj">
|
||
<div class="d2h-file-header">
|
||
<span class="d2h-file-name-wrapper">
|
||
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
|
||
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
|
||
</svg> <span class="d2h-file-name">{diff/maplibre-rs → xcode}/maplibre-rs.xcodeproj/project.pbxproj</span>
|
||
<span class="d2h-tag d2h-moved d2h-moved-tag">RENAMED</span></span>
|
||
<label class="d2h-file-collapse">
|
||
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||
Viewed
|
||
</label>
|
||
</div>
|
||
<div class="d2h-file-diff">
|
||
<div class="d2h-code-wrapper">
|
||
<table class="d2h-diff-table">
|
||
<tbody class="d2h-diff-tbody">
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">435</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE4530328132EB5003BD2A5</del> /* Debug */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">511</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D58D281290F800906D21</ins> /* Debug */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">436</div>
|
||
<div class="line-num2">512</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> isa = XCBuildConfiguration;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">437</div>
|
||
<div class="line-num2">513</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> buildSettings = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">438</div>
|
||
<div class="line-num2">514</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> ALWAYS_SEARCH_USER_PATHS = NO;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -489,7 +565,7 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">489</div>
|
||
<div class="line-num2">565</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> GCC_WARN_UNUSED_FUNCTION = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">490</div>
|
||
<div class="line-num2">566</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> GCC_WARN_UNUSED_VARIABLE = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">491</div>
|
||
<div class="line-num2">567</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> GENERATE_INFOPLIST_FILE = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">492</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>INFOPLIST_KEY_UIApplicationSceneManifest_Generation</del> = <del>YES</del>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">568</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>INFOPLIST_FILE</ins> = <ins>"example--iOS--Info.plist"</ins>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">493</div>
|
||
<div class="line-num2">569</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">494</div>
|
||
<div class="line-num2">570</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> INFOPLIST_KEY_UILaunchScreen_Generation = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">495</div>
|
||
<div class="line-num2">571</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -514,7 +590,7 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">514</div>
|
||
<div class="line-num2">590</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">515</div>
|
||
<div class="line-num2">591</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> name = Debug;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">516</div>
|
||
<div class="line-num2">592</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">517</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE4530428132EB5003BD2A5</del> /* Release */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">593</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D58E281290F800906D21</ins> /* Release */ = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">518</div>
|
||
<div class="line-num2">594</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> isa = XCBuildConfiguration;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">519</div>
|
||
<div class="line-num2">595</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> buildSettings = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">520</div>
|
||
<div class="line-num2">596</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> ALWAYS_SEARCH_USER_PATHS = NO;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -565,7 +641,7 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">565</div>
|
||
<div class="line-num2">641</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> GCC_WARN_UNUSED_FUNCTION = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">566</div>
|
||
<div class="line-num2">642</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> GCC_WARN_UNUSED_VARIABLE = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">567</div>
|
||
<div class="line-num2">643</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> GENERATE_INFOPLIST_FILE = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">568</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>INFOPLIST_KEY_UIApplicationSceneManifest_Generation</del> = <del>YES</del>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">644</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>INFOPLIST_FILE</ins> = <ins>"example--iOS--Info.plist"</ins>;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">569</div>
|
||
<div class="line-num2">645</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">570</div>
|
||
<div class="line-num2">646</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> INFOPLIST_KEY_UILaunchScreen_Generation = YES;</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">571</div>
|
||
<div class="line-num2">647</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -590,7 +666,7 @@</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<ul>
|
||
<li>The <code>INFOPLIST_KEY_UIApplicationSceneManifest_Generation</code> needs to be unset. Else the application screen is just black.</li>
|
||
</ul>
|
||
<h3 id="files--assets"><a class="header" href="#files--assets">Files & Assets</a></h3>
|
||
<div class="d2h-file-wrapper" data-lang="pbxproj">
|
||
<div class="d2h-file-header">
|
||
<span class="d2h-file-name-wrapper">
|
||
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
|
||
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
|
||
</svg> <span class="d2h-file-name">{diff/maplibre-rs → xcode}/maplibre-rs.xcodeproj/project.pbxproj</span>
|
||
<span class="d2h-tag d2h-moved d2h-moved-tag">RENAMED</span></span>
|
||
<label class="d2h-file-collapse">
|
||
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||
Viewed
|
||
</label>
|
||
</div>
|
||
<div class="d2h-file-diff">
|
||
<div class="d2h-code-wrapper">
|
||
<table class="d2h-diff-table">
|
||
<tbody class="d2h-diff-tbody">
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -7,93 +7,110 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">7</div>
|
||
<div class="line-num2">7</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"> objects = {</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">8</div>
|
||
<div class="line-num2">8</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"><br></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">9</div>
|
||
<div class="line-num2">9</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn">/* Begin PBXBuildFile section */</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">10</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452E828132EA6003BD2A5</del> /* maplibre_rs.h in Headers */ = {isa = PBXBuildFile; fileRef = <del>0BE452E728132EA6003BD2A5</del> /* maplibre_rs.h */; settings = {ATTRIBUTES = (Public, ); }; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">11</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452FC28132EB5003BD2A5</del> /* exampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = <del>0BE452ED28132EB5003BD2A5</del> /* exampleApp.swift */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">12</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452FD28132EB5003BD2A5</del> /* exampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = <del>0BE452ED28132EB5003BD2A5</del> /* exampleApp.swift */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">13</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452FE28132EB5003BD2A5</del> /* <del>ContentView</del>.<del>swift</del> in <del>Sources</del> */ = {isa = PBXBuildFile; fileRef = <del>0BE452EE28132EB5003BD2A5</del> /* <del>ContentView</del>.<del>swift</del> */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">14</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452FF28132EB5003BD2A5</del> /* <del>ContentView</del>.<del>swift</del> in <del>Sources</del> */ = {isa = PBXBuildFile; fileRef = <del>0BE452EE28132EB5003BD2A5</del> /* <del>ContentView</del>.<del>swift</del> */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">15</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE4530028132EB5003BD2A5</del> /* <del>Assets</del>.<del>xcassets</del> in <del>Resources</del> */ = {isa = PBXBuildFile; fileRef = <del>0BE452EF28132EB5003BD2A5</del> /* <del>Assets</del>.<del>xcassets</del> */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">16</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE4530128132EB5003BD2A5</del> /* <del>Assets</del>.<del>xcassets</del> in <del>Resources</del> */ = {isa = PBXBuildFile; fileRef = <del>0BE452EF28132EB5003BD2A5</del> /* <del>Assets</del>.<del>xcassets</del> */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">10</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D56F2812903700906D21</ins> /* maplibre_rs.h in Headers */ = {isa = PBXBuildFile; fileRef = <ins>0B85D56E2812903700906D21</ins> /* maplibre_rs.h */; settings = {ATTRIBUTES = (Public, ); }; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">11</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D586281290F800906D21</ins> /* exampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = <ins>0B85D577281290F800906D21</ins> /* exampleApp.swift */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">12</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D587281290F800906D21</ins> /* exampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = <ins>0B85D577281290F800906D21</ins> /* exampleApp.swift */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">13</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D58A281290F800906D21</ins> /* <ins>Assets</ins>.<ins>xcassets</ins> in <ins>Resources</ins> */ = {isa = PBXBuildFile; fileRef = <ins>0B85D579281290F800906D21</ins> /* <ins>Assets</ins>.<ins>xcassets</ins> */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">14</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D58B281290F800906D21</ins> /* <ins>Assets</ins>.<ins>xcassets</ins> in <ins>Resources</ins> */ = {isa = PBXBuildFile; fileRef = <ins>0B85D579281290F800906D21</ins> /* <ins>Assets</ins>.<ins>xcassets</ins> */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">15</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D5952812913700906D21</ins> /* <ins>maplibre</ins>.<ins>swift</ins> in <ins>Sources</ins> */ = {isa = PBXBuildFile; fileRef = <ins>0B85D5942812913700906D21</ins> /* <ins>maplibre</ins>.<ins>swift</ins> */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">16</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D596281291A400906D21</ins> /* <ins>maplibre_rs</ins>.<ins>framework</ins> in <ins>Frameworks</ins> */ = {isa = PBXBuildFile; fileRef = <ins>0B85D56B2812903700906D21</ins> /* <ins>maplibre_rs</ins>.<ins>framework</ins> */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">17</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> 0B85D599281291A700906D21 /* maplibre_rs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B85D56B2812903700906D21 /* maplibre_rs.framework */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">18</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> 0B85D5A42812991100906D21 /* libmaplibre_apple.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B85D5A32812987B00906D21 /* libmaplibre_apple.a */; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">17</div>
|
||
<div class="line-num2">19</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn">/* End PBXBuildFile section */</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">18</div>
|
||
<div class="line-num2">20</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn"><br></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx">
|
||
<div class="line-num1">19</div>
|
||
<div class="line-num2">21</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn">/* Begin PBXFileReference section */</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">20</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452E428132EA6003BD2A5</del> /* maplibre_rs.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = maplibre_rs.framework; sourceTree = BUILT_PRODUCTS_DIR; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">21</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452E728132EA6003BD2A5</del> /* maplibre_rs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = maplibre_rs.h; sourceTree = "<group>"; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">22</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452ED28132EB5003BD2A5</del> /* exampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = exampleApp.swift; sourceTree = "<group>"; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">23</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452EE28132EB5003BD2A5</del> /* <del>ContentView</del>.<del>swift</del> */ = {isa = PBXFileReference; lastKnownFileType = <del>sourcecode</del>.<del>swift</del>; path = <del>ContentView</del>.<del>swift</del>; sourceTree = "<group>"; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">24</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452EF28132EB5003BD2A5</del> /* <del>Assets</del>.<del>xcassets</del> */ = {isa = PBXFileReference; <del>lastKnownFileType</del> = <del>folder</del>.<del>assetcatalog</del>; path = <del>Assets</del>.<del>xcassets</del>; sourceTree = <del>"<group>"</del>; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">25</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452F428132EB5003BD2A5</del> /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">26</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452F928132EB5003BD2A5</del> /* <del>example</del>.<del>app</del> */ = {isa = PBXFileReference; <del>explicitFileType</del> = <del>wrapper</del>.<del>application</del>; <del>includeInIndex = 0; </del>path = <del>example</del>.<del>app</del>; sourceTree = <del>BUILT_PRODUCTS_DIR</del>; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||
<div class="line-num1">27</div>
|
||
<div class="line-num2"></div>
|
||
</td>
|
||
<td class="d2h-del d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">-</span>
|
||
<span class="d2h-code-line-ctn"> <del>0BE452FB28132EB5003BD2A5</del> /* <del>macOS</del>.<del>entitlements</del> */ = {isa = PBXFileReference; lastKnownFileType = <del>text</del>.<del>plist.entitlements</del>; path = <del>macOS</del>.<del>entitlements</del>; sourceTree = "<group>"; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">22</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D56B2812903700906D21</ins> /* maplibre_rs.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = maplibre_rs.framework; sourceTree = BUILT_PRODUCTS_DIR; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">23</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D56E2812903700906D21</ins> /* maplibre_rs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = maplibre_rs.h; sourceTree = "<group>"; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">24</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D577281290F800906D21</ins> /* exampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = exampleApp.swift; sourceTree = "<group>"; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">25</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D579281290F800906D21</ins> /* <ins>Assets</ins>.<ins>xcassets</ins> */ = {isa = PBXFileReference; lastKnownFileType = <ins>folder</ins>.<ins>assetcatalog</ins>; path = <ins>Assets</ins>.<ins>xcassets</ins>; sourceTree = "<group>"; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">26</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D57E281290F800906D21</ins> /* <ins>example</ins>.<ins>app</ins> */ = {isa = PBXFileReference; <ins>explicitFileType</ins> = <ins>wrapper</ins>.<ins>application</ins>; <ins>includeInIndex = 0; </ins>path = <ins>example</ins>.<ins>app</ins>; sourceTree = <ins>BUILT_PRODUCTS_DIR</ins>; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">27</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D583281290F800906D21</ins> /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">28</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D585281290F800906D21</ins> /* <ins>macOS</ins>.<ins>entitlements</ins> */ = {isa = PBXFileReference; <ins>lastKnownFileType</ins> = <ins>text</ins>.<ins>plist.entitlements</ins>; path = <ins>macOS</ins>.<ins>entitlements</ins>; sourceTree = <ins>"<group>"</ins>; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">29</div>
|
||
</td>
|
||
<td class="d2h-ins d2h-change">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <ins>0B85D5942812913700906D21</ins> /* <ins>maplibre</ins>.<ins>swift</ins> */ = {isa = PBXFileReference; lastKnownFileType = <ins>sourcecode</ins>.<ins>swift</ins>; path = <ins>maplibre</ins>.<ins>swift</ins>; sourceTree = "<group>"; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">30</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> 0B85D5A32812987B00906D21 /* libmaplibre_apple.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libmaplibre_apple.a; sourceTree = SOURCE_ROOT; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">31</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> 0BE452D62812EEA8003BD2A5 /* example--iOS--Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "example--iOS--Info.plist"; sourceTree = "<group>"; };</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-cntx d2h-info">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">32</div>
|
||
</td>
|
||
<td class="d2h-cntx">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix"> </span>
|
||
<span class="d2h-code-line-ctn">/* End PBXFileReference section */</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<ul>
|
||
<li>The example/demo application within the XCode project references the <code>maplibre_rs.framework</code>. Some default files have
|
||
been removed.</li>
|
||
</ul>
|
||
<h3 id="macos-entitlements"><a class="header" href="#macos-entitlements">MacOS Entitlements</a></h3>
|
||
<div id="d2h-648583" class="d2h-file-wrapper" data-lang="entitlements">
|
||
<div class="d2h-file-header">
|
||
<span class="d2h-file-name-wrapper">
|
||
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
|
||
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
|
||
</svg> <span class="d2h-file-name">xcode/macOS/macOS.entitlements</span>
|
||
<span class="d2h-tag d2h-added d2h-added-tag">ADDED</span></span>
|
||
<label class="d2h-file-collapse">
|
||
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||
Viewed
|
||
</label>
|
||
</div>
|
||
<div class="d2h-file-diff">
|
||
<div class="d2h-code-wrapper">
|
||
<table class="d2h-diff-table">
|
||
<tbody class="d2h-diff-tbody">
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-info"></td>
|
||
<td class="d2h-info">
|
||
<div class="d2h-code-line">@@ -0,0 +1,12 @@</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">1</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"><?xml version="1.0" encoding="UTF-8"?></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">2</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">3</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"><plist version="1.0"></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">4</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"><dict></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">5</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <key>com.apple.security.app-sandbox</key></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">6</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <true/></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">7</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <key>com.apple.security.files.user-selected.read-only</key></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">8</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <true/></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">9</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <key>com.apple.security.network.client</key></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">10</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"> <true/></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">11</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"></dict></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="d2h-code-linenumber d2h-ins">
|
||
<div class="line-num1"></div>
|
||
<div class="line-num2">12</div>
|
||
</td>
|
||
<td class="d2h-ins">
|
||
<div class="d2h-code-line">
|
||
<span class="d2h-code-line-prefix">+</span>
|
||
<span class="d2h-code-line-ctn"></plist></span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<ul>
|
||
<li>On macOS one needs to allow network access via <code>com.apple.security.network.client</code></li>
|
||
</ul>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="android-1"><a class="header" href="#android-1">Android</a></h1>
|
||
<h2 id="gradle-project-setup"><a class="header" href="#gradle-project-setup">Gradle Project Setup</a></h2>
|
||
<p>In order to package an Android <code>.aar</code> archive we use
|
||
the <a href="https://github.com/mozilla/rust-android-gradle">rust-android-gradle</a>.
|
||
Except some customisations for the latest NDK toolchain release everything worked flawlessly.</p>
|
||
<h2 id="jni"><a class="header" href="#jni">JNI</a></h2>
|
||
<p>There is no way right now to automatically generate JNI stubs for Rust. A manual example is available in the android
|
||
crate of maplibre-rs.</p>
|
||
<h2 id="single-nativeactivity"><a class="header" href="#single-nativeactivity">Single NativeActivity</a></h2>
|
||
<p>Right now <code>winit</code> only allows the usage of a <code>NativeActivity</code>. This means the application needs to run in fullscreen.
|
||
This native activity is referenced in the ´AndroidManifest.xml` by defining the name of the shared library.
|
||
<a href="https://github.com/maplibre/maplibre-rs/issues/28">Tracking Issue</a></p>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="web"><a class="header" href="#web">Web</a></h1>
|
||
<p>This document describes issues and challenges when packaging maplibre-rs as a npm package.</p>
|
||
<h2 id="required-formats"><a class="header" href="#required-formats">Required Formats</a></h2>
|
||
<h3 id="esm"><a class="header" href="#esm">ESM</a></h3>
|
||
<p>The ESM module format is the standard nowadays which should be followed. If a JS bundler encounters an ESM
|
||
module it can resolve WebAssembly files or WebWorkers dynamically.
|
||
The following syntax is used to resolve referenced WebWorkers:</p>
|
||
<pre><code class="language-ts">new Worker(new URL("./multithreaded-pool.worker.ts", import.meta.url), {
|
||
type: 'module'
|
||
});
|
||
</code></pre>
|
||
<p>Similarly, the following works:</p>
|
||
<pre><code class="language-ts">new URL('index_bg.wasm', import.meta.url);
|
||
</code></pre>
|
||
<h3 id="iife-immediately-invoked-function-expression"><a class="header" href="#iife-immediately-invoked-function-expression">IIFE (immediately-invoked function expression)</a></h3>
|
||
<blockquote>
|
||
<p>This format is used when including maplibre-rs in a <code><script></code> tag. The library is "written" onto the window/global
|
||
object. This allows quick prototyping/playgrounds/experiments using maplibre-rs.</p>
|
||
</blockquote>
|
||
<p>In order to support this we need to create a bundle which works on any modern browser. Additionally, a WASM file and
|
||
WebWorker needs to be deployed at a predictable path, because there is no bundler active which manages assets. Users of
|
||
these libraries have to specify where WASM or non-inlined WebWorkers are located.</p>
|
||
<p>Both assets could be inlined theoretically. This is common for WebWorkers, but not for WASM files.</p>
|
||
<h3 id="umd"><a class="header" href="#umd">UMD</a></h3>
|
||
<blockquote>
|
||
<p>UMD modules are needed when creating a library which should run in Node as well as browsers. This is not a use case
|
||
for maplibre-rs. If we support node, then we probably would ship a separate package called "maplibre-rs-node" which
|
||
bundles to CJS directly.</p>
|
||
</blockquote>
|
||
<h3 id="cjscommonjs"><a class="header" href="#cjscommonjs">CJS/CommonJS</a></h3>
|
||
<blockquote>
|
||
<p>Not needed for the browser build of maplibre-rs, possibly needed when supporting Node</p>
|
||
</blockquote>
|
||
<p>With a CommonJS module its is not possible for bundlers to dynamically resolve WebWorkers or WASM files.</p>
|
||
<p>The <code>import.meta.url</code> token can not exist in a CommonJS module. Therefore, bundlers which encounter a CommonJS module
|
||
have to use a different mechanism of resolving files.</p>
|
||
<p>Generally, we do not need to support CommonJS, because we are not targeting Node with maplibre-rs. It's properly good to
|
||
support it as a fallback though, for bundlers which can not deal with ESM modules yet.
|
||
This is for example true for test runners like Jest which require that dependencies are available as CJS module.</p>
|
||
<h2 id="wasm-pack-output"><a class="header" href="#wasm-pack-output">wasm-pack output</a></h2>
|
||
<p>wasm-pack can output <a href="https://rustwasm.github.io/docs/wasm-pack/commands/build.html#target">multiple formats</a>. The <code>web</code>
|
||
and <code>bundler</code> outputs offer the most modular modules.
|
||
Unfortunately, the
|
||
function <a href="https://docs.rs/wasm-bindgen/0.2.80/src/wasm_bindgen/lib.rs.html#1208-1217">wasm_bindgen::module()</a>
|
||
is only supported in <code>web</code> and <code>no-modules</code>. We currently are using this in order to send loaded instances
|
||
of <code>WebAssembly.Module</code> to WebWorkers. <code>nodejs</code> should not be used because MapLibre does not target Node.
|
||
Therefore, we should stick to the <code>web</code> output format.</p>
|
||
<h2 id="required-features"><a class="header" href="#required-features">Required Features</a></h2>
|
||
<ul>
|
||
<li>WASM Bundling: Make the WASM binary available to users of the maplibre-rs library</li>
|
||
<li>WebWorker Bundling: Make the WebWorker available to users of the maplibre-rs library. This could also be achived by inlining.</li>
|
||
<li>WebWorker Inlining: Inline the WebWorker bundle in the library bundle as a string.</li>
|
||
<li>Predictable Paths: Without predictable paths, it's difficult for users to reference the wasm file directly from the <code>node_modules</code> directory if requried.</li>
|
||
</ul>
|
||
<h2 id="bundler-feature-comparison"><a class="header" href="#bundler-feature-comparison">Bundler Feature Comparison</a></h2>
|
||
<div class="table-wrapper"><table><thead><tr><th>Bundler</th><th><em>ESM</em></th><th><em>IIFE</em></th><th>CJS</th><th>UMD</th><th><em>WebWorker Inlining</em></th><th>Web Worker Bundling</th><th><em>WASM Bundling</em></th><th><em>Predictable Paths</em></th><th>Inlining Environment Variables</th></tr></thead><tbody>
|
||
<tr><td>Babel 1)</td><td>✅</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>✅</td><td>✅</td></tr>
|
||
<tr><td>TypeScript 1)</td><td>✅</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>✅</td><td>❌</td></tr>
|
||
<tr><td>Webpack</td><td>❌ 4)</td><td>❓</td><td>❌</td><td>❓</td><td>❌ 2)</td><td>✅</td><td>✅</td><td>❓</td><td>✅</td></tr>
|
||
<tr><td>Parcel</td><td>✅</td><td>❌</td><td>✅</td><td>❌</td><td>🛠️ 3)</td><td>✅</td><td>✅</td><td>❌ 5)</td><td>✅</td></tr>
|
||
<tr><td>ESBuild</td><td>✅</td><td>✅</td><td>✅</td><td>❌</td><td>✅ 6)</td><td>❓</td><td>✅ 6)</td><td>✅</td><td>✅</td></tr>
|
||
<tr><td>Rollup</td><td>❓</td><td>❓</td><td>❓</td><td>❓</td><td>❓</td><td>❓</td><td>❓</td><td>❓</td><td>✅</td></tr>
|
||
</tbody></table>
|
||
</div>
|
||
<p>Features in <em><strong>italic</strong></em>s are required for maplibre-rs.</p>
|
||
<blockquote>
|
||
<ol>
|
||
<li>Technically not a bundler but can be used to emit ES modules</li>
|
||
<li>Was Supported in Webpack 4, but currently is not supported</li>
|
||
<li>https://github.com/parcel-bundler/parcel/issues/8004</li>
|
||
<li>As of the time of writing Webpack can not output ESM libraries</li>
|
||
<li>Plugins exist, but they don't work reliably</li>
|
||
<li>Plugins exist, and work reliably</li>
|
||
</ol>
|
||
</blockquote>
|
||
<h3 id="esbuild"><a class="header" href="#esbuild">ESBuild</a></h3>
|
||
<p>ESBuild supports CJS, ESM and IIFI modules equally well. Plugins exist for WebWorker inlining and resolving assets
|
||
through <code>import.meta.url</code>. The plugin quality seems to be superior compared to Parcel. It is also very fast compared to
|
||
all other bundlers.</p>
|
||
<ul>
|
||
<li>IIFI: The esbuild bundler translates to <code>new URL('index_bg.wasm', import.meta.url);</code> to
|
||
<pre><code class="language-js">var __currentScriptUrl__ = document.currentScript && document.currentScript.src || document.baseURI;
|
||
new URL("./assets/index_bg.wasm?emit=file", __currentScriptUrl__);
|
||
</code></pre>
|
||
</li>
|
||
</ul>
|
||
<p>See config in <code>web/lib/build.mjs</code> for an example usage.</p>
|
||
<h3 id="babel--typescript"><a class="header" href="#babel--typescript">Babel & TypeScript</a></h3>
|
||
<p>Babel and TypeScript both can produce ESM modules, but they <strong>fail with transforming references within the source code</strong>
|
||
like <code>new URL("./multithreaded-pool.worker.ts", import.meta.url)</code>. There exist some Babel plugins, but none of them is stable.
|
||
Therefore, we actually need a proper bundler which supports outputting ESM modules.
|
||
The only stable solution to this is Parcel. Parcel also has good documentation around the bundling of WebWorkers.</p>
|
||
<h3 id="webpack"><a class="header" href="#webpack">WebPack</a></h3>
|
||
<p>WebPack supports older module formats like CommonJS or UMD very well. It falls short when bundling the format ESM
|
||
format which is not yet stable. It also does not support inlining WebWorkers in version 5. The wasm-pack plugin
|
||
for WebPack makes including Cargo projects easy.</p>
|
||
<ul>
|
||
<li>CJS: Webpack translates <code>new URL('index_bg.wasm', import.meta.url);</code> to something that is equivalent to <code>'./index_bg.wasm'</code>
|
||
. It just expects that assets are resolvable from the current file.</li>
|
||
</ul>
|
||
<p>Example scripts for <code>package.json</code>:</p>
|
||
<pre><code class="language-json">{
|
||
"scripts": {
|
||
"webpack": "webpack --mode=development",
|
||
"webpack-webgl": "npm run build -- --env webgl",
|
||
"webpack-production": "webpack --mode=production",
|
||
"webpack-webgl-production": "npm run production-build -- --env webgl"
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>Example config:</p>
|
||
<pre><code class="language-js">const path = require("path");
|
||
const webpack = require("webpack");
|
||
const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");
|
||
|
||
let dist = path.join(__dirname, 'dist/maplibre-rs');
|
||
module.exports = (env) => ({
|
||
mode: "development",
|
||
entry: "./src/index.ts",
|
||
experiments: {
|
||
syncWebAssembly: true,
|
||
},
|
||
performance: {
|
||
maxEntrypointSize: 400000,
|
||
maxAssetSize: 400000000,
|
||
},
|
||
output: {
|
||
path: dist,
|
||
filename: "maplibre-rs.js",
|
||
library: {
|
||
name: 'maplibre_rs',
|
||
type: 'umd',
|
||
},
|
||
},
|
||
module: {
|
||
rules: [
|
||
{
|
||
test: /\.ts$/,
|
||
exclude: /node_modules/,
|
||
use: [
|
||
{
|
||
loader: 'ts-loader',
|
||
options: {}
|
||
}
|
||
]
|
||
},
|
||
],
|
||
},
|
||
resolve: {
|
||
extensions: ['.ts', '.js'],
|
||
},
|
||
plugins: [
|
||
new webpack.DefinePlugin({
|
||
'process.env.WEBGL': !!env.webgl
|
||
}),
|
||
new WasmPackPlugin({
|
||
crateDirectory: path.resolve(__dirname, '../'),
|
||
|
||
// Check https://rustwasm.github.io/wasm-pack/book/commands/build.html for
|
||
// the available set of arguments.
|
||
//
|
||
// Optional space delimited arguments to appear before the wasm-pack
|
||
// command. Default arguments are `--verbose`.
|
||
//args: '--log-level warn',
|
||
// Default arguments are `--typescript --target browser --mode normal`.
|
||
extraArgs: ` --target web -- . -Z build-std=std,panic_abort ${env.webgl ? '--features web-webgl' : ''} ${env.tracing ? '--features trace' : ''}`,
|
||
|
||
// Optional array of absolute paths to directories, changes to which
|
||
// will trigger the build.
|
||
// watchDirectories: [
|
||
// path.resolve(__dirname, "another-crate/src")
|
||
// ],
|
||
|
||
// The same as the `--out-dir` option for `wasm-pack`
|
||
outDir: path.resolve(__dirname, 'src/wasm-pack'),
|
||
|
||
// The same as the `--out-name` option for `wasm-pack`
|
||
// outName: "index",
|
||
|
||
// If defined, `forceWatch` will force activate/deactivate watch mode for
|
||
// `.rs` files.
|
||
//
|
||
// The default (not set) aligns watch mode for `.rs` files to Webpack's
|
||
// watch mode.
|
||
// forceWatch: true,
|
||
|
||
// If defined, `forceMode` will force the compilation mode for `wasm-pack`
|
||
//
|
||
// Possible values are `development` and `production`.
|
||
//
|
||
// the mode `development` makes `wasm-pack` build in `debug` mode.
|
||
// the mode `production` makes `wasm-pack` build in `release` mode.
|
||
// forceMode: "production",
|
||
|
||
// Controls plugin output verbosity, either 'info' or 'error'.
|
||
// Defaults to 'info'.
|
||
// pluginLogLevel: 'info'
|
||
}),
|
||
]
|
||
});
|
||
</code></pre>
|
||
<h3 id="parcel"><a class="header" href="#parcel">Parcel</a></h3>
|
||
<p>Parcel supports CommonJS and ESM modules equally good. The documentation about <code>import.meta.url</code> is very good. In other
|
||
bundlers documentations around this feature is missing. In the latest Parcel version inlining WebWorkers is not working.</p>
|
||
<ul>
|
||
<li>CJS: The Parcel bundler translates to <code>new URL('index_bg.wasm', import.meta.url);</code>
|
||
to <code>new URL("index_bg.wasm", "file:" + __filename);</code>
|
||
While depending on <code>file:</code> and <code>filename</code> works for NodeJS, it is unsupported in the browser.</li>
|
||
</ul>
|
||
<p>Example scripts for <code>package.json</code>:</p>
|
||
<pre><code class="language-json">{
|
||
"scripts": {
|
||
"parcel": "npm run clean && npm run wasm-pack && WEBGL=false parcel build --no-cache src/index.ts",
|
||
"parcel-webgl": "npm run clean && FEATURES=web-webgl npm run wasm-pack && WEBGL=true parcel build --no-cache src/index.ts"
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>Example config in `package.json:</p>
|
||
<pre><code class="language-json">{
|
||
"module": "dist/parcel-esm/module.js",
|
||
"main": "dist/parcel-cjs/main.js",
|
||
"types": "dist/parcel/types.d.ts",
|
||
"targets": {
|
||
"main": {
|
||
"distDir": "./dist/parcel-cjs",
|
||
"context": "browser",
|
||
"outputFormat": "commonjs"
|
||
},
|
||
"module": {
|
||
"distDir": "./dist/parcel-esm",
|
||
"context": "browser",
|
||
"outputFormat": "esmodule"
|
||
}
|
||
},
|
||
"@parcel/transformer-js": {
|
||
"inlineFS": false,
|
||
"inlineEnvironment": [
|
||
"WEBGL"
|
||
]
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h3 id="rollup"><a class="header" href="#rollup">Rollup</a></h3>
|
||
<p>Not yet evaluated</p>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="appendix"><a class="header" href="#appendix">Appendix</a></h1>
|
||
<h2 id="goals"><a class="header" href="#goals">Goals</a></h2>
|
||
<h3 id="next-major-goals"><a class="header" href="#next-major-goals">Next Major Goals</a></h3>
|
||
<ul>
|
||
<li><del>Improve buffer_pool eviction rules</del></li>
|
||
<li><del>Use MPI: https://doc.rust-lang.org/book/ch16-02-message-passing.html</del></li>
|
||
<li>Input-handling via events and functional pipelines</li>
|
||
<li><del>Show old tiles until new tile is ready / Show mixed tiles, based on availability</del></li>
|
||
<li>Use a simple style definition
|
||
<ul>
|
||
<li>type: background/fill/line</li>
|
||
<li>minzoom/maxzoom</li>
|
||
<li>source</li>
|
||
<li>source-layer</li>
|
||
<li>paint (fill-color)</li>
|
||
</ul>
|
||
</li>
|
||
<li>Map feeling:
|
||
<ul>
|
||
<li>Wrap world around in x direction</li>
|
||
<li>Limit panning in y direction</li>
|
||
<li>Nicer default map style</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h3 id="intermediate-goals"><a class="header" href="#intermediate-goals">Intermediate Goals</a></h3>
|
||
<ul>
|
||
<li>Support multiple projections? PoC such that we are sure the renderer is acceptable</li>
|
||
</ul>
|
||
<h3 id="future-goals"><a class="header" href="#future-goals">Future Goals</a></h3>
|
||
<ul>
|
||
<li>Very simple text rendering</li>
|
||
<li>Cache tessellation results
|
||
<ul>
|
||
<li>We have three "caches": downloaded tiles, tessellated tiles, gpu tiles</li>
|
||
</ul>
|
||
</li>
|
||
<li>Handle missing tiles</li>
|
||
<li>Support different tile raster addressing</li>
|
||
</ul>
|
||
<h2 id="future-ideas"><a class="header" href="#future-ideas">Future Ideas</a></h2>
|
||
<ul>
|
||
<li>Use <a href="https://github.com/EmbarkStudios/rust-gpu">rust-gpu</a> as shading language</li>
|
||
<li>Focus on accessibility of maps: https://www.w3.org/WAI/RD/wiki/Accessible_Maps</li>
|
||
<li>Display in AR: https://developer.apple.com/documentation/arkit/displaying_an_ar_experience_with_metal</li>
|
||
<li>Use tracing framework: <a href="https://docs.rs/tracing/0.1.31/tracing">tracing</a></li>
|
||
</ul>
|
||
<h2 id="challenges"><a class="header" href="#challenges">Challenges:</a></h2>
|
||
<ul>
|
||
<li>Accuracy of floating point numbers is very bad for big world view
|
||
coordinates (<a href="https://en.wikipedia.org/wiki/IEEE_754#/media/File:IEEE754.svg">Plot</a>)</li>
|
||
<li><a href="https://paroj.github.io/gltut/Positioning/Tut07%20The%20Perils%20of%20World%20Space.html">Perils of World Space</a></li>
|
||
</ul>
|
||
<h3 id="create-paths-for-tessellating-streets"><a class="header" href="#create-paths-for-tessellating-streets">Create paths for tessellating streets</a></h3>
|
||
<p>Streets can have unusual shaped like shown <a href="https://www.google.de/maps/@48.1353883,11.5717232,19z">here</a> in Munich. OSM
|
||
does not offer such data and therefore just renders an ordinary street contour like
|
||
shown <a href="https://www.openstreetmap.org/query?lat=48.13533&lon=11.57143">here</a>.
|
||
Because the data is probably not available this is a very hard challenge.</p>
|
||
<div style="break-before: page; page-break-before: always;"></div><h1 id="related-resources"><a class="header" href="#related-resources">Related Resources</a></h1>
|
||
<h2 id="talks"><a class="header" href="#talks">Talks</a></h2>
|
||
<ul>
|
||
<li><a href="https://docs.google.com/presentation/d/e/2PACX-1vRsi-sGsqwUXEIQDClaZF4BH2RgjufQQ-yxFDWeOGrm0EbIf4H4lFY3U4at4cAIlxSTWi4XyF2LKjRu/pub">2022-04-13-World-in-Vectors</a></li>
|
||
</ul>
|
||
<h2 id="related-projects"><a class="header" href="#related-projects">Related Projects</a></h2>
|
||
<ul>
|
||
<li><a href="https://github.com/tangrams/tangram/">Tangram Renderer</a></li>
|
||
<li><a href="https://www.nextzen.org/">Tilezen/Nextzen</a></li>
|
||
<li><a href="https://protomaps.com/">Protomaps: New Maps Stack</a></li>
|
||
<li><a href="https://www.harp.gl/">Harp GL</a></li>
|
||
</ul>
|
||
<h2 id="gis"><a class="header" href="#gis">GIS</a></h2>
|
||
<ul>
|
||
<li><a href="https://www.maptiler.com/google-maps-coordinates-tile-bounds-projection">Google Maps Projection</a></li>
|
||
<li><a href="https://gist.github.com/maptiler/fddb5ce33ba995d5523de9afdf8ef118">Grid Calculation Examples</a></li>
|
||
<li><a href="https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames">Slippy map tilenames</a> (also known as XYZ) </li>
|
||
<li><a href="https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#TileMap_Diagram">TMS</a></li>
|
||
<li><a href="https://www.mapbox.com/blog/adaptive-projections">Mapbox Adaptive Projections</a></li>
|
||
<li><a href="https://docs.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system">Bing Map Tile System</a></li>
|
||
<li><a href="https://docs.microsoft.com/en-us/bingmaps/articles/understanding-scale-and-resolution">Bing: Understanding Scale and Resolution</a></li>
|
||
</ul>
|
||
<h2 id="webassembly-and-webworkers"><a class="header" href="#webassembly-and-webworkers">WebAssembly and WebWorkers</a></h2>
|
||
<p>Specs:</p>
|
||
<ul>
|
||
<li><a href="https://webassembly.github.io/threads/core/bikeshed/#atomic-memory-instructions%E2%91%A2">Thread/Atomics Proposal for WASM</a></li>
|
||
</ul>
|
||
<p>Projects:</p>
|
||
<ul>
|
||
<li><a href="https://github.com/Ciantic/rust-shared-wasm-experiments">Experiment with shared memory</a> and <a href="https://github.com/rustwasm/wasm-bindgen/issues/2225">the idea behind it</a></li>
|
||
<li><a href="https://github.com/wasm-rs/shared-channel">Shared channel</a></li>
|
||
<li><a href="https://docs.rs/async_executors/latest/async_executors/">Bridge for async executors</a></li>
|
||
<li><a href="https://github.com/GoogleChromeLabs/wasm-bindgen-rayon">Rayon for WebAssembly</a></li>
|
||
<li><a href="https://github.com/w3reality/wasm-mt">wasm-mt: postMessage message passing</a></li>
|
||
<li></li>
|
||
</ul>
|
||
<p>Articles:</p>
|
||
<ul>
|
||
<li><a href="https://web.dev/webassembly-threads/">WebAssembly Threads (official)</a></li>
|
||
<li><a href="https://rustwasm.github.io/2018/10/24/multithreading-rust-and-wasm.html">Multithreading Rust and Wasm 2018</a></li>
|
||
<li><a href="https://surma.dev/things/is-postmessage-slow/">postMessage Performance</a></li>
|
||
<li><a href="https://radu-matei.com/blog/practical-guide-to-wasm-memory/">A practical guide to WebAssembly memory</a></li>
|
||
</ul>
|
||
<p>Examples:</p>
|
||
<ul>
|
||
<li><a href="https://rustwasm.github.io/wasm-bindgen/examples/wasm-in-web-worker.html">WASM in a WebWorker</a></li>
|
||
<li><a href="https://github.com/rustwasm/wasm-bindgen/blob/main/examples/raytrace-parallel/build.sh">Building for Shared Memory</a></li>
|
||
<li><a href="https://rustwasm.github.io/docs/wasm-bindgen/examples/raytrace.html">Parallel Raytracing</a></li>
|
||
</ul>
|
||
<h2 id="rendering"><a class="header" href="#rendering">Rendering</a></h2>
|
||
<p>Specs:</p>
|
||
<ul>
|
||
<li><a href="https://gpuweb.github.io/gpuweb/">WebGPU Spec</a></li>
|
||
<li><a href="https://gpuweb.github.io/gpuweb/wgsl/">WGSL Spec</a></li>
|
||
<li><a href="https://gpuweb.github.io/gpuweb/wgsl/#alignment-and-size">WGSL Struct Alignment</a></li>
|
||
<li><a href="https://github.com/gpuweb/gpuweb/blob/main/design/Pipelines.md#depth-stencil-state">Mismatches Stencil Test</a></li>
|
||
</ul>
|
||
<p>Articles:</p>
|
||
<ul>
|
||
<li><a href="https://github.com/maplibre/maplibre-gl-js/blob/main/docs/life-of-a-tile.md">Life of a Tile (MapLibre)</a></li>
|
||
</ul>
|
||
<p>Tutorials:</p>
|
||
<ul>
|
||
<li><a href="https://learnopengl.com/Advanced-OpenGL/Stencil-testing">Stencil Testing</a></li>
|
||
<li><a href="https://learnopengl.com/Getting-started/Camera">Camera</a></li>
|
||
<li><a href="https://zeux.io/2020/02/27/writing-an-efficient-vulkan-renderer/">Writing an efficient Vulkan renderer</a></li>
|
||
</ul>
|
||
<p>Examples:</p>
|
||
<ul>
|
||
<li><a href="https://github.com/ruffle-rs/ruffle/blob/master/render/wgpu/src/pipelines.rs#L330">Stencil Mask Example</a></li>
|
||
<li><a href="https://github.com/gfx-rs/wgpu/blob/ad0c8d4f781aaf9907b5f3a90bc7d00a13c51153/wgpu/examples/README.md">WGPU Examples</a></li>
|
||
</ul>
|
||
<h2 id="maths"><a class="header" href="#maths">Maths</a></h2>
|
||
<p>Articles:</p>
|
||
<ul>
|
||
<li><a href="https://ncase.me/matrix/">Magnificent Matrix</a></li>
|
||
</ul>
|
||
<p>Examples:</p>
|
||
<ul>
|
||
<li><a href="https://github.com/h3r2tic/dolly">Dolly Camera</a></li>
|
||
</ul>
|
||
<h2 id="font-rendering-1"><a class="header" href="#font-rendering-1">Font Rendering</a></h2>
|
||
<p>Specs:</p>
|
||
<ul>
|
||
<li><a href="https://github.com/mapbox/node-fontnik/blob/master/proto/glyphs.proto">MapBox Glyphs Spec</a></li>
|
||
</ul>
|
||
<p>Articles:</p>
|
||
<ul>
|
||
<li><a href="https://en.wikipedia.org/wiki/Signed_distance_function">Signed distance function</a></li>
|
||
</ul>
|
||
<p>Projects:</p>
|
||
<ul>
|
||
<li><a href="https://github.com/mapbox/node-fontnik/">Mapbox fontnik</a></li>
|
||
<li><a href="https://github.com/mapbox/tiny-sdf">TinySDK (JS)</a></li>
|
||
<li><a href="https://github.com/redox-os/rusttype">RustType</a></li>
|
||
<li><a href="https://docs.rs/sdf_glyph_renderer/latest/sdf_glyph_renderer/">SDF Render</a></li>
|
||
<li><a href="https://github.com/stadiamaps/pbf_font_tools">pbf_font_tools</a></li>
|
||
<li><a href="https://github.com/Chlumsky/msdfgen">Multi-channel signed distance field generator</a>
|
||
<ul>
|
||
<li><a href="https://github.com/Chlumsky/msdf-atlas-gen">MSDF font atlas generator </a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h2 id="tessellation"><a class="header" href="#tessellation">Tessellation</a></h2>
|
||
<p>Projects:</p>
|
||
<ul>
|
||
<li><a href="https://github.com/donbright/earcutr">earcutr</a></li>
|
||
<li><a href="https://github.com/maplibre/maplibre-gl-js/blob/main/src/data/bucket/line_bucket.ts">Line Tessellation in MapLibre</a></li>
|
||
</ul>
|
||
<h2 id="specifications"><a class="header" href="#specifications">Specifications</a></h2>
|
||
<ul>
|
||
<li><a href="https://github.com/mapbox/tilejson-spec">TileJSON</a></li>
|
||
</ul>
|
||
<h2 id="render-graphs"><a class="header" href="#render-graphs">Render Graphs</a></h2>
|
||
<ul>
|
||
<li>https://github.com/metal-by-example/simple-instancing/blob/master/MetalSimpleInstancing/Renderer.swift</li>
|
||
<li>https://github.com/troughton/Substrate</li>
|
||
<li>https://de.slideshare.net/DICEStudio/framegraph-extensible-rendering-architecture-in-frostbite</li>
|
||
<li>http://themaister.net/blog/2017/08/15/render-graphs-and-vulkan-a-deep-dive/</li>
|
||
<li>http://themaister.net/blog/2017/08/15/render-graphs-and-vulkan-a-deep-dive/</li>
|
||
</ul>
|
||
<h2 id="animation"><a class="header" href="#animation">Animation</a></h2>
|
||
<ul>
|
||
<li>https://crates.io/crates/pareen</li>
|
||
<li>https://crates.io/crates/keyframe</li>
|
||
</ul>
|
||
<div style="break-before: page; page-break-before: always;"></div><ul>
|
||
<li>Start Date: 2022-10-29</li>
|
||
<li>RFC PR: <a href="https://github.com/maplibre/maplibre-rs/pull/??">maplibre/maplibre-rs#??</a></li>
|
||
<li>maplibre-rs Issue: N/A</li>
|
||
</ul>
|
||
<h1 id="summary"><a class="header" href="#summary">Summary</a></h1>
|
||
<p>The "RFC" (request for comments) process is intended to provide a
|
||
consistent and controlled path for new features to enter the map renderer
|
||
and standard libraries, so that all stakeholders can be confident about
|
||
the direction the map renderer is evolving in.</p>
|
||
<p>This RFC is copied from <a href="https://github.com/rust-lang/rfcs">rust-lang/rfcs</a>.
|
||
Thanks to everyone who contributed to the Rust RFC process RFC! Thanks for the
|
||
great inspiration!</p>
|
||
<h1 id="motivation"><a class="header" href="#motivation">Motivation</a></h1>
|
||
<p>The freewheeling way that we add new features to maplibre-rs has been good for
|
||
early development, but for maplibre-rs to become a mature platform we need to
|
||
develop some more self-discipline when it comes to changing the system.
|
||
This is a proposal for a more principled RFC process to make it
|
||
a more integral part of the overall development process, and one that is
|
||
followed consistently to introduce features to maplibre-rs.</p>
|
||
<h1 id="detailed-design"><a class="header" href="#detailed-design">Detailed design</a></h1>
|
||
<p>Many changes, including bug fixes and documentation improvements can be
|
||
implemented and reviewed via the normal GitHub pull request workflow.</p>
|
||
<p>Some changes though are "substantial", and we ask that these be put
|
||
through a bit of a design process and produce a consensus among the maplibre-rs
|
||
community.</p>
|
||
<h2 id="when-you-need-to-follow-this-process"><a class="header" href="#when-you-need-to-follow-this-process">When you need to follow this process</a></h2>
|
||
<p>You need to follow this process if you intend to make "substantial"
|
||
changes to the maplibre-rs distribution. What constitutes a "substantial"
|
||
change is evolving based on community norms, but may include the following.</p>
|
||
<ul>
|
||
<li>Any semantic or syntactic change to the map renderer that is not a bugfix.</li>
|
||
<li>Removing map renderer features, including those that are feature-gated.</li>
|
||
</ul>
|
||
<p>Some changes do not require an RFC:</p>
|
||
<ul>
|
||
<li>Rephrasing, reorganizing, refactoring, or otherwise "changing shape
|
||
does not change meaning".</li>
|
||
<li>Additions that strictly improve objective, numerical quality
|
||
criteria (warning removal, speedup, better platform coverage, more
|
||
parallelism, trap more errors, etc.)</li>
|
||
<li>Additions only likely to be <em>noticed by</em> other developers-of-maplibre-rs,
|
||
invisible to users-of-maplibre-rs.</li>
|
||
</ul>
|
||
<p>If you submit a pull request to implement a new feature without going
|
||
through the RFC process, it may be closed with a polite request to
|
||
submit an RFC first.</p>
|
||
<h2 id="what-the-process-is"><a class="header" href="#what-the-process-is">What the process is</a></h2>
|
||
<p>In short, to get a major feature added to maplibre-rs, one must first get the
|
||
RFC merged into the RFC repo as a markdown file. At that point the RFC
|
||
is 'active' and may be implemented with the goal of eventual inclusion
|
||
into maplibre-rs.</p>
|
||
<ul>
|
||
<li>Fork the repo https://github.com/maplibre/maplibre-rs</li>
|
||
<li>Copy <code>rfc/0000-template.md</code> to <code>rfc/0000-my-feature.md</code> (where
|
||
'my-feature' is descriptive. don't assign an RFC number yet).</li>
|
||
<li>Fill in the RFC</li>
|
||
<li>Submit a pull request. The pull request is the time to get review of
|
||
the design from the larger community.</li>
|
||
<li>Build consensus and integrate feedback. RFCs that have broad support
|
||
are much more likely to make progress than those that don't receive any
|
||
comments.</li>
|
||
</ul>
|
||
<p>Eventually, somebody on the maplibre-rs team will either accept the RFC by
|
||
merging the pull request, at which point the RFC is 'active', or
|
||
reject it by closing the pull request.</p>
|
||
<p>Who ever merges the RFC should do the following:</p>
|
||
<ul>
|
||
<li>Assign an id, using the PR number of the RFC pull request. (If the RFC
|
||
has multiple pull requests associated with it, choose one PR number,
|
||
preferably the minimal one.)</li>
|
||
<li>Add the file in the <code>docs/src/rfc/</code> directory.</li>
|
||
<li>Create a corresponding issue on <a href="https://github.com/maplibre/maplibre-rs">maplibre-rs repo</a></li>
|
||
<li>Fill in the remaining metadata in the RFC header, including links for
|
||
the original pull request(s) and the newly created maplibre-rs issue.</li>
|
||
<li>Communicate that given RFC is now considered 'active' on the chat platform of maplibre-rs.</li>
|
||
<li>Commit everything.</li>
|
||
</ul>
|
||
<p>Once an RFC becomes active then authors may implement it and submit the
|
||
feature as a pull request to the maplibre-rs repo. An 'active' is not a rubber
|
||
stamp, and in particular still does not mean the feature will ultimately
|
||
be merged; it does mean that in principle all the major stakeholders
|
||
have agreed to the feature and are amenable to merging it.</p>
|
||
<p>Modifications to active RFC's can be done in followup PR's. An RFC that
|
||
makes it through the entire process to implementation is considered
|
||
'complete'; an RFC that fails after becoming active is 'inactive'.</p>
|
||
<h1 id="alternatives"><a class="header" href="#alternatives">Alternatives</a></h1>
|
||
<p>Retain the current informal RFC process. The newly proposed RFC process is
|
||
designed to improve over the informal process in the following ways:</p>
|
||
<ul>
|
||
<li>Discourage non-actionable or vague RFCs</li>
|
||
<li>Ensure that all serious RFCs are considered equally</li>
|
||
<li>Give confidence to those with a stake in maplibre-rs development that they
|
||
understand why new features are being merged</li>
|
||
</ul>
|
||
<p>As an alternative, we could adopt an even stricter RFC process than the one proposed here.
|
||
If desired, we should likely look to Python's <a href="http://legacy.python.org/dev/peps/pep-0001/">PEP</a> process for inspiration.</p>
|
||
<h1 id="unresolved-questions"><a class="header" href="#unresolved-questions">Unresolved questions</a></h1>
|
||
<ol>
|
||
<li>Does this RFC strike a favorable balance between formality and agility?</li>
|
||
<li>Does this RFC successfully address the aforementioned issues with the current
|
||
informal RFC process?</li>
|
||
<li>Should we retain rejected RFCs in the archive?</li>
|
||
</ol>
|
||
<div style="break-before: page; page-break-before: always;"></div><ul>
|
||
<li>Feature Name: (fill me in with a unique ident, <code>my_awesome_feature</code>)</li>
|
||
<li>Start Date: (fill me in with today's date, YYYY-MM-DD)</li>
|
||
<li>RFC PR: <a href="https://github.com/maplibre/maplibre-rs/pull/0000">maplibre/maplibre-rs#0000</a></li>
|
||
<li>maplibre-rs Issue: <a href="https://github.com/maplibre/maplibre-rs/issues/0000">maplibre/maplibre-rs#0000</a></li>
|
||
</ul>
|
||
<h1 id="summary-1"><a class="header" href="#summary-1">Summary</a></h1>
|
||
<p>One paragraph explanation of the feature.</p>
|
||
<h1 id="motivation-1"><a class="header" href="#motivation-1">Motivation</a></h1>
|
||
<p>Why are we doing this? What use cases does it support? What is the expected outcome?</p>
|
||
<h1 id="guide-level-explanation"><a class="header" href="#guide-level-explanation">Guide-level explanation</a></h1>
|
||
<p>Explain the proposal as if it was already included in the project, and you were teaching it to another maplibre-rs user.
|
||
That generally means:</p>
|
||
<ul>
|
||
<li>Introducing new named concepts.</li>
|
||
<li>Explaining the feature largely in terms of examples.</li>
|
||
<li>Explaining how maplibre-rs users should <em>think</em> about the feature, and how it should impact the way they use
|
||
maplibre-rs. It should explain the impact as concretely as possible.</li>
|
||
<li>If applicable, provide sample error messages, deprecation warnings, or migration guidance.</li>
|
||
<li>If applicable, describe the differences between teaching this to the existing maplibre-rs users and new maplibre-rs users.</li>
|
||
</ul>
|
||
<p>For implementation-oriented RFCs (e.g. for internals), this section should focus on how maplibre-rs contributors should
|
||
think about the change, and give examples of its concrete impact. For policy RFCs, this section should provide an
|
||
example-driven introduction to the policy, and explain its impact in concrete terms.</p>
|
||
<h1 id="reference-level-explanation"><a class="header" href="#reference-level-explanation">Reference-level explanation</a></h1>
|
||
<p>This is the technical portion of the RFC. Explain the design in sufficient detail that:</p>
|
||
<ul>
|
||
<li>Its interaction with other features is clear.</li>
|
||
<li>It is reasonably clear how the feature would be implemented.</li>
|
||
<li>Corner cases are dissected by example.</li>
|
||
</ul>
|
||
<p>The section should return to the examples given in the previous section, and explain more fully how the detailed
|
||
proposal makes those examples work.</p>
|
||
<h1 id="drawbacks"><a class="header" href="#drawbacks">Drawbacks</a></h1>
|
||
<p>Why should we <em>not</em> do this?</p>
|
||
<h1 id="rationale-and-alternatives"><a class="header" href="#rationale-and-alternatives">Rationale and alternatives</a></h1>
|
||
<ul>
|
||
<li>Why is this design the best in the space of possible designs?</li>
|
||
<li>What other designs have been considered and what is the rationale for not choosing them?</li>
|
||
<li>What is the impact of not doing this?</li>
|
||
</ul>
|
||
<h1 id="prior-art"><a class="header" href="#prior-art">Prior art</a></h1>
|
||
<p>Discuss prior art, both the good and the bad, in relation to this proposal.
|
||
A few examples of what this can include are:</p>
|
||
<ul>
|
||
<li>Does this feature exist in other map renderers and what experience have their community had?</li>
|
||
<li>For community proposals: Is this done by some other community and what were their experiences with it?</li>
|
||
<li>For other teams: What lessons can we learn from what other communities have done here?</li>
|
||
<li>Papers: Are there any published papers or great posts that discuss this? If you have some relevant papers to refer to,
|
||
this can serve as a more detailed theoretical background.</li>
|
||
</ul>
|
||
<p>This section is intended to encourage you as an author to think about the lessons from other renderers, provide readers
|
||
of your RFC with a fuller picture.
|
||
If there is no prior art, that is fine - your ideas are interesting to us whether they are brand new or if it is an
|
||
adaptation from other map renderers.</p>
|
||
<p>Note that while precedent set by other map renderers is some motivation, it does not on its own motivate an RFC.</p>
|
||
<h1 id="unresolved-questions-1"><a class="header" href="#unresolved-questions-1">Unresolved questions</a></h1>
|
||
<ul>
|
||
<li>What parts of the design do you expect to resolve through the RFC process before this gets merged?</li>
|
||
<li>What parts of the design do you expect to resolve through the implementation of this feature before stabilization?</li>
|
||
<li>What related issues do you consider out of scope for this RFC that could be addressed in the future independently of
|
||
the solution that comes out of this RFC?</li>
|
||
</ul>
|
||
<h1 id="future-possibilities"><a class="header" href="#future-possibilities">Future possibilities</a></h1>
|
||
<p>Think about what the natural extension and evolution of your proposal would
|
||
be and how it would affect the renderer and project as a whole in a holistic
|
||
way. Try to use this section as a tool to more fully consider all possible
|
||
interactions with the project and renderer in your proposal.
|
||
Also consider how this all fits into the roadmap for the project
|
||
and of the relevant sub-team.</p>
|
||
<p>This is also a good place to "dump ideas", if they are out of scope for the
|
||
RFC you are writing but otherwise related.</p>
|
||
<p>If you have tried and cannot think of any future possibilities,
|
||
you may simply state that you cannot think of anything.</p>
|
||
<p>Note that having something written down in the future-possibilities section
|
||
is not a reason to accept the current or a future RFC; such notes should be
|
||
in the section on motivation or rationale in this or subsequent RFCs.
|
||
The section merely provides additional information.</p>
|
||
<div style="break-before: page; page-break-before: always;"></div><ul>
|
||
<li>Start Date: 2022-10-29</li>
|
||
<li>RFC PR: <a href="https://github.com/maplibre/maplibre-rs/pull/??">maplibre/maplibre-rs#??</a></li>
|
||
<li>maplibre-rs Issue: N/A</li>
|
||
</ul>
|
||
<h1 id="summary-2"><a class="header" href="#summary-2">Summary</a></h1>
|
||
<p>The "RFC" (request for comments) process is intended to provide a
|
||
consistent and controlled path for new features to enter the map renderer
|
||
and standard libraries, so that all stakeholders can be confident about
|
||
the direction the map renderer is evolving in.</p>
|
||
<p>This RFC is copied from <a href="https://github.com/rust-lang/rfcs">rust-lang/rfcs</a>.
|
||
Thanks to everyone who contributed to the Rust RFC process RFC! Thanks for the
|
||
great inspiration!</p>
|
||
<h1 id="motivation-2"><a class="header" href="#motivation-2">Motivation</a></h1>
|
||
<p>The freewheeling way that we add new features to maplibre-rs has been good for
|
||
early development, but for maplibre-rs to become a mature platform we need to
|
||
develop some more self-discipline when it comes to changing the system.
|
||
This is a proposal for a more principled RFC process to make it
|
||
a more integral part of the overall development process, and one that is
|
||
followed consistently to introduce features to maplibre-rs.</p>
|
||
<h1 id="detailed-design-1"><a class="header" href="#detailed-design-1">Detailed design</a></h1>
|
||
<p>Many changes, including bug fixes and documentation improvements can be
|
||
implemented and reviewed via the normal GitHub pull request workflow.</p>
|
||
<p>Some changes though are "substantial", and we ask that these be put
|
||
through a bit of a design process and produce a consensus among the maplibre-rs
|
||
community.</p>
|
||
<h2 id="when-you-need-to-follow-this-process-1"><a class="header" href="#when-you-need-to-follow-this-process-1">When you need to follow this process</a></h2>
|
||
<p>You need to follow this process if you intend to make "substantial"
|
||
changes to the maplibre-rs distribution. What constitutes a "substantial"
|
||
change is evolving based on community norms, but may include the following.</p>
|
||
<ul>
|
||
<li>Any semantic or syntactic change to the map renderer that is not a bugfix.</li>
|
||
<li>Removing map renderer features, including those that are feature-gated.</li>
|
||
</ul>
|
||
<p>Some changes do not require an RFC:</p>
|
||
<ul>
|
||
<li>Rephrasing, reorganizing, refactoring, or otherwise "changing shape
|
||
does not change meaning".</li>
|
||
<li>Additions that strictly improve objective, numerical quality
|
||
criteria (warning removal, speedup, better platform coverage, more
|
||
parallelism, trap more errors, etc.)</li>
|
||
<li>Additions only likely to be <em>noticed by</em> other developers-of-maplibre-rs,
|
||
invisible to users-of-maplibre-rs.</li>
|
||
</ul>
|
||
<p>If you submit a pull request to implement a new feature without going
|
||
through the RFC process, it may be closed with a polite request to
|
||
submit an RFC first.</p>
|
||
<h2 id="what-the-process-is-1"><a class="header" href="#what-the-process-is-1">What the process is</a></h2>
|
||
<p>In short, to get a major feature added to maplibre-rs, one must first get the
|
||
RFC merged into the RFC repo as a markdown file. At that point the RFC
|
||
is 'active' and may be implemented with the goal of eventual inclusion
|
||
into maplibre-rs.</p>
|
||
<ul>
|
||
<li>Fork the repo https://github.com/maplibre/maplibre-rs</li>
|
||
<li>Copy <code>rfc/0000-template.md</code> to <code>rfc/0000-my-feature.md</code> (where
|
||
'my-feature' is descriptive. don't assign an RFC number yet).</li>
|
||
<li>Fill in the RFC</li>
|
||
<li>Submit a pull request. The pull request is the time to get review of
|
||
the design from the larger community.</li>
|
||
<li>Build consensus and integrate feedback. RFCs that have broad support
|
||
are much more likely to make progress than those that don't receive any
|
||
comments.</li>
|
||
</ul>
|
||
<p>Eventually, somebody on the maplibre-rs team will either accept the RFC by
|
||
merging the pull request, at which point the RFC is 'active', or
|
||
reject it by closing the pull request.</p>
|
||
<p>Who ever merges the RFC should do the following:</p>
|
||
<ul>
|
||
<li>Assign an id, using the PR number of the RFC pull request. (If the RFC
|
||
has multiple pull requests associated with it, choose one PR number,
|
||
preferably the minimal one.)</li>
|
||
<li>Add the file in the <code>docs/src/rfc/</code> directory.</li>
|
||
<li>Create a corresponding issue on <a href="https://github.com/maplibre/maplibre-rs">maplibre-rs repo</a></li>
|
||
<li>Fill in the remaining metadata in the RFC header, including links for
|
||
the original pull request(s) and the newly created maplibre-rs issue.</li>
|
||
<li>Communicate that given RFC is now considered 'active' on the chat platform of maplibre-rs.</li>
|
||
<li>Commit everything.</li>
|
||
</ul>
|
||
<p>Once an RFC becomes active then authors may implement it and submit the
|
||
feature as a pull request to the maplibre-rs repo. An 'active' is not a rubber
|
||
stamp, and in particular still does not mean the feature will ultimately
|
||
be merged; it does mean that in principle all the major stakeholders
|
||
have agreed to the feature and are amenable to merging it.</p>
|
||
<p>Modifications to active RFC's can be done in followup PR's. An RFC that
|
||
makes it through the entire process to implementation is considered
|
||
'complete'; an RFC that fails after becoming active is 'inactive'.</p>
|
||
<h1 id="alternatives-1"><a class="header" href="#alternatives-1">Alternatives</a></h1>
|
||
<p>Retain the current informal RFC process. The newly proposed RFC process is
|
||
designed to improve over the informal process in the following ways:</p>
|
||
<ul>
|
||
<li>Discourage non-actionable or vague RFCs</li>
|
||
<li>Ensure that all serious RFCs are considered equally</li>
|
||
<li>Give confidence to those with a stake in maplibre-rs development that they
|
||
understand why new features are being merged</li>
|
||
</ul>
|
||
<p>As an alternative, we could adopt an even stricter RFC process than the one proposed here.
|
||
If desired, we should likely look to Python's <a href="http://legacy.python.org/dev/peps/pep-0001/">PEP</a> process for inspiration.</p>
|
||
<h1 id="unresolved-questions-2"><a class="header" href="#unresolved-questions-2">Unresolved questions</a></h1>
|
||
<ol>
|
||
<li>Does this RFC strike a favorable balance between formality and agility?</li>
|
||
<li>Does this RFC successfully address the aforementioned issues with the current
|
||
informal RFC process?</li>
|
||
<li>Should we retain rejected RFCs in the archive?</li>
|
||
</ol>
|
||
|
||
</main>
|
||
|
||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||
<!-- Mobile navigation buttons -->
|
||
|
||
|
||
<div style="clear: both"></div>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
|
||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||
|
||
</nav>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<script>
|
||
window.playground_copyable = true;
|
||
</script>
|
||
|
||
|
||
<script src="elasticlunr.min.js"></script>
|
||
<script src="mark.min.js"></script>
|
||
<script src="searcher.js"></script>
|
||
|
||
<script src="clipboard.min.js"></script>
|
||
<script src="highlight.js"></script>
|
||
<script src="book.js"></script>
|
||
|
||
<!-- Custom JS scripts -->
|
||
|
||
<script>
|
||
window.addEventListener('load', function() {
|
||
window.setTimeout(window.print, 100);
|
||
});
|
||
</script>
|
||
|
||
</div>
|
||
</body>
|
||
</html>
|