334d2f0ee6
$ ./gradlew backend.native:tests:run \
-Premote=user@111.22.33.444 -Ptest_target=raspberrypi
The new gradle command line options:
-Pbuild_flags renamed -Pkonanc_flags.
-Ptest_flags provides compiler flags to the test builds.
-Ptest_target properly sets up compiler as well as interop
to cross compile tests.
-Premote specifies remote host and login.
291 lines
7.6 KiB
Groovy
291 lines
7.6 KiB
Groovy
//ant.importBuild 'backend.native/kotlin-ir/build.xml'
|
|
|
|
defaultTasks 'clean', 'demo'
|
|
|
|
convention.plugins.platformInfo = new PlatformInfo()
|
|
|
|
allprojects {
|
|
if (path != ":dependencies") {
|
|
evaluationDependsOn(":dependencies")
|
|
}
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
}
|
|
|
|
loadCommandLineProperties()
|
|
loadLocalProperties()
|
|
setupCompilationFlags()
|
|
setupClang()
|
|
}
|
|
|
|
void setupClang() {
|
|
|
|
convention.plugins.execClang = new org.jetbrains.kotlin.ExecClang(project)
|
|
|
|
plugins.withType(NativeComponentPlugin) {
|
|
model {
|
|
toolChains {
|
|
clang(Clang) {
|
|
clangPath.each {
|
|
path it
|
|
}
|
|
|
|
eachPlatform { // TODO: will not work when cross-compiling
|
|
[cCompiler, cppCompiler, linker].each {
|
|
it.withArguments { it.addAll(hostClangArgs) }
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void setupCompilationFlags() {
|
|
ext.clangPath = ["$llvmDir/bin"]
|
|
ext.clangArgs = []
|
|
ext.targetArgs = [:]
|
|
final String binDir
|
|
|
|
if (isLinux()) {
|
|
ext.targetArgs <<
|
|
["host":
|
|
["--sysroot=${gccToolchainDir}/${gnuTriplet}/sysroot"],
|
|
"raspberrypi":
|
|
["-target", "armv7-unknown-linux-gnueabihf",
|
|
"-mfpu=vfp", "-mfloat-abi=hard",
|
|
"--sysroot=$raspberryPiSysrootDir",
|
|
// TODO: those two are hacks.
|
|
"-I$raspberryPiSysrootDir/usr/include/c++/4.8.3",
|
|
"-I$raspberryPiSysrootDir/usr/include/c++/4.8.3/arm-linux-gnueabihf"]
|
|
]
|
|
} else {
|
|
ext.targetArgs <<
|
|
["host":
|
|
["--sysroot=$hostSysrootDir", "-mmacosx-version-min=$minMacOsVersion"],
|
|
"iphone":
|
|
["-stdlib=libc++", "-arch", "arm64", "-isysroot", "$iphoneSysrootDir"],
|
|
// TODO: re-enable after simulator sysroot is available in the dependencies
|
|
// "iphone_sim":
|
|
// ["-stdlib=libc++", "-isysroot", "$iphoneSimSysrootDir"],
|
|
]
|
|
}
|
|
ext.targetList = ext.targetArgs.keySet() as List
|
|
|
|
if (isLinux()) {
|
|
binDir = "$gccToolchainDir/$gnuTriplet/bin"
|
|
ext.clangArgs.addAll([
|
|
"--gcc-toolchain=$gccToolchainDir",
|
|
"-L$llvmDir/lib"
|
|
])
|
|
} else {
|
|
binDir = "$hostSysrootDir/usr/bin"
|
|
}
|
|
ext.clangArgs << "-B$binDir"
|
|
ext.hostClangArgs = ext.clangArgs.clone()
|
|
ext.hostClangArgs.addAll(ext.targetArgs['host'])
|
|
|
|
ext.clangPath << binDir
|
|
ext.jvmArgs = ["-ea"]
|
|
}
|
|
|
|
void loadLocalProperties() {
|
|
if (new File("$project.rootDir/local.properties").exists()) {
|
|
Properties props = new Properties()
|
|
props.load(new FileInputStream("$project.rootDir/local.properties"))
|
|
props.each {prop -> project.ext.set(prop.key, prop.value)}
|
|
}
|
|
}
|
|
|
|
void loadCommandLineProperties() {
|
|
if (project.hasProperty("konanc_flags")) {
|
|
throw new Error("Specify either -Ptest_flags or -Pbuild_flags.")
|
|
}
|
|
ext.globalBuildArgs = project.hasProperty("build_flags")
|
|
? ext.build_flags.split(' ') : []
|
|
ext.globalTestArgs = project.hasProperty("test_flags")
|
|
? ext.test_flags.split(' ') : []
|
|
ext.testTarget = project.hasProperty("test_target")
|
|
? ext.test_target : null
|
|
}
|
|
|
|
class PlatformInfo {
|
|
private final String osName = System.properties['os.name']
|
|
private final String osArch = System.properties['os.arch']
|
|
|
|
boolean isMac() {
|
|
return osName == 'Mac OS X'
|
|
}
|
|
|
|
boolean isLinux() {
|
|
return osName == 'Linux'
|
|
}
|
|
|
|
boolean isAmd64() {
|
|
return osArch in ['x86_64', 'amd64']
|
|
}
|
|
|
|
String getGnuTriplet() {
|
|
if (isLinux() && isAmd64()) {
|
|
return "x86_64-unknown-linux-gnu"
|
|
} else {
|
|
throw unsupportedPlatformException()
|
|
}
|
|
}
|
|
|
|
String simpleOsName() {
|
|
if (isMac()) return 'macos'
|
|
if (isLinux()) return 'linux'
|
|
throw unsupportedPlatformException()
|
|
}
|
|
|
|
Throwable unsupportedPlatformException() {
|
|
return new Error("unsupported platform: $osName/$osArch")
|
|
}
|
|
}
|
|
|
|
task dist_compiler(type: Copy) {
|
|
dependsOn ':backend.native:jars'
|
|
dependsOn ':tools:helpers:jar'
|
|
|
|
destinationDir file('dist')
|
|
|
|
from(project(':backend.native').file('build/libs')) {
|
|
into('konan/lib')
|
|
}
|
|
|
|
from(project('Interop').file('Runtime/build/libs')) {
|
|
into('konan/lib')
|
|
}
|
|
|
|
from(project('Interop').file('Indexer/build/libs')) {
|
|
into('konan/lib')
|
|
}
|
|
|
|
from(project('Interop').file('StubGenerator/build/libs')) {
|
|
into('konan/lib')
|
|
}
|
|
|
|
from(project(':backend.native').file('build/external_jars')) {
|
|
into('konan/lib')
|
|
}
|
|
|
|
from(project(':backend.native').file('build/nativelibs')) {
|
|
into('konan/nativelib')
|
|
}
|
|
|
|
from(project(':Interop').file('Indexer/build/nativelibs')) {
|
|
into('konan/nativelib')
|
|
}
|
|
|
|
from(project(':Interop').file('Runtime/build/nativelibs')) {
|
|
into('konan/nativelib')
|
|
}
|
|
|
|
from(file('cmd')) {
|
|
fileMode(0755)
|
|
into('bin')
|
|
}
|
|
from(project(':backend.native').file('konan.properties')) {
|
|
into('konan')
|
|
}
|
|
|
|
from("$llvmDir/lib") {
|
|
into('konan/nativelib')
|
|
include '**/libclang.*'
|
|
includeEmptyDirs = false
|
|
}
|
|
|
|
// TODO: check if we use native libraries copied to dist (see above) or not.
|
|
from(project(':tools:helpers').file('build/libs')) {
|
|
into('konan/lib')
|
|
}
|
|
|
|
doLast {
|
|
// MacOS System Integrity Protection strips DYLD_LIBRARY_PATH from
|
|
// environment of all the binaries residing in /bin /usr/bin etc.
|
|
// That means /usr/bin/java can't use DYLD_LIBRARY_PATH to pick up
|
|
// rpath'ed libraries.
|
|
// See dyld(1), install_name_tool(1) for rpath details.
|
|
|
|
if (isMac()) {
|
|
exec {
|
|
commandLine "install_name_tool"
|
|
args '-add_rpath', '@loader_path/',
|
|
'dist/konan/nativelib/libclangstubs.dylib'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
task list_dist(type: Exec) {
|
|
commandLine 'find', 'dist'
|
|
}
|
|
|
|
task dist_runtime(type: Copy) {
|
|
dependsOn ':runtime:hostRuntime'
|
|
dependsOn ':backend.native:hostStdlib'
|
|
dependsOn ':backend.native:hostStart'
|
|
|
|
destinationDir file('dist')
|
|
|
|
from(project(':runtime').file('build')) {
|
|
include('*/*.bc')
|
|
into('lib')
|
|
}
|
|
}
|
|
|
|
task cross_dist_runtime(type: Copy) {
|
|
dependsOn.addAll(targetList.collect { ":runtime:${it}Runtime" })
|
|
dependsOn.addAll(targetList.collect { ":backend.native:${it}Stdlib" })
|
|
dependsOn.addAll(targetList.collect { ":backend.native:${it}Start" })
|
|
|
|
destinationDir file('dist')
|
|
|
|
from(project(':runtime').file('build')) {
|
|
include('*/*.bc')
|
|
into('lib')
|
|
}
|
|
}
|
|
|
|
task dist {
|
|
dependsOn 'dist_compiler', 'dist_runtime'
|
|
}
|
|
|
|
task cross_dist {
|
|
dependsOn 'cross_dist_runtime', 'dist_compiler'
|
|
}
|
|
|
|
task bundle(type: Tar) {
|
|
dependsOn('cross_dist')
|
|
from("$project.rootDir/dist") {
|
|
include '**'
|
|
into 'kotlin-native'
|
|
}
|
|
from(project.rootDir) {
|
|
include 'samples/**'
|
|
into 'kotlin-native'
|
|
}
|
|
baseName = 'kotlin-native'
|
|
appendix = simpleOsName()
|
|
destinationDir = file('.')
|
|
extension = 'tgz'
|
|
compression = Compression.GZIP
|
|
}
|
|
|
|
task demo(type: Exec) {
|
|
dependsOn 'dist'
|
|
|
|
commandLine './dist/bin/konanc', 'backend.native/tests/runtime/collections/moderately_large_array.kt', '-o', 'build/demo.kexe'
|
|
}
|
|
|
|
task clean {
|
|
doLast {
|
|
delete 'dist'
|
|
delete bundle.outputs.files
|
|
}
|
|
}
|
|
|