1

我的一个项目是由 gn+ninja 构建的。我想使用平面缓冲区https://github.com/dvidelabs/flatcc,但它是用 cmake 编写的。

因为我的项目应该建立在旧的 red hat 6 上,所以没有合适的 cmake 版本来构建 flatcc。将它作为我项目子目录的一部分导入并使用 gn 构建的更好方法是什么?

4

1 回答 1

0

在这里查看我的答案:https ://stackoverflow.com/a/63326374/12529885

如果有.so二进制文件,使用上面的脚本,否则只能使用static_libraryshared_library作为源代码目标导入。

例如

# RocksDB 
#--------------------------
import("//gn_build/platform_support.gni") ## variable SSE42 here. 

config("rocksdb_export") {
    include_dirs = ["rocksdb/include"]
    visibility = [":rocksdb"]
}
config("rocksdb_build") {
    defines = [
        "ROCKSDB_SUPPORT_THREAD_LOCAL",  # HAVE_THREAD_LOCAL
        # "NUMA",  # build with NUMA policy support(numactl-devel)
        "TBB",   # build with Threading Building Blocks (TBB)
        "ROCKSDB_USE_RTTI",
        "ZSTD",
        "GFLAGS=1"
    ]

    if (is_win) {
        defines += ["ROCKSDB_WINDOWS_UTF8_FILENAMES", "WIN32", "OS_WIN", "_MBCS", "WIN64", "NOMINMAX"]
        # defines += ["ROCKSDB_DLL", "ROCKSDB_LIBRARY_EXPORTS"]
        libs = ["shlwapi.lib", "rpcrt4.lib"]
        cflags_cc = ["/wd4127", "/wd4800", "/wd4996", 
            "/wd4351", "/wd4100", "/wd4204", "/wd4324"]
    }else {
        defines += ["ROCKSDB_PLATFORM_POSIX", "ROCKSDB_LIB_IO_POSIX"]
    }

    if (is_linux) {
        defines += [
            "OS_LINUX",
            "ROCKSDB_PTHREAD_ADAPTIVE_MUTEX",
            "ROCKSDB_SCHED_GETCPU_PRESENT",
            "ROCKSDB_AUXV_GETAUXVAL_PRESENT",
            "ROCKSDB_RANGESYNC_PRESENT",
        ]
        if (!is_llvm) {
            cflags_cc = ["-fno-builtin-memcmp"]
        }
    }

    if (SSE42) {
        defines += ["HAVE_SSE42", "HAVE_PCLMUL"]
    }

    include_dirs = ["rocksdb"]
}

static_library("rocksdb") {
    configs += [":rocksdb_build"]
    slist = read_file("rocksdb-master.gn_helper", "scope")

    base = "rocksdb"
    include_dirs = ["$base"]
    sources = slist.SOURCES
    base_pth = rebase_path("$base")
    
    if (is_win) {
        sources += slist.PORTWIN32
    }

    if (is_linux) {
        sources += slist.PORTLINUX
    }

    #Enable folly mutex
    include_dirs += ["$base/third-party/folly"]
    sources += slist.FOLLY_DISTRIBUTED_MUTEX
    #End folly mutex

    deps = [":zstd_static", ":gflags"]
    public_deps = [":tbb"]
    public_configs = [":rocksdb_export"]
}

文件rocksdb-master.gn_helper

SOURCES = [
    "rocksdb/cache/cache.cc",
    "rocksdb/cache/clock_cache.cc",
    ...
]

PORTWIN32 = [
    "rocksdb/port/win/io_win.cc",
    "rocksdb/port/win/env_win.cc",
    ...
]
...
于 2021-04-19T17:11:52.083 回答