I have been able to compile libdispatch on Linux with a blocks-enabled clang and ran into some issues. The biggest problem is <unistd.h> in the GNU libc declares a function which takes an argument named "__block" which causes an error when compiling with Clang. This has been reported as a bug to GNU and rejected by drepper@ as a WONTFIX bug. I'll submit some patches soon to address these issues, but see below for a list of what I encountered and the "fix" used to get it to work. Regards, - Mark Build environment: clang version 1.1 (branches/release_27) Target: x86_64-pc-linux-gnu Build Commands: cd ~/src/libdispatch sh ./autogen.sh && CC=clang CFLAGS=-fPIC ./configure && make clean && make Problems: [1] __block used within unistd.h declaration In file included from ./internal.h:35: In file included from ../dispatch/dispatch.h:36: /usr/include/unistd.h:1128:35: error: __block attribute not allowed, only allowed on local variables extern void encrypt (char *__block, int __edflag) __THROW __nonnull ((1)); ^ fix: edit unistd.h and remove the __block identifier see: http://sources.redhat.com/bugzilla/show_bug.cgi?id=11157 [2] two private_extern variables cause compile failures. /usr/bin/ld: .libs/libdispatch_la-queue_kevent.o: relocation R_X86_64_PC32 against symbol `_dispatch_safe_fork' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Bad value fix: remove __private_extern__ from variable declarations [3] clang wants arc4random defined fix: add u_int32_t arc4random(); to source [4] clang doesn't like __unused dispatch_after.c:32:21: error: expected ')' void done(void *arg __unused) { ^ dispatch_after.c:32:10: note: to match this '(' void done(void *arg __unused) { ^ fix: delete this attribute [5] fabs() undefined symbol dispatch_drift.o: In function `__main_block_invoke_': dispatch_drift.c:(.text+0x529): undefined reference to `fabs' fix: add -lm to testing/Makefile.am [6] fgetln() not declared summarize.c:69:8: warning: implicit declaration of function 'fgetln' is invalid in C99 [-Wimplicit-function-declaration] ln = fgetln(stdin, &len); fix: add declaration: char *fgetln(FILE *fp, size_t *lenp); [7] Dispatch Source Read test failed ================================================== [TEST] Dispatch Source Read [PID] 8515 ================================================== Actual: 0x603200 Expected: 0x603200 [PASS] dispatch_get_main_queue Actual: 0x12dd010 Expected: 0x12dd010 [PASS] DISPATCH_SOURCE_TYPE_READ bytes available: 1 bytes read: 512000 ^^^^^ hung here, process 8515 was defunct and I killed it manually /bin/bash: line 5: 8515 Terminated ${dir}$tst FAIL: dispatch_read fix: none as of yet