剖析iPhone项目中的Makefile文件

来源:互联网 发布:淘宝直播id号怎么找人 编辑:程序博客网 时间:2024/06/05 19:43

 INFOPLIST_FILE=Info.plist

Plist是property list的缩写,plist文件中包含一些命名值和使用Core Foundation类型创建的值的列表。这些类型包括CFString、CFNumber、CFBoolean、CFData、CFArray及CFDictionary等。

 

SOURCES=/

    main.m /

    NetServicesApp.m

定义变量SOURCES,用来指定源文件目标。

 

CC=/usr/local/arm-apple-darwin/bin/gcc

定义变量CC,指定编译器为gcc。

 

CFLAGS=-g -O2 -Wall

CFLAGS为传递给编译器的编译参数,如果没有定义则参数为空。

 

LD=$(CC)

LD变量被赋值为gcc的目录。

 

LDFLAGS=-Wl,-syslibroot,/usr/local/arm-apple-darwin/heavenly -lobjc -ObjC -framework CoreFoundation -framework Foundation -framework CoreGraphics -framework GraphicsServices -framework UIKit -framework LayerKit -framework CFNetwork

LDFLAGS用来指定动态Library调用的参数集合。

 

WRAPPER_NAME=$(PRODUCT_NAME).app

定义变量WRAPPER_NAME为项目名字.app。

 

EXECUTABLE_NAME=$(PRODUCT_NAME)

定义变量EXECUTABLE_NAME为项目名字。

 

SOURCES_ABS=$(addprefix $(SRCROOT)/,$(SOURCES))

在SOURCES里的所有文件前面添加前缀SRCROOT并赋值给SOURCES_ABS。

 

INFOPLIST_ABS=$(addprefix $(SRCROOT)/,$(INFOPLIST_FILE))

在INFOPLIST_FILE里的所有文件前面添加前缀SRCROOT并赋值给INFOPLIST_ABS。

 

OBJECTS=/

    $(patsubst %.c,%.o,$(filter %.c,$(SOURCES))) /

    $(patsubst %.cc,%.o,$(filter %.cc,$(SOURCES))) /

    $(patsubst %.cpp,%.o,$(filter %.cpp,$(SOURCES))) /

    $(patsubst %.m,%.o,$(filter %.m,$(SOURCES))) /

    $(patsubst %.mm,%.o,$(filter %.mm,$(SOURCES)))

首先$(filter %.c,$(SOURCES))把SOURCES里所有后缀为*.c的文件过滤出来,然后把所有的后缀名*.c改为*.o,下面分别把*.cc、*.cpp、*.m、*mm等文件的后缀名改为*.o。

 

OBJECTS_ABS=$(addprefix $(CONFIGURATION_TEMP_DIR)/,$(OBJECTS))

在所有的目标文件前面添加前缀$(CONFIGURATION_TEMP_DIR)。

 

APP_ABS=$(BUILT_PRODUCTS_DIR)/$(WRAPPER_NAME)

从上面我们知道变量WRAPPER_NAME为$(PRODUCT_NAME).app,那么APP_ABS就为最终release的产品名字的绝对路径了。

 

PRODUCT_ABS=$(APP_ABS)/$(EXECUTABLE_NAME)

定义PRODUCT_ABS变量为release产品的绝对路径或直接为产品名字。

 

all: $(PRODUCT_ABS)

定位伪目标all为最终产品的绝对路径。

 

$(PRODUCT_ABS): $(APP_ABS) $(OBJECTS_ABS)

    $(LD) $(LDFLAGS) -o $(PRODUCT_ABS) $(OBJECTS_ABS)

调用gcc编译器,并设置动态调用Library为LDFLAGS里的参数集合,编译最终的产品PRODUCT_ABS。下面都是这些编译过程的依赖关系了。

 

$(APP_ABS): $(INFOPLIST_ABS)

    mkdir -p $(APP_ABS)

    cp $(INFOPLIST_ABS) $(APP_ABS)/

 

$(CONFIGURATION_TEMP_DIR)/%.o: $(SRCROOT)/%.m

    mkdir -p $(dir $@)

    $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@

 

clean:

    echo rm -f $(OBJECTS_ABS)

    echo rm -rf $(APP_ABS)

原创粉丝点击