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
This commit is contained in:
Jeremie Le Hen 2012-05-07 09:00:30 +00:00
parent 5ff7271fdf
commit 51a65f35df
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=235122
3 changed files with 33 additions and 4 deletions

View File

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

View File

@ -352,6 +352,10 @@ SRCS List of source files to build the library. Suffix types
to .c files of the same name. (This is not the default for to .c files of the same name. (This is not the default for
versions of make.) 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" The include file <bsd.lib.mk> includes the file named "../Makefile.inc"
if it exists, as well as the include file <bsd.man.mk>. if it exists, as well as the include file <bsd.man.mk>.

View File

@ -271,6 +271,25 @@ _libinstall:
${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \ ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
${SHLIB_NAME} ${DESTDIR}${SHLIBDIR} ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}
.if defined(SHLIB_LINK) .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} .if ${SHLIBDIR} == ${LIBDIR}
ln -fs ${SHLIB_NAME} ${DESTDIR}${LIBDIR}/${SHLIB_LINK} ln -fs ${SHLIB_NAME} ${DESTDIR}${LIBDIR}/${SHLIB_LINK}
.else .else
@ -281,8 +300,9 @@ _libinstall:
rm -f ${DESTDIR}${LIBDIR}/${SHLIB_NAME} rm -f ${DESTDIR}${LIBDIR}/${SHLIB_NAME}
.endif .endif
.endif .endif
.endif .endif # SHLIB_LDSCRIPT
.endif .endif # SHLIB_LINK
.endif # SHIB_NAME
.if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no" .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${LIBDIR} ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${LIBDIR}
@ -350,6 +370,9 @@ clean:
.endif .endif
.if defined(SHLIB_NAME) .if defined(SHLIB_NAME)
.if defined(SHLIB_LINK) .if defined(SHLIB_LINK)
.if defined(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT})
rm -f lib${LIB}.ld
.endif
rm -f ${SHLIB_LINK} rm -f ${SHLIB_LINK}
.endif .endif
.if defined(LIB) && !empty(LIB) .if defined(LIB) && !empty(LIB)