aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2014-03-29 13:16:50 +0100
committerJakob Odersky <jodersky@gmail.com>2014-03-29 13:16:50 +0100
commitf34d5ccc120d2d2014a052966b183da7383bdc61 (patch)
treef70243e9f6c48cb4c5034c17c9c705f4741a257b
parentc0c3647bbf64af754d3cc9b6d167c8ca2b736f74 (diff)
downloadakka-serial-f34d5ccc120d2d2014a052966b183da7383bdc61.tar.gz
akka-serial-f34d5ccc120d2d2014a052966b183da7383bdc61.tar.bz2
akka-serial-f34d5ccc120d2d2014a052966b183da7383bdc61.zip
remove sbt native build and flow-pack
-rw-r--r--flow/src/main/java/com/github/jodersky/flow/internal/NativeSerial.java2
-rw-r--r--flow/src/main/native/include/com_github_jodersky_flow_internal_NativeSerial.h83
-rw-r--r--flow/src/main/native/include/flow.h90
-rw-r--r--flow/src/main/native/posix/Makefile27
-rw-r--r--flow/src/main/native/posix/flow.c247
-rw-r--r--flow/src/main/native/posix/flow_jni.c169
-rw-r--r--flow/src/main/native/windows/README1
-rw-r--r--flow/src/main/native/windows/flow.c.disabled416
-rw-r--r--flow/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala40
-rw-r--r--project/Dependencies.scala3
-rw-r--r--project/FlowBuild.scala110
-rw-r--r--project/native.scala133
-rw-r--r--project/nativepack.scala37
13 files changed, 6 insertions, 1352 deletions
diff --git a/flow/src/main/java/com/github/jodersky/flow/internal/NativeSerial.java b/flow/src/main/java/com/github/jodersky/flow/internal/NativeSerial.java
index ec058da..22306e0 100644
--- a/flow/src/main/java/com/github/jodersky/flow/internal/NativeSerial.java
+++ b/flow/src/main/java/com/github/jodersky/flow/internal/NativeSerial.java
@@ -25,7 +25,7 @@ import com.github.jodersky.flow.PortInterruptedException;
final class NativeSerial {
static {
- NativeLoader.load();
+ System.loadLibrary("flow3");
}
final static int PARITY_NONE = 0;
diff --git a/flow/src/main/native/include/com_github_jodersky_flow_internal_NativeSerial.h b/flow/src/main/native/include/com_github_jodersky_flow_internal_NativeSerial.h
deleted file mode 100644
index 04364fb..0000000
--- a/flow/src/main/native/include/com_github_jodersky_flow_internal_NativeSerial.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class com_github_jodersky_flow_internal_NativeSerial */
-
-#ifndef _Included_com_github_jodersky_flow_internal_NativeSerial
-#define _Included_com_github_jodersky_flow_internal_NativeSerial
-#ifdef __cplusplus
-extern "C" {
-#endif
-#undef com_github_jodersky_flow_internal_NativeSerial_PARITY_NONE
-#define com_github_jodersky_flow_internal_NativeSerial_PARITY_NONE 0L
-#undef com_github_jodersky_flow_internal_NativeSerial_PARITY_ODD
-#define com_github_jodersky_flow_internal_NativeSerial_PARITY_ODD 1L
-#undef com_github_jodersky_flow_internal_NativeSerial_PARITY_EVEN
-#define com_github_jodersky_flow_internal_NativeSerial_PARITY_EVEN 2L
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: open
- * Signature: (Ljava/lang/String;IIZI)J
- */
-JNIEXPORT jlong JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_open
- (JNIEnv *, jclass, jstring, jint, jint, jboolean, jint);
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: readDirect
- * Signature: (JLjava/nio/ByteBuffer;)I
- */
-JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_readDirect
- (JNIEnv *, jclass, jlong, jobject);
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: read
- * Signature: (J[B)I
- */
-JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_read
- (JNIEnv *, jclass, jlong, jbyteArray);
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: cancelRead
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_cancelRead
- (JNIEnv *, jclass, jlong);
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: writeDirect
- * Signature: (JLjava/nio/ByteBuffer;I)I
- */
-JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_writeDirect
- (JNIEnv *, jclass, jlong, jobject, jint);
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: write
- * Signature: (J[BI)I
- */
-JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_write
- (JNIEnv *, jclass, jlong, jbyteArray, jint);
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: close
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_close
- (JNIEnv *, jclass, jlong);
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: debug
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_debug
- (JNIEnv *, jclass, jboolean);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/flow/src/main/native/include/flow.h b/flow/src/main/native/include/flow.h
deleted file mode 100644
index ff80259..0000000
--- a/flow/src/main/native/include/flow.h
+++ /dev/null
@@ -1,90 +0,0 @@
-#ifndef FLOW_H
-#define FLOW_H
-
-#include <stdbool.h>
-#include <stddef.h>
-
-#ifdef _cplusplus
-extern "C" {
-#endif
-
-//general error codes that are returned by functions
-#define E_IO -1 //IO error
-#define E_ACCESS_DENIED -2 //access denied
-#define E_BUSY -3 // port is busy
-#define E_INVALID_SETTINGS -4 // some port settings are invalid
-#define E_INTERRUPT -5 // not really an error, function call aborted because port is closed
-#define E_NO_PORT -6 //requested port does not exist
-
-#define PARITY_NONE 0
-#define PARITY_ODD 1
-#define PARITY_EVEN 2
-
-/** Contains internal configuration of an open serial port. */
-struct serial_config;
-
-/**Opens a serial port and allocates memory for storing configuration. Note: if this function fails,
- * any internally allocated resources will be freed.
- * @param port_name name of port
- * @param baud baud rate
- * @param char_size character size of data transmitted through serial device
- * @param two_stop_bits set to use two stop bits instead of one
- * @param parity kind of parity checking to use
- * @param serial pointer to memory that will be allocated with a serial structure
- * @return 0 on success
- * @return E_NO_PORT if the given port does not exist
- * @return E_ACCESS_DENIED if permissions are not sufficient to open port
- * @return E_BUSY if port is already in use
- * @return E_INVALID_SETTINGS if any of the specified settings are invalid
- * @return E_IO on other error */
-int serial_open(
- const char* port_name,
- int baud,
- int char_size,
- bool two_stop_bits,
- int parity,
- struct serial_config** const serial);
-
-/**Closes a previously opened serial port and frees memory containing the configuration. Note: after a call to
- * this function, the 'serial' pointer will become invalid, make sure you only call it once. This function is NOT
- * thread safe, make sure no read or write is in prgress when this function is called (the reason is that per
- * close manual page, close should not be called on a file descriptor that is in use by another thread).
- * @param serial pointer to serial configuration that is to be closed (and freed)
- * @return 0 on success
- * @return E_IO on error */
-int serial_close(struct serial_config* const serial);
-
-/**Starts a read from a previously opened serial port. The read is blocking, however it may be
- * interrupted by calling 'serial_cancel_read' on the given serial port.
- * @param serial pointer to serial configuration from which to read
- * @param buffer buffer into which data is read
- * @param size maximum buffer size
- * @return n>0 the number of bytes read into buffer
- * @return E_INTERRUPT if the call to this function was interrupted
- * @return E_IO on IO error */
-int serial_read(struct serial_config* const serial, char* const buffer, size_t size);
-
-/**Cancels a blocked read call. This function is thread safe, i.e. it may be called from a thread even
- * while another thread is blocked in a read call.
- * @param serial_config the serial port to interrupt
- * @return 0 on success
- * @return E_IO on error */
-int serial_cancel_read(struct serial_config* const serial);
-
-/**Writes data to a previously opened serial port. Non bocking.
- * @param serial pointer to serial configuration to which to write
- * @param data data to write
- * @param size number of bytes to write from data
- * @return n>0 the number of bytes written
- * @return E_IO on IO error */
-int serial_write(struct serial_config* const serial, char* const data, size_t size);
-
-/**Sets debugging option. If debugging is enabled, detailed error message are printed from method calls. */
-void serial_debug(bool value);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* FLOW_H */
diff --git a/flow/src/main/native/posix/Makefile b/flow/src/main/native/posix/Makefile
deleted file mode 100644
index 22338e5..0000000
--- a/flow/src/main/native/posix/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-# Build native binaries for flow.
-# This makefile is intended for linux-based operating systems.
-
-TARGET?=libflow.so
-MAJOR_VERSION=2
-
-CC=$(CROSS_COMPILE)gcc
-CFLAGS= -O2 -fPIC -Wall
-LD=$(CROSS_COMPILE)ld
-LDFLAGS=-shared -Wl,-soname,$(TARGET).$(MAJOR_VERSION)
-INCLUDES?=../include/ /usr/lib/jvm/java-7-oracle/include/ /usr/lib/jvm/java-7-oracle/include/linux/
-
-OBJECTS=flow.o flow_jni.o
-
-all: $(TARGET)
-
-$(TARGET): $(OBJECTS)
- $(CC) $(LDFLAGS) -o $@ $^
-
-%.o: %.c
- $(CC) $(CFLAGS) $(addprefix -I, $(INCLUDES)) -o $@ -c $<
-
-clean:
- rm -f *.o
- rm -f *.so
-
-.PHONY: clean
diff --git a/flow/src/main/native/posix/flow.c b/flow/src/main/native/posix/flow.c
deleted file mode 100644
index 7f7d54b..0000000
--- a/flow/src/main/native/posix/flow.c
+++ /dev/null
@@ -1,247 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <errno.h>
-#include <termios.h>
-#include <fcntl.h>
-#include <sys/file.h>
-#include "flow.h"
-
-
-#define DATA_CANCEL 0xffffffff
-
-static bool debug = false;
-#define DEBUG(f) if (debug) {f}
-
-void serial_debug(bool value) {
- debug = value;
-}
-
-//contains file descriptors used in managing a serial port
-struct serial_config {
- int port_fd; // file descriptor of serial port
-
- /* a pipe is used to abort a serial read by writing something into the
- * write end of the pipe */
- int pipe_read_fd; // file descriptor, read end of pipe
- int pipe_write_fd; // file descriptor, write end of pipe
-};
-
-int serial_open(
- const char* const port_name,
- int baud,
- int char_size,
- bool two_stop_bits,
- int parity,
- struct serial_config** serial) {
-
- int fd = open(port_name, O_RDWR | O_NOCTTY | O_NONBLOCK);
-
- if (fd < 0) {
- int en = errno;
- DEBUG(perror("error obtaining port file descriptor"););
- if (en == EACCES) return E_ACCESS_DENIED;
- if (en == ENOENT) return E_NO_PORT;
- return E_IO;
- }
-
- if (flock(fd, LOCK_EX | LOCK_NB) < 0) {
- DEBUG(perror("error acquiring lock on port"););
- close(fd);
- return E_BUSY;
- }
-
- /* configure new port settings */
- struct termios newtio;
-
- /* following calls correspond to makeraw() */
- newtio.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
- newtio.c_oflag &= ~OPOST;
- newtio.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
- newtio.c_cflag &= ~(CSIZE | PARENB);
-
- /* set speed */
- speed_t bd;
- switch (baud) {
- case 50: bd = B50; break;
- case 75: bd = B75; break;
- case 110: bd = B110; break;
- case 134: bd = B134; break;
- case 150: bd = B150; break;
- case 200: bd = B200; break;
- case 300: bd = B300; break;
- case 600: bd = B600; break;
- case 1200: bd = B1200; break;
- case 1800: bd = B1800; break;
- case 2400: bd = B2400; break;
- case 4800: bd = B4800; break;
- case 9600: bd = B9600; break;
- case 19200: bd = B19200; break;
- case 38400: bd = B38400; break;
- case 57600: bd = B57600; break;
- case 115200: bd = B115200; break;
- case 230400: bd = B230400; break;
- default:
- close(fd);
- DEBUG(fprintf(stderr, "invalid baud rate %d\n", baud););
- return E_INVALID_SETTINGS;
- }
-
- if (cfsetspeed(&newtio, bd) < 0) {
- DEBUG(perror("error setting baud rate"););
- close(fd);
- return E_IO;
- }
-
- /* set char size*/
- switch (char_size) {
- case 5: newtio.c_cflag |= CS5; break;
- case 6: newtio.c_cflag |= CS6; break;
- case 7: newtio.c_cflag |= CS7; break;
- case 8: newtio.c_cflag |= CS8; break;
- default:
- close(fd);
- DEBUG(fprintf(stderr, "invalid character size %d\n", char_size););
- return E_INVALID_SETTINGS;
- }
-
- /* use two stop bits */
- if (two_stop_bits){
- newtio.c_cflag |= CSTOPB;
- }
-
- /* set parity */
- switch (parity) {
- case PARITY_NONE: break;
- case PARITY_ODD: newtio.c_cflag |= (PARENB | PARODD); break;
- case PARITY_EVEN: newtio.c_cflag |= PARENB; break;
- default:
- close(fd);
- DEBUG(fprintf(stderr, "invalid parity %d\n", parity););
- return E_INVALID_SETTINGS;
- }
-
- if (tcflush(fd, TCIOFLUSH) < 0) {
- DEBUG(perror("error flushing serial settings"););
- close(fd);
- return E_IO;
- }
-
- if (tcsetattr(fd, TCSANOW, &newtio) < 0) {
- DEBUG(perror("error applying serial settings"););
- close(fd);
- return E_IO;
- }
-
- int pipe_fd[2];
- if (pipe(pipe_fd) < 0) {
- DEBUG(perror("error opening pipe"););
- close(fd);
- return E_IO;
- }
-
- if (fcntl(pipe_fd[0], F_SETFL, O_NONBLOCK) < 0 || fcntl(pipe_fd[1], F_SETFL, O_NONBLOCK) < 0) {
- DEBUG(perror("error setting pipe to non-blocking"););
- close(fd);
- close(pipe_fd[0]);
- close(pipe_fd[1]);
- return E_IO;
- }
-
- struct serial_config* s = malloc(sizeof(s));
- if (s == NULL) {
- DEBUG(perror("error allocating memory for serial configuration"););
- close(fd);
- close(pipe_fd[0]);
- close(pipe_fd[1]);
- return E_IO;
- }
-
- s->port_fd = fd;
- s->pipe_read_fd = pipe_fd[0];
- s->pipe_write_fd = pipe_fd[1];
- (*serial) = s;
-
- return 0;
-}
-
-
-int serial_close(struct serial_config* const serial) {
- if (close(serial->pipe_write_fd) < 0) {
- DEBUG(perror("error closing write end of pipe"););
- return E_IO;
- }
- if (close(serial->pipe_read_fd) < 0) {
- DEBUG(perror("error closing read end of pipe"););
- return E_IO;
- }
-
- if (flock(serial->port_fd, LOCK_UN) < 0){
- DEBUG(perror("error releasing lock on port"););
- return E_IO;
- }
- if (close(serial->port_fd) < 0) {
- DEBUG(perror("error closing port"););
- return E_IO;
- }
-
- free(serial);
- return 0;
-}
-
-int serial_read(struct serial_config* const serial, char* const buffer, size_t size) {
- int port = serial->port_fd;
- int pipe = serial->pipe_read_fd;
-
- fd_set rfds;
- FD_ZERO(&rfds);
- FD_SET(port, &rfds);
- FD_SET(pipe, &rfds);
-
- int nfds = pipe + 1;
- if (pipe < port) nfds = port + 1;
-
- int n = select(nfds, &rfds, NULL, NULL, NULL);
- if (n < 0) {
- DEBUG(perror("error trying to call select on port and pipe"););
- return E_IO;
- }
-
- if (FD_ISSET(pipe, &rfds)) {
- return E_INTERRUPT;
- } else if (FD_ISSET(port, &rfds)) {
- int r = read(port, buffer, size);
-
- //treat 0 bytes read as an error to avoid problems on disconnect
- //anyway, after a poll there should be more than 0 bytes available to read
- if (r <= 0) {
- DEBUG(perror("error data not available after select"););
- return E_IO;
- }
- return r;
- } else {
- fprintf(stderr, "select returned unknown read sets\n");
- return E_IO;
- }
-}
-
-int serial_cancel_read(struct serial_config* const serial) {
- int data = DATA_CANCEL;
-
- //write to pipe to wake up any blocked read thread (self-pipe trick)
- if (write(serial->pipe_write_fd, &data, 1) < 0) {
- DEBUG(perror("error writing to pipe during read cancel"););
- return E_IO;
- }
-
- return 0;
-}
-
-int serial_write(struct serial_config* const serial, char* const data, size_t size) {
- int r = write(serial->port_fd, data, size);
- if (r < 0) {
- DEBUG(perror("error writing to port"););
- return E_IO;
- }
- return r;
-} \ No newline at end of file
diff --git a/flow/src/main/native/posix/flow_jni.c b/flow/src/main/native/posix/flow_jni.c
deleted file mode 100644
index 8ec2aed..0000000
--- a/flow/src/main/native/posix/flow_jni.c
+++ /dev/null
@@ -1,169 +0,0 @@
-#include "flow.h"
-#include "com_github_jodersky_flow_internal_NativeSerial.h"
-
-
-static inline void throwException(JNIEnv* env, const char* const exception, const char * const message) {
- (*env)->ThrowNew(env, (*env)->FindClass(env, exception), message);
-}
-
-static inline void check(JNIEnv* env, int id) {
- switch (id) {
- case E_IO: throwException(env, "java/io/IOException", ""); break;
- case E_BUSY: throwException(env, "com/github/jodersky/flow/PortInUseException", ""); break;
- case E_ACCESS_DENIED: throwException(env, "com/github/jodersky/flow/AccessDeniedException", ""); break;
- case E_INVALID_SETTINGS: throwException(env, "com/github/jodersky/flow/InvalidSettingsException", ""); break;
- case E_INTERRUPT: throwException(env, "com/github/jodersky/flow/PortInterruptedException", ""); break;
- case E_NO_PORT: throwException(env, "com/github/jodersky/flow/NoSuchPortException", ""); break;
- default: return;
- }
-}
-
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: open
- * Signature: (Ljava/lang/String;IIZI)J
- */
-JNIEXPORT jlong JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_open
- (JNIEnv *env, jclass clazz, jstring port_name, jint baud, jint char_size, jboolean two_stop_bits, jint parity) {
-
- const char *dev = (*env)->GetStringUTFChars(env, port_name, 0);
- struct serial_config* config;
- int r = serial_open(dev, baud, char_size, two_stop_bits, parity, &config);
- (*env)->ReleaseStringUTFChars(env, port_name, dev);
-
-
- if (r < 0) {
- check(env, r);
- return 0;
- }
-
- long jpointer = (long) config;
- return jpointer;
-
-}
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: readDirect
- * Signature: (JLjava/nio/ByteBuffer;)I
- */
-JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_readDirect
- (JNIEnv *env, jclass clazz, jlong config, jobject buffer) {
-
- char* local_buffer = (char*) (*env)->GetDirectBufferAddress(env, buffer);
- if (local_buffer == NULL) {
- throwException(env, "java/lang/IllegalArgumentException", "ByteBuffer not direct");
- return -1;
- }
- jlong size = (*env)->GetDirectBufferCapacity(env, buffer);
-
- int r = serial_read((struct serial_config*) config, local_buffer, (size_t) size);
- if (r < 0) {
- check(env, r);
- return -1;
- }
- return r;
-
-}
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: read
- * Signature: (J[B)I
- */
-JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_read
- (JNIEnv *env, jclass clazz, jlong config, jbyteArray buffer) {
-
- jsize size = (*env)->GetArrayLength(env, buffer);
- char local_buffer[size];
- int r = serial_read((struct serial_config*) config, local_buffer, size);
- if (r < 0) {
- check(env, r);
- return -1;
- }
-
- (*env)->SetByteArrayRegion(env, buffer, 0, r, (signed char *) local_buffer);
- return r;
-
-}
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: cancelRead
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_cancelRead
- (JNIEnv *env, jclass clazz, jlong config) {
-
- int r = serial_cancel_read((struct serial_config*) config);
- if (r < 0) {
- check(env, r);
- }
-
-}
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: writeDirect
- * Signature: (JLjava/nio/ByteBuffer;I)I
- */
-JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_writeDirect
- (JNIEnv *env, jclass clazz, jlong config, jobject buffer, jint size) {
-
- char* local_buffer = (char *) (*env)->GetDirectBufferAddress(env, buffer);
- if (local_buffer == NULL) {
- throwException(env, "java/lang/IllegalArgumentException", "ByteBuffer not direct");
- return -1;
- }
-
- int r = serial_write((struct serial_config*) config, local_buffer, (size_t) size);
- if (r < 0) {
- check(env, r);
- return -1;
- }
- return r;
-
-}
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: write
- * Signature: (J[BI)I
- */
-JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_write
- (JNIEnv *env, jclass clazz, jlong config, jbyteArray buffer, jint size) {
-
- char* local_buffer = (char*) (*env)->GetByteArrayElements(env, buffer, NULL);
- int r = serial_write((struct serial_config*) config, local_buffer, size);
- (*env)->ReleaseByteArrayElements(env, buffer, (signed char*) local_buffer, JNI_ABORT);
- if (r < 0) {
- check(env, r);
- return -1;
- }
- return r;
-
-}
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: close
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_close
- (JNIEnv *env, jclass clazz, jlong config) {
- int r = serial_close((struct serial_config*) config);
- if (r < 0) {
- check(env, r);
- }
-}
-
-/*
- * Class: com_github_jodersky_flow_internal_NativeSerial
- * Method: debug
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_debug
- (JNIEnv *env, jclass clazz, jboolean value) {
- serial_debug((bool) value);
-} \ No newline at end of file
diff --git a/flow/src/main/native/windows/README b/flow/src/main/native/windows/README
deleted file mode 100644
index 3d24410..0000000
--- a/flow/src/main/native/windows/README
+++ /dev/null
@@ -1 +0,0 @@
-The contents of the file flow.c were found in the avrdude project. They look like they may be a good starting point for serial communication on windows.
diff --git a/flow/src/main/native/windows/flow.c.disabled b/flow/src/main/native/windows/flow.c.disabled
deleted file mode 100644
index 86a267c..0000000
--- a/flow/src/main/native/windows/flow.c.disabled
+++ /dev/null
@@ -1,416 +0,0 @@
-/*
- * avrdude - A Downloader/Uploader for AVR device programmers
- * Copyright (C) 2003, 2004 Martin J. Thomas <mthomas@rhrk.uni-kl.de>
- * Copyright (C) 2006 Joerg Wunsch <j@uriah.heep.sax.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* $Id$ */
-
-/*
- * Native Win32 serial interface for avrdude.
- */
-
-#include "avrdude.h"
-
-#if defined(WIN32NATIVE)
-
-#include <windows.h>
-#include <stdio.h>
-#include <ctype.h> /* for isprint */
-
-#include "serial.h"
-
-long serial_recv_timeout = 5000; /* ms */
-
-#define W32SERBUFSIZE 1024
-
-struct baud_mapping {
- long baud;
- DWORD speed;
-};
-
-/* HANDLE hComPort=INVALID_HANDLE_VALUE; */
-
-static struct baud_mapping baud_lookup_table [] = {
- { 1200, CBR_1200 },
- { 2400, CBR_2400 },
- { 4800, CBR_4800 },
- { 9600, CBR_9600 },
- { 19200, CBR_19200 },
- { 38400, CBR_38400 },
- { 57600, CBR_57600 },
- { 115200, CBR_115200 },
- { 0, 0 } /* Terminator. */
-};
-
-static DWORD serial_baud_lookup(long baud)
-{
- struct baud_mapping *map = baud_lookup_table;
-
- while (map->baud) {
- if (map->baud == baud)
- return map->speed;
- map++;
- }
-
- /*
- * If a non-standard BAUD rate is used, issue
- * a warning (if we are verbose) and return the raw rate
- */
- if (verbose > 0)
- fprintf(stderr, "%s: serial_baud_lookup(): Using non-standard baud rate: %ld",
- progname, baud);
-
- return baud;
-}
-
-
-static BOOL serial_w32SetTimeOut(HANDLE hComPort, DWORD timeout) // in ms
-{
- COMMTIMEOUTS ctmo;
- ZeroMemory (&ctmo, sizeof(COMMTIMEOUTS));
- ctmo.ReadIntervalTimeout = timeout;
- ctmo.ReadTotalTimeoutMultiplier = timeout;
- ctmo.ReadTotalTimeoutConstant = timeout;
-
- return SetCommTimeouts(hComPort, &ctmo);
-}
-
-static int ser_setspeed(union filedescriptor *fd, long baud)
-{
- DCB dcb;
- HANDLE hComPort = (HANDLE)fd->pfd;
-
- ZeroMemory (&dcb, sizeof(DCB));
- dcb.DCBlength = sizeof(DCB);
- dcb.BaudRate = serial_baud_lookup (baud);
- dcb.fBinary = 1;
- dcb.fDtrControl = DTR_CONTROL_DISABLE;
- dcb.fRtsControl = RTS_CONTROL_DISABLE;
- dcb.ByteSize = 8;
- dcb.Parity = NOPARITY;
- dcb.StopBits = ONESTOPBIT;
-
- if (!SetCommState(hComPort, &dcb))
- return -1;
-
- return 0;
-}
-
-
-static int ser_open(char * port, long baud, union filedescriptor *fdp)
-{
- LPVOID lpMsgBuf;
- HANDLE hComPort=INVALID_HANDLE_VALUE;
- char *newname = 0;
-
- /*
- * If the port is of the form "net:<host>:<port>", then
- * handle it as a TCP connection to a terminal server.
- *
- * This is curently not implemented for Win32.
- */
- if (strncmp(port, "net:", strlen("net:")) == 0) {
- fprintf(stderr,
- "%s: ser_open(): network connects are currently not"
- "implemented for Win32 environments\n",
- progname);
- return -1;
- }
-
- if (strncasecmp(port, "com", strlen("com")) == 0) {
-
- // prepend "\\\\.\\" to name, required for port # >= 10
- newname = malloc(strlen("\\\\.\\") + strlen(port) + 1);
-
- if (newname == 0) {
- fprintf(stderr,
- "%s: ser_open(): out of memory\n",
- progname);
- exit(1);
- }
- strcpy(newname, "\\\\.\\");
- strcat(newname, port);
-
- port = newname;
- }
-
- hComPort = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-
- if (hComPort == INVALID_HANDLE_VALUE) {
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- GetLastError(),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR) &lpMsgBuf,
- 0,
- NULL);
- fprintf(stderr, "%s: ser_open(): can't open device \"%s\": %s\n",
- progname, port, (char*)lpMsgBuf);
- LocalFree( lpMsgBuf );
- return -1;
- }
-
- if (!SetupComm(hComPort, W32SERBUFSIZE, W32SERBUFSIZE))
- {
- CloseHandle(hComPort);
- fprintf(stderr, "%s: ser_open(): can't set buffers for \"%s\"\n",
- progname, port);
- return -1;
- }
-
- fdp->pfd = (void *)hComPort;
- if (ser_setspeed(fdp, baud) != 0)
- {
- CloseHandle(hComPort);
- fprintf(stderr, "%s: ser_open(): can't set com-state for \"%s\"\n",
- progname, port);
- return -1;
- }
-
- if (!serial_w32SetTimeOut(hComPort,0))
- {
- CloseHandle(hComPort);
- fprintf(stderr, "%s: ser_open(): can't set initial timeout for \"%s\"\n",
- progname, port);
- return -1;
- }
-
- if (newname != 0) {
- free(newname);
- }
- return 0;
-}
-
-
-static void ser_close(union filedescriptor *fd)
-{
- HANDLE hComPort=(HANDLE)fd->pfd;
- if (hComPort != INVALID_HANDLE_VALUE)
- CloseHandle (hComPort);
-
- hComPort = INVALID_HANDLE_VALUE;
-}
-
-static int ser_set_dtr_rts(union filedescriptor *fd, int is_on)
-{
- HANDLE hComPort=(HANDLE)fd->pfd;
-
- if (is_on) {
- EscapeCommFunction(hComPort, SETDTR);
- EscapeCommFunction(hComPort, SETRTS);
- } else {
- EscapeCommFunction(hComPort, CLRDTR);
- EscapeCommFunction(hComPort, CLRRTS);
- }
- return 0;
-}
-
-
-static int ser_send(union filedescriptor *fd, unsigned char * buf, size_t buflen)
-{
- size_t len = buflen;
- unsigned char c='\0';
- DWORD written;
- unsigned char * b = buf;
-
- HANDLE hComPort=(HANDLE)fd->pfd;
-
- if (hComPort == INVALID_HANDLE_VALUE) {
- fprintf(stderr, "%s: ser_send(): port not open\n",
- progname);
- exit(1);
- }
-
- if (!len)
- return 0;
-
- if (verbose > 3)
- {
- fprintf(stderr, "%s: Send: ", progname);
-
- while (len) {
- c = *b;
- if (isprint(c)) {
- fprintf(stderr, "%c ", c);
- }
- else {
- fprintf(stderr, ". ");
- }
- fprintf(stderr, "[%02x] ", c);
- b++;
- len--;
- }
- fprintf(stderr, "\n");
- }
-
- serial_w32SetTimeOut(hComPort,500);
-
- if (!WriteFile (hComPort, buf, buflen, &written, NULL)) {
- fprintf(stderr, "%s: ser_send(): write error: %s\n",
- progname, "sorry no info avail"); // TODO
- exit(1);
- }
-
- if (written != buflen) {
- fprintf(stderr, "%s: ser_send(): size/send mismatch\n",
- progname);
- exit(1);
- }
-
- return 0;
-}
-
-
-static int ser_recv(union filedescriptor *fd, unsigned char * buf, size_t buflen)
-{
- unsigned char c;
- unsigned char * p = buf;
- DWORD read;
-
- HANDLE hComPort=(HANDLE)fd->pfd;
-
- if (hComPort == INVALID_HANDLE_VALUE) {
- fprintf(stderr, "%s: ser_read(): port not open\n",
- progname);
- exit(1);
- }
-
- serial_w32SetTimeOut(hComPort, serial_recv_timeout);
-
- if (!ReadFile(hComPort, buf, buflen, &read, NULL)) {
- LPVOID lpMsgBuf;
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- GetLastError(),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR) &lpMsgBuf,
- 0,
- NULL );
- fprintf(stderr, "%s: ser_recv(): read error: %s\n",
- progname, (char*)lpMsgBuf);
- LocalFree( lpMsgBuf );
- exit(1);
- }
-
- /* time out detected */
- if (read == 0) {
- if (verbose > 1)
- fprintf(stderr,
- "%s: ser_recv(): programmer is not responding\n",
- progname);
- return -1;
- }
-
- p = buf;
-
- if (verbose > 3)
- {
- fprintf(stderr, "%s: Recv: ", progname);
-
- while (read) {
- c = *p;
- if (isprint(c)) {
- fprintf(stderr, "%c ", c);
- }
- else {
- fprintf(stderr, ". ");
- }
- fprintf(stderr, "[%02x] ", c);
-
- p++;
- read--;
- }
- fprintf(stderr, "\n");
- }
- return 0;
-}
-
-
-static int ser_drain(union filedescriptor *fd, int display)
-{
- // int rc;
- unsigned char buf[10];
- BOOL readres;
- DWORD read;
-
- HANDLE hComPort=(HANDLE)fd->pfd;
-
- if (hComPort == INVALID_HANDLE_VALUE) {
- fprintf(stderr, "%s: ser_drain(): port not open\n",
- progname);
- exit(1);
- }
-
- serial_w32SetTimeOut(hComPort,250);
-
- if (display) {
- fprintf(stderr, "drain>");
- }
-
- while (1) {
- readres=ReadFile(hComPort, buf, 1, &read, NULL);
- if (!readres) {
- LPVOID lpMsgBuf;
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- GetLastError(),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR) &lpMsgBuf,
- 0,
- NULL );
- fprintf(stderr, "%s: ser_drain(): read error: %s\n",
- progname, (char*)lpMsgBuf);
- LocalFree( lpMsgBuf );
- exit(1);
- }
-
- if (read) { // data avail
- if (display) fprintf(stderr, "%02x ", buf[0]);
- }
- else { // no more data
- if (display) fprintf(stderr, "<drain\n");
- break;
- }
- } // while
- return 0;
-}
-
-struct serial_device serial_serdev =
-{
- .open = ser_open,
- .setspeed = ser_setspeed,
- .close = ser_close,
- .send = ser_send,
- .recv = ser_recv,
- .drain = ser_drain,
- .set_dtr_rts = ser_set_dtr_rts,
- .flags = SERDEV_FL_CANSETSPEED,
-};
-
-struct serial_device *serdev = &serial_serdev;
-
-#endif /* WIN32NATIVE */
diff --git a/flow/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala b/flow/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala
deleted file mode 100644
index 7c3a2dc..0000000
--- a/flow/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.github.jodersky.flow.internal
-
-import java.io.File
-import java.io.FileOutputStream
-import scalax.file.Path
-import scalax.io.Resource
-import scala.util.Try
-
-/** Handles loading of the current platform's native library for flow. */
-object NativeLoader {
-
- def extract(): Option[File] = {
- val os = System.getProperty("os.name").toLowerCase.filter(_ != ' ')
- val arch = System.getProperty("os.arch").toLowerCase
- val fqlib = System.mapLibraryName("flow") //fully qualified library name
-
- val in = NativeLoader.getClass().getResourceAsStream(s"/native/${arch}-${os}/${fqlib}")
- if (in == null) return None
-
- val temp = Path.createTempFile()
- Resource.fromInputStream(in).copyDataTo(temp)
- temp.fileOption
- }
-
- def loadFromJar() = extract() match {
- case Some(file) => System.load(file.getAbsolutePath)
- case None => throw new UnsatisfiedLinkError("Cannot extract native library, the native library may not exist for your specific os/architecture combination.")
- }
-
- def load = {
- try {
- System.loadLibrary("flow")
- } catch {
- case ex: UnsatisfiedLinkError => {
- loadFromJar()
- }
- }
- }
-
-} \ No newline at end of file
diff --git a/project/Dependencies.scala b/project/Dependencies.scala
index 7115ba6..9774a0f 100644
--- a/project/Dependencies.scala
+++ b/project/Dependencies.scala
@@ -3,8 +3,5 @@ import sbt._
object Dependencies {
lazy val akkaActor = "com.typesafe.akka" %% "akka-actor" % "2.3.0"
-
- lazy val ioCore = "com.github.scala-incubator.io" %% "scala-io-core" % "0.4.2"
- lazy val ioFile = "com.github.scala-incubator.io" %% "scala-io-file" % "0.4.2"
}
diff --git a/project/FlowBuild.scala b/project/FlowBuild.scala
index d509baa..dfef43c 100644
--- a/project/FlowBuild.scala
+++ b/project/FlowBuild.scala
@@ -1,16 +1,11 @@
import sbt._
import Keys._
import JniKeys._
-import NativeKeys._
-import NativePackKeys._
object FlowBuild extends Build {
val Organization = "com.github.jodersky"
val ScalaVersion = "2.10.3"
val Version = "2.0.0" //version of flow library
- val NativeMajorVersion = 3 //major version of native API
- val NativeMinorVersionPosix = 0 //minor version of native posix implementation
- val NativeVersionPosix = NativeMajorVersion + "." + NativeMinorVersionPosix
val gitHeadCommitSha = settingKey[String]("Current commit sha.")
@@ -32,7 +27,7 @@ object FlowBuild extends Build {
)
lazy val root: Project = (
- Project("root", file(".")).aggregate(flow, flowPack)
+ Project("root", file(".")).aggregate(flow)
settings(
publish := (),
publishLocal := ()
@@ -43,13 +38,9 @@ object FlowBuild extends Build {
Project("flow", file("flow"))
settings (commonSettings: _*)
settings (JniDefaults.settings: _*)
- settings (NativeDefaults.settings: _*)
- settings (selectHost().settings: _*)
settings(
- nativeIncludeDirectories += (sourceDirectory in Compile).value / "native" / "include",
- nativeIncludeDirectories ++= jdkHome.value.map(jdk => jdk / "include").toSeq,
javahClasses := Seq("com.github.jodersky.flow.internal.NativeSerial"),
- javahHeaderDirectory := (sourceDirectory in Compile).value / "native" / "include",
+ javahHeaderDirectory := (baseDirectory in ThisBuild).value / "flow-native" / "include",
compileOrder in Compile := CompileOrder.Mixed,
publishMavenStyle := true,
publishTo := {
@@ -73,106 +64,16 @@ object FlowBuild extends Build {
</developers>
},
libraryDependencies ++= Seq(
- Dependencies.akkaActor,
- Dependencies.ioCore,
- Dependencies.ioFile)
+ Dependencies.akkaActor
+ )
)
)
- //the current operating system used to run the native compile
- trait Host{ def settings: Seq[Setting[_]] }
-
- object Linux extends Host {
-
- val compiler = "gcc"
- val linker = compiler
- val cFlags = List("-O2", "-fPIC", "-Wall")
- val linkerFlags = List("-shared", s"-Wl,-soname,libflow.so.${NativeMajorVersion}")
- val binary = "libflow.so"
-
- val builds = List(
- NativeBuild("x86_64-linux-gnu", "gcc", "-m64" :: cFlags, "gcc", "-m64" :: linkerFlags, binary)
- //NativeBuild("x86-linux-gnu", "gcc", "-m32" :: cFlags, "gcc", "-m32" :: linkerFlags, binary),
- //NativeBuild("arm-linux-gnueabihf", "arm-linux-gnueabihf-gcc", cFlags, "arm-linux-gnueabihf-gcc", linkerFlags, binary),
- //NativeBuild("arm-linux-gnueabi", "arm-linux-gnueabi-gcc", cFlags, "arm-linux-gnueabi-gcc", linkerFlags, binary)
- //add other build configurations here or adapt existing ones to your needs
- )
-
- lazy val settings = Seq(
- nativeVersion := NativeVersionPosix,
- nativeIncludeDirectories ++= jdkHome.value.map(jdk => jdk / "include" / "linux").toSeq,
- nativeSource := nativeSource.value / "posix",
- nativeBuilds := builds
- )
-
- }
-
- //stub, not sure if this works
- object MacOSX extends Host {
-
- val compiler = "gcc"
- val linker = compiler
- val cFlags = Seq("-O2", "-fPIC")
- val linkerFlags = Seq("-dynamiclib")
- val binary = s"libflow.jnilib"
-
- val localBuild = NativeBuild(
- "amd64-macosx",
- compiler,
- cFlags,
- linker,
- linkerFlags,
- binary
- )
-
- lazy val settings = Seq(
- nativeVersion := NativeVersionPosix,
- nativeIncludeDirectories += file("/System/Library/Frameworks/JavaVM.framework/Headers/jni.h"),
- nativeIncludeDirectories += file("/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers"),
- nativeSource := nativeSource.value / "posix",
- nativeBuilds := Seq(localBuild)
- )
-
- }
-
- private def osError = throw new RuntimeException("Sorry, native compilation under the current OS is not supported.")
- def selectHost() = System.getProperty("os.name").toLowerCase match {
- case "linux" => Linux
- case "macosx" => MacOSX
- case _ => new Host{
- val settings = Seq(
- nativeCompile := osError,
- nativeLink := osError
- )
- }
- }
-
- lazy val flowPack: Project = (
- Project("flow-pack", file("flow-pack"))
- settings (commonSettings: _*)
- settings (NativePackDefaults.settings: _*)
- settings (
- nativePackLinkages := {
- val linkMappings = Map(
- "x86_64-linux-gnu" -> "amd64-linux",
- "x86-linux-gnu" -> "x86-linux",
- "arm-linux-gnueabihf" -> "arm-linux"
- )
- val ls: Seq[(NativeBuild, File)] = (nativeLink in flow).value.toSeq
- for ((build, binary) <- ls; n <- linkMappings.get(build.name)) yield {
- (build.copy(name = n), binary)
- }
- },
- exportJars := true
- )
- dependsOn(flow)
- )
-
lazy val samplesTerminal = (
Project("flow-samples-terminal", file("flow-samples") / "flow-samples-terminal")
settings(commonSettings: _*)
settings(runSettings: _*)
- dependsOn(flowPack)
+ //dependsOn(flowPack)
dependsOn(flow)
)
@@ -180,7 +81,6 @@ object FlowBuild extends Build {
Project("flow-samples-broadcast", file("flow-samples") / "flow-samples-broadcast")
settings(commonSettings: _*)
settings(runSettings: _*)
- dependsOn(flowPack)
dependsOn(flow)
)
diff --git a/project/native.scala b/project/native.scala
deleted file mode 100644
index 68c970e..0000000
--- a/project/native.scala
+++ /dev/null
@@ -1,133 +0,0 @@
-import sbt._
-import Keys._
-import java.io.File
-import scala.collection.mutable.HashSet
-
-case class NativeBuild(
- name: String,
- cCompiler: String,
- cFlags: Seq[String],
- linker: String,
- linkerFlags: Seq[String],
- binary: String)
-
-object NativeKeys {
-
- //build settings
- val nativeBuilds = taskKey[Seq[NativeBuild]]("All native build configurations, including cross-compilation.")
- val nativeVersion = settingKey[String]("Version of native binary")
-
- //compile settings
- val nativeIncludeDirectories = settingKey[Seq[File]]("Directories to include during build (gcc -I option)")
-
- //link settings
- val nativeLibraries = settingKey[Seq[String]]("Default names of libraries to use during linking.")
- val nativeLibraryDirectories = settingKey[Seq[File]]("Directories to search for libraries (gcc -L option)")
-
- //directories
- val nativeSource = settingKey[File]("Lowest level directory containing all native sources.")
- val nativeCSources = taskKey[Seq[File]]("All c source files.")
- val nativeTargetDirectory = settingKey[File]("Directory containing all compiled and linked files.")
-
- //tasks
- val nativeCompile = taskKey[Map[NativeBuild, Seq[File]]]("Compile all native build configurations.")
- val nativeLink = taskKey[Map[NativeBuild, File]]("Link all native build configurations.")
-
-}
-
-object NativeDefaults {
- import NativeKeys._
-
- private def generate(generators: SettingKey[Seq[Task[Seq[File]]]]) = generators { _.join.map(_.flatten) }
-
- private def compile(logger: Logger, compiler: String, flags: Seq[String], includeDirectories: Seq[File], src: File, out: File): File = {
- IO.createDirectory(out.getParentFile)
- val parts: Seq[String] =
- Seq(compiler) ++
- flags ++
- includeDirectories.map("-I" + _.getAbsolutePath) ++
- Seq("-o", out.getAbsolutePath) ++
- Seq("-c", src.getAbsolutePath)
-
- val cmd = parts.mkString(" ")
- logger.info(cmd)
- val ev = Process(cmd) ! logger
- if (ev != 0) throw new RuntimeException(s"Compilation of ${src.getAbsoluteFile()} failed.")
- out
- }
-
- private def link(logger: Logger, linker: String, flags: Seq[String], libraryDirectories: Seq[File], libraries: Seq[String], in: Seq[File], out: File): File = {
- val parts: Seq[String] =
- Seq(linker) ++
- flags ++
- Seq("-o", out.getAbsolutePath) ++
- in.map(_.getAbsolutePath) ++
- libraryDirectories.map("-L" + _.getAbsolutePath) ++
- libraries.map("-l" + _)
-
- val cmd = parts.mkString(" ")
- logger.info(cmd)
- val ev = Process(cmd) ! logger
- if (ev != 0) throw new RuntimeException(s"Linking of ${out.getAbsoluteFile()} failed.")
- out
- }
-
-
- def nativeCompileImpl() = Def.task {
- val logger = streams.value.log
- val builds = nativeBuilds.value
- val outDir = nativeTargetDirectory.value
- val includeDirs = nativeIncludeDirectories.value
- val csrcs = nativeCSources.value
-
- val compilations = for (build <- builds) yield {
- logger.info("Compiling configuration " + build.name)
- val objects = for (src <- csrcs) yield {
- compile(logger, build.cCompiler, build.cFlags, includeDirs, src, outDir / build.name / "objects" / (src.base + ".o"))
- }
- build -> objects
- }
- compilations.toMap
- }
-
- lazy val nativeLinkImpl = Def.task {
- val logger = streams.value.log
- val builds = nativeBuilds.value
- val outDir = nativeTargetDirectory.value
- val libDirs = nativeLibraryDirectories.value
- val libs = nativeLibraries.value
- val compilations = nativeCompile.value
- val version = nativeVersion.value
-
- val linkages = for (build <- builds) yield {
- logger.info("Linking configuration " + build.name)
- val objects = compilations(build)
- val binary = link(logger, build.linker, build.linkerFlags, libDirs, libs, objects, outDir / build.name / build.binary)
- build -> binary
- }
- linkages.toMap
- }
-
- def localPlatform = try {
- Process("gcc -dumpmachine").lines.headOption
- } catch {
- case ex: Exception => None
- }
-
-
- val settings: Seq[Setting[_]] = Seq(
- //nativeBuilds :=
-
- nativeSource := (sourceDirectory in Compile).value / "native",
- includeFilter in nativeCSources := "*.c",
- nativeCSources := (nativeSource.value ** (includeFilter in nativeCSources).value).get,
- nativeTargetDirectory := target.value / "native",
-
- nativeIncludeDirectories := Seq(nativeSource.value, nativeSource.value / "include"),
- nativeLibraries := Seq(),
- nativeLibraryDirectories := Seq(),
-
- nativeCompile := nativeCompileImpl.value,
- nativeLink := nativeLinkImpl.value
- )
-}
diff --git a/project/nativepack.scala b/project/nativepack.scala
deleted file mode 100644
index 293848d..0000000
--- a/project/nativepack.scala
+++ /dev/null
@@ -1,37 +0,0 @@
-import sbt._
-import Keys._
-import NativeKeys._
-import java.io.File
-import scala.collection.mutable.HashSet
-
-object NativePackKeys {
-
- val nativePackLinkages = taskKey[Seq[(NativeBuild, File)]]("")
- val nativePackUnmanaged = settingKey[File]("Directory containing any pre-compiled native binaries.")
-
-}
-
-object NativePackDefaults {
- import NativePackKeys._
-
- val mappingsImpl = Def.task {
- val links = nativePackLinkages.value
- val unamanagedDir = nativePackUnmanaged.value
-
- val managed: Seq[(File, String)] = for ( (build, binary) <- links.toSeq) yield {
- binary -> ("native/" + build.name + "/" + binary.name)
- }
-
- val unmanaged: Seq[(File, String)] = for (file <- (unamanagedDir ** "*").get; if file.isFile) yield {
- file -> ("native/" + (file relativeTo unamanagedDir).get.getPath)
- }
-
- managed ++ unmanaged
- }
-
- def settings = Seq(
- nativePackUnmanaged := baseDirectory.value / "lib_native",
- mappings in (Compile, packageBin) ++= mappingsImpl.value
- )
-
-} \ No newline at end of file