如何使用gradle(5.3.1)新的nativ eplugin将外部仅标头库包含到gradle本机内部版本中?

时间:2019-04-02 06:11:09

标签: c++ gradle gradle-native

评估gradle本机我想只包含一个标头库{fmt},用在new gradle native plugin的gradle本机多项目中。

我尝试通过flatDir和Maven存储库包括它。该文档仅提及有害依赖。但是即使那样,外部代码似乎也必须使用build.gradle文件进行扩展。在下面您可以看到我的最后尝试

build.gradle根目录

allprojects {
    apply plugin: 'xcode'
    apply plugin: 'visual-studio'

    configurations {
        fmtLib
    }

    dependencies {
        fmtLib files(file("$rootDir/../fmt"))
    }
}
库中的

build.gradle应该使用{fmt}

plugins {
    id 'cpp-library'
}

library {
    linkage = [Linkage.SHARED]

    targetMachines = [
        machines.windows.x86_64,
        machines.macOS.x86_64,
        machines.linux.x86_64
    ]

    baseName = "greeter"
}

greeter.cpp应使用{fmt}

#define FMT_HEADER_ONLY

#include <iostream>
#include "../public/greeter.hpp"
#include "include/fmt/format.h"

void Greeter::greet() {
    fmt::print("Hello, {}!", "world");
    std::cout << "Hello, " << name << ", your name has " << getNameLength() << " chars." << std::endl;
}

int Greeter::getNameLength() {
    return name.length();
}

上面的示例导致一个编译错误,因为无法解决的依赖关系很明显。

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。不幸的是gradle直到5.3.1才提供更好的解决方案,但是可以通过以下方法解决此问题

def fmtHeaders = file("$rootDir/../fmt/include")

components.main.binaries.whenElementFinalized { binary ->
    project.dependencies {
        if (binary.optimized) {
            add(binary.includePathConfiguration.name, files(fmtHeaders))
        } else {
            add(binary.includePathConfiguration.name, files(fmtHeaders))
        }
    }
}