svn commit: r235122 - in head: . share/mk

Jeremie Le Hen jlh at FreeBSD.org
Mon May 7 09:00:31 UTC 2012


Author: jlh
Date: Mon May  7 09:00:30 2012
New Revision: 235122
URL: http://svn.freebsd.org/changeset/base/235122

Log:
  Introduce the ${SHLIB_LDSCRIPT} variable to have an ld(1) script
  instead of a symlink for .so files.
  
  Reviewed by:    kib, kan (previous version), dim
  Approved by:    kib (mentor)
  Silence from:   -hackers@
  MFC after:	1 week

Modified:
  head/Makefile.inc1
  head/share/mk/bsd.README
  head/share/mk/bsd.lib.mk

Modified: head/Makefile.inc1
==============================================================================
--- head/Makefile.inc1	Mon May  7 07:04:41 2012	(r235121)
+++ head/Makefile.inc1	Mon May  7 09:00:30 2012	(r235122)
@@ -265,6 +265,7 @@ XMAKE=		TOOLS_PREFIX=${WORLDTMP} ${BMAKE
 # world stage
 WMAKEENV=	${CROSSENV} \
 		_SHLIBDIRPREFIX=${WORLDTMP} \
+		_LDSCRIPTROOT= \
 		VERSION="${VERSION}" \
 		INSTALL="sh ${.CURDIR}/tools/install.sh" \
 		PATH=${TMPPATH}
@@ -307,6 +308,7 @@ LIB32FLAGS=	-m32 ${LIB32CPUFLAGS} -DCOMP
 # Yes, the flags are redundant.
 LIB32WMAKEENV+=	MAKEOBJDIRPREFIX=${OBJTREE}/lib32 \
 		_SHLIBDIRPREFIX=${LIB32TMP} \
+		_LDSCRIPTROOT=${LIB32TMP} \
 		VERSION="${VERSION}" \
 		INSTALL="sh ${.CURDIR}/tools/install.sh" \
 		PATH=${TMPPATH} \
@@ -319,11 +321,11 @@ LIB32WMAKE=	${LIB32WMAKEENV} ${MAKE} -DN
 		-DWITHOUT_BIND -DWITHOUT_MAN -DWITHOUT_INFO \
 		-DWITHOUT_HTML -DNO_CTF -DNO_LINT -ECC -ECXX -EAS -ELD \
 		DESTDIR=${LIB32TMP}
-LIB32IMAKE=	${LIB32WMAKE:NINSTALL=*:NDESTDIR=*} -DNO_INCS
+LIB32IMAKE=	${LIB32WMAKE:NINSTALL=*:NDESTDIR=*:N_LDSCRIPTROOT=*} -DNO_INCS
 .endif
 
 # install stage
-IMAKEENV=	${CROSSENV}
+IMAKEENV=	${CROSSENV:N_LDSCRIPTROOT=*}
 IMAKE=		${IMAKEENV} ${MAKE} -f Makefile.inc1
 .if empty(.MAKEFLAGS:M-n)
 IMAKEENV+=	PATH=${STRICTTMPPATH}:${INSTALLTMP} \

Modified: head/share/mk/bsd.README
==============================================================================
--- head/share/mk/bsd.README	Mon May  7 07:04:41 2012	(r235121)
+++ head/share/mk/bsd.README	Mon May  7 09:00:30 2012	(r235122)
@@ -352,6 +352,10 @@ SRCS		List of source files to build the 
 		to .c files of the same name.  (This is not the default for
 		versions of make.)
 
+SHLIB_LDSCRIPT	Template file to generate shared library linker script.
+		Unless used, a simple symlink is created to the real
+		shared object.
+
 The include file <bsd.lib.mk> includes the file named "../Makefile.inc"
 if it exists, as well as the include file <bsd.man.mk>.
 

Modified: head/share/mk/bsd.lib.mk
==============================================================================
--- head/share/mk/bsd.lib.mk	Mon May  7 07:04:41 2012	(r235121)
+++ head/share/mk/bsd.lib.mk	Mon May  7 09:00:30 2012	(r235122)
@@ -271,6 +271,25 @@ _libinstall:
 	    ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
 	    ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}
 .if defined(SHLIB_LINK)
+# ${_SHLIBDIRPREFIX} and ${_LDSCRIPTROOT} are both needed when cross-building
+# and when building 32 bits library shims.  ${_SHLIBDIRPREFIX} is the directory
+# prefix where shared objects will be installed.  ${_LDSCRIPTROOT} is the
+# directory prefix that will be used in generated ld(1) scripts.  They cannot
+# be coalesced because of the way ld(1) handles the sysroot prefix (used in the
+# cross-toolchain):
+# - 64 bits libs are located under sysroot, so ${_LDSCRIPTROOT} must be empty.
+# - 32 bits shims are not, so ${_LDSCRIPTROOT} is used to specify their full
+#   path.  Note that ld(1) scripts are generated both during buildworld and
+#   installworld; in the later case ${_LDSCRIPTROOT} must be obviously empty.
+# On the other hand, the use of ${_SHLIBDIRPREFIX} is more consistent since it
+# does not involve the logic of a tool we do not own.
+.if defined(SHLIB_LDSCRIPT) && !empty(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT})
+	sed -e 's,@@SHLIB@@,${_LDSCRIPTROOT}${SHLIBDIR}/${SHLIB_NAME},g' \
+	    -e 's,@@LIBDIR@@,${_LDSCRIPTROOT}${LIBDIR},g' \
+	    ${.CURDIR}/${SHLIB_LDSCRIPT} > lib${LIB}.ld
+	${INSTALL} -S -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
+	    ${_INSTALLFLAGS} lib${LIB}.ld ${DESTDIR}${LIBDIR}/${SHLIB_LINK}
+.else
 .if ${SHLIBDIR} == ${LIBDIR}
 	ln -fs ${SHLIB_NAME} ${DESTDIR}${LIBDIR}/${SHLIB_LINK}
 .else
@@ -281,8 +300,9 @@ _libinstall:
 	rm -f ${DESTDIR}${LIBDIR}/${SHLIB_NAME}
 .endif
 .endif
-.endif
-.endif
+.endif # SHLIB_LDSCRIPT
+.endif # SHLIB_LINK
+.endif # SHIB_NAME
 .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
 	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
 	    ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${LIBDIR}
@@ -350,6 +370,9 @@ clean:
 .endif
 .if defined(SHLIB_NAME)
 .if defined(SHLIB_LINK)
+.if defined(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT})
+	rm -f lib${LIB}.ld
+.endif
 	rm -f ${SHLIB_LINK}
 .endif
 .if defined(LIB) && !empty(LIB)


More information about the svn-src-all mailing list