audacia/BUILDING.md

249 lines
13 KiB
Markdown

# Building Audacity
## Prerequisites
* **python3** >= 3.9.1
* **conan** >= 1.32.0
* **cmake** >= 1.36
* A working C++ 14 compiler
### Conan
[The best way to install Conan is `pip`.](https://docs.conan.io/en/latest/installation.html)
To install Conan on Windows:
```
$ pip install conan
```
To install Conan on macOS and Linux:
```
$ sudo pip3 install conan
```
Alternatively, on macOS, Conan is available from `brew`.
### CMake
On Windows, please use the [prebuilt binaries](https://cmake.org/download/).
On macOS, the easiest way to install CMake is `brew install cmake`.
On Linux, `cmake` is usually available from the system package manager. The latest CMake version is available from Snap: `sudo snap instal cmake --classic`.
### Windows
We build Audacity using [Microsoft Visual Studio 2019](https://visualstudio.microsoft.com/vs/community/). In order to build Audacity **Desktop development with C++** workload is required.
As we require only C++14 - MSVC 2017 should work just well too.
### MacOS
We build Audacity using XCode 12. However, it is likely possible to build it with XCode 7.
### Linux
We use GCC 9, but any C++14 compliant compiler should work.
On Debian or Ubuntu, you can install everything required using the following commands:
```
$ sudo apt-get update
$ sudo apt-get install -y build-essential cmake git python3-pip
$ sudo pip3 install conan
$ sudo apt-get install libgtk2.0-dev libasound2-dev libavformat-dev libjack-jackd2-dev
```
## Building on Windows
1. Clone Audacity from the Audacity GitHub project.
For example, in the **git-bash** run:
```
$ git clone https://github.com/audacity/audacity/
```
2. Open CMake GUI.
Set the **Where is the source code** to the location Audicity was cloned.
Set **Where to build the binaries** to the location you want to place your build in. It is preffered, that this location is not within the directory with the source code.
3. Press **Configure**. You can choose which version of Visual Studio to use and the platform to build for in the popup. We support **x64** and **Win32** platforms. The **x64** platform is a default option. Press **Finish** to start the configuration process.
4. After the successful configuration, you will see `Configuring done` in the last line of the log. Press **Generate** to generate the Visual Studio project.
5. After you see "Generating done", press **Open Project** to open the project in Visual Studio.
6. Select "Build -> Build Solution".
7. You can now run and debug Audacity!
Generally, steps 1-5 are only needed for the first-time configuration. Then, after you've generated the solution - you can open it in Visual Studio next time. In case when the project configuration has changed - the IDE will invoke CMake internally.
> Conan Center provides prebuilt binaries only for **x64**. Configuring the project for Win32 will take much longer, as all the 3d party libraries will be built during the configuration.
## macOS
1. Clone Audacity from the Audacity GitHub project.
```
$ git clone https://github.com/audacity/audacity/
```
2. Configure Audacity using CMake:
```
$ mkdir build && cd build
$ cmake -GXCode -T buildsystem=1 ../audacity
```
3. Open Audacity XCode project:
```
$ open Audacity.xcodeproj
```
and build Audacity using the IDE.
Steps 1 and 2 are only required for the first-time builds.
Alternatively, you can use **CLion**. If you chose so, open the directory where you have cloned Audacity using CLion and you are good to go.
At the moment, we only support **x86_64** builds. It is possible to build using AppleSilicon harware, but **mad** and **id3tag** should be disabled:
```
cmake -GXCode -T buildsystem=1 -Daudacity_use_mad="off" -Daudacity_use_id3tag=off ../audacity
```
## Linux & Other OS
1. Clone Audacity from the Audacity GitHub project.
```
$ git clone https://github.com/audacity/audacity/
```
2. Configure Audacity using CMake:
```
$ mkdir build && cd build
$ cmake -G "Unix Makefiles" -Daudacity_use_ffmpeg=loaded ../audacity
```
3. Build Audacity:
```
$ make -j'nproc`
```
4. Testing the build:
Adding a "Portable Settings" folder allows Audacity to ignore the settings of any existing Audacity installation.
```
$ cd bin/Release
$ mkdir "Portable Settings"
$ ./audacity
```
5. Installing Audacity
```
$ cd <build directory>
$ sudo make install
```
## Advanced
### CMake options
You can use `cmake -LH` to get a list of the options available (or use CMake GUI or `ccmake`).
The most notable options are:
| Name | Type | Default | Description |
| :-------------------------------- | :----- | :--------- | :-------------------------------------------------------------- |
| CMAKE_BUILD_TYPE | STRING | Debug | Type of the build: Debug, Release, RelWithDebInfo, MinSizeRel |
| CMAKE_INSTALL_PREFIX | PATH | /usr/local | Install path prefix, prepended onto install directories. |
| audacity_lib_preference | STRING | local | Library preference [system (if available), local] |
| audacity_obey_system_dependencies | BOOL | Off | Use only system packages to satisfy dependencies |
| audacity_use_expat | STRING | system | Use expat library [system (if available), local, off] |
| audacity_use_ffmpeg | STRING | loaded | Use ffmpeg library [loaded, linked, off] |
| audacity_use_flac | STRING | local | Use flac library [system (if available), local, off] |
| audacity_use_id3tag | STRING | local | Use id3tag library [system (if available), local, off] |
| audacity_use_ladspa | BOOL | ON | Use LADSPA plug-in support [on, off] |
| audacity_use_libmad | STRING | local | Use libmad library [system (if available), local, off] |
| audacity_use_libmp3lame | STRING | local | Use libmp3lame library [system (if available), local, off] |
| audacity_use_lv2 | STRING | local | Use lv2 library [system (if available), local, off] |
| audacity_use_mad | STRING | local | Use mad library [system (if available), local, off] |
| audacity_use_midi | STRING | local | Use midi library [system (if available), local, off] |
| audacity_use_nyquist | STRING | local | Use nyquist library [local, off] |
| audacity_use_ogg | STRING | local | Use ogg library [system (if available), local, off] |
| audacity_use_pa_alsa | BOOL | YES | Use the portaudio ALSA interface if available |
| audacity_use_pa_jack | STRING | linked | Use the JACK audio interface if available [loaded, linked, off] |
| audacity_use_pa_oss | BOOL | YES | Use the OSS audio interface if available |
| audacity_use_pch | BOOL | YES | Use precompiled headers [yes, no] |
| audacity_use_portaudio | STRING | local | Use portaudio library [local] |
| audacity_use_portmixer | STRING | local | Use portmixer library [local, off] |
| audacity_use_portsmf | STRING | local | Use portsmf library [system (if available), local, off] |
| audacity_use_sbsms | STRING | local | Use sbsms library [system (if available), local, off] |
| audacity_use_sndfile | STRING | local | Use sndfile library [system (if available), local] |
| audacity_use_soundtouch | STRING | local | Use soundtouch library [system (if available), local, off] |
| audacity_use_soxr | STRING | local | Use soxr library [system (if available), local] |
| audacity_use_sqlite | STRING | local | Use sqlite library [system (if available), local] |
| audacity_use_twolame | STRING | local | Use twolame library [system (if available), local, off] |
| audacity_use_vamp | STRING | local | Use vamp library [system (if available), local, off] |
| audacity_use_vorbis | STRING | local | Use vorbis library [system (if available), local, off] |
| audacity_use_vst | BOOL | ON | Use VST2 plug-in support [on, off] |
| audacity_use_wxwidgets | STRING | local | Use wxwidgets library [system (if available), local, off] |
| audacity_use_zlib | STRING | system | Use zlib library [system (if available), local, off] |
### Building using system libraries
On Linux, it is possible to build Audacity using (almost) only the libraries provided by the package manager. We require the following version of the packages to be installed:
| Name | Version | Ubuntu 20.04 package |
| :---------------- | :------------ | :------------------------------------------- |
| wxWidgets | >= 3.1.3 | **N/A** |
| expat | >= 2.2.9 | libexpat1-dev |
| libmp3lame | >= 3.100 | libmp3lame-dev |
| libsndfile | >= 1.0.28 | libsndfile-dev |
| libsoxr | >= 0.1.3 | libsoxr-dev |
| ~~portaudio-v19~~ | ~~>= 19.6.0~~ | ~~portaudio19-dev~~ |
| sqlite3 | >= 3.31.1 | libsqlite3-dev |
| libcurl | >= 7.68.0 | libcurl-dev |
| ffmpeg | >= 4.2.4 | libavcodec-dev libavformat-dev libavutil-dev |
| libid3tag | >= 0.15.1b | libid3tag0-dev |
| libmad | >= 0.15.1b | libmad0-dev |
| vamp-host-sdk | >= 2.9.0 | N/A |
| libogg | >= 1.3.4 | libogg-dev |
| libvorbis | >= 1.3.6 | libvorbis-dev |
| libflac | >= 1.3.3 | libflac-dev libflac++-dev |
| lilv | >= 0.24.6 | liblilv-dev |
| lv2 | >= 1.16.0 | lv2-dev |
| serd | >= 0.30.2 | libserd-dev |
| sord | >= 0.16.4 | libsord-dev |
| sratom | >= 0.6.4 | libsratom-dev |
| suil | >= 0.10.6 | libsuil-dev |
| portmidi | >= 217 | libportmidi-dev |
| portsmf | >= 0.1 | libportsmf-dev |
| libsbsms | >= 2.0.2 | libsbsms-dev |
| soundtouch | >= 2.1.2 | libsoundtouch-dev |
| twolame | >= 0.4.0 | libtwolame-dev |
| zlib | >= 1.2.11 | libzlib1g-dev |
There are a few cases when the local library build is preferred:
1. **wxWidgets**: While Audacity on **Linux** uses vanilla version of wxWidgets, we **require** that version **3.1.3** is used. This version is not available in most of the distributives.
2. **portaudio-v19**: Audacity currently uses some private APIs, so using system portaudio is not yet possible.
3. **vamp-host-sdk**: Development packages are not available in Ubuntu 20.04.
4. **libnyquist**, **portmixer**: Libraries is not available in Ubuntu 20.04.
5. **sqlite3**, **libsmbs**: Libraries are very outdated in Ubuntu 20.04.
It is not advised to mix system and local libraries, except for the list above. `ZLib` is very common dependency; it is possible to mix system and local libraries in one build. However, we try to mitigate this issue to some extent.
There is a [`Dockerfile`](linux/build-environment/Dockerfile) that can be used as an example of how to build the Audacity using system libraries:
```
$ docker build -t audacity_linux_env .\linux\build-environment\
$ docker run --rm -v ${pwd}:/audacity/audacity/ -v ${pwd}/../build/linux-system:/audacity/build -it audacity_linux_env
```
To find system packages, we rely on `pkg-config`. There are several packages, that have broken `*.pc` or do not use `pkg-config` at all. For the docker image - we mitigate this issue by installing the correct [`pc` files](linux/build-environment/pkgconfig/).