在没有 GUI 的情况下编译 Objective-C后说如下:
要在 OSX 上编译 Objective-C,您必须获得 XCode,它可以从应用商店免费获得。获取 XCode 将确保您获得必要的框架(头文件),例如 Foundation、Cocoa 等。但是,这不会为您提供从命令行编译 Object-C 所需的命令行工具。打开 XCode,转到首选项 > 下载 > 组件并安装命令行工具。这将安装 gcc、clang、make 等。
我正在寻找一个非基于 Xcode 的工具来解决我的问题,我刚刚打开:是否可以在 Travis 上测试一个 Objective-C 项目?
该工具应满足以下要求:
- 它不应该以任何方式与 Xcode 相关。
- 以下简单程度就足够了:只需一些
int main {}
代码收集附近的所有测试用例文件并在我要测试的代码上运行测试断言(例如ST-
在 SetTestingKit 或GH-
GHUnit 中) - 我不需要 UI、GUI、Xcode、模拟器。
- 如果它可以在 Mac 和 Ubuntu(是的,Travis)上运行,那就 太好了,可能像引用的帖子描述的那样使用GNUstep 。
根据接受的答案更新:
根据 Malte Tancred 在接受的答案中所说的,以下简单设置似乎足以满足我当前的需求:
三个文件,都在我项目的测试目录中:
八度测试.m
#import <Foundation/Foundation.h>
#import <SenTestingKit/SenTestingKit.h>
int main() {
@autoreleasepool {
SenSelfTestMain();
}
return 0;
}
生成文件
CC=clang # or gcc
# Trick to get current dir: https://stackoverflow.com/questions/322936/common-gnu-makefile-directory-path
TESTS_DIR:= $(dir $(lastword $(MAKEFILE_LIST)))
PROJECT_DIR:= $(TESTS_DIR)/..
FRAMEWORKS_PATH:= -F/Applications/Xcode.app/Contents/Developer/Library/Frameworks
FRAMEWORKS:= -framework Foundation -framework SenTestingKit
LIBRARIES:= -lobjc
INCLUDE_PATHS:= -I$(PROJECT_DIR)/Projectfiles\
-I$(TESTS_DIR)/TestHelpers
SOURCE_FILES = $(wildcard $(PROJECT_DIR)/Projectfiles/*.m)
SOURCE_TEST_SUITE = $(wildcard $(TESTS_DIR)/Tests/*.m)
SOURCE_TESTS = $(TESTS_DIR)/TestHelpers/TestHelpers.m\
octest.m
CFLAGS=-Wall -Werror -fobjc-arc -g -v $(SOURCE_FILES) $(SOURCE_TEST_SUITE) $(SOURCE_TESTS)
LDFLAGS=$(LIBRARIES) $(FRAMEWORKS)
OUT=-o octest
all:
$(CC) $(FRAMEWORKS_PATH) $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(OUT)
运行测试
#!/bin/bash
export DYLD_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Library/Frameworks
make
./octest
更新捕获退出代码:
在我提出这个问题几天后,Travis 宣布了对 Objective-C 的支持:
http://about.travis-ci.org/blog/introducing-mac-ios-rubymotion-testing/
尽管他们建议使用默认脚本进行构建,但我决定采用此处描述的方法,并且仍然使用 octest 而不是 Travis 使用的 xcodebuild 方法。
默认情况下,travis 设置依赖于 Justin Spahr-Summers 编写的构建脚本:https ://github.com/jspahrsummers/objc-build-scripts :
他们使用awk从 xcodebuild 的输出中捕获退出代码,因为它总是以 0 退出代码存在,即使整个测试套件都失败了!
OCTest 的行为方式相同 - 它始终以 0 代码存在,这就是我使用 Travis awk脚本的简化版本以满足我在上面描述的方式构建它的需要的方式:
octest.awk
# Exit statuses:
#
# 0 - No errors found.
# 1 - Build or test failure. Errors will be logged automatically.
BEGIN {
status = 0;
}
{
print;
fflush(stdout);
}
/[0-9]+: (error|warning):/ {
errors = errors $0 "\n";
}
/with [1-9]+ failures?/ {
status = 1;
}
END {
if (length(errors) > 0) {
print "\n*** All errors:\n" errors;
}
fflush(stdout);
exit status;
}
运行测试
#!/bin/bash
export DYLD_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Library/Frameworks
make
runtests ()
{
./octest 2>&1 | awk -f "octest.awk"
local awkstatus=$?
if [ "$awkstatus" -eq "1" ]
then
echo "Test suite failed"
return $awkstatus
else
echo "Test suite passed"
return 0
fi
}
echo "*** Building..."
runtests || exit $?