Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dosbox-staging/dosbox-staging.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkcgen <1557255+kcgen@users.noreply.github.com>2020-05-10 21:40:02 +0300
committerPatryk Obara <dreamer.tan@gmail.com>2020-05-10 22:58:52 +0300
commitfe6674f9ebbb865e392358fc2000258ad2e384b7 (patch)
treecee428ab2a181a367ff073d89551f44738f1a2f3 /BUILD.md
parentd423a4363b6bf16e59850881e2eb42ee43cc1735 (diff)
Move build-script procedures to top-level
Diffstat (limited to 'BUILD.md')
-rw-r--r--BUILD.md449
1 files changed, 449 insertions, 0 deletions
diff --git a/BUILD.md b/BUILD.md
new file mode 100644
index 000000000..2f04c7869
--- /dev/null
+++ b/BUILD.md
@@ -0,0 +1,449 @@
+# Build Script
+
+## Introduction
+
+This script builds `dosbox-staging` with your choice of compiler, release
+type, and additional options. It runs on MacOS, Linux, Windows, and possibly
+other operating systems.
+
+If this is your first time building dosbox-staging, then you will need to
+install its development tools and dependencies, which is covered in the
+notes below.
+
+- [Build Script](#build-script)
+ - [Introduction](#introduction)
+ - [Requirements](#requirements)
+ - [Windows Procedures](#windows-procedures)
+ - [Install MSYS2](#install-msys2)
+ - [Clone and Build a Windows Binary](#clone-and-build-a-windows-binary)
+ - [macOS Procedures](#macos-procedures)
+ - [Install Dependencies under macOS](#install-dependencies-under-macos)
+ - [Xcode Installation](#xcode-installation)
+ - [Brew Package Manager Installation](#brew-package-manager-installation)
+ - [MacPorts Package Manager Installation](#macports-package-manager-installation)
+ - [Clone and Build a macOS Binary](#clone-and-build-a-macos-binary)
+ - [Linux Procedures](#linux-procedures)
+ - [Install Dependencies under Linux](#install-dependencies-under-linux)
+ - [Build a Linux Binary](#build-a-linux-binary)
+ - [Haiku Procedures](#haiku-procedures)
+ - [Install Dependencies under Haiku](#install-dependencies-under-haiku)
+ - [Build a Haiku Binary](#build-a-haiku-binary)
+ - [Additional Tips](#additional-tips)
+ - [Compiler variations](#compiler-variations)
+ - [Release types](#release-types)
+ - [Build Results, Rebuilding, and Cleaning](#build-results-rebuilding-and-cleaning)
+ - [CCache](#ccache)
+ - [Optimization Modifiers](#optimization-modifiers)
+ - [AutoFDO Procedures](#autofdo-procedures)
+ - [Prerequisites for AutoFDO](#prerequisites-for-autofdo)
+ - [Record Data for AutoFDO Builds](#record-data-for-autofdo-builds)
+ - [Build Using AutoFDO Data](#build-using-autofdo-data)
+
+## Requirements
+
+- **Windows newer than XP**
+ - **NTFS-based C:**, because msys2 doesn't work on FAT filesystems
+- **MacOS** 10.x
+- **Haiku** up-to-date
+- **Ubuntu** 16.04 or newer
+- **Fedora** up-to-date
+- **RedHat or CentOS** 7 or newer
+- **Arch-based distribution** up-to-date
+- **OpenSUSE Leap** 15 or newer
+
+## Windows Procedures
+
+### Install MSYS2
+
+1. Download and install Chocolatey: <https://chocolatey.org/install>
+1. Open a console and run Cholocatey's command line interface (CLI)
+ to install msys2 and git:
+
+ `choco install msys2 git --no-progress`
+
+ ``` text
+ Chocolatey v0.10.15
+ Installing the following packages:
+ msys2 git
+ By installing you accept licenses for the packages.
+
+ msys2 v20180531.0.0 [Approved]
+ msys2 package files install completed. Performing other installation steps.
+ Installing to: C:\tools\msys64
+ Extracting 64-bit C:\ProgramData\chocolatey\lib\msys2\tools\msys2-base-x86_64.tar.xz
+ Extracting C:\tools\msys64\msys2-base-x86_64-20180531.tar to C:\tools\msys64...
+ Starting initialization via msys2_shell.cmd
+ PATH environment variable does not have C:\tools\msys64 in it. Adding...
+ ```
+
+1. Launch a new MSYS2 terminal (not a CMD prompt or Powershell window):
+ 1. Start Menu > Run ... `c:\tools\msys64\msys2_shell.cmd`
+ 1. Run all subsequent steps within this terminal.
+
+### Clone and Build a Windows Binary
+
+1. Clone and enter the repository's directory:
+ 1. `git clone https://github.com/dreamer/dosbox-staging.git`
+ 1. `cd dosbox-staging`
+
+ Be sure to run all subsequent steps below while inside the repo's directory.
+
+2. (🏁 first-time-only) Install the build tools and runtime dependencies:
+
+ `./scripts/list-build-dependencies.sh -m msys2 -c clang | xargs pacman -S
+ --noconfirm`
+
+3. Build an optimized binary with either compiler:
+
+- GCC: `./scripts/build.sh -c gcc -t release --bin-path /mingw64/bin`
+- Clang: `./scripts/build.sh -c clang -t release --bin-path /mingw64/bin`
+
+1. To build a debug binary, use `-t debug` in place of `-t release`.
+
+## macOS Procedures
+
+Builds on macOS can be performed with Clang or GCC. For general use, we
+recommend building with `Clang` as it supports linking with Apple's CoreMidi
+SDK. Developers interested in testing wider compiler coverage might also be
+interested in building with GCC. The following sections describe how to install
+and build with both compilers.
+
+### Install Dependencies under macOS
+
+Before installing either Brew or MacPorts, the Apple's Xcode tools need to be
+installed and the license agreed to:
+
+#### Xcode Installation
+
+1. Install the command line tools: `xcode-select --install`
+1. Accept the license agreement: `sudo xcodebuild -license`
+
+#### Install the Brew Package Manager and Dependencies
+
+1. Download and install brew per the instructions here: <https://brew.sh>
+1. Update it with: `brew update`
+1. Install git with: `brew install git`
+1. Clone the repository: `git clone
+ https://github.com/dreamer/dosbox-staging.git`
+1. Change directories into the repo: `cd dosbox-staging`
+1. Install dependencies:
+
+ `brew install $(./scripts/list-build-dependencies.sh -m brew -c gcc)`
+
+#### Install the MacPorts Package Manager and Dependencies
+
+1. Build and install MacPorts along with dosbox-staging dependencies with the
+ following sequence:
+
+ ``` shell
+ git clone --quiet --depth=1 https://github.com/macports/macports-base.git
+ cd macports-base
+ ./configure
+ make -j"$(sysctl -n hw.physicalcpu)"
+ sudo make install
+ PREFIX="/opt/local"
+ PATH="${PREFIX}/sbin:${PREFIX}/bin:${PATH}"
+ sudo port -q selfupdate
+ ```
+1. Clone the repository: `git clone
+ https://github.com/dreamer/dosbox-staging.git`
+1. Change directories into the repo: `cd dosbox-staging`
+1. Install depedencies:
+
+ `sudo port -q install $(./scripts/list-build-dependencies.sh -m macports -c gcc)`
+
+### Build a macOS Binary (common for Brew and MacPorts)
+
+1. Build an optimized binary with various compilers:
+
+- Clang: `./scripts/build.sh -c clang -t release -p /usr/local/bin`
+- GCC (brew): `./scripts/build.sh -c gcc -v 9 -t release -p /usr/local/bin`
+- GCC (macports): `./scripts/build.sh -c gcc -v mp-9 -t release -p
+ /opt/local/bin`
+
+1. To build a debug binary, use `-t debug` in place of `-t release`.
+
+## Linux Procedures
+
+### Install Dependencies under Linux
+
+1. Install git: `sudo apt install -y git`
+1. Clone the repository: `git clone
+ https://github.com/dreamer/dosbox-staging.git`
+1. Change directories into the repo: `cd dosbox-staging`
+1. (🏁 first-time-only) Install dependencies based on your package manager.
+ In this example, we use Ubuntu 20.04:
+
+ `sudo apt install -y $(./scripts/list-build-dependencies.sh -m apt -c clang)`
+
+ For other supported package managers, run:
+ `./scripts/list-build-dependencies.sh`
+
+### Build a Linux Binary
+
+1. Build an optimized binary using various compilers:
+
+- Clang: `./scripts/build.sh -c clang -t release -m lto`
+- GCC (default version): `./scripts/build.sh -c gcc -t release -m lto`
+- GCC (specific version, ie: 10): `./scripts/build.sh -c gcc -v 10 -t release -m
+ lto`
+
+1. To build a debug binary, use `-t debug` in place of `-t release -m lto`.
+
+## Haiku Procedures
+
+### Install Dependencies under Haiku
+
+1. Clone the repository: `git clone
+ https://github.com/dreamer/dosbox-staging.git`
+1. Change directories into the repo: `cd dosbox-staging`
+1. (🏁 first-time-only) Install dependencies:
+
+ `pkgman install -y $(./scripts/list-build-dependencies.sh -m haikuports -c
+ clang -v 9)`
+
+### Build a Haiku Binary
+
+1. Build an optimized binary using various compilers:
+
+- Clang: `./scripts/build.sh --compiler clang -t release -m lto
+ --prefix=$HOME/config/non-packaged`
+- GCC: `./scripts/build.sh -c gcc -t release --prefix=$HOME/config/non-packaged`
+
+1. To build a debug binary, use `-t debug` in place of `-t release`.
+1. Install the binary: `make install`
+1. Edit your configuration file by running: `dosbox -editconf` and make the
+ following suggested changes (leave all other settings as-is):
+
+ ``` ini
+ [sdl]
+ windowresolution = 800x600
+ output = texturenb
+ texture_renderer = software
+
+ [renderer]
+ scaler = none
+ glshader = none
+
+ [cpu]
+ core = normal
+ ```
+
+ The state of Haiku's GPU Hardware-acceleration is being discussed here:
+ https://discuss.haiku-os.org/t/state-of-accelerated-opengl/4163
+
+1. You may now run `dosbox` inside any directory in your Terminal.
+
+## Additional Tips
+
+### Compiler variations
+
+The compiler, version, and bit-depth can be selected by passing the following
+common options to the **list-build-dependencies.sh** and **build.sh** scripts:
+
+- `--compiler clang` or `-c clang` to use CLang instead of GCC
+- `--compiler-version 8` or `-v <version>` to specify a particular version of
+ compiler (if available in your package manager)
+- `--bit-depth 32`, to build a 32-bit binary instead of 64-bit
+
+### Release types
+
+Build release types includes:
+
+- **release**, optimizes the binary and disables some checks, such as
+ assertions.
+- **debug**, adds debug symbols and disables optimizations for ideal debugging.
+ - You can run the resulting binary in the GNU debugger: `gdb /path/to/
+ dosbox`, followed by `run mygame.bat`
+- **pgotrain** adds Profile Guided Optimization (PGO) tracking instrumentation
+ to the compiled binary.
+
+ This allows the recording of profile statistics that can be used to compile a
+ PGO-optimized binary. Note that PGO optimization is different from
+ Automatic Feedback Directed Optimization (AutoFDO) mentioned below.
+
+ After compiling your PGO binary, the build script presents instructions
+ describing how to generate and use the profiling data.
+
+- **warnmore**, displays additional helpful C and C++ warnings for developers.
+- **fdotrain**, add tracing symbols used to generate AutoFDO sampling data.
+- **$SANITIZER TYPE**, builds a binary instrumented with code to catch issues at
+ runtime that relate to the type of sanitizer being used. For example: memory
+ leaks, threading issues, and so on. This is for Linux and macOS only.
+
+ - see `./scripts/build.sh --help` for a list of sanitizer-types that are
+ available.
+ - Run your binary like normal and it will generate output describing
+ problematic behavior
+ - Some sanitizers accept runtime options via an environment variables,
+ such as `ASAN_OPTIONS`, described here:
+ <https://github.com/google/sanitizers/wiki/AddressSanitizerFlags>
+
+### Build Results, Rebuilding, and Cleaning
+
+After building, your `dosbox` or `dosbox.exe` binary will reside inside
+`./dosbox-staging/src/`.
+
+The build script records the prior build type and will clean if needed between
+builds. To manually remove all intermediate object files and ephemeral
+auto-tools outputs, run `make distclean`.
+
+To additionally remove all files except for the repository files, use `git
+clean -fdx`.
+
+### CCache
+
+The build script will make use of ccache, which saves compiled objects for
+potential re-use in future builds (hence the name, "cache") to speed up build
+times. If you performed the one-time installation step above, then you will
+already have ccache installed.
+
+Simply having `ccache` in your path is sufficient to use it; you do not
+need to invasively symlink `/usr/bin/gcc` -> `ccache`.
+
+The build script enables ccache's object compression, which significantly
+reduces the size of the cache. It will also display cache statistics after each
+build. To see more details, run `ccache -s`.
+
+To learn more about ccache run `ccache -h`, and read
+<https://ccache.dev/manual/latest.html>
+
+### Optimization Modifiers
+
+The following modifier flags can be added when building a **release** type:
+
+- `-m lto`, optimize the entire object space instead of per-file (Only
+ available on Mac and Linux)
+
+- `-m fdo`, performs feedback directed optimizations (FDO) using an AutoFDO
+ data set. Export the `FDO_FILE` variable with the full path to your merged
+ FDO dataset. For example:
+
+ - GCC: `export FDO_FILE=/full/path/to/current.afdo` and then build with:
+
+ `./scripts/builds.sh -c gcc -t release -m fdo -m lto`
+
+ - Clang: `export FDO_FILE=/full/path/to/current.profraw`, and then build
+ with:
+
+ `./scripts/builds.sh -c clang -t release -m fdo -m lto`
+
+ The section below describes how to collect an AutoFDO dataset for GCC and
+ Clang.
+
+## AutoFDO Procedures
+
+Feedback Directed Optimization (FDO) involves recording performance data from
+the Linux kernel and using it to direct the compiler's optimizer.
+
+### Prerequisites for AutoFDO
+
+- An **Intel processor** that supports the last branch record (LBR) instruction.
+- A Linux **kernel** built with Branch Profiling tracers enabled:
+
+ ``` shell
+ CONFIG_PM_TRACE=y
+ CONFIG_TRACE_BRANCH_PROFILING=y
+ CONFIG_BRANCH_TRACER=y
+ ```
+
+ These can be enable directly in your kernel's `.config` file or using `make
+ menuconfig` via the following menu options:
+ 1. `Kernel hacking --->`
+ 1. `[*] Tracers --->`
+ 1. `Branch Profiling (Trace likely/unlikely profiler)`
+ 1. `(X) Trace likely/unlikely profiler`
+
+- The **AutoFDO** software package. It may be available via your package
+ manager or built from sources <https://github.com/google/autofdo>.
+
+ - **Note about compiler versions** the autofdo binaries need to be compiled
+ with the exact version of the compiler that will later be used to compile
+ our final optimized version of dosbox-staging.
+
+ So for example, if you install autofdo via package-manager, then it will be
+ valid for the default version of gcc and clang also installed by your
+ package manager. Where as if you plan to build with `gcc-<latest>`, then
+ you will need to compile autofdo from sources using `gcc-<latest>` by
+ pointing the `CC` and `CXX` environment variables to the newer gcc
+ binaries.
+
+ - **Note about clang** If you plan to compile with a version of clang newer
+ than your package manager's default version, then you will need to compile
+ autofdo from source and configure it with the corresponding version of
+ `llvm-config`. For example, if I want to build with clang-10, then I would
+ configure autofdo with: `./configure --with-llvm=/usr/bin/llvm-config-10`.
+
+ - The included `.github/scripts/build-autofdo.sh` script can be used to build
+ and install autofdo, for example:
+
+ - default GCC:
+
+ `sudo .github/scripts/build-autofdo.sh`
+ - newer GCC:
+
+ ``` shell
+ export CC=/usr/bin/gcc-9
+ export CXX=/usr/bin/g++-9
+ sudo .github/scripts/build-autofdo.sh
+ ```
+
+ - Clang version 10:
+
+ `sudo .github/scripts/build-autofdo.sh`
+
+- The **pmu-tools** software package, which can be downloaded from
+ <https://github.com/andikleen/pmu-tools.> This is a collection of python
+ scripts used to assist in capturing sampling data.
+
+### Record Data for AutoFDO Builds
+
+1. Ensure the custom Linux Kernel supporting LBR tracing is running.
+
+2. Build `dosbox-staging` from source using the `fdotrain` target:
+ `./scripts/build.h -c gcc -t fdotrain`
+
+3. Record kernel sample profiles while running dosbox-staging:
+
+ `/path/to/pmu-tools/ocperf.py record -F max -o "samples-1.prof" -b -e
+ br_inst_retired.near_taken:pp -- /path/to/fdo-trained/dosbox ARGS`
+
+ Where `samples-1.prof` is the file that will be filled with samples.
+
+ Repeat this for multiple training runs, each time saving the output to a new
+ `-o samples-N.prof` file. Ideally you want to exercise all code paths in
+ dosbox-staging (core types, video cards, video modes, sound cards, and audio
+ codecs).
+
+4. Convert your sample profiles into compiler-specific records using tools
+ provided in the `autofdo` package:
+
+ For GCC, run:
+ - `create_gcov --binary=/path/to/fdo-trained/dosbox
+ --profile=samples-1.prof -gcov=samples-1.afdo -gcov_version=1`
+
+ ... for each `.prof` file, creating a corresponding `.afdo` file.
+
+ - At this point, you now have an `.afdo` file for each `.prof` file. Merge
+ the `.afdo`s into a single `curren.afdo` file with:
+
+ `profile_merger -gcov_version=1 -output_file=current.afdo *.afdo`
+
+ For Clang, run:
+
+ - `create_llvm_prof --binary=/path/to/fdo-trained/dosbox
+ --profile=samples-1.prof --out=samples-1.profraw`
+
+ ... for each `*.prof` file, creating a corresponding `.profraw` file.
+
+ - At this point, you now have a `.profraw` file for each `.prof` file. Merge
+ them into a single `current.profraw` file with:
+
+ `llvm-profdata-<version> merge -sample -output=current.profraw *.profraw`
+
+### Build Using AutoFDO Data
+
+You can now use your merged `.afdo` or `.profraw` file to build with the `-m
+fdo` modifier by placing your `current.afdo/.profraw` file in the repo's root
+directory, or point to it using the FDO_FILE environment variable, and launch
+the build with `./scripts/build.sh -c <gcc or clang> -t release -m lto -m fdo`.