Learning and Understanding the Xcode Build System
One thing that is really essential for consistent, reproducible, automatable builds is knowledge of the xcodebuild
command. Sadly I can't find any official docs on it apart from the manpage (type man xcodebuild
). There's a useful guide to automating iphone builds here that includes building with xcodebuild
and versioning with agvtool
. This is just as relevant to general building of Mac apps.
Generally building with xcodebuild is very simple:
cd project_dirxcodebuild -project myproject.xcodeproj -configuration Release ARCHS="x86_64 i386" build
Once you can build from a script like this it's very easy to slot into an automated build system.
Xcode build process
Xcode uses xcodebuild
internally
[ONLY_ACTIVE_ARCH]
[Bitcode]
[SKIP_INSTALL]
[DEFINES_MODULE]
.swift -> Abstract Syntax Tree(AST) -> Swift Intermediate Language(SIL) -> Intermediate Representation(IR) -> .o
Xcode exposes some of these steps:
Preprocessing
:
Replace macros
Splits
.h
and.m
.In Xcode, you can look at the preprocessor output of
.m
file by selectingselect .m file -> Product -> Perform Action -> Preprocess
Compiling
- translates a low-level intermediate code.
Often you can see this file when debug a code that you are not owned. Xcode allows you to review the output.select .m file -> Product -> Perform Action -> Assemble
Assembling
(produce.o
) - translates code into object file (.o
file)[Mach-O] In Xcode, you’ll find these object files inside the<product_name>.build/Objects-normal
folder inside the derived data directory.Static Linking
(produce.app
,.a
,.framework
...) - It is a part of static linker that has to resolve symbols between object files and libraries/frameworks. This process produce a merged executable file which can contain additional resources and dynamic binaryDynamic linking
- linking in a loading or runtime. This process can generate errors during binary execution
Also you can use Xcode Report Navigator
to learn more about build process