-
Notifications
You must be signed in to change notification settings - Fork 4
/
Makefile
229 lines (205 loc) · 10.5 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
##
# Makefile for ruby
##
FW_DIR = $(NSFRAMEWORKDIR)/Ruby.framework
FW_VERSION_DIR = $(FW_DIR)/Versions/$(VERSION)
LOCAL_FW_RES_DIR = $(EXTRAS_DIR)/framework_resources
SITEDIR = /Library/Ruby/Site
USRGEMDIR = /Library/Ruby/Gems/$(VERSION0)
Project = ruby
UserType = Developer
ToolType = Commands
GnuAfterInstall = post-install install-plist install-irbrc install-rails-placeholder
GnuNoBuild = YES
##
# Determine our libressl path. ruby unfortunately needs to run the built product
# as part of the build, so we need to use a version of libressl that supports both
# the build machine and the host machine.
##
BUILDER_VERSION := $(shell sw_vers -productVersion)
BUILDER_MAJOR := $(shell echo $(BUILDER_VERSION) | cut -f1 -d.)
BUILDER_MINOR := $(shell echo $(BUILDER_VERSION) | cut -f2 -d.)
HOST_MAJOR := $(shell echo $(MACOSX_DEPLOYMENT_TARGET) | cut -f1 -d.)
HOST_MINOR := $(shell echo $(MACOSX_DEPLOYMENT_TARGET) | cut -f2 -d.)
HOST_NEWER := $(shell test $(HOST_MAJOR) -gt $(BUILDER_MAJOR) -o \( $(HOST_MAJOR) -eq $(BUILDER_MAJOR) -a $(HOST_MINOR) -gt $(BUILDER_MINOR) \) && echo "true")
ifeq ($(HOST_NEWER),true)
SSL_PATH := /usr/local/libressl-by-deployment-target/$(BUILDER_VERSION)
else
SSL_PATH := /usr/local/libressl-by-deployment-target/$(MACOSX_DEPLOYMENT_TARGET)
endif
# ruby_atomic.h + radar://108794024
Extra_CC_Flags = -DHAVE_GCC_ATOMIC_BUILTINS -fno-typed-memory-operations -fno-typed-cxx-new-delete
# <rdar://problem/64900188> ruby needs to switch to using the modern libffi closure API as the legacy API is not supported on arm64
Extra_CC_Flags += -DUSE_FFI_CLOSURE_ALLOC
# don't use xcrun as xcrun_log will break configure -- keep it like this for rbconfig.rb
Extra_Configure_Environment =
comma := ,
space :=
space +=
Extra_Configure_Flags = \
--prefix=$(FW_VERSION_DIR)$(USRDIR) \
--sysconfdir=$(SITEDIR) \
--with-sitedir=$(SITEDIR) \
--enable-shared \
--with-arch=$(subst $(space),$(comma),$(RC_ARCHS)) \
--with-openssl-dir=$(SDKROOT)$(SSL_PATH) \
--with-out-ext=tk \
--disable-silent-rules \
ac_cv_func_getcontext=no \
ac_cv_func_setcontext=no \
ac_cv_func_utimensat=no \
ac_cv_c_compiler_gnu=no \
ac_cv_header_net_if_h=yes \
av_cv_header_ifaddrs_h=yes \
rb_cv_pri_prefix_long_long=ll \
rb_cv_stack_grow_dir_arm64e=-1 \
ac_cv_sizeof_struct_stat_st_size=SIZEOF_OFF_T \
ac_cv_sizeof_struct_stat_st_blocks=SIZEOF_INT64_T \
ac_cv_sizeof_struct_stat_st_ino=SIZEOF_UINT64_T
# Stupid xcrun_log!
Configure=$(SRCROOT)/_Configure
# It's a GNU Source project
include $(MAKEFILEPATH)/CoreOS/ReleaseControl/GNUSource.make
Install_Target = install install-doc
Install_Flags = DESTDIR=$(DSTROOT)
EXTRAS_DIR = $(SRCROOT)/extras
# Automatic Extract & Patch
AEP_Project = $(Project)
AEP_Version = $(shell /usr/libexec/PlistBuddy -c 'Print :OpenSourceVersion' $(AEP_Project).plist)
AEP_URL = $(shell /usr/libexec/PlistBuddy -c 'Print :OpenSourceURL' $(AEP_Project).plist)
AEP_ProjVers = $(AEP_Project)-$(AEP_Version)
AEP_Filename = $(shell basename $(AEP_URL))
AEP_ExtractDir = $(AEP_ProjVers)
AEP_Patches = \
0001-Revert-Support-Universal-Binary-for-macOS.patch \
configure.diff \
tool_config.guess.diff \
tool_mkconfig.rb.diff \
common.mk.diff \
message_tracing_main.c.diff \
lib_rubygems_defaults.rb.diff \
getaddrinfo-test.diff \
empty_files_verifier.diff \
deprecate.diff \
ruby-gitignore-fix-build.patch \
ruby-bigdecimal-fix-build.patch \
ruby-configure-remove-cflags-check.patch \
ruby-test-maybe-unused.patch \
ruby-socket-extconf.patch \
update-mkconfig.rb-host_fields.patch \
102172098.patch \
CVE-2023-28756.patch \
108916473.patch
MAJOR = $(shell echo $(AEP_Version) | cut -d. -f1)
MINOR = $(shell echo $(AEP_Version) | cut -d. -f2)
TEENY = $(shell echo $(AEP_Version) | cut -d. -f3)
#TEENY = $(shell echo $(AEP_Version) | $(SED) -e 's:-p.*::' | cut -d. -f3)
VERSION = $(MAJOR).$(MINOR)
VERSION0 = $(MAJOR).$(MINOR).0
VERSION3 = $(MAJOR).$(MINOR).$(TEENY)
ConfigStamp2 = $(ConfigStamp)2
configure:: $(ConfigStamp2)
$(ConfigStamp2): $(ConfigStamp)
cat $(SRCROOT)/patches/Makefile.append >> ${BuildDirectory}/Makefile
@set -x && cd ${BuildDirectory} && arch_hdrdir=`$(MAKE) print_arch_hdrdir`
$(_v) $(TOUCH) $(ConfigStamp2)
build:: configure
$(INSTALL_DIRECTORY) $(SYMROOT)
$(_v) $(MAKE) -C $(BuildDirectory) CC=$(shell xcrun -f clang) OBJCOPY=": noobjcopy" RUBY_CODESIGN="-" ARCHFLAGS="$(foreach a,$(RC_ARCHS),-arch $(a))"
post-install:
$(INSTALL_DIRECTORY) $(DSTROOT)$(FW_VERSION_DIR)/Resources
$(LN) -vfsh Versions/Current/Resources $(DSTROOT)/$(FW_DIR)/Resources
$(INSTALL_FILE) $(LOCAL_FW_RES_DIR)/Info.plist $(DSTROOT)/$(FW_VERSION_DIR)/Resources
$(INSTALL_FILE) $(LOCAL_FW_RES_DIR)/version.plist $(DSTROOT)/$(FW_VERSION_DIR)/Resources
$(SED) -e "s:_CFBundleShortVersionString_:$(MACOSX_DEPLOYMENT_TARGET):" \
-e "s:_CFBundleVersion_:$(AEP_Version)-$(RC_ProjectSourceVersion):" \
$(LOCAL_FW_RES_DIR)/Info.plist > $(DSTROOT)/$(FW_VERSION_DIR)/Resources/Info.plist
$(INSTALL_FILE) $(LOCAL_FW_RES_DIR)/version.plist \
$(DSTROOT)/$(FW_VERSION_DIR)/Resources/version.plist
$(INSTALL_DIRECTORY) $(DSTROOT)/$(FW_VERSION_DIR)/Resources/English.lproj
$(INSTALL_FILE) $(LOCAL_FW_RES_DIR)/English.lproj/InfoPlist.strings $(DSTROOT)/$(FW_VERSION_DIR)/Resources/English.lproj
$(LN) -vfsh $(VERSION) $(DSTROOT)/$(FW_DIR)/Versions/Current
$(INSTALL_DIRECTORY) $(DSTROOT)/$(FW_VERSION_DIR)/Headers
$(LN) -vfsh Versions/Current/Headers $(DSTROOT)/$(FW_DIR)/Headers
$(LN) -vfh $(DSTROOT)$(FW_VERSION_DIR)$(USRINCLUDEDIR)/ruby-$(VERSION0)/ruby.h $(DSTROOT)/$(FW_DIR)/Headers/
$(INSTALL_DIRECTORY) $(DSTROOT)/$(FW_VERSION_DIR)/Headers/ruby
# fix #include <ruby.h> for BridgeSupport
for h in $(DSTROOT)$(FW_VERSION_DIR)$(USRINCLUDEDIR)/ruby-$(VERSION0)/*/*.h; do \
$(SED) -i '' -e 's:#include <ruby\.h>:#include "ruby\.h":' \
-e 's:const rb_data_type_t \*parent:const struct rb_data_type_struct \*parent:' $$h; \
$(LN) -vfh $$h $(DSTROOT)/$(FW_VERSION_DIR)/Headers/ruby; \
done
$(LN) -vfh $(shell find $(DSTROOT)$(FW_VERSION_DIR)$(USRINCLUDEDIR)/ruby-$(VERSION0) -name config.h) $(DSTROOT)/$(FW_VERSION_DIR)/Headers/ruby
$(LN) -vfsh . $(DSTROOT)/$(FW_VERSION_DIR)/Headers/ruby/ruby # support include "ruby/foo.h" from inside Headers/ruby
$(LN) -vfsh Versions/Current/Ruby $(DSTROOT)$(FW_DIR)/Ruby
find $(DSTROOT)$(FW_VERSION_DIR)$(USRLIBDIR) -name '*.a' -delete
rsync -irptgoD --include='*/' --include='*.dylib' --include='*.bundle' --include='*.so' --include='ruby' --exclude='*' $(OBJROOT)/ $(SYMROOT)/
find $(SYMROOT) -type f -perm -a+x | xargs -t -n 1 dsymutil
find $(SYMROOT) -empty -delete
find $(DSTROOT)$(FW_VERSION_DIR) -type f \( -name '*.so' -or -name '*.bundle' -or -name '*.dylib' \) | xargs -t $(STRIP) -x
$(ECHO) Ignore signature warning, binary will be resigned
$(STRIP) -x $(DSTROOT)$(FW_VERSION_DIR)$(USRBINDIR)/ruby
codesign -f -s - $(DSTROOT)$(FW_VERSION_DIR)$(USRBINDIR)/ruby
$(INSTALL_DIRECTORY) $(DSTROOT)$(USRBINDIR)
for i in $(shell find "$(DSTROOT)$(FW_VERSION_DIR)$(USRBINDIR)" -type f); do \
$(INSTALL_SCRIPT) $$i "$(DSTROOT)$(USRBINDIR)" || exit 1; \
done
$(INSTALL_DIRECTORY) "$(DSTROOT)/$(USRLIBDIR)"
rsync -aim --include='*/' --include='*.dylib' --exclude='*' "$(DSTROOT)$(FW_VERSION_DIR)$(USRLIBDIR)/" "$(DSTROOT)$(USRLIBDIR)/"
$(LN) -vfsh ../../System/Library/Frameworks/Ruby.framework/Versions/Current/usr/lib/ruby "$(DSTROOT)$(USRLIBDIR)"
$(LN) -vfsh ../../System/Library/Frameworks/Ruby.framework/Versions/Current/usr/share/ri "$(DSTROOT)/usr/share/ri"
$(INSTALL_DIRECTORY) "$(DSTROOT)/$(SITEDIR)"
$(LN) -vfsh ../../../../../../../../..$(SITEDIR) "$(DSTROOT)/$(FW_VERSION_DIR)$(USRLIBDIR)/ruby/site_ruby"
for i in $(shell find $(DSTROOT)$(FW_VERSION_DIR)$(USRLIBDIR) -type f -name 'libruby*dylib'); do \
$(MV) $$i $(DSTROOT)/$(FW_VERSION_DIR)/Ruby || exit 1; \
done
(cd $(DSTROOT)$(FW_VERSION_DIR)$(USRLIBDIR); $(LN) -vsh ../../Ruby $$(readlink libruby.dylib))
sh -x $(SRCROOT)/reexport.sh "$(DSTROOT)$(USRLIBDIR)/libruby.$(VERSION).dylib" "$(DSTROOT)$(FW_VERSION_DIR)/Ruby" "${VERSION}" "${VERSION3}"
# rdar://problem/8937160
find $(DSTROOT) -type l -print0 | xargs -0 -t chmod -h go-w
$(INSTALL_DIRECTORY) $(DSTROOT)/$(MANDIR)/man1
$(INSTALL_FILE) $(SRCROOT)/gem.1 $(DSTROOT)$(MANDIR)/man1
# nuke duplicates that are only different in case
find $(DSTROOT) -type f | sort -fr | uniq -id | xargs -t rm
# Now deal with dirs
find $(DSTROOT) -type d -path '*/ri/*' -empty -ls -delete
@echo 'vvv case insensitive duplicates vvv'
find $(DSTROOT) -print | sort -fr | uniq -id
@echo '^^^ Case Insensitive Duplicates ^^^'
$(INSTALL_DIRECTORY) $(DSTROOT)/$(USRGEMDIR)
find "$(OBJROOT)" -name "*.log" -print0 | while IFS= read -r -d $$'\0' mkmflog; do echo "Printing $$mkmflog"; cat "$$mkmflog"; done
darwinvers=`$(SRCROOT)/ruby/tool/config.guess | sed -e 's/.*-//' | sed -e 's/\..*//'`; if [ ! -e "$(DSTROOT)/$(FW_VERSION_DIR)/$(USRLIBDIR)/ruby/$(VERSION0)/universal-$${darwinvers}/socket.bundle" ]; then exit 1; fi
OSV = $(DSTROOT)/usr/local/OpenSourceVersions
OSL = $(DSTROOT)/usr/local/OpenSourceLicenses
install-plist:
$(INSTALL_DIRECTORY) $(OSV)
$(INSTALL_FILE) $(SRCROOT)/$(Project).plist $(OSV)/$(Project).plist
$(INSTALL_DIRECTORY) $(OSL)
$(INSTALL_FILE) $(Sources)/COPYING $(OSL)/$(Project).txt
ETC_DIR = $(DSTROOT)/private/etc
#need rails.1 rdoc.1 testrb.1
install-rails-placeholder:
$(INSTALL_FILE) -m 555 $(EXTRAS_DIR)/rails $(DSTROOT)/usr/bin
install-irbrc:
$(INSTALL_DIRECTORY) $(ETC_DIR)
$(INSTALL_FILE) $(EXTRAS_DIR)/irbrc $(ETC_DIR)/irbrc
# Extract the source.
install_source::
$(TAR) -C $(SRCROOT) -zxf $(SRCROOT)/$(AEP_Filename)
$(RM) $(SRCROOT)/$(AEP_Filename)
$(RMDIR) $(SRCROOT)/$(Project)
$(MV) $(SRCROOT)/$(AEP_ExtractDir) $(SRCROOT)/$(Project)
# Annotate the bison generated files
for f in $(SRCROOT)/$(Project)/parse.{c,h} $(SRCROOT)/$(Project)/ext/ripper/ripper.c; do \
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"; \
done
$(CP) $(SRCROOT)/extras/md5cc.{c,h} $(SRCROOT)/$(Project)/ext/digest/md5
$(CP) $(SRCROOT)/extras/sha1cc.{c,h} $(SRCROOT)/$(Project)/ext/digest/sha1
for patchfile in $(AEP_Patches); do \
patch --verbose -d $(SRCROOT)/$(Project) -p0 < $(SRCROOT)/patches/$$patchfile || exit 1; \
done
$(TOUCH) $(SRCROOT)/$(Project)/ext/win32ole/.document
$(RM) $(SRCROOT)/$(Project)/known_errors.inc
$(CP) $(SRCROOT)/known_errors.def $(SRCROOT)/$(Project)/defs/known_errors.def
# The LEGAL file incorrectly trips up the XBS license verifier. It should just look at COPYING.
$(RM) $(SRCROOT)/$(Project)/LEGAL