diff --git a/CMakeLists.txt b/CMakeLists.txt index e8a3d4722ce866d927b217437fdf948f5c03bbe0..3500bff3160feb6789b2a97cad02c660fc849b44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -213,6 +213,7 @@ include_directories("${PROJECT_SOURCE_DIR}") include_directories("${PROJECT_SOURCE_DIR}/include") include_directories("${PROJECT_BINARY_DIR}/include") include_directories("${PROJECT_SOURCE_DIR}/connector/c/include") +include_directories("${PROJECT_SOURCE_DIR}/third_party/libobjc") # # Specify prefixes diff --git a/cfg/CMakeLists.txt b/cfg/CMakeLists.txt index 023137b4935252967a42496726669f1cd943bc63..0319f8449f86fa0613717a4bc6022e0840797fde 100644 --- a/cfg/CMakeLists.txt +++ b/cfg/CMakeLists.txt @@ -70,4 +70,4 @@ add_custom_target(config DEPENDS ${CMAKE_SOURCE_DIR}/cfg/prscfg.h ${generated_headers}) -add_dependencies(cfg libluajit) +add_dependencies(cfg libluajit libobjc) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 50a510e95c115d79f2d4523433f3132ebb1fa55b..33518238039e5502a7655f3aa79433c7157dbc91 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -87,14 +87,15 @@ add_library(core STATIC ${common_sources}) add_dependencies(core generate_headers) set_target_properties(core PROPERTIES COMPILE_FLAGS "${core_cflags}") -set (common_libraries cfg core ev coro gopt misc objc) +set (common_libraries cfg core ev coro gopt misc) set (THREAD_LIB pthread) if (ENABLE_STATIC) set (THREAD_LIB -Wl,--whole-archive pthread -Wl,--no-whole-archive) endif() -set (common_libraries ${common_libraries} ${LUAJIT_LIB} ${THREAD_LIB}) +set (LIBOBJC_LIB "${PROJECT_BINARY_DIR}/third_party/libobjc/libobjc.a") +set (common_libraries ${common_libraries} ${LUAJIT_LIB} ${LIBOBJC_LIB} ${THREAD_LIB}) if (TARGET_OS_LINUX) set (common_libraries ${common_libraries} dl) diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index 882ca44c20c864e12400e2695cae4c3561d97f54..f8297cfd008415709c42a563f964ee3af636c027 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -69,6 +69,37 @@ macro (luajit_build) unset (luajit_buildoptions) endmacro() +macro(libobjc_build) + if (${CMAKE_BUILD_TYPE} STREQUAL "Debug") + set (extra_cflags "-g -O0 -fno-inline") + else () + set (extra_cflags "-O3") + endif() + if (${TARGET_OS_LINUX}) + set (extra_cflags "${extra_cflags} -D_GNU_SOURCE") + endif() + if (CMAKE_COMPILER_IS_CLANG) + set (extra_cflags "${extra_cflags} -Wno-deprecated-objc-isa-usage") + endif() + if (NOT (${PROJECT_BINARY_DIR} STREQUAL ${PROJECT_SOURCE_DIR})) + add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/third_party/libobjc + COMMAND mkdir ${PROJECT_BINARY_DIR}/third_party/libobjc + COMMAND cp -r ${PROJECT_SOURCE_DIR}/third_party/libobjc/* + ${PROJECT_BINARY_DIR}/third_party/libobjc + ) + endif() + add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/third_party/libobjc/libobjc.a + WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/third_party/libobjc + COMMAND $(MAKE) clean + COMMAND $(MAKE) EXTRA_CFLAGS=""${extra_cflags}"" + DEPENDS ${PROJECT_BINARY_DIR}/CMakeCache.txt + ) + add_custom_target(libobjc + DEPENDS ${PROJECT_BINARY_DIR}/third_party/libobjc/libobjc.a + ) + unset (extra_cflags) +endmacro() + # # building shipped luajit only if there is no # usable system one (see cmake/luajit.cmake) or by demand. @@ -76,3 +107,4 @@ endmacro() if (ENABLE_BUNDLED_LUAJIT) luajit_build() endif() +libobjc_build() diff --git a/third_party/libobjc/Makefile b/third_party/libobjc/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..30eaebad64d450279df29d76a63c8fcaff20b3e3 --- /dev/null +++ b/third_party/libobjc/Makefile @@ -0,0 +1,127 @@ +.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 + +SILENT=@ + +CFLAGS += -std=gnu99 -fPIC -fexceptions +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` + +STRIP=`if [ "$(strip)" = "yes" ] ; then echo -s ; fi` + +# Suppress warnings about incorrect selectors +CPPFLAGS += -DNO_SELECTOR_MISMATCH_WARNINGS +# Some helpful flags for debugging. +CPPFLAGS+= ${EXTRA_CFLAGS} + +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: $(LIBOBJC).a + +$(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) \ + -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) \ + -o $@ $(OBJECTS) + +$(LIBOBJC).a: $(OBJECTS) + $(SILENT)echo Linking static Objective-C runtime library... + $(SILENT)ld -r -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