Oh well time to use a different libc? I hear FreeBSD has a nice one! :-) On Monday, June 7, 2010, Mark Heily <mark@heily.com> wrote:
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
_______________________________________________ libdispatch-dev mailing list libdispatch-dev@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/libdispatch-dev