diff options
author | Kris Kennaway <kris@FreeBSD.org> | 2003-04-17 10:27:06 +0000 |
---|---|---|
committer | Kris Kennaway <kris@FreeBSD.org> | 2003-04-17 10:27:06 +0000 |
commit | c8c848bfb652a4f776d77e58d5a1f15c3364f094 (patch) | |
tree | a9fd24afaa78cc9f15223f87b0aac3acbb403716 /Mk | |
parent | Update to 0.9.8 (diff) |
- Improve USE_PACKAGE_DEPENDS to work correctly for LIB_DEPENDS, and
avoid installing packages when the target is configure or extract
[1]
- If PYTHON_VERSION is set, do not automatically add a dependency on
python: USE_PYTHON must now be specified explicitly. This allows the
variable to be set in make.conf or the environment to specify a
preference for the python version to be used. [2]
- When checking for an existing installation of the port, check by
port origin instead of only looking for the current version of the
package. [3]
- Do not install perllocal.pod files; they are not used on FreeBSD. [4]
- Improve 'make deinstall' to deinstall any existing version of the
package (e.g. older versions) instead of only trying to deinstall the
version currently described by the port. [5]
- Check for world-writable files/directories in the security-check
target. [6]
- Improve the patching of libtool so it works with pathnames ending in
a slash. [7]
- Allow ports that use the INSTALL macros to install files when
running as non-root (i.e. don't try to chown/chgrp) [8].
- Add the USE_GETOPT_LONG variable, which adds a dependency on
libgnugetopt on systems older than 500041, and uses the system version
otherwise. [9]
- Improve the fetch-required target to correctly deal with fetching
dependencies that use the ':target' form. [10]
- Add support for re-fetching interrupted distfiles. The FETCH_REGET
variable specifies the number of times to try continuing the distfile
fetch if it fails the md5 checksum. [11]
PR: 36083 [1], 44875 [2], 48646 [3], 48960 [4], 49017 [5], 49969 [6],
50069 [7], 50159 [8], 50323 [9], 50669 [10], 12325 [11]
Submitted by: dinoex [1], Gerhard Schmidt <estartu@augusta.de> [2],
Sergey Matveychuk <sem@ciam.ru> [3] [5], tobez [4],
Erwin Lansing <erwin@lansing.dk> [4],
Arjan de Vet <devet@devet.org> [6],
Hartmut Brandt <brandt@fokus.fraunhofer.de> [7], gerald [8],
Sergei Kolobov <sergei@kolobov.com> [9],
Erwin Lansing <erwin@lansing.dk> [10], alex [11]
Notes
Notes:
svn path=/head/; revision=79127
Diffstat (limited to 'Mk')
-rw-r--r-- | Mk/bsd.port.mk | 185 |
1 files changed, 145 insertions, 40 deletions
diff --git a/Mk/bsd.port.mk b/Mk/bsd.port.mk index 8f2fba9d702a..dce0ea00fafe 100644 --- a/Mk/bsd.port.mk +++ b/Mk/bsd.port.mk @@ -275,6 +275,12 @@ FreeBSD_MAINTAINER= portmgr@FreeBSD.org # LIBTOOLFLAGS - Additional flags to pass to ltconfig # (default: --disable-ltlibs) ## +# USE_GETOPT_LONG - Says that the port uses getopt_long. If OSVERSION +# less than 500041, automatically adds devel/libgnugeopt +# to LIB_DEPENDS, and pass adjusted values of +# CPPFLAGS and LDFLAGS in CONFIGURE_ENV. +# Default: not set. +## # USE_PERL5 - Says that the port uses perl5 for building and running. # USE_PERL5_BUILD - Says that the port uses perl5 for building. # USE_PERL5_RUN - Says that the port uses perl5 for running. @@ -543,12 +549,13 @@ FreeBSD_MAINTAINER= portmgr@FreeBSD.org # For fetch: # # FETCH_CMD - Full path to ftp/http fetch command if not in $PATH -# (default: "/usr/bin/fetch -A"). +# (default: "/usr/bin/fetch -ARr"). # FETCH_BEFORE_ARGS - # Arguments to ${FETCH_CMD} before filename (default: none). # FETCH_AFTER_ARGS - # Arguments to ${FETCH_CMD} following filename (default: none). # FETCH_ENV - Environment to pass to ${FETCH_CMD} (default: none). +# FETCH_REGET - Times to retry fetching of files on checksum errors (default: 1). # # For extract: # @@ -968,7 +975,7 @@ MAKE_ENV+= OPENSSLLIB=${OPENSSLLIB} OPENSSLINC=${OPENSSLINC} \ .include "${PORTSDIR}/Mk/bsd.emacs.mk" .endif -.if defined(USE_PYTHON) || defined(PYTHON_VERSION) +.if defined(USE_PYTHON) .include "${PORTSDIR}/Mk/bsd.python.mk" .endif @@ -1250,6 +1257,15 @@ CXX= g++32 BUILD_DEPENDS+= gcc32:${PORTSDIR}/lang/gcc32 .endif +.if defined(USE_GETOPT_LONG) +.if ${OSVERSION} < 500041 +LIB_DEPENDS= gnugetopt.1:${PORTSDIR}/devel/libgnugetopt +CPPFLAGS+= -I${LOCALBASE}/include +LDFLAGS+= -L${LOCALBASE}/lib -lgnugetopt +CONFIGURE_ENV+= CPPFLAGS="${CPPFLAGS}" LDFLAGS="${LDFLAGS}" +.endif +.endif + .if defined(USE_LINUX) RUN_DEPENDS+= ${LINUXBASE}/etc/redhat-release:${PORTSDIR}/emulators/linux_base .endif @@ -1372,7 +1388,7 @@ CONFIGURE_ARGS+=--x-libraries=${X11BASE}/lib --x-includes=${X11BASE}/include .include "${PORTSDIR}/Mk/bsd.gnome.mk" -.if defined(USE_PYTHON) || defined(PYTHON_VERSION) +.if defined(USE_PYTHON) .include "${PORTSDIR}/Mk/bsd.python.mk" .endif @@ -1439,11 +1455,13 @@ PTHREAD_LIBS= -lc_r .if ${OSVERSION} < 300000 FETCH_CMD?= /usr/bin/fetch .else -FETCH_CMD?= /usr/bin/fetch -A +FETCH_CMD?= /usr/bin/fetch -ARr +FETCH_REGET?= 1 .endif #FETCH_BEFORE_ARGS+= $${CKSIZE:+-S $$CKSIZE} .else FETCH_CMD?= /usr/bin/ftp +FETCH_REGET?= 0 .endif TOUCH?= /usr/bin/touch @@ -2501,8 +2519,16 @@ do-fetch: for _file in ${DISTFILES}; do \ file=`echo $$_file | ${SED} -E -e 's/:[^:]+$$//'` ; \ select=`echo $${_file#$${file}} | ${SED} -e 's/^://' -e 's/,/ /g'` ; \ - if [ ! -f $$file -a ! -f `${BASENAME} $$file` ]; then \ - if [ -L $$file -o -L `${BASENAME} $$file` ]; then \ + force_fetch=false; \ + filebasename=`${BASENAME} $$file`; \ + for afile in ${FORCE_FETCH}; do \ + afile=`${BASENAME} $$afile`; \ + if [ "x$$afile" = "x$$filebasename" ]; then \ + force_fetch=true; \ + fi; \ + done; \ + if [ ! -f $$file -a ! -f $$filebasename -o "$$force_fetch" = "true" ]; then \ + if [ -L $$file -o -L $$filebasename ]; then \ ${ECHO_MSG} ">> ${_DISTDIR}/$$file is a broken symlink."; \ ${ECHO_MSG} ">> Perhaps a filesystem (most likely a CD) isn't mounted?"; \ ${ECHO_MSG} ">> Please correct this problem and try again."; \ @@ -2558,7 +2584,15 @@ do-fetch: for _file in ${PATCHFILES}; do \ file=`echo $$_file | ${SED} -E -e 's/:[^:]+$$//'` ; \ select=`echo $${_file#$${file}} | ${SED} -e 's/^://' -e 's/,/ /g'` ; \ - if [ ! -f $$file -a ! -f `${BASENAME} $$file` ]; then \ + force_fetch=false; \ + filebasename=`${BASENAME} $$file`; \ + for afile in ${FORCE_FETCH}; do \ + afile=`${BASENAME} $$afile`; \ + if [ "x$$afile" = "x$$filebasename" ]; then \ + force_fetch=true; \ + fi; \ + done; \ + if [ ! -f $$file -a ! -f $$filebasename -o "$$force_fetch" = "true" ]; then \ if [ -L $$file -o -L `${BASENAME} $$file` ]; then \ ${ECHO_MSG} ">> ${_DISTDIR}/$$file is a broken symlink."; \ ${ECHO_MSG} ">> Perhaps a filesystem (most likely a CD) isn't mounted?"; \ @@ -2699,7 +2733,7 @@ do-configure: @(cd ${CONFIGURE_WRKSRC} && \ if ! ${SETENV} CC="${CC}" CXX="${CXX}" \ CFLAGS="${CFLAGS}" CXXFLAGS="${CXXFLAGS}" \ - INSTALL="/usr/bin/install -c -o ${BINOWN} -g ${BINGRP}" \ + INSTALL="/usr/bin/install -c ${_BINOWNGRP}" \ INSTALL_DATA="${INSTALL_DATA}" \ INSTALL_PROGRAM="${INSTALL_PROGRAM}" \ INSTALL_SCRIPT="${INSTALL_SCRIPT}" \ @@ -2718,7 +2752,7 @@ do-configure: ${SETENV} ${CONFIGURE_ENV} \ ${PERL5} ./${CONFIGURE_SCRIPT} ${CONFIGURE_ARGS} @cd ${CONFIGURE_WRKSRC} && \ - ${REINPLACE_CMD} -e 's/perllocal.pod/&-${PORTNAME}/' Makefile + ${PERL5} -pi -e 's/ doc_(perl|site|\$$\(INSTALLDIRS\))_install$$//' Makefile .endif .if defined(USE_IMAKE) @(cd ${CONFIGURE_WRKSRC}; ${SETENV} ${MAKE_ENV} ${XMKMF}) @@ -2841,7 +2875,8 @@ delete-package-list: delete-package-links-list .if !target(check-already-installed) check-already-installed: .if !defined(NO_PKG_REGISTER) && !defined(FORCE_PKG_REGISTER) - @if [ -d ${PKG_DBDIR}/${PKGNAME} ]; then \ + @if [ -d ${PKG_DBDIR}/${PKGNAME} -o \ + "x`${PKG_INFO} -q -O ${PKGORIGIN} 2> /dev/null`" != "x" ]; then \ ${ECHO_CMD} "===> ${PKGNAME} is already installed - perhaps an older version?"; \ ${ECHO_CMD} " If so, you may wish to \`\`make deinstall'' and install"; \ ${ECHO_CMD} " this port again by \`\`make reinstall'' to upgrade it properly."; \ @@ -2908,11 +2943,10 @@ security-check: # 2. accept()/recvfrom() which indicates network listening capability # 3. insecure functions (gets/mktemp/tempnam/[XXX]) # 4. startup scripts, in conjunction with 2. -# -# TODO: world-writable files/dirs +# 5. world-writable files/dirs # -@rm -f ${WRKDIR}/.PLIST.setuid ${WRKDIR}/.PLIST.stupid \ - ${WRKDIR}/.PLIST.network; \ + ${WRKDIR}/.PLIST.network ${WRKDIR}/.PLIST.writable; \ if [ -n "$$PORTS_AUDIT" ]; then \ stupid_functions_regexp=' (gets|mktemp|tempnam|tmpnam|strcpy|strcat|sprintf)$$'; \ else \ @@ -2946,9 +2980,14 @@ security-check: fi; \ fi; \ fi; \ + if [ ! -L "${PREFIX}/$$i" ]; then \ + if [ -n "`/usr/bin/find ${PREFIX}/$$i -prune -perm -0002 2>/dev/null`" ]; then \ + echo ${PREFIX}/$$i >> ${WRKDIR}/.PLIST.writable; \ + fi; \ + fi; \ done; \ ${GREP} '^etc/rc.d/' ${TMPPLIST} > ${WRKDIR}/.PLIST.startup; \ - if [ -s ${WRKDIR}/.PLIST.setuid -o -s ${WRKDIR}/.PLIST.network ]; then \ + if [ -s ${WRKDIR}/.PLIST.setuid -o -s ${WRKDIR}/.PLIST.network -o -s ${WRKDIR}/.PLIST.writable ]; then \ if [ -n "$$PORTS_AUDIT" ]; then \ echo "===> SECURITY REPORT (PARANOID MODE): "; \ else \ @@ -2972,6 +3011,11 @@ security-check: echo; \ fi; \ fi; \ + if [ -s ${WRKDIR}/.PLIST.writable ] ; then \ + echo " This port has installed the following world-writable files/directories."; \ + ${CAT} ${WRKDIR}/.PLIST.writable; \ + echo; \ + fi; \ echo " If there are vulnerabilities in these programs there may be a security"; \ echo " risk to the system. FreeBSD makes no guarantee about the security of"; \ echo " ports included in the Ports Collection. Please type 'make deinstall'"; \ @@ -3132,7 +3176,7 @@ patch-libtool: ${ECHO_CMD} "and reinstall ${PORTSDIR}/devel/libtool."; \ exit 1); \ fi; \ - LIBTOOLDIR=`${WHICH} ${LIBTOOL} | ${SED} -e 's^/bin/libtool^/share/libtool^'` || ${LOCALBASE}/share/libtool; \ + LIBTOOLDIR=`${WHICH} ${LIBTOOL} | ${SED} -e 's^/bin//*libtool^/share/libtool^'` || ${LOCALBASE}/share/libtool; \ cd ${PATCH_WRKSRC}; \ for file in ${LIBTOOLFILES}; do \ ${CP} $$file $$file.tmp; \ @@ -3184,11 +3228,13 @@ reinstall: .if !target(deinstall) deinstall: - @${ECHO_MSG} "===> Deinstalling for ${PKGNAME}" - @if ${PKG_INFO} -e ${PKGNAME}; then \ - ${PKG_DELETE} -f ${PKGNAME}; \ + @deinstall_name=`${PKG_INFO} -q -O ${PKGORIGIN} 2> /dev/null`; \ + ${TEST} -z $${deinstall_name} && deinstall_name=${PKGNAME}; \ + ${ECHO_MSG} "===> Deinstalling for ${PKGORIGIN} ($${deinstall_name})"; \ + if ${PKG_INFO} -e $${deinstall_name}; then \ + ${PKG_DELETE} -f $${deinstall_name}; \ else \ - ${ECHO_MSG} "===> ${PKGNAME} not installed, skipping"; \ + ${ECHO_MSG} "===> ${PKGORIGIN} not installed, skipping"; \ fi @${RM} -f ${INSTALL_COOKIE} ${PACKAGE_COOKIE} .endif @@ -3375,6 +3421,7 @@ checksum: fetch ${ECHO_MSG} ">> Checksum OK for $$file."; \ else \ ${ECHO_MSG} ">> Checksum mismatch for $$file."; \ + refetchlist="$$refetchlist$$file "; \ OK="false"; \ fi; \ done; \ @@ -3389,12 +3436,26 @@ checksum: fetch OK="false"; \ fi; \ done; \ + if [ "$$OK" != "true" ] && [ ${FETCH_REGET} -gt 0 ]; then \ + ${ECHO_MSG} "===> Refetch for ${FETCH_REGET} more times files: $$refetchlist"; \ + if ( cd ${.CURDIR} && \ + ${MAKE} ${.MAKEFLAGS} FORCE_FETCH="$$refetchlist" FETCH_REGET="`expr ${FETCH_REGET} - 1`" fetch); then \ + if ( cd ${.CURDIR} && \ + ${MAKE} ${.MAKEFLAGS} FETCH_REGET="`expr ${FETCH_REGET} - 1`" checksum ); then \ + OK="true"; \ + fi; \ + fi; \ + fi ; \ + if [ "$$OK" != "true" -a ${FETCH_REGET} -eq 0 ]; then \ + ${ECHO_MSG} "===> Giving up on fetching files: $$refetchlist"; \ + ${ECHO_MSG} "Make sure the Makefile and distinfo file (${MD5_FILE})"; \ + ${ECHO_MSG} "are up to date. If you are absolutely sure you want to override this"; \ + ${ECHO_MSG} "check, type \"make NO_CHECKSUM=yes [other args]\"."; \ + exit 1; \ + fi; \ if [ "$$OK" != "true" ]; then \ - ${ECHO_MSG} "Make sure the Makefile and distinfo file (${MD5_FILE})"; \ - ${ECHO_MSG} "are up to date. If you are absolutely sure you want to override this"; \ - ${ECHO_MSG} "check, type \"make NO_CHECKSUM=yes [other args]\"."; \ - exit 1; \ - fi) ; \ + exit 1; \ + fi); \ fi .endif @@ -3492,7 +3553,7 @@ ${deptype:L}-depends: else \ if [ X${USE_PACKAGE_DEPENDS} != "X" ]; then \ subpkgfile=`(cd $$dir; ${MAKE} $$depends_args -V PKGFILE)`; \ - if [ -r "$${subpkgfile}" ]; then \ + if [ -r "$${subpkgfile}" -a "$$target" = "${DEPENDS_TARGET}" ]; then \ ${ECHO_MSG} "===> Installing existing package $${subpkgfile}"; \ ${PKG_ADD} $${subpkgfile}; \ else \ @@ -3546,7 +3607,17 @@ lib-depends: if [ ! -d "$$dir" ]; then \ ${ECHO_MSG} " >> No directory for $$lib. Skipping.."; \ else \ - (cd $$dir; ${MAKE} -DINSTALLS_DEPENDS $$target $$depends_args) ; \ + if [ X${USE_PACKAGE_DEPENDS} != "X" ]; then \ + subpkgfile=`(cd $$dir; ${MAKE} $$depends_args -V PKGFILE)`; \ + if [ -r "$${subpkgfile}" -a "$$target" = "${DEPENDS_TARGET}" ]; then \ + ${ECHO_MSG} "===> Installing existing package $${subpkgfile}"; \ + ${PKG_ADD} $${subpkgfile}; \ + else \ + (cd $$dir; ${MAKE} -DINSTALLS_DEPENDS $$target $$depends_args) ; \ + fi; \ + else \ + (cd $$dir; ${MAKE} -DINSTALLS_DEPENDS $$target $$depends_args) ; \ + fi ; \ ${ECHO_MSG} "===> Returning to build of ${PKGNAME}"; \ if ! ${LDCONFIG} -r | ${GREP} -qwE -e "-l$$pattern"; then \ ${ECHO_MSG} "Error: shared library \"$$lib\" does not exist"; \ @@ -3634,27 +3705,61 @@ fetch-recursive-list: .endif .if !target(fetch-required) -fetch-required: +fetch-required: fetch @${ECHO_MSG} "===> Fetching all required distfiles for ${PKGNAME} and dependencies" - @for dir in ${.CURDIR} $$(${ALL-DEPENDS-LIST}); do \ - (cd $$dir; \ - tmp=`${MAKE} -V PKGNAME`; \ - if [ ! -d ${PKG_DBDIR}/$${tmp} ]; then \ - ${MAKE} fetch; \ - fi ); \ +.for deptype in EXTRACT PATCH FETCH BUILD RUN +.if defined(${deptype}_DEPENDS) +.if !defined(NO_DEPENDS) + @for i in ${${deptype}_DEPENDS}; do \ + prog=`${ECHO_CMD} $$i | ${SED} -e 's/:.*//'`; \ + dir=`${ECHO_CMD} $$i | ${SED} -e 's/[^:]*://'`; \ + if ${EXPR} "$$dir" : '.*:' > /dev/null; then \ + dir=`${ECHO_CMD} $$dir | ${SED} -e 's/:.*//'`; \ + if ${EXPR} "$$prog" : \\/ >/dev/null; then \ + if [ ! -e "$$prog" ]; then \ + (cd $$dir; ${MAKE} fetch); \ + fi; \ + fi; \ + else \ + (cd $$dir; \ + tmp=`${MAKE} -V PKGNAME`; \ + if [ ! -d ${PKG_DBDIR}/$${tmp} ]; then \ + ${MAKE} fetch; \ + fi ); \ + fi; \ done .endif +.endif +.endfor +.endif .if !target(fetch-required-list) -fetch-required-list: - @for dir in ${.CURDIR} $$(${ALL-DEPENDS-LIST}); do \ - (cd $$dir; \ - tmp=`${MAKE} -V PKGNAME`; \ - if [ ! -d ${PKG_DBDIR}/$${tmp} ]; then \ - ${MAKE} fetch-list; \ - fi ); \ +fetch-required-list: fetch-list +.for deptype in EXTRACT PATCH FETCH BUILD RUN +.if defined(${deptype}_DEPENDS) +.if !defined(NO_DEPENDS) + @for i in ${${deptype}_DEPENDS}; do \ + prog=`${ECHO_CMD} $$i | ${SED} -e 's/:.*//'`; \ + dir=`${ECHO_CMD} $$i | ${SED} -e 's/[^:]*://'`; \ + if ${EXPR} "$$dir" : '.*:' > /dev/null; then \ + dir=`${ECHO_CMD} $$dir | ${SED} -e 's/:.*//'`; \ + if ${EXPR} "$$prog" : \\/ >/dev/null; then \ + if [ ! -e "$$prog" ]; then \ + (cd $$dir; ${MAKE} fetch-list); \ + fi; \ + fi; \ + else \ + (cd $$dir; \ + tmp=`${MAKE} -V PKGNAME`; \ + if [ ! -d ${PKG_DBDIR}/$${tmp} ]; then \ + ${MAKE} fetch-list; \ + fi ); \ + fi; \ done .endif +.endif +.endfor +.endif .if !target(checksum-recursive) checksum-recursive: |