使用Makefile自动编译iPhone程序

  • 博主:易飞扬
  • 原文链接 : http://www.yifeiyang.net/iphone-development-advanced-4-use-the-makefile-to-compile-iphone-program-automatically/
  • 转载请保留上面文字。

    iPhone开发进阶(4) --- 使用Makefile自动编译iPhone程序

    Xcode 也支持以命令行形式来编译 iPhone 程序。另外还可以手动的编写 Makefile 文件,实现编译→安装的自动化批处理过程。如果你习惯了命令行的操作方式(linux,unix),那么这样的操作还是很方便的。

    首先看看 Xcode 的命令行格式:

    1
    2
    xcodebuild -target Project_Name
    xcodebuild install -target Project_Name

    下面我们来实现程序的编译,并通过 ldid 转换编码格式,最后用 ssh 将编译好的程序安装到 iPhone 上的 /Applications/目录下。

    首先安装 ssh 的公开密匙到 iPhone 上

    1). 在Mac的终端上产生密匙

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/xxxx/.ssh/id_rsa):
    Created directory '/home/xxxx/.ssh'.
    Enter passphrase (empty for no passphrase): xxx
    Enter same passphrase again: xxx
    Your identification has been saved in /home/xxxx/.ssh/id_rsa.
    Your public key has been saved in /home/xxxx/.ssh/id_rsa.pub.
    The key fingerprint is:
    e4:e8:b7:05:06:b3:f0:ff:af:13:fc:50:6a:5b:d1:b5 xxxx@localhost.localdomain

    过程中会提问你通行证(passphrase),输入你常用的秘密。

    2). 在 iPhone 上创建.ssh目录(iPhone的IP地址是10.0.2.2)

    1
    ssh root@10.0.2.2 'mkdir -p .ssh'

    如果问道你iPhone root password,输入 alpine。

    3). 拷贝刚才生成的公开密匙到 iPhone

    1
    cat ~/.ssh/id_rsa.pub | ssh root@10.0.2.2 'cat >> .ssh/authorized_keys'

    如果问道你iPhone root password,输入 alpine。

    4). 在 iPhone 上编辑 /etc/ssh/sshd_config 文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #
    #StrictModes yes
    #PubkeyAuthentication yes
    #AuthorizedKeysFile .ssh/authorized_keys
    
    #替换为
    
    StrictModes no
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys

    5). 重新启动iPhone

    接下来,编译生成ldid工具
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    wget http://svn.telesphoreo.org/trunk/data/ldid/ldid-1.0.610.tgz
    
    tar -zxf ldid-1.0.610.tgz
    
    # 如果是 PowerPC 下载下面的补丁
    # wget -qO- http://fink.cvs.sourceforge.net/viewvc/*checkout*/fink/dists/10.4/unstable/crypto/finkinfo/ldid.patch?revision=1.1 | patch -p0
    
    cd ldid-1.0.610
    
    g++ -I . -o util/ldid{,.cpp} -x c util/{lookup2,sha1}.c
    
    sudo cp -a util/ldid /usr/bin
    最后,让我们看看Makefile中都有什么

    项目中的文件如下所示:

    Classes : source code (.m .c .cpp etc)
    
    Resources : png file and other support files
    
    Project folder : *.xib Info.plist


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    Makefile: Select all
    
    PREFIX  = arm-apple-darwin9-
    
    ###/
    ###                      Executable files
    ###/
    
    CC      = $(PREFIX)gcc
    CXX     = $(PREFIX)g++
    LD      = $(CC)
    AR      = $(PREFIX)ar
    STRIP   = $(PREFIX)strip
    OBJCOPY = $(PREFIX)objcopy
    
    ####################################################################################
    
    ## debug/release
    DEBUG   ?= n
    
    DEVEL   ?= n
    
    ## SDK版本
    SDKVER    = 3.1.2
    
    ## iPhone的IP地址
    IPHONE_IP = 10.0.2.2
    
    ## iPhone SDK路径
    IPHONESDK = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$(SDKVER).sdk
    
    ## include 路径
    INCPATH += -I"$(IPHONESDK)/usr/include"
    INCPATH += -I"/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/gcc/arm-apple-darwin9/4.2/include/"
    INCPATH += -I"/Developer/Platforms/iPhoneOS.platform/Developer/usr/include/"
    INCPATH += -I"/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator$(SDKVER).sdk/usr/include"
    
    ## 标准库或者框架的设置
    LDFLAGS=    -lobjc \
                -bind_at_load \
                -multiply_defined suppress \
                -w
    
    LDFLAGS += -framework CoreFoundation
    LDFLAGS += -framework Foundation
    LDFLAGS += -framework UIKit
    LDFLAGS += -framework CoreGraphics
    #LDFLAGS += -framework AddressBookUI
    #LDFLAGS += -framework AddressBook
    #LDFLAGS += -framework QuartzCore
    #LDFLAGS += -framework GraphicsServices
    #LDFLAGS += -framework CoreSurface
    #LDFLAGS += -framework CoreAudio
    #LDFLAGS += -framework Celestial
    #LDFLAGS += -framework AudioToolbox
    #LDFLAGS += -framework WebCore
    #LDFLAGS += -framework WebKit
    #LDFLAGS += -framework SystemConfiguration
    #LDFLAGS += -framework CFNetwork
    #LDFLAGS += -framework MediaPlayer
    #LDFLAGS += -framework OpenGLES
    #LDFLAGS += -framework OpenAL
    
    LDFLAGS += -F"$(IPHONESDK)/System/Library/Frameworks"
    LDFLAGS += -F"$(IPHONESDK)/System/Library/PrivateFrameworks"
    
    ## 编译开关
    CFLAGS  += $(INCPATH) \
            -std=c99 \
            -W -Wall \
            -funroll-loops \
            -Diphoneos_version_min=2.0 \
            -Wno-unused-parameter \
            -Wno-sign-compare
    
    ifeq ($(DEBUG), y)
    CFLAGS  += -O0 -g -DDEBUG_MUTEX
    else
    CFLAGS  += -O3 -DNDEBUG
    ifeq ($(DEVEL), y)
    CFLAGS  += -g
    endif
    endif
    
    CFLAGS += -F"$(IPHONESDK)/System/Library/Frameworks"
    CFLAGS += -F"$(IPHONESDK)/System/Library/PrivateFrameworks"
    
    ####################################################################################
    
    BUILDDIR =./build/3.0
    SRCDIR   =./Classes
    RESDIR   =./Resources
    
    ###/
    ###                        Source files
    ###/
    
    OBJS     = $(patsubst %.m,%.o,$(wildcard $(SRCDIR)/*.m))
    OBJS    += $(patsubst %.m,%.o,$(wildcard ./*.m))
    OBJS    += $(patsubst %.c,%.o,$(wildcard $(SRCDIR)/*.c))
    OBJS    += $(patsubst %.cpp,%.o,$(wildcard $(SRCDIR)/*.cpp))
    
    NIBS     = $(patsubst %.xib,%.nib,$(wildcard *.xib))
    
    RESOURCES= $(wildcard $(RESDIR)/*)
    
    APPFOLDER= $(TARGET).app
    
    .PHONY: all
    all: $(TARGET) bundle
    
    $(TARGET): $(OBJS)
        $(LD) $(LDFLAGS) -o $@ $^
    
    %.o:    %.m
        $(CC) -c $(CFLAGS) $< -o $@
    
    %.o:    %.c
        $(CC) -c $(CFLAGS) $< -o $@
    
    %.o:    %.cpp
        $(CXX) -x objective-c++ $(CFLAGS) $< -o $@
    
    %.nib:  %.xib
        ibtool $< --compile $@
    
    bundle: $(TARGET)
        @rm -rf $(BUILDDIR)
        @mkdir -p $(BUILDDIR)/$(APPFOLDER)
        @cp -r $(RESDIR)/* $(BUILDDIR)/$(APPFOLDER)
        @cp Info.plist $(BUILDDIR)/$(APPFOLDER)/Info.plist
        @echo "APPL" > $(BUILDDIR)/$(APPFOLDER)/PkgInfo
        mv $(NIBS) $(BUILDDIR)/$(APPFOLDER)
    #    export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
        @ldid -S $(TARGET)
        @mv $(TARGET) $(BUILDDIR)/$(APPFOLDER)/$(TARGET)_
    
    install: bundle
        @ssh root@$(IP) "cd /Applications/$(APPFOLDER) && rm -R * || echo 'not found' "
        @scp -rp $(BUILDDIR)/$(APPFOLDER) root@$(IP):/Applications
        @ssh root@$(IP) "cd /Applications/$(APPFOLDER) ; ldid -S $(TARGET)_; killall SpringBoard"
        @echo "Application $(APPFOLDER) installed"
    
    uninstall:
        ssh root@$(IPHONE_IP) 'rm -fr /Applications/$(APPFOLDER); respring'
        @echo "Application $(APPFOLDER) uninstalled, please respring iPhone"
    
    install_respring:
        scp respring_arm root@$(IPHONE_IP):/usr/bin/respring
    
    .PHONY: clean
    clean:
        @rm -f $(OBJS) $(TARGET)
        @rm -rf $(BUILDDIR)

    然后执行下面的make命令,我们就可以直接在 iPhone 上测试我们的程序了。

    1
    2
    3
    make install_respring
    make
    make install
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值