Merge pull request #318 from nettlep/master

A few updates to enable building on Raspberry PI/Ubuntu 16.04
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 97d6a74..5b294bb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -61,6 +61,13 @@
                            ${SWIFT_RUNTIME_LIBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}swiftSwiftOnoneSupport${CMAKE_SHARED_LIBRARY_SUFFIX})
 endif()
 
+if(CMAKE_SYSTEM_NAME STREQUAL Android)
+  set(ENABLE_DTRACE_DEFAULT OFF)
+else()
+  set(ENABLE_DTRACE_DEFAULT ON)
+endif()
+option(ENABLE_DTRACE "enable dtrace support" ${ENABLE_DTRACE_DEFAULT})
+
 option(BUILD_SHARED_LIBS "build shared libraries" ON)
 
 option(ENABLE_TESTING "build libdispatch tests" ON)
@@ -166,10 +173,8 @@
 check_include_files("mach/mach.h" HAVE_MACH)
 if(HAVE_MACH)
   set(__DARWIN_NON_CANCELABLE 1)
-  set(USE_MACH_SEM 1)
 else()
   set(__DARWIN_NON_CANCELABLE 0)
-  set(USE_MACH_SEM 0)
 endif()
 check_include_files("malloc/malloc.h" HAVE_MALLOC_MALLOC_H)
 check_include_files("memory.h" HAVE_MEMORY_H)
@@ -188,11 +193,19 @@
 check_include_files("unistd.h" HAVE_UNISTD_H)
 check_include_files("objc/objc-internal.h" HAVE_OBJC)
 
-check_library_exists(pthread sem_init "" USE_POSIX_SEM)
+if(HAVE_MACH)
+  set(USE_MACH_SEM 1)
+else()
+  set(USE_MACH_SEM 0)
+endif()
 if(CMAKE_SYSTEM_NAME STREQUAL Windows)
-  add_definitions(-DTARGET_OS_WIN32)
   add_definitions(-DUSE_WIN32_SEM)
 endif()
+check_library_exists(pthread sem_init "" USE_POSIX_SEM)
+# NOTE: android has not always provided a libpthread, but uses the pthreads API
+if(CMAKE_SYSTEM_NAME STREQUAL Android)
+  set(USE_POSIX_SEM 1)
+endif()
 
 check_symbol_exists(CLOCK_UPTIME "time.h" HAVE_DECL_CLOCK_UPTIME)
 check_symbol_exists(CLOCK_UPTIME_FAST "time.h" HAVE_DECL_CLOCK_UPTIME_FAST)
@@ -214,8 +227,15 @@
 
 check_symbol_exists(program_invocation_name "errno.h" HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME)
 
-find_program(dtrace_EXECUTABLE dtrace)
-if(dtrace_EXECUTABLE)
+if(CMAKE_SYSTEM_NAME STREQUAL Windows)
+  add_definitions(-DTARGET_OS_WIN32)
+endif()
+
+if(ENABLE_DTRACE)
+  find_program(dtrace_EXECUTABLE dtrace)
+  if(NOT dtrace_EXECUTABLE)
+    message(FATAL_ERROR "dtrace not found but explicitly requested")
+  endif()
   add_definitions(-DDISPATCH_USE_DTRACE=1)
 else()
   add_definitions(-DDISPATCH_USE_DTRACE=0)
diff --git a/cmake/config.h.in b/cmake/config.h.in
index 97c94cc..a59737b 100644
--- a/cmake/config.h.in
+++ b/cmake/config.h.in
@@ -212,7 +212,7 @@
 #endif
 /* Enable GNU extensions on systems that have them.  */
 #ifndef _GNU_SOURCE
-#cmakedefine01 _GNU_SOURCE
+#cmakedefine _GNU_SOURCE
 #endif
 /* Enable threading extensions on Solaris.  */
 #ifndef _POSIX_PTHREAD_SEMANTICS
diff --git a/cmake/modules/DispatchCompilerWarnings.cmake b/cmake/modules/DispatchCompilerWarnings.cmake
index dcc074e..d5069c2 100644
--- a/cmake/modules/DispatchCompilerWarnings.cmake
+++ b/cmake/modules/DispatchCompilerWarnings.cmake
@@ -70,5 +70,13 @@
     add_compile_options(-Wno-unused-macros)
     add_compile_options(-Wno-used-but-marked-unused)
     add_compile_options(-Wno-vla)
+
+    if(CMAKE_SYSTEM_NAME STREQUAL Android)
+      add_compile_options(-Wno-incompatible-function-pointer-types)
+      add_compile_options(-Wno-implicit-function-declaration)
+      add_compile_options(-Wno-conversion)
+      add_compile_options(-Wno-int-conversion)
+      add_compile_options(-Wno-shorten-64-to-32)
+    endif()
   endmacro()
 endif()
diff --git a/cmake/modules/SwiftSupport.cmake b/cmake/modules/SwiftSupport.cmake
index 64b7b36..b7a3e76 100644
--- a/cmake/modules/SwiftSupport.cmake
+++ b/cmake/modules/SwiftSupport.cmake
@@ -3,7 +3,7 @@
 
 function(add_swift_library library)
   set(options)
-  set(single_value_options MODULE_NAME;MODULE_LINK_NAME;MODULE_PATH;MODULE_CACHE_PATH;OUTPUT)
+  set(single_value_options MODULE_NAME;MODULE_LINK_NAME;MODULE_PATH;MODULE_CACHE_PATH;OUTPUT;TARGET)
   set(multiple_value_options SOURCES;SWIFT_FLAGS;CFLAGS)
 
   cmake_parse_arguments(ASL "${options}" "${single_value_options}" "${multiple_value_options}" ${ARGN})
@@ -12,6 +12,9 @@
 
   list(APPEND flags -emit-library)
 
+  if(ASL_TARGET)
+    list(APPEND FLAGS -target;${ASL_TARGET})
+  endif()
   if(ASL_MODULE_NAME)
     list(APPEND flags -module-name;${ASL_MODULE_NAME})
   endif()
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5c793dc..11c3a3d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -93,6 +93,8 @@
                       swift/Source.swift
                       swift/Time.swift
                       swift/Wrapper.swift
+                    TARGET
+                      ${CMAKE_C_COMPILER_TARGET}
                     CFLAGS
                       -fblocks
                       -fmodule-map-file=${CMAKE_SOURCE_DIR}/dispatch/module.modulemap
@@ -106,7 +108,7 @@
                    swift/DispatchStubs.cc
                    ${CMAKE_CURRENT_BINARY_DIR}/swiftDispatch.o)
 endif()
-if(dtrace_EXECUTABLE)
+if(ENABLE_DTRACE)
   dtrace_usdt_probe(${CMAKE_CURRENT_SOURCE_DIR}/provider.d
                     OUTPUT_SOURCES
                       dispatch_dtrace_provider_headers)
@@ -140,6 +142,10 @@
   target_compile_definitions(dispatch
                              PRIVATE
                                -D_CRT_SECURE_NO_WARNINGS)
+elseif(CMAKE_SYSTEM_NAME STREQUAL Android)
+  target_compile_options(dispatch
+                         PRIVATE
+                           -U_GNU_SOURCE)
 endif()
 if(BSD_OVERLAY_FOUND)
   target_compile_options(dispatch