Merge pull request #360 from adierking/cl

build: fix clang-cl exception flags
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 31e412a..021f036 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,7 +1,7 @@
 
 cmake_minimum_required(VERSION 3.4.3)
 
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
 
 project(dispatch
         VERSION 1.3
@@ -30,6 +30,7 @@
 include(CheckSymbolExists)
 include(GNUInstallDirs)
 include(SwiftSupport)
+include(DispatchUtilities)
 
 set(SWIFT_LIBDIR "lib" CACHE PATH "Library folder name, defined by swift main buildscript")
 set(INSTALL_LIBDIR "${SWIFT_LIBDIR}" CACHE PATH "Path where the libraries should be installed")
@@ -91,17 +92,18 @@
 
 option(ENABLE_TESTING "build libdispatch tests" ON)
 
+option(USE_LLD_LINKER "use the lld linker" OFF)
+
 if(CMAKE_SYSTEM_NAME STREQUAL Linux OR
    CMAKE_SYSTEM_NAME STREQUAL FreeBSD OR
-   CMAKE_SYSTEM_NAME STREQUAL Android)
+   CMAKE_SYSTEM_NAME STREQUAL Android AND
+   NOT USE_LLD_LINKER)
   set(USE_GOLD_LINKER_DEFAULT ON)
 else()
   set(USE_GOLD_LINKER_DEFAULT OFF)
 endif()
 option(USE_GOLD_LINKER "use the gold linker" ${USE_GOLD_LINKER_DEFAULT})
 
-option(USE_LLD_LINKER "use the lld linker" OFF)
-
 option(ENABLE_THREAD_LOCAL_STORAGE "enable usage of thread local storage via _Thread_local" ON)
 set(DISPATCH_USE_THREAD_LOCAL_STORAGE ${ENABLE_THREAD_LOCAL_STORAGE})
 
diff --git a/cmake/modules/DispatchUtilities.cmake b/cmake/modules/DispatchUtilities.cmake
new file mode 100644
index 0000000..15d8cd7
--- /dev/null
+++ b/cmake/modules/DispatchUtilities.cmake
@@ -0,0 +1,15 @@
+
+function(dispatch_set_linker target)
+  if(USE_GOLD_LINKER)
+    set_property(TARGET ${target}
+                 APPEND_STRING
+                 PROPERTY LINK_FLAGS
+                   -fuse-ld=gold)
+  endif()
+  if(USE_LLD_LINKER)
+    set_property(TARGET ${target}
+                 APPEND_STRING
+                 PROPERTY LINK_FLAGS
+                   -fuse-ld=lld)
+  endif()
+endfunction()
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 3908ea4..b855657 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -210,26 +210,15 @@
                  "-Xlinker -dead_strip"
                  "-Xlinker -alias_list -Xlinker ${CMAKE_SOURCE_DIR}/xcodeconfig/libdispatch.aliases")
 endif()
-if(USE_GOLD_LINKER)
-  set_property(TARGET dispatch
-               APPEND_STRING
-               PROPERTY LINK_FLAGS
-                 -fuse-ld=gold)
-endif()
-if(USE_LLD_LINKER)
-  set_property(TARGET dispatch
-               APPEND_STRING
-               PROPERTY LINK_FLAGS
-                 -fuse-ld=lld)
-endif()
+dispatch_set_linker(dispatch)
 
 # Temporary staging; the various swift projects that depend on libdispatch
 # all expect libdispatch.so to be in src/.libs/libdispatch.so
 # So for now, make a copy so we don't have to do a coordinated commit across
 # all the swift projects to change this assumption.
 add_custom_command(TARGET dispatch POST_BUILD
-                   COMMAND cmake -E make_directory .libs
-                   COMMAND cmake -E copy $<TARGET_FILE:dispatch> .libs
+                   COMMAND ${CMAKE_COMMAND} -E make_directory .libs
+                   COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:dispatch> .libs
                    COMMENT "Copying libdispatch to .libs")
 
 install(TARGETS
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 50f9bdf..4ad1e0e 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -23,6 +23,7 @@
 
 add_executable(bsdtestharness
                bsdtestharness.c)
+dispatch_set_linker(bsdtestharness)
 target_include_directories(bsdtestharness
                            PRIVATE
                              ${CMAKE_CURRENT_BINARY_DIR}
@@ -84,6 +85,7 @@
   target_compile_options(${name} PRIVATE -fblocks)
   # TODO(compnerd) make this portable
   target_compile_options(${name} PRIVATE -Wall -Wno-deprecated-declarations)
+  dispatch_set_linker(${name})
   target_link_libraries(${name} PRIVATE dispatch Threads::Threads)
   if(WITH_BLOCKS_RUNTIME)
     target_link_libraries(${name} PRIVATE BlocksRuntime)
@@ -140,16 +142,16 @@
 # Excluded by default for purposes of Swift CI
 if(EXTENDED_TEST_SUITE)
   list(APPEND DISPATCH_C_TESTS
-	priority
-	concur
-	read
-	read2
-	suspend_timer
-	pingpong
-	drift
-	readsync
-	cascade
-	io)
+       priority
+       concur
+       read
+       read2
+       suspend_timer
+       pingpong
+       drift
+       readsync
+       cascade
+       io)
   # an oddball; dispatch_priority.c compiled with -DUSE_SET_TARGET_QUEUE=1
   add_unit_test(dispatch_priority2 SOURCES dispatch_priority.c)
   target_compile_options(dispatch_priority2 PRIVATE -DUSE_SET_TARGET_QUEUE=1)
@@ -158,10 +160,10 @@
 # add C tests for platform-specific functionality when applicable
 if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
   list(APPEND DISPATCH_C_TESTS
-	deadname
-	proc
-	vm
-	vnode)
+       deadname
+       proc
+       vm
+       vnode)
 endif()
 
 foreach(test ${DISPATCH_C_TESTS})