2017-11-03 7 views
0

내 프로젝트에 2 개의 종속성이 있습니다 libeventlibressl입니다. 둘 다 로컬에 설치되어 있습니다 (각각 /usr/local/include/usr/local/opt/libressl/include)Swift 패키지 관리자 및 libevent를 사용하여/usr/local /을 정확하게 처리하십시오.

내가 찾고있는 것은 SPM이 자동으로 해당 디렉토리에서 검색하는 것입니다.

나는 이것을 달성하기 위해 신속한 빌드에 플래그를 전달할 수 있음을 알고 있습니다. 궁극적 인 목표는 Xcode에서 커스텀 빌드 플래그를 지속적으로 추가하지 않고 명령 행에서 xcode 프로젝트를 적절하게 생성 할 수 있다는 것입니다.

PostgreSQL에 대한 사용자 지정 설정을 입력 할 필요가 없기 때문에 가능하다고 확신합니다.

// swift-tools-version:4.0 
// The swift-tools-version declares the minimum version of Swift required to build this package. 

import PackageDescription 

let package = Package(
    name: "CEvent", 
    providers: [ 
     .brew(["libevent"]), 
     .apt(["libevent-dev"]) 
    ], 
    products: [ 
     // Products define the executables and libraries produced by a package, and make them visible to other packages. 
     .library(
      name: "CEvent", 
      targets: ["CEvent"]), 
     ], 
    dependencies: [ 
    ], 
    targets: [ 
     .target(
      name: "CEvent", 
      dependencies: [] 
     ), 
    ] 
) 

모듈지도 :

스위프트 - 도구 버전은 참조

Package.swift 4.0.x의에 있습니다

module CEvent [system] { 
    header "shim.h" 
    link "event" 
    export * 
} 

그리고 내 현재 빌드 스크립트 (build.sh) :

#!/usr/local/bin/fish 
swift build -Xcc -O0 -Xcc -fblocks -Xswiftc -lbcrypt -Xswiftc -I/usr/local/include -Xswiftc -L/usr/local/lib -Xswiftc -ltls -Xswiftc -lcrypto -Xswiftc -lssl -Xswiftc -L/usr/local/opt/postgresql/lib -Xswi$ 

A 내가 이것을 원한다는 이유로. 종속성을 신속하게 추가/업데이트/제거하면 새 xcode 프로젝트를 생성하고 해당 빌드 머신에서 설정을 수정하지 않아도됩니다. 뿐만 아니라 apt/ubuntu/usr/lib를 사용합니다.

답변

0

답안에서 알 수 있고 문서화 된 내용은 좋은 시작이지만 전체 기사는 아닙니다. 예, SwiftPM은 pkg-config을 사용하여 특정 라이브러리가 설치된 위치를 확인합니다. 예, SwiftPM은 pkg-config에게 전달할 pkgConfig 이름을 사용합니다. 그러나 검색 경로는 좀 더 복잡합니다.맥 OS에는 다음 목록을 사용 base search path A와 :

그러나 SwiftPM가 pkg-config 명령을 사용하지 않습니다, 대신에을 구문 분석합니다.파일을 직접. 패키지에 pkgConfig 매개 변수를 설정하면 위에 나열된 경로에서 찾을 파일 이름을 알 수 있습니다. 그리고 답안의 예를 들어 이야기가 여기서 멈 춥니 다. libevent.pc 파일이 발견되면 parses that file이 반환되고 반환되는 플래그는 컴파일러와 링커로 전달됩니다. 당신이 :,

providers: [ 
    .Brew("libsodium"), 
    .Apt("libsodium-dev") 
] 

을 예컨대을 패키지 제공을 정의한다면

그러나 그런 SwiftPM은을 위해 구축 된 플랫폼의 패키지 프로 바이더에 따라 추가 검색 경로를 추가합니다. macOS 예제를 계속 사용하면 SwiftPM은 brew --prefix으로 실행됩니다. 이 경로를 반환하는 경우, 다음과 같은 경로 added as a additional search path입니다 : libsodium의 내 예에서

  • [brewPrefix]/opt/[packageName]/lib/pkgconfig

이 SwiftPM 지금은 전혀 brew link 또는 심볼릭 링크를 필요로하지 않고 라이브러리의 위치를 ​​추정 할 수 있습니다. 자세한 내 출력에는 내 지하실에 libsodium 라이브러리 경로가 나열되어 있습니다 (-L/usr/local/Cellar/libsodium/1.0.11/lib).

+0

감사합니다. 그것은 장래의 서버 측에서 신속하게 도움을 줄 것입니다. 비록 내가 현재 리눅스의 libressl에서 segfaults로 고심하고 있지만, 나는 변화를 만들었다. 하나의 빠른 사이드 바를 추가하고 싶습니다. libsodium 1.0.12/13이 감사되었습니다. 양조에 있다면 업데이트하십시오! –

0

다른 프로젝트 (특히 IBM-Swift/CLibpq) 분석에서 무시한 것은 제가 전에 개인적으로 만진 것이 아닌 pkg-config 도구를 사용하는 것 같습니다.

pkg-config는 /usr/lib/pkgconfig/usr/share/pkgconfig과 빌드 프로세스 중에 사용되는 구성 파일의 로컬 변형을 찾습니다.

내부 Package.swift는 name 매개 변수 다음에 당신은 예를 들어 뭔가를 삽입해야합니다

  • 내가 사용 bcrypt 라이브러리가 없습니다 :

    let package = Package(
        name: "CEvent", 
        pkgConfig: "libevent", 
    

    일부주의 내가이 함께 발견 전체 설치 또는 메이크 파일 내부 빌드 그래서 swift4 오후 대신 여기에 발견 된 새로운 옵션을 사용하여 컴파일 된 : BCrypt example on github 및 자세한 도움말 여기 Swift 문서 : SPM API Redesign

  • Homebrew에있는 LibreSSL은 pkgconfig를 시스템에 설치하지 않습니다. 그래서 수동으로 추가하거나 소스에서 LibreSSL-portable을 컴파일하는 것이 가장 쉽습니다.

나를위한 전반적으로 훌륭한 학습 경험.