在 Xcode 中使用 bash 的编译标志
Compilation flags using bash in Xcode
我试图在 Xcode 中传递依赖于简单系统 shell 命令的编译器宏定义。
我尝试的第一件事是将它添加到 Build Phases->Compile Sources 中的特定文件中,如下所示:
令我惊讶的是它没有用,所以我尝试了这个:
这正确地打印出了值,但是宏没有正确地传递到源文件。
我认为这个不起作用,因为它创建了一个单独的 shell 实例,因此环境变量不会保留到编译阶段。
我尝试进行 Google 搜索并查看 Whosebug,我发现的唯一有希望的是这个,它似乎没有有效的解决方案:XCode C/C++ Flags Bash Script
我写的代码是这样的:
#define STRINGIFY(X) #X
#define TOSTRING(X) STRINGIFY(X)
#define AT __FILE__ ":" TOSTRING(__LINE__)
NSString* getBuildHash()
{
return [NSString stringWithCString:TOSTRING(GIT_COMMIT_HASH) encoding:NSASCIIStringEncoding];
}
任何帮助将不胜感激:) 谢谢!
这里有一个可能有用的想法:
在 shell 脚本(构建阶段的 "run script")中,不要设置环境变量,而是将您的值写入项目中已包含的文件。为了方便起见,您可以使用构建阶段来启动另一个 shell 脚本来完成这项工作。
例如,您可以有一个包含定义(或静态变量)的头文件:#define kObjCFlags @"MY_FLAGS"
。您的脚本将在每次运行时注入并替换该值(使用正则表达式仅替换字符串的内容)。
由于它是项目的一部分,您可以简单地导入并在任何需要的地方使用它。此外,它不一定是头文件 - 它可以是纯文本文件或可以从代码中读取的 plist。
所以,感谢 https://therealbnut.wordpress.com/2012/01/01/setting-xcode-4-0-environment-variables-from-a-script/ 我能够解决它!
将 Xcode 6 的简单步骤放在此处,以防其他人遇到此问题...
第 1 步:
单击目标,然后在 Build Phases 下单击加号下的 New 运行 Script Phase。
我使用了以下脚本:
LLVM_XCCONFIG="llvm.xcconfig"
BUILD_INFO="-DGIT_COMMIT_HASH="`git rev-parse --short HEAD`
echo "// Configuration file for LLVM settings, generated as a build phase." > $LLVM_XCCONFIG
echo "BUILD_INFO = $BUILD_INFO" >> $LLVM_XCCONFIG
# Force clang to rebuild the file
touch libUtils/BuildInfo.m
第 2 步:
建造它! 产品->构建
这会在项目目录中生成一个 llvm.xcconfig 文件:)
第 3 步:
通过右键单击目标并点击 Add Files to ""
将 .xcconfig 添加到项目中
第 4 步:
在目标设置中,在 Build Phases 窗格下,双击 Compile Sources 下的相应源并添加 $(BUILD_INFO)
用于文件的编译器标志。
第 5 步:
转到项目设置(不是目标设置!)。它应该会将您带到 Info 窗格。在 Configurations 下设置 Debug 和 Release 以使用 "llvm" 配置。
在此菜单下,您可能还需要移动 llvm.xcconfig Copy Bundle Resources 目标。
第 6 步:
大功告成!!尝试构建并确保一切正常:)
我试图在 Xcode 中传递依赖于简单系统 shell 命令的编译器宏定义。
我尝试的第一件事是将它添加到 Build Phases->Compile Sources 中的特定文件中,如下所示:
令我惊讶的是它没有用,所以我尝试了这个:
这正确地打印出了值,但是宏没有正确地传递到源文件。 我认为这个不起作用,因为它创建了一个单独的 shell 实例,因此环境变量不会保留到编译阶段。
我尝试进行 Google 搜索并查看 Whosebug,我发现的唯一有希望的是这个,它似乎没有有效的解决方案:XCode C/C++ Flags Bash Script
我写的代码是这样的:
#define STRINGIFY(X) #X
#define TOSTRING(X) STRINGIFY(X)
#define AT __FILE__ ":" TOSTRING(__LINE__)
NSString* getBuildHash()
{
return [NSString stringWithCString:TOSTRING(GIT_COMMIT_HASH) encoding:NSASCIIStringEncoding];
}
任何帮助将不胜感激:) 谢谢!
这里有一个可能有用的想法:
在 shell 脚本(构建阶段的 "run script")中,不要设置环境变量,而是将您的值写入项目中已包含的文件。为了方便起见,您可以使用构建阶段来启动另一个 shell 脚本来完成这项工作。
例如,您可以有一个包含定义(或静态变量)的头文件:#define kObjCFlags @"MY_FLAGS"
。您的脚本将在每次运行时注入并替换该值(使用正则表达式仅替换字符串的内容)。
由于它是项目的一部分,您可以简单地导入并在任何需要的地方使用它。此外,它不一定是头文件 - 它可以是纯文本文件或可以从代码中读取的 plist。
所以,感谢 https://therealbnut.wordpress.com/2012/01/01/setting-xcode-4-0-environment-variables-from-a-script/ 我能够解决它!
将 Xcode 6 的简单步骤放在此处,以防其他人遇到此问题...
第 1 步:
单击目标,然后在 Build Phases 下单击加号下的 New 运行 Script Phase。
我使用了以下脚本:
LLVM_XCCONFIG="llvm.xcconfig"
BUILD_INFO="-DGIT_COMMIT_HASH="`git rev-parse --short HEAD`
echo "// Configuration file for LLVM settings, generated as a build phase." > $LLVM_XCCONFIG
echo "BUILD_INFO = $BUILD_INFO" >> $LLVM_XCCONFIG
# Force clang to rebuild the file
touch libUtils/BuildInfo.m
第 2 步:
建造它! 产品->构建 这会在项目目录中生成一个 llvm.xcconfig 文件:)
第 3 步:
通过右键单击目标并点击 Add Files to ""
将 .xcconfig 添加到项目中第 4 步:
在目标设置中,在 Build Phases 窗格下,双击 Compile Sources 下的相应源并添加 $(BUILD_INFO)
用于文件的编译器标志。
第 5 步:
转到项目设置(不是目标设置!)。它应该会将您带到 Info 窗格。在 Configurations 下设置 Debug 和 Release 以使用 "llvm" 配置。
在此菜单下,您可能还需要移动 llvm.xcconfig Copy Bundle Resources 目标。
第 6 步:
大功告成!!尝试构建并确保一切正常:)