1##
2# Makefile for ruby
3##
4
5FW_DIR		= $(NSFRAMEWORKDIR)/Ruby.framework
6FW_VERSION_DIR	= $(FW_DIR)/Versions/$(VERSION)
7LOCAL_FW_RES_DIR = $(EXTRAS_DIR)/framework_resources
8SITEDIR		= /Library/Ruby/Site
9USRGEMDIR	= /Library/Ruby/Gems/$(VERSION3)
10
11Project		= ruby
12UserType	= Developer
13ToolType	= Commands
14GnuAfterInstall = post-install install-plist install-irbrc install-rails-placeholder
15GnuNoBuild	= YES
16
17# ruby_atomic.h
18Extra_CC_Flags = -DHAVE_GCC_SYNC_BUILTINS
19# don't expand CC -- keep it like this for rbconfig.rb
20Extra_Configure_Environment = CC="xcrun clang" CXX="xcrun clang++"
21comma := ,
22space :=
23space +=
24Extra_Configure_Flags  = \
25	--prefix=$(FW_VERSION_DIR)$(USRDIR) \
26	--sysconfdir=$(SITEDIR) \
27	--with-sitedir=$(SITEDIR) \
28	--enable-shared \
29	--with-arch=$(subst $(space),$(comma),$(RC_ARCHS)) \
30	ac_cv_func_getcontext=no \
31	ac_cv_func_setcontext=no \
32	ac_cv_c_compiler_gnu=no \
33	ac_cv_header_net_if_h=yes \
34	av_cv_header_ifaddrs_h=yes \
35	rb_cv_pri_prefix_long_long=ll
36
37# It's a GNU Source project
38include $(MAKEFILEPATH)/CoreOS/ReleaseControl/GNUSource.make
39
40Install_Target         = install install-doc
41Install_Flags          = DESTDIR=$(DSTROOT)
42
43EXTRAS_DIR = $(SRCROOT)/extras
44
45# Automatic Extract & Patch
46AEP_Project    = $(Project)
47AEP_Version    = 2.0.0-p481
48AEP_ProjVers   = $(AEP_Project)-$(AEP_Version)
49AEP_Filename   = $(AEP_ProjVers).tar.bz2
50AEP_ExtractDir = $(AEP_ProjVers)
51AEP_Patches    = ext_digest_md5_commoncrypto.diff \
52	ext_digest_sha1_commoncrypto.diff \
53	ext_openssl_extconf.rb.diff \
54	configure.diff \
55	tool_config.guess.diff \
56	tool_mkconfig.rb.diff \
57	ext_etc_etc.c.diff \
58	common.mk.diff \
59	message_tracing_main.c.diff
60
61MAJOR     = $(shell echo $(AEP_Version) | cut -d. -f1)
62MINOR     = $(shell echo $(AEP_Version) | cut -d. -f2)
63TEENY     = $(shell echo $(AEP_Version) | $(SED) -e 's:-p.*::' | cut -d. -f3)
64VERSION   = $(MAJOR).$(MINOR)
65VERSION3  = $(MAJOR).$(MINOR).$(TEENY)
66
67ConfigStamp2 = $(ConfigStamp)2
68
69configure:: $(ConfigStamp2)
70
71$(ConfigStamp2): $(ConfigStamp)
72	cat $(SRCROOT)/patches/Makefile.append >> ${BuildDirectory}/Makefile
73	@set -x && \
74	cd ${BuildDirectory} && \
75	arch_hdrdir=`$(MAKE) print_arch_hdrdir` && \
76	ed - $$arch_hdrdir/ruby/config.h < $(SRCROOT)/patches/config.h.ed
77	$(_v) $(TOUCH) $(ConfigStamp2)
78
79build:: configure
80	$(INSTALL_DIRECTORY) $(SYMROOT)
81	$(_v) $(MAKE) -C $(BuildDirectory) V=1 CC=$(shell xcrun -f clang) OBJCOPY=": noobjcopy" XLDFLAGS='' RUBY_CODESIGN="-"
82
83post-install:
84	$(INSTALL_DIRECTORY) $(DSTROOT)$(FW_VERSION_DIR)/Resources
85	$(LN) -vfsh Versions/Current/Resources $(DSTROOT)/$(FW_DIR)/Resources
86	$(INSTALL_FILE) $(LOCAL_FW_RES_DIR)/Info.plist $(DSTROOT)/$(FW_VERSION_DIR)/Resources
87	$(INSTALL_FILE) $(LOCAL_FW_RES_DIR)/version.plist $(DSTROOT)/$(FW_VERSION_DIR)/Resources
88	$(SED) -e "s:_CFBundleShortVersionString_:$(MACOSX_DEPLOYMENT_TARGET):" \
89	    -e "s:_CFBundleVersion_:$(AEP_Version)-$(RC_ProjectSourceVersion):" \
90	   $(LOCAL_FW_RES_DIR)/Info.plist > $(DSTROOT)/$(FW_VERSION_DIR)/Resources/Info.plist
91	$(INSTALL_FILE) $(LOCAL_FW_RES_DIR)/version.plist \
92		$(DSTROOT)/$(FW_VERSION_DIR)/Resources/version.plist
93	$(INSTALL_DIRECTORY) $(DSTROOT)/$(FW_VERSION_DIR)/Resources/English.lproj
94	$(INSTALL_FILE) $(LOCAL_FW_RES_DIR)/English.lproj/InfoPlist.strings $(DSTROOT)/$(FW_VERSION_DIR)/Resources/English.lproj
95	$(LN) -vfsh $(VERSION) $(DSTROOT)/$(FW_DIR)/Versions/Current
96	$(INSTALL_DIRECTORY) $(DSTROOT)/$(FW_VERSION_DIR)/Headers
97	$(LN) -vfsh Versions/Current/Headers $(DSTROOT)/$(FW_DIR)/Headers
98	$(LN) -vfh $(DSTROOT)$(FW_VERSION_DIR)$(USRINCLUDEDIR)/ruby-$(VERSION3)/ruby.h $(DSTROOT)/$(FW_DIR)/Headers/
99	$(INSTALL_DIRECTORY) $(DSTROOT)/$(FW_VERSION_DIR)/Headers/ruby
100	# fix #include <ruby.h> for BridgeSupport
101	for h in $(DSTROOT)$(FW_VERSION_DIR)$(USRINCLUDEDIR)/ruby-$(VERSION3)/*/*.h; do \
102		$(SED) -i '' -e 's:#include <ruby\.h>:#include "ruby\.h":' \
103			-e 's:const rb_data_type_t \*parent:const struct rb_data_type_struct \*parent:' $$h; \
104		$(LN) -vfh $$h $(DSTROOT)/$(FW_VERSION_DIR)/Headers/ruby; \
105	done
106	$(LN) -vfh $(shell find $(DSTROOT)$(FW_VERSION_DIR)$(USRINCLUDEDIR)/ruby-$(VERSION3) -name config.h) $(DSTROOT)/$(FW_VERSION_DIR)/Headers/ruby
107	$(LN) -vfsh . $(DSTROOT)/$(FW_VERSION_DIR)/Headers/ruby/ruby # support include "ruby/foo.h" from inside Headers/ruby
108	$(LN) -vfsh Versions/Current/Ruby $(DSTROOT)$(FW_DIR)/Ruby
109	find $(DSTROOT)$(FW_VERSION_DIR)$(USRLIBDIR) -name '*.a' -delete
110	rsync -irptgoD --include='*/' --include='*.dylib' --include='*.bundle' --include='*.so' --include='ruby' --exclude='*' $(OBJROOT)/ $(SYMROOT)/
111	find $(SYMROOT) -type f -perm -a+x | xargs -t -n 1 dsymutil
112	find $(SYMROOT) -empty -delete
113	find $(DSTROOT)$(FW_VERSION_DIR) -type f \( -name '*.so' -or -name '*.bundle' -or -name '*.dylib' \) | xargs -t $(STRIP) -x
114	$(ECHO) Ignore signature warning, binary will be resigned
115	$(STRIP) -x $(DSTROOT)$(FW_VERSION_DIR)$(USRBINDIR)/ruby
116	codesign -f -s - $(DSTROOT)$(FW_VERSION_DIR)$(USRBINDIR)/ruby
117	$(INSTALL_DIRECTORY) $(DSTROOT)$(USRBINDIR)
118	for i in $(shell find "$(DSTROOT)$(FW_VERSION_DIR)$(USRBINDIR)" -type f); do \
119		$(INSTALL_SCRIPT) $$i "$(DSTROOT)$(USRBINDIR)" || exit 1; \
120	done
121	$(INSTALL_DIRECTORY) "$(DSTROOT)/$(USRLIBDIR)"
122	rsync -aim --include='*/' --include='*.dylib' --exclude='*' "$(DSTROOT)$(FW_VERSION_DIR)$(USRLIBDIR)/" "$(DSTROOT)$(USRLIBDIR)/"
123	$(LN) -vfsh ../../System/Library/Frameworks/Ruby.framework/Versions/Current/usr/lib/ruby "$(DSTROOT)$(USRLIBDIR)"
124	$(LN) -vfsh ../../System/Library/Frameworks/Ruby.framework/Versions/Current/usr/share/ri "$(DSTROOT)/usr/share/ri"
125	$(INSTALL_DIRECTORY) "$(DSTROOT)/$(SITEDIR)"
126	$(LN) -vfsh ../../../../../../../../..$(SITEDIR) "$(DSTROOT)/$(FW_VERSION_DIR)$(USRLIBDIR)/ruby/site_ruby"
127	for i in $(shell find $(DSTROOT)$(FW_VERSION_DIR)$(USRLIBDIR) -type f -name 'libruby*dylib'); do \
128		$(MV) $$i $(DSTROOT)/$(FW_VERSION_DIR)/Ruby || exit 1; \
129	done
130	(cd $(DSTROOT)$(FW_VERSION_DIR)$(USRLIBDIR); $(LN) -vsh ../../Ruby $$(readlink libruby.dylib))
131	# rdar://problem/8937160
132	find $(DSTROOT) -type l -print0 | xargs -0 -t chmod -h go-w
133	$(INSTALL_DIRECTORY) $(DSTROOT)/$(MANDIR)/man1
134	$(INSTALL_FILE) $(SRCROOT)/gem.1 $(DSTROOT)$(MANDIR)/man1
135	# nuke duplicates that are only different in case
136	find $(DSTROOT) -type f | sort -fr | uniq -id | xargs -t rm
137	$(INSTALL_DIRECTORY) $(DSTROOT)/$(USRGEMDIR)
138
139OSV = $(DSTROOT)/usr/local/OpenSourceVersions
140OSL = $(DSTROOT)/usr/local/OpenSourceLicenses
141
142install-plist:
143	$(INSTALL_DIRECTORY) $(OSV)
144	$(INSTALL_FILE) $(SRCROOT)/$(Project).plist $(OSV)/$(Project).plist
145	$(INSTALL_DIRECTORY) $(OSL)
146	$(INSTALL_FILE) $(Sources)/COPYING $(OSL)/$(Project).txt
147
148ETC_DIR = $(DSTROOT)/private/etc
149
150#need rails.1 rdoc.1 testrb.1
151install-rails-placeholder:
152	$(INSTALL_FILE) -m 555 $(EXTRAS_DIR)/rails $(DSTROOT)/usr/bin
153
154install-irbrc:
155	$(INSTALL_DIRECTORY) $(ETC_DIR)
156	$(INSTALL_FILE) $(EXTRAS_DIR)/irbrc $(ETC_DIR)/irbrc
157
158# Extract the source.
159install_source::
160	$(TAR) -C $(SRCROOT) -zxf $(SRCROOT)/$(AEP_Filename)
161	$(RM) $(SRCROOT)/$(AEP_Filename)
162	$(RMDIR) $(SRCROOT)/$(Project)
163	$(MV) $(SRCROOT)/$(AEP_ExtractDir) $(SRCROOT)/$(Project)
164	# Annotate the bison generated files
165	for f in $(SRCROOT)/$(Project)/parse.{c,h} $(SRCROOT)/$(Project)/ext/ripper/ripper.c; do \
166		ruby -i -pe '$$_ = $$_ + %(\n/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */\n) if $$_ =~ /version 2.2 of Bison/' $$f && echo "Added BSD exception to $$f"; \
167	done
168	$(CP) $(SRCROOT)/extras/md5cc.{c,h} $(SRCROOT)/$(Project)/ext/digest/md5
169	$(CP) $(SRCROOT)/extras/sha1cc.{c,h} $(SRCROOT)/$(Project)/ext/digest/sha1
170	for patchfile in $(AEP_Patches); do \
171		patch --verbose -d $(SRCROOT)/$(Project) -p0 < $(SRCROOT)/patches/$$patchfile || exit 1; \
172	done
173	$(TOUCH) $(SRCROOT)/$(Project)/ext/win32ole/.document
174	awk '/EPERM/, /ELAST/ { if ($$1 == "#define" ) {if ($$2 !="ELAST") { print $$2;} else nextfile } else next}' < /usr/include/sys/errno.h >> $(SRCROOT)/$(Project)/defs/known_errors.def
175	$(SORT) -o $(SRCROOT)/$(Project)/defs/known_errors.def -u $(SRCROOT)/$(Project)/defs/known_errors.def
176	$(RM) $(SRCROOT)/$(Project)/known_errors.inc
177