docs: Clarify loader build requirements
[platform/upstream/Vulkan-Tools.git] / BUILD.md
1 # Build Instructions
2
3 Instructions for building this repository on Linux, Windows, Android, and MacOS.
4
5 ## Index
6
7 1. [Contributing](#contributing-to-the-repository)
8 2. [Repository Set-Up](#repository-set-up)
9 3. [Windows Build](#building-on-windows)
10 4. [Linux Build](#building-on-linux)
11 5. [Android Build](#building-on-android)
12 6. [MacOS build](#building-on-macos)
13
14 ## Contributing to the Repository
15
16 If you intend to contribute, the preferred work flow is for you to develop
17 your contribution in a fork of this repository in your GitHub account and
18 then submit a pull request.
19 Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file in this repository for more details.
20
21 ## Repository Set-Up
22
23 ### Display Drivers
24
25 This repository does not contain a Vulkan-capable driver.
26 Before proceeding, it is strongly recommended that you obtain a Vulkan driver from your
27 graphics hardware vendor and install it properly.
28
29 ### Download the Repository
30
31 To create your local git repository:
32
33     git clone https://github.com/KhronosGroup/Vulkan-ValidationLayers
34
35 ## Building On Windows
36
37 ### Windows Build Requirements
38
39 Windows 7+ with the following software packages:
40
41 - Microsoft Visual Studio 2013 Update 4 Professional, VS2015 (any version), or VS2017 (any version).
42 - [CMake](http://www.cmake.org/download/)
43   - Tell the installer to "Add CMake to the system PATH" environment variable.
44 - [Python 3](https://www.python.org/downloads)
45   - Select to install the optional sub-package to add Python to the system PATH
46     environment variable.
47   - Ensure the `pip` module is installed (it should be by default)
48   - Python3.3 or later is necessary for the Windows py.exe launcher that is used to select python3
49   rather than python2 if both are installed
50 - [Git](http://git-scm.com/download/win)
51   - Tell the installer to allow it to be used for "Developer Prompt" as well as "Git Bash".
52   - Tell the installer to treat line endings "as is" (i.e. both DOS and Unix-style line endings).
53   - Install both the 32-bit and 64-bit versions, as the 64-bit installer does not install the
54     32-bit libraries and tools.
55 - Vulkan Loader Library
56   - Building the cube and vulkaninfo applications require linking to the Vulkan Loader Library (vulkan-1.dll).
57     Locating the library for this repo can be done in two different ways:
58       -  The Vulkan SDK can be installed. In this case, cmake should be able to locate the loader repo through the VulkanSDK
59          environment variable.
60       -  The library can be built from the [Vulkan-Loader](https://github.com/KhronosGroup/Vulkan-Loader.git) repository.
61          In this case, the following option should be used on the cmake command line:
62              LOADER_REPO_ROOT=c:\absolute_path_to\Vulkan-Loader
63          and use absolute (not relative) paths, like so:
64              cmake -DLOADER_REPO_ROOT=c:\absolute_path_to\Vulkan-Loader ....
65     Currently, the build directory *must* be named either 'build' or 'build32'.
66 - [glslang](https://github.com/KhronosGroup/glslang)
67   - By default, the build scripts will attempt to download the necessary components from the glslang repo.
68     However, if a specific version of this file is required, please see the [Custom glslang Version](#custom-glslang-version) section below.
69
70 ### Windows Build - Microsoft Visual Studio
71
72 1. Open a Developer Command Prompt for VS201x
73 2. Change directory to `Vulkan-Tools` -- the root of the cloned git repository
74 3. Run 'git submodule update --init --recursive' -- this will download in-tree external dependencies
75 4. Create a `build` directory, change into that directory, and run cmake
76
77 For example, assuming an SDK is installed, for VS2017 (generators for other versions are [specified here](#cmake-visual-studio-generators)):
78
79     cmake "Visual Studio 15 2017 Win64" ..
80
81 If a specific version of the Loader is requred, specify the root of the loader repository, like so:
82
83     cmake -DLOADER_REPO_ROOT=c:/absolute_path_to/Vulkan-Loader -G "Visual Studio 15 2017 Win64" ..
84
85 This will create a Windows solution file named `Vulkan-Tools.sln` in the build directory.
86
87 Launch Visual Studio and open the "Vulkan-Tools.sln" solution file in the build folder.
88 You may select "Debug" or "Release" from the Solution Configurations drop-down list.
89 Start a build by selecting the Build->Build Solution menu item.
90 This solution copies the loader it built to each program's build directory
91 to ensure that the program uses the loader built from this solution.
92
93 ### Windows Notes
94
95 #### CMake Visual Studio Generators
96
97 The above example used Visual Studio 2017, and specified its generator as "Visual Studio 15 2017 Win64".
98 The chosen generator should match your Visual Studio version. Appropriate Visual Studio generators include:
99
100 | Build Platform               | 64-bit Generator              | 32-bit Generator        |
101 |------------------------------|-------------------------------|-------------------------|
102 | Microsoft Visual Studio 2013 | "Visual Studio 12 2013 Win64" | "Visual Studio 12 2013" |
103 | Microsoft Visual Studio 2015 | "Visual Studio 14 2015 Win64" | "Visual Studio 14 2015" |
104 | Microsoft Visual Studio 2017 | "Visual Studio 15 2017 Win64" | "Visual Studio 15 2017" |
105
106 ## Building On Linux
107
108 ### Linux Build Requirements
109
110 This repository has been built and tested on the two most recent Ubuntu LTS versions.
111 Currently, the oldest supported version is Ubuntu 14.04, meaning that the minimum supported compiler versions are GCC 4.8.2 and Clang 3.4, although earlier versions may work.
112 It should be straightforward to adapt this repository to other Linux distributions.
113
114 **Required Package List:**
115
116     sudo apt-get install git cmake build-essential libx11-xcb-dev libxkbcommon-dev libmirclient-dev libwayland-dev libxrandr-dev
117
118 - [glslang](https://github.com/KhronosGroup/glslang)
119   - By default, the build scripts will attempt to download the necessary components from the glslang repo.
120     However, if a specific version of this file is required, please see the [Custom glslang Version](#custom-glslang-version) section below.
121
122 Vulkan Loader Library
123   - Building the cube and vulkaninfo applications require linking to the Vulkan Loader Library (libvulkan-1.so).
124       - The following option should be used on the cmake command line to specify a vulkan loader library:
125              LOADER_REPO_ROOT=c:\absolute_path_to\Vulkan-Loader
126          makeing sure to specify an absoute path, like so:
127              cmake -DLOADER_REPO_ROOT=c:\absolute_path_to\Vulkan-Loader ....
128     Currently, the build directory *must* be named either 'build' or 'build32'.
129
130 ### Linux Build
131
132 Example debug build
133
134 See **Loader and Validation Layer Dependencies** for more information and other options:
135
136 1. In a Linux terminal, `cd Vulkan-Tools` -- the root of the cloned git repository
137 2. Execute 'git submodule update --init --recursive' -- this will download in-tree external components
138 3. Create a `build` directory, change into that directory, and run cmake:
139
140         mkdir build
141         cd build
142         # If an SDK is installed and the setup-env.sh script has been run,
143         cmake -DCMAKE_BUILD_TYPE=Debug ..
144         # Else if a specific version of the loader is desired, indicate the root of the loader repository like so:
145         cmake -DLOADER_REPO_ROOT=/absolute_path_to/Vulkan-Loader -DCMAKE_BUILD_TYPE=Debug ..
146
147 4. Run `make -j8` to begin the build
148
149 If your build system supports ccache, you can enable that via CMake option `-DUSE_CCACHE=On`
150
151 ### WSI Support Build Options
152
153 By default, the Vulkan Tools are built with support for all 4 Vulkan-defined WSI display servers: Xcb, Xlib, Wayland, and Mir.
154 It is recommended to build the repository components with support for these display servers to maximize their usability across Linux platforms.
155 If it is necessary to build these modules without support for one of the display servers, the appropriate CMake option of the form `BUILD_WSI_xxx_SUPPORT` can be set to `OFF`.
156 See the top-level CMakeLists.txt file for more info.
157
158 ### Linux Install to System Directories
159
160 Installing the files resulting from your build to the systems directories is optional since environment variables can usually be used instead to locate the binaries.
161 There are also risks with interfering with binaries installed by packages.
162 If you are certain that you would like to install your binaries to system directories, you can proceed with these instructions.
163
164 Assuming that you have built the code as described above and the current directory is still `build`, you can execute:
165
166     sudo make install
167
168 This command installs files to:
169
170 - `/usr/local/include/vulkan`:  Vulkan include files
171 - `/usr/local/lib`:  Vulkan Tools shared objects
172 - `/usr/local/bin`:  vulkaninfo application
173 - `/usr/local/bin`:  cube application
174 - `/usr/local/bin`:  cubepp application
175
176 You may need to run `ldconfig` in order to refresh the system loader search cache on some Linux systems.
177
178 You can further customize the installation location by setting additional CMake variables to override their defaults.
179 For example, if you would like to install to `/tmp/build` instead of `/usr/local`, on your CMake command line specify:
180
181     -DCMAKE_INSTALL_PREFIX=/tmp/build
182     -DDEST_DIR=/tmp/build
183
184 Then run `make install` as before. The install step places the files in `/tmp/build`.
185
186 You can further customize the installation directories by using the CMake variables
187 `CMAKE_INSTALL_SYSCONFDIR` to rename the `etc` directory and `CMAKE_INSTALL_DATADIR`
188 to rename the `share` directory.
189
190 See the CMake documentation for more details on using these variables
191 to further customize your installation.
192
193 ### Linux Uninstall
194
195 To uninstall the files from the system directories, you can execute:
196
197     sudo make uninstall
198
199 ### Linux Tests
200
201 After making any changes to the repository, you should perform some quick sanity tests, such as
202 running the cube demo with validation enabled.
203
204 To run the **Cube application** with validation, in a terminal change to the `build/cube`
205 directory and run:
206
207     VK_LAYER_PATH=../path/to/validation/layers ./cube --validate
208
209 You can select which WSI subsystem is used to build the cube applications using a CMake option
210 called DEMOS_WSI_SELECTION.
211 Supported options are XCB (default), XLIB, WAYLAND, and MIR.
212 Note that you must build using the corresponding BUILD_WSI_*_SUPPORT enabled at the
213 base repository level (all SUPPORT options are ON by default).
214 For instance, creating a build that will use Xlib to build the demos,
215 your CMake command line might look like:
216
217     cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=Debug -DDEMOS_WSI_SELECTION=XLIB
218
219 ### Linux Notes
220
221 #### Linux 32-bit support
222
223 Usage of the contents of this repository in 32-bit Linux environments is not officially supported.
224 However, since this repository is supported on 32-bit Windows,
225 these modules should generally work on 32-bit Linux.
226
227 Here are some notes for building 32-bit targets on a 64-bit Ubuntu "reference" platform:
228
229 If not already installed, install the following 32-bit development libraries:
230
231 `gcc-multilib g++-multilib libx11-dev:i386`
232
233 This list may vary depending on your distribution and which windowing systems you are building for.
234
235 Set up your environment for building 32-bit targets:
236
237     export ASFLAGS=--32
238     export CFLAGS=-m32
239     export CXXFLAGS=-m32
240     export PKG_CONFIG_LIBDIR=/usr/lib/i386-linux-gnu
241
242 Again, your PKG_CONFIG configuration may be different, depending on your distribution.
243
244 Finally, rebuild the repository using `cmake` and `make`, as explained above.
245
246 ## Building On Android
247
248 Install the required tools for Linux and Windows covered above, then add the following.
249
250 ### Android Build Requirements
251
252 - Install [Android Studio 2.3](https://developer.android.com/studio/index.html) or later.
253 - From the "Welcome to Android Studio" splash screen, add the following components using
254   Configure > SDK Manager:
255   - SDK Platforms > Android 6.0 and newer
256   - SDK Tools > Android SDK Build-Tools
257   - SDK Tools > Android SDK Platform-Tools
258   - SDK Tools > Android SDK Tools
259   - SDK Tools > NDK
260
261 #### Add Android specifics to environment
262
263 For each of the below, you may need to specify a different build-tools version, as Android Studio will roll it forward fairly regularly.
264
265 On Linux:
266
267     export ANDROID_SDK_HOME=$HOME/Android/sdk
268     export ANDROID_NDK_HOME=$HOME/Android/sdk/ndk-bundle
269     export PATH=$ANDROID_SDK_HOME:$PATH
270     export PATH=$ANDROID_NDK_HOME:$PATH
271     export PATH=$ANDROID_SDK_HOME/build-tools/23.0.3:$PATH
272
273 On Windows:
274
275     set ANDROID_SDK_HOME=%LOCALAPPDATA%\Android\sdk
276     set ANDROID_NDK_HOME=%LOCALAPPDATA%\Android\sdk\ndk-bundle
277     set PATH=%LOCALAPPDATA%\Android\sdk\ndk-bundle;%PATH%
278
279 On OSX:
280
281     export ANDROID_SDK_HOME=$HOME/Library/Android/sdk
282     export ANDROID_NDK_HOME=$HOME/Library/Android/sdk/ndk-bundle
283     export PATH=$ANDROID_NDK_PATH:$PATH
284     export PATH=$ANDROID_SDK_HOME/build-tools/23.0.3:$PATH
285
286 Note: If `jarsigner` is missing from your platform, you can find it in the
287 Android Studio install or in your Java installation.
288 If you do not have Java, you can get it with something like the following:
289
290   sudo apt-get install openjdk-8-jdk
291
292 #### Additional OSX System Requirements
293
294 Tested on OSX version 10.13.3
295
296 Setup Homebrew and components
297
298 - Follow instructions on [brew.sh](http://brew.sh) to get Homebrew installed.
299
300       /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
301
302 - Ensure Homebrew is at the beginning of your PATH:
303
304       export PATH=/usr/local/bin:$PATH
305
306 - Add packages with the following:
307
308       brew install cmake python
309
310 ### Android Build
311
312 There are two options for building the Android tools.
313 Either using the SPIRV tools provided as part of the Android NDK, or using upstream sources.
314 To build with SPIRV tools from the NDK, remove the build-android/third_party directory created by
315 running update_external_sources_android.sh, (or avoid running update_external_sources_android.sh).
316 Use the following script to build everything in the repository for Android, including validation
317 layers, tests, demos, and APK packaging: This script does retrieve and use the upstream SPRIV tools.
318
319     cd build-android
320     ./build_all.sh
321
322 Test and application APKs can be installed on production devices with:
323
324     ./install_all.sh [-s <serial number>]
325
326 Note that there are no equivalent scripts on Windows yet, that work needs to be completed.
327 The following per platform commands can be used for layer only builds:
328
329 #### Linux and OSX
330
331 Follow the setup steps for Linux or OSX above, then from your terminal:
332
333     cd build-android
334     ./update_external_sources_android.sh --no-build
335     ./android-generate.sh
336     ndk-build -j4
337
338 #### Windows
339
340 Follow the setup steps for Windows above, then from Developer Command Prompt for VS2013:
341
342     cd build-android
343     update_external_sources_android.bat
344     android-generate.bat
345     ndk-build
346
347 ### Android Tests and Demos
348
349 After making any changes to the repository you should perform some quick sanity tests,
350 including the layer validation tests and the cube and smoke demos with validation enabled.
351
352 #### Run Layer Validation Tests
353
354 Use the following steps to build, install, and run the layer validation tests for Android:
355
356     cd build-android
357     ./build_all.sh
358     adb install -r bin/VulkanLayerValidationTests.apk
359     adb shell am start com.example.VulkanLayerValidationTests/android.app.NativeActivity
360
361 Alternatively, you can use the test_APK script to install and run the layer validation tests:
362
363     test_APK.sh -s <serial number> -p <plaform name> -f <gtest_filter>
364
365 #### Run Cube with Validation
366
367 TODO: This must be reworked to pull in layers from the ValidationLayers repo
368
369 Use the following steps to build, install, and run Cube for Android:
370
371     cd build-android
372     ./build_all.sh
373     adb install -r ../demos/android/cube/bin/cube.apk
374     adb shell am start com.example.Cube/android.app.NativeActivity
375
376 To build, install, and run Cube with validation layers,
377 first build layers using steps above, then run:
378
379     cd build-android
380     ./build_all.sh
381     adb install -r ../demos/android/cube-with-layers/bin/cube-with-layers.apk
382
383 ##### Run without validation enabled
384
385     adb shell am start com.example.CubeWithLayers/android.app.NativeActivity
386
387 ##### Run with validation enabled
388
389     adb shell am start -a android.intent.action.MAIN -c android-intent.category.LAUNCH -n com.example.CubeWithLayers/android.app.NativeActivity --es args "--validate"
390
391 ## Building on MacOS
392
393 ### MacOS Build Requirements
394
395 Tested on OSX version 10.12.6
396
397 Setup Homebrew and components
398
399 - Follow instructions on [brew.sh](http://brew.sh) to get Homebrew installed.
400
401       /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
402
403 - Ensure Homebrew is at the beginning of your PATH:
404
405       export PATH=/usr/local/bin:$PATH
406
407 - Add packages with the following (may need refinement)
408
409       brew install cmake python python3 git
410
411 - [glslang](https://github.com/KhronosGroup/glslang)
412   - By default, the build scripts will attempt to download the necessary components from the glslang repo.
413     However, if a specific version of this file is required, please see the [Custom glslang Version](#custom-glslang-version) section below.
414
415 ### Clone the Repository
416
417 Clone the Vulkan-LoaderAndValidationLayers repository:
418
419     git clone https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers.git
420
421 ### Get the External Libraries
422
423 TODO: Update with macOS procedure for satisfying external dependencies
424
425 ### MacOS build
426
427 #### CMake Generators
428
429 This repository uses CMake to generate build or project files that are
430 then used to build the repository.
431 The CMake generators explicitly supported in this repository are:
432
433 - Unix Makefiles
434 - Xcode
435
436 #### Building with the Unix Makefiles Generator
437
438 This generator is the default generator, so all that is needed for a debug
439 build is:
440
441         mkdir build
442         cd build
443         cmake -DCMAKE_BUILD_TYPE=Debug ..
444         make
445
446 To speed up the build on a multi-core machine, use the `-j` option for `make`
447 to specify the number of cores to use for the build.
448 For example:
449
450     make -j4
451
452 You can now run the demo applications from the command line:
453
454     open demos/cube.app
455     open demos/cubepp.app
456     open demos/vulkaninfo.app
457
458 Or you can locate them from `Finder` and launch them from there.
459
460 ##### The Install Target and RPATH
461
462 The applications you just built are "bundled applications", but the executables
463 are using the `RPATH` mechanism to locate runtime dependencies that are still
464 in your build tree.
465
466 To see this, run this command from your `build` directory:
467
468     otool -l demos/cube.app/Contents/MacOS/cube
469
470 and note that the `cube` executable contains loader commands:
471
472 - `LC_LOAD_DYLIB` to load `libvulkan.1.dylib` via an `@rpath`
473 - `LC_RPATH` that contains an absolute path to the build location of the Vulkan loader
474
475 This makes the bundled application "non-transportable", meaning that it won't run
476 unless the Vulkan loader is on that specific absolute path.
477 This is useful for debugging the loader or other components built in this repository,
478 but not if you want to move the application to another machine or remove your build tree.
479
480 To address this problem, run:
481
482     make install
483
484 This step "cleans up" the `RPATH` to remove any external references
485 and performs other bundle fix-ups.
486 After running `make install`, re-run the `otool` command again and note:
487
488 - `LC_LOAD_DYLIB` is now `@executable_path/../MacOS/libvulkan.1.dylib`
489 - `LC_RPATH` is no longer present
490
491 The "bundle fix-up" operation also puts a copy of the Vulkan loader into the bundle,
492 making the bundle completely self-contained and self-referencing.
493
494 Note that the "install" target has a very different meaning compared to the Linux
495 "make install" target.
496 The Linux "install" copies the targets to system directories.
497 In MacOS, "install" means fixing up application bundles.
498 In both cases, the "install" target operations clean up the `RPATH`.
499
500 ##### The Non-bundled vulkaninfo Application
501
502 There is also a non-bundled version of the `vulkaninfo` application that you can
503 run from the command line:
504
505     demos/vulkaninfo
506
507 If you run this before you run "make install", vulkaninfo's RPATH is already set
508 to point to the Vulkan loader in the build tree, so it has no trouble finding it.
509 But the loader will not find the MoltenVK driver and you'll see a message about an
510 incompatible driver.  To remedy this:
511
512     VK_ICD_FILENAMES=../external/MoltenVK/Package/Latest/MoltenVK/macOS/MoltenVK_icd.json demos/vulkaninfo
513
514 If you run `vulkaninfo` after doing a "make install", the `RPATH` in the `vulkaninfo` application
515 got removed and the OS needs extra help to locate the Vulkan loader:
516
517     DYLD_LIBRARY_PATH=loader VK_ICD_FILENAMES=../external/MoltenVK/Package/Latest/MoltenVK/macOS/MoltenVK_icd.json demos/vulkaninfo
518
519 #### Building with the Xcode Generator
520
521 To create and open an Xcode project:
522
523         mkdir build-xcode
524         cd build-xcode
525         cmake -GXcode ..
526         open VULKAN.xcodeproj
527
528 Within Xcode, you can select Debug or Release builds in the project's Build Settings.
529 You can also select individual schemes for working with specific applications like `cube`.
530
531 ## Ninja Builds - All Platforms
532
533 The [Qt Creator IDE](https://qt.io/download-open-source/#section-2) can open a root CMakeList.txt
534 as a project directly, and it provides tools within Creator to configure and generate Vulkan SDK
535 build files for one to many targets concurrently.
536 Alternatively, when invoking CMake, use the `-G "Codeblocks - Ninja"` option to generate Ninja build
537 files to be used as project files for QtCreator
538
539 - Open, configure, and build the Vulkan-Tools CMakeList.txt file
540 - In order to debug with QtCreator, a
541   [Microsoft WDK: eg WDK 10](http://go.microsoft.com/fwlink/p/?LinkId=526733) is required.
542
543 Note that installing the WDK breaks the MSVC vcvarsall.bat build scripts provided by MSVC,
544 requiring that the LIB, INCLUDE, and PATHenv variables be set to the WDK paths by some other means
545
546 ## Custom glslang version
547
548 The Glslang repository is not a git sub-module of Vulkan-Tools, but glslang components are required to build
549 the cube and vulkaninfo applications. By default, the cmake scripts will download the required
550 components into the repo 'glslang' directory.
551
552 If a specific version of the glslang components is desired, perform the following steps:
553
554 1) clone the glslang repository:
555
556     `git clone https://github.com/KhronosGroup/glslang.git`
557
558 2) Configure the glslang source tree with CMake and build it with your IDE of choice
559
560 3) Pass the location of the glslang repository using an absolute path via your cmake command like so:
561
562     cmake -DGLSLANG_REPO_ROOT=c:\absolute_path_to\glslang
563
564 4) If building on Windows with MSVC, set `DISABLE_BUILDTGT_DIR_DECORATION` to _On_.
565  If building on Windows, but without MSVC set `DISABLE_BUILD_PATH_DECORATION` to _On_
566
567 ## Optional software packages
568
569 - [Cygwin for windows](https://www.cygwin.com/)
570   - Cygwin provides some Linux-like tools, which can be valuable for working with the repository,
571     such as the BASH shell and git packages
572   - With appropriate adjustments, it is possible to use other shells and environments as well
573
574 - [Ninja on all platforms](https://github.com/ninja-build/ninja/releases)
575 - [The Ninja-build project](https://ninja-build.org)
576 - [Ninja Users Manual](https://ninja-build.org/manual.html)
577
578 - [QtCreator as IDE for CMake builds on all platforms](https://qt.io/download-open-source/#section-2)