Сортируйте собственные библиотеки для каждой цепочки инструментов

#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 {
                    ...
                }
            }
        }
    }
    ...
}