No colon cinterop flags (#428)

* Taught cinterop a 'host' target.

* Last minute switch from -foo:bar flags to -foo bar flags in cinterop tool.
This commit is contained in:
alexander-gorshenev
2017-03-31 10:20:29 +03:00
committed by Nikolay Igotti
parent b2a57e7cb3
commit c9c9aee7bb
11 changed files with 63 additions and 66 deletions
+2 -2
View File
@@ -24,7 +24,7 @@ Build the dependencies and the compiler (see `README.md`).
Prepare stubs for the system sockets library: Prepare stubs for the system sockets library:
cd samples/socket cd samples/socket
../../dist/bin/cinterop -def:sockets.def -o:sockets.kt.bc ../../dist/bin/cinterop -def sockets.def -o sockets.kt.bc
Compile the echo server: Compile the echo server:
@@ -57,7 +57,7 @@ Structurally it's a simple property file, looking like this:
Then run `cinterop` tool with something like (note that for host libraries not included Then run `cinterop` tool with something like (note that for host libraries not included
in sysroot search paths for headers may be needed): in sysroot search paths for headers may be needed):
cinterop -def:zlib.def -copt:-I/opt/local/include -o:zlib.kt.bc cinterop -def zlib.def -copt -I/opt/local/include -o zlib.kt.bc
This command will produce `zlib.kt.bc` compiled library and This command will produce `zlib.kt.bc` compiled library and
`zlib.kt.bc-build/kotlin` directory containing Kotlin source code for the library. `zlib.kt.bc-build/kotlin` directory containing Kotlin source code for the library.
@@ -34,7 +34,23 @@ fun main(args: Array<String>) {
"os" to (System.getenv("TARGET_OS") ?: detectHost()) "os" to (System.getenv("TARGET_OS") ?: detectHost())
) )
processLib(konanHome, substitutions, args.asList()) processLib(konanHome, substitutions, parseArgs(args))
}
private fun parseArgs(args: Array<String>): Map<String, List<String>> {
val commandLine = mutableMapOf<String, MutableList<String>>()
for(index in 0..args.size-1 step 2) {
val key = args[index]
if (key[0] != '-') {
throw IllegalArgumentException("Expected a flag with initial dash: $key")
}
if (index+1 == args.size) {
throw IllegalArgumentException("Expected an value after $key")
}
val value = args[index+1]
commandLine[key] ?. add(value) ?: commandLine.put(key, mutableListOf(value))
}
return commandLine
} }
private fun detectHost(): String { private fun detectHost(): String {
@@ -53,6 +69,7 @@ private fun detectHost(): String {
private fun defaultTarget() = detectHost() private fun defaultTarget() = detectHost()
private val knownTargets = mapOf( private val knownTargets = mapOf(
"host" to defaultTarget(),
"linux" to "linux", "linux" to "linux",
"macbook" to "osx", "macbook" to "osx",
"iphone" to "osx-ios", "iphone" to "osx-ios",
@@ -83,24 +100,6 @@ private fun substitute(properties: Properties, substitutions: Map<String, String
} }
} }
private fun getArgPrefix(arg: String): String {
val index = arg.indexOf(':')
if (index == -1) {
return ""
} else {
return arg.substring(0, index)
}
}
private fun dropPrefix(arg: String): String {
val index = arg.indexOf(':')
if (index == -1) {
return ""
} else {
return arg.substring(index + 1)
}
}
private fun ProcessBuilder.runExpectingSuccess() { private fun ProcessBuilder.runExpectingSuccess() {
val res = this.start().waitFor() val res = this.start().waitFor()
if (res != 0) { if (res != 0) {
@@ -257,23 +256,21 @@ private fun loadProperties(file: File?, substitutions: Map<String, String>): Pro
private fun usage() { private fun usage() {
println(""" println("""
Run interop tool with -def:<def_file_for_lib>.def Run interop tool with -def <def_file_for_lib>.def
Following flags are supported: Following flags are supported:
-def:<file>.def specifies library definition file -def <file>.def specifies library definition file
-copt:<c compiler flags> specifies flags passed to clang -copt <c compiler flags> specifies flags passed to clang
-lopt:<linker flags> specifies flags passed to linker -lopt <linker flags> specifies flags passed to linker
-verbose increases verbosity -verbose <boolean> increases verbosity
-shims adds generation of shims tracing native library calls -shims <boolean> adds generation of shims tracing native library calls
-pkg:<fully qualified package name> -pkg <fully qualified package name> place the resulting definitions into the package
-h:<file>.h header files to parse -h <file>.h header files to parse
""") """)
} }
private fun processLib(konanHome: String, private fun processLib(konanHome: String,
substitutions: Map<String, String>, substitutions: Map<String, String>,
commandArgs: List<String>) { args: Map<String, List<String>>) {
val args = commandArgs.groupBy ({ getArgPrefix(it) }, { dropPrefix(it) }) // TODO
val userDir = System.getProperty("user.dir") val userDir = System.getProperty("user.dir")
val ktGenRoot = args["-generated"]?.single() ?: userDir val ktGenRoot = args["-generated"]?.single() ?: userDir
+2 -2
View File
@@ -39,6 +39,6 @@ For some tests, use:
To generate interoperability stubs create library definition file To generate interoperability stubs create library definition file
(take a look on `samples/tetris/tetris.sdl`) and run `cinterop` tool like this: (take a look on `samples/tetris/tetris.sdl`) and run `cinterop` tool like this:
cinterop -def:lib.def cinterop -def lib.def
See provided samples and `INTEROP.md` for more details. See provided samples and `INTEROP.md` for more details.
@@ -206,42 +206,42 @@ class NamedNativeInteropConfig implements Named {
linkerOpts += linkFiles.files linkerOpts += linkFiles.files
args "-properties:" + project.findProject(":backend.native").file("konan.properties") args '-properties', project.findProject(":backend.native").file("konan.properties")
args "-generated:" + generatedSrcDir args '-generated', generatedSrcDir
args "-natives:" + nativeLibsDir args '-natives', nativeLibsDir
args "-flavor:" + this.flavor args '-flavor', this.flavor
// Uncomment to debug. // Uncomment to debug.
// args "-verbose:true" // args '-verbose', 'true'
if (defFile != null) { if (defFile != null) {
args "-def:" + project.file(defFile) args '-def', project.file(defFile)
} }
if (pkg != null) { if (pkg != null) {
args "-pkg:" + pkg args '-pkg', pkg
} }
if (linker != null) { if (linker != null) {
args "-linker:" + linker args '-linker', linker
} }
if (target != null) { if (target != null) {
args "-target:" + target args '-target', target
} }
// TODO: the interop plugin should probably be reworked to execute clang from build scripts directly // TODO: the interop plugin should probably be reworked to execute clang from build scripts directly
environment['PATH'] = project.files(project.clangPath).asPath + environment['PATH'] = project.files(project.clangPath).asPath +
File.pathSeparator + environment['PATH'] File.pathSeparator + environment['PATH']
args compilerOpts.collect { "-copt:$it" } args compilerOpts.collectMany { ['-copt', it] }
args linkerOpts.collect { "-lopt:$it" } args linkerOpts.collectMany { ['-lopt', it] }
headers.each { headers.each {
args "-h:$it" args '-h', it
} }
if (project.hasProperty("shims")) { if (project.hasProperty('shims')) {
args "-shims:$project.ext.shims" args '-shims', project.ext.shims
} }
} }
+12 -12
View File
@@ -37,13 +37,13 @@ while [ $# -gt 0 ]; do
java_args=("${java_args[@]}" "${1:2}") java_args=("${java_args[@]}" "${1:2}")
shift shift
;; ;;
-o:*) -o)
OUTPUT_FILE_NAME="${1:3}" OUTPUT_FILE_NAME="$2"
shift shift 2
;; ;;
-target:*) -target)
TARGET="${1:8}" TARGET="$2"
shift shift 2
;; ;;
*) *)
interop_args=("${interop_args[@]}" "$1") interop_args=("${interop_args[@]}" "$1")
@@ -76,22 +76,22 @@ HELPERS_JAR="${KONAN_HOME}/konan/lib/helpers.jar"
INTEROP_CLASSPATH="$STUB_GENERATOR_JAR:$KOTLIN_JAR:$INTEROP_INDEXER_JAR:$INTEROP_RUNTIME_JAR:$HELPERS_JAR" INTEROP_CLASSPATH="$STUB_GENERATOR_JAR:$KOTLIN_JAR:$INTEROP_INDEXER_JAR:$INTEROP_RUNTIME_JAR:$HELPERS_JAR"
INTEROP_TOOL=org.jetbrains.kotlin.native.interop.gen.jvm.MainKt INTEROP_TOOL=org.jetbrains.kotlin.native.interop.gen.jvm.MainKt
FLAVOR_ARG=-flavor:native FLAVOR_ARG="-flavor native"
GENERATED_DIR="$OUTPUT_FILE_NAME-build/kotlin" GENERATED_DIR="$OUTPUT_FILE_NAME-build/kotlin"
GENERATED_ARG="-generated:$GENERATED_DIR" GENERATED_ARG="-generated $GENERATED_DIR"
NATIVES_DIR="$OUTPUT_FILE_NAME-build/natives" NATIVES_DIR="$OUTPUT_FILE_NAME-build/natives"
NATIVES_ARG="-natives:$NATIVES_DIR" NATIVES_ARG="-natives $NATIVES_DIR"
CSTUBSNAME=cstubs CSTUBSNAME=cstubs
CSTUBSNAME_ARG="-cstubsname:$CSTUBSNAME" CSTUBSNAME_ARG="-cstubsname $CSTUBSNAME"
LIBCLANG_DISABLE_CRASH_RECOVERY=1 \ LIBCLANG_DISABLE_CRASH_RECOVERY=1 \
LD_LIBRARY_PATH=${NATIVE_LIB} \ LD_LIBRARY_PATH=${NATIVE_LIB} \
$JAVACMD $JAVA_OPTS ${java_args[@]} \ $JAVACMD $JAVA_OPTS ${java_args[@]} \
-cp $INTEROP_CLASSPATH \ -cp $INTEROP_CLASSPATH \
$INTEROP_TOOL \ $INTEROP_TOOL \
"$GENERATED_ARG" "$NATIVES_ARG" "$CSTUBSNAME_ARG" \ $GENERATED_ARG $NATIVES_ARG $CSTUBSNAME_ARG \
$FLAVOR_ARG -target:$TARGET "${interop_args[@]}" \ $FLAVOR_ARG -target $TARGET "${interop_args[@]}" \
|| exit 1 || exit 1
# Stubs may be rather big, so we may need more heap space. # Stubs may be rather big, so we may need more heap space.
+1 -1
View File
@@ -18,5 +18,5 @@ LINKER_ARGS=${!var}
var=COMPILER_ARGS_${TARGET} var=COMPILER_ARGS_${TARGET}
COMPILER_ARGS=${!var} # add -opt for an optimized build. COMPILER_ARGS=${!var} # add -opt for an optimized build.
cinterop -def:$DIR/stdio.def -copt:"$CFLAGS" -target:$TARGET -o:stdio.kt.bc || exit 1 cinterop -def $DIR/stdio.def -copt "$CFLAGS" -target $TARGET -o stdio.kt.bc || exit 1
konanc $COMPILER_ARGS -target $TARGET $DIR/CsvParser.kt -library stdio.kt.bc -o CsvParser.kexe || exit 1 konanc $COMPILER_ARGS -target $TARGET $DIR/CsvParser.kt -library stdio.kt.bc -o CsvParser.kexe || exit 1
+1 -1
View File
@@ -23,5 +23,5 @@ LINKER_ARGS=${!var}
var=COMPILER_ARGS_${TARGET} var=COMPILER_ARGS_${TARGET}
COMPILER_ARGS=${!var} # add -opt for an optimized build. COMPILER_ARGS=${!var} # add -opt for an optimized build.
cinterop -copt:$CFLAGS -def:$DIR/libgit2.def -target:$TARGET -o:libgit2.kt.bc || exit 1 cinterop -copt $CFLAGS -def $DIR/libgit2.def -target $TARGET -o libgit2.kt.bc || exit 1
konanc -target $TARGET src -library libgit2.kt.bc -linkerArgs "$LINKER_ARGS" -o GitChurn.kexe || exit 1 konanc -target $TARGET src -library libgit2.kt.bc -linkerArgs "$LINKER_ARGS" -o GitChurn.kexe || exit 1
+1 -1
View File
@@ -23,5 +23,5 @@ LINKER_ARGS=${!var}
var=COMPILER_ARGS_${TARGET} var=COMPILER_ARGS_${TARGET}
COMPILER_ARGS=${!var} # add -opt for an optimized build. COMPILER_ARGS=${!var} # add -opt for an optimized build.
cinterop -copt:"$CFLAGS" -copt:-I. -def:$DIR/libcurl.def -target:$TARGET -o:libcurl.bc || exit 1 cinterop -copt "$CFLAGS" -copt -I. -def $DIR/libcurl.def -target $TARGET -o libcurl.bc || exit 1
konanc -target $TARGET src -library libcurl.bc -linkerArgs "$LINKER_ARGS" -o Curl.kexe || exit 1 konanc -target $TARGET src -library libcurl.bc -linkerArgs "$LINKER_ARGS" -o Curl.kexe || exit 1
+1 -1
View File
@@ -21,5 +21,5 @@ LINKER_ARGS=${!var}
var=COMPILER_ARGS_${TARGET} var=COMPILER_ARGS_${TARGET}
COMPILER_ARGS=${!var} # add -opt for an optimized build. COMPILER_ARGS=${!var} # add -opt for an optimized build.
cinterop -def:$DIR/opengl.def -target:$TARGET -o:opengl.kt.bc || exit 1 cinterop -def $DIR/opengl.def -target $TARGET -o opengl.kt.bc || exit 1
konanc -target $TARGET $DIR/OpenGlTeapot.kt -library opengl.kt.bc -linkerArgs "$LINKER_ARGS" -o OpenGlTeapot.kexe || exit 1 konanc -target $TARGET $DIR/OpenGlTeapot.kt -library opengl.kt.bc -linkerArgs "$LINKER_ARGS" -o OpenGlTeapot.kexe || exit 1
+1 -1
View File
@@ -18,5 +18,5 @@ LINKER_ARGS=${!var}
var=COMPILER_ARGS_${TARGET} var=COMPILER_ARGS_${TARGET}
COMPILER_ARGS=${!var} # add -opt for an optimized build. COMPILER_ARGS=${!var} # add -opt for an optimized build.
cinterop -def:$DIR/sockets.def -copt:"$CFLAGS" -target:$TARGET -o:sockets.kt.bc || exit 1 cinterop -def $DIR/sockets.def -copt "$CFLAGS" -target $TARGET -o sockets.kt.bc || exit 1
konanc $COMPILER_ARGS -target $TARGET $DIR/EchoServer.kt -library sockets.kt.bc -o EchoServer.kexe || exit 1 konanc $COMPILER_ARGS -target $TARGET $DIR/EchoServer.kt -library sockets.kt.bc -o EchoServer.kexe || exit 1
+1 -1
View File
@@ -39,6 +39,6 @@ LINKER_ARGS=${!var}
var=COMPILER_ARGS_${TARGET} var=COMPILER_ARGS_${TARGET}
COMPILER_ARGS=${!var} # add -opt for an optimized build. COMPILER_ARGS=${!var} # add -opt for an optimized build.
cinterop -def:$DIR/sdl.def -copt:"$CFLAGS" -target:$TARGET -o:sdl.kt.bc || exit 1 cinterop -def $DIR/sdl.def -copt "$CFLAGS" -target $TARGET -o sdl.kt.bc || exit 1
konanc $COMPILER_ARGS -target $TARGET $DIR/Tetris.kt -library sdl.kt.bc -linkerArgs "$LINKER_ARGS" -o Tetris.kexe || exit 1 konanc $COMPILER_ARGS -target $TARGET $DIR/Tetris.kt -library sdl.kt.bc -linkerArgs "$LINKER_ARGS" -o Tetris.kexe || exit 1
#strip Tetris.kexe #strip Tetris.kexe