#gradle #gradle-native
#gradle #gradle-native
Вопрос:
Я работаю над проектом с собственным кодом, который использует Gradle. Проект хорошо строится на Linux с использованием gcc
, в том числе с использованием готовых библиотек, в частности openssl
. Теперь мне нужно создать его на macOS, используя clang
.
В начале моей модели у меня есть:
model {
repositories {
libs(PrebuiltLibraries) {
openssl {
headers.srcDir "/usr/local/include/openssl"
headers.include "**/*.h"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("/usr/local/lib/libssl.a")
}
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("/usr/local/lib/libcrypto.a")
}
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("/usr/local/lib/libssl.so")
}
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("/usr/local/lib/libcrypto.so")
}
}
}
}
}
components {
...
}
В принципе, мне просто нужно изменить пути к файлам при компиляции для Mac. Я привык смотреть на toolChain
свойство при генерации двоичных файлов из моих компонентов, поэтому я попытался добавить if (toolChain in <Gcc | Clang>) { ... }
блоки вокруг libs()
объявлений, но я получаю сообщение об ошибке:
Cannot create a ArtifactRepository named 'toolChain'
Я также попытался создать отдельный openssl-mac
объект репозитория, а затем использовать ту же if (toolChain ...) {}
логику в объявлении компонента, например :
components {
myLib(NativeLibrarySpec) {
sources {
cpp {
source {
srcDir "mylib/src"
include "*.cpp"
}
exportedHeaders {
srcDir "mylib/src"
include "*.h"
}
if (toolChain in Gcc) { lib library: 'openssl', linkage: 'static' }
if (toolChain in Clang) { lib library: 'openssl-mac', linkage: 'static' }
}
}
}
}
}
Но я получаю аналогичную ошибку:
No such property: toolChain for class: org.gradle.language.cpp.CppSourceSet
Очевидно, что я делаю это неправильно. Каков правильный способ предоставления различных готовых библиотек в зависимости от целевой цепочки инструментов / платформы / ОС / etc?
Ответ №1:
Ответ, похоже, заключается в том, чтобы использовать org.gradle.internal.os.OperatingSystem
вот так:
import org.gradle.internal.os.OperatingSystem;
model {
repositories {
if (OperatingSystem.current().isLinux()) {
libs(PrebuiltLibraries) {
openssl {
...
}
}
}
if (OperatingSystem.current().isMacOsX()) {
libs(PrebuiltLibraries) {
openssl {
...
}
}
}
}
...
}