This directory contains project templates which should help you get started using JUCE's CMake support.
Most system package managers have packages for CMake, but we recommend using the most recent release from https://cmake.org/download. You should always use a CMake that's newer than your build toolchain, so that CMake can identify your build tools and understand how to invoke them.
In addition to CMake you'll need a build toolchain for your platform, such as Xcode or MSVC.
In this directory, you'll find example projects for a GUI app, a console app, and an audio plugin.
You can simply copy one of these subdirectories out of the JUCE repo, add JUCE as a submodule, and
uncomment the call to add_subdirectory
where indicated in the CMakeLists.txt. Alternatively, if
you've installed JUCE using a package manager or the CMake install target, you can uncomment the
call to find_package
.
Once your project is set up, you can generate a build tree for it in the normal way. To get started, you might invoke CMake like this, from the new directory you created.
cmake -Bbuild (-GgeneratorName) (-DJUCE_BUILD_EXTRAS=ON) (-DJUCE_BUILD_EXAMPLES=ON)
This will create a build tree in a directory named ‘build’, using the CMakeLists in the current
working directory, using the default generator (makefiles on mac/linux, and the most recent Visual
Studio on Windows). You can choose a specific generator to use with the -G
flag (call cmake -G
to see a full list of generators on your platform). If you included JUCE as a subdirectory, you can
enable the Extras and Examples targets by including the last two arguments (they're off by default).
There's quite a lot of example projects, and generating project files might take a bit longer when
these options are on, so you probably won't want to include them most of the time.
Then, to build the project:
cmake --build build (--target targetNameFromCMakeLists) (--config Release/Debug/...)
This tells cmake to build the target named targetNameFromCMakeLists
, in the specified
configuration, using the appropriate tool. Of course, if you generated makefiles or ninja files, you
could call make
or ninja
in the build directory. If you generated an IDE project, like an Xcode
or Visual Studio project, then you could open the generated project in your IDE.
To build for iOS, you'll need CMake 3.14 or higher. Using the Xcode generator is highly recommended, as other generators may not automatically find the correct SDK for the iPhone simulator, and may fail to run certain parts of the build, such as compiling icons and processing the app's plist. By default, CMake will build for the same system that originally configured the project, so to enable cross-compilation for iOS, a few extra flags must be passed to the initial CMake invocation:
cmake -Bbuild-ios -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=9.3
Here we create a build tree in the directory named ‘build-ios’, using the Xcode generator. The
-DCMAKE_SYSTEM_NAME=iOS
option tells CMake to enable cross-compiling for iOS. The
-DCMAKE_OSX_DEPLOYMENT_TARGET=9.3
option sets the minimum deployment target (it applies to iOS
despite the ‘OSX’ in the variable name!).
Once the project has generated, we can open it as normal in Xcode (look for the project file in the build directory). Alternatively, to build from the command-line, we could run this command:
cmake --build build-ios --target <targetName> -- -sdk iphonesimulator
Here, we're building the target named <targetName>
from the build tree in the directory
build-ios
. All the arguments after --
are ignored by CMake, and are passed through to the
underlying build tool. In this case, the build tool will be xcodebuild
because we used the Xcode
generator above. We tell xcodebuild that we're building the app for the iOS simulator, which doesn't
require special code signing.
If we wanted to build for a real device, we would need to pass some extra signing details to the initial CMake configuration command:
cmake -Bbuild-ios -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=9.3 \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="iPhone Developer"
-DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM=<10 character id>
The CODE_SIGN_IDENTITY
is the kind of certificate you want to use (iPhone Developer is appropriate
for development) and DEVELOPMENT_TEAM
is the 10-character ID that can be found by opening the
Keychain Access app, finding your development certificate, and checking its ‘Organizational Unit’
info field.
When building the target, you may also need to tell Xcode that it can automatically update
provisioning profiles, which is achieved by passing the -allowProvisioningUpdates
flag:
cmake --build build-ios --target <targetName> -- -allowProvisioningUpdates
juce_add_<target>
juce_add_gui_app(<target> [KEY value]...)
juce_add_console_app(<target> [KEY value]...)
juce_add_plugin(<target> [KEY value]...)
juce_add_gui_app
and juce_add_console_app
add an executable target with name <target>
.
juce_add_plugin
adds a ‘shared code’ static library target with name <target>
, along with extra
targets for each of the specified plugin formats. Each of these functions also takes a number of
optional arguments in the form of a KEY
followed by one or more value
s which can be used to set
additional attributes of the target. If these optional arguments aren't specified, their values will
fall back to sensible defaults.
Each of these arguments adds a property to the resulting target in the form JUCE_paramName
, where
paramName
is one of the parameter keys below. For example, after a call to
juce_add_gui_app(my_target PRODUCT_NAME "Target")
, the target my_target
will have a property
named JUCE_PRODUCT_NAME
with the value "Target"
. After creating a target with one of these
commands, properties beginning with JUCE_
can be queried, but changing their values might not
have any effect (or might even break things in unexpected ways!), so always pass JUCE target
attributes directly to these creation functions, rather than adding them later.
PRODUCT_NAME
OUTPUT_NAME
property. If not
specified, this will default to the target name.VERSION
VERSION
of
the project containing the target will be used instead.BUNDLE_ID
COMPANY_NAME
and PRODUCT_NAME
.MICROPHONE_PERMISSION_ENABLED
MICROPHONE_PERMISSION_TEXT
CAMERA_PERMISSION_ENABLED
CAMERA_PERMISSION_TEXT
BLUETOOTH_PERMISSION_ENABLED
BLUETOOTH_PERMISSION_TEXT
SEND_APPLE_EVENTS_PERMISSION_ENABLED
SEND_APPLE_EVENTS_PERMISSION_TEXT
FILE_SHARING_ENABLED
DOCUMENT_BROWSER_ENABLED
STATUS_BAR_HIDDEN
BACKGROUND_AUDIO_ENABLED
BACKGROUND_BLE_ENABLED
APP_GROUPS_ENABLED
APP_GROUP_IDS
ICLOUD_PERMISSIONS_ENABLED
IPHONE_SCREEN_ORIENTATIONS
UIInterfaceOrientationUnknown
, UIInterfaceOrientationPortrait
,
UIInterfaceOrientationPortraitUpsideDown
, UIInterfaceOrientationLandscapeLeft
, or
UIInterfaceOrientationLandscapeRight
. Adds appropriate entries to an iOS app's plist.IPAD_SCREEN_ORIENTATIONS
UIInterfaceOrientationUnknown
, UIInterfaceOrientationPortrait
,
UIInterfaceOrientationPortraitUpsideDown
, UIInterfaceOrientationLandscapeLeft
, or
UIInterfaceOrientationLandscapeRight
. Adds appropriate entries to an iOS app's plist.LAUNCH_STORYBOARD_FILE
CUSTOM_XCASSETS_FOLDER
ICON_BIG
, ICON_SMALL
COMPANY_COPYRIGHT
JUCE_COMPANY_COPYRIGHT
property, so if you want to use the same
COMPANY_COPYRIGHT
for several targets in a build tree, you can call
set_directory_properties(PROPERTIES JUCE_COMPANY_COPYRIGHT ...)
after including JUCE but
before adding the targets, and then omit the COMPANY_COPYRIGHT
argument when creating the
individual targets.COMPANY_NAME
BUNDLE_ID
if no ID was given explicitly. The value of this argument
will be inherited from the JUCE_COMPANY_NAME
property, so if you want to use the same
COMPANY_NAME
for several targets in a build tree, you can call
set_directory_properties(PROPERTIES JUCE_COMPANY_NAME ...)
after including JUCE but before
adding the targets, and then omit the COMPANY_NAME
argument when creating the individual
targets.COMPANY_WEBSITE
JUCE_COMPANY_WEBSITE
property, so if you want to use the same
COMPANY_WEBSITE
for several targets in a build tree, you can call
set_directory_properties(PROPERTIES JUCE_COMPANY_WEBSITE ...)
after including JUCE but before
adding the targets, and then omit the COMPANY_WEBSITE
argument when creating the individual
targets.COMPANY_EMAIL
JUCE_COMPANY_EMAIL
property, so if you want to use the same COMPANY_EMAIL
for several
targets in a build tree, you can call set_directory_properties(PROPERTIES JUCE_COMPANY_EMAIL ...)
after including JUCE but before adding the targets, and then omit the COMPANY_EMAIL
argument when creating the individual targets.DOCUMENT_EXTENSIONS
jucer
because it wants to open .jucer
files. If your target has several different
document types, you can pass them as multiple arguments, e.g. DOCUMENT_EXTENSIONS wav mp3 aif
.NEEDS_CURL
TRUE
.NEEDS_WEB_BROWSER
TRUE
.NEEDS_STORE_KIT
TRUE
.PUSH_NOTIFICATIONS_ENABLED
HARDENED_RUNTIME_ENABLED
HARDENED_RUNTIME_OPTIONS
HARDENED_RUNTIME_ENABLED
is TRUE
. Each key should be in the form
com.apple.security.*
where *
is a specific entitlement.APP_SANDBOX_ENABLED
APP_SANDBOX_INHERIT
TRUE
, no other app sandbox entitlements will be set on this target.APP_SANDBOX_OPTIONS
APP_SANDBOX_ENABLED
is TRUE
. Each key should be in the form com.apple.security.*
where *
is a specific entitlement.PLIST_TO_MERGE
FORMATS
Standalone Unity VST3 AU AUv3 AAX VST
. AU
and AUv3
plugins will only be enabled when building on macOS. It is an error to pass AAX
or VST
without first calling juce_set_aax_sdk_path
or juce_set_vst2_sdk_path
respectively.PLUGIN_MANUFACTURER_CODE
PLUGIN_CODE
DESCRIPTION
IS_SYNTH
NEEDS_MIDI_INPUT
NEEDS_MIDI_OUTPUT
IS_MIDI_EFFECT
EDITOR_WANTS_KEYBOARD_FOCUS
DISABLE_AAX_BYPASS
DISABLE_AAX_MULTI_MONO
AAX_IDENTIFIER
BUNDLE_ID
by default.VST_NUM_MIDI_INS
VST_NUM_MIDI_OUTS
VST2_CATEGORY
kPlugCategUnknown
, kPlugCategEffect
, kPlugCategSynth
,
kPlugCategAnalysis
, kPlugCategMatering
, kPlugCategSpacializer
, kPlugCategRoomFx
,
kPlugSurroundFx
, kPlugCategRestoration
, kPlugCategOfflineProcess
, kPlugCategShell
,
kPlugCategGenerator
.VST3_CATEGORIES
Fx
, Instrument
, Analyzer
,
Delay
, Distortion
, Drum
, Dynamics
, EQ
, External
, Filter
, Generator
, Mastering
,
Modulation
, Mono
, Network
, NoOfflineProcess
, OnlyOfflineProcess
, OnlyRT
,
Pitch Shift
, Restoration
, Reverb
, Sampler
, Spatial
, Stereo
, Surround
, Synth
,
Tools
, Up-Downmix
AU_MAIN_TYPE
kAudioUnitType_Effect
, kAudioUnitType_FormatConverter
,
kAudioUnitType_Generator
, kAudioUnitType_MIDIProcessor
, kAudioUnitType_Mixer
,
kAudioUnitType_MusicDevice
, kAudioUnitType_MusicEffect
, kAudioUnitType_OfflineEffect
,
kAudioUnitType_Output
, kAudioUnitType_Panner
AU_EXPORT_PREFIX
AU_SANDBOX_SAFE
AAX_CATEGORY
AAX_ePlugInCategory_None
, AAX_ePlugInCategory_EQ
,
AAX_ePlugInCategory_Dynamics
, AAX_ePlugInCategory_PitchShift
, AAX_ePlugInCategory_Reverb
,
AAX_ePlugInCategory_Delay
, AAX_ePlugInCategory_Modulation
, AAX_ePlugInCategory_Harmonic
,
AAX_ePlugInCategory_NoiseReduction
, AAX_ePlugInCategory_Dither
,
AAX_ePlugInCategory_SoundField
, AAX_ePlugInCategory_HWGenerators
,
AAX_ePlugInCategory_SWGenerators
, AAX_ePlugInCategory_WrappedPlugin
,
AAX_ePlugInCategory_Effect
COPY_PLUGIN_AFTER_BUILD
JUCE_COPY_PLUGIN_AFTER_BUILD
on the directory before adding the
plugins, rather than setting this argument on each individual target. Note that on Windows,
the default install locations may not be writable by normal user accounts.VST_COPY_DIR
COPY_PLUGIN_AFTER_BUILD
is set on this target. If you want to install all of the VST2 plugins
in a subdirectory to a non-default location, you can set the JUCE_VST_COPY_DIR
property on
the directory before adding the plugin targets, rather than setting this argument on each
individual target.VST3_COPY_DIR
COPY_PLUGIN_AFTER_BUILD
is set on this target. If you want to install all of the VST3 plugins in a subdirectory to a
non-default location, you can set the JUCE_VST3_COPY_DIR
property on the directory before
adding the plugin targets, rather than setting this argument on each individual target.AAX_COPY_DIR
COPY_PLUGIN_AFTER_BUILD
is set on this target. If you want to install all of the AAX plugins in a subdirectory to a
non-default location, you can set the JUCE_AAX_COPY_DIR
property on the directory before
adding the plugin targets, rather than setting this argument on each individual target.AU_COPY_DIR
COPY_PLUGIN_AFTER_BUILD
is set on this target. If you want to install all of the AU plugins in a subdirectory to a
non-default location, you can set the JUCE_AU_COPY_DIR
property on the directory before
adding the plugin targets, rather than setting this argument on each individual target.UNITY_COPY_DIR
COPY_PLUGIN_AFTER_BUILD
is set on this target. If you want to install all of the Unity plugins in a subdirectory to a
non-default location, you can set the JUCE_UNITY_COPY_DIR
property on the directory before
adding the plugin targets, rather than setting this argument on each individual target.
Unlike the other COPY_DIR
arguments, this argument does not have a default value so be sure
to set it if you have enabled COPY_PLUGIN_AFTER_BUILD
and the Unity
format.juce_add_binary_data
juce_add_binary_data(<name>
[HEADER_NAME ...]
[NAMESPACE ...]
SOURCES ...)
Create a static library that embeds the contents of the files passed as arguments to this function.
Adds a library target called <name>
which can be linked into other targets using
target_link_libraries
.
The HEADER_NAME
argument is optional. If provided, the generated header will be given the
requested name, otherwise the generated header will be named “BinaryData.h”. In completely new
projects, you should provide a unique name here, so that projects containing more than one binary
data target are able to include the binary data headers without ambiguity.
The NAMESPACE
argument is also optional. If not provided, the generated files will use the default
namespace BinaryData
. Each of the files located at the paths following SOURCES
will be encoded
and embedded in the resulting static library. This library can be linked as normal using
target_link_libraries(<otherTarget> PRIVATE <name>)
, and the header can be included using
#include <BinaryData.h>
.
juce_add_bundle_resources_directory
juce_add_bundle_resources_directory(<target> <folder>)
Copy the entire directory at the location <folder>
into an Apple bundle's resource directory, i.e.
the Resources
directory for a macOS bundle, and the top-level directory of an iOS bundle.
juce_generate_juce_header
juce_generate_juce_header(<target>)
Introspects the JUCE modules that have been linked to <target>
and generates a JuceHeader.h
which contains #include
statements for each of the module headers. This header also contains an
optional using namespace juce
statement, and an optional ProjectInfo
block, each of which can be
disabled by setting the compile definitions DONT_SET_USING_JUCE_NAMESPACE
and
JUCE_DONT_DECLARE_PROJECTINFO
respectively. The resulting header can be included with #include <JuceHeader.h>
. In plain CMake projects which don't require Projucer compatibility, the use of
JuceHeader.h is optional. Instead, module headers can be included directly in source files that
require them.
juce_set_<kind>_sdk_path
juce_set_aax_sdk_path(<absolute path>)
juce_set_vst2_sdk_path(<absolute path>)
Call these functions from your CMakeLists to set up your local AAX and/or VST2 SDKs. These functions should be called before adding any targets that may depend on the AAX/VST2 SDKs (plugin hosts, VST2/AAX plugins etc.).
juce_add_module
juce_add_module(<path to module>)
juce_add_modules(<names of module>...)
juce_add_module
adds a library target for the JUCE module located at the provided path. <path>
must be the path to a module directory (e.g. /Users/me/JUCE/modules/juce_core). This will add an
interface library with a name matching the directory name of the module. The resulting library can
be linked to other targets as normal, using target_link_libraries
.
Due to the way that INTERFACE
libraries work in CMake, linking to a module added in this way
must be done using PRIVATE
visibility. Using PUBLIC
will cause the module sources to be added
both to the target's SOURCES
and INTERFACE_SOURCES
, which may result in many copies of the
module being built into a single target, which would cause build failures in the best case and
silent ODR violations in the worst case. Scary stuff!
This command has a few optional arguments: INSTALL_PATH
is a path, relative to the install prefix,
to which the module sources will be copied during installation of the module. ALIAS_NAMESPACE will
add an alias for the module target(s) with the provided namespace. For example, the following
invocation will add a module target named my_module
, along with an alias named
company::my_module
. juce_add_module(my_module ALIAS_NAMESPACE company)`
juce_add_modules
is a convenience function that can be used to add multiple JUCE modules at once.
This version accepts many module paths, rather than just one. For an example of usage, see the
CMakeLists in the modules
directory.
juce_add_pip
juce_add_pip(<header>)
This function parses the PIP metadata block in the provided header, and adds appropriate build
targets for a console app, GUI app, or audio plugin. For audio plugin targets, it builds as many
plugin formats as possible. To build AAX or VST2 targets, call juce_set_aax_sdk_path
and/or
juce_set_vst2_sdk_path
before calling juce_add_pip
.
This is mainly provided to build the built-in example projects in the JUCE repo, and for building
quick proof-of-concept demo apps with minimal set-up. For any use-case more complex than a
proof-of-concept, you should prefer the juce_add_gui_app
, juce_add_plugin
, or
juce_add_console_app
functions, which provide more fine-grained control over the properties of
your target.
juce_disable_default_flags
juce_disable_default_flags()
This function sets the CMAKE_<LANG>_FLAGS_<MODE>
to empty in the current directory and below,
allowing alternative optimisation/debug flags to be supplied without conflicting with the
CMake-supplied defaults.
target_link_libraries(myTarget PRIVATE juce::juce_recommended_warning_flags)
This is a target which can be linked to other targets using target_link_libraries
, in order to
enable the recommended JUCE warnings when building them.
target_link_libraries(myTarget PRIVATE juce::juce_recommended_config_flags)
This is a target which can be linked to other targets using target_link_libraries
, in order to
enable the recommended JUCE optimisation and debug flags.
target_link_libraries(myTarget PRIVATE juce::juce_recommended_lto_flags)
This is a target which can be linked to other targets using target_link_libraries
, in order to
enable the recommended JUCE link time optimisation settings.