diff options
Diffstat (limited to 'scripts')
46 files changed, 4992 insertions, 0 deletions
diff --git a/scripts/Makefile.am b/scripts/Makefile.am new file mode 100644 index 0000000..a080991 --- /dev/null +++ b/scripts/Makefile.am @@ -0,0 +1,42 @@ +# Makefile for rpm scripts. + +include $(top_srcdir)/rpm.am + +CLEANFILES = + +EXTRA_DIST = \ + brp-compress brp-python-bytecompile brp-java-gcjcompile \ + brp-strip brp-strip-comment-note brp-python-hardlink \ + brp-strip-shared brp-strip-static-archive \ + check-files check-prereqs \ + check-buildroot check-rpaths check-rpaths-worker \ + find-debuginfo.sh find-lang.sh \ + perldeps.pl perl.prov perl.req pythondeps.sh osgideps.pl \ + rpmdb_loadcvt rpm.daily rpm.log rpm2cpio.sh \ + tcl.req tgpg vpkg-provides.sh \ + find-requires.php find-provides.php \ + find-php-provides find-php-requires \ + mono-find-requires mono-find-provides \ + ocaml-find-requires.sh ocaml-find-provides.sh \ + pkgconfigdeps.sh libtooldeps.sh \ + fontconfig.prov desktop-file.prov script.req \ + macros.perl macros.php macros.python + +rpmconfig_SCRIPTS = \ + brp-compress brp-python-bytecompile brp-java-gcjcompile \ + brp-strip brp-strip-comment-note brp-python-hardlink \ + brp-strip-shared brp-strip-static-archive \ + check-files check-prereqs \ + check-buildroot check-rpaths check-rpaths-worker \ + find-lang.sh \ + perl.prov perl.req perldeps.pl pythondeps.sh osgideps.pl \ + mono-find-requires mono-find-provides \ + pkgconfigdeps.sh libtooldeps.sh \ + ocaml-find-requires.sh ocaml-find-provides.sh \ + fontconfig.prov desktop-file.prov script.req \ + rpmdb_loadcvt rpm2cpio.sh tcl.req tgpg + +rpmconfig_DATA = \ + rpm.daily rpm.log \ + macros.perl macros.php macros.python + diff --git a/scripts/Makefile.in b/scripts/Makefile.in new file mode 100644 index 0000000..bd91b3a --- /dev/null +++ b/scripts/Makefile.in @@ -0,0 +1,596 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile for rpm scripts. + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/rpm.am +subdir = scripts +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(rpmconfigdir)" \ + "$(DESTDIR)$(rpmconfigdir)" +SCRIPTS = $(rpmconfig_SCRIPTS) +SOURCES = +DIST_SOURCES = +DATA = $(rpmconfig_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOM4TE = @AUTOM4TE@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOXYGEN = @DOXYGEN@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIXPERMS = @FIXPERMS@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_DOT = @HAVE_DOT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +LUA_CFLAGS = @LUA_CFLAGS@ +LUA_LIBS = @LUA_LIBS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RPMCANONARCH = @RPMCANONARCH@ +RPMCANONCOLOR = @RPMCANONCOLOR@ +RPMCANONGNU = @RPMCANONGNU@ +RPMCANONOS = @RPMCANONOS@ +RPMCANONVENDOR = @RPMCANONVENDOR@ +RPMCONFIGDIR = @RPMCONFIGDIR@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WITH_ACL_LIB = @WITH_ACL_LIB@ +WITH_BZ2_LIB = @WITH_BZ2_LIB@ +WITH_CAP_LIB = @WITH_CAP_LIB@ +WITH_DB_LIB = @WITH_DB_LIB@ +WITH_LIBELF_LIB = @WITH_LIBELF_LIB@ +WITH_LZMA_LIB = @WITH_LZMA_LIB@ +WITH_MAGIC_INCLUDE = @WITH_MAGIC_INCLUDE@ +WITH_MAGIC_LIB = @WITH_MAGIC_LIB@ +WITH_NSS_INCLUDE = @WITH_NSS_INCLUDE@ +WITH_NSS_LIB = @WITH_NSS_LIB@ +WITH_POPT_INCLUDE = @WITH_POPT_INCLUDE@ +WITH_POPT_LIB = @WITH_POPT_LIB@ +WITH_PYTHON_INCLUDE = @WITH_PYTHON_INCLUDE@ +WITH_PYTHON_LIB = @WITH_PYTHON_LIB@ +WITH_SELINUX_LIB = @WITH_SELINUX_LIB@ +WITH_SEMANAGE_LIB = @WITH_SEMANAGE_LIB@ +WITH_ZLIB_INCLUDE = @WITH_ZLIB_INCLUDE@ +WITH_ZLIB_LIB = @WITH_ZLIB_LIB@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +__BZIP2 = @__BZIP2@ +__CAT = @__CAT@ +__CC = @__CC@ +__CHGRP = @__CHGRP@ +__CHMOD = @__CHMOD@ +__CHOWN = @__CHOWN@ +__CP = @__CP@ +__CPIO = @__CPIO@ +__CURL = @__CURL@ +__FAKECHROOT = @__FAKECHROOT@ +__FILE = @__FILE@ +__GPG = @__GPG@ +__GREP = @__GREP@ +__GZIP = @__GZIP@ +__ID = @__ID@ +__INSTALL = @__INSTALL@ +__LD = @__LD@ +__LRZIP = @__LRZIP@ +__LZIP = @__LZIP@ +__MAKE = @__MAKE@ +__MKDIR = @__MKDIR@ +__MKDIR_P = @__MKDIR_P@ +__MV = @__MV@ +__NM = @__NM@ +__OBJCOPY = @__OBJCOPY@ +__OBJDUMP = @__OBJDUMP@ +__PATCH = @__PATCH@ +__PERL = @__PERL@ +__PGP = @__PGP@ +__PYTHON = @__PYTHON@ +__RESTORECON = @__RESTORECON@ +__RM = @__RM@ +__RSH = @__RSH@ +__SED = @__SED@ +__SEMODULE = @__SEMODULE@ +__SSH = @__SSH@ +__STRIP = @__STRIP@ +__TAR = @__TAR@ +__UNZIP = @__UNZIP@ +__XZ = @__XZ@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +dirstamp = @dirstamp@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Internal binaries +rpmlibexecdir = $(prefix)/lib/rpm + +# Host independent config files +rpmconfigdir = $(prefix)/lib/rpm +CLEANFILES = +EXTRA_DIST = \ + brp-compress brp-python-bytecompile brp-java-gcjcompile \ + brp-strip brp-strip-comment-note brp-python-hardlink \ + brp-strip-shared brp-strip-static-archive \ + check-files check-prereqs \ + check-buildroot check-rpaths check-rpaths-worker \ + find-debuginfo.sh find-lang.sh \ + perldeps.pl perl.prov perl.req pythondeps.sh osgideps.pl \ + rpmdb_loadcvt rpm.daily rpm.log rpm2cpio.sh \ + tcl.req tgpg vpkg-provides.sh \ + find-requires.php find-provides.php \ + find-php-provides find-php-requires \ + mono-find-requires mono-find-provides \ + ocaml-find-requires.sh ocaml-find-provides.sh \ + pkgconfigdeps.sh libtooldeps.sh \ + fontconfig.prov desktop-file.prov script.req \ + macros.perl macros.php macros.python + +rpmconfig_SCRIPTS = \ + brp-compress brp-python-bytecompile brp-java-gcjcompile \ + brp-strip brp-strip-comment-note brp-python-hardlink \ + brp-strip-shared brp-strip-static-archive \ + check-files check-prereqs \ + check-buildroot check-rpaths check-rpaths-worker \ + find-lang.sh \ + perl.prov perl.req perldeps.pl pythondeps.sh osgideps.pl \ + mono-find-requires mono-find-provides \ + pkgconfigdeps.sh libtooldeps.sh \ + ocaml-find-requires.sh ocaml-find-provides.sh \ + fontconfig.prov desktop-file.prov script.req \ + rpmdb_loadcvt rpm2cpio.sh tcl.req tgpg + +rpmconfig_DATA = \ + rpm.daily rpm.log \ + macros.perl macros.php macros.python + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/rpm.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign scripts/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign scripts/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-rpmconfigSCRIPTS: $(rpmconfig_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(rpmconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(rpmconfigdir)" + @list='$(rpmconfig_SCRIPTS)'; test -n "$(rpmconfigdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(rpmconfigdir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(rpmconfigdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-rpmconfigSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(rpmconfig_SCRIPTS)'; test -n "$(rpmconfigdir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(rpmconfigdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(rpmconfigdir)" && rm -f $$files + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-rpmconfigDATA: $(rpmconfig_DATA) + @$(NORMAL_INSTALL) + test -z "$(rpmconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(rpmconfigdir)" + @list='$(rpmconfig_DATA)'; test -n "$(rpmconfigdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(rpmconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(rpmconfigdir)" || exit $$?; \ + done + +uninstall-rpmconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(rpmconfig_DATA)'; test -n "$(rpmconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(rpmconfigdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(rpmconfigdir)" && rm -f $$files +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(SCRIPTS) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(rpmconfigdir)" "$(DESTDIR)$(rpmconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-rpmconfigDATA install-rpmconfigSCRIPTS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-rpmconfigDATA uninstall-rpmconfigSCRIPTS + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-rpmconfigDATA \ + install-rpmconfigSCRIPTS install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-rpmconfigDATA uninstall-rpmconfigSCRIPTS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/scripts/brp-compress b/scripts/brp-compress new file mode 100755 index 0000000..1e8772d --- /dev/null +++ b/scripts/brp-compress @@ -0,0 +1,55 @@ +#!/bin/sh + +# If using normal root, avoid changing anything. +if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then + exit 0 +fi + +cd $RPM_BUILD_ROOT + +# Compress man pages +COMPRESS="gzip -9 -n" +COMPRESS_EXT=.gz + +for d in ./usr/man/man* ./usr/man/*/man* ./usr/info \ + ./usr/share/man/man* ./usr/share/man/*/man* ./usr/share/info \ + ./usr/kerberos/man ./usr/X11R6/man/man* ./usr/lib/perl5/man/man* \ + ./usr/share/doc/*/man/man* ./usr/lib/*/man/man* +do + [ -d $d ] || continue + for f in `find $d -type f ! -name dir` + do + [ -f "$f" ] || continue + + case "$f" in + *.gz|*.Z) gunzip -f $f; b=`echo $f | sed -e 's/\.\(gz\|Z\)$//'`;; + *.bz2) bunzip2 -f $f; b=`echo $f | sed -e 's/\.bz2$//'`;; + *.xz|*.lzma) unxz -f $f; b=`echo $f | sed -e 's/\.\(xz\|lzma\)$//'`;; + *) b=$f;; + esac + + $COMPRESS $b </dev/null 2>/dev/null || { + inode=`ls -i $b | awk '{ print $1 }'` + others=`find $d -type f -inum $inode` + if [ -n "$others" ]; then + for afile in $others ; do + [ "$afile" != "$b" ] && rm -f $afile + done + $COMPRESS -f $b + for afile in $others ; do + [ "$afile" != "$b" ] && ln $b$COMPRESS_EXT $afile$COMPRESS_EXT + done + else + $COMPRESS -f $b + fi + } + done + + for f in `find $d -type l` + do + l=`ls -l $f | sed -e 's/.* -> //' -e 's/\.\(gz\|Z\|bz2\|xz\|lzma\)$//'` + rm -f $f + b=`echo $f | sed -e 's/\.\(gz\|Z\|bz2\|xz\|lzma\)$//'` + ln -sf $l$COMPRESS_EXT $b$COMPRESS_EXT + done +done diff --git a/scripts/brp-java-gcjcompile b/scripts/brp-java-gcjcompile new file mode 100644 index 0000000..708a649 --- /dev/null +++ b/scripts/brp-java-gcjcompile @@ -0,0 +1,40 @@ +#!/bin/sh + +# If using normal root, avoid changing anything. +[ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ] && exit 0 + +# If we are a noarch package, avoid changing anything. +[ "$RPM_ARCH" = "noarch" ] && exit 0 + +# If we don't have the required executables, avoid changing anything. +gcj=${1:-/usr/bin/gcj} +[ ! -x "$gcj" -o ! -x "$gcj-dbtool" ] && exit 0 + +# Now get to work... +libdir="/usr/lib" # XXX need to sed this in or something +dbdir=`gcj-dbtool -p "$libdir"`.d/"$RPM_PACKAGE_NAME-$RPM_PACKAGE_VERSION" +cflags="$RPM_OPT_FLAGS -fPIC -findirect-dispatch" +ldflags="-Wl,-Bsymbolic" + +# XXX make it so you can override the list, for mx4j et al. +for jar in `find $RPM_BUILD_ROOT -type f -name "*.?ar"`; do + [ `head -c 2 "$jar"` != "PK" ] && continue + + [ -d "$RPM_BUILD_ROOT/$libdir" ] || mkdir -p "$RPM_BUILD_ROOT/$libdir" + + lib="$libdir/lib`basename $jar`.so" + [ -f "$RPM_BUILD_ROOT/$lib" ] && continue + + # XXX need splits to handle #158308 + # (til then we can just compile big ones ourselves) + echo "$PS4$gcj -shared $cflags $ldflags -o $lib $jar" + $gcj -shared $cflags $ldflags -o "$RPM_BUILD_ROOT/$lib" "$jar" + + [ -d "$RPM_BUILD_ROOT/$dbdir" ] || mkdir -p "$RPM_BUILD_ROOT/$dbdir" + + db="$dbdir/`basename $jar`.db" + [ -f "$RPM_BUILD_ROOT/$db" ] && exit 1 + + $gcj-dbtool -n "$RPM_BUILD_ROOT/$db" 64 + $gcj-dbtool -f "$RPM_BUILD_ROOT/$db" "$jar" "$lib" +done diff --git a/scripts/brp-python-bytecompile b/scripts/brp-python-bytecompile new file mode 100644 index 0000000..79996ea --- /dev/null +++ b/scripts/brp-python-bytecompile @@ -0,0 +1,75 @@ +#!/bin/bash +errors_terminate=$2 + +# If using normal root, avoid changing anything. +if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then + exit 0 +fi + +# If we don't have a python interpreter, avoid changing anything. +default_python=${1:-/usr/bin/python} +if [ ! -x "$default_python" ]; then + exit 0 +fi + +# Figure out how deep we need to descend. We could pick an insanely high +# number and hope it's enough, but somewhere, somebody's sure to run into it. +depth=`(find $RPM_BUILD_ROOT -type f -name "*.py" -print0 ; echo /) | \ + xargs -0 -n 1 dirname | sed 's,[^/],,g' | sort -u | tail -n 1 | wc -c` +if [ -z "$depth" -o "$depth" -le "1" ]; then + exit 0 +fi + +# .pyc/.pyo files embed a "magic" value, identifying the ABI version of Python +# bytecode that they are for. +# +# The files below RPM_BUILD_ROOT could be targetting multiple versions of +# python (e.g. a single build that emits several subpackages e.g. a +# python26-foo subpackage, a python31-foo subpackage etc) +# +# Support this by assuming that below each /usr/lib/python$VERSION/, all +# .pyc/.pyo files are to be compiled for /usr/bin/python$VERSION. +# +# For example, below /usr/lib/python2.6/, we're targetting /usr/bin/python2.6 +# and below /usr/lib/python3.1/, we're targetting /usr/bin/python3.1 + +shopt -s nullglob +for python_libdir in $RPM_BUILD_ROOT/usr/lib{,64}/python[0-9].[0-9]/ ; +do + python_binary=/usr/bin/$(basename $python_libdir) + real_libdir=${python_libdir/$RPM_BUILD_ROOT/} + echo "Bytecompiling .py files below $python_libdir using $python_binary" + + # Generate normal (.pyc) byte-compiled files. + $python_binary -c 'import compileall, sys; sys.exit(not compileall.compile_dir("'"$python_libdir"'", '"$depth"', "'"$real_libdir"'", force=1, quiet=1))' + if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then + # One or more of the files had a syntax error + exit 1 + fi + + # Generate optimized (.pyo) byte-compiled files. + $python_binary -O -c 'import compileall, sys; sys.exit(not compileall.compile_dir("'"$python_libdir"'", '"$depth"', "'"$real_libdir"'", force=1, quiet=1))' + if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then + # One or more of the files had a syntax error + exit 1 + fi +done + + +# Handle other locations in the filesystem using the default python +# implementation: + +# Generate normal (.pyc) byte-compiled files. +$default_python -c 'import compileall, re, sys; sys.exit (not compileall.compile_dir("'"$RPM_BUILD_ROOT"'", '"$depth"', "/", 1, re.compile(r"'"/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]"'"), quiet=1))' +if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then + # One or more of the files had a syntax error + exit 1 +fi + +# Generate optimized (.pyo) byte-compiled files. +$default_python -O -c 'import compileall, re, sys; sys.exit(not compileall.compile_dir("'"$RPM_BUILD_ROOT"'", '"$depth"', "/", 1, re.compile(r"'"/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]"'"), quiet=1))' > /dev/null +if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then + # One or more of the files had a syntax error + exit 1 +fi +exit 0 diff --git a/scripts/brp-python-hardlink b/scripts/brp-python-hardlink new file mode 100755 index 0000000..5453866 --- /dev/null +++ b/scripts/brp-python-hardlink @@ -0,0 +1,19 @@ +#!/bin/sh + +# If using normal root, avoid changing anything. +if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then + exit 0 +fi + +# Hardlink identical *.pyc and *.pyo, originally from PLD's rpm-build-macros +# Modified to use sha1sum instead of cmp to avoid a diffutils dependency. +find "$RPM_BUILD_ROOT" -type f -name "*.pyc" | while read pyc ; do + pyo="${pyc%c}o" + if [ -f "$pyo" ] ; then + csha="$(sha1sum -b $pyc | cut -d' ' -f 1)" && \ + osha="$(sha1sum -b $pyo | cut -d' ' -f 1)" && \ + if [ "$csha" = "$osha" ] ; then + ln -f "$pyc" "$pyo" + fi + fi +done diff --git a/scripts/brp-strip b/scripts/brp-strip new file mode 100755 index 0000000..8acc22f --- /dev/null +++ b/scripts/brp-strip @@ -0,0 +1,20 @@ +#!/bin/sh +# If using normal root, avoid changing anything. +if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then + exit 0 +fi + +STRIP=${1:-strip} + +case `uname -a` in +Darwin*) exit 0 ;; +*) ;; +esac + +# Strip ELF binaries +for f in `find $RPM_BUILD_ROOT -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \) -exec file {} \; | \ + grep -v "^${RPM_BUILD_ROOT}/\?usr/lib/debug" | \ + grep -v ' shared object,' | \ + sed -n -e 's/^\(.*\):[ ]*ELF.*, not stripped/\1/p'`; do + $STRIP -g "$f" || : +done diff --git a/scripts/brp-strip-comment-note b/scripts/brp-strip-comment-note new file mode 100755 index 0000000..90cd2ae --- /dev/null +++ b/scripts/brp-strip-comment-note @@ -0,0 +1,26 @@ +#!/bin/sh +# If using normal root, avoid changing anything. +if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then + exit 0 +fi + +STRIP=${1:-strip} +OBJDUMP=${2:-objdump} + +case `uname -a` in +Darwin*) exit 0 ;; +*) ;; +esac + +# Strip .comment and .note sections (the latter only if it is not allocated) +# for already stripped elf files in the build root +for f in `find $RPM_BUILD_ROOT -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \) -exec file {} \; | \ + grep -v "^${RPM_BUILD_ROOT}/\?usr/lib/debug" | \ + sed -n -e 's/^\(.*\):[ ]*ELF.*, stripped/\1/p'`; do + note="-R .note" + if $OBJDUMP -h $f | grep '^[ ]*[0-9]*[ ]*.note[ ]' -A 1 | \ + grep ALLOC >/dev/null; then + note= + fi + $STRIP -R .comment $note "$f" || : +done diff --git a/scripts/brp-strip-shared b/scripts/brp-strip-shared new file mode 100644 index 0000000..da46431 --- /dev/null +++ b/scripts/brp-strip-shared @@ -0,0 +1,25 @@ +#!/bin/sh +# Conectiva brp - strip shared libraries. Based on Red Hat's brp-strip. +# Thu Apr 20 - Guilherme Manika <gwm@conectiva.com.br> +# Created file + +if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then + exit 0 +fi + +STRIP=${1:-strip} + +case `uname -a` in +Darwin*) exit 0 ;; +*) ;; +esac + +# Strip ELF shared objects +# Please note we don't restrict our search to executable files because +# our libraries are not (should not be, at least) +x. +for f in `find $RPM_BUILD_ROOT -type f -a -exec file {} \; | \ + grep -v "^${RPM_BUILD_ROOT}/\?usr/lib/debug" | \ + grep ' shared object,' | \ + sed -n -e 's/^\(.*\):[ ]*ELF.*, not stripped/\1/p'`; do + $STRIP --strip-unneeded "$f" +done diff --git a/scripts/brp-strip-static-archive b/scripts/brp-strip-static-archive new file mode 100755 index 0000000..d7bff33 --- /dev/null +++ b/scripts/brp-strip-static-archive @@ -0,0 +1,20 @@ +#!/bin/sh + +if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then + exit 0 +fi + +STRIP=${1:-strip} + +case `uname -a` in +Darwin*) exit 0 ;; +*) ;; +esac + +# Strip static libraries. +for f in `find $RPM_BUILD_ROOT -type f -a -exec file {} \; | \ + grep -v "^${RPM_BUILD_ROOT}/\?usr/lib/debug" | \ + grep 'current ar archive' | \ + sed -n -e 's/^\(.*\):[ ]*current ar archive/\1/p'`; do + $STRIP -g "$f" +done diff --git a/scripts/check-buildroot b/scripts/check-buildroot new file mode 100755 index 0000000..0cfb34f --- /dev/null +++ b/scripts/check-buildroot @@ -0,0 +1,37 @@ +#! /bin/sh + +# Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +test -z "$QA_SKIP_BUILD_ROOT" || exit 0 + +if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then + exit 0 +fi + +tmp=$(mktemp ${TMPDIR:-/tmp}/cbr.XXXXXX) +trap "rm -f $tmp" EXIT + +find "$RPM_BUILD_ROOT" \! \( \ + -name '*.pyo' -o -name '*.pyc' -o -name '*.elc' -o -name '.packlist' \ + \) -type f -print0 | \ + LANG=C xargs -0r grep -F "$RPM_BUILD_ROOT" >$tmp + +test -s "$tmp" && { + cat "$tmp" + echo "Found '$RPM_BUILD_ROOT' in installed files; aborting" + exit 1 +} || : diff --git a/scripts/check-files b/scripts/check-files new file mode 100755 index 0000000..b397f1c --- /dev/null +++ b/scripts/check-files @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Gets file list on standard input and RPM_BUILD_ROOT as first parameter +# and searches for omitted files (not counting directories). +# Returns it's output on standard output. +# +# filon@pld.org.pl + +RPM_BUILD_ROOT=$1 + +if [ ! -d "$RPM_BUILD_ROOT" ] ; then + cat > /dev/null + exit 1 +fi + +[ "$TMPDIR" ] || TMPDIR=/tmp +FILES_DISK=`mktemp $TMPDIR/rpmXXXXXX` +FILES_RPM=`mktemp $TMPDIR/rpmXXXXXX` + +find $RPM_BUILD_ROOT -type f -o -type l | LC_ALL=C sort > $FILES_DISK +LC_ALL=C sort > $FILES_RPM + +diff -d "$FILES_DISK" "$FILES_RPM" | grep "^< " | cut -c3- | +while read f; do + echo $f | sed -e "s#^$RPM_BUILD_ROOT# #g" +done + +rm -f $FILES_DISK +rm -f $FILES_RPM diff --git a/scripts/check-prereqs b/scripts/check-prereqs new file mode 100755 index 0000000..e6c9452 --- /dev/null +++ b/scripts/check-prereqs @@ -0,0 +1,17 @@ +#!/bin/bash + +bashit="/bin/bash --rpm-requires" + +# Make sure that this bash has the rpm-requires hack +$bashit < /dev/null 2>&1 > /dev/null || exit $? + +prereqs="`cat | $bashit | sort | uniq | sed -e 's/^bash(//' -e 's/)$//' -e 's/^executable(//' -e 's/)$//'`" +[ -z "$prereqs" ] && exit 0 + +for prereq in $prereqs +do + case $prereq in + /*) echo $prereq ;; + *) echo "`which $prereq`" ;; + esac +done | sort | uniq diff --git a/scripts/check-rpaths b/scripts/check-rpaths new file mode 100755 index 0000000..b94630b --- /dev/null +++ b/scripts/check-rpaths @@ -0,0 +1,28 @@ +#! /bin/sh + +# Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +test -z "$QA_SKIP_RPATHS" || { + echo $"WARNING: '\$QA_SKIP_RPATHS' is obsoleted by 'QA_RPATHS=[0-7]'" >&2 + exit 0 +} + +if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then + exit 0 +fi + +find "$RPM_BUILD_ROOT" -type f -print0 | xargs -0r /usr/lib/rpm/check-rpaths-worker diff --git a/scripts/check-rpaths-worker b/scripts/check-rpaths-worker new file mode 100755 index 0000000..7ea4fb4 --- /dev/null +++ b/scripts/check-rpaths-worker @@ -0,0 +1,156 @@ +#! /bin/bash + +# Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +fail= +already_shown=0 + +# effect of this expression is obviously: +# * match paths beginning with: +# - $SOMETHING/<something>/.. +# - /<something>/.. +# * but not paths beginning with +# - $SOMETHING/.. +# - $SOMETHING/../../../..... +BADNESS_EXPR_32='\(\(\$[^/]\+\)\?\(/.*\)\?/\(\([^.][^/]*\)\|\(\.[^./][^/]*\)\|\(\.\.[^/]\+\)\)\)/\.\.\(/.*\)\?$' + +function showHint() +{ + test "$already_shown" -eq 0 || return + already_shown=1 + + cat <<EOF >&2 +******************************************************************************* +* +* WARNING: 'check-rpaths' detected a broken RPATH and will cause 'rpmbuild' +* to fail. To ignore these errors, you can set the '\$QA_RPATHS' +* environment variable which is a bitmask allowing the values +* below. The current value of QA_RPATHS is $(printf '0x%04x' $QA_RPATHS). +* +* 0x0001 ... standard RPATHs (e.g. /usr/lib); such RPATHs are a minor +* issue but are introducing redundant searchpaths without +* providing a benefit. They can also cause errors in multilib +* environments. +* 0x0002 ... invalid RPATHs; these are RPATHs which are neither absolute +* nor relative filenames and can therefore be a SECURITY risk +* 0x0004 ... insecure RPATHs; these are relative RPATHs which are a +* SECURITY risk +* 0x0008 ... the special '\$ORIGIN' RPATHs are appearing after other +* RPATHs; this is just a minor issue but usually unwanted +* 0x0010 ... the RPATH is empty; there is no reason for such RPATHs +* and they cause unneeded work while loading libraries +* 0x0020 ... an RPATH references '..' of an absolute path; this will break +* the functionality when the path before '..' is a symlink +* +* +* Examples: +* - to ignore standard and empty RPATHs, execute 'rpmbuild' like +* \$ QA_RPATHS=\$[ 0x0001|0x0010 ] rpmbuild my-package.src.rpm +* - to check existing files, set \$RPM_BUILD_ROOT and execute check-rpaths like +* \$ RPM_BUILD_ROOT=<top-dir> /usr/lib/rpm/check-rpaths +* +******************************************************************************* +EOF +} + +function msg() +{ + local val=$1 + local cmp=$2 + local msg= + local fail= + local code + + test $[ $val & $cmp ] -ne 0 || return 0 + + code=$(printf '%04x' $cmp) + if test $[ $val & ~$QA_RPATHS ] -eq 0; then + msg="WARNING" + else + showHint + msg="ERROR " + fail=1 + fi + + shift 2 + echo "$msg $code: $@" >&2 + + test -z "$fail" +} + +: ${QA_RPATHS:=0} +old_IFS=$IFS + +for i; do + pos=0 + rpath=$(readelf -d "$i" 2>/dev/null | LANG=C grep '(RPATH).*:') || continue + rpath=$(echo "$rpath" | LANG=C sed -e 's!.*(RPATH).*: \[\(.*\)\]!\1!p;d') + tmp=aux:$rpath:/lib/aux || : + IFS=: + set -- $tmp + IFS=$old_IFS + shift + + allow_ORIGIN=1 + for j; do + new_allow_ORIGIN=0 + + if test -z "$j"; then + badness=16 + elif expr match "$j" "$BADNESS_EXPR_32" >/dev/null; then + badness=32 + else + case "$j" in + (/lib/*|/usr/lib/*|/usr/X11R6/lib/*|/usr/local/lib/*) + badness=0;; + (/lib64/*|/usr/lib64/*|/usr/X11R6/lib64/*|/usr/local/lib64/*) + badness=0;; + + (\$ORIGIN|\${ORIGINX}|\$ORIGIN/*|\${ORIGINX}/*) + test $allow_ORIGIN -eq 0 && badness=8 || { + badness=0 + new_allow_ORIGIN=1 + } + ;; + (/*\$PLATFORM*|/*\${PLATFORM}*|/*\$LIB*|/*\${LIB}*) + badness=0;; + + (/lib|/usr/lib|/usr/X11R6/lib) + badness=1;; + (/lib64|/usr/lib64|/usr/X11R6/lib64) + badness=1;; + + (.*) + badness=4;; + (*) badness=2;; + esac + fi + + allow_ORIGIN=$new_allow_ORIGIN + + base=${i##$RPM_BUILD_ROOT} + msg "$badness" 1 "file '$base' contains a standard rpath '$j' in [$rpath]" || fail=1 + msg "$badness" 2 "file '$base' contains an invalid rpath '$j' in [$rpath]" || fail=1 + msg "$badness" 4 "file '$base' contains an insecure rpath '$j' in [$rpath]" || fail=1 + msg "$badness" 8 "file '$base' contains the \$ORIGIN rpath specifier at the wrong position in [$rpath]" || fail=1 + msg "$badness" 16 "file '$base' contains an empty rpath in [$rpath]" || fail=1 + msg "$badness" 32 "file '$base' contains an rpath referencing '..' of an absolute path [$rpath]" || fail=2 + let ++pos + done +done + +test -z "$fail" diff --git a/scripts/desktop-file.prov b/scripts/desktop-file.prov new file mode 100755 index 0000000..5b159ae --- /dev/null +++ b/scripts/desktop-file.prov @@ -0,0 +1,23 @@ +#!/bin/sh +# +# Transform desktop mimetype info into RPM mimehandler(type) provides +# +# Author: Richard Hughes <richard@hughsie.com> +# Based on other provides scripts from RPM + +OLD_IFS="$IFS" +while read instfile ; do + case "$instfile" in + *.desktop) + if ! grep -q '^Type=Application$' "$instfile"; then continue; fi + if ! grep -q '^Exec=' "$instfile"; then continue; fi + mime=`grep '^MimeType=' "$instfile" | cut -d'=' -f2` + IFS=';' + for type in $mime ; do + echo 'mimehandler('$type')' + done + ;; + esac +done +IFS=$OLD_IFS + diff --git a/scripts/find-debuginfo.sh b/scripts/find-debuginfo.sh new file mode 100644 index 0000000..505dbde --- /dev/null +++ b/scripts/find-debuginfo.sh @@ -0,0 +1,348 @@ +#!/bin/bash +#find-debuginfo.sh - automagically generate debug info and file list +#for inclusion in an rpm spec file. +# +# Usage: find-debuginfo.sh [--strict-build-id] [-g] [-r] +# [-o debugfiles.list] +# [[-l filelist]... [-p 'pattern'] -o debuginfo.list] +# [builddir] +# +# The -g flag says to use strip -g instead of full strip on DSOs. +# The --strict-build-id flag says to exit with failure status if +# any ELF binary processed fails to contain a build-id note. +# The -r flag says to use eu-strip --reloc-debug-sections. +# +# A single -o switch before any -l or -p switches simply renames +# the primary output file from debugfiles.list to something else. +# A -o switch that follows a -p switch or some -l switches produces +# an additional output file with the debuginfo for the files in +# the -l filelist file, or whose names match the -p pattern. +# The -p argument is an grep -E -style regexp matching the a file name, +# and must not use anchors (^ or $). +# +# All file names in switches are relative to builddir (. if not given). +# + +# With -g arg, pass it to strip on libraries. +strip_g=false + +# with -r arg, pass --reloc-debug-sections to eu-strip. +strip_r=false + +# Barf on missing build IDs. +strict=false + +BUILDDIR=. +out=debugfiles.list +nout=0 +while [ $# -gt 0 ]; do + case "$1" in + --strict-build-id) + strict=true + ;; + -g) + strip_g=true + ;; + -o) + if [ -z "${lists[$nout]}" -a -z "${ptns[$nout]}" ]; then + out=$2 + else + outs[$nout]=$2 + ((nout++)) + fi + shift + ;; + -l) + lists[$nout]="${lists[$nout]} $2" + shift + ;; + -p) + ptns[$nout]=$2 + shift + ;; + -r) + strip_r=true + ;; + *) + BUILDDIR=$1 + shift + break + ;; + esac + shift +done + +i=0 +while ((i < nout)); do + outs[$i]="$BUILDDIR/${outs[$i]}" + l='' + for f in ${lists[$i]}; do + l="$l $BUILDDIR/$f" + done + lists[$i]=$l + ((++i)) +done + +LISTFILE="$BUILDDIR/$out" +SOURCEFILE="$BUILDDIR/debugsources.list" +LINKSFILE="$BUILDDIR/debuglinks.list" + +> "$SOURCEFILE" +> "$LISTFILE" +> "$LINKSFILE" + +debugdir="${RPM_BUILD_ROOT}/usr/lib/debug" + +strip_to_debug() +{ + local g= + local r= + $strip_r && r=--reloc-debug-sections + $strip_g && case "$(file -bi "$2")" in + application/x-sharedlib*) g=-g ;; + esac + eu-strip --remove-comment $r $g -f "$1" "$2" || exit + chmod 444 "$1" || exit +} + +# Make a relative symlink to $1 called $3$2 +shopt -s extglob +link_relative() +{ + local t="$1" f="$2" pfx="$3" + local fn="${f#/}" tn="${t#/}" + local fd td d + + while fd="${fn%%/*}"; td="${tn%%/*}"; [ "$fd" = "$td" ]; do + fn="${fn#*/}" + tn="${tn#*/}" + done + + d="${fn%/*}" + if [ "$d" != "$fn" ]; then + d="${d//+([!\/])/..}" + tn="${d}/${tn}" + fi + + mkdir -p "$(dirname "$pfx$f")" && ln -snf "$tn" "$pfx$f" +} + +# Make a symlink in /usr/lib/debug/$2 to $1 +debug_link() +{ + local l="/usr/lib/debug$2" + local t="$1" + echo >> "$LINKSFILE" "$l $t" + link_relative "$t" "$l" "$RPM_BUILD_ROOT" +} + +# Make a build-id symlink for id $1 with suffix $3 to file $2. +make_id_link() +{ + local id="$1" file="$2" + local idfile=".build-id/${id:0:2}/${id:2}" + [ $# -eq 3 ] && idfile="${idfile}$3" + local root_idfile="$RPM_BUILD_ROOT/usr/lib/debug/$idfile" + + if [ ! -L "$root_idfile" ]; then + debug_link "$file" "/$idfile" + return + fi + + [ $# -eq 3 ] && return 0 + + local other=$(readlink -m "$root_idfile") + other=${other#$RPM_BUILD_ROOT} + if cmp -s "$root_idfile" "$RPM_BUILD_ROOT$file" || + eu-elfcmp -q "$root_idfile" "$RPM_BUILD_ROOT$file" 2> /dev/null; then + # Two copies. Maybe one has to be setuid or something. + echo >&2 "*** WARNING: identical binaries are copied, not linked:" + echo >&2 " $file" + echo >&2 " and $other" + else + # This is pathological, break the build. + echo >&2 "*** ERROR: same build ID in nonidentical files!" + echo >&2 " $file" + echo >&2 " and $other" + exit 2 + fi +} + +get_debugfn() +{ + dn=$(dirname "${1#$RPM_BUILD_ROOT}") + bn=$(basename "$1" .debug).debug + + debugdn=${debugdir}${dn} + debugfn=${debugdn}/${bn} +} + +set -o pipefail + +strict_error=ERROR +$strict || strict_error=WARNING + +# Strip ELF binaries +find "$RPM_BUILD_ROOT" ! -path "${debugdir}/*.debug" -type f \ + \( -perm -0100 -or -perm -0010 -or -perm -0001 \) \ + -print | +file -N -f - | sed -n -e 's/^\(.*\):[ ]*.*ELF.*, not stripped/\1/p' | +xargs --no-run-if-empty stat -c '%h %D_%i %n' | +while read nlinks inum f; do + get_debugfn "$f" + [ -f "${debugfn}" ] && continue + + # If this file has multiple links, keep track and make + # the corresponding .debug files all links to one file too. + if [ $nlinks -gt 1 ]; then + eval linked=\$linked_$inum + if [ -n "$linked" ]; then + link=$debugfn + get_debugfn "$linked" + echo "hard linked $link to $debugfn" + mkdir -p "$(dirname "$link")" && ln -nf "$debugfn" "$link" + continue + else + eval linked_$inum=\$f + echo "file $f has $[$nlinks - 1] other hard links" + fi + fi + + echo "extracting debug info from $f" + id=$(/usr/lib/rpm/debugedit -b "$RPM_BUILD_DIR" -d /usr/src/debug \ + -i -l "$SOURCEFILE" "$f") || exit + if [ -z "$id" ]; then + echo >&2 "*** ${strict_error}: No build ID note found in $f" + $strict && exit 2 + fi + + [ -x /usr/bin/gdb-add-index ] && /usr/bin/gdb-add-index "$f" > /dev/null 2>&1 + + # A binary already copied into /usr/lib/debug doesn't get stripped, + # just has its file names collected and adjusted. + case "$dn" in + /usr/lib/debug/*) + [ -z "$id" ] || make_id_link "$id" "$dn/$(basename $f)" + continue ;; + esac + + mkdir -p "${debugdn}" + if test -w "$f"; then + strip_to_debug "${debugfn}" "$f" + else + chmod u+w "$f" + strip_to_debug "${debugfn}" "$f" + chmod u-w "$f" + fi + + if [ -n "$id" ]; then + make_id_link "$id" "$dn/$(basename $f)" + make_id_link "$id" "/usr/lib/debug$dn/$bn" .debug + fi +done || exit + +# For each symlink whose target has a .debug file, +# make a .debug symlink to that file. +find $RPM_BUILD_ROOT ! -path "${debugdir}/*" -type l -print | +while read f +do + t=$(readlink -m "$f").debug + f=${f#$RPM_BUILD_ROOT} + t=${t#$RPM_BUILD_ROOT} + if [ -f "$debugdir$t" ]; then + echo "symlinked /usr/lib/debug$t to /usr/lib/debug${f}.debug" + debug_link "/usr/lib/debug$t" "${f}.debug" + fi +done + +if [ -s "$SOURCEFILE" ]; then + mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug" + LC_ALL=C sort -z -u "$SOURCEFILE" | grep -E -v -z '(<internal>|<built-in>)$' | + (cd "$RPM_BUILD_DIR"; cpio -pd0mL "${RPM_BUILD_ROOT}/usr/src/debug") + # stupid cpio creates new directories in mode 0700, fixup + find "${RPM_BUILD_ROOT}/usr/src/debug" -type d -print0 | + xargs --no-run-if-empty -0 chmod a+rx +fi + +if [ -d "${RPM_BUILD_ROOT}/usr/lib" -o -d "${RPM_BUILD_ROOT}/usr/src" ]; then + ((nout > 0)) || + test ! -d "${RPM_BUILD_ROOT}/usr/lib" || + (cd "${RPM_BUILD_ROOT}/usr/lib"; find debug -type d) | + sed 's,^,%dir /usr/lib/,' >> "$LISTFILE" + + (cd "${RPM_BUILD_ROOT}/usr" + test ! -d lib/debug || find lib/debug ! -type d + test ! -d src/debug || find src/debug -mindepth 1 -maxdepth 1 + ) | sed 's,^,/usr/,' >> "$LISTFILE" +fi + +# Append to $1 only the lines from stdin not already in the file. +append_uniq() +{ + grep -F -f "$1" -x -v >> "$1" +} + +# Helper to generate list of corresponding .debug files from a file list. +filelist_debugfiles() +{ + local extra="$1" + shift + sed 's/^%[a-z0-9_][a-z0-9_]*([^)]*) *// +s/^%[a-z0-9_][a-z0-9_]* *// +/^$/d +'"$extra" "$@" +} + +# Write an output debuginfo file list based on given input file lists. +filtered_list() +{ + local out="$1" + shift + test $# -gt 0 || return + grep -F -f <(filelist_debugfiles 's,^.*$,/usr/lib/debug&.debug,' "$@") \ + -x $LISTFILE >> $out + sed -n -f <(filelist_debugfiles 's/[\\.*+#]/\\&/g +h +s,^.*$,s# &$##p,p +g +s,^.*$,s# /usr/lib/debug&.debug$##p,p +' "$@") "$LINKSFILE" | append_uniq "$out" +} + +# Write an output debuginfo file list based on an grep -E -style regexp. +pattern_list() +{ + local out="$1" ptn="$2" + test -n "$ptn" || return + grep -E -x -e "$ptn" "$LISTFILE" >> "$out" + sed -n -r "\#^$ptn #s/ .*\$//p" "$LINKSFILE" | append_uniq "$out" +} + +# +# When given multiple -o switches, split up the output as directed. +# +i=0 +while ((i < nout)); do + > ${outs[$i]} + filtered_list ${outs[$i]} ${lists[$i]} + pattern_list ${outs[$i]} "${ptns[$i]}" + grep -Fvx -f ${outs[$i]} "$LISTFILE" > "${LISTFILE}.new" + mv "${LISTFILE}.new" "$LISTFILE" + ((++i)) +done +if ((nout > 0)); then + # Now add the right %dir lines to each output list. + (cd "${RPM_BUILD_ROOT}"; find usr/lib/debug -type d) | + sed 's#^.*$#\\@^/&/@{h;s@^.*$@%dir /&@p;g;}#' | + LC_ALL=C sort -ur > "${LISTFILE}.dirs.sed" + i=0 + while ((i < nout)); do + sed -n -f "${LISTFILE}.dirs.sed" "${outs[$i]}" | sort -u > "${outs[$i]}.new" + cat "${outs[$i]}" >> "${outs[$i]}.new" + mv -f "${outs[$i]}.new" "${outs[$i]}" + ((++i)) + done + sed -n -f "${LISTFILE}.dirs.sed" "${LISTFILE}" | sort -u > "${LISTFILE}.new" + cat "$LISTFILE" >> "${LISTFILE}.new" + mv "${LISTFILE}.new" "$LISTFILE" +fi diff --git a/scripts/find-lang.sh b/scripts/find-lang.sh new file mode 100755 index 0000000..c3dbdbe --- /dev/null +++ b/scripts/find-lang.sh @@ -0,0 +1,192 @@ +#!/bin/sh +#findlang - automagically generate list of language specific files +#for inclusion in an rpm spec file. +#This does assume that the *.mo files are under .../locale/... +#Run with no arguments gets a usage message. + +#findlang is copyright (c) 1998 by W. L. Estes <wlestes@uncg.edu> + +#Redistribution and use of this software are hereby permitted for any +#purpose as long as this notice and the above copyright notice remain +#in tact and are included with any redistribution of this file or any +#work based on this file. + +# 2004-06-20 Arkadiusz MiÅ›kiewicz <arekm@pld-linux.org> +# * merge PLD changes, kde, all-name (mkochano,pascalek@PLD) +# 1999-10-19 Artur Frysiak <wiget@pld-linux.org> +# * added support for GNOME help files +# * start support for KDE help files + +usage () { +cat <<EOF + +Usage: $0 TOP_DIR PACKAGE_NAME [prefix] + +where TOP_DIR is +the top of the tree containing the files to be processed--should be +\$RPM_BUILD_ROOT usually. TOP_DIR gets sed'd out of the output list. +PACKAGE_NAME is the %{name} of the package. This should also be +the basename of the .mo files. the output is written to +PACKAGE_NAME.lang unless \$3 is given in which case output is written +to \$3. +Additional options: + --with-gnome find GNOME help files + --with-kde find KDE help files + --with-qt find Qt translation files + --with-man find localized man pages + --all-name match all package/domain names + --without-mo do not find locale files +EOF +exit 1 +} + +if [ -z "$1" ] ; then usage +elif [ $1 = / ] ; then echo $0: expects non-/ argument for '$1' 1>&2 +elif [ ! -d $1 ] ; then + echo $0: $1: no such directory + exit 1 +else TOP_DIR="`echo $1|sed -e 's:/$::'`" +fi +shift + +if [ -z "$1" ] ; then usage +else NAME=$1 +fi +shift + +GNOME=# +KDE=# +QT=# +MAN=# +MO= +MO_NAME=$NAME.lang +ALL_NAME=# +NO_ALL_NAME= + +while test $# -gt 0 ; do + case "${1}" in + --with-gnome ) + GNOME= + shift + ;; + --with-kde ) + KDE= + shift + ;; + --with-qt ) + QT= + shift + ;; + --with-man ) + MAN= + shift + ;; + --without-mo ) + MO=# + shift + ;; + --all-name ) + ALL_NAME= + NO_ALL_NAME=# + shift + ;; + * ) + MO_NAME=${1} + shift + ;; + esac +done + +find $TOP_DIR -type f -o -type l|sed ' +s:'"$TOP_DIR"':: +'"$ALL_NAME$MO"'s:\(.*/locale/\)\([^/_]\+\)\(.*\.mo$\):%lang(\2) \1\2\3: +'"$NO_ALL_NAME$MO"'s:\(.*/locale/\)\([^/_]\+\)\(.*/'"$NAME"'\.mo$\):%lang(\2) \1\2\3: +s:^\([^%].*\):: +s:%lang(C) :: +/^$/d' > $MO_NAME + +find $TOP_DIR -type d|sed ' +s:'"$TOP_DIR"':: +'"$NO_ALL_NAME$GNOME"'s:\(.*/gnome/help/'"$NAME"'$\):%dir \1: +'"$NO_ALL_NAME$GNOME"'s:\(.*/gnome/help/'"$NAME"'/[a-zA-Z0-9.\_\-]/.\+\):: +'"$NO_ALL_NAME$GNOME"'s:\(.*/gnome/help/'"$NAME"'\/\)\([^/_]\+\):%lang(\2) \1\2: +'"$ALL_NAME$GNOME"'s:\(.*/gnome/help/[a-zA-Z0-9.\_\-]\+$\):%dir \1: +'"$ALL_NAME$GNOME"'s:\(.*/gnome/help/[a-zA-Z0-9.\_\-]\+/[a-zA-Z0-9.\_\-]/.\+\):: +'"$ALL_NAME$GNOME"'s:\(.*/gnome/help/[a-zA-Z0-9.\_\-]\+\/\)\([^/_]\+\):%lang(\2) \1\2: +s:%lang(.*) .*/gnome/help/[a-zA-Z0-9.\_\-]\+/[a-zA-Z0-9.\_\-]\+/.*:: +s:^\([^%].*\):: +s:%lang(C) :: +/^$/d' >> $MO_NAME + +find $TOP_DIR -type d|sed ' +s:'"$TOP_DIR"':: +'"$NO_ALL_NAME$GNOME"'s:\(.*/omf/'"$NAME"'$\):%dir \1: +'"$ALL_NAME$GNOME"'s:\(.*/omf/[a-zA-Z0-9.\_\-]\+$\):%dir \1: +s:^\([^%].*\):: +/^$/d' >> $MO_NAME + +find $TOP_DIR -type f|sed ' +s:'"$TOP_DIR"':: +'"$NO_ALL_NAME$GNOME"'s:\(.*/omf/'"$NAME"'/'"$NAME"'-\([^/.]\+\)\.omf\):%lang(\2) \1: +'"$ALL_NAME$GNOME"'s:\(.*/omf/[a-zA-Z0-9.\_\-]\+/[a-zA-Z0-9.\_\-]\+-\([^/.]\+\)\.omf\):%lang(\2) \1: +s:^[^%].*:: +s:%lang(C) :: +/^$/d' >> $MO_NAME + +KDE3_HTML=`kde-config --expandvars --install html 2>/dev/null` +if [ x"$KDE3_HTML" != x -a -d "$TOP_DIR$KDE3_HTML" ]; then +find $TOP_DIR$KDE3_HTML -type d|sed ' +s:'"$TOP_DIR"':: +'"$NO_ALL_NAME$KDE"'s:\(.*/HTML/\)\([^/_]\+\)\(.*/'"$NAME"'/\):: +'"$NO_ALL_NAME$KDE"'s:\(.*/HTML/\)\([^/_]\+\)\(.*/'"$NAME"'\)$:%lang(\2) \1\2\3: +'"$ALL_NAME$KDE"'s:\(.*/HTML/\)\([^/_]\+\)\(.*/[a-zA-Z0-9.\_\-]\+/\):: +'"$ALL_NAME$KDE"'s:\(.*/HTML/\)\([^/_]\+\)\(.*/[a-zA-Z0-9.\_\-]\+$\):%lang(\2) \1\2\3: +s:^\([^%].*\):: +s:%lang(C) :: +/^$/d' >> $MO_NAME +fi + +KDE4_HTML=`kde4-config --expandvars --install html 2>/dev/null` +if [ x"$KDE4_HTML" != x -a -d "$TOP_DIR$KDE4_HTML" ]; then +find $TOP_DIR$KDE4_HTML -type d|sed ' +s:'"$TOP_DIR"':: +'"$NO_ALL_NAME$KDE"'s:\(.*/HTML/\)\([^/_]\+\)\(.*/'"$NAME"'/\):: +'"$NO_ALL_NAME$KDE"'s:\(.*/HTML/\)\([^/_]\+\)\(.*/'"$NAME"'\)$:%lang(\2) \1\2\3: +'"$ALL_NAME$KDE"'s:\(.*/HTML/\)\([^/_]\+\)\(.*/[a-zA-Z0-9.\_\-]\+/\):: +'"$ALL_NAME$KDE"'s:\(.*/HTML/\)\([^/_]\+\)\(.*/[a-zA-Z0-9.\_\-]\+$\):%lang(\2) \1\2\3: +s:^\([^%].*\):: +s:%lang(C) :: +/^$/d' >> $MO_NAME +fi + +find $TOP_DIR -type f -o -type l|sed ' +s:'"$TOP_DIR"':: +'"$NO_ALL_NAME$QT"'s:\(.*/'"$NAME"'_\([a-zA-Z]\{2\}\([_@].*\)\?\)\.qm$\):%lang(\2) \1: +'"$ALL_NAME$QT"'s:\(.*/[^/_]\+_\([a-zA-Z]\{2\}[_@].*\)\.qm$\):%lang(\2) \1: +'"$ALL_NAME$QT"'s:\(.*/[^/_]\+_\([a-zA-Z]\{2\}\)\.qm$\):%lang(\2) \1: +'"$ALL_NAME$QT"'s:^\([^%].*/[^/]\+_\([a-zA-Z]\{2\}[_@].*\)\.qm$\):%lang(\2) \1: +'"$ALL_NAME$QT"'s:^\([^%].*/[^/]\+_\([a-zA-Z]\{2\}\)\.qm$\):%lang(\2) \1: +s:^[^%].*:: +s:%lang(C) :: +/^$/d' >> $MO_NAME + +find $TOP_DIR -type d|sed ' +s:'"$TOP_DIR"':: +'"$ALL_NAME$MAN"'s:\(.*/man/\([^/_]\+\).*/man[a-z0-9]\+/\):: +'"$ALL_NAME$MAN"'s:\(.*/man/\([^/_]\+\).*/man[a-z0-9]\+$\):%lang(\2) \1*: +s:^\([^%].*\):: +s:%lang(C) :: +/^$/d' >> $MO_NAME + +find $TOP_DIR -type f -o -type l|sed ' +s:'"$TOP_DIR"':: +'"$NO_ALL_NAME$MAN"'s:\(.*/man/\([^/_]\+\).*/man[a-z0-9]\+/'"$NAME"'\.[a-z0-9].*\):%lang(\2) \1*: +s:^\([^%].*\):: +s:%lang(C) :: +/^$/d' >> $MO_NAME + +if ! grep -q / $MO_NAME; then + echo "No translations found for ${NAME} in ${TOP_DIR}" + exit 1 +fi +exit 0 diff --git a/scripts/find-php-provides b/scripts/find-php-provides new file mode 100644 index 0000000..02e0c42 --- /dev/null +++ b/scripts/find-php-provides @@ -0,0 +1,20 @@ +#!/bin/sh +cd `rpm --eval %{_builddir}` + +filelist=`sed "s/['\"]/\\\&/g"` +if [ -f __rpm_noautoprovfiles ] ; then + for i in `cat __rpm_noautoprovfiles`; do + filelist=`echo $filelist | sed "s![[:space:]]*$i[[:space:]]*!!g"` + done +fi + + +echo $filelist|/usr/lib/rpm/find-provides +provides_php=`echo $filelist | xargs /usr/lib/rpm/php.prov` +if [ -f __rpm_noautoprov ] ; then + for i in `cat __rpm_noautoprov`; do + provides_php=`echo $provides_php | sed "s!\<$i[[:space:]]*!!g"` + done +fi + +echo "$provides_php" diff --git a/scripts/find-php-requires b/scripts/find-php-requires new file mode 100644 index 0000000..9d08151 --- /dev/null +++ b/scripts/find-php-requires @@ -0,0 +1,30 @@ +#!/bin/sh +cd `rpm --eval %{_builddir}` + +filelist=`sed "s/['\"]/\\\&/g"` +if [ -f __rpm_noautoreqfiles ] ; then + for i in `cat __rpm_noautoreqfiles`; do + filelist=`echo $filelist | sed "s![[:space:]]*$i[[:space:]]*!!g"` + done +fi + +requires="`echo $filelist | /usr/lib/rpm/find-requires`" +requires_php="`echo $filelist | xargs /usr/lib/rpm/php.req`" + +if [ -f __rpm_noautoreq ] ; then + for i in `cat __rpm_noautoreq`; do + requires_php=`echo $requires_php | sed "s!\<$i[[:space:]]*!!g"` + done +fi + +requires_php_t="$requires_php" +if [ -f __rpm_noautoreqdep ] ; then + for i in `cat __rpm_noautoreqdep`; do + requires_php_t=`echo $requires_php_t | sed "s!\<$i[[:space:]]*!!g"` + done +fi + +requires_mod="`LC_ALL=C rpm -q --whatprovides --qf "%{NAME}\n" $requires_php_t 2>/dev/null`" +echo "$requires +$requires_php +$requires_mod"| grep -v "no package provides" | sort -u diff --git a/scripts/find-provides.php b/scripts/find-provides.php new file mode 100755 index 0000000..4e6a03d --- /dev/null +++ b/scripts/find-provides.php @@ -0,0 +1,19 @@ +#!/bin/sh +if [ $# -lt 1 ]; then + echo "You have to specify input file" + exit 1 +fi + +filelist=`echo $@` +for i in $filelist; do + i=`echo $i | grep "\.php$"` + if [ -n "$i" ]; then + j=`cat $i |grep -E -i "^Class" |cut -f 2 -d " "| tr -d "\r"` + if [ -n "$j" ]; then + for p in $j; do + echo "pear($p)" + done + j="" + fi + fi +done diff --git a/scripts/find-requires.php b/scripts/find-requires.php new file mode 100755 index 0000000..4c064fc --- /dev/null +++ b/scripts/find-requires.php @@ -0,0 +1,46 @@ +#!/bin/sh +##################################################################### +# # +# Check system dependences between php-pear modules # +# # +# Pawe³ Go³aszewski <blues@ds.pg.gda.pl> # +# ------------------------------------------------------------------# +# TODO: # +# - extension_loaded - dependencies. # +# - some clean-up... # +##################################################################### +if [ $# -lt 1 ]; then + echo "You have to specify input file" + exit 1 +fi + +for files in `echo $@`; do + files=`echo $files | grep "\.php$"` + if [ -n "$files" ]; then + # Requires trough new call: + j=`cat $files | grep -i new | grep -E "(=|return)" | grep -E -v "^[[:space:]*]*(\/\/|#|\*|/\*)" | tr -d "\r" | grep -E "[;|(|)|{|}|,][[:space:]*]*$" | awk -F "new " '{ print $2 }' | sed "s/[(|;|.]/ /g" | cut -f 1 -d " " | sed "s/^$.*//"` + if [ -n "$j" ]; then + for feature in $j; do + echo "pear($feature)" + done + j="" + fi + # requires trough class extension + k=`cat $files | grep -E -i "(^Class.*extends)" | awk -F " extends " '{ print $2 }' | sed "s/{.*/ /" | cut -f 1 -d " " | tr -d "\r"` + if [ -n "$k" ]; then + for feature in $k; do + echo "pear($feature)" + done + k="" + fi + # requires trough class:: call + l=`cat $files | grep "::" | grep -E -v "^[[:space:]*]*(\/\/|#|\*|/\*)" | sed "s/[(|'|!|\"|&|@|;]/ /g" | awk -F "::" '{ print $1 }' | sed "s/.*\ \([:alphanum:]*\)/\1/" | sed "s/^$.*//" | sed "s/[.]//g" | tr -d "\r"` + if [ -n "$l" ]; then + for feature in $l; do + echo "pear($feature)" + done + l="" + fi + fi +done + diff --git a/scripts/fontconfig.prov b/scripts/fontconfig.prov new file mode 100755 index 0000000..bfb6ea0 --- /dev/null +++ b/scripts/fontconfig.prov @@ -0,0 +1,24 @@ +#!/bin/bash +# +# Script to install in: +# /usr/lib/rpm/redhat/find-provides.d +# +# Transform font files into RPM provides +# Requires fontconfig >= 2.6.90 +# +# Author: Behdad Esfahbod <behdad@redhat.com> +# Based on other provides scripts from RPM +# + +fcquery=/usr/bin/fc-query + +if [ ! -x $fcquery ]; then + cat > /dev/null + exit 0 +fi + +# filter out anything outside main fontconfig path +grep /usr/share/fonts/ | +while read fn; do + $fcquery --format '%{=pkgkit}' "${fn}" 2> /dev/null +done diff --git a/scripts/gendiff b/scripts/gendiff new file mode 100644 index 0000000..d9b0c21 --- /dev/null +++ b/scripts/gendiff @@ -0,0 +1,24 @@ +#!/bin/sh + +[ -z "$1" -o -z "$2" ] && { +# usage + echo "usage: $0 <directory> <diff-extension>" 1>&2 + exit 1 +} + +: ${DIFF:=diff} +: ${GENDIFF_DIFF_ARGS:=-up} +: ${GENDIFF_DIFF_CHANGELOG_ARGS:=-U0} + +find $1 \( -name "*$2" -o -name ".*$2" \) -print | sort | +while read f; do + U="${GENDIFF_DIFF_ARGS}" + [ "`basename $f`" = "ChangeLog$2" ] && U="${GENDIFF_DIFF_CHANGELOG_ARGS}" + diffcmd="${DIFF} ${U} /dev/null ${f%$2}" +# ${DIFF} ${U} $f `echo $f | sed s/$2\$//` + if [ -r "$f" ]; then + diffcmd="${DIFF} ${U} ${f} ${f%$2}" + fi + echo "${diffcmd}" + ${diffcmd} +done diff --git a/scripts/libtooldeps.sh b/scripts/libtooldeps.sh new file mode 100644 index 0000000..d8937c8 --- /dev/null +++ b/scripts/libtooldeps.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +[ $# -ge 2 ] || { + cat > /dev/null + exit 0 +} + +case $1 in +-P|--provides) + shift + RPM_BUILD_ROOT="$1" + while read possible + do + case "$possible" in + *.la) + if grep -iq '^# Generated by ltmain.sh' "$possible" 2> /dev/null ; then + possible="`echo ${possible} | sed -e s,${RPM_BUILD_ROOT}/,/,`" + echo "libtool($possible)" + fi + ;; + esac + done + ;; +-R|--requires) + while read possible ; do + case "$possible" in + *.la) + for dep in `grep '^dependency_libs='"$possible" 2> /dev/null | \ + sed -e "s,^dependency_libs='\(.*\)',\1,g"` + do + case "$dep" in + /*.la) + echo "libtool($dep)" + ;; + esac + done + ;; + esac + done + ;; +esac +exit 0 diff --git a/scripts/macros.perl b/scripts/macros.perl new file mode 100644 index 0000000..0370411 --- /dev/null +++ b/scripts/macros.perl @@ -0,0 +1,12 @@ +# Perl specific macro definitions. +# To make use of these macros insert the following line into your spec file: +# %include %{_rpmconfigdir}/macros.perl + +%define __find_requires %{_rpmconfigdir}/find-perl-requires +%define __find_provides %{_rpmconfigdir}/find-perl-provides + +%define perl_sitelib %(eval "`perl -V:installsitelib`"; echo $installsitelib) +%define perl_sitearch %(eval "`perl -V:installsitearch`"; echo $installsitearch) +%define perl_archlib %(eval "`perl -V:installarchlib`"; echo $installarchlib) +%define perl_privlib %(eval "`perl -V:installprivlib`"; echo $installprivlib) + diff --git a/scripts/macros.php b/scripts/macros.php new file mode 100644 index 0000000..cf20728 --- /dev/null +++ b/scripts/macros.php @@ -0,0 +1,9 @@ +# Perl specific macro definitions. +# To make use of these macros insert the following line into your spec file: +# %include %{_rpmconfigdir}/macros.php + +%define __find_requires %{_rpmconfigdir}/find-php-requires +%define __find_provides %{_rpmconfigdir}/find-php-provides + +%define php_pear_dir %{_datadir}/pear + diff --git a/scripts/macros.python b/scripts/macros.python new file mode 100644 index 0000000..ea1f200 --- /dev/null +++ b/scripts/macros.python @@ -0,0 +1,18 @@ +# Python specific macro definitions. +# To make use of these macros insert the following line into your spec file: +# %include %{_rpmconfigdir}/macros.python + +# python main version +%define py_ver %(echo `python -c "import sys; sys.stdout.write(sys.version[:3])"`) + +# directories +%define py_prefix %(echo `python -c "import sys; sys.stdout.write(sys.prefix)"`) +%define py_libdir %{py_prefix}/lib/python%{py_ver} +%define py_incdir /usr/include/python%{py_ver} +%define py_sitedir %{py_libdir}/site-packages +%define py_dyndir %{py_libdir}/lib-dynload + +# pure python modules compilation +%define py_comp python -c "import compileall; import sys; compileall.compile_dir(sys.argv[1], ddir=sys.argv[1][len('$RPM_BUILD_ROOT'):])" + +%define py_ocomp python -O -c "import compileall; import sys; compileall.compile_dir(sys.argv[1], ddir=sys.argv[1][len('$RPM_BUILD_ROOT'):])" diff --git a/scripts/mono-find-provides b/scripts/mono-find-provides new file mode 100644 index 0000000..9348457 --- /dev/null +++ b/scripts/mono-find-provides @@ -0,0 +1,42 @@ +#!/bin/bash +# +# mono-find-provides +# +# Authors: +# Ben Maurer (bmaurer@ximian.com) +# +# (C) 2005 Novell (http://www.novell.com) +# +# Args: builddir buildroot libdir + +IFS=$'\n' +filelist=($(grep -Ev '/usr/doc/|/usr/share/doc/')) +monolist=($(printf "%s\n" "${filelist[@]}" | grep -E "\\.(exe|dll)\$")) + +# If monodis is in the package being installed, use that one +# This is to support building mono +build_bindir="$2/usr/bin" +build_libdir="$2$3" + +if [ -x $build_bindir/monodis ]; then + monodis="$build_bindir/monodis" + export LD_LIBRARY_PATH=$build_libdir${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} +elif [ -x /usr/bin/monodis ]; then + monodis="/usr/bin/monodis" +else + exit 0; +fi + +export MONO_SHARED_DIR=$1 + +for i in "${monolist[@]}"; do + ($monodis --assembly $i | awk ' + BEGIN { LIBNAME=""; VERSION=""; } + /^Version:/ { VERSION=$2 } + /^Name:/ { LIBNAME=$2 } + END { + if (VERSION && LIBNAME) + print "mono(" LIBNAME ") = " VERSION + } + ') 2>/dev/null +done diff --git a/scripts/mono-find-requires b/scripts/mono-find-requires new file mode 100644 index 0000000..ea58cae --- /dev/null +++ b/scripts/mono-find-requires @@ -0,0 +1,86 @@ +#!/bin/bash +# +# mono-find-requires +# +# Authors: +# Ben Maurer (bmaurer@ximian.com) +# +# (C) 2005 Novell (http://www.novell.com) +# +# Args: builddir buildroot libdir + +IFS=$'\n' +filelist=($(grep -Ev '/usr/doc/|/usr/share/doc/')) +monolist=($(printf "%s\n" "${filelist[@]}" | grep -E "\\.(exe|dll)\$")) + +# If monodis is in the package being installed, use that one +# This is to support building mono +build_bindir="$2/usr/bin" +build_libdir="$2$3" + +if [ -x $build_bindir/monodis ]; then + monodis="$build_bindir/monodis" + export LD_LIBRARY_PATH=$build_libdir${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} +elif [ -x /usr/bin/monodis ]; then + monodis="/usr/bin/monodis" +else + exit 0; +fi + +export MONO_SHARED_DIR=$1 + +REQUIRES=$( + for i in "${monolist[@]}"; do + ($monodis --assemblyref $i | awk ' + BEGIN { START=0; LIBNAME=""; VERSION=""; } + (START==0) && /^[0-9]+: Version=/ { + START=1; + sub(/Version=/, "", $2); + VERSION=$2 + } + + (START==1) && /^\tName=/ { + sub(/Name=/, "", $1); + LIBNAME=$1 + + print "mono(" LIBNAME ") = " VERSION + START=0 + } + ') 2> /dev/null + done +) + +PROVIDES=$( + for i in "${monolist[@]}"; do + ($monodis --assembly $i | awk ' + BEGIN { LIBNAME=""; VERSION=""; } + /^Version:/ { VERSION=$2 } + /^Name:/ { LIBNAME=$2 } + END { + if (VERSION && LIBNAME) + print "mono(" LIBNAME ") = " VERSION + } + ') 2>/dev/null + done +) +# +# This is a little magic trick to get all REQUIRES that are not +# in PROVIDES. While RPM functions correctly when such deps exist, +# they make the metadata a bit bloated. +# + +# Filter out dups from both lists +REQUIRES=$(echo "$REQUIRES" | sort | uniq) +PROVIDES=$(echo "$PROVIDES" | sort | uniq) + +# +# Get a list of elements that exist in exactly one of PROVIDES or REQUIRES +# +UNIQ=$(echo "$PROVIDES +$REQUIRES" | sort | uniq -u) + +# +# Of those, only chose the ones that are in REQUIRES +# +echo "$UNIQ +$REQUIRES" | sort | uniq -d diff --git a/scripts/ocaml-find-provides.sh b/scripts/ocaml-find-provides.sh new file mode 100644 index 0000000..a4441cb --- /dev/null +++ b/scripts/ocaml-find-provides.sh @@ -0,0 +1,56 @@ +#!/bin/sh - +# OCaml-specific "find-provides" for RPM. +# By Richard W.M. Jones <rjones@redhat.com> +# $Id: ocaml-find-provides.sh,v 1.2 2007/09/06 11:49:59 rjones Exp $ + +#set -x + +# Usage: +# (1) If you don't want the module to depend on the exact compiler +# version then use ocaml-find-requires.sh -c, but this is not something +# you should do normally. +# +# (2) For any modules which you want to ignore, use '-i Modulename'. + +OCAMLOBJINFO=ocamlobjinfo +TEMP=`getopt -o i:f: -n ocaml-find-provides.sh -- "$@"` +if [ $? != 0 ]; then echo "ocaml-find-provides.sh: failed" >&2; exit 1; fi +eval set -- "$TEMP" + +ignore_modules=nOTREAL + +while true; do + case "$1" in + -i) ignore_modules="$2 $ignore_modules"; shift 2;; + -f) OCAMLOBJINFO="$2"; shift 2;; + --) shift; break;; + *) echo "ocaml-find-provides.sh: option error at $1"; exit 1;; + esac +done + +# Get the list of files. +files=`sed "s/['\"]/\\\&/g"` + +# Get list of .cmi, .cmo and .cma files. +files=`echo $files | tr [:blank:] '\n' | grep '\.cm[ioa]$'` + +if [ -z "$files" ]; then exit 0; fi + +# Get the list of modules exported by the files. +modules=`$OCAMLOBJINFO $files | + grep -E '(Unit|Module) name: ' | + awk '{print $3}'` + +# Turn list of modules into a regexp that matches the module names. +modules_re=`echo $modules | sed 's/ /|/g'` +ignore_modules_re=`echo $ignore_modules | sed 's/ /|/g'` + +# Get a list of the modules these file(s) provide. +$OCAMLOBJINFO $files | +grep -Eo '[0-9a-f]{32}[[:space:]]+[A-Za-z0-9_]+' | +grep -E '[0-9a-f]{32}[[:space:]]+'"($modules_re)\$" | +while read md5sum module; do + echo "ocaml($module) = $md5sum" +done | +grep -Ev "$ignore_modules_re" | +sort -u diff --git a/scripts/ocaml-find-requires.sh b/scripts/ocaml-find-requires.sh new file mode 100644 index 0000000..bee3478 --- /dev/null +++ b/scripts/ocaml-find-requires.sh @@ -0,0 +1,68 @@ +#!/bin/sh - +# OCaml-specific "find-requires" for RPM. +# By Richard W.M. Jones <rjones@redhat.com> +# $Id: ocaml-find-requires.sh,v 1.5 2009/10/04 22:34:51 rjones Exp $ + +#set -x + +# Usage: +# (1) If you don't want the module to depend on the exact compiler +# version then use ocaml-find-requires.sh -c, but this is not something +# you should do normally. +# +# (2) For any modules which you want to ignore, use '-i Modulename'. + +OCAMLOBJINFO=ocamlobjinfo +TEMP=`getopt -o ci:f: -n ocaml-find-requires.sh -- "$@"` +if [ $? != 0 ]; then echo "ocaml-find-requires.sh: failed" >&2; exit 1; fi +eval set -- "$TEMP" + +emit_compiler_version=yes +ignore_modules=nOTREAL + +while true; do + case "$1" in + -c) emit_compiler_version=; shift;; + -i) ignore_modules="$2 $ignore_modules"; shift 2;; + -f) OCAMLOBJINFO="$2"; shift 2;; + --) shift; break;; + *) echo "ocaml-find-requires.sh: option error at $1"; exit 1;; + esac +done + +# Get the list of files. +files=`sed "s/['\"]/\\\&/g"` + +# Use ordinary find-requires first. +# echo $files | tr [:blank:] '\n' | /usr/lib/rpm/find-requires + +# Get list of .cmi, .cmo and .cma files. +files=`echo $files | tr [:blank:] '\n' | grep '\.cm[ioa]$'` + +if [ -z "$files" ]; then exit 0; fi + +# Get the list of modules exported by the file(s). +modules=`$OCAMLOBJINFO $files | + grep -E '(Unit|Module) name: ' | + awk '{print $3}'` + +# Turn list of modules into a regexp that matches the module names. +modules_re=`echo $modules | sed 's/ /|/g'` +ignore_modules_re=`echo $ignore_modules | sed 's/ /|/g'` + +# Get a list of the modules these file(s) depend on. +$OCAMLOBJINFO $files | +grep -Eo '[0-9a-f]{32}[[:space:]]+[A-Za-z0-9_]+' | +grep -Ev '[0-9a-f]{32}[[:space:]]+'"($modules_re)\$" | +while read md5sum module; do + echo "ocaml($module) = $md5sum" +done | +grep -Ev "$ignore_modules_re" | +grep -Ev "^ocaml\((Annot|Asttypes|Outcometree|Cmo_format|Parsetree)\) =" | +sort -u + +if [ -n "$emit_compiler_version" ]; then + # Every OCaml program depends on the version of the + # runtime which was used to compile it. + echo "ocaml(runtime) = `ocamlrun -version | awk '{print $NF}' | sed 's/\+.*//'`" +fi diff --git a/scripts/osgideps.pl b/scripts/osgideps.pl new file mode 100644 index 0000000..ab92b65 --- /dev/null +++ b/scripts/osgideps.pl @@ -0,0 +1,388 @@ +#!/usr/bin/perl +# +# osgideps.pl -- Analyze dependencies of OSGi bundles. +# +# Kyu Lee (initial idea) +# Alphonse Van Assche <alcapcom@fedoraproject.org> (current maintainer) +# +# $Id: osgideps.pl,v 1.0 2009/06/08 12:12:12 mej Exp $ + +use Getopt::Long; +use File::Temp qw/ tempdir /; +use threads; +use Thread::Queue; + +$MANIFEST_NAME = "META-INF/MANIFEST.MF"; + +# parse options +my ( $show_provides, $show_requires, $show_system_bundles, $debug ); +my $result = GetOptions( + "provides" => \$show_provides, + "requires" => \$show_requires, + "system" => \$show_system_bundles, + "debug" => \$debug +); +exit(1) if ( not $result ); + +# run selected function +@allfiles = <STDIN>; +if ($show_provides) { + getProvides(@allfiles); +} +if ($show_requires) { + getRequires(@allfiles); +} +if ($show_system_bundles) { + getSystemBundles(@allfiles); +} +exit(0); + +# this function print provides of OSGi aware files +sub getProvides { + + my $queue = Thread::Queue->new; + foreach $file (@_) { + $queue->enqueue($file); + } + + my @workers; + push @workers, threads->create('getProvidesWorker'); + push @workers, threads->create('getProvidesWorker'); + push @workers, threads->create('getProvidesWorker'); + push @workers, threads->create('getProvidesWorker'); + + map { $_->join } @workers; + + sub getProvidesWorker { + while ( my $file = $queue->dequeue_nb ) { + chomp($file); + # we don't follow symlinks for provides + next if ( -f $file && -r _ && -l _ ); + $file =~ s/[^[:print:]]//g; + if ( $file =~ m/$MANIFEST_NAME$/ || $file =~ m/\.jar$/ ) { + if ( $file =~ m/\.jar$/ ) { + if ( `zipinfo -1 $file 2> /dev/null | grep -e \^$MANIFEST_NAME` eq "$MANIFEST_NAME\n" ) { + # extract MANIFEST.MF file from jar to temporary directory + $tmpdir = tempdir( CLEANUP => 1 ); + `unzip -d $tmpdir -qqo $file $MANIFEST_NAME`; + open( MANIFEST, "$tmpdir/$MANIFEST_NAME" ); + } + } else { + open( MANIFEST, "$file" ); + } + my $bundleName = ""; + my $version = ""; + # parse Bundle-SymbolicName, Bundle-Version and Export-Package attributes + while (<MANIFEST>) { + # get rid of non-print chars (some manifest files contain weird chars) + s/[^[:print]]//g; + if ( m/(^(Bundle-SymbolicName): )(.*)$/ ) { + $bundleName = "$3" . "\n"; + while (<MANIFEST>) { + if ( m/^[[:upper:]][[:alpha:]]+-[[:upper:]][[:alpha:]]+: .*/ ) { + $len = length $_; + seek MANIFEST, $len * -1, 1; + last; + } + $bundleName .= "$_"; + } + $bundleName =~ s/\s+//g; + $bundleName =~ s/;.*//g; + } + if ( m/(^Bundle-Version: )(.*)/ ) { + $version = $2; + } + if ( m/(^(Export-Package): )(.*)$/ ) { + my $bunlist = "$3" . "\n"; + while (<MANIFEST>) { + if ( m/^[[:upper:]][[:alpha:]]+-[[:upper:]][[:alpha:]]+: .*/ ) { + $len = length $_; + seek MANIFEST, $len * -1, 1; + last; + } + $bunlist .= "$_"; + } + push @bundlelist, parsePkgString($bunlist, $file); + } + } + + # skip this jar if no bundle name exists + if ( !$bundleName eq "" ) { + if ( !$version eq "" ) { + $version = parseVersion($version); + push @bundlelist, { FILE => "$file", NAME => "$bundleName", VERSION => "$version" }; + } else { + push @bundlelist, { FILE => "$file", NAME => "$bundleName", VERSION => "" }; + } + } + `rm -rf $tmpdir`; + } + } + if ( !$debug ) { @bundlelist = prepareOSGiBundlesList(@bundlelist); } + $list = ""; + for $bundle (@bundlelist) { + if ( !$debug ) { + $list .= "osgi(" . $bundle->{NAME} . ")" . $bundle->{VERSION} . "\n"; + } else { + $list .= $bundle->{FILE} . " osgi(" . $bundle->{NAME} . ")" . $bundle->{VERSION} . "\n"; + } + } + print $list; + } +} + +# this function print requires of OSGi aware files +sub getRequires { + + my $queue = Thread::Queue->new; + foreach $file (@_) { + $queue->enqueue($file); + } + + my @workers; + push @workers, threads->create('getRequiresWorker'); + push @workers, threads->create('getRequiresWorker'); + push @workers, threads->create('getRequiresWorker'); + push @workers, threads->create('getRequiresWorker'); + + map { $_->join } @workers; + + sub getRequiresWorker { + while ( my $file = $queue->dequeue_nb ) { + next if ( -f $file && -r _ ); + $file =~ s/[^[:print:]]//g; + if ( $file =~ m/$MANIFEST_NAME$/ || $file =~ m/\.jar$/ ) { + # we explicitly requires symlinked jars + # _that_reside_outside_the_package_ + if (-l $file) { + $exist = 0; + $lnksrc = `readlink -qen $file`; + foreach $exfile ( @allfiles ) { + $exfile =~ s/[^[:print:]]//g; + if ( $lnksrc =~ m/$exfile$/ ) { + $exist = 1; + last; + } + } + print "$lnksrc\n" if (!$exist); + next; + } + + if ( $file =~ m/\.jar$/ ) { + if ( `zipinfo -1 $file 2> /dev/null | grep -e \^$MANIFEST_NAME` eq "$MANIFEST_NAME\n" ) { + # extract MANIFEST.MF file from jar to temporary directory + $tmpdir = tempdir( CLEANUP => 1 ); + `unzip -d $tmpdir -qqo $file $MANIFEST_NAME`; + open( MANIFEST, "$tmpdir/$MANIFEST_NAME" ); + } + } else { + open( MANIFEST, "$file" ); + } + while (<MANIFEST>) { + if ( m/(^(Require-Bundle|Import-Package): )(.*)$/ ) { + my $bunlist = "$3" . "\n"; + while (<MANIFEST>) { + if (m/^[[:upper:]][[:alpha:]]+-[[:upper:]][[:alpha:]]+: .*/ ) { + $len = length $_; + seek MANIFEST, $len * -1, 1; + last; + } + $bunlist .= "$_"; + } + push @bundlelist, parsePkgString($bunlist, $file); + } + # we also explicitly require symlinked jars define by + # Bundle-ClassPath attribut + if ( m/(^(Bundle-ClassPath): )(.*)$/ ) { + $bunclp = "$3" . "\n"; + while (<MANIFEST>) { + if ( m/^[[:upper:]][[:alpha:]]+-[[:upper:]][[:alpha:]]+: .*/ ) { + $len = length $_; + seek MANIFEST, $len * -1, 1; + last; + } + $bunclp .= "$_"; + } + $bunclp =~ s/\ //g; + $bunclp =~ s/\n//g; + $bunclp =~ s/[^[:print:]]//g; + $dir = `dirname $file`; + $dir =~ s/\n//g; + @jars = split /,/, $bunclp; + for $jarfile (@jars) { + $jarfile = "$dir\/\.\.\/$jarfile"; + $jarfile = readlink $jarfile; + if ( !$jarfile eq "" ) { + print "$jarfile" . "\n"; + } + } + } + } + `rm -rf $tmpdir`; + } + } + if ( !$debug ) { @bundlelist = prepareOSGiBundlesList(@bundlelist); } + $list = ""; + for $bundle (@bundlelist) { + # replace '=' by '>=' because qualifiers are set on provides + # but not on requires. + $bundle->{VERSION} =~ s/\ =/\ >=/g; + if ( !$debug ) { + $list .= "osgi(" . $bundle->{NAME} . ")" . $bundle->{VERSION} . "\n"; + } else { + $list .= $bundle->{FILE} . " osgi(" . $bundle->{NAME} . ")" . $bundle->{VERSION} . "\n"; + } + } + print $list; + } +} + +# this function print system bundles of OSGi profile files. +sub getSystemBundles { + foreach $file (@_) { + if ( ! -f $file || ! -r _ ) { + print "'$file' file not found or cannot be read!"; + next; + } else { + open( PROFILE, "$file" ); + while (<PROFILE>) { + if ( $file =~ m/\.profile$/ ) { + if (m/(^(org\.osgi\.framework\.system\.packages)[=|\ ]+)(.*)$/) { + $syspkgs = "$3" . "\n"; + while (<PROFILE>) { + if (m/^[a-z]/) { + $len = length $_; + seek MANIFEST, $len * -1, 1; + last; + } + $syspkgs .= "$_"; + } + $syspkgs =~ s/\s+//g; + $syspkgs =~ s/\\//g; + @bundles = split /,/, $syspkgs; + foreach $bundle (@bundles) { + print "osgi(" . $bundle . ")\n"; + } + } + } + } + } + } +} + +sub parsePkgString { + my $bunstr = $_[0]; + my $file = $_[1]; + my @return; + $bunstr =~ s/ //g; + $bunstr =~ s/\n//g; + $bunstr =~ s/[^[:print:]]//g; + $bunstr =~ s/("[[:alnum:]|\-|\_|\.|\(|\)|\[|\]]+)(,)([[:alnum:]|\-|\_|\.|\(|\)|\[|\]]+")/$1 $3/g; + # remove uses bundle from Export-Package attribute + $bunstr =~ s/uses:="[[:alnum:]|\-|\_|\.|\(|\)|\[|\]|,]+"//g; + # remove optional dependencies + $bunstr =~ s/,.*;resolution:=optional//g; + # remove x-friends + $bunstr =~ s/;x-friends:="[[:alnum:]|\-|\_|\.|\(|\)|\[|\]|,]+"//g; + # remove signatures + $bunstr =~ s/Name:.*SHA1-Digest:.*//g; + @reqcomp = split /,/, $bunstr; + foreach $reqelement (@reqcomp) { + @reqelementfrmnt = split /;/, $reqelement; + $name = ""; + $version = ""; + $name = $reqelementfrmnt[0]; + $name =~ s/\"//g; + # ignoring OSGi 'system.bundle' + next if ( $name =~ m/^system\.bundle$/ ); + for $i ( 1 .. $#reqelementfrmnt ) { + if ( $reqelementfrmnt[$i] =~ m/(^(bundle-|)version=")(.*)(")/ ) { + $version = $3; + last; + } + } + $version = parseVersion($version); + push @return, { FILE => "$file", NAME => "$name", VERSION => "$version" }; + } + return @return; +} + +sub parseVersion { + my $ver = $_[0]; + if ( $ver eq "" ) { return ""; } + if ( $ver =~ m/(^[\[|\(])(.+)\ (.+)([\]|\)]$)/ ) { + if ( $1 eq "\[" ) { + $ver = " >= $2"; + } else { + $ver = " > $2"; + } + } else { + $ver = " = $ver"; + } + # we always return a full OSGi version to be able to match 1.0 + # and 1.0.0 as equal in RPM. + ( $major, $minor, $micro, $qualifier ) = split( '\.', $ver ); + if ( !defined($minor) || !$minor ) { + $minor = 0; + } + if ( !defined($micro) || !$micro ) { + $micro = 0; + } + if ( !defined($qualifier) || !$qualifier ) { + $qualifier = ""; + } else { + $qualifier = "." . $qualifier; + } + $ver = $major . "." . $minor . "." . $micro . $qualifier; + return $ver; +} + +# this function put the max version on each bundles to be able to remove +# duplicate deps with 'sort -u' command. +sub prepareOSGiBundlesList { + foreach $bundle (@_) { + foreach $cmp (@_) { + if ( $bundle->{NAME} eq $cmp->{NAME} ) { + $result = compareVersion( $bundle->{VERSION}, $cmp->{VERSION} ); + if ( $result < 0 ) { + $bundle->{VERSION} = $cmp->{VERSION}; + } + } + } + } + return @_; +} + +# this function returns a negative integer, zero, or a positive integer if +# $ver1 is less than, equal to, or greater than $ver2. +# +# REMEMBER: we mimic org.osgi.framework.Version#compareTo method but +# *at this time* we don't take care of the qualifier part of the version. +sub compareVersion { + my $ver1 = $_[0]; + my $ver2 = $_[1]; + + $ver1 = "0.0.0" if ( $ver1 eq "" ); + $ver2 = "0.0.0" if ( $ver2 eq "" ); + + $ver1 =~ m/([0-9]+)(\.)([0-9]+)(\.)([0-9]+)/; + $major1 = $1; + $minor1 = $3; + $micro1 = $5; + + $ver2 =~ m/([0-9]+)(\.)([0-9]+)(\.)([0-9]+)/; + $major2 = $1; + $minor2 = $3; + $micro2 = $5; + + $result = $major1 - $major2; + return $result if ( $result != 0 ); + + $result = $minor1 - $minor2; + return $result if ( $result != 0 ); + + $result = $micro1 - $micro2; + return $result if ( $result != 0 ); + + return $result; +} diff --git a/scripts/perl.prov b/scripts/perl.prov new file mode 100755 index 0000000..9886dd9 --- /dev/null +++ b/scripts/perl.prov @@ -0,0 +1,202 @@ +#!/usr/bin/perl + +# RPM (and it's source code) is covered under two separate licenses. + +# The entire code base may be distributed under the terms of the GNU +# General Public License (GPL), which appears immediately below. +# Alternatively, all of the source code in the lib subdirectory of the +# RPM source code distribution as well as any code derived from that +# code may instead be distributed under the GNU Library General Public +# License (LGPL), at the choice of the distributor. The complete text +# of the LGPL appears at the bottom of this file. + +# This alternative is allowed to enable applications to be linked +# against the RPM library (commonly called librpm) without forcing +# such applications to be distributed under the GPL. + +# Any questions regarding the licensing of RPM should be addressed to +# Erik Troan <ewt@redhat.com>. + +# a simple script to print the proper name for perl libraries. + +# To save development time I do not parse the perl grammmar but +# instead just lex it looking for what I want. I take special care to +# ignore comments and pod's. + +# it would be much better if perl could tell us the proper name of a +# given script. + +# The filenames to scan are either passed on the command line or if +# that is empty they are passed via stdin. + +# If there are lines in the file which match the pattern +# (m/^\s*\$VERSION\s*=\s+/) +# then these are taken to be the version numbers of the modules. +# Special care is taken with a few known idioms for specifying version +# numbers of files under rcs/cvs control. + +# If there are strings in the file which match the pattern +# m/^\s*\$RPM_Provides\s*=\s*["'](.*)['"]/i +# then these are treated as additional names which are provided by the +# file and are printed as well. + +# I plan to rewrite this in C so that perl is not required by RPM at +# build time. + +# by Ken Estes Mail.com kestes@staff.mail.com + +if ("@ARGV") { + foreach (@ARGV) { + process_file($_); + } +} else { + + # notice we are passed a list of filenames NOT as common in unix the + # contents of the file. + + foreach (<>) { + process_file($_); + } +} + + +foreach $module (sort keys %require) { + if (length($require{$module}) == 0) { + print "perl($module)\n"; + } else { + + # I am not using rpm3.0 so I do not want spaces arround my + # operators. Also I will need to change the processing of the + # $RPM_* variable when I upgrade. + + print "perl($module) = $require{$module}\n"; + } +} + +exit 0; + + + +sub process_file { + + my ($file) = @_; + chomp $file; + + if (!open(FILE, $file)) { + warn("$0: Warning: Could not open file '$file' for reading: $!\n"); + return; + } + + my ($package, $version, $incomment, $inover) = (); + + while (<FILE>) { + + # skip the documentation + + # we should not need to have item in this if statement (it + # properly belongs in the over/back section) but people do not + # read the perldoc. + + if (m/^=(head[1-4]|pod|for|item)/) { + $incomment = 1; + } + + if (m/^=(cut)/) { + $incomment = 0; + $inover = 0; + } + + if (m/^=(over)/) { + $inover = 1; + } + + if (m/^=(back)/) { + $inover = 0; + } + + if ($incomment || $inover) { + next; + } + + # skip the data section + if (m/^__(DATA|END)__$/) { + last; + } + + # not everyone puts the package name of the file as the first + # package name so we report all namespaces except some common + # false positives as if they were provided packages (really ugly). + + if (m/^\s*package\s+([_:a-zA-Z0-9]+)\s*;/) { + $package = $1; + undef $version; + if ($package eq 'main') { + undef $package; + } else { + # If $package already exists in the $require hash, it means + # the package definition is broken up over multiple blocks. + # In that case, don't stomp a previous $VERSION we might have + # found. (See BZ#214496.) + $require{$package} = undef unless (exists $require{$package}); + } + } + + # after we found the package name take the first assignment to + # $VERSION as the version number. Exporter requires that the + # variable be called VERSION so we are safe. + + # here are examples of VERSION lines from the perl distribution + + #FindBin.pm:$VERSION = $VERSION = sprintf("%d.%02d", q$Revision: 1.9 $ =~ /(\d+)\.(\d+)/); + #ExtUtils/Install.pm:$VERSION = substr q$Revision: 1.9 $, 10; + #CGI/Apache.pm:$VERSION = (qw$Revision: 1.9 $)[1]; + #DynaLoader.pm:$VERSION = $VERSION = "1.03"; # avoid typo warning + #General.pm:$Config::General::VERSION = 2.33; + # + # or with the new "our" pragma you could (read will) see: + # + # our $VERSION = '1.00' + if ($package && m/^\s*(our\s+)?\$(\Q$package\E::)?VERSION\s*=\s+/) { + + # first see if the version string contains the string + # '$Revision' this often causes bizzare strings and is the most + # common method of non static numbering. + + if (m/(\$Revision: (\d+[.0-9]+))/) { + $version = $2; + } elsif (m/['"]?(\d+[.0-9]+)['"]?/) { + + # look for a static number hard coded in the script + + $version = $1; + } + $require{$package} = $version; + } + + # Allow someone to have a variable that defines virtual packages + # The variable is called $RPM_Provides. It must be scoped with + # "our", but not "local" or "my" (just would not make sense). + # + # For instance: + # + # $RPM_Provides = "blah bleah" + # + # Will generate provides for "blah" and "bleah". + # + # Each keyword can appear multiple times. Don't + # bother with datastructures to store these strings, + # if we need to print it print it now. + + if (m/^\s*(our\s+)?\$RPM_Provides\s*=\s*["'](.*)['"]/i) { + foreach $_ (split(/\s+/, $2)) { + print "$_\n"; + } + } + + } + + close(FILE) || + die("$0: Could not close file: '$file' : $!\n"); + + return; +} diff --git a/scripts/perl.req b/scripts/perl.req new file mode 100755 index 0000000..c676c73 --- /dev/null +++ b/scripts/perl.req @@ -0,0 +1,286 @@ +#!/usr/bin/perl + +# RPM (and its source code) is covered under two separate licenses. + +# The entire code base may be distributed under the terms of the GNU +# General Public License (GPL), which appears immediately below. +# Alternatively, all of the source code in the lib subdirectory of the +# RPM source code distribution as well as any code derived from that +# code may instead be distributed under the GNU Library General Public +# License (LGPL), at the choice of the distributor. The complete text +# of the LGPL appears at the bottom of this file. + +# This alternatively is allowed to enable applications to be linked +# against the RPM library (commonly called librpm) without forcing +# such applications to be distributed under the GPL. + +# Any questions regarding the licensing of RPM should be addressed to +# Erik Troan <ewt@redhat.com>. + +# a simple makedepend like script for perl. + +# To save development time I do not parse the perl grammar but +# instead just lex it looking for what I want. I take special care to +# ignore comments and pod's. + +# It would be much better if perl could tell us the dependencies of a +# given script. + +# The filenames to scan are either passed on the command line or if +# that is empty they are passed via stdin. + +# If there are strings in the file which match the pattern +# m/^\s*\$RPM_Requires\s*=\s*["'](.*)['"]/i +# then these are treated as additional names which are required by the +# file and are printed as well. + +# I plan to rewrite this in C so that perl is not required by RPM at +# build time. + +# by Ken Estes Mail.com kestes@staff.mail.com + +$HAVE_VERSION = 0; +eval { require version; $HAVE_VERSION = 1; }; + + +if ("@ARGV") { + foreach (@ARGV) { + process_file($_); + } +} else { + + # notice we are passed a list of filenames NOT as common in unix the + # contents of the file. + + foreach (<>) { + process_file($_); + } +} + + +foreach $perlver (sort keys %perlreq) { + print "perl >= $perlver\n"; +} +foreach $module (sort keys %require) { + if (length($require{$module}) == 0) { + print "perl($module)\n"; + } else { + + # I am not using rpm3.0 so I do not want spaces around my + # operators. Also I will need to change the processing of the + # $RPM_* variable when I upgrade. + + print "perl($module) >= $require{$module}\n"; + } +} + +exit 0; + + + +sub add_require { + my ($module, $newver) = @_; + my $oldver = $require{$module}; + if ($oldver) { + $require{$module} = $newver + if ($HAVE_VERSION && $newver && version->new($oldver) < $newver); + } + else { + $require{$module} = $newver; + } +} + +sub process_file { + + my ($file) = @_; + chomp $file; + + if (!open(FILE, $file)) { + warn("$0: Warning: Could not open file '$file' for reading: $!\n"); + return; + } + + while (<FILE>) { + + # skip the "= <<" block + + if (m/^\s*\$(?:.*)\s*=\s*<<\s*(["'`])(.+?)\1/ || + m/^\s*\$(.*)\s*=\s*<<(\w+)\s*;/) { + $tag = $2; + while (<FILE>) { + chomp; + ( $_ eq $tag ) && last; + } + $_ = <FILE>; + } + + # skip q{} quoted sections - just hope we don't have curly brackets + # within the quote, nor an escaped hash mark that isn't a comment + # marker, such as occurs right here. Draw the line somewhere. + if ( m/^.*\Wq[qxwr]?\s*([{([#|\/])[^})\]#|\/]*$/ && ! m/^\s*(require|use)\s/ ) { + $tag = $1; + $tag =~ tr/{\(\[\#|\//})]#|\//; + while (<FILE>) { + ( $_ =~ m/\}/ ) && last; + } + } + + # skip the documentation + + # we should not need to have item in this if statement (it + # properly belongs in the over/back section) but people do not + # read the perldoc. + + if (/^=(head[1-4]|pod|for|item)/) { + /^=cut/ && next while <FILE>; + } + + if (/^=over/) { + /^=back/ && next while <FILE>; + } + + # skip the data section + if (m/^__(DATA|END)__$/) { + last; + } + + # Each keyword can appear multiple times. Don't + # bother with datastructures to store these strings, + # if we need to print it print it now. + # + # Again allow for "our". + if (m/^\s*(our\s+)?\$RPM_Requires\s*=\s*["'](.*)['"]/i) { + foreach $_ (split(/\s+/, $2)) { + print "$_\n"; + } + } + + my $modver_re = qr/[.0-9]+/; + + if ( + +# ouch could be in a eval, perhaps we do not want these since we catch +# an exception they must not be required + +# eval { require Term::ReadLine } or die $@; +# eval "require Term::Rendezvous;" or die $@; +# eval { require Carp } if defined $^S; # If error/warning during compilation, + + + (m/^(\s*) # we hope the inclusion starts the line + (require|use)\s+(?!\{) # do not want 'do {' loops + # quotes around name are always legal + ['"]?([^; '"\t#]+)['"]?[\t; ] + # the syntax for 'use' allows version requirements + # the latter part is for "use base qw(Foo)" and friends special case + \s*($modver_re|(qw\s*[(\/'"]\s*|['"])[^)\/"'\$]*?\s*[)\/"'])? + /x) + ) { + my ($whitespace, $statement, $module, $version) = ($1, $2, $3, $4); + + # we only consider require statements that are flushed against + # the left edge. any other require statements give too many + # false positives, as they are usually inside of an if statement + # as a fallback module or a rarely used option + + ($whitespace ne "" && $statement eq "require") && next; + + # if there is some interpolation of variables just skip this + # dependency, we do not want + # do "$ENV{LOGDIR}/$rcfile"; + + ($module =~ m/\$/) && next; + + # skip if the phrase was "use of" -- shows up in gimp-perl, et al. + next if $module eq 'of'; + + # if the module ends in a comma we probably caught some + # documentation of the form 'check stuff,\n do stuff, clean + # stuff.' there are several of these in the perl distribution + + ($module =~ m/[,>]$/) && next; + + # if the module name starts in a dot it is not a module name. + # Is this necessary? Please give me an example if you turn this + # back on. + + # ($module =~ m/^\./) && next; + + # if the module starts with /, it is an absolute path to a file + if ($module =~ m(^/)) { + print "$module\n"; + next; + } + + # sometimes people do use POSIX qw(foo), or use POSIX(qw(foo)) etc. + # we can strip qw.*$, as well as (.*$: + $module =~ s/qw.*$//; + $module =~ s/\(.*$//; + + # if the module ends with .pm, strip it to leave only basename. + $module =~ s/\.pm$//; + + # some perl programmers write 'require URI/URL;' when + # they mean 'require URI::URL;' + + $module =~ s/\//::/; + + # trim off trailing parentheses if any. Sometimes people pass + # the module an empty list. + + $module =~ s/\(\s*\)$//; + + if ( $module =~ m/^v?([0-9._]+)$/ ) { + # if module is a number then both require and use interpret that + # to mean that a particular version of perl is specified + + my $ver = $1; + if ($ver =~ /5.00/) { + $perlreq{"0:$ver"} = 1; + next; + } + else { + $perlreq{"1:$ver"} = 1; + next; + } + + }; + + # ph files do not use the package name inside the file. + # perlmodlib documentation says: + + # the .ph files made by h2ph will probably end up as + # extension modules made by h2xs. + + # so do not expend much effort on these. + + + # there is no easy way to find out if a file named systeminfo.ph + # will be included with the name sys/systeminfo.ph so only use the + # basename of *.ph files + + ($module =~ m/\.ph$/) && next; + + # use base qw(Foo) dependencies + if ($statement eq "use" && $module eq "base") { + add_require($module, undef); + if ($version =~ /^qw\s*[(\/'"]\s*([^)\/"']+?)\s*[)\/"']/) { + add_require($_, undef) for split(' ', $1); + } + elsif ($version =~ /(["'])([^"']+)\1/) { + add_require($2, undef); + } + next; + } + $version = undef unless $version =~ /^$modver_re$/o; + + add_require($module, $version); + } + + } + + close(FILE) || + die("$0: Could not close file: '$file' : $!\n"); + + return; +} diff --git a/scripts/perldeps.pl b/scripts/perldeps.pl new file mode 100755 index 0000000..bffad67 --- /dev/null +++ b/scripts/perldeps.pl @@ -0,0 +1,1116 @@ +#!/usr/bin/perl -Tw +# +# perldeps.pl -- Analyze dependencies of Perl packages +# +# Michael Jennings +# 7 November 2005 +# +# $Id: perldeps.pl,v 1.6 2006/04/04 20:12:03 mej Exp $ +# + +use strict; +use Config; +use File::Basename; +use File::Find; +use Getopt::Long; +use POSIX; + +############### Debugging stolen from Mezzanine::Util ############### +my $DEBUG = 0; + +# Debugging output +sub +dprintf(@) +{ + my ($f, $l, $s, $format); + my @params = @_; + + return if (! $DEBUG); + $format = shift @params; + if (!scalar(@params)) { + return dprint($format); + } + (undef, undef, undef, $s) = caller(1); + if (!defined($s)) { + $s = "MAIN"; + } + (undef, $f, $l) = caller(0); + $f =~ s/^.*\/([^\/]+)$/$1/; + $s =~ s/^\w+:://g; + $s .= "()" if ($s =~ /^\w+$/); + $f = "" if (!defined($f)); + $l = "" if (!defined($l)); + $format = "" if (!defined($format)); + for (my $i = 0; $i < scalar(@params); $i++) { + if (!defined($params[$i])) { + $params[$i] = "<undef>"; + } + } + printf("[$f/$l/$s] $format", @params); +} + +sub +dprint(@) +{ + my ($f, $l, $s); + my @params = @_; + + return if (! $DEBUG); + (undef, undef, undef, $s) = caller(1); + if (!defined($s)) { + $s = "MAIN"; + } + (undef, $f, $l) = caller(0); + $f =~ s/^.*\/([^\/]+)$/$1/; + $s =~ s/\w+:://g; + $s .= "()" if ($s =~ /^\w+$/); + $f = "" if (!defined($f)); + $l = "" if (!defined($l)); + $s = "" if (!defined($s)); + for (my $i = 0; $i < scalar(@params); $i++) { + if (!defined($params[$i])) { + $params[$i] = "<undef>"; + } + } + print "[$f/$l/$s] ", @params; +} + +############### Module::ScanDeps Code ############### +use constant dl_ext => ".$Config{dlext}"; +use constant lib_ext => $Config{lib_ext}; +use constant is_insensitive_fs => ( + -s $0 + and (-s lc($0) || -1) == (-s uc($0) || -1) + and (-s lc($0) || -1) == -s $0 +); + +my $CurrentPackage = ''; +my $SeenTk; + +# Pre-loaded module dependencies +my %Preload = ( + 'AnyDBM_File.pm' => [qw( SDBM_File.pm )], + 'Authen/SASL.pm' => 'sub', + 'Bio/AlignIO.pm' => 'sub', + 'Bio/Assembly/IO.pm' => 'sub', + 'Bio/Biblio/IO.pm' => 'sub', + 'Bio/ClusterIO.pm' => 'sub', + 'Bio/CodonUsage/IO.pm' => 'sub', + 'Bio/DB/Biblio.pm' => 'sub', + 'Bio/DB/Flat.pm' => 'sub', + 'Bio/DB/GFF.pm' => 'sub', + 'Bio/DB/Taxonomy.pm' => 'sub', + 'Bio/Graphics/Glyph.pm' => 'sub', + 'Bio/MapIO.pm' => 'sub', + 'Bio/Matrix/IO.pm' => 'sub', + 'Bio/Matrix/PSM/IO.pm' => 'sub', + 'Bio/OntologyIO.pm' => 'sub', + 'Bio/PopGen/IO.pm' => 'sub', + 'Bio/Restriction/IO.pm' => 'sub', + 'Bio/Root/IO.pm' => 'sub', + 'Bio/SearchIO.pm' => 'sub', + 'Bio/SeqIO.pm' => 'sub', + 'Bio/Structure/IO.pm' => 'sub', + 'Bio/TreeIO.pm' => 'sub', + 'Bio/LiveSeq/IO.pm' => 'sub', + 'Bio/Variation/IO.pm' => 'sub', + 'Crypt/Random.pm' => sub { + _glob_in_inc('Crypt/Random/Provider', 1); + }, + 'Crypt/Random/Generator.pm' => sub { + _glob_in_inc('Crypt/Random/Provider', 1); + }, + 'DBI.pm' => sub { + grep !/\bProxy\b/, _glob_in_inc('DBD', 1); + }, + 'DBIx/SearchBuilder.pm' => 'sub', + 'DBIx/ReportBuilder.pm' => 'sub', + 'Device/ParallelPort.pm' => 'sub', + 'Device/SerialPort.pm' => [ qw( + termios.ph asm/termios.ph sys/termiox.ph sys/termios.ph sys/ttycom.ph + ) ], + 'ExtUtils/MakeMaker.pm' => sub { + grep /\bMM_/, _glob_in_inc('ExtUtils', 1); + }, + 'File/Basename.pm' => [qw( re.pm )], + 'File/Spec.pm' => sub { + require File::Spec; + map { my $name = $_; $name =~ s!::!/!g; "$name.pm" } @File::Spec::ISA; + }, + 'HTTP/Message.pm' => [ qw( + URI/URL.pm URI.pm + ) ], + 'IO.pm' => [ qw( + IO/Handle.pm IO/Seekable.pm IO/File.pm + IO/Pipe.pm IO/Socket.pm IO/Dir.pm + ) ], + 'IO/Socket.pm' => [qw( IO/Socket/UNIX.pm )], + 'LWP/UserAgent.pm' => [ qw( + URI/URL.pm URI/http.pm LWP/Protocol/http.pm + LWP/Protocol/https.pm + ), _glob_in_inc("LWP/Authen", 1) ], + 'Locale/Maketext/Lexicon.pm' => 'sub', + 'Locale/Maketext/GutsLoader.pm' => [qw( Locale/Maketext/Guts.pm )], + 'Mail/Audit.pm' => 'sub', + 'Math/BigInt.pm' => 'sub', + 'Math/BigFloat.pm' => 'sub', + 'Module/Build.pm' => 'sub', + 'Module/Pluggable.pm' => sub { + _glob_in_inc("$CurrentPackage/Plugin", 1); + }, + 'MIME/Decoder.pm' => 'sub', + 'Net/DNS/RR.pm' => 'sub', + 'Net/FTP.pm' => 'sub', + 'Net/SSH/Perl.pm' => 'sub', + 'PDF/API2/Resource/Font.pm' => 'sub', + 'PDF/API2/Basic/TTF/Font.pm' => sub { + _glob_in_inc('PDF/API2/Basic/TTF', 1); + }, + 'PDF/Writer.pm' => 'sub', + 'POE' => [ qw( + POE/Kernel.pm POE/Session.pm + ) ], + 'POE/Kernel.pm' => [ + map "POE/Resource/$_.pm", qw( + Aliases Events Extrefs FileHandles + SIDs Sessions Signals Statistics + ) + ], + 'Parse/AFP.pm' => 'sub', + 'Parse/Binary.pm' => 'sub', + 'Regexp/Common.pm' => 'sub', + 'SOAP/Lite.pm' => sub { + (($] >= 5.008 ? ('utf8.pm') : ()), _glob_in_inc('SOAP/Transport', 1)); + }, + 'SQL/Parser.pm' => sub { + _glob_in_inc('SQL/Dialects', 1); + }, + 'SVN/Core.pm' => sub { + _glob_in_inc('SVN', 1), + map "auto/SVN/$_->{name}", _glob_in_inc('auto/SVN'), + }, + 'SVK/Command.pm' => sub { + _glob_in_inc('SVK', 1); + }, + 'SerialJunk.pm' => [ qw( + termios.ph asm/termios.ph sys/termiox.ph sys/termios.ph sys/ttycom.ph + ) ], + 'Template.pm' => 'sub', + 'Term/ReadLine.pm' => 'sub', + 'Tk.pm' => sub { + $SeenTk = 1; + qw( Tk/FileSelect.pm Encode/Unicode.pm ); + }, + 'Tk/Balloon.pm' => [qw( Tk/balArrow.xbm )], + 'Tk/BrowseEntry.pm' => [qw( Tk/cbxarrow.xbm Tk/arrowdownwin.xbm )], + 'Tk/ColorEditor.pm' => [qw( Tk/ColorEdit.xpm )], + 'Tk/FBox.pm' => [qw( Tk/folder.xpm Tk/file.xpm )], + 'Tk/Toplevel.pm' => [qw( Tk/Wm.pm )], + 'URI.pm' => sub { + grep !/.\b[_A-Z]/, _glob_in_inc('URI', 1); + }, + 'Win32/EventLog.pm' => [qw( Win32/IPC.pm )], + 'Win32/Exe.pm' => 'sub', + 'Win32/TieRegistry.pm' => [qw( Win32API/Registry.pm )], + 'Win32/SystemInfo.pm' => [qw( Win32/cpuspd.dll )], + 'XML/Parser.pm' => sub { + _glob_in_inc('XML/Parser/Style', 1), + _glob_in_inc('XML/Parser/Encodings', 1), + }, + 'XML/Parser/Expat.pm' => sub { + ($] >= 5.008) ? ('utf8.pm') : (); + }, + 'XML/SAX.pm' => [qw( XML/SAX/ParserDetails.ini ) ], + 'XMLRPC/Lite.pm' => sub { + _glob_in_inc('XMLRPC/Transport', 1),; + }, + 'diagnostics.pm' => sub { + _find_in_inc('Pod/perldiag.pod') + ? 'Pod/perldiag.pl' + : 'pod/perldiag.pod'; + }, + 'utf8.pm' => [ + 'utf8_heavy.pl', do { + my $dir = 'unicore'; + my @subdirs = qw( To ); + my @files = map "$dir/lib/$_->{name}", _glob_in_inc("$dir/lib"); + + if (@files) { + # 5.8.x + push @files, (map "$dir/$_.pl", qw( Exact Canonical )); + } + else { + # 5.6.x + $dir = 'unicode'; + @files = map "$dir/Is/$_->{name}", _glob_in_inc("$dir/Is") + or return; + push @subdirs, 'In'; + } + + foreach my $subdir (@subdirs) { + foreach (_glob_in_inc("$dir/$subdir")) { + push @files, "$dir/$subdir/$_->{name}"; + } + } + @files; + } + ], + 'charnames.pm' => [ + _find_in_inc('unicore/Name.pl') ? 'unicore/Name.pl' : 'unicode/Name.pl' + ], +); + +my $Keys = 'files|keys|recurse|rv|skip|first|execute|compile'; +sub scan_deps { + my %args = ( + rv => {}, + (@_ and $_[0] =~ /^(?:$Keys)$/o) ? @_ : (files => [@_], recurse => 1) + ); + + scan_deps_static(\%args); + + if ($args{execute} or $args{compile}) { + scan_deps_runtime( + rv => $args{rv}, + files => $args{files}, + execute => $args{execute}, + compile => $args{compile}, + skip => $args{skip} + ); + } + + return ($args{rv}); +} + +sub scan_deps_static { + my ($args) = @_; + my ($files, $keys, $recurse, $rv, $skip, $first, $execute, $compile) = + @$args{qw( files keys recurse rv skip first execute compile )}; + + $rv ||= {}; + $skip ||= {}; + + foreach my $file (@{$files}) { + my $key = shift @{$keys}; + next if $skip->{$file}++; + next if is_insensitive_fs() + and $file ne lc($file) and $skip->{lc($file)}++; + + local *FH; + open FH, $file or die "Cannot open $file: $!"; + + $SeenTk = 0; + + # Line-by-line scanning + LINE: + while (<FH>) { + chomp(my $line = $_); + foreach my $pm (scan_line($line)) { + last LINE if $pm eq '__END__'; + + if ($pm eq '__POD__') { + while (<FH>) { last if (/^=cut/) } + next LINE; + } + + $pm = 'CGI/Apache.pm' if /^Apache(?:\.pm)$/; + + add_deps( + used_by => $key, + rv => $rv, + modules => [$pm], + skip => $skip + ); + + my $preload = $Preload{$pm} or next; + if ($preload eq 'sub') { + $pm =~ s/\.p[mh]$//i; + $preload = [ _glob_in_inc($pm, 1) ]; + } + elsif (UNIVERSAL::isa($preload, 'CODE')) { + $preload = [ $preload->($pm) ]; + } + + add_deps( + used_by => $key, + rv => $rv, + modules => $preload, + skip => $skip + ); + } + } + close FH; + + # }}} + } + + # Top-level recursion handling {{{ + while ($recurse) { + my $count = keys %$rv; + my @files = sort grep -T $_->{file}, values %$rv; + scan_deps_static({ + files => [ map $_->{file}, @files ], + keys => [ map $_->{key}, @files ], + rv => $rv, + skip => $skip, + recurse => 0, + }) or ($args->{_deep} and return); + last if $count == keys %$rv; + } + + # }}} + + return $rv; +} + +sub scan_deps_runtime { + my %args = ( + perl => $^X, + rv => {}, + (@_ and $_[0] =~ /^(?:$Keys)$/o) ? @_ : (files => [@_], recurse => 1) + ); + my ($files, $rv, $execute, $compile, $skip, $perl) = + @args{qw( files rv execute compile skip perl )}; + + $files = (ref($files)) ? $files : [$files]; + + my ($inchash, $incarray, $dl_shared_objects) = ({}, [], []); + if ($compile) { + my $file; + + foreach $file (@$files) { + ($inchash, $dl_shared_objects, $incarray) = ({}, [], []); + _compile($perl, $file, $inchash, $dl_shared_objects, $incarray); + + my $rv_sub = _make_rv($inchash, $dl_shared_objects, $incarray); + _merge_rv($rv_sub, $rv); + } + } + elsif ($execute) { + my $excarray = (ref($execute)) ? $execute : [@$files]; + my $exc; + my $first_flag = 1; + foreach $exc (@$excarray) { + ($inchash, $dl_shared_objects, $incarray) = ({}, [], []); + _execute( + $perl, $exc, $inchash, $dl_shared_objects, $incarray, + $first_flag + ); + $first_flag = 0; + } + + my $rv_sub = _make_rv($inchash, $dl_shared_objects, $incarray); + _merge_rv($rv_sub, $rv); + } + + return ($rv); +} + +sub scan_line { + my $line = shift; + my %found; + + return '__END__' if $line =~ /^__(?:END|DATA)__$/; + return '__POD__' if $line =~ /^=\w/; + + $line =~ s/\s*#.*$//; + $line =~ s/[\\\/]+/\//g; + + foreach (split(/;/, $line)) { + if (/^\s*package\s+(\w+);/) { + $CurrentPackage = $1; + $CurrentPackage =~ s{::}{/}g; + return; + } + return if /^\s*(use|require)\s+[\d\._]+/; + + if (my ($libs) = /\b(?:use\s+lib\s+|(?:unshift|push)\W+\@INC\W+)(.+)/) + { + my $archname = + defined($Config{archname}) ? $Config{archname} : ''; + my $ver = defined($Config{version}) ? $Config{version} : ''; + foreach (grep(/\w/, split(/["';() ]/, $libs))) { + unshift(@INC, "$_/$ver") if -d "$_/$ver"; + unshift(@INC, "$_/$archname") if -d "$_/$archname"; + unshift(@INC, "$_/$ver/$archname") if -d "$_/$ver/$archname"; + } + next; + } + + $found{$_}++ for scan_chunk($_); + } + + return sort keys %found; +} + +sub scan_chunk { + my $chunk = shift; + + # Module name extraction heuristics {{{ + my $module = eval { + $_ = $chunk; + + return [ 'base.pm', + map { s{::}{/}g; "$_.pm" } + grep { length and !/^q[qw]?$/ } split(/[^\w:]+/, $1) ] + if /^\s* use \s+ base \s+ (.*)/sx; + + return [ 'Class/Autouse.pm', + map { s{::}{/}g; "$_.pm" } + grep { length and !/^:|^q[qw]?$/ } split(/[^\w:]+/, $1) ] + if /^\s* use \s+ Class::Autouse \s+ (.*)/sx + or /^\s* Class::Autouse \s* -> \s* autouse \s* (.*)/sx; + + return [ 'POE.pm', + map { s{::}{/}g; "POE/$_.pm" } + grep { length and !/^q[qw]?$/ } split(/[^\w:]+/, $1) ] + if /^\s* use \s+ POE \s+ (.*)/sx; + + return [ 'encoding.pm', + map { _find_encoding($_) } + grep { length and !/^q[qw]?$/ } split(/[^\w:]+/, $1) ] + if /^\s* use \s+ encoding \s+ (.*)/sx; + + return $1 if /(?:^|\s)(?:use|no|require)\s+([\w:\.\-\\\/\"\']+)/; + return $1 + if /(?:^|\s)(?:use|no|require)\s+\(\s*([\w:\.\-\\\/\"\']+)\s*\)/; + + if ( s/(?:^|\s)eval\s+\"([^\"]+)\"/$1/ + or s/(?:^|\s)eval\s*\(\s*\"([^\"]+)\"\s*\)/$1/) + { + return $1 if /(?:^|\s)(?:use|no|require)\s+([\w:\.\-\\\/\"\']*)/; + } + + return "File/Glob.pm" if /<[^>]*[^\$\w>][^>]*>/; + return "DBD/$1.pm" if /\b[Dd][Bb][Ii]:(\w+):/; + if (/(?:(:encoding)|\b(?:en|de)code)\(\s*['"]?([-\w]+)/) { + my $mod = _find_encoding($2); + return [ 'PerlIO.pm', $mod ] if $1 and $mod; + return $mod if $mod; + } + return $1 if /(?:^|\s)(?:do|require)\s+[^"]*"(.*?)"/; + return $1 if /(?:^|\s)(?:do|require)\s+[^']*'(.*?)'/; + return $1 if /[^\$]\b([\w:]+)->\w/ and $1 ne 'Tk'; + return $1 if /\b(\w[\w:]*)::\w+\(/; + + if ($SeenTk) { + my @modules; + while (/->\s*([A-Z]\w+)/g) { + push @modules, "Tk/$1.pm"; + } + while (/->\s*Scrolled\W+([A-Z]\w+)/g) { + push @modules, "Tk/$1.pm"; + push @modules, "Tk/Scrollbar.pm"; + } + return \@modules; + } + return; + }; + + # }}} + + return unless defined($module); + return wantarray ? @$module : $module->[0] if ref($module); + + $module =~ s/^['"]//; + return unless $module =~ /^\w/; + + $module =~ s/\W+$//; + $module =~ s/::/\//g; + return if $module =~ /^(?:[\d\._]+|'.*[^']|".*[^"])$/; + + $module .= ".pm" unless $module =~ /\./; + return $module; +} + +sub _find_encoding { + return unless $] >= 5.008 and eval { require Encode; %Encode::ExtModule }; + + my $mod = $Encode::ExtModule{ Encode::find_encoding($_[0])->name } + or return; + $mod =~ s{::}{/}g; + return "$mod.pm"; +} + +sub _add_info { + my ($rv, $module, $file, $used_by, $type) = @_; + return unless defined($module) and defined($file); + + $rv->{$module} ||= { + file => $file, + key => $module, + type => $type, + }; + + push @{ $rv->{$module}{used_by} }, $used_by + if defined($used_by) + and $used_by ne $module + and !grep { $_ eq $used_by } @{ $rv->{$module}{used_by} }; +} + +sub add_deps { + my %args = + ((@_ and $_[0] =~ /^(?:modules|rv|used_by)$/) + ? @_ + : (rv => (ref($_[0]) ? shift(@_) : undef), modules => [@_])); + + my $rv = $args{rv} || {}; + my $skip = $args{skip} || {}; + my $used_by = $args{used_by}; + + foreach my $module (@{ $args{modules} }) { + next if exists $rv->{$module}; + + my $file = _find_in_inc($module) or next; + next if $skip->{$file}; + next if is_insensitive_fs() and $skip->{lc($file)}; + + my $type = 'module'; + $type = 'data' unless $file =~ /\.p[mh]$/i; + _add_info($rv, $module, $file, $used_by, $type); + + if ($module =~ /(.*?([^\/]*))\.p[mh]$/i) { + my ($path, $basename) = ($1, $2); + + foreach (_glob_in_inc("auto/$path")) { + next if $skip->{$_->{file}}; + next if is_insensitive_fs() and $skip->{lc($_->{file})}; + next if $_->{file} =~ m{\bauto/$path/.*/}; # weed out subdirs + next if $_->{name} =~ m/(?:^|\/)\.(?:exists|packlist)$/; + my $ext = lc($1) if $_->{name} =~ /(\.[^.]+)$/; + next if $ext eq lc(lib_ext()); + my $type = 'shared' if $ext eq lc(dl_ext()); + $type = 'autoload' if $ext eq '.ix' or $ext eq '.al'; + $type ||= 'data'; + + _add_info($rv, "auto/$path/$_->{name}", $_->{file}, $module, + $type); + } + } + } + + return $rv; +} + +sub _find_in_inc { + my $file = shift; + + # absolute file names + return $file if -f $file; + + foreach my $dir (grep !/\bBSDPAN\b/, @INC) { + return "$dir/$file" if -f "$dir/$file"; + } + return; +} + +sub _glob_in_inc { + my $subdir = shift; + my $pm_only = shift; + my @files; + + require File::Find; + + foreach my $dir (map "$_/$subdir", grep !/\bBSDPAN\b/, @INC) { + next unless -d $dir; + File::Find::find({ + "wanted" => sub { + my $name = $File::Find::name; + $name =~ s!^\Q$dir\E/!!; + return if $pm_only and lc($name) !~ /\.p[mh]$/i; + push @files, $pm_only + ? "$subdir/$name" + : { file => $File::Find::name, + name => $name, + } + if -f; + }, + "untaint" => 1, + "untaint_skip" => 1, + "untaint_pattern" => qr|^([-+@\w./]+)$| + }, $dir + ); + } + + return @files; +} + +# App::Packer compatibility functions + +sub new { + my ($class, $self) = @_; + return bless($self ||= {}, $class); +} + +sub set_file { + my $self = shift; + foreach my $script (@_) { + my $basename = $script; + $basename =~ s/.*\///; + $self->{main} = { + key => $basename, + file => $script, + }; + } +} + +sub set_options { + my $self = shift; + my %args = @_; + foreach my $module (@{ $args{add_modules} }) { + $module =~ s/::/\//g; + $module .= '.pm' unless $module =~ /\.p[mh]$/i; + my $file = _find_in_inc($module) or next; + $self->{files}{$module} = $file; + } +} + +sub calculate_info { + my $self = shift; + my $rv = scan_deps( + keys => [ $self->{main}{key}, sort keys %{ $self->{files} }, ], + files => [ $self->{main}{file}, + map { $self->{files}{$_} } sort keys %{ $self->{files} }, + ], + recurse => 1, + ); + + my $info = { + main => { file => $self->{main}{file}, + store_as => $self->{main}{key}, + }, + }; + + my %cache = ($self->{main}{key} => $info->{main}); + foreach my $key (sort keys %{ $self->{files} }) { + my $file = $self->{files}{$key}; + + $cache{$key} = $info->{modules}{$key} = { + file => $file, + store_as => $key, + used_by => [ $self->{main}{key} ], + }; + } + + foreach my $key (sort keys %{$rv}) { + my $val = $rv->{$key}; + if ($cache{ $val->{key} }) { + push @{ $info->{ $val->{type} }->{ $val->{key} }->{used_by} }, + @{ $val->{used_by} }; + } + else { + $cache{ $val->{key} } = $info->{ $val->{type} }->{ $val->{key} } = + { file => $val->{file}, + store_as => $val->{key}, + used_by => $val->{used_by}, + }; + } + } + + $self->{info} = { main => $info->{main} }; + + foreach my $type (sort keys %{$info}) { + next if $type eq 'main'; + + my @val; + if (UNIVERSAL::isa($info->{$type}, 'HASH')) { + foreach my $val (sort values %{ $info->{$type} }) { + @{ $val->{used_by} } = map $cache{$_} || "!!$_!!", + @{ $val->{used_by} }; + push @val, $val; + } + } + + $type = 'modules' if $type eq 'module'; + $self->{info}{$type} = \@val; + } +} + +sub get_files { + my $self = shift; + return $self->{info}; +} + +# scan_deps_runtime utility functions + +sub _compile { + my ($perl, $file, $inchash, $dl_shared_objects, $incarray) = @_; + + my $fname = File::Temp::mktemp("$file.XXXXXX"); + my $fhin = FileHandle->new($file) or die "Couldn't open $file\n"; + my $fhout = FileHandle->new("> $fname") or die "Couldn't open $fname\n"; + + my $line = do { local $/; <$fhin> }; + $line =~ s/use Module::ScanDeps::DataFeed.*?\n//sg; + $line =~ s/^(.*?)((?:[\r\n]+__(?:DATA|END)__[\r\n]+)|$)/ +use Module::ScanDeps::DataFeed '$fname.out'; +sub { +$1 +} +$2/s; + $fhout->print($line); + $fhout->close; + $fhin->close; + + system($perl, $fname); + + _extract_info("$fname.out", $inchash, $dl_shared_objects, $incarray); + unlink("$fname"); + unlink("$fname.out"); +} + +sub _execute { + my ($perl, $file, $inchash, $dl_shared_objects, $incarray, $firstflag) = @_; + + $DB::single = $DB::single = 1; + + my $fname = _abs_path(File::Temp::mktemp("$file.XXXXXX")); + my $fhin = FileHandle->new($file) or die "Couldn't open $file"; + my $fhout = FileHandle->new("> $fname") or die "Couldn't open $fname"; + + my $line = do { local $/; <$fhin> }; + $line =~ s/use Module::ScanDeps::DataFeed.*?\n//sg; + $line = "use Module::ScanDeps::DataFeed '$fname.out';\n" . $line; + $fhout->print($line); + $fhout->close; + $fhin->close; + + File::Path::rmtree( ['_Inline'], 0, 1); # XXX hack + system($perl, $fname) == 0 or die "SYSTEM ERROR in executing $file: $?"; + + _extract_info("$fname.out", $inchash, $dl_shared_objects, $incarray); + unlink("$fname"); + unlink("$fname.out"); +} + +sub _make_rv { + my ($inchash, $dl_shared_objects, $inc_array) = @_; + + my $rv = {}; + my @newinc = map(quotemeta($_), @$inc_array); + my $inc = join('|', sort { length($b) <=> length($a) } @newinc); + + require File::Spec; + + my $key; + foreach $key (keys(%$inchash)) { + my $newkey = $key; + $newkey =~ s"^(?:(?:$inc)/?)""sg if File::Spec->file_name_is_absolute($newkey); + + $rv->{$newkey} = { + 'used_by' => [], + 'file' => $inchash->{$key}, + 'type' => _gettype($inchash->{$key}), + 'key' => $key + }; + } + + my $dl_file; + foreach $dl_file (@$dl_shared_objects) { + my $key = $dl_file; + $key =~ s"^(?:(?:$inc)/?)""s; + + $rv->{$key} = { + 'used_by' => [], + 'file' => $dl_file, + 'type' => 'shared', + 'key' => $key + }; + } + + return $rv; +} + +sub _extract_info { + my ($fname, $inchash, $dl_shared_objects, $incarray) = @_; + + use vars qw(%inchash @dl_shared_objects @incarray); + my $fh = FileHandle->new($fname) or die "Couldn't open $fname"; + my $line = do { local $/; <$fh> }; + $fh->close; + + eval $line; + + $inchash->{$_} = $inchash{$_} for keys %inchash; + @$dl_shared_objects = @dl_shared_objects; + @$incarray = @incarray; +} + +sub _gettype { + my $name = shift; + my $dlext = quotemeta(dl_ext()); + + return 'autoload' if $name =~ /(?:\.ix|\.al|\.bs)$/i; + return 'module' if $name =~ /\.p[mh]$/i; + return 'shared' if $name =~ /\.$dlext$/i; + return 'data'; +} + +sub _merge_rv { + my ($rv_sub, $rv) = @_; + + my $key; + foreach $key (keys(%$rv_sub)) { + my %mark; + if ($rv->{$key} and _not_dup($key, $rv, $rv_sub)) { + warn "different modules for file: $key: were found" . + "(using the version) after the '=>': ". + "$rv->{$key}{file} => $rv_sub->{$key}{file}\n"; + + $rv->{$key}{used_by} = [ + grep (!$mark{$_}++, + @{ $rv->{$key}{used_by} }, + @{ $rv_sub->{$key}{used_by} }) + ]; + @{ $rv->{$key}{used_by} } = grep length, @{ $rv->{$key}{used_by} }; + $rv->{$key}{file} = $rv_sub->{$key}{file}; + } + elsif ($rv->{$key}) { + $rv->{$key}{used_by} = [ + grep (!$mark{$_}++, + @{ $rv->{$key}{used_by} }, + @{ $rv_sub->{$key}{used_by} }) + ]; + @{ $rv->{$key}{used_by} } = grep length, @{ $rv->{$key}{used_by} }; + } + else { + $rv->{$key} = { + used_by => [ @{ $rv_sub->{$key}{used_by} } ], + file => $rv_sub->{$key}{file}, + key => $rv_sub->{$key}{key}, + type => $rv_sub->{$key}{type} + }; + + @{ $rv->{$key}{used_by} } = grep length, @{ $rv->{$key}{used_by} }; + } + } +} + +sub _not_dup { + my ($key, $rv1, $rv2) = @_; + (_abs_path($rv1->{$key}{file}) ne _abs_path($rv2->{$key}{file})); +} + +sub _abs_path { + return join( + '/', + Cwd::abs_path(File::Basename::dirname($_[0])), + File::Basename::basename($_[0]), + ); +} + +##################################################### +### Actual perldeps.pl code starts here. + +# Print usage information +sub +print_usage_info($) +{ + my $code = shift || 0; + my ($leader, $underbar); + + print "\n"; + $leader = "$0 Usage Information"; + $underbar = $leader; + $underbar =~ s/./-/g; + print "$leader\n$underbar\n"; + print "\n"; + print " Syntax: $0 [ options ] [ path(s)/file(s) ]\n"; + print "\n"; + print " -h --help Show this usage information\n"; + print " -v --version Show version and copyright\n"; + print " -d --debug Turn on debugging\n"; + print " -p --provides Find things provided by path(s)/file(s)\n"; + print " -r --requires Find things required by path(s)/file(s)\n"; + #print " \n"; + print "\nNOTE: Path(s)/file(s) can also be specified on STDIN. Default is \@INC.\n\n"; + exit($code); +} + +# Locate perl modules (*.pm) in given locations. +sub +find_perl_modules(@) +{ + my @locations = @_; + my %modules; + + foreach my $loc (@locations) { + if (-f $loc) { + # It's a file. Assume it's a Perl module. + #print "Found module: $loc.\n"; + $modules{$loc} = 1; + } elsif (-d $loc) { + my @tmp; + + # Recurse the directory tree looking for all modules inside it. + &File::Find::find({ + "wanted" => sub { + if ((-s _) && (substr($File::Find::fullname, -3, 3) eq ".pm")) { + push @tmp, $File::Find::fullname; + } + }, + "follow_fast" => 1, + "no_chdir" => 1, + "untaint" => 1, + "untaint_skip" => 1, + "untaint_pattern" => qr|^([-+@\w./]+)$| + }, $loc); + + # @tmp is now a list with all non-empty *.pm files in and under $loc. + # Untaint and save in %modules hash. + foreach my $module (@tmp) { + if ($module =~ /^([-+@\w.\/]+)$/) { + $modules{$1} = 1; + #print "Found module: $1\n"; + } + } + } else { + # Something wicked this way comes. + print STDERR "$0: Error: Don't know what to do with location \"$loc\"\n"; + } + } + return keys(%modules); +} + +# Generate an RPM-style "Provides:" list for the given modules. +sub +find_provides(@) +{ + my @modules = @_; + my @prov; + + foreach my $mod (@modules) { + my (@contents, @pkgs); + my $mod_path; + local *MOD; + + $mod_path = dirname($mod); + if (!open(MOD, $mod)) { + warn "Unable to read module $mod -- $!\n"; + next; + } + @contents = <MOD>; + if (!close(MOD)) { + warn "Unable to close module $mod -- $!\n"; + } + + if (!scalar(grep { $_ eq $mod_path } @INC)) { + push @INC, $mod_path; + } + foreach my $line (grep { $_ =~ /^\s*package\s+/ } @contents) { + if ($line =~ /^\s*package\s+([^\;\s]+)\s*\;/) { + push @pkgs, $1; + } + } + + # Now we have a list of packages. Load up the modules and get their versions. + foreach my $pkg (@pkgs) { + my $ret; + local ($SIG{"__WARN__"}, $SIG{"__DIE__"}); + + # Make sure eval() can't display warnings/errors. + $SIG{"__DIE__"} = $SIG{"__WARN__"} = sub {0;}; + $ret = eval("no strict ('vars', 'subs', 'refs'); use $pkg (); return $pkg->VERSION || 0.0;"); + if ($@) { + dprint "Unable to parse version number from $pkg -- $@. Assuming 0.\n"; + $ret = 0; + } + + if (! $ret) { + $ret = 0; + } + push @prov, "perl($pkg) = $ret"; + } + } + printf("Provides: %s\n", join(", ", sort(@prov))); +} + +# Generate an RPM-style "Requires:" list for the given modules. +sub +find_requires(@) +{ + my @modules = @_; + my @reqs; + my $reqs; + + $reqs = &scan_deps("files" => \@modules, "recurse" => 0); + foreach my $key (grep { $reqs->{$_}{"type"} eq "module" } sort(keys(%{$reqs}))) { + if (substr($key, -3, 3) eq ".pm") { + $key = substr($key, 0, -3); + } + $key =~ s!/!::!g; + push @reqs, "perl($key)"; + } + printf("Requires: %s\n", join(", ", @reqs)); +} + +sub +main() +{ + my $VERSION = '1.0'; + my (@locations, @modules); + my %OPTION; + + # For taint checks + delete @ENV{("IFS", "CDPATH", "ENV", "BASH_ENV")}; + $ENV{"PATH"} = "/bin:/usr/bin:/sbin:/usr/sbin:/etc:/usr/ucb"; + foreach my $shell ("/bin/bash", "/usr/bin/ksh", "/bin/ksh", "/bin/sh", "/sbin/sh") { + if (-f $shell) { + $ENV{"SHELL"} = $shell; + last; + } + } + + $ENV{"LANG"} = "C" if (! $ENV{"LANG"}); + umask 022; + select STDERR; $| = 1; + select STDOUT; $| = 1; + + Getopt::Long::Configure("no_getopt_compat", "bundling", "no_ignore_case"); + Getopt::Long::GetOptions(\%OPTION, "debug|d!", "help|h", "version|v", "provides|p", "requires|r"); + + # Post-parse the options stuff + select STDOUT; $| = 1; + if ($OPTION{"version"}) { + # Do not edit this variable. It is updated automatically by CVS when you commit + my $rcs_info = 'CVS Revision $Revision: 1.6 $ created on $Date: 2006/04/04 20:12:03 $ by $Author: mej $ '; + + $rcs_info =~ s/\$\s*Revision: (\S+) \$/$1/; + $rcs_info =~ s/\$\s*Date: (\S+) (\S+) \$/$1 at $2/; + $rcs_info =~ s/\$\s*Author: (\S+) \$ /$1/; + print "\n"; + print "perldeps.pl $VERSION by Michael Jennings <mej\@eterm.org>\n"; + print "Copyright (c) 2005-2006, Michael Jennings\n"; + print " ($rcs_info)\n"; + print "\n"; + return 0; + } elsif ($OPTION{"help"}) { + &print_usage_info(0); # Never returns + } + + push @locations, @ARGV; + if (!scalar(@ARGV) && !(-t STDIN)) { + @locations = <STDIN>; + } + if (!scalar(@locations)) { + @locations = @INC; + } + + if (!($OPTION{"provides"} || $OPTION{"requires"})) { + &print_usage_info(-1); # Never returns + } + + # Catch bogus warning messages like "A thread exited while 2 threads were running" + $SIG{"__DIE__"} = $SIG{"__WARN__"} = sub {0;}; + + @modules = &find_perl_modules(@locations); + if ($OPTION{"provides"}) { + &find_provides(@modules); + } + if ($OPTION{"requires"}) { + &find_requires(@modules); + } + return 0; +} + +exit &main(); diff --git a/scripts/pkgconfigdeps.sh b/scripts/pkgconfigdeps.sh new file mode 100755 index 0000000..270dd74 --- /dev/null +++ b/scripts/pkgconfigdeps.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +pkgconfig=/usr/bin/pkg-config +test -x $pkgconfig || { + cat > /dev/null + exit 0 +} + +[ $# -ge 1 ] || { + cat > /dev/null + exit 0 +} + +$pkgconfig --atleast-pkgconfig-version="0.24" || { + cat > /dev/null + exit 0 +} + +case $1 in +-P|--provides) + while read filename ; do + case "${filename}" in + *.pc) + # Query the dependencies of the package. + DIR="`dirname ${filename}`" + export PKG_CONFIG_PATH="$DIR:$DIR/../../share/pkgconfig" + $pkgconfig --print-provides "$filename" 2> /dev/null | while read n r v ; do + [ -n "$n" ] || continue + # We have a dependency. Make a note that we need the pkgconfig + # tool for this package. + echo -n "pkgconfig($n) " + [ -n "$r" ] && [ -n "$v" ] && echo -n "$r" "$v" + echo + done + ;; + esac + done + ;; +-R|--requires) + while read filename ; do + case "${filename}" in + *.pc) + i="`expr $i + 1`" + [ $i -eq 1 ] && echo "$pkgconfig" + DIR="`dirname ${filename}`" + export PKG_CONFIG_PATH="$DIR:$DIR/../../share/pkgconfig" + $pkgconfig --print-requires --print-requires-private "$filename" 2> /dev/null | while read n r v ; do + [ -n "$n" ] || continue + echo -n "pkgconfig($n) " + [ -n "$r" ] && [ -n "$v" ] && echo -n "$r" "$v" + echo + done + esac + done + ;; +esac +exit 0 diff --git a/scripts/pythondeps.sh b/scripts/pythondeps.sh new file mode 100755 index 0000000..10a060a --- /dev/null +++ b/scripts/pythondeps.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +[ $# -ge 1 ] || { + cat > /dev/null + exit 0 +} + +case $1 in +-P|--provides) + shift + # Match buildroot/payload paths of the form + # /PATH/OF/BUILDROOT/usr/bin/pythonMAJOR.MINOR + # generating a line of the form + # python(abi) = MAJOR.MINOR + # (Don't match against -config tools e.g. /usr/bin/python2.6-config) + grep "/usr/bin/python.\..$" \ + | sed -e "s|.*/usr/bin/python\(.\..\)|python(abi) = \1|" + ;; +-R|--requires) + shift + # Match buildroot paths of the form + # /PATH/OF/BUILDROOT/usr/lib/pythonMAJOR.MINOR/ and + # /PATH/OF/BUILDROOT/usr/lib64/pythonMAJOR.MINOR/ + # generating (uniqely) lines of the form: + # python(abi) = MAJOR.MINOR + grep "/usr/lib[^/]*/python.\../.*" \ + | sed -e "s|.*/usr/lib[^/]*/python\(.\..\)/.*|python(abi) = \1|g" \ + | sort | uniq + ;; +esac + +exit 0 diff --git a/scripts/rpm.daily b/scripts/rpm.daily new file mode 100755 index 0000000..3a199cc --- /dev/null +++ b/scripts/rpm.daily @@ -0,0 +1,13 @@ +#!/bin/sh + +tmpfile=`/bin/mktemp /var/log/rpmpkgs.XXXXXXXXX` || exit 1 +/bin/rpm -qa --qf '%{name}-%{version}-%{release}.%{arch}.rpm\n' 2>&1 \ + | /bin/sort > "$tmpfile" + +if [ ! -s "$tmpfile" ]; then + rm -f "$tmpfile" + exit 1 +fi + +/bin/mv "$tmpfile" /var/log/rpmpkgs +/bin/chmod 0644 /var/log/rpmpkgs diff --git a/scripts/rpm.log b/scripts/rpm.log new file mode 100644 index 0000000..732c301 --- /dev/null +++ b/scripts/rpm.log @@ -0,0 +1,5 @@ +/var/log/rpmpkgs { + weekly + notifempty + missingok +} diff --git a/scripts/rpm2cpio.sh b/scripts/rpm2cpio.sh new file mode 100755 index 0000000..b03ee36 --- /dev/null +++ b/scripts/rpm2cpio.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +pkg=$1 +if [ "$pkg" = "" -o ! -e "$pkg" ]; then + echo "no package supplied" 1>&2 + exit 1 +fi + +leadsize=96 +o=`expr $leadsize + 8` +set `od -j $o -N 8 -t u1 $pkg` +il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5` +dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9` +# echo "sig il: $il dl: $dl" + +sigsize=`expr 8 + 16 \* $il + $dl` +o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8` +set `od -j $o -N 8 -t u1 $pkg` +il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5` +dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9` +# echo "hdr il: $il dl: $dl" + +hdrsize=`expr 8 + 16 \* $il + $dl` +o=`expr $o + $hdrsize` + +comp=`dd if="$pkg" ibs=$o skip=1 count=1 2>/dev/null \ + | dd bs=3 count=1 2>/dev/null` + +gz="`echo . | awk '{ printf("%c%c", 0x1f, 0x8b); }'`" +lzma="`echo . | awk '{ printf("%cLZ", 0xff); }'`" +case "$comp" in + BZh) dd if="$pkg" ibs=$o skip=1 2>/dev/null | bunzip2 ;; + "$gz"*) dd if="$pkg" ibs=$o skip=1 2>/dev/null | gunzip ;; + "$lzma"*) dd if="$pkg" ibs=$o skip=1 2>/dev/null | unlzma ;; + *) echo "Unrecognized rpm file: $pkg"; return 1 ;; +esac diff --git a/scripts/rpmdb_loadcvt b/scripts/rpmdb_loadcvt new file mode 100755 index 0000000..aa70106 --- /dev/null +++ b/scripts/rpmdb_loadcvt @@ -0,0 +1,69 @@ +#!/bin/bash + +ac=$# +cmd=`basename $0` + +rpmdb=/var/lib/rpm +dbfiles="`/bin/ls -1 $rpmdb/*`" +dbdump=/usr/lib/rpm/rpmdb_dump +dbload=/usr/bin/db_load + +set `$dbdump -V` || { + echo "The file $dbdump, usually in the rpm-devel package, is needed." + echo " Please install the rpm-devel package and retry $cmd." + exit 1 +} +dumpfmt="${5%%:}" + +set `$dbload -V` || { + echo "The file $dbload, usually in the db4-utils package, is needed." + echo " Please install the db4_utils package and retry $cmd." + exit 1 +} +loadfmt="${5%%:}" + +[ "$dumpfmt" = "$loadfmt" ] && { + echo "Both $dbdump and $dbload use db-$loadfmt format." + echo "No conversion is possible." + exit 0 +} + +[ "$ac" != "0" -o "`/usr/bin/id -u`" != "0" ] && { + echo "$cmd: Convert $rpmdb files to db-$loadfmt format." + echo "$cmd: Must be run as root, takes no arguments." + exit 1 +} + +echo "Converting to db-$loadfmt compatible format (1-10 minutes per file) ..." + +dbfile= +trap " + [ -n "$dbfile" ] && { + [ -f $dbfile-O ] && /bin/mv $dbfile-O $dbfile + /bin/rm -f $dbfile-N + } + exit 1 +" 1 2 3 15 + +rm -f $rpmdb/__db* + +for dbfile in $dbfiles +do + echo " `/usr/bin/file $dbfile`" + + $dbdump $dbfile | $dbload $dbfile-N || { + echo "Failed conversion:" + echo " $dbdump $dbfile | $dbload $dbfile-N" + echo "Cleaning up and exiting ..." + /bin/rm -f $dbfile-N + exit 1 + } + + /bin/mv $dbfile $dbfile-O + /bin/mv $dbfile-N $dbfile + /bin/rm -f $dbfile-O +done + +echo "Done!" + +exit 0 diff --git a/scripts/script.req b/scripts/script.req new file mode 100755 index 0000000..950dc4a --- /dev/null +++ b/scripts/script.req @@ -0,0 +1,9 @@ +#!/bin/sh + +# TODO: handle "#!/usr/bin/env foo" somehow +while read filename; do + # common cases + sed -n -e '1s:^#![[:space:]]*\(/[^[:space:]]\{1,\}\).*:\1:p' "$filename" + #!/usr/bin/env /foo/bar + sed -n -e '1s:^#![[:space:]]*[^[:space:]]*/bin/env[[:space:]]\{1,\}\(/[^[:space:]]\{1,\}\):\1:p' "$filename" +done diff --git a/scripts/tcl.req b/scripts/tcl.req new file mode 100644 index 0000000..43c5920 --- /dev/null +++ b/scripts/tcl.req @@ -0,0 +1,101 @@ +#!/usr/bin/perl + +# tcl.req - a simple makedepends like script for tcl. + +# I plan to rewrite this in C so that perl is not required by RPM at +# build time. + +# by Ken Estes Mail.com kestes@staff.mail.com + +use File::Basename; + +if ("@ARGV") { + foreach (@ARGV) { + process_file($_); + } +} else { + + # notice we are passed a list of filenames NOT as common in unix the + # contents of the file. + + foreach (<>) { + process_file($_); + } +} + + +foreach $module (sort keys %require) { + print "tcl($module)\n"; +} + +exit 0; + + + +sub process_file { + + my ($file) = @_; + chomp $file; + + open(FILE, "<$file")|| + die("$0: Could not open file: '$file' : $!\n"); + + while (<FILE>) { + + # Each keyword can appear multiple times. Don't + # bother with datastructures to store these strings, + # if we need to print it print it now. + + if ( m/^\s*\$RPM_Requires\s*=\s*["'](.*)['"]/i) { + foreach $_ (spit(/\s+/, $1)) { + print "$_\n"; + } + } + + s/\#.*//; + + # Each keyword can appear multiple times. Don't + # bother with datastructures to store these strings, + # if we need to print it print it now. + + if ( m/^\s*\$RPM_Requires\s*=\s*["'](.*)['"]/i) { + foreach $_ (spit(/\s+/, $1)) + print "$_\n"; + } + + +# we wish to capture these source statements: + +# source "$PATH/lib/util.tcl" +# source "comconf.tcl" +# if {[catch {source $env(CONTROL_PANEL_LIB_DIR)/bindings.tcl}] != 0} { + + # quick check to see if the complex regexps could possibly match. + # This should speed things up. + + (m/source/) || next; + + # note we include parethesis and '$' and '\' in the pattern + + if ( + (m!source\s+([\'\"])?([0-9A-Za-z/._\-\\\(\)\$]+)!) + ) { + + my ($module) = $2; + + # If there is some interpolation of variables, + # see if taking the basename will give us the filename. + + ($module =~ m/\$/) && + ($module = basename($module)); + + ($module =~ m/\$/) || + ($require{$module}=1); + } + } + + close(FILE)|| + die("$0: Could not close file: '$file' : $!\n"); + + return ; +} diff --git a/scripts/tgpg b/scripts/tgpg new file mode 100755 index 0000000..238cffb --- /dev/null +++ b/scripts/tgpg @@ -0,0 +1,36 @@ +#!/bin/sh + + +for pkg in $* +do + if [ "$pkg" = "" -o ! -e "$pkg" ]; then + echo "no package supplied" 1>&2 + exit 1 + fi + + plaintext=`mktemp ${TMPDIR:-/tmp}/tgpg-$$.XXXXXX` + detached=`mktemp ${TMPDIR:-/tmp}/tgpg-$$.XXXXXX` + +# --- Extract detached signature + rpm -qp -vv --qf '%{siggpg:armor}' $pkg > $detached + +# --- Figger the offset of header+payload in the package + leadsize=96 + o=`expr $leadsize + 8` + + set `od -j $o -N 8 -t u1 $pkg` + il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5` + dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9` + + sigsize=`expr 8 + 16 \* $il + $dl` + o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8` + +# --- Extract header+payload + dd if=$pkg ibs=$o skip=1 2>/dev/null > $plaintext + +# --- Verify DSA signature using gpg + gpg --batch -vv --debug 0xfc02 --verify $detached $plaintext + +# --- Clean up + rm -f $detached $plaintext +done diff --git a/scripts/vpkg-provides.sh b/scripts/vpkg-provides.sh new file mode 100755 index 0000000..c15f080 --- /dev/null +++ b/scripts/vpkg-provides.sh @@ -0,0 +1,398 @@ +#!/bin/sh + +# +# Original Author: Tim Mooney (mooney@plains.NoDak.edu) +# Improvements by: Ken Estes <kestes@staff.mail.com> +# +# This file is distributed under the terms of the GNU General Public License +# + +# vpkg-provides.sh is part of RPM, the Red Hat Package Manager. + +# vpkg-provides.sh searches a list of directories (based on what OS +# it's being executed on) for shared libraries and interpreter files +# that have been installed by some packaging system other than RPM. +# It then generates a spec file that can be used to build a "virtual +# package" that provides all of these things without actually +# installing any files. The spec file in effect tells rpm what it +# needs to know about operating system files which are not under rpm +# control. This makes it much easier to use RPM on non-Linux systems. + +# By default the script also generates a %verifyscript (with hard +# coded $shlib_dirs, $ignore_dirs values) which will check that the +# checksum of each file in the directories searched has not changed +# since the package was built. + +# Comments: This script is a quick hack. A better solution is to use the +# vendor's package management commands to actually query what's installed, and +# build one or more spec files based on that. This is something +# I intend to write, probably in perl, but the need for something like this +# first effort was great, so I didn't want to wait until the better solution +# was done. + +# The complete specfile will be sent to stdout. + +# you will need to create a spec_header for the virtual package. This +# header will provide such specfile information as: +# +# Summary: +# Name: +# Version: +# Release: +# Copyright: +# Group: +# Source: + + +# most of the command line arguments have defaults + +usage="usage: $0 --spec_header '/path/to/os-base-header.spec' \n" +usage="$usage\t[--find_provides '/path/to/find-provides']\n" +usage="$usage\t[--shlib_dirs 'dirs:which:contain:shared:libs']\n" +usage="$usage\t[--ignore_dirs 'grep-E|pattern|of|paths|to|ignore']\n" + +# these two should be unnessary as the regular dependency analysis +# should take care of interpreters as well as shared libraries. + +usage="$usage\t[--interp_dirs 'dirs:which:contain:interpreters']\n" +usage="$usage\t[--interps 'files:to:assume:are:installed']\n" +usage="$usage\t[--no_verify]\n" + + +# this command may not be portable to all OS's, does something else +# work? can this be set in the case $osname statement? + +sum_cmd="xargs cksum" + +date=`date` +hostname=`uname -n` + +# if some subdirectories of the system directories needs to be ignored +# (eg /usr/local is a subdirectory of /usr but should not be part of +# the virtual package) then call this script with ignore_dirs set to a +# valid grep -E pattern which discribes the directories to ignored. + +PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb:/usr/bsd +export PATH + + +# +# The (OS independent) default values. +# +spec_header='/usr/lib/rpm/os-base-header.spec'; +interps="sh:csh:ksh:dtksh:wish:tclsh:perl:awk:gawk:nawk:oawk" +find_provides='/usr/lib/rpm/find-provides'; + + # no file names begin with this character so it is a good default + # for dirs to ignore. + +ignore_dirs="@" + + +osname=`uname -s` +if test $? -ne 0 || test X$osname = X ; then + echo "I can't determine what platform this is. Exiting" + exit 1 +fi + + +# +# Set OS dependent defaults +# +case $osname in + OSF1) + shlib_dirs='/shlib:/usr/shlib:/usr/dt/lib:/usr/opt' + interp_dirs='/bin:/usr/bin:/sbin:/usr/dt/bin:/usr/bin/posix' + ;; + HP-UX) + shlib_dirs='/usr/shlib:/usr/dt/lib:/opt' + shlib_dirs="$shlib_dirs:/usr/bms:/usr/obam:/usr/sam" + interp_dirs='/bin:/usr/bin:/sbin:/usr/dt/bin:/usr/bin/posix' + ;; + AIX) + shlib_dirs='/usr/lib:/usr/ccs/lib:/usr/dt/lib:/usr/lpp:/usr/opt' + interp_dirs='/bin:/usr/bin:/sbin:/usr/dt/bin' + ;; + SunOS) + shlib_dirs='/etc/lib:/etc/vx:/opt:/usr/lib:/usr/ccs/lib:/usr/dt/lib' + shlib_dirs="$shlib_dirs:/usr/4lib:/usr/openwin/lib:/usr/snadm/lib" + shlib_dirs="$shlib_dirs:/usr/ucblib:/usr/xpg4/lib" + interp_dirs='/bin:/usr/bin:/sbin:/usr/dt/bin:/usr/xpg4/bin' + ;; + IRIX|IRIX64) + shlib_dirs='/lib:/usr/lib:/usr/lib32:/usr/lib64' + # Irix always makes me laugh... + shlib_dirs="$shlib_dirs:/usr/ToolTalk:/usr/xfsm:/usr/SpeedShop" + shlib_dirs="$shlib_dirs:/usr/sgitcl:/usr/SGImeeting:/usr/pcp/lib" + shlib_dirs="$shlib_dirs:/usr/Motif-2.1" + interp_dirs='/bin:/usr/bin:/sbin:/usr/sbin:/usr/dt/bin' + ;; + *) + echo "I'm sorry. I haven't been configured yet to work on $osname." + echo "Please poke around your system and try figure out what directories" + echo "I should be searching for shared libraries. Once you have this" + echo "information, email it to rpm-list@redhat.com, so that your OS" + echo "will be supported by some future version of this script." + echo "" + echo "Thanks!" + echo + exit 2 + ;; +esac + + +# allow the user to change defaults with the command line arguments. + +# Loop over all args + +while : +do + +# Break out if there are no more args + case $# in + 0) + break + ;; + esac + +# Get the first arg, and shuffle + option=$1 + shift + +# Make all options have two hyphens + orig_option=$option # Save original for error messages + case $option in + --*) ;; + -*) option=-$option ;; + esac + + + case $option in + --spec_header) + spec_header=$1 + shift + ;; + --ignore_dirs) + ignore_dirs=$1 + shift + ;; + --find_provides) + find_provides=$1 + shift + ;; + --shlib_dirs) + shlib_dirs=$1 + shift + ;; + --interp_dirs) + interp_dirs=$1 + shift + ;; + --interps) + interps=$1 + shift + ;; + --no_verify) + no_verify=1 + ;; + --help) + echo $usage + exit 0 + ;; + *) + echo "$0: Unrecognized option: \"$orig_option\"; use --help for usage." >&2 + exit 1 + ;; + esac +done + + +# consistancy checks on the arguments + +if [ ! -f $spec_header ]; then + echo "You must pass me the full path to the partial spec file" + echo "as my first argument, since this file does not appear in the" + echo "default location of $default_spec_header" + echo + echo $usage + echo + exit 9 +fi + + +if [ ! -f $find_provides ]; then + echo "You must pass me the full path to the find-provides script as my" + echo "second argument, since find-provides does not appear in the" + echo "default location of $default_find_provides" + echo + echo $usage + echo + exit 9 +fi + + + +provides_tmp=${TMPDIR:-/tmp}/provides.$$ +if test -f $provides_tmp ; then + echo "$provides_tmp already exists. Exiting." + exit 11 +fi + +# +# iterate through all the directories in shlib_dirs, looking for shared +# libraries +# +for d in `echo $shlib_dirs | sed -e 's/:/ /g'` +do + find $d -type f -print 2>/dev/null | grep -E -v \'$ignore_dirs\' | $find_provides >> $provides_tmp +done + +sum_tmp=${TMPDIR:-/tmp}/sum.$$ +if test -f $sum_tmp ; then + echo "$sum_tmp already exists. Exiting." + exit 11 +fi + +# +# iterate through all the directories in shlib_dirs, record the sum +# +for d in `echo $shlib_dirs | sed -e 's/:/ /g'` +do + find $d -type f -print 2>/dev/null | grep -E -v \'$ignore_dirs\' | $sum_cmd >> $sum_tmp +done + + +# +# output the initial part of the spec file +# +cat $spec_header + +# +# output the 'Provides: ' part of the spec file +# +{ + # + # Output the shared libraries + # + for f in `cat $provides_tmp | sort -u` + do + echo "Provides: $f" + done + + # + # Output the available shell interpreters + # + for d in `echo $interp_dirs | sed -e 's/:/ /g'` + do + for f in `echo $interps | sed -e 's/:/ /g'` + do + if test -f $d/$f ; then + echo "Provides: $d/$f" + fi + done + done +} | sed -e 's/%/%%/g' + +# +# Output the discription of the spec file +# + +cat <<_EIEIO_ + + +%description +This is a virtual RPM package. It contains no actual files. It uses the +\`Provides' token from RPM 3.x and later to list many of the shared libraries +and interpreters that are part of the base operating system and associated +OS packages for $osname. + +This virtual package was constructed based on the vendor/system software +installed on the '$osname' machine named '$hostname', as of the date +'$date'. + +Input to the script: + + spec_header=$spec_header + ignore_dirs=$ignore_dirs + find_provides=$find_provides + shlib_dirs=$shlib_dirs + interp_dirs=$interp_dirs + interps=$interps + +_EIEIO_ + +# +# Output the build sections of the spec file +# + +echo '%prep' +echo '# nothing to do' +echo '%build' +echo '# nothing to do' +echo '%install' +echo '# nothing to do' +echo '%clean' +echo '# nothing to do' + +if [ -z "${no_verify}" ]; then + +# +# Output the optional verify section of the spec file +# + +cat <<_EIEIO_ + +%verifyscript + +PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb:/usr/bsd +export PATH + +sum_current_tmp=\${TMPDIR:-/tmp}/rpm.sum.current.\$\$ +if test -f \$sum_current_tmp ; then + echo "\$sum_current_tmp already exists. Exiting." + exit 11 +fi + +sum_package_tmp=\${TMPDIR:-/tmp}/rpm.sum.package.\$\$ +if test -f \$sum_package_tmp ; then + echo "\$sum_package_tmp already exists. Exiting." + exit 11 +fi + +for d in `echo $shlib_dirs | sed -e 's/:/ /g'` +do + find \$d -type f -print 2>/dev/null | grep -E -v \'$ignore_dirs\' | $sum_cmd >> \$sum_current_tmp +done + +cat >\$sum_package_tmp <<_EOF_ +_EIEIO_ + +# the contents of the temporary file are hardcoded into the verify +# script so that the file can be reproduced at verification time. + +cat $sum_tmp | sed -e 's/%/%%/g' + +cat <<_EIEIO_ +_EOF_ + + +cmp \$sum_package_tmp \$sum_current_tmp + +if [ \$? -ne 0 ]; then + echo"Differences found by: cmp \$sum_package_tmp \$sum_current_tmp" + exit \$? +fi + +_EIEIO_ + +# end optional verify section +fi + +# +# Output the files section of the spec file +# + +echo '%files' +echo '# no files in a virtual package' + +exit 0 |