darwin: fix build with non-apple compilers
The header files for ApplicationServices and CoreFoundation contain C language extensions that Apple's compiler understands but gcc does not, notably blocks: https://en.wikipedia.org/wiki/Blocks_(C_language_extension) Work around that by defining the types inline and stop including the headers. It's inelegant but the alternatives are worse. Fixes: https://github.com/libuv/libuv/issues/2805 PR-URL: https://github.com/libuv/libuv/pull/2811 Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
parent
25368e2db1
commit
75c8850c91
@ -409,8 +409,9 @@ uvinclude_HEADERS += include/uv/darwin.h
|
||||
libuv_la_CFLAGS += -D_DARWIN_USE_64_BIT_INODE=1
|
||||
libuv_la_CFLAGS += -D_DARWIN_UNLIMITED_SELECT=1
|
||||
libuv_la_SOURCES += src/unix/bsd-ifaddrs.c \
|
||||
src/unix/darwin.c \
|
||||
src/unix/darwin-proctitle.c \
|
||||
src/unix/darwin-stub.h \
|
||||
src/unix/darwin.c \
|
||||
src/unix/fsevents.c \
|
||||
src/unix/kqueue.c \
|
||||
src/unix/proctitle.c \
|
||||
|
||||
@ -30,8 +30,7 @@
|
||||
#include <TargetConditionals.h>
|
||||
|
||||
#if !TARGET_OS_IPHONE
|
||||
# include <CoreFoundation/CoreFoundation.h>
|
||||
# include <ApplicationServices/ApplicationServices.h>
|
||||
#include "darwin-stub.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
97
src/unix/darwin-stub.h
Normal file
97
src/unix/darwin-stub.h
Normal file
@ -0,0 +1,97 @@
|
||||
/* Copyright libuv project contributors. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef UV_DARWIN_STUB_H_
|
||||
#define UV_DARWIN_STUB_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct CFArrayCallBacks;
|
||||
struct CFRunLoopSourceContext;
|
||||
struct FSEventStreamContext;
|
||||
|
||||
typedef double CFAbsoluteTime;
|
||||
typedef double CFTimeInterval;
|
||||
typedef int FSEventStreamEventFlags;
|
||||
typedef int OSStatus;
|
||||
typedef long CFIndex;
|
||||
typedef struct CFArrayCallBacks CFArrayCallBacks;
|
||||
typedef struct CFRunLoopSourceContext CFRunLoopSourceContext;
|
||||
typedef struct FSEventStreamContext FSEventStreamContext;
|
||||
typedef uint32_t FSEventStreamCreateFlags;
|
||||
typedef uint64_t FSEventStreamEventId;
|
||||
typedef unsigned CFStringEncoding;
|
||||
typedef void* CFAllocatorRef;
|
||||
typedef void* CFArrayRef;
|
||||
typedef void* CFBundleRef;
|
||||
typedef void* CFDictionaryRef;
|
||||
typedef void* CFRunLoopRef;
|
||||
typedef void* CFRunLoopSourceRef;
|
||||
typedef void* CFStringRef;
|
||||
typedef void* CFTypeRef;
|
||||
typedef void* FSEventStreamRef;
|
||||
|
||||
typedef void (*FSEventStreamCallback)(const FSEventStreamRef,
|
||||
void*,
|
||||
size_t,
|
||||
void*,
|
||||
const FSEventStreamEventFlags*,
|
||||
const FSEventStreamEventId*);
|
||||
|
||||
struct CFRunLoopSourceContext {
|
||||
CFIndex version;
|
||||
void* info;
|
||||
void* pad[7];
|
||||
void (*perform)(void*);
|
||||
};
|
||||
|
||||
struct FSEventStreamContext {
|
||||
CFIndex version;
|
||||
void* info;
|
||||
void* pad[3];
|
||||
};
|
||||
|
||||
static const CFStringEncoding kCFStringEncodingUTF8 = 0x8000100;
|
||||
static const OSStatus noErr = 0;
|
||||
|
||||
static const FSEventStreamEventId kFSEventStreamEventIdSinceNow = -1;
|
||||
|
||||
static const int kFSEventStreamCreateFlagNoDefer = 2;
|
||||
static const int kFSEventStreamCreateFlagFileEvents = 16;
|
||||
|
||||
static const int kFSEventStreamEventFlagEventIdsWrapped = 8;
|
||||
static const int kFSEventStreamEventFlagHistoryDone = 16;
|
||||
static const int kFSEventStreamEventFlagItemChangeOwner = 0x4000;
|
||||
static const int kFSEventStreamEventFlagItemCreated = 0x100;
|
||||
static const int kFSEventStreamEventFlagItemFinderInfoMod = 0x2000;
|
||||
static const int kFSEventStreamEventFlagItemInodeMetaMod = 0x400;
|
||||
static const int kFSEventStreamEventFlagItemIsDir = 0x20000;
|
||||
static const int kFSEventStreamEventFlagItemModified = 0x1000;
|
||||
static const int kFSEventStreamEventFlagItemRemoved = 0x200;
|
||||
static const int kFSEventStreamEventFlagItemRenamed = 0x800;
|
||||
static const int kFSEventStreamEventFlagItemXattrMod = 0x8000;
|
||||
static const int kFSEventStreamEventFlagKernelDropped = 4;
|
||||
static const int kFSEventStreamEventFlagMount = 64;
|
||||
static const int kFSEventStreamEventFlagRootChanged = 32;
|
||||
static const int kFSEventStreamEventFlagUnmount = 128;
|
||||
static const int kFSEventStreamEventFlagUserDropped = 2;
|
||||
|
||||
#endif /* UV_DARWIN_STUB_H_ */
|
||||
@ -41,34 +41,33 @@ void uv__fsevents_loop_delete(uv_loop_t* loop) {
|
||||
|
||||
#else /* TARGET_OS_IPHONE */
|
||||
|
||||
#include "darwin-stub.h"
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include <CoreFoundation/CFRunLoop.h>
|
||||
#include <CoreServices/CoreServices.h>
|
||||
static const int kFSEventsModified =
|
||||
kFSEventStreamEventFlagItemChangeOwner |
|
||||
kFSEventStreamEventFlagItemFinderInfoMod |
|
||||
kFSEventStreamEventFlagItemInodeMetaMod |
|
||||
kFSEventStreamEventFlagItemModified |
|
||||
kFSEventStreamEventFlagItemXattrMod;
|
||||
|
||||
/* These are macros to avoid "initializer element is not constant" errors
|
||||
* with old versions of gcc.
|
||||
*/
|
||||
#define kFSEventsModified (kFSEventStreamEventFlagItemFinderInfoMod | \
|
||||
kFSEventStreamEventFlagItemModified | \
|
||||
kFSEventStreamEventFlagItemInodeMetaMod | \
|
||||
kFSEventStreamEventFlagItemChangeOwner | \
|
||||
kFSEventStreamEventFlagItemXattrMod)
|
||||
static const int kFSEventsRenamed =
|
||||
kFSEventStreamEventFlagItemCreated |
|
||||
kFSEventStreamEventFlagItemRemoved |
|
||||
kFSEventStreamEventFlagItemRenamed;
|
||||
|
||||
#define kFSEventsRenamed (kFSEventStreamEventFlagItemCreated | \
|
||||
kFSEventStreamEventFlagItemRemoved | \
|
||||
kFSEventStreamEventFlagItemRenamed)
|
||||
|
||||
#define kFSEventsSystem (kFSEventStreamEventFlagUserDropped | \
|
||||
kFSEventStreamEventFlagKernelDropped | \
|
||||
kFSEventStreamEventFlagEventIdsWrapped | \
|
||||
kFSEventStreamEventFlagHistoryDone | \
|
||||
kFSEventStreamEventFlagMount | \
|
||||
kFSEventStreamEventFlagUnmount | \
|
||||
kFSEventStreamEventFlagRootChanged)
|
||||
static const int kFSEventsSystem =
|
||||
kFSEventStreamEventFlagUserDropped |
|
||||
kFSEventStreamEventFlagKernelDropped |
|
||||
kFSEventStreamEventFlagEventIdsWrapped |
|
||||
kFSEventStreamEventFlagHistoryDone |
|
||||
kFSEventStreamEventFlagMount |
|
||||
kFSEventStreamEventFlagUnmount |
|
||||
kFSEventStreamEventFlagRootChanged;
|
||||
|
||||
typedef struct uv__fsevents_event_s uv__fsevents_event_t;
|
||||
typedef struct uv__cf_loop_signal_s uv__cf_loop_signal_t;
|
||||
@ -148,7 +147,7 @@ static void (*pFSEventStreamRelease)(FSEventStreamRef);
|
||||
static void (*pFSEventStreamScheduleWithRunLoop)(FSEventStreamRef,
|
||||
CFRunLoopRef,
|
||||
CFStringRef);
|
||||
static Boolean (*pFSEventStreamStart)(FSEventStreamRef);
|
||||
static int (*pFSEventStreamStart)(FSEventStreamRef);
|
||||
static void (*pFSEventStreamStop)(FSEventStreamRef);
|
||||
|
||||
#define UV__FSEVENTS_PROCESS(handle, block) \
|
||||
@ -215,7 +214,7 @@ static void uv__fsevents_push_event(uv_fs_event_t* handle,
|
||||
|
||||
|
||||
/* Runs in CF thread, when there're events in FSEventStream */
|
||||
static void uv__fsevents_event_cb(ConstFSEventStreamRef streamRef,
|
||||
static void uv__fsevents_event_cb(const FSEventStreamRef streamRef,
|
||||
void* info,
|
||||
size_t numEvents,
|
||||
void* eventPaths,
|
||||
@ -340,11 +339,8 @@ static int uv__fsevents_create_stream(uv_loop_t* loop, CFArrayRef paths) {
|
||||
FSEventStreamCreateFlags flags;
|
||||
|
||||
/* Initialize context */
|
||||
ctx.version = 0;
|
||||
memset(&ctx, 0, sizeof(ctx));
|
||||
ctx.info = loop;
|
||||
ctx.retain = NULL;
|
||||
ctx.release = NULL;
|
||||
ctx.copyDescription = NULL;
|
||||
|
||||
latency = 0.05;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user