gpt4 book ai didi

c++ - 使用#define 和 clang 为 info.plist 创建版本号变化?

转载 作者:行者123 更新时间:2023-11-30 05:30:20 28 4
gpt4 key购买 nike

多年前,当使用 GCC 编译时,#include .h 文件中的以下定义可以被预处理以用于 info.plist:

#define MAJORVERSION 2
#define MINORVERSION 6
#define MAINTVERSION 4

<key>CFBundleShortVersionString</key> <string>MAJORVERSION.MINORVERSION.MAINTVERSION</string>

...这将变成“2.6.4”。之所以有效,是因为 GCC 支持“-traditional”标志。 (参见 Tech Note TN2175 Info.plist files in Xcode Using the C Preprocessor,在“消除宏扩展过程中标记之间的空白”下)

然而,快进到 2016 年,Clang 7.0.2 (Xcode 7.2.1) 显然不支持“-traditional”或“-traditional-cpp”(或正确支持它),产生此字符串:

"2 . 6 . 4"

(参见 Bug 12035 - Preprocessor inserts spaces in macro expansions, comment 4)

因为有这么多不同的变体(CFBundleShortVersionString、CFBundleVersion、CFBundleGetInfoString),最好解决这个 clang 问题,定义一次,然后将各个部分连接/串接在一起。现在普遍接受的这样做的模式是什么? (我目前正在 MacOS 上构建,但同样的模式也适用于 IOS)

最佳答案

这是我用来增加内部版本号的 Python 脚本,只要检测到源代码更改,并更新项目中的一个或多个 Info.plist 文件。

它的创建是为了解决 this question 中提出的问题我刚才问过。

您需要在源代码树中创建如下所示的 buildnum.ver 文件:

version 1.0
build 1

(当达到某些项目里程碑时,您需要手动增加 version,但 buildnum 会自动增加)。

注意 .ver 文件的位置必须在源代码树的根目录中(参见下面的 SourceDir)作为此脚本将在此目录中查找修改过的文件。如果找到任何内容,则内部版本号会递增。修改意味着源文件在 .ver 文件最后更新后发生变化。

然后创建一个新的 Xcode 目标来运行外部构建工具并运行如下内容:

tools/bump_buildnum.py SourceDir/buildnum.ver SourceDir/Info.plist

(让它在${PROJECT_DIR}中运行)

然后使所有实际的 Xcode 目标都依赖于此目标,因此它会在构建任何目标之前运行。

#!/usr/bin/env python
#
# Bump build number in Info.plist files if a source file have changed.
#
# usage: bump_buildnum.py buildnum.ver Info.plist [ ... Info.plist ]
#
# andy@trojanfoe.com, 2014.
#

import sys, os, subprocess, re

def read_verfile(name):
version = None
build = None
verfile = open(name, "r")
for line in verfile:
match = re.match(r"^version\s+(\S+)", line)
if match:
version = match.group(1).rstrip()
match = re.match(r"^build\s+(\S+)", line)
if match:
build = int(match.group(1).rstrip())
verfile.close()
return (version, build)

def write_verfile(name, version, build):
verfile = open(name, "w")
verfile.write("version {0}\n".format(version))
verfile.write("build {0}\n".format(build))
verfile.close()
return True

def set_plist_version(plistname, version, build):
if not os.path.exists(plistname):
print("{0} does not exist".format(plistname))
return False

plistbuddy = '/usr/libexec/Plistbuddy'
if not os.path.exists(plistbuddy):
print("{0} does not exist".format(plistbuddy))
return False

cmdline = [plistbuddy,
"-c", "Set CFBundleShortVersionString {0}".format(version),
"-c", "Set CFBundleVersion {0}".format(build),
plistname]
if subprocess.call(cmdline) != 0:
print("Failed to update {0}".format(plistname))
return False

print("Updated {0} with v{1} ({2})".format(plistname, version, build))
return True

def should_bump(vername, dirname):
verstat = os.stat(vername)
allnames = []
for dirname, dirnames, filenames in os.walk(dirname):
for filename in filenames:
allnames.append(os.path.join(dirname, filename))

for filename in allnames:
filestat = os.stat(filename)
if filestat.st_mtime > verstat.st_mtime:
print("{0} is newer than {1}".format(filename, vername))
return True

return False

def upver(vername):
(version, build) = read_verfile(vername)
if version == None or build == None:
print("Failed to read version/build from {0}".format(vername))
return False

# Bump the version number if any files in the same directory as the version file
# have changed, including sub-directories.
srcdir = os.path.dirname(vername)
bump = should_bump(vername, srcdir)

if bump:
build += 1
print("Incremented to build {0}".format(build))
write_verfile(vername, version, build)
print("Written {0}".format(vername))
else:
print("Staying at build {0}".format(build))

return (version, build)

if __name__ == "__main__":
if os.environ.has_key('ACTION') and os.environ['ACTION'] == 'clean':
print("{0}: Not running while cleaning".format(sys.argv[0]))
sys.exit(0)

if len(sys.argv) < 3:
print("Usage: {0} buildnum.ver Info.plist [... Info.plist]".format(sys.argv[0]))
sys.exit(1)
vername = sys.argv[1]

(version, build) = upver(vername)
if version == None or build == None:
sys.exit(2)

for i in range(2, len(sys.argv)):
plistname = sys.argv[i]
set_plist_version(plistname, version, build)

sys.exit(0)

关于c++ - 使用#define 和 clang 为 info.plist 创建版本号变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36001189/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com