XCode C/C++ 标志 Bash 脚本 [英] XCode C/C++ Flags Bash Script

查看:20
本文介绍了XCode C/C++ 标志 Bash 脚本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试在 XCode 上运行以下命令,将其作为 C/C++ 标志添加到我可以从在我的项目的运行脚本阶段执行的 shell 脚本中获取内部版本号.

Im trying to run the following command on XCode adding it as a C/C++ Flags to I can get the build number coming from a shell script that is executed at the run script phase of my project.

这在另一个类 Unix 系统上与 GCC 一起工作得很好:

This work fine with GCC on another Unix like system:

-D__BUILD_VERSION=$(cat build_number)

-D__BUILD_VERSION=$(cat build_number)

好的 XCode 我正在尝试使用以下内容:

And ok XCode Im trying to use the following:

-D__BUILD_VERSION=$(cat $PROJECT_DIR/build_number)

-D__BUILD_VERSION=$(cat $PROJECT_DIR/build_number)

但它不起作用,我做错了什么?在 XCode 中,如何将 cat build_number 的结果分配给 __BUILD_VERSION 定义的变量?

But it doesn't work, what Im I doing wrong? In XCode, how can I assign the result of cat build_number to the __BUILD_VERSION defined variable?

推荐答案

如果您尝试在 Xcode 编译构建阶段设置该值,您可能会遇到麻烦,因为我不知道任何解释性操作需要将您尝试设置的设置放在您尝试设置的方式中.

if you are trying to set that value in the Xcode compile build-phase, you may run into trouble, as i don't know that any interpretive operation takes place with the settings you are trying to set up the way you are trying to set them up.

为了自动设置版本号,我有一个更复杂的半自动版本和自动编号方案,所以我不必记得更改,或者我可以给出我想要的版本号但始终增加版本号,在这两种情况下,它都会将版本号放在 iOS 系统设置中显示的应用设置中的关于"框中.

for auto-setting the version number, i have a much more complex semi-auto-version and auto-numbering scheme so i don't have to remember to change either, or so i can give a version-number i want but always increment the build number, and in both cases, it will put the build number in the About box in the app-settings that are displayed in the iOS system settings.

您可能不需要太多,但有一些获取和编写信息的技巧可能对您有用,并可能为您的问题提供解决方案.

you may not need much of any of it, but there are a couple of tricks for getting and writing information that you may find useful and may lead to a solution for your problem.

以下脚本的灵感来自于我目前无法找到的关于如何执行此操作的堆栈溢出答案.我做了更多的工作,因为 (a) 我希望版本号显示在系统设置中显示的设置中;(b) Xcode 缓存了 Info.plist 文件的内容,所以这样做并不像我预期的那么简单.

the following scripts were inspired by a stack-overflow answer for how to do this that i can't find at the moment. i put in a bit more work, because (a) i want the version number to show up in the settings displayed in system settings; and (b) Xcode caches the contents of the Info.plist file, so doing this is not nearly as simple as i would have expected.

在编译之前的构建阶段,我运行以下命令(仅在安装时运行脚本 未选中)

in a build phase that comes before compile, i run the following (with Run script only when installing unchecked)

sh xolawareStashProductSettings.sh

xolawareStashProductSettings.sh 的内容检查 info.plist 文件的 git status,如果不干净,暂时把它藏起来,以备日后恢复.

the contents of xolawareStashProductSettings.sh check the git status of the info.plist file, and if not clean, stash it aside temporarily for later restoration.

#!/bin/sh

#
# should be run prior to the Copy Bundle Resources step
# and prior to any version information modifier scripts

INFOPLIST_GIT_PATH=${PROJECT}/`basename ${INFOPLIST_FILE}`
echo "-- Temp Hold ${INFOPLIST_GIT_PATH} Script --"

set -e

# a fallback in case the user has made changes to the file
if [ `git status --porcelain ${INFOPLIST_GIT_PATH} ]|wc -l` -gt 0 ]; then
    echo cp -p ${INFOPLIST_GIT_PATH} ${TARGET_TEMP_DIR}
    cp -p ${INFOPLIST_GIT_PATH} ${TARGET_TEMP_DIR}
fi

脚本 #2(仅在安装时运行脚本未选中):

sh xolawareStashSettingsBundleRootPlist.sh

xolawareStashSettingsBundleRootPlist.sh 的内容与脚本 1 的内容类似.

the contents of xolawareStashSettingsBundleRootPlist.sh are similar to the contents of script 1.

#!/bin/sh
#
# should be run prior to the Copy Bundle Resources step
# and prior to any version information modifier scripts

echo '-- Temp Hold Settings.bundle/Root.plist Script --'

ROOT_PLIST=${PROJECT}/Resources/Settings.bundle/Root.plist

set -e

# a fallback in case the user has made changes to the file
if [ `git status --porcelain ${ROOT_PLIST} ]|wc -l` -gt 0 ]; then
    echo cp -p ${ROOT_PLIST} ${TARGET_TEMP_DIR}
    cp -p ${ROOT_PLIST} ${TARGET_TEMP_DIR}
fi

脚本 #3(仅在安装时运行脚本检查)

sh xolawareIncrementProductSettingsBuildNumber.sh

xolawareIncrementProductSettingsBuildNumber 的内容使用plistbuddy 看看是什么,再撞一个:

the contents of xolawareIncrementProductSettingsBuildNumber use plistbuddy to see what it is and bump it by one:

#!/bin/sh
#
# this should be prior to xolawareAboutInfoVersionInfoInSettings.sh

echo "-- Auto-Increment ${INFOPLIST_FILE} Build Version Install Script --"

PLISTBUDDYCMD="/usr/libexec/PlistBuddy -c"
CONFIGURATION_BUILD_SETTINGS_PATH=${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}

CFBV=$(${PLISTBUDDYCMD} "Print :CFBundleVersion" ${PRODUCT_SETTINGS_PATH})
if [[ "${CFBV}" == "" ]]; then
    echo "No build number in ${PRODUCT_SETTINGS_PATH}"
    exit 2
fi

CFBV=$(expr $CFBV + 1)

set -e
echo ${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${PRODUCT_SETTINGS_PATH}"
${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${PRODUCT_SETTINGS_PATH}"
echo ${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${CONFIGURATION_BUILD_SETTINGS_PATH}"
${PLISTBUDDYCMD} "Set :CFBundleVersion $CFBV" "${CONFIGURATION_BUILD_SETTINGS_PATH}"

脚本 #4(仅在安装时运行脚本未选中)

sh xolawareProductSettingsShortVersion-from-git.sh
sh xolawareAboutInfoVersionInfoInSettings.sh

xolawareProductSettingsShortVersion-from-git 的内容有点依赖于我在 git 中适当标记我的分支,但如果我忘记了,它将使用自上次提交以来的提交次数来为我自动版本我的构建.

the contents of xolawareProductSettingsShortVersion-from-git rely a little on me tagging my branch in git appropriately, but if i forget, it will use the number of commits since the last commit to auto-version my build for me.

#!/bin/sh
#
# this should be run after xolawareStashSettingsBundleRootPlist.sh
# and prior to xolawareAboutInfoVersionInfoInSettings.sh

echo '-- Get Product Settings Short Version String from git describe --'

PLISTBUDDYCMD="/usr/libexec/PlistBuddy -c"
CONFIGURATION_BUILD_SETTINGS_PATH=${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}

CFBVS=`git describe|awk '{split($0,a,"-"); print a[1]}'`
CFBVSI=`git describe|awk '{split($0,a,"-"); print a[2]}'`
if [[ "$CFBVSI" != "" ]]; then
    CFBVS=${CFBVS}.${CFBVSI}
fi

set -e
echo ${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${PRODUCT_SETTINGS_PATH}"
${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${PRODUCT_SETTINGS_PATH}"
echo ${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${CONFIGURATION_BUILD_SETTINGS_PATH}"
${PLISTBUDDYCMD} "Set :CFBundleShortVersionString $CFBVS" "${CONFIGURATION_BUILD_SETTINGS_PATH}"

xolawareAboutInfoVersionInfoInSettings.sh 的内容像我想要的那样将内容放在我的 Root.plist 中的 About 框中.它依赖于 About 框是 settings.bundle 的 Root.plist 中的第一件事:

the contents of xolawareAboutInfoVersionInfoInSettings.sh place the contents in the About box in my Root.plist like i want. it relies on the About box being the first thing in your Root.plist of your settings.bundle:

#!/bin/sh
#
# this should be invoked after xolawareStashInfoAndRootPlist.sh,
# xolawareIncrementProductSettingsBuildNumber.sh and 
# xolawareProductSettingsShortVersion-from-git.sh, and before
# the regular Copy Bundle Resources Build Phase

echo '-- Auto-Insert Version Info In System Settings Script --'

PLISTBUDDYCMD="/usr/libexec/PlistBuddy -c"
ROOT_PLIST=${PROJECT_DIR}/${PROJECT}/Resources/Settings.bundle/Root.plist

CFBSVS=`exec -c ${PLISTBUDDYCMD} "Print :CFBundleShortVersionString" ${PRODUCT_SETTINGS_PATH}`
CFBV=`exec -c ${PLISTBUDDYCMD} "Print :CFBundleVersion" ${PRODUCT_SETTINGS_PATH}`

set -e
echo ${PLISTBUDDYCMD} "Set :PreferenceSpecifiers:1:DefaultValue '${CFBSVS} (b${CFBV})'" ${ROOT_PLIST}
${PLISTBUDDYCMD} "Set :PreferenceSpecifiers:1:DefaultValue '${CFBSVS} (b${CFBV})'" ${ROOT_PLIST}

在 Compile、Link & 之后还有几个清理脚本要运行.复制捆绑资源阶段

there are also a couple of cleanup scripts to be run after the Compile, Link & Copy bundle resources phases

sh xolawareStashRestoreSettingsBundleRootPlist.sh

这可能不是必需的,但我调整了 Root.plist 中的其他项目以用于发布版本,因此这会为调试版本恢复这些设置.

this may not be necessary, but i adjust other items in the Root.plist for release builds, so this restores those settings for debug builds.

#!/bin/sh
#
# should be run as the second to last script in Build Phases, after the Copy Bundle Resources Phase

echo "-- Manual Restore $INFOPLIST_FILE Script --"

ROOT_PLIST=${PROJECT}/Resources/Settings.bundle/Root.plist

set -e

# first, see if it was stashed earlier due to uncommitted changes
if [ -e ${TARGET_TEMP_DIR}/Root.plist ]; then
    echo mv ${TARGET_TEMP_DIR}/Root.plist ${ROOT_PLIST}
    mv ${TARGET_TEMP_DIR}/Root.plist ${ROOT_PLIST}

# the better option when available: restore to the pristine state
elif [ `git status --porcelain ${ROOT_PLIST}|wc -l` -gt 0 ]; then
    echo git checkout -- ${ROOT_PLIST}
    git checkout -- ${ROOT_PLIST}
fi

最后,如果我自己还没有标记该项目,则自动标记 git repo 的步骤:

and finally, the step to auto-tag the git repo if i haven't already tagged the item just now myself:

sh xolawareProductSettings-git-commit-and-tag.sh


#!/bin/sh
#
# this should be run after xolawareAboutInfoVersionInfoInSettings.sh
# and xolawareProductSettingsShortVersion-from-git.sh

echo "-- ${INFOPLIST_FILE} git commit & tag Install Script --"

SCRIPT_VERSION=`/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' ${INFOPLIST_FILE}`
SCRIPT_BUILD_NUMBER=`/usr/libexec/Plistbuddy -c 'Print :CFBundleVersion' ${INFOPLIST_FILE}`
if [ `git status --porcelain ${SCRIPT_INFO_PLIST}|wc -l` -gt 0 ]; then
    echo git commit -m '"'version ${SCRIPT_VERSION} build ${SCRIPT_BUILD_NUMBER}'"' ${INFOPLIST_FILE}
    git commit -m "version ${SCRIPT_VERSION} build ${SCRIPT_BUILD_NUMBER}" ${INFOPLIST_FILE}
fi
echo git tag -f ${SCRIPT_VERSION}
git tag -f -F /dev/null ${SCRIPT_VERSION}

这篇关于XCode C/C++ 标志 Bash 脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆