Cakefile Syntax Reference

The Cakefile contains a lightweight DSL which provides the instructions on how to generate a project file. We adopt the convention over configuration and thus it can be very simple:

  application_for :ios, 8.0 do |target|
      target.name = "MyApp"
  end

and here is much more complicated one:

  debug_configuration :staging
  debug_configuration :debug
  release_configuration :release

  application_for :ios, 8.0 do |target|
    target.name = "test"
    target.all_configurations.each { |c| c.supported_devices = :iphone_only }

    unit_tests_for target
  end

As you can see, it is super easy to read; The goal of Xcake is to keep everything readable, efficient and concise.

Project

A project is automatically created from a Cakefile. To customize a Project you can easily access all of it's properties via the project method.

project do |p|
  p.project_name = "Project"
end

You can also directly set the properties without a block, like so:

project.project_name = "Project"

Properties

Project Name

Sets the filename for the project

project.name = "Project"

Class Prefix

Sets the class prefix for the project

project.class_prefix = "XC"

Organization

Sets the organization for the project.

project.organization = "Xcake Productions"

Targets

Targets are the way we make products such as Applications, Extensions, Libraries and Tests. Xcake provides some easy ways to produce these types of targets but also allows you to drop down a level if you need more power.

Applications

A project can specify any application targets such as iOS or Mac Apps.

iOS App:

application_for :ios, 8.0

Mac App:

application_for :mac, 8.0

Tests

We can also specify a testing targets for other targets as well:

application_for :mac, 8.0 do |target|
  unit_tests_for target
end

The above code will create a complementary unit tests target for the target. The unit tests target name will be default <target.name>Tests, so if your target.name is "MyFirstApp" then your unit tests target will be named "MyFirstAppTests", and Xcake will include any files that are placed under folder with the same name/path (if it exists).

If you want to manually control configuration of unit tests targets (and/or have multiple ones), then you should do like this:

application_for :mac, 8.0 do |target|

  unit_tests_for target do |test_target|

        test_target.name = "MyAwesomeTests"
        test_target.include_files = ["Tests/**/*.*"]

        # configure any other target-related properties
        # as you would do with normal target

    end
end

Watch

To create watch applications we can simply use the watch_app_for method:

application_for :mac, 8.0 do |target|
    watch_app_for target, 2.0
end

Custom Targets

If these aren't enough for you then you can specify a target and manually set up it's properties.

target do |target|
    target.name = "Target"
end

Properties

Name

Sets the name of the target

target.name = "Target"

Type

Sets the type of the target, Can be :application, :dynamic_library, :framework or :static_library.

target.type = :application

Platform

Sets the platform of the target. Can be :ios, :osx, :tvos or :watchos

target.platform = :ios

Deployment Target

Sets the deployment target for the platform.

target.deployment_target = 8.0

Language

Sets the primary language of the target, can be :objc or :swift.

target.language = :swift

Include Files

Sets the files to be included for a target, files and groups will be added to the project to match the file system.

See Here for file patterns

target.include_files = ["FolderOne/*.*"] # array
target.include_files << "FolderTwo/**/*.*" # add an item to array

Exclude Files

Sets the files to be excluded for a target, if no target uses these files they will be excluded from the project

See Here for file patterns

target.exclude_files = ["FolderToIgnore/*.*"] # array
target.exclude_files << "OtherFolderToIgnore/*.*" # add an item to array

Configurations

Configurations are an abstraction of build settings and scheme settings. Depending on the target Xcake will create a scheme per target and per configuration.

Xcake allows you define a hierarchy of build settings like you would in Xcode for the Project and the Targets.

Debug Configurations

For configurations used for internal testing we create a debug configuration, this comes with sensible defaults optimized for debugging (i.e Assertions enabled).

debug_configuration :staging

We can modify settings for each configuration easily.

debug_configuration :staging do |configuration|
  configuration.settings["KEY"] = "VALUE"
end

Release Configurations

For configurations used for release we create a release configuration, this comes with sensible defaults optimized for releasing (i.e Compiler optimizations enabled).

release_configuration :release

We can modify settings for each configuration easily.

release_configuration :release do |configuration|
  configuration.settings["KEY"] = "VALUE"
end

All Configurations

We can apply a particular shared setting across all of our configurations. Xcake provides a simply way of doing this via an "all" configuration.

This will return an array of all of the currently declared configurations.

all_configurations.each { |c| c.supported_devices = :iphone_only }

Targets

To modify settings for certain target, then its as simple as prefixing the target we want to modify the configuration for.


target.all_configurations.each { |c| c.supported_devices = :iphone_only }

debug_configuration :staging do |configuration|
  configuration.settings["KEY"] = "VALUE"
end

target.release_configuration :release do |configuration|
  configuration.settings["KEY"] = "VALUE"
end

Configuration Hiearchy

Xcake allows you to manage the configurations for the project and the target but it also has its own hiearchy of settings, which are in the following order (One at the top of the list are overwritten by ones at the bottom):

  • Default Settings These are the sensible defaults xcake provides for the configuration.

  • Custom Settings These are the settings set directly on the configuration.

Properties

Name

Sets the name of the configuration

configuration.name = "Release"

Configuration File

Sets the path to a XCConfig file to inherit build settings from.

configuration.configuration_file = "Files/Settings.xcconfig"

Build Settings

A hash of all the build settings for a configuration

configuration.settings["ENABLE_BITCODE"] = false

Build Settings Shortcuts

Xcake also provides some shortcuts for some more common build settings.

Supported Devices

Allows you specify the devices an iOS App can run on, can be :iphone_only, :ipad_only or :universal

configuration.supported_devices = :iphone_only

Product Bundle Identifier

Allows you specify the product bundle identifier.

configuration.product_bundle_identifier = "com.test.app"

Preprocessor Definitions

Allows you to specify preprocessor definitions.

configuration.preprocessor_definitions["NAME"] = "VALUE"