Skip to content

Commit d96111c

Browse files
MadCodernettlep
authored andcommitted
Merge pull request swiftlang#312 from compnerd/android
build: improve cross-compilation for android A few updates to enable building on Raspberry PI/Ubuntu 16.04 As requested by MadCoder, changed the unsigned long long to uint64_t
2 parents bfa9aa7 + 929a1d7 commit d96111c

File tree

9 files changed

+54
-17
lines changed

9 files changed

+54
-17
lines changed

CMakeLists.txt

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ if(ENABLE_SWIFT)
6161
${SWIFT_RUNTIME_LIBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}swiftSwiftOnoneSupport${CMAKE_SHARED_LIBRARY_SUFFIX})
6262
endif()
6363

64+
if(CMAKE_SYSTEM_NAME STREQUAL Android)
65+
set(ENABLE_DTRACE_DEFAULT OFF)
66+
else()
67+
set(ENABLE_DTRACE_DEFAULT ON)
68+
endif()
69+
option(ENABLE_DTRACE "enable dtrace support" ${ENABLE_DTRACE_DEFAULT})
70+
6471
option(BUILD_SHARED_LIBS "build shared libraries" ON)
6572

6673
option(ENABLE_TESTING "build libdispatch tests" ON)
@@ -166,10 +173,8 @@ check_include_files("libproc_internal.h" HAVE_LIBPROC_INTERNAL_H)
166173
check_include_files("mach/mach.h" HAVE_MACH)
167174
if(HAVE_MACH)
168175
set(__DARWIN_NON_CANCELABLE 1)
169-
set(USE_MACH_SEM 1)
170176
else()
171177
set(__DARWIN_NON_CANCELABLE 0)
172-
set(USE_MACH_SEM 0)
173178
endif()
174179
check_include_files("malloc/malloc.h" HAVE_MALLOC_MALLOC_H)
175180
check_include_files("memory.h" HAVE_MEMORY_H)
@@ -188,11 +193,19 @@ check_include_files("sys/types.h" HAVE_SYS_TYPES_H)
188193
check_include_files("unistd.h" HAVE_UNISTD_H)
189194
check_include_files("objc/objc-internal.h" HAVE_OBJC)
190195

191-
check_library_exists(pthread sem_init "" USE_POSIX_SEM)
196+
if(HAVE_MACH)
197+
set(USE_MACH_SEM 1)
198+
else()
199+
set(USE_MACH_SEM 0)
200+
endif()
192201
if(CMAKE_SYSTEM_NAME STREQUAL Windows)
193-
add_definitions(-DTARGET_OS_WIN32)
194202
add_definitions(-DUSE_WIN32_SEM)
195203
endif()
204+
check_library_exists(pthread sem_init "" USE_POSIX_SEM)
205+
# NOTE: android has not always provided a libpthread, but uses the pthreads API
206+
if(CMAKE_SYSTEM_NAME STREQUAL Android)
207+
set(USE_POSIX_SEM 1)
208+
endif()
196209

197210
check_symbol_exists(CLOCK_UPTIME "time.h" HAVE_DECL_CLOCK_UPTIME)
198211
check_symbol_exists(CLOCK_UPTIME_FAST "time.h" HAVE_DECL_CLOCK_UPTIME_FAST)
@@ -214,8 +227,15 @@ check_symbol_exists(VQ_VERYLOWDISK "sys/mount.h" HAVE_DECL_VQ_VERYLOWDISK)
214227

215228
check_symbol_exists(program_invocation_name "errno.h" HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME)
216229

217-
find_program(dtrace_EXECUTABLE dtrace)
218-
if(dtrace_EXECUTABLE)
230+
if(CMAKE_SYSTEM_NAME STREQUAL Windows)
231+
add_definitions(-DTARGET_OS_WIN32)
232+
endif()
233+
234+
if(ENABLE_DTRACE)
235+
find_program(dtrace_EXECUTABLE dtrace)
236+
if(NOT dtrace_EXECUTABLE)
237+
message(FATAL_ERROR "dtrace not found but explicitly requested")
238+
endif()
219239
add_definitions(-DDISPATCH_USE_DTRACE=1)
220240
else()
221241
add_definitions(-DDISPATCH_USE_DTRACE=0)

cmake/config.h.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@
212212
#endif
213213
/* Enable GNU extensions on systems that have them. */
214214
#ifndef _GNU_SOURCE
215-
#cmakedefine01 _GNU_SOURCE
215+
#cmakedefine _GNU_SOURCE
216216
#endif
217217
/* Enable threading extensions on Solaris. */
218218
#ifndef _POSIX_PTHREAD_SEMANTICS

cmake/modules/DispatchCompilerWarnings.cmake

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,13 @@ else()
7070
add_compile_options(-Wno-unused-macros)
7171
add_compile_options(-Wno-used-but-marked-unused)
7272
add_compile_options(-Wno-vla)
73+
74+
if(CMAKE_SYSTEM_NAME STREQUAL Android)
75+
add_compile_options(-Wno-incompatible-function-pointer-types)
76+
add_compile_options(-Wno-implicit-function-declaration)
77+
add_compile_options(-Wno-conversion)
78+
add_compile_options(-Wno-int-conversion)
79+
add_compile_options(-Wno-shorten-64-to-32)
80+
endif()
7381
endmacro()
7482
endif()

cmake/modules/SwiftSupport.cmake

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ include(CMakeParseArguments)
33

44
function(add_swift_library library)
55
set(options)
6-
set(single_value_options MODULE_NAME;MODULE_LINK_NAME;MODULE_PATH;MODULE_CACHE_PATH;OUTPUT)
6+
set(single_value_options MODULE_NAME;MODULE_LINK_NAME;MODULE_PATH;MODULE_CACHE_PATH;OUTPUT;TARGET)
77
set(multiple_value_options SOURCES;SWIFT_FLAGS;CFLAGS)
88

99
cmake_parse_arguments(ASL "${options}" "${single_value_options}" "${multiple_value_options}" ${ARGN})
@@ -12,6 +12,9 @@ function(add_swift_library library)
1212

1313
list(APPEND flags -emit-library)
1414

15+
if(ASL_TARGET)
16+
list(APPEND FLAGS -target;${ASL_TARGET})
17+
endif()
1518
if(ASL_MODULE_NAME)
1619
list(APPEND flags -module-name;${ASL_MODULE_NAME})
1720
endif()

src/CMakeLists.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ if(ENABLE_SWIFT)
9393
swift/Source.swift
9494
swift/Time.swift
9595
swift/Wrapper.swift
96+
TARGET
97+
${CMAKE_C_COMPILER_TARGET}
9698
CFLAGS
9799
-fblocks
98100
-fmodule-map-file=${CMAKE_SOURCE_DIR}/dispatch/module.modulemap
@@ -106,7 +108,7 @@ if(ENABLE_SWIFT)
106108
swift/DispatchStubs.cc
107109
${CMAKE_CURRENT_BINARY_DIR}/swiftDispatch.o)
108110
endif()
109-
if(dtrace_EXECUTABLE)
111+
if(ENABLE_DTRACE)
110112
dtrace_usdt_probe(${CMAKE_CURRENT_SOURCE_DIR}/provider.d
111113
OUTPUT_SOURCES
112114
dispatch_dtrace_provider_headers)
@@ -140,6 +142,10 @@ if(CMAKE_SYSTEM_NAME STREQUAL Windows)
140142
target_compile_definitions(dispatch
141143
PRIVATE
142144
-D_CRT_SECURE_NO_WARNINGS)
145+
elseif(CMAKE_SYSTEM_NAME STREQUAL Android)
146+
target_compile_options(dispatch
147+
PRIVATE
148+
-U_GNU_SOURCE)
143149
endif()
144150
if(BSD_OVERLAY_FOUND)
145151
target_compile_options(dispatch

src/event/event_epoll.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ _dispatch_timeout_program(uint32_t tidx, uint64_t target,
419419

420420
if (target < INT64_MAX) {
421421
struct itimerspec its = { .it_value = {
422-
.tv_sec = target / NSEC_PER_SEC,
422+
.tv_sec = (time_t)(target / NSEC_PER_SEC),
423423
.tv_nsec = target % NSEC_PER_SEC,
424424
} };
425425
dispatch_assume_zero(timerfd_settime(timer->det_fd, TFD_TIMER_ABSTIME,

src/source.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2023,15 +2023,15 @@ static inline unsigned long
20232023
_dispatch_source_timer_data(dispatch_source_t ds, dispatch_unote_t du)
20242024
{
20252025
dispatch_timer_source_refs_t dr = du._dt;
2026-
unsigned long data, prev, clear_prev = 0;
2026+
uint64_t data, prev, clear_prev = 0;
20272027

20282028
os_atomic_rmw_loop2o(ds, ds_pending_data, prev, clear_prev, relaxed, {
20292029
data = prev >> 1;
20302030
if (unlikely(prev & DISPATCH_TIMER_MISSED_MARKER)) {
20312031
os_atomic_rmw_loop_give_up(goto handle_missed_intervals);
20322032
}
20332033
});
2034-
return data;
2034+
return (unsigned long)data;
20352035

20362036
handle_missed_intervals:
20372037
// The timer may be in _dispatch_source_invoke2() already for other
@@ -2046,7 +2046,7 @@ _dispatch_source_timer_data(dispatch_source_t ds, dispatch_unote_t du)
20462046
uint64_t now = _dispatch_time_now(DISPATCH_TIMER_CLOCK(dr->du_ident));
20472047
if (now >= dr->dt_timer.target) {
20482048
OS_COMPILER_CAN_ASSUME(dr->dt_timer.interval < INT64_MAX);
2049-
data = _dispatch_source_timer_compute_missed(dr, now, data);
2049+
data = _dispatch_source_timer_compute_missed(dr, now, (unsigned long)data);
20502050
}
20512051

20522052
// When we see the MISSED_MARKER the manager has given up on this timer
@@ -2059,7 +2059,7 @@ _dispatch_source_timer_data(dispatch_source_t ds, dispatch_unote_t du)
20592059
// on the manager and make the changes to `ds_timer` above visible.
20602060
_dispatch_queue_atomic_flags_clear(ds->_as_dq, DSF_ARMED);
20612061
os_atomic_store2o(ds, ds_pending_data, 0, relaxed);
2062-
return data;
2062+
return (unsigned long)data;
20632063
}
20642064

20652065
static inline void

tests/dispatch_starfish.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ collect(void *context __attribute__((unused)))
7272

7373
printf("lap: %zd\n", lap_count_down);
7474
printf("count: %lu\n", COUNT);
75-
printf("delta: %lu ns\n", delta);
75+
printf("delta: %lu ns\n", (unsigned long)delta);
7676
printf("math: %Lf ns / lap\n", math);
7777

7878
for (i = 0; i < COUNT; i++) {

tests/dispatch_timer.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ test_timer(void)
6363

6464
dispatch_source_set_event_handler(s, ^{
6565
if (!finalized) {
66-
test_long_less_than("timer number", j, stop_at);
67-
fprintf(stderr, "timer[%lu]\n", j);
66+
test_long_less_than("timer number", (long)j, stop_at);
67+
fprintf(stderr, "timer[%lu]\n", (unsigned long)j);
6868
}
6969
dispatch_release(s);
7070
});

0 commit comments

Comments
 (0)