xcode info.plist build variable ${PRODUCT_NAME:rfc1034identifier} seems completely undocumented? xcode info.plist build variable ${PRODUCT_NAME:rfc1034identifier} seems completely undocumented? ios ios

xcode info.plist build variable ${PRODUCT_NAME:rfc1034identifier} seems completely undocumented?

By using strings I also dug out the following things that look like they're related to :rfc1034identifier:

  • :quote - adds backslashes before whitespaces (and more), for use in shell scripts
  • :identifier - replaces whitespace, slashes (and more) with underscores
  • :rfc1034identifier - replaces whitespace, slashes (and more) with dashes
  • :dir - don't know, observed replace with ./ in some cases
  • :abs - don't know

Exact command:

strings /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Versions/A/DevToolsCore|grep '^:'

There are more things that look like interesting modifiers (for example, :char-range=%@), but I couldn't get these to work. There's only one example of :char-range on the net, and it's from a crash log for Xcode.

Someone asked how do we know it's a modifier specification. Well, we know because it works on multiple variables in build settings. Plist preprocessor probably uses the same mechanisms to resolve build variables as does the build system.

Hack Saw, if you get a response via that bug report, don't forget to keep us informed :-)

Looks like you can stack these as well. The useful case floating around out there is


such that a product name of "Your App" becomes com.yourcompany.your-app.

At long last, Apple produced some documentation on this. This is in the "Text Macros" section of the Xcode manual, as of this date.

Text macro format reference

A text macro can contain any valid unicode text. It can also contain other text macros.

Including other text macrosTo include another text macro, add three underscore (_) characters before and after the macro name:


Modifying text macro expansionYou can modify the final expansion of the text macro by adding one or more modifiers. Add a modifier to a text macro by placing a colon (:) at the end of the macro followed by the modifier. Add multiple modifiers by separating each one with a comma (,).


For example, the following macro will remove the path extension from the FILENAME macro:


To turn the modified macro above into a valid C identifier, add the identifier macro:



bundleIdentifier: Replaces any non-bundle identifier characters with a hyphen (-).

deletingLastPathComponent: Removes the last path component from the expansion string.

deletingPathExtension: Removes any path extension from the expansion string.

deletingTrailingDot: Removes any trailing dots (.).

identifier: Replaces any non-C identifier characters with an underscore (_).

lastPathComponent: Returns just the last path component of the expansion string.

pathExtension: Returns the path extension of the expansion string.

rfc1034Identifier: Replaces any non-rfc1034 identifier characters with a hyphen (-).

xml: Replaces special xml characters with the corresponding escape string. For example, less-than (<) is replaced with <


Text macros reference

COPYRIGHTA copyright string that uses the company name of the team for the project. If there is no company name, the string is blank.

The example shows a copyright string when the company is set to “Apple”.

Copyright © 2018 Apple. All rights reserved.

DATEThe current date.

DEFAULTTOOLCHAINSWIFTVERSIONThe version of Swift used for the default toolchain.

FILEBASENAMEThe name of the current file without any extension.

FILEBASENAMEASIDENTIFIERThe name of the current file encoded as a C identifier.

FILEHEADERThe text placed at the top of every new text file.

FILENAMEThe full name of the current file.

FULLUSERNAMEThe full name of the current macOS user.

NSHUMANREADABLECOPYRIGHTPLISTThe entry for the human readable copyright string in the Info.plist file of a macOS app target. The value of the macro must include the XML delimiters for the plist. For example, a valid value is:

'''    <key>NSHumanReadableCopyright</key>    <string>Copyright © 2018 Apple, Inc. All rights reserved.</string>'''

Notice that the value includes a newline.

ORGANIZATIONNAMEThe name for your organization that appears in boilerplate text throughout your project folder. The organization name in your project isn’t the same as the organization name that you enter in App Store Connect.

PACKAGENAMEThe name of the package built by the current scheme.

PACKAGENAMEASIDENTIFIERA C-identifier encoded version of the package name built by the current scheme.

PRODUCTNAMEThe app name of the product built by the current scheme.

PROJECTNAMEThe name of the current project.

RUNNINGMACOSVERSIONThe version of macOS that is running Xcode.

TARGETNAMEThe name of the current target.

TIMEThe current time.

USERNAMEThe login name for the current macOS user.

UUIDReturns a unique ID. The first time this macro is used, it generates the ID before returning it. You can use this macro to create multiple unique IDs by using a modifier. Each modifier returns an ID that is unique for that modifier. For example, the first time the UUID:firstPurpose modifier is used, the macro generates and returns a unique ID for that macro and modifier combination. Subsequent uses of the UUID:firstPurpose modifier return the same ID. Adding the UUID:secondPurpose modifier generates and returns a different ID that will be unique to UUID:secondPurpose, and different from the ID for UUID:firstPurpose.

WORKSPACENAMEThe name of the current workspace. If there is only one project open, then the name of the current project.

YEARThe current year as a four-digit number.