What the different between SRCROOT and PROJECT_DIR?

SRCROOT & PROJECT_DIR are same macros have same effect.PROJECT_DIR makes more sense when talking about frameworks.


Exchangeable in practice, while the documentation makes these subtle theoretical distinctions:

  1. SRCROOT

    Directory path. Identifies the directory containing the target’s source files: contains the path to the project file that defines the target.

    SOURCE_ROOT is an undocumented alias to SRCROOT

  2. PROJECT_DIR
    Identifies the directory containing the project (.xcodeproj)
    $(PROJECT_DIR)/build is used as the create the default value for:

    • Intermediate Build Files Path OBJROOT
    • Build Products Path SYMROOT

    Typically these paths are not set per target, but are set per-project or per-user.

  3. PROJECT_FILE_PATH
    Identifies the project itself.
    Equivalent to $(PROJECT_DIR)/$(PROJECT_NAME).xcodeproj

Conceptually different (#1 is about the project which defines the target while #2 is about the project independently of any target), they are always pointing to the same location since you are, in essence, always building a target.

References

Xcode 8.3 Build Settings reference
Xcode Build System Guide (Retired 2016-09-29)