как обернуть драйвер Cassandra C ++ в быстром модуле - PullRequest
1 голос
/ 02 февраля 2020

Я пытаюсь написать приложение swift на стороне сервера для драйвера cassandra c ++ (насколько мне известно, никакой быстрой поддержки не было)

Мне удалось установить cassandra c ++ локально на моей машине c примерно так:

 # Datastax C++ driver dependencies
   brew install libuv cmake
   brew install openssl
   brew link --force openssl

   # Install git if you dont have it
   brew install git

   # Retrieve the cpp 
   git clone https://github.com/datastax/cpp-driver.git --depth=1
   mkdir cpp-driver/build
   cd cpp-driver/build

   # Build with qualified path to OpenSSL location
   cmake -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl/ -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib ..
   make
   make install

проверено с

 ls /usr/local/include/cassandra.h
-rw-r--r--  1 staff   323K Feb  2 14:26 /usr/local/include/cassandra.h

, а также:

pkg-config --list-all
...
cassandra             cassandra - A C/C++ client driver for Apache Cassandra and DataStax Products
...

Я создал быстрый пакет, используя слишком много учебников для подсчета.

В основном:

https://github.com/apple/swift-package-manager/blob/master/Documentation/Usage.md#requiring -системные библиотеки

и https://medium.com/shopify-mobile/wrapping-a-c-library-in-swift-part-1-6dd240070cef

но похоже что инструкции неверны для этой темы?

https://forums.swift.org/t/system-library-targets-package-has-unsupported-layout-modulemap/16614/6

в настоящее время моя структура выглядит следующим образом:

/Developer/cassandra-swift: tree
.
├── Package.swift
├── README.md
├── Sources
│   ├── cassandra
│   │   ├── cassandraumb.h
│   │   └── module.modulemap
│   └── cassandra-swift
│       └── cassandra_swift.swift
├── Tests
│   ├── LinuxMain.swift
│   └── cassandra-swiftTests
│       ├── XCTestManifests.swift
│       └── cassandra_swiftTests.swift

и содержимое :

cassandra-swift: cat Package.swift
// swift-tools-version:5.1
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "cassandra-swift",
    products: [
        // Products define the executables and libraries produced by a package, and make them visible to other packages.
        .library(
          name: "CCassandra",
          targets: ["CCassandra"])
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages which this package depends on.
        .systemLibrary(
                    name: "CCassandra",
                    path: "Sources/cassandra",
                    pkgConfig: "cassandra"
//                    providers: [
//                        .brew(["libgraphqlparser"]),
//                        .apt(["libgraphqlparser"]),
//                        ]
                    ),
//        .testTarget(
//            name: "cassandra-swiftTests",
//            dependencies: ["cassandra-swift"]),
    ]
)

//git clone https://github.com/datastax/cpp-driver.git --depth=1
//cd cpp-driver/
//ls
//mkdir build
//cd build/
//   cmake -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl/ -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib ..
//make
//make install
//less /usr/local/include/cassandra.h
//cat /usr/local/lib/pkgconfig/cassandra.pc


//-- Install configuration: ""
//-- Installing: /usr/local/include/cassandra.h
//-- Installing: /usr/local/include/dse.h
//-- Installing: /usr/local/lib/libcassandra.2.15.0.dylib
//-- Installing: /usr/local/lib/libcassandra.2.dylib
//-- Up-to-date: /usr/local/lib/libcassandra.dylib
//-- Installing: /usr/local/lib/pkgconfig/cassandra.pc
cassandra-swift: cat Sources/cassandra/module.modulemap
module CCassandra [system] {
    umbrella header  "cassandraump.h"
    header "/usr/local/include/cassandra.h"
    link "cassandra"
    export *
}
cat Sources/cassandra/cassandraumb.h
#import <c/cassandra.h>

У меня есть 2 тестовых проекта. Первый тестовый проект - это приложение ma c XCode, использующее интегрированную поддержку SPM и добавляющее ссылку на репозиторий git 1042 *

, другой проект - сгенерированный SPM проект, ссылающийся на пакет SPM

Оба не работают должным образом.

Я играю с этим часами.

Я бы хотел, чтобы это работало локально в XCode для dev, а также было переносимым. (при условии, что через spm) выполняется в быстром docker контейнере.

...