Gradle нативных библиотек для каждого набора инструментов - PullRequest
0 голосов
/ 25 апреля 2019

Я работаю над проектом с собственным кодом, который использует 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

Очевидно, я ошибаюсь. Как правильно поставлять разные готовые библиотеки в зависимости от целевого набора инструментов / платформы / ОС / и т. Д.?

1 Ответ

0 голосов
/ 26 апреля 2019

Ответ, похоже, заключается в том, чтобы использовать 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 {
                    ...
                }
            }
        }
    }
    ...
}
...