From f2eb2bf9aba77fe7fff7d01772313666feb4518b Mon Sep 17 00:00:00 2001 From: Andrew Bettison Date: Thu, 20 Oct 2016 16:52:53 +1030 Subject: [PATCH] Add Swift 3/4 'servaldswift' executable If the Swift 3 or Swift 4 compiler is present or passed to the configure script in the SWIFTC variable, then the Makefile will compile a Swift 'servaldswift' executable to ensure that the module map links correctly into a stand-alone Swift program. Use the gold linker if supported, to avoid relocation errors on symbols produced by Swift when linking dynamic libraries. --- .gitignore | 1 + INSTALL.md | 65 +++++++++++++++++++++----- Makefile.in | 67 ++++++++++++++++++++------- configure.ac | 85 ++++++++++++++++++++++++---------- doc/Development.md | 66 ++++++++++++++++++++++---- m4/ax_append_link_flags.m4 | 61 ++++++++++++++++++++++++ m4/ax_check_link_flag.m4 | 71 ++++++++++++++++++++++++++++ m4/ax_prog_swiftc.m4 | 56 ++++++++++++++++++++++ m4/ax_prog_swiftc_is_swift3.m4 | 74 +++++++++++++++++++++++++++++ m4/ax_prog_swiftc_is_swift4.m4 | 80 ++++++++++++++++++++++++++++++++ m4/ax_tmpdir_swift.m4 | 22 +++++++++ main.c | 2 +- module.modulemap | 27 +++++++++++ servald_main.c | 1 + servald_main.h | 20 ++++++++ servaldswift.swift | 14 ++++++ 16 files changed, 648 insertions(+), 64 deletions(-) create mode 100644 m4/ax_append_link_flags.m4 create mode 100644 m4/ax_check_link_flag.m4 create mode 100644 m4/ax_prog_swiftc.m4 create mode 100644 m4/ax_prog_swiftc_is_swift3.m4 create mode 100644 m4/ax_prog_swiftc_is_swift4.m4 create mode 100644 m4/ax_tmpdir_swift.m4 create mode 100644 module.modulemap create mode 100644 servald_main.h create mode 100644 servaldswift.swift diff --git a/.gitignore b/.gitignore index adf0a20d..f849c226 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ /config.h /servald /servaldwrap +/servaldswift /serval-tests /directory_service /tfw_createfile diff --git a/INSTALL.md b/INSTALL.md index a8017fd3..c821cbcd 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,6 +1,6 @@ Serval DNA Build and Test ========================= -[Serval Project][], September 2017 +[Serval Project][], December 2017 Supported Architectures ----------------------- @@ -54,6 +54,7 @@ Mandatory dependencies: Optional: * Java compiler and SDK 1.6.0 or later + * [Swift][] 3 or 4 compiler * ALSA sound library and headers (present on Linux, not on Android) Test dependencies: @@ -68,11 +69,15 @@ Test dependencies: OS-X using the [homebrew][] package manager. The [Notes for Developers][] give more details. -Build ------ +Native Build +------------ -To compile a native (ie, not cross-compiled) Serval DNA from source, run the -following commands: +A *native build* of Serval DNA will produce libraries and executable programs +that can be run on the same platform on which the build is performed. This is +useful for development and testing. + +The following commands will compile a native (ie, not cross-compiled) Serval +DNA from source: $ cd $HOME/src/serval-dna $ autoreconf -f -i -I m4 @@ -125,9 +130,20 @@ A successful session should appear something like: LIB CC cli.c LIB CC cli_stdio.c ... - LINK simulator + LINK servald + CC directory_service.c + LINK directory_service + SERVALD CC servalwrap.c + LINK servaldwrap SERVALD CC test_features.c LINK serval-tests + CC fakeradio.c + LINK fakeradio + CC simulator.c + LINK simulator + CC tfw_createfile.c + LINK tfw_createfile + SWIFT servaldswift make[1]: Entering directory '/home/username/src/serval-dna/java-api' JAVAC classes JAVAC testclasses @@ -152,16 +168,27 @@ In the event of a build failure: * consult the [Notes for Developers][] * as a last resort, [contact the Serval Project][] +Android build +------------- + +The [batphone][] app for Android builds Serval DNA from source by including +[Android.mk](./Android.mk) in its own build process; see the [batphone build +instructions][] for more information. + +It is not necessary to perform a [native build](#native-build) before or after +an Android build; the two produce completely unrelated artifacts. + Built artifacts --------------- -The build process produces the following artifacts: +The [native build](#native-build) process produces the following artifacts: * **servald** is the main Serval DNA daemon executable. All the Serval DNA daemon, SQLite and libsodium code is statically linked into this executable, - so it does not need to load any Serval or libsodium shared libraries at - run-time. Its unstripped size is about 9.5 MB on a typical 64-bit system, of - which about 7 MB is SQLite. Its stripped size is about 3 MB. + and only common system libraries are dynamically linked, which keeps its + run-time dependencies to a minimum. Its unstripped size is about 9.5 MB on a + typical 64-bit system, of which about 7 MB is SQLite. Its stripped size is + about 3 MB. * **servaldwrap** is a Serval DNA executable identical to *servald*, but it loads `libservaldaemon.so` at run-time using [dlopen(3)][] instead of @@ -182,8 +209,9 @@ The build process produces the following artifacts: * **libservaldaemon.so** is a dynamic library containing the complete executable code of the Serval DNA daemon, including [JNI][] entry points, SQLite and - libsodium cryptographic functions. The Serval DNA Java API, which is used by - [batphone][], and the *servaldwrap* executable both use this dynamic library. + libsodium cryptographic functions. The *servaldwrap* executable and the + Serval DNA Java API, which is used by [batphone][], both use this dynamic + library. * **directory_service** is the executable for the [Serval Infrastructure][] daemon. @@ -213,6 +241,16 @@ The build process produces the following artifacts: * **tfw_createfile** is an executable utility needed by test scripts for creating large data files with unique, non-repeating content. +In addition, the following artifacts are produced [if a Swift compiler is +present][Swift development]: + +* **servaldswift** is a statically linked Serval DNA executable identical to + *servald*, but its *main* entry point is compiled from a [Swift][] program to + prove that Swift code can invoke internal Serval DNA daemon APIs. It + dynamically links to many more system libraries than *servald* because of the + Swift language's run-time support and resultant library dependencies, so is + not suitable for deployment. + Test scripts ------------ @@ -270,6 +308,7 @@ This document is available under the [Creative Commons Attribution 4.0 Internati [Serval DNA]: ./README.md [serval-dna]: https://github.com/servalproject/serval-dna [batphone]: https://github.com/servalproject/batphone +[batphone build instructions]: https://github.com/servalproject/batphone/blob/development/INSTALL.md [Android 2.2 “Froyo”]: http://developer.android.com/about/versions/android-2.2-highlights.html [Android NDK]: http://developer.android.com/tools/sdk/ndk/index.html [Xcode]: https://developer.apple.com/xcode/ @@ -277,6 +316,7 @@ This document is available under the [Creative Commons Attribution 4.0 Internati [gcc 5]: http://gcc.gnu.org/gcc-5/ [gcc 6]: http://gcc.gnu.org/gcc-6/ [Notes for Developers]: ./doc/Development.md +[Swift development]: ./doc/Development.md#swift [OpenWRT]: ./doc/OpenWRT.md [Serval Infrastructure]: ./doc/Serval-Infrastructure.md [Serval Mesh Extender]: http://developer.servalproject.org/dokuwiki/doku.php?id=content:meshextender: @@ -288,6 +328,7 @@ This document is available under the [Creative Commons Attribution 4.0 Internati [MDP API]: ./doc/Mesh-Datagram-Protocol.md#mdp-api [CLI API]: ./doc/CLI-API.md [JNI]: http://en.wikipedia.org/wiki/Java_Native_Interface +[Swift]: https://en.wikipedia.org/wiki/Swift_(programming_language) [Bash]: http://en.wikipedia.org/wiki/Bash_(Unix_shell) [GNU make]: http://www.gnu.org/software/make/ [Git]: http://git-scm.com/ diff --git a/Makefile.in b/Makefile.in index 0c91eff1..9fc37ec2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -8,7 +8,21 @@ sysconfdir=@sysconfdir@ localstatedir=@localstatedir@ srcdir=@srcdir@ -SQLITE3_AMALGAMATION = sqlite-amalgamation-3140200 +CC = @CC@ +AR = @AR@ +RANLIB = @RANLIB@ +JAVAC= @JAVAC@ +SWIFTC= @SWIFTC@ + +SWIFTCFLAGS= @SWIFTCFLAGS@ -I. -I $(srcdir) +SWIFTLIBS= @LIBS@ +SWIFT_MODULE_NAME= ServalDNA + +INSTALL= install +INSTALL_PROGRAM= $(INSTALL) +INSTALL_DATA= $(INSTALL) -m 644 + +SQLITE3_AMALGAMATION = sqlite-amalgamation-3140200 include $(srcdir)/sourcefiles.mk include $(srcdir)/headerfiles.mk @@ -62,8 +76,6 @@ SIMULATOR_OBJS = \ PREFIXED_HEADERS = $(addprefix $(srcdir)/, $(HDRS)) PREFIXED_SOURCES = $(addprefix $(srcdir)/, $(ALL_SOURCES)) -CC= @CC@ - LDFLAGS=@LDFLAGS@ @LIBS@ CFLAGS= -I. -I$(srcdir)/$(SQLITE3_AMALGAMATION) @CPPFLAGS@ @CFLAGS@ @@ -83,35 +95,38 @@ CFLAGS+=-DSHA2_USE_INTTYPES_H -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ CFLAGS+=-D_DARWIN_C_SOURCE CFLAGS_SQLITE= @CFLAGS_SQLITE@ -JAVAC= @JAVAC@ - -INSTALL= install -INSTALL_PROGRAM=$(INSTALL) -INSTALL_DATA= $(INSTALL) -m 644 - -include $(srcdir)/Makefile.dbg -DEFS= @DEFS@ +# More warnings, discover problems that only happen on some archs +CFLAGS+=-Wextra +# Security enhancements from Debian +CFLAGS+=-Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -CONFIG_H = @CONFIG_H@ +CONFIG_H = @CONFIG_H@ + +DEFS= @DEFS@ +SWIFTDEFS= $(addprefix -Xcc , $(DEFS)) # Usage: $(call MERGE_STATIC_LIBS, libdest.a, libsrcfoo.a libsrcbar.a) MERGE_STATIC_LIBS = echo MERGE $(1) = $(2); \ tmp="$$(mktemp -d)" && \ ( cd "$$tmp" $(foreach LIB, $(2), && $(AR) -x $(abspath $(LIB))) ) && \ - $(RM) $@ && \ - $(AR) -cr $(1) "$$tmp"/* && \ + $(RM) $(1) && \ + $(AR) -cr $(1) "$$tmp"/*.o && \ + $(RANLIB) $(1) && \ $(RM) -r "$$tmp" .PHONY: all libs test install uninstall clean -all: libs servald servaldwrap test +all: libs servald directory_service test -libs: libservaldaemon.so \ +libs: libservaldaemon.so libservaldaemon.a \ libservalclient.so libservalclient.a \ libmonitorclient.so libmonitorclient.a -test: tfw_createfile directory_service fakeradio simulator serval-tests +test: servaldwrap serval-tests \ + fakeradio simulator \ + tfw_createfile install: servald $(INSTALL_PROGRAM) -D servald $(DESTDIR)$(sbindir)/servald @@ -321,6 +336,26 @@ servald: $(OBJSDIR_SERVALD)/servald_features.o \ @echo LINK $@ @$(CC) -Wall -o $@ $^ $(LDFLAGS) +ifneq ($(SWIFTC),) # Only provide Swift targets if the Swift compiler is available. + +test: servaldswift + +# A servald equivalent whose main entry point and logging output is implemented +# in the Swift language, rather than the C entry point in main.c. This exists +# mainly to ensure that the Serval daemon library can be linked into a Swift +# program and executed. This linkage support is needed by the iOS framework +# package. +servaldswift: $(srcdir)/servaldswift.swift \ + $(OBJSDIR_SERVALD)/servald_features.o \ + $(OBJSDIR_SERVALD)/log_output_console.o \ + $(OBJSDIR_SERVALD)/log_output_file.o \ + libservaldaemon.a \ + $(srcdir)/module.modulemap + @echo SWIFT $@ + @$(SWIFTC) -emit-executable $(SWIFTCFLAGS) $(SWIFTDEFS) -o $@ $(filter %.swift, $^) $(filter %.o, $^) $(filter %.a, $^) $(SWIFTLIBS) + +endif # $(SWIFTC) + servaldwrap: $(OBJSDIR_SERVALD)/servalwrap.o @echo LINK $@ @$(CC) -Wall -o $@ $^ $(LDFLAGS) diff --git a/configure.ac b/configure.ac index 9dd0436e..3ef2fdf6 100644 --- a/configure.ac +++ b/configure.ac @@ -4,26 +4,13 @@ AC_INIT(servald, 0.9) AC_CONFIG_SRCDIR([serval_types.h]) AC_CONFIG_MACRO_DIR([m4]) +AC_ARG_VAR([AR], [Library archiver]) +AC_ARG_VAR([RANLIB], [Archive indexer]) +AC_ARG_VAR([SWIFTC], [Swift compiler]) +AC_ARG_VAR([SWIFTCFLAGS], [Swift compiler flags]) + CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" -dnl Set $host_os, which is needed by javac detection. -AC_CANONICAL_SYSTEM - -dnl Various GCC function and variable attributes -AX_GCC_FUNC_ATTRIBUTE(aligned) -AX_GCC_FUNC_ATTRIBUTE(alloc_size) -AX_GCC_FUNC_ATTRIBUTE(error) -AX_GCC_FUNC_ATTRIBUTE(format) -AX_GCC_FUNC_ATTRIBUTE(malloc) -AX_GCC_FUNC_ATTRIBUTE(unused) -AX_GCC_FUNC_ATTRIBUTE(used) -AX_GCC_VAR_ATTRIBUTE(section) -AX_GCC_VAR_ATTRIBUTE(section_seg) -AX_GCC_STMT_ATTRIBUTE(fallthrough) - -dnl Init pkg-config -PKG_PROG_PKG_CONFIG() - dnl Specify default instance path AC_ARG_VAR([INSTANCE_PATH], [default instance path for servald]) AS_IF([test "x$INSTANCE_PATH" != x], [AC_DEFINE_UNQUOTED([INSTANCE_PATH], ["$INSTANCE_PATH"], [default instance path])]) @@ -52,10 +39,58 @@ dnl Specify default Rhizome store directory AC_ARG_VAR([RHIZOME_STORE_PATH], [default Rhizome store directory]) AS_IF([test "x$RHIZOME_STORE_PATH" != x], [AC_DEFINE_UNQUOTED([RHIZOME_STORE_PATH], ["$RHIZOME_STORE_PATH"], [default Rhizome store directory])]) -dnl Check for programs. -AC_PROG_CC +dnl Set $host_os, which is needed by javac detection. +AC_CANONICAL_SYSTEM -dnl Check for compiler options +dnl Check for C99 compiler and other tools. +AC_PROG_CC_C99 +AC_PROG_CPP + +AC_CHECK_TOOL([AR], [ar], [:]) +AS_IF([test "x$AR" = x:], [AC_MSG_ERROR([Library archiver not found: ar])]) + +AC_CHECK_TOOL([RANLIB], [ranlib], [:]) +AS_IF([test "x$RANLIB" = x:], [AC_MSG_ERROR([Archive indexer not found: ranlib])]) + +dnl Check for a Swift 3 or 4 compiler; set SWIFTC if found. +AC_PROG_SWIFTC + +AS_IF([test "x$SWIFTC" != x], [ dnl + dnl Check whether the Swift compiler will compile a simple Swift 4 program with the supplied flags. + dnl If not, report failure but keep going. + AC_PROG_SWIFTC_IS_SWIFT4 + AS_IF([test "x$ac_cv_prog_swiftc_is_swift4" = xyes], [SWIFT_VERSION=4], [ dnl + AC_PROG_SWIFTC_IS_SWIFT3 + AS_IF([test "x$ac_cv_prog_swiftc_is_swift3" = xyes], [SWIFT_VERSION=3], [ dnl + AC_MSG_WARN([$SWIFTC version is too old; omitting Swift API]) + SWIFT_VERSION= + SWIFTC= + ]) + ]) +]) + +AC_SUBST([SWIFTC]) +AC_SUBST([SWIFTCFLAGS]) +AC_SUBST([SWIFT_VERSION]) + +dnl Various GCC function and variable attributes +AX_GCC_FUNC_ATTRIBUTE(aligned) +AX_GCC_FUNC_ATTRIBUTE(alloc_size) +AX_GCC_FUNC_ATTRIBUTE(error) +AX_GCC_FUNC_ATTRIBUTE(format) +AX_GCC_FUNC_ATTRIBUTE(malloc) +AX_GCC_FUNC_ATTRIBUTE(unused) +AX_GCC_FUNC_ATTRIBUTE(used) +AX_GCC_VAR_ATTRIBUTE(section) +AX_GCC_VAR_ATTRIBUTE(section_seg) +AX_GCC_STMT_ATTRIBUTE(fallthrough) + +dnl The default GNU linker (BFD) cannot relocate some symbols produced by the +dnl Swift compiler, so the gold linker is used to create dynamic libraries. +dnl See doc/Development.md for details. +AX_APPEND_LINK_FLAGS(-fuse-ld=gold) + +dnl Check compiler options for compiling SQLite. AX_APPEND_COMPILE_FLAGS( -Wno-empty-body \ -Wno-unused-value \ @@ -81,7 +116,7 @@ popdef([AC_MSG_ERROR]) AC_SUBST([JAVAC]) dnl Check Java version, ditch Java if not adequate -if test -n "$JAVAC"; then +AS_IF([test -n "$JAVAC"], [ dnl dnl Discover the version of the Java compiler AC_PROG_JAVAC_VERSION dnl Check that the Java compiler is modern enough @@ -94,9 +129,9 @@ if test -n "$JAVAC"; then AC_MSG_WARN([Java version $ax_cv_prog_javac_version is too old; omitting Java API]) JAVAC="" ]) -fi +]) -if test -n "$JAVAC"; then +AS_IF([test -n "$JAVAC"], [ dnl dnl Discover the locations of JNI header files dnl *** Kludge: override AC_MSG_ERROR because AC_JNI_INCLUDE_DIR does not have dnl *** [if-found] and [if-not-found] action parameters. @@ -106,7 +141,7 @@ if test -n "$JAVAC"; then CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR" done popdef([AC_MSG_ERROR]) -fi +]) dnl XXX Isn't this pointless? we are always linked against libc AC_CHECK_LIB(c,srandomdev) diff --git a/doc/Development.md b/doc/Development.md index d9e45d3f..1110ae67 100644 --- a/doc/Development.md +++ b/doc/Development.md @@ -1,6 +1,6 @@ Notes for Serval DNA Developers =============================== -[Serval Project][], September 2017 +[Serval Project][], December 2017 Introduction ------------ @@ -11,12 +11,12 @@ non-developers who are experiencing errors in the [build][] process. Autotools --------- -The [configure.ac](../configure.ac) file is an [autoconf][] script that -contains instructions for adapting the build of Serval DNA to different -platforms and CPU architectures. This script makes use of many [GNU M4][] -macros, each of which tests an aspect of the build environment, such as the -make and version of the C compiler (eg, [GCC][], [Clang][]), the availability -of headers, functions and system calls in the standard library, and so forth. +The [configure.ac][] file is an [autoconf][] script that contains instructions +for adapting the build of Serval DNA to different platforms and CPU +architectures. This script makes use of many [GNU M4][] macros, each of which +tests an aspect of the build environment, such as the make and version of the C +compiler (eg, [GCC][], [Clang][]), the availability of headers, functions and +system calls in the standard library, and so forth. Most of these M4 macros are standard, either supplied with [autoconf][] or from the [autoconf macro archive][]. Some macros are specific to Serval DNA, either @@ -27,8 +27,7 @@ sub-directory. The [autoreconf][] command used in the [build][] instructions generates an `aclocal.m4` file that includes all the necessary files from the [m4](../m4) directory. In turn, it then includes this `aclocal.m4` file when invoking [GNU -M4][] to convert the [configure.ac](../configure.ac) file into the -`./configure` script. +M4][] to convert the [configure.ac][] file into the `./configure` script. When invoked without arguments, all [autoreconf][] versions up to 2.69 will emit warning messages like this: @@ -63,7 +62,18 @@ the `-I m4` option, which will eliminate the warnings: The `-I m4` option should be unnecessary in [autoreconf][] versions 2.70 and later, because they will deduce it from the `AC_CONFIG_MACRO_DIR([m4])` -directive near the top of `configure.ac`. +directive near the top of [configure.ac][]. + +Linker +------ + +The default GNU linker (based on the BFD library) does not support relocation +of some symbols produced by the Swift compiler: + + relocation R_X86_64_PC32 against protected symbol `...' can not be used when making a shared object + +The Serval DNA dynamic library is linked using the GNU [gold][] linker +(available in GNU binutils since 2008), which does not have this problem. libsodium --------- @@ -217,6 +227,34 @@ using the [homebrew][] package manager: /usr/local/Cellar/jq/1.5_2: 18 files, 958K $ +Java +---- + +The Serval DNA *libservaldeamon* static and dynamic libraries provide a [JNI][] +API so that the Serval [command line][CLI] can be called from Java programs, +and the daemon server can be run in a Java thread. + +Swift +----- + +Serval DNA supports [Swift][], the language that Apple recommend for developing +iOS apps for their mobile devices such as phones and tablets. The +`./configure` script [generated from configure.ac](#autotools) detects whether +a [Swift 4][] compiler is present, or failing that, a [Swift 3][] compiler, and +if so, then produces a Makefile that will compile +[servaldswift.swift](../servaldswift.swift) into the *servaldswift* executable, +to prove that the Swift [module map](../module.modulemap) allows Swift source +code to invoke internal Serval DNA functions. + +The `./configure` script can be passed the following variables, either as +environment variables or using the `VARNAME=value` syntax on its command line: + +* `SWIFTC` the path name of the Swift compiler to use; by default the configure + script searches `$PATH` for `swiftc` + +* `SWIFTCFLAGS` extra command-line arguments to pass to the Swift compiler; + analogous to `CFLAGS` for the C compiler + About the examples ------------------ @@ -241,6 +279,7 @@ Available under the [Creative Commons Attribution 4.0 International licence][CC [CC BY 4.0]: ../LICENSE-DOCUMENTATION.md [Serval DNA]: ../README.md [build]: ../INSTALL.md +[configure.ac]: ../configure.ac [autoconf]: http://www.gnu.org/software/autoconf/autoconf.html [autoconf macro archive]: http://www.gnu.org/software/autoconf-archive/ [GNU M4]: http://www.gnu.org/software/m4/m4.html @@ -262,4 +301,11 @@ Available under the [Creative Commons Attribution 4.0 International licence][CC [OS X awk(1)]: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/awk.1.html [jq(1)]: https://stedolan.github.io/jq/ [homebrew]: http://brew.sh/ +[CLI]: ./CLI-API.md +[JNI]: http://en.wikipedia.org/wiki/Java_Native_Interface +[Swift]: https://en.wikipedia.org/wiki/Swift_(programming_language) +[Swift module]: https://swift.org/package-manager/#modules +[Swift 3]: https://swift.org/blog/swift-3-0-released/ +[Swift 4]: https://swift.org/blog/swift-4-0-released/ +[gold]: https://en.wikipedia.org/wiki/Gold_(linker) [Bourne shell]: http://en.wikipedia.org/wiki/Bourne_shell diff --git a/m4/ax_append_link_flags.m4 b/m4/ax_append_link_flags.m4 new file mode 100644 index 00000000..4fc43370 --- /dev/null +++ b/m4/ax_append_link_flags.m4 @@ -0,0 +1,61 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_link_flags.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# For every FLAG1, FLAG2 it is checked whether the linker works with the +# flag. If it does, the flag is added FLAGS-VARIABLE +# +# If FLAGS-VARIABLE is not specified, the linker's flags (LDFLAGS) is +# used. During the check the flag is always added to the linker's flags. +# +# If EXTRA-FLAGS is defined, it is added to the linker's default flags +# when the check is done. The check is thus made with the flags: "LDFLAGS +# EXTRA-FLAGS FLAG". This can for example be used to force the linker to +# issue an error when a bad flag is given. +# +# NOTE: This macro depends on the AX_APPEND_FLAG and AX_CHECK_LINK_FLAG. +# Please keep this macro in sync with AX_APPEND_COMPILE_FLAGS. +# +# LICENSE +# +# Copyright (c) 2011 Maarten Bosmans +# +# 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 3 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 . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 2 + +AC_DEFUN([AX_APPEND_LINK_FLAGS], +[for flag in $1; do + AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3]) +done +])dnl AX_APPEND_LINK_FLAGS diff --git a/m4/ax_check_link_flag.m4 b/m4/ax_check_link_flag.m4 new file mode 100644 index 00000000..e2d0d363 --- /dev/null +++ b/m4/ax_check_link_flag.m4 @@ -0,0 +1,71 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the linker or gives an error. +# (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the linker's default flags +# when the check is done. The check is thus made with the flags: "LDFLAGS +# EXTRA-FLAGS FLAG". This can for example be used to force the linker to +# issue an error when a bad flag is given. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# 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 3 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 . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 2 + +AC_DEFUN([AX_CHECK_LINK_FLAG], +[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl +AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS $4 $1" + AC_LINK_IFELSE([AC_LANG_PROGRAM()], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + LDFLAGS=$ax_check_save_flags]) +AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_LINK_FLAGS diff --git a/m4/ax_prog_swiftc.m4 b/m4/ax_prog_swiftc.m4 new file mode 100644 index 00000000..d2da90a0 --- /dev/null +++ b/m4/ax_prog_swiftc.m4 @@ -0,0 +1,56 @@ +# Serval Project Swift language support +# +# SYNOPSIS +# +# AX_PROG_SWIFTC +# +# DESCRIPTION +# +# AX_PROG_SWIFTC tests for the presence of a Swift compiler. +# +# Sets the SWIFTC shell variable to the name of the Swift executable (not the +# Swift compiler!) either relative to $PATH or an absolute path if necessary; +# this is usually just "swiftc". +# +# To force a specific compiler, either: +# +# - in configure.ac, set SWIFTC=yourcompiler before calling AX_PROG_SWIFTC, +# or +# +# - before invoking ./configure, export SWIFTC=yourcompiler +# +# LICENSE +# +# Copyright (C) 2016 Flinders University +# +# 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 . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +AU_ALIAS([AC_PROG_SWIFTC], [AX_PROG_SWIFTC]) +AC_DEFUN([AX_PROG_SWIFTC],[ + test "x$SWIFTC" = x && AC_CHECK_PROGS(SWIFTC, swiftc) + AC_PROVIDE([$0])dnl +]) diff --git a/m4/ax_prog_swiftc_is_swift3.m4 b/m4/ax_prog_swiftc_is_swift3.m4 new file mode 100644 index 00000000..5cd334f4 --- /dev/null +++ b/m4/ax_prog_swiftc_is_swift3.m4 @@ -0,0 +1,74 @@ +# Serval Project Swift language support +# +# SYNOPSIS +# +# AX_PROG_SWIFTC_IS_SWIFT3 +# +# DESCRIPTION +# +# AX_PROG_SWIFTC_IS_SWIFT3 tests whether the Swift compiler in the SWIFTC +# variable (eg, as detected by the AX_PROG_SWIFTC macro) can compile a Swift +# 3 program to a working native executable, with the given SWIFTCFLAGS +# compiler options. +# +# LICENSE +# +# Copyright (C) 2016 Flinders University +# +# 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 . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +AU_ALIAS([AC_PROG_SWIFTC_IS_SWIFT3], [AX_PROG_SWIFTC_IS_SWIFT3]) +AC_DEFUN([AX_PROG_SWIFTC_IS_SWIFT3],[ + AC_REQUIRE([AX_TMPDIR_SWIFT]) + AC_CACHE_CHECK([if $SWIFTC supports Swift 3], ac_cv_prog_swiftc_is_swift3, [ + cat < "$ax_tmpdir_swift/Test.swift" +/* Swift 2 uses Process.arguments, so this only compiles in Swift 3 */ +print(CommandLine.arguments) +EOF + if AC_TRY_COMMAND($SWIFTC $SWIFTCFLAGS -emit-executable -o "$ax_tmpdir_swift/Test" "$ax_tmpdir_swift/Test.swift") >/dev/null 2>&1; then + if AC_TRY_COMMAND("$ax_tmpdir_swift/Test" one two three) > "$ax_tmpdir_swift/Test.out" 2>&1; then + ac_swift_test_out=`cat "$ax_tmpdir_swift/Test.out"` + if test "x$ac_swift_test_out" = ['x["'"$ax_tmpdir_swift"'/Test", "one", "two", "three"]']; then + ac_cv_prog_swiftc_is_swift3=yes + else + echo "incorrect output was: $ac_swift_test_out" >&AS_MESSAGE_LOG_FD + ac_cv_prog_swiftc_is_swift3=no + fi + else + echo "failed "$ax_tmpdir_swift/Test" execution produced output:" >&AS_MESSAGE_LOG_FD + cat "$ax_tmpdir_swift/Test.out" >&AS_MESSAGE_LOG_FD + ac_cv_prog_swiftc_is_swift3=no + fi + else + echo "compilation failed for:" >&AS_MESSAGE_LOG_FD + cat "$ax_tmpdir_swift/Test.swift" >&AS_MESSAGE_LOG_FD + ac_cv_prog_swiftc_is_swift3=no + fi + rm -f Test.swift Test Test.out + ]) + AC_PROVIDE([$0])dnl +]) diff --git a/m4/ax_prog_swiftc_is_swift4.m4 b/m4/ax_prog_swiftc_is_swift4.m4 new file mode 100644 index 00000000..5de63950 --- /dev/null +++ b/m4/ax_prog_swiftc_is_swift4.m4 @@ -0,0 +1,80 @@ +# Serval Project Swift language support +# +# SYNOPSIS +# +# AX_PROG_SWIFTC_IS_SWIFT4 +# +# DESCRIPTION +# +# AX_PROG_SWIFTC_IS_SWIFT4 tests whether the Swift compiler in the SWIFTC +# variable (eg, as detected by the AX_PROG_SWIFTC macro) can compile a Swift +# 4 program to a working native executable, with the given SWIFTCFLAGS +# compiler options. +# +# LICENSE +# +# Copyright (C) 2017 Flinders University +# +# 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 . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +AU_ALIAS([AC_PROG_SWIFTC_IS_SWIFT4], [AX_PROG_SWIFTC_IS_SWIFT4]) +AC_DEFUN([AX_PROG_SWIFTC_IS_SWIFT4],[ + AC_REQUIRE([AX_TMPDIR_SWIFT]) + AC_CACHE_CHECK([if $SWIFTC supports Swift 4], ac_cv_prog_swiftc_is_swift4, [ + [ + cat < "$ax_tmpdir_swift/Test.swift" +/* Substring was introduced in Swift 4 */ +let a = "test" +let b : Substring = a[a.startIndex ... a.index(a.startIndex, offsetBy: 2)] +precondition(b == "tes") +/* Swift 2 uses Process.arguments, so this only compiles in Swift 3 and later */ +print(CommandLine.arguments) +EOF + ] + if AC_TRY_COMMAND($SWIFTC $SWIFTCFLAGS -emit-executable -o "$ax_tmpdir_swift/Test" "$ax_tmpdir_swift/Test.swift") >/dev/null 2>&1; then + if AC_TRY_COMMAND("$ax_tmpdir_swift/Test" one two three) > "$ax_tmpdir_swift/Test.out" 2>&1; then + ac_swift_test_out=`cat "$ax_tmpdir_swift/Test.out"` + if test "x$ac_swift_test_out" = ['x["'"$ax_tmpdir_swift"'/Test", "one", "two", "three"]']; then + ac_cv_prog_swiftc_is_swift4=yes + else + echo "incorrect output was: $ac_swift_test_out" >&AS_MESSAGE_LOG_FD + ac_cv_prog_swiftc_is_swift4=no + fi + else + echo "failed "$ax_tmpdir_swift/Test" execution produced output:" >&AS_MESSAGE_LOG_FD + cat "$ax_tmpdir_swift/Test.out" >&AS_MESSAGE_LOG_FD + ac_cv_prog_swiftc_is_swift4=no + fi + else + echo "compilation failed for:" >&AS_MESSAGE_LOG_FD + cat "$ax_tmpdir_swift/Test.swift" >&AS_MESSAGE_LOG_FD + ac_cv_prog_swiftc_is_swift4=no + fi + rm -f Test.swift Test Test.out + ]) + AC_PROVIDE([$0])dnl +]) diff --git a/m4/ax_tmpdir_swift.m4 b/m4/ax_tmpdir_swift.m4 new file mode 100644 index 00000000..31d0e427 --- /dev/null +++ b/m4/ax_tmpdir_swift.m4 @@ -0,0 +1,22 @@ +# Serval Project Swift language support +# +# SYNOPSIS +# +# AX_TMPDIR_SWIFT +# +# DESCRIPTION +# +# AX_TMPDIR_SWIFT creates a temporary directory prefixed with "swft" that +# will be deleted when the shell exits. It sets the ax_tmpdir_swift shell +# variable to the absolute path of the created directory. +# +# Uses AS_TMPDIR() internally but preserves the value of the 'tmp' shell +# variable. +# + +AC_DEFUN([AX_TMPDIR_SWIFT],[ + AS_VAR_COPY([_swift_tmp], [tmp]) + AS_TMPDIR([swft]) + ax_tmpdir_swift="$tmp" + AS_VAR_COPY([tmp], [_swift_tmp]) +]) diff --git a/main.c b/main.c index 78df5dda..2c5df929 100644 --- a/main.c +++ b/main.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -extern int servald_main(int, char**); +#include "servald_main.h" int main(int argc, char **argv) { diff --git a/module.modulemap b/module.modulemap new file mode 100644 index 00000000..b7268a11 --- /dev/null +++ b/module.modulemap @@ -0,0 +1,27 @@ +/* +Serval DNA module map +Copyright (C) 2016-2017 Flinders University + +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, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +module servald { + + requires tls // thread-local storage + + module main { + header "servald_main.h" + } +} diff --git a/servald_main.c b/servald_main.c index ce62b620..be01a883 100644 --- a/servald_main.c +++ b/servald_main.c @@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include +#include "servald_main.h" #include "commandline.h" #include "sighandlers.h" #include "conf.h" diff --git a/servald_main.h b/servald_main.h new file mode 100644 index 00000000..51519941 --- /dev/null +++ b/servald_main.h @@ -0,0 +1,20 @@ +/* +Serval DNA main command-line entry point +Copyright (C) 2016 Flinders University + +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, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +int servald_main(int argc, char **argv); diff --git a/servaldswift.swift b/servaldswift.swift new file mode 100644 index 00000000..539c481d --- /dev/null +++ b/servaldswift.swift @@ -0,0 +1,14 @@ +import Foundation +import servald.main + +public func serval_daemon_main(args: [String]) -> CInt { + // print "args = \(args)" + var argv = args.map { strdup($0) } + argv.append(nil) + defer { + argv.forEach { free($0) } + } + return servald_main(CInt(argv.count - 1), &argv) +} + +exit(serval_daemon_main(args: CommandLine.arguments))