shell 脚本编译静态库

来源:互联网 发布:网站源码cmzy168 编辑:程序博客网 时间:2024/05/16 10:48

lib-build

本文引用了webfrogs 的脚本,进行更改后使用 原脚本地址

#!/bin/bash#--------------------------------------------# 功能:编译static lib xcode项目# 使用说明:#       编译project#           lib-build <project directory> [-c <project configuration>] [-o <lib output directory>] [-t <target name>] [-n]#       编译workspace#           lib-build  <workspace directory> -w -s <schemeName> [-c <project configuration>] [-n]## 参数说明:  -c NAME                工程的configuration,默认为Release。#           -o PATH             生成的lib文件输出的文件夹(必须为已存在的文件路径)默认为工程根路径下的”build/lib-build“文件夹中#           -t NAME             需要编译的target的名称#           -w                  编译workspace #           -s NAME             对应workspace下需要编译的scheme#           -n                  编译前是否先clean工程#           -m                  是否编译模拟器# 作者:zeb# E-mail:zebbey@gmail.com# 创建日期:2014/10/14# ---------------------# --修改人: MinLison----# --修改功能: 增加模拟器编译选项----# --修改日期: 2016/6/14----if [ $# -lt 1 ];then    echo "Error! Should enter the root directory of xcode project after the lib-build command."    exit 2fiif [ ! -d $1 ];then    echo "Error! The first param must be a directory."    exit 2fi#模拟器版本shell_path=$(pwd)#工程绝对路径cd $1project_path=$(pwd)#编译的configuration,默认为Releasebuild_config=Releasebuild_simulator=nparam_pattern=":nmc:o:t:ws:"OPTIND=2while getopts $param_pattern optname  do    case "$optname" in      "n")                should_clean=y              ;;      "m")                build_simulator=y        simulator_sdk=`$shell_path/python_sdks.py`        echo $simulator_sdk                ;;      "c")                tmp_optind=$OPTIND        tmp_optname=$optname        tmp_optarg=$OPTARG        OPTIND=$OPTIND-1        if getopts $param_pattern optname ;then            echo  "Error argument value for option $tmp_optname"            exit 2        fi        OPTIND=$tmp_optind        build_config=$tmp_optarg        ;;      "o")        tmp_optind=$OPTIND        tmp_optname=$optname        tmp_optarg=$OPTARG        OPTIND=$OPTIND-1        if getopts $param_pattern optname ;then            echo  "Error argument value for option $tmp_optname"            exit 2        fi        OPTIND=$tmp_optind        cd $tmp_optarg        output_path=$(pwd)        cd ${project_path}        if [ ! -d $output_path ];then            echo "Error!The value of option o must be an exist directory."            exit 2        fi        ;;      "w")        workspace_name='*.xcworkspace'        ls $project_path/$workspace_name &>/dev/null        rtnValue=$?        if [ $rtnValue = 0 ];then            build_workspace=$(echo $(basename $project_path/$workspace_name))        else            echo  "Error!Current path is not a xcode workspace.Please check, or do not use -w option."            exit 2        fi        ;;      "s")        tmp_optind=$OPTIND        tmp_optname=$optname        tmp_optarg=$OPTARG        OPTIND=$OPTIND-1        if getopts $param_pattern optname ;then            echo  "Error argument value for option $tmp_optname"            exit 2        fi        OPTIND=$tmp_optind        build_scheme=$tmp_optarg        ;;      "t")        tmp_optind=$OPTIND        tmp_optname=$optname        tmp_optarg=$OPTARG        OPTIND=$OPTIND-1        if getopts $param_pattern optname ;then            echo  "Error argument value for option $tmp_optname"            exit 2        fi        OPTIND=$tmp_optind        build_target=$tmp_optarg        ;;      "?")        echo "Error! Unknown option $OPTARG"        exit 2        ;;      ":")        echo "Error! No argument value for option $OPTARG"        exit 2        ;;      *)      # Should not occur        echo "Error! Unknown error while processing options"        exit 2        ;;    esac  done#build文件夹路径build_path=${project_path}/build#生成的app文件目录appdirname=Release-iphoneossimulatordirname=Release-iphonesimulatorif [ $build_config = Debug ];then    appdirname=Debug-iphoneosfiif [ $build_config = Distribute ];then    appdirname=Distribute-iphoneosfi#编译后文件路径(仅当编译workspace时才会用到)compiled_path=${build_path}/${appdirname}#是否cleanif [ "$should_clean" = "y" ];then    xcodebuild clean -configuration ${build_config}fi#组合编译命令build_cmd='xcodebuild'simulator_cmd='xcodebuild'if [ "$build_workspace" != "" ];then    #编译workspace    if [ "$build_scheme" = "" ];then        echo "Error! Must provide a scheme by -s option together when using -w option to compile a workspace."        exit 2    fi    #是否编译模拟器    if [ "$build_simulator" = "y" ];then        simulator_cmd=${simulator_cmd}' -sdk '${simulator_sdk}    fi    build_cmd=${build_cmd}' -workspace '${build_workspace}' -scheme '${build_scheme}' -configuration '${build_config}' CONFIGURATION_BUILD_DIR='${compiled_path}' ONLY_ACTIVE_ARCH=NO'    simulator_cmd=${simulator_cmd}' -workspace '${build_workspace}' -scheme '${build_scheme}' -configuration '${build_config}' CONFIGURATION_BUILD_DIR='${compiled_path}' ONLY_ACTIVE_ARCH=NO'else    #编译project    build_cmd=${build_cmd}' -configuration '${build_config}    if [ "$build_target" != "" ];then        build_cmd=${build_cmd}' -target '${build_target}    fi    #是否编译模拟器    if [ "$build_simulator" = "y" ];then        simulator_cmd=${simulator_cmd}' -sdk '${simulator_sdk}    fifi#编译工程cd $project_path$build_cmd || exit#是否编译模拟器if [ "$build_simulator" = "y" ];then    $simulator_cmd || exitfi#进入build路径cd $build_pathlibname=$(basename ./${appdirname}/*${build_target}.a)simulatorlibname=$(basename ./${simulatordirname}/*${build_target}.a)head_file_dir=$(basename ./${appdirname}/include/*${build_target})iphoneos_lib_dir=$output_path/lib_iphoneiphoneSimulator_lib_dir=$output_path/lib_iphoneSimulatormkdir $iphoneos_lib_dir $iphoneSimulator_lib_direcho ${build_path}if [ "$output_path" != "" ];then    # 拷贝真机静态库    echo ${build_path}/${appdirname}/${libname}    cp ${build_path}/${appdirname}/${libname} $iphoneos_lib_dir    # 拷贝模拟器静态库    echo ${build_path}/${simulatordirname}/${libname}    cp ${build_path}/${simulatordirname}/${simulatorlibname} $iphoneSimulator_lib_dir    # 拷贝头文件    echo ${build_path}/${appdirname}/include/${head_file_dir}/* ${output_path}    cp ${build_path}/${appdirname}/include/${head_file_dir}/* ${output_path}    echo "Copy lib file successfully to the path $output_path"fiif [ "$build_simulator" = "y" ];then    #合并两个lib    lipocmd='lipo -create '${lipocmd}' '${iphoneos_lib_dir}/${libname}' '${iphoneSimulator_lib_dir}/${simulatorlibname}' -output '${output_path}/${libname}    $lipocmdelse    cp ${iphoneos_lib_dir}/${libname} ${output_path}firm -df $iphoneos_lib_dir/* $iphoneSimulator_lib_dir/*rmdir $iphoneos_lib_dir $iphoneSimulator_lib_dir

使用python解析最新的模拟器sdk

python_sdks.py

#!/usr/bin/env pythonimport reimport subprocesssdk_header_pattern = re.compile("^.*SDKs:$")sdk_switch_pattern = re.compile("^.*(-sdk)\s[a-z]+\d+\.\d+$")def run_command(cmd):    return subprocess.Popen(cmd,                            stdout=subprocess.PIPE,                            stderr=subprocess.PIPE,                            stdin=subprocess.PIPE).communicate()input = run_command(['xcodebuild', '-showsdks'])[0] # take first element of returned tuplesdks = {}in_sdk = Falseplatform = ''for e in input.split('\n'):    if sdk_header_pattern.match(e) and not in_sdk:        in_sdk = True        platform = e[0:e.rfind(' ')]        sdks[platform] = []    if in_sdk and sdk_switch_pattern.match(e):        sdk = e.split(' ')[-1]        sdks[platform].append(sdk)    if in_sdk and e == '':        in_sdk = False        del platformfor k,v in sdks.iteritems():    if k=='iOS Simulator':        print v[0]#for k,v in sdks.iteritems():#    print 'Platform: ', k#        for e in v:#            print '\t', e#            print
1 0