Skip to content

Commit 8cc2387

Browse files
committed
Make the relocatable flag do something
1 parent 8443dea commit 8cc2387

File tree

2 files changed

+90
-7
lines changed

2 files changed

+90
-7
lines changed

cpython-unix/build-cpython.sh

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,11 @@ cat Makefile.extra
5959
pushd Python-${PYTHON_VERSION}
6060

6161

62-
# add `--enable-relocatable`
6362
if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_15}" ]; then
64-
patch -p1 -i ${ROOT}/patch-reloctable-flag.patch
63+
# add `--enable-relocatable`
64+
patch -p1 -i ${ROOT}/patch-relocatable-flag.patch
65+
# add native support for rpath
66+
patch -p1 -i ${ROOT}/patch-relocatable-link.patch
6567
fi
6668

6769
# configure doesn't support cross-compiling on Apple. Teach it.
@@ -163,10 +165,12 @@ fi
163165

164166
# The default build rule for the macOS dylib doesn't pick up libraries
165167
# from modules / makesetup. So patch it accordingly.
166-
if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_13}" ]; then
167-
patch -p1 -i ${ROOT}/patch-macos-link-extension-modules-13.patch
168-
else
169-
patch -p1 -i ${ROOT}/patch-macos-link-extension-modules.patch
168+
if [ -n "${PYTHON_MEETS_MAXIMUM_VERSION_3_14}" ]; then
169+
if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_13}" ]; then
170+
patch -p1 -i ${ROOT}/patch-macos-link-extension-modules-13.patch
171+
else
172+
patch -p1 -i ${ROOT}/patch-macos-link-extension-modules.patch
173+
fi
170174
fi
171175

172176
# Also on macOS, the `python` executable is linked against libraries defined by statically
@@ -687,7 +691,8 @@ fi
687691
# If we're building a shared library hack some binaries so rpath is set.
688692
# This ensures we can run the binary in any location without
689693
# LD_LIBRARY_PATH pointing to the directory containing libpython.
690-
if [ "${PYBUILD_SHARED}" = "1" ]; then
694+
# In 3.15+, we've upstreamed this behavior
695+
if [[ "${PYBUILD_SHARED}" = "1" && -n "${PYTHON_MEETS_MAXIMUM_VERSION_3_14}" ]]; then
691696
if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then
692697
# There's only 1 dylib produced on macOS and it has the binary suffix.
693698
LIBPYTHON_SHARED_LIBRARY_BASENAME=libpython${PYTHON_MAJMIN_VERSION}${PYTHON_BINARY_SUFFIX}.dylib
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
diff --git a/Makefile.pre.in b/Makefile.pre.in
2+
index 6c9cba59e27..39fc2e911d0 100644
3+
--- a/Makefile.pre.in
4+
+++ b/Makefile.pre.in
5+
@@ -1028,7 +1028,12 @@ libpython3.so: libpython$(LDVERSION).so
6+
$(BLDSHARED) $(NO_AS_NEEDED) -o $@ -Wl,-h$@ $^
7+
8+
libpython$(LDVERSION).dylib: $(LIBRARY_OBJS)
9+
- $(CC) -dynamiclib $(PY_CORE_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(LDVERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(DTRACE_OBJS) $(SHLIBS) $(LIBC) $(LIBM); \
10+
+ if [ "$(RELOCATABLE)" = "yes" ]; then \
11+
+ install_name="@executable_path/../lib/libpython$(LDVERSION).dylib"; \
12+
+ else \
13+
+ install_name="$(prefix)/lib/libpython$(LDVERSION).dylib"; \
14+
+ fi; \
15+
+ $(CC) -dynamiclib $(PY_CORE_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$$install_name -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(DTRACE_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM);
16+
17+
18+
libpython$(VERSION).sl: $(LIBRARY_OBJS)
19+
diff --git a/configure b/configure
20+
index 38f2d4dfbf2..153add6ac12 100755
21+
--- a/configure
22+
+++ b/configure
23+
@@ -13749,7 +13749,13 @@ then
24+
LINKFORSHARED="-Wl,-E -Wl,+s";;
25+
# LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";;
26+
Linux-android*) LINKFORSHARED="-pie -Xlinker -export-dynamic";;
27+
- Linux*|GNU*) LINKFORSHARED="-Xlinker -export-dynamic";;
28+
+ Linux*|GNU*)
29+
+ LINKFORSHARED="-Xlinker -export-dynamic"
30+
+ # Add rpath for relocatable builds
31+
+ if test "x$enable_relocatable" = xyes; then
32+
+ LINKFORSHARED="$LINKFORSHARED -Wl,-rpath=\$ORIGIN/../lib"
33+
+ fi
34+
+ ;;
35+
# -u libsys_s pulls in all symbols in libsys
36+
Darwin/*|iOS/*)
37+
LINKFORSHARED="$extra_undefs -framework CoreFoundation"
38+
@@ -13774,6 +13780,10 @@ printf "%s\n" "#define THREAD_STACK_SIZE 0x$stack_size" >>confdefs.h
39+
if test "$enable_framework"; then
40+
LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
41+
fi
42+
+ # Add rpath for relocatable builds
43+
+ if test "x$enable_relocatable" = xyes; then
44+
+ LINKFORSHARED="$LINKFORSHARED -Wl,-rpath,@executable_path/../lib"
45+
+ fi
46+
LINKFORSHARED="$LINKFORSHARED"
47+
elif test $ac_sys_system = "iOS"; then
48+
LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)'
49+
diff --git a/configure.ac b/configure.ac
50+
index b1c859071f4..a40d279ebab 100644
51+
--- a/configure.ac
52+
+++ b/configure.ac
53+
@@ -3613,7 +3613,13 @@ then
54+
LINKFORSHARED="-Wl,-E -Wl,+s";;
55+
# LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";;
56+
Linux-android*) LINKFORSHARED="-pie -Xlinker -export-dynamic";;
57+
- Linux*|GNU*) LINKFORSHARED="-Xlinker -export-dynamic";;
58+
+ Linux*|GNU*)
59+
+ LINKFORSHARED="-Xlinker -export-dynamic"
60+
+ # Add rpath for relocatable builds
61+
+ if test "x$enable_relocatable" = xyes; then
62+
+ LINKFORSHARED="$LINKFORSHARED -Wl,-rpath=\$ORIGIN/../lib"
63+
+ fi
64+
+ ;;
65+
# -u libsys_s pulls in all symbols in libsys
66+
Darwin/*|iOS/*)
67+
LINKFORSHARED="$extra_undefs -framework CoreFoundation"
68+
@@ -3638,6 +3644,10 @@ then
69+
if test "$enable_framework"; then
70+
LINKFORSHARED="$LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)'
71+
fi
72+
+ # Add rpath for relocatable builds
73+
+ if test "x$enable_relocatable" = xyes; then
74+
+ LINKFORSHARED="$LINKFORSHARED -Wl,-rpath,@executable_path/../lib"
75+
+ fi
76+
LINKFORSHARED="$LINKFORSHARED"
77+
elif test $ac_sys_system = "iOS"; then
78+
LINKFORSHARED="-Wl,-stack_size,$stack_size $LINKFORSHARED "'$(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)'

0 commit comments

Comments
 (0)