shell 脚本编译静态库

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 2
fi

if [ ! -d $1 ];then
    echo "Error! The first param must be a directory."
    exit 2
fi
#模拟器版本
shell_path=$(pwd)

#工程绝对路径
cd $1
project_path=$(pwd)

#编译的configuration,默认为Release
build_config=Release
build_simulator=n
param_pattern=":nmc:o:t:ws:"
OPTIND=2
while 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-iphoneos
simulatordirname=Release-iphonesimulator
if [ $build_config = Debug ];then
    appdirname=Debug-iphoneos
fi
if [ $build_config = Distribute ];then
    appdirname=Distribute-iphoneos
fi
#编译后文件路径(仅当编译workspace时才会用到)
compiled_path=${build_path}/${appdirname}

#是否clean
if [ "$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}
    fi

fi


#编译工程
cd $project_path
$build_cmd || exit

#是否编译模拟器
if [ "$build_simulator" = "y" ];then
    $simulator_cmd || exit
fi


#进入build路径
cd $build_path

libname=$(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_iphone
iphoneSimulator_lib_dir=$output_path/lib_iphoneSimulator

mkdir $iphoneos_lib_dir $iphoneSimulator_lib_dir

echo ${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"
fi

if [ "$build_simulator" = "y" ];then
    #合并两个lib
    lipocmd='lipo -create '${lipocmd}' '${iphoneos_lib_dir}/${libname}' '${iphoneSimulator_lib_dir}/${simulatorlibname}' -output '${output_path}/${libname}
    $lipocmd
else
    cp ${iphoneos_lib_dir}/${libname} ${output_path}
fi

rm -df $iphoneos_lib_dir/* $iphoneSimulator_lib_dir/*
rmdir $iphoneos_lib_dir $iphoneSimulator_lib_dir

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

python_sdks.py

#!/usr/bin/env python

import re
import subprocess

sdk_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 tuple
sdks = {}
in_sdk = False
platform = ''

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 platform

for 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
iOS 静态库自动打包,使用 shellcmd 脚本如何写 # 获取脚本所在目录 filepath=$(cd "$(dirname "$0")"; pwd)"/" cd $filepath cd .. # 工程target,主要配置这个target即可 targetname="SafeToolSDK" # 工程目录(默认工程目录在脚本目录的上一级目录) projectdir=$(pwd)"/" echo $projectdir # 工程名 projectname="SafeToolSDK.xcodeproj" # lib输出目录 buildDir=$filepath echo $buildDir #lib输出名 libname=$targetname iossdknum=$(xcodebuild -showsdks | grep iphoneos | grep -Eo '[0-9.]+' | sed -n '1p') configurationname="Release" mydir=$filepath$libname"/" rm -rf $mydir mkdir $mydir # arm64 archname="arm64" lib64=$libname"64" echo "archname:$archname" xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir clean xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir libpath=$buildDir"/Release-iphoneos/"$libname".framework" lib64path=$mydir$lib64 mv -f $libpath"/"$libname $lib64path # armv7 archname="armv7" libv7=$libname"v7" echo "archname:$archname" xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir clean xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir libpath=$buildDir"/Release-iphoneos/"$libname".framework" libv7path=$mydir$libv7 mv -f $libpath"/"$libname $libv7path # armv7s archname="armv7s" libv7s=$libname"v7s" echo "archname:$archname" xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir clean xcodebuild -project $projectdir$projectname -configuration $configurationname -target $targetname -sdk "iphoneos$iossdknum" -arch $archname BUILD_DIR=$buildDir libpath=$buildDir"/Release-iphoneos/"$libname".framework" lib
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值