<pre style='margin:0'>
Ken (kencu) pushed a commit to branch master
in repository macports-legacy-support.

</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/a33d8e6ffe89eba9cee68845fa6878d8e9b27ef7">https://github.com/macports/macports-legacy-support/commit/a33d8e6ffe89eba9cee68845fa6878d8e9b27ef7</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit a33d8e6ffe89eba9cee68845fa6878d8e9b27ef7
</span>Author: Mihai Moldovan <ionic@ionic.de>
AuthorDate: Tue Oct 8 01:55:32 2019 +0200

<span style='display:block; white-space:pre;color:#404040;'>    Makefile: add shell function splitting, filtering and merging multi-architecture files for different code variants.
</span>---
 Makefile | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 98 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/Makefile b/Makefile
</span><span style='display:block; white-space:pre;color:#808080;'>index b1e403d..94c00f0 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/Makefile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/Makefile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -90,6 +90,104 @@ TESTPRGS_CPP    := $(patsubst %.cpp,%,$(TESTSRCS_CPP))
</span> TESTPRGS         = $(TESTPRGS_C) $(TESTPRGS_CPP)
 TESTRUNS        := $(patsubst $(TESTNAMEPREFIX)%,$(TESTRUNPREFIX)%,$(TESTPRGS))
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+define splitandfilterandmergemultiarch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   output='$(1)' && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   lipo='$(2)' && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   rm='$(3)' && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cp='$(4)' && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ld='$(5)' && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   grep='$(6)' && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   platform='$(7)' && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   force_arch='$(8)' && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   objectlist="$${output}".* && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   archlist='' && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   fatness='' && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for object in $${objectlist}; do \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if [ -z "$${force_arch}" ]; then \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   archlist_new="$$($${lipo} -archs "$${object}")"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           else \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   archlist_new="$${force_arch}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           fi && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if [ -n "$${archlist}" ] && [ "$${archlist}" != "$${archlist_new}" ]; then \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   printf 'Old/previous architecture list "%s" does not match new one "%s", this is unsupported.\n' "$${archlist}" "$${archlist_new}" >&2 && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   exit '1'; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           else \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   archlist="$${archlist_new}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           fi && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           ( $${lipo} -info "$${object}" | grep -qs '^Non-fat file:' ); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           fatness_new="$${?}" && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if [ -n "$${fatness}" ] && [ "$${fatness}" != "$${fatness_new}" ]; then \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   printf 'Old/previous fatness value "%d" does not match new one "%d", this is unsupported.\n' "$${fatness}" "$${fatness_new}" >&2 && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   exit '2'; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           else \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   fatness="$${fatness_new}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           fi && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if [ -n "$${force_arch}" ] && [ '0' -ne "$${fatness}" ]; then \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   printf 'Architecture forced to "%s", but object file "%s" is a multi-architecture (fat) object file, this is unsupported.\n' "$${force_arch}" "$${object}" >&2 && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   exit '3'; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           fi && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $$(: 'Check for unknown architectures.') && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           for arch in $${archlist}; do \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   case "$${arch}" in \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           (unknown*) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   printf 'Unknown architecture "%s" encountered, this is unsupported.\n' "$${arch}" >&2 && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   exit '4'; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   ;; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           (*) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   ;; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   esac && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if [ '0' -eq "$${fatness}" ]; then \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           $${cp} "$${object}" "$${object}.$${arch}" && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           $$(: 'A non-fat file cannot have more than one architecture, but breaking out sounds weird.'); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           $${lipo} "$${object}" -thin "$${arch}" -output "$${object}.$${arch}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   fi; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           done && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $${rm} "$${object}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   done && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $$(: '... and use ld to merge each variant into a single-architecture object file ...') && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for arch in $${archlist}; do \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $$(: 'Filter out variants not applicable to certain architectures.') && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $$(: 'For instance, the x86_64 architecture is fully UNIX2003-compliant and thus does not have $$UNIX2003-compat functons.') && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $$(: 'On the contrary, the i386 architecture has only $$UNIX2003-compat functions for the $$INODE64 feature set.') && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $$(: '10.4 is so old that it does not even have the $$INODE64 feature.') && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           case "$${arch}" in \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   ('x86_64') \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           $${ld} -r "$${output}.inode32.$${arch}" "$${output}.inode64.$${arch}" -o "$${output}.$${arch}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           ;; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   ('ppc64') \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           if [ '9' -gt "$${platform}" ]; then \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   $${ld} -r "$${output}.inode32.$${arch}" -o "$${output}.$${arch}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           else \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   $${ld} -r "$${output}.inode32.$${arch}" "$${output}.inode64.$${arch}" -o "$${output}.$${arch}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           fi; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           ;; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   ('i386'|'ppc') \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           if [ '9' -gt "$${platform}" ]; then \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   $${ld} -r "$${output}.inode32.$${arch}" "$${output}.inode32unix2003.$${arch}" -o "$${output}.$${arch}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           else \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   $${ld} -r "$${output}.inode32.$${arch}" "$${output}.inode32unix2003.$${arch}" "$${output}.inode64unix2003.$${arch}" -o "$${output}.$${arch}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           fi; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           ;; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   (*) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           $${ld} -r "$${output}.inode32.$${arch}" "$${output}.inode32unix2003.$${arch}" "$${output}.inode64.$${arch}" "$${output}.inode64unix2003.$${arch}" -o "$${output}.$${arch}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           ;; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           esac; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   done && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   $$(: '... build list of single-architecture merged object files ...') && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   objectarchlist='' && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for arch in $${archlist}; do \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           objectarchlist="$${objectarchlist} $${output}.$${arch}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   done && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if [ '0' -eq "$${fatness}" ]; then \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $$(: 'Thin files can just be copied directly, assuming that the list will only contain one element.') && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $${cp} $${objectarchlist} "$${output}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $$(: '... and eventually use lipo to merge them all together!') && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           $${lipo} $${objectarchlist} -create -output "$${output}"; \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+endef
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> all: dlib slib
 dlib: $(BUILDDLIBPATH)
 slib: $(BUILDSLIBPATH)
</pre><pre style='margin:0'>

</pre>