3

没有 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 $?
4

4 回答 4

2

有非 Mac 平台的 objcunit 端口。您可以查看MidnightBSD 中与 GNUstep 一起使用的端口。这些补丁也应该适用于其他环境。pkg-descr 有软件包网站,Makefile 有下载 URL。

于 2013-03-30T02:54:03.183 回答
1

您的主要问题的答案是肯定的:Objective-C 的命令行测试工具不依赖于 Xcode。

例如,您可以在不使用 Xcode 的情况下使用 OCUnit/SenTestingKit。您所要做的就是将您的编译器/链接器指向框架。考虑以下文件octest.m

#import <Foundation/Foundation.h>
#import <SenTestingKit/SenTestingKit.h>

int main() {
  @autoreleasepool {
    SenSelfTestMain();
  }
  return 0;
}

@interface MyTest : SenTestCase
@end

@implementation MyTest
- (void)testSomething {
  STAssertEquals(1, 2, @"fail");
}
@end

编译它:

clang -o octest octest.m -F/Applications/Xcode.app/Contents/Developer/Library/Frameworks -framework Foundation -framework SenTestingKit

现在运行它

DYLD_FRAMEWORK_PATH=/Applications/Xcode.app/Contents/Developer/Library/Frameworks ./octest

你应该看到类似的东西

Test Suite '/tmp/octest(Tests)' started at 2013-04-04 12:34:49 +0000
Test Suite 'MyTest' started at 2013-04-04 12:34:49 +0000
Test Case '-[MyTest testSomething]' started.
octest.m:16: error: -[MyTest testSomething] : '1' should be equal to '2': fail
Test Case '-[MyTest testSomething]' failed (0.000 seconds).
Test Suite 'MyTest' finished at 2013-04-04 12:34:49 +0000.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.000) seconds
Test Suite '/tmp/octest(Tests)' finished at 2013-04-04 12:34:49 +0000.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.001) seconds
make: *** [default] Error 1

此示例确实依赖于 Xcode,因为它使用捆绑的 SenTestingKit 框架,但如上所述构建和运行测试的一般过程不依赖于 Xcode。

现在,要让它在 linux 系统上运行,您必须安装 SenTestingKit(很可能是 GNUstep),但是有了这些组件,构建和测试过程应该基本相同。

于 2013-04-04T13:32:16.293 回答
0

对于编译objective-C,我知道一种快速而肮脏(而且有些有限)的方法——我在http://www.compileonline.com/compile_objective-c_online.php在线进行。也就是说,这个编译器会抛出很多 c-99 错误,我认为这是因为它是 C 的严格超集,并且不包括该语言的一些更独特的特性(例如:@synthesize,甚至点符号) ,但它完成了工作。我用 Notepad++ 输入代码。就像我说的,有限的,但外科手术。
*此外 - 它支持命令行样式输入,这是可靠的。

于 2013-04-02T19:46:26.167 回答
0

Look at xctool from facebook which is a replacement for Apple's xcodebuild. We build our Objective-C library using maven and use it only for tests instead of xcodebuild and it works great. The output is much more readable as compared to xcodebuild.

From the xctool page,

xctool is a replacement for Apple's xcodebuild that makes it easier to build 
and test iOS and Mac products. 

One thing to note though is it does not support building targets. You can use a scheme though.

于 2016-02-06T23:17:05.723 回答