🔥 CSetting

507자
6분

CSetting 구조체는 C 언어 빌드 설정을 나타내는 데 사용됩니다. 이 구조체는 Swift 패키지에서 C 언어 코드를 빌드할 때 필요한 설정을 지정하는 역할을 합니다.

CSetting 구조체는 다음과 같은 정적 메서드를 제공합니다:

headerSearchPath(::)

이 메서드는 타겟 디렉토리를 기준으로 상대 경로를 사용하여 헤더 탐색 경로를 제공합니다.

swift
/// 타겟의 디렉토리를 기준으로 헤더 탐색 경로를 제공합니다.
///
/// 이 설정을 사용하여 타겟 내에서 헤더의 탐색 경로를 추가할 수 있습니다.
/// 절대 경로는 사용할 수 없으며 이 설정을 사용하여 다른 타겟에 표시되는 헤더를 제공할 수 없습니다.
///
/// 경로는 반드시 패키지 내부의 디렉토리여야 합니다.
///
/// - Since: PackageDescription 5.0에서 처음 사용 가능
///
/// - Parameters:
///   - path: 헤더가 포함된 디렉토리의 경로. 경로는 타겟의 디렉토리를 기준으로 합니다.
///   - condition: 빌드 설정의 적용을 제한하는 조건.
static func headerSearchPath(_ path: String, _ condition: BuildSettingCondition? = nil) -> CSetting
swift
/// 타겟의 디렉토리를 기준으로 헤더 탐색 경로를 제공합니다.
///
/// 이 설정을 사용하여 타겟 내에서 헤더의 탐색 경로를 추가할 수 있습니다.
/// 절대 경로는 사용할 수 없으며 이 설정을 사용하여 다른 타겟에 표시되는 헤더를 제공할 수 없습니다.
///
/// 경로는 반드시 패키지 내부의 디렉토리여야 합니다.
///
/// - Since: PackageDescription 5.0에서 처음 사용 가능
///
/// - Parameters:
///   - path: 헤더가 포함된 디렉토리의 경로. 경로는 타겟의 디렉토리를 기준으로 합니다.
///   - condition: 빌드 설정의 적용을 제한하는 조건.
static func headerSearchPath(_ path: String, _ condition: BuildSettingCondition? = nil) -> CSetting

예를 들어, 다음과 같이 사용할 수 있습니다:

swift
.target(
    name: "MyTarget",
    dependencies: ["Logging"],
    cSettings: [
        .headerSearchPath("path/to/headers"),
    ]
)
swift
.target(
    name: "MyTarget",
    dependencies: ["Logging"],
    cSettings: [
        .headerSearchPath("path/to/headers"),
    ]
)

이 코드는 MyTarget 타겟에 path/to/headers 디렉토리를 헤더 탐색 경로로 추가합니다. 이제 MyTarget 타겟의 C 코드에서 해당 디렉토리에 있는 헤더 파일을 찾을 수 있게 됩니다.

define(:to::)

이 메서드는 매크로의 값을 정의합니다. 값을 지정하지 않으면 매크로의 기본값은 1이 됩니다.

swift
/// 매크로의 값을 정의합니다.
///
/// 값을 지정하지 않으면 매크로의 기본값은 1이 됩니다.
///
/// - Since: PackageDescription 5.0에서 처음 사용 가능
///
/// - Parameters:
///   - name: 매크로의 이름.
///   - value: 매크로의 값.
///   - condition: 빌드 설정의 적용을 제한하는 조건.
static func define(_ name: String, to value: String? = nil, _ condition: BuildSettingCondition? = nil) -> CSetting
swift
/// 매크로의 값을 정의합니다.
///
/// 값을 지정하지 않으면 매크로의 기본값은 1이 됩니다.
///
/// - Since: PackageDescription 5.0에서 처음 사용 가능
///
/// - Parameters:
///   - name: 매크로의 이름.
///   - value: 매크로의 값.
///   - condition: 빌드 설정의 적용을 제한하는 조건.
static func define(_ name: String, to value: String? = nil, _ condition: BuildSettingCondition? = nil) -> CSetting

예를 들어, 다음과 같이 사용할 수 있습니다:

swift
.target(
    name: "MyTarget",
    dependencies: ["Logging"],
    cSettings: [
        .define("DEBUG"),
        .define("API_KEY", to: "1234567890"),
    ]
)
swift
.target(
    name: "MyTarget",
    dependencies: ["Logging"],
    cSettings: [
        .define("DEBUG"),
        .define("API_KEY", to: "1234567890"),
    ]
)

이 코드는 MyTarget 타겟에서 DEBUG 매크로를 정의하고 API_KEY 매크로의 값을 "1234567890"으로 설정합니다. 이제 MyTarget 타겟의 C 코드에서 이러한 매크로를 사용할 수 있게 됩니다.

unsafeFlags(::)

이 메서드는 해당 빌드 도구에 임의의 명령줄 플래그를 전달하는 안전하지 않은 플래그를 설정합니다.

swift
/// 해당 빌드 도구에 임의의 명령줄 플래그를 전달하는 안전하지 않은 플래그를 설정합니다.
///
/// "안전하지 않은"이라는 단어의 사용에서 알 수 있듯이, Swift 패지지 매니저는
/// 특정 플래그가 빌드 방식을 변경할 수 있기 때문에 빌드 플래그가 빌드에
/// 부정적인 영향을 미치는지 안전하게 판단할 수 없습니다.
///
/// 일부 빌드 플래그는 지원되지 않거나 악의적인 동작에 악용될 수 있으므로,
/// 안전하지 않은 플래그를 사용하면 이 타겟을 포함하는 제품을 다른 패키지에서 사용할 수 없게 됩니다.
///
/// - Since: PackageDescription 5.0에서 처음 사용 가능
///
/// - Parameters:
///   - flags: 설정할 안전하지 않은 플래그.
///   - condition: 빌드 설정의 적용을 제한하는 조건.
static func unsafeFlags(_ flags: [String], _ condition: BuildSettingCondition? = nil) -> CSetting
swift
/// 해당 빌드 도구에 임의의 명령줄 플래그를 전달하는 안전하지 않은 플래그를 설정합니다.
///
/// "안전하지 않은"이라는 단어의 사용에서 알 수 있듯이, Swift 패지지 매니저는
/// 특정 플래그가 빌드 방식을 변경할 수 있기 때문에 빌드 플래그가 빌드에
/// 부정적인 영향을 미치는지 안전하게 판단할 수 없습니다.
///
/// 일부 빌드 플래그는 지원되지 않거나 악의적인 동작에 악용될 수 있으므로,
/// 안전하지 않은 플래그를 사용하면 이 타겟을 포함하는 제품을 다른 패키지에서 사용할 수 없게 됩니다.
///
/// - Since: PackageDescription 5.0에서 처음 사용 가능
///
/// - Parameters:
///   - flags: 설정할 안전하지 않은 플래그.
///   - condition: 빌드 설정의 적용을 제한하는 조건.
static func unsafeFlags(_ flags: [String], _ condition: BuildSettingCondition? = nil) -> CSetting

예를 들어, 다음과 같이 사용할 수 있습니다:

swift
.target(
    name: "MyTarget",
    dependencies: ["Logging"],
    cSettings: [
        .unsafeFlags(["-fno-objc-arc"]),
    ]
)
swift
.target(
    name: "MyTarget",
    dependencies: ["Logging"],
    cSettings: [
        .unsafeFlags(["-fno-objc-arc"]),
    ]
)

이 코드는 MyTarget 타겟에 -fno-objc-arc 플래그를 설정합니다. 이 플래그는 Objective-C 자동 참조 카운팅(ARC)을 비활성화합니다. 하지만 이러한 안전하지 않은 플래그를 사용하면 MyTarget을 포함하는 제품을 다른 패키지에서 사용할 수 없게 됩니다.

CSetting 구조체를 사용하면 Swift 패키지에서 C 코드를 빌드할 때 필요한 다양한 설정을 지정할 수 있습니다. 이를 통해 C 코드와 Swift 코드를 원활하게 통합하고 빌드 프로세스를 최적화할 수 있습니다.

YouTube 영상

채널 보기
NestJS 미들웨어 기초 - 클래스 기반 미들웨어와 DI | NestJS 가이드
Haskell로 배우는 Writer 모나드 | 클라이슬리 카테고리 마지막편 | 프로그래머를 위한 카테고리 이론
관계로 정의하는 곱과 쌍대곱의 기초 | 프로그래머를 위한 카테고리 이론
미들웨어 적용과 라우팅 | NestJS 가이드
쌍대성과 비대칭성 | 프로그래머를 위한 카테고리 이론
피처 모듈은 무엇이고 왜 필요할까? | NestJS 가이드
Maybe 펑터와 타입 들어올리기 | 프로그래머를 위한 카테고리 이론
Writer 카테고리 구현 해 보기 | 크라이슬리 카테고리 3편 | 프로그래머를 위한 카테고리 이론