Merge branch 'master' into ci
commit
28a218451d
@ -1,107 +0,0 @@
|
|||||||
|
|
||||||
# Check to see if GNUstep-config is available.
|
|
||||||
ifeq ($(GNUSTEP_MAKEFILES),)
|
|
||||||
GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(GNUSTEP_MAKEFILES),)
|
|
||||||
#
|
|
||||||
# Start of section for building without GNUstep
|
|
||||||
#
|
|
||||||
$(warning GNUstep not found -\
|
|
||||||
building for standalone installation.)
|
|
||||||
|
|
||||||
include Makefile
|
|
||||||
|
|
||||||
#
|
|
||||||
# End of section for building without GNUstep-make
|
|
||||||
#
|
|
||||||
else
|
|
||||||
#
|
|
||||||
# Start of GNUstep specific section.
|
|
||||||
#
|
|
||||||
$(warning GNUstep found -\
|
|
||||||
building for install in the GNUstep filesystem.)
|
|
||||||
|
|
||||||
PACKAGE_NAME = gnustep-objc2
|
|
||||||
SVN_MODULE_NAME = libobjc2
|
|
||||||
SVN_BASE_URL = svn+ssh://svn.gna.org/svn/gnustep/libs
|
|
||||||
SVN_TAG_NAME=objc2
|
|
||||||
|
|
||||||
GNUSTEP_INSTALLATION_DOMAIN ?= LOCAL
|
|
||||||
|
|
||||||
ifeq ($(messages),yes)
|
|
||||||
SILENT ?=
|
|
||||||
endif
|
|
||||||
|
|
||||||
INSTALL := dummy_install
|
|
||||||
|
|
||||||
include Makefile
|
|
||||||
include $(GNUSTEP_MAKEFILES)/names.make
|
|
||||||
|
|
||||||
# Hack to support -03 for Clang and get the __sync_* GCC builtins work
|
|
||||||
# -O3 requires -march=i586 on Linux x86-32, otherwise Clang compiles
|
|
||||||
# programs that segfaults if -fobjc-nonfragile-abi is used.
|
|
||||||
ifeq ($(findstring linux, $(GNUSTEP_TARGET_OS)), linux)
|
|
||||||
ifeq ($(GNUSTEP_TARGET_CPU), ix86)
|
|
||||||
CFLAGS += -march=i586
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Hack to get mingw to provide declaration for strdup (since it is non-standard)
|
|
||||||
ifeq ($(GNUSTEP_TARGET_OS), mingw32)
|
|
||||||
${LIBOBJC}_CPPFLAGS += -U__STRICT_ANSI__
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Shouldn't be needed starting with OpenBSD 5.2
|
|
||||||
ifeq ($(findstring openbsd, `$CC -dumpmachine`), openbsd)
|
|
||||||
LDFLAGS += -pthread
|
|
||||||
else
|
|
||||||
LDFLAGS += -lpthread
|
|
||||||
endif
|
|
||||||
|
|
||||||
LIB_DIR := $(shell gnustep-config --variable=GNUSTEP_$(GNUSTEP_INSTALLATION_DOMAIN)_LIBRARIES 2>/dev/null)
|
|
||||||
ifeq ($(LIB_DIR),)
|
|
||||||
LIB_DIR := $(shell gmake -s -f "$(GNUSTEP_MAKEFILES)/empty.make" print-gnustep-install-libraries GNUSTEP_INSTALLATION_DOMAIN=$(GNUSTEP_INSTALLATION_DOMAIN) quiet=yes 2>/dev/null)
|
|
||||||
endif
|
|
||||||
ifeq ($(LIB_DIR),)
|
|
||||||
$(error Unable to use gnustep-config to get install directory - is gnustep-config in your PATH?)
|
|
||||||
endif
|
|
||||||
|
|
||||||
HEADER_DIR := $(shell gnustep-config --variable=GNUSTEP_$(GNUSTEP_INSTALLATION_DOMAIN)_HEADERS 2>/dev/null)
|
|
||||||
ifeq ($(HEADER_DIR),)
|
|
||||||
HEADER_DIR := $(shell gmake -s -f "$(GNUSTEP_MAKEFILES)/empty.make" print-gnustep-install-headers GNUSTEP_INSTALLATION_DOMAIN=$(GNUSTEP_INSTALLATION_DOMAIN) quiet=yes 2>/dev/null)
|
|
||||||
endif
|
|
||||||
ifeq ($(HEADER_DIR),)
|
|
||||||
$(error Unable to use gnustep-config to get install directory - is gnustep-config in your PATH?)
|
|
||||||
endif
|
|
||||||
|
|
||||||
install: all
|
|
||||||
$(SILENT)echo Installing libraries...
|
|
||||||
$(SILENT)install -d $(LIB_DIR)
|
|
||||||
$(SILENT)install -m 444 $(STRIP) $(LIBOBJC).so.$(VERSION) $(LIB_DIR)
|
|
||||||
$(SILENT)install -m 444 $(STRIP) $(LIBOBJCXX).so.$(VERSION) $(LIB_DIR)
|
|
||||||
$(SILENT)install -m 444 $(STRIP) $(LIBOBJC).a $(LIB_DIR)
|
|
||||||
$(SILENT)echo Creating symbolic links...
|
|
||||||
$(SILENT)ln -sf $(LIBOBJC).so.$(VERSION) $(LIB_DIR)/$(LIBOBJC).so
|
|
||||||
$(SILENT)ln -sf $(LIBOBJC).so.$(VERSION) $(LIB_DIR)/$(LIBOBJC).so.$(MAJOR_VERSION)
|
|
||||||
$(SILENT)ln -sf $(LIBOBJC).so.$(VERSION) $(LIB_DIR)/$(LIBOBJC).so.$(MAJOR_VERSION).$(MINOR_VERSION)
|
|
||||||
$(SILENT)ln -sf $(LIBOBJCXX).so.$(VERSION) $(LIB_DIR)/$(LIBOBJCXX).so
|
|
||||||
$(SILENT)ln -sf $(LIBOBJCXX).so.$(VERSION) $(LIB_DIR)/$(LIBOBJCXX).so.$(MAJOR_VERSION)
|
|
||||||
$(SILENT)ln -sf $(LIBOBJCXX).so.$(VERSION) $(LIB_DIR)/$(LIBOBJCXX).so.$(MAJOR_VERSION).$(MINOR_VERSION)
|
|
||||||
$(SILENT)echo Installing headers...
|
|
||||||
$(SILENT)install -d $(HEADER_DIR)/objc
|
|
||||||
$(SILENT)install -m 444 objc/*.h $(HEADER_DIR)/objc
|
|
||||||
$(SILENT)install -m 444 objc/*.h $(HEADER_DIR)/objc
|
|
||||||
$(SILENT)echo "To use the newly installed objc2 library with GNUstep,"
|
|
||||||
$(SILENT)echo "please change to your gnustep-make directory and"
|
|
||||||
$(SILENT)echo "type 'configure; make install' to tell gnustep-make"
|
|
||||||
$(SILENT)echo "to use the new library (you will then need to configure"
|
|
||||||
$(SILENT)echo "and build gnustep-base to use the new library too)."
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
|
|
||||||
#
|
|
||||||
# End of GNUstep-make specific section.
|
|
||||||
#
|
|
||||||
endif
|
|
||||||
@ -1,153 +0,0 @@
|
|||||||
.POSIX:
|
|
||||||
|
|
||||||
.SUFFIXES: .cc .c .m .o .S
|
|
||||||
|
|
||||||
MAJOR_VERSION = 4
|
|
||||||
MINOR_VERSION = 6
|
|
||||||
SUBMINOR_VERSION = 0
|
|
||||||
VERSION ?= $(MAJOR_VERSION).$(MINOR_VERSION).$(SUBMINOR_VERSION)
|
|
||||||
|
|
||||||
LIBOBJCLIBNAME=objc
|
|
||||||
LIBOBJC=libobjc
|
|
||||||
LIBOBJCXX=libobjcxx
|
|
||||||
|
|
||||||
INSTALL ?= install
|
|
||||||
SILENT ?= @
|
|
||||||
|
|
||||||
CFLAGS += -std=gnu99 -fPIC -fexceptions
|
|
||||||
#CFLAGS += -Wno-deprecated-objc-isa-usage
|
|
||||||
CXXFLAGS += -fPIC -fexceptions
|
|
||||||
CPPFLAGS += -DTYPE_DEPENDENT_DISPATCH -DGNUSTEP
|
|
||||||
CPPFLAGS += -D__OBJC_RUNTIME_INTERNAL__=1 -D_XOPEN_SOURCE=500 -D__BSD_VISIBLE=1 -D_BSD_SOURCE=1
|
|
||||||
|
|
||||||
ASMFLAGS += `if $(CC) -v 2>&1| grep -q 'clang' ; then echo -no-integrated-as ; fi`
|
|
||||||
|
|
||||||
THE_LD=`if [ "$(LD)" = "" ]; then echo "ld"; else echo "$(LD)"; fi`
|
|
||||||
|
|
||||||
STRIP=`if [ "$(strip)" = "yes" ] ; then echo -s ; fi`
|
|
||||||
|
|
||||||
# Suppress warnings about incorrect selectors
|
|
||||||
CPPFLAGS += -DNO_SELECTOR_MISMATCH_WARNINGS
|
|
||||||
# Some helpful flags for debugging.
|
|
||||||
#CPPFLAGS += -g -O0 -fno-inline
|
|
||||||
CPPFLAGS += -O3
|
|
||||||
|
|
||||||
PREFIX?= /usr/local
|
|
||||||
LIB_DIR= ${PREFIX}/lib
|
|
||||||
HEADER_DIR= ${PREFIX}/include
|
|
||||||
|
|
||||||
OBJCXX_OBJECTS = \
|
|
||||||
objcxx_eh.o
|
|
||||||
|
|
||||||
OBJECTS = \
|
|
||||||
NSBlocks.o\
|
|
||||||
Protocol2.o\
|
|
||||||
abi_version.o\
|
|
||||||
alias_table.o\
|
|
||||||
arc.o\
|
|
||||||
associate.o\
|
|
||||||
blocks_runtime.o\
|
|
||||||
block_to_imp.o\
|
|
||||||
block_trampolines.o\
|
|
||||||
objc_msgSend.o\
|
|
||||||
caps.o\
|
|
||||||
category_loader.o\
|
|
||||||
class_table.o\
|
|
||||||
dtable.o\
|
|
||||||
eh_personality.o\
|
|
||||||
encoding2.o\
|
|
||||||
gc_none.o\
|
|
||||||
hash_table.o\
|
|
||||||
hooks.o\
|
|
||||||
ivar.o\
|
|
||||||
legacy_malloc.o\
|
|
||||||
loader.o\
|
|
||||||
mutation.o\
|
|
||||||
properties.o\
|
|
||||||
protocol.o\
|
|
||||||
runtime.o\
|
|
||||||
sarray2.o\
|
|
||||||
selector_table.o\
|
|
||||||
sendmsg2.o\
|
|
||||||
statics_loader.o\
|
|
||||||
toydispatch.o
|
|
||||||
|
|
||||||
|
|
||||||
all: warning $(LIBOBJC).a $(LIBOBJCXX).so.$(VERSION)
|
|
||||||
@echo '********************************************************************************'
|
|
||||||
@echo '*********************************** WARNING ************************************'
|
|
||||||
@echo '********************************************************************************'
|
|
||||||
@echo The Makfile build is deprecated, and should not be used.
|
|
||||||
@echo Please use cmake. The recommended procedure is:
|
|
||||||
@echo $ mkdir Build
|
|
||||||
@echo $ cd Build
|
|
||||||
@echo cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
|
|
||||||
@echo "make && sudo -E make install"
|
|
||||||
|
|
||||||
warning:
|
|
||||||
@echo '********************************************************************************'
|
|
||||||
@echo '*********************************** WARNING ************************************'
|
|
||||||
@echo '********************************************************************************'
|
|
||||||
@echo The Makfile build is deprecated, and should not be used.
|
|
||||||
@echo Please use cmake. The recommended procedure is:
|
|
||||||
@echo $ mkdir Build
|
|
||||||
@echo $ cd Build
|
|
||||||
@echo cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
|
|
||||||
@echo "make && sudo -E make install"
|
|
||||||
|
|
||||||
$(LIBOBJCXX).so.$(VERSION): $(LIBOBJC).so.$(VERSION) $(OBJCXX_OBJECTS)
|
|
||||||
$(SILENT)echo Linking shared Objective-C++ runtime library...
|
|
||||||
$(SILENT)$(CXX) -shared \
|
|
||||||
-Wl,-soname=$(LIBOBJCXX).so.$(MAJOR_VERSION) $(LDFLAGS) \
|
|
||||||
-o $@ $(OBJCXX_OBJECTS)
|
|
||||||
|
|
||||||
$(LIBOBJC).so.$(VERSION): $(OBJECTS)
|
|
||||||
$(SILENT)echo Linking shared Objective-C runtime library...
|
|
||||||
$(SILENT)$(CC) -shared -rdynamic \
|
|
||||||
-Wl,-soname=$(LIBOBJC).so.$(MAJOR_VERSION) $(LDFLAGS) \
|
|
||||||
-o $@ $(OBJECTS)
|
|
||||||
|
|
||||||
$(LIBOBJC).a: $(OBJECTS)
|
|
||||||
$(SILENT)echo Linking static Objective-C runtime library...
|
|
||||||
$(SILENT)$(THE_LD) -r -s -o $@ $(OBJECTS)
|
|
||||||
|
|
||||||
.cc.o: Makefile
|
|
||||||
$(SILENT)echo Compiling `basename $<`...
|
|
||||||
$(SILENT)$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
|
|
||||||
|
|
||||||
.c.o: Makefile
|
|
||||||
$(SILENT)echo Compiling `basename $<`...
|
|
||||||
$(SILENT)$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
|
|
||||||
|
|
||||||
.m.o: Makefile
|
|
||||||
$(SILENT)echo Compiling `basename $<`...
|
|
||||||
$(SILENT)$(CC) $(CPPFLAGS) $(CFLAGS) -fobjc-exceptions -c $< -o $@
|
|
||||||
|
|
||||||
.S.o: Makefile
|
|
||||||
$(SILENT)echo Assembling `basename $<`...
|
|
||||||
$(SILENT)$(CC) $(CPPFLAGS) $(ASMFLAGS) -c $< -o $@
|
|
||||||
|
|
||||||
$(INSTALL): all
|
|
||||||
$(SILENT)echo Installing libraries...
|
|
||||||
$(SILENT)install -d $(LIB_DIR)
|
|
||||||
$(SILENT)install -m 444 $(STRIP) $(LIBOBJC).so.$(VERSION) $(LIB_DIR)
|
|
||||||
$(SILENT)install -m 444 $(STRIP) $(LIBOBJCXX).so.$(VERSION) $(LIB_DIR)
|
|
||||||
$(SILENT)install -m 444 $(STRIP) $(LIBOBJC).a $(LIB_DIR)
|
|
||||||
$(SILENT)echo Creating symbolic links...
|
|
||||||
$(SILENT)ln -sf $(LIBOBJC).so.$(VERSION) $(LIB_DIR)/$(LIBOBJC).so
|
|
||||||
$(SILENT)ln -sf $(LIBOBJC).so.$(VERSION) $(LIB_DIR)/$(LIBOBJC).so.$(MAJOR_VERSION)
|
|
||||||
$(SILENT)ln -sf $(LIBOBJC).so.$(VERSION) $(LIB_DIR)/$(LIBOBJC).so.$(MAJOR_VERSION).$(MINOR_VERSION)
|
|
||||||
$(SILENT)ln -sf $(LIBOBJCXX).so.$(VERSION) $(LIB_DIR)/$(LIBOBJCXX).so
|
|
||||||
$(SILENT)ln -sf $(LIBOBJCXX).so.$(VERSION) $(LIB_DIR)/$(LIBOBJCXX).so.$(MAJOR_VERSION)
|
|
||||||
$(SILENT)ln -sf $(LIBOBJCXX).so.$(VERSION) $(LIB_DIR)/$(LIBOBJCXX).so.$(MAJOR_VERSION).$(MINOR_VERSION)
|
|
||||||
$(SILENT)echo Installing headers...
|
|
||||||
$(SILENT)install -d $(HEADER_DIR)/objc
|
|
||||||
$(SILENT)install -m 444 objc/*.h $(HEADER_DIR)/objc
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(SILENT)echo Cleaning...
|
|
||||||
$(SILENT)rm -f $(OBJECTS)
|
|
||||||
$(SILENT)rm -f $(OBJCXX_OBJECTS)
|
|
||||||
$(SILENT)rm -f $(LIBOBJC).so.$(VERSION)
|
|
||||||
$(SILENT)rm -f $(LIBOBJCXX).so.$(VERSION)
|
|
||||||
$(SILENT)rm -f $(LIBOBJC).a
|
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
#include "Test.h"
|
||||||
|
|
||||||
|
int main(int argc, const char * argv[])
|
||||||
|
{
|
||||||
|
id __weak ref;
|
||||||
|
@autoreleasepool {
|
||||||
|
__block int val;
|
||||||
|
id block = ^() { return val++; };
|
||||||
|
assert(block != nil);
|
||||||
|
ref = block;
|
||||||
|
assert(ref != nil);
|
||||||
|
}
|
||||||
|
assert(ref == nil);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
#include "Test.h"
|
||||||
|
#include "../objc/runtime.h"
|
||||||
|
|
||||||
|
@interface Foo : Test
|
||||||
|
{
|
||||||
|
@public
|
||||||
|
__weak id w;
|
||||||
|
__unsafe_unretained id u;
|
||||||
|
__strong id s;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
@implementation Foo @end
|
||||||
|
@interface Dealloc : Test
|
||||||
|
@end
|
||||||
|
int dealloc = 0;
|
||||||
|
@implementation Dealloc
|
||||||
|
- (void)dealloc
|
||||||
|
{
|
||||||
|
dealloc++;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
void setIvar(id obj, const char * name, id val)
|
||||||
|
{
|
||||||
|
object_setIvar(obj, class_getInstanceVariable(object_getClass(obj), name), val);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
Foo *f = [Foo new];
|
||||||
|
Dealloc *d = [Dealloc new];
|
||||||
|
__unsafe_unretained Dealloc *dead;
|
||||||
|
setIvar(f, "w", d);
|
||||||
|
assert(f->w == d);
|
||||||
|
assert(dealloc == 0);
|
||||||
|
d = 0;
|
||||||
|
assert(dealloc == 1);
|
||||||
|
assert(f->w == nil);
|
||||||
|
dealloc = 0;
|
||||||
|
d = [Dealloc new];
|
||||||
|
dead = d;
|
||||||
|
setIvar(f, "s", d);
|
||||||
|
assert(dealloc == 0);
|
||||||
|
assert(f->s == d);
|
||||||
|
d = nil;
|
||||||
|
assert(dealloc == 0);
|
||||||
|
assert(f->s == dead);
|
||||||
|
setIvar(f, "s", nil);
|
||||||
|
assert(dealloc == 1);
|
||||||
|
assert(f->s == nil);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
#ifdef __LP64__
|
||||||
|
#define DTABLE_OFFSET 64
|
||||||
|
#define SMALLOBJ_MASK 7
|
||||||
|
#define SHIFT_OFFSET 0
|
||||||
|
#define DATA_OFFSET 8
|
||||||
|
#define SLOT_OFFSET 32
|
||||||
|
#else
|
||||||
|
#define DTABLE_OFFSET 32
|
||||||
|
#define SMALLOBJ_MASK 1
|
||||||
|
#define SHIFT_OFFSET 0
|
||||||
|
#define DATA_OFFSET 8
|
||||||
|
#define SLOT_OFFSET 16
|
||||||
|
#endif
|
||||||
Loading…
Reference in New Issue