From 82b3f66f50f608723a2d388bf933ec08a0fefda4 Mon Sep 17 00:00:00 2001 From: Thorsten Glaser Date: Sun, 20 Dec 2009 14:40:27 +0059 Subject: =?UTF-8?q?Use=20the=20optimisation=20of=20the=20=E2=80=9Cdump?= =?UTF-8?q?=E2=80=9D=20option=20to=20speed=20up=2010x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Thorsten Glaser --- package/pkgmaker | 172 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 113 insertions(+), 59 deletions(-) (limited to 'package/pkgmaker') diff --git a/package/pkgmaker b/package/pkgmaker index 28167a0a4..a8a54c631 100644 --- a/package/pkgmaker +++ b/package/pkgmaker @@ -6,112 +6,166 @@ else export GMAKE=make fi -rm -rf pkglist.d pkgopts.d -mkdir pkglist.d pkgopts.d -for sd in */Makefile; do - sd=${sd%/*} - cd $sd - pa=$($GMAKE show=ALL_PKGOPTS) # pa: all subpackage options - print -r -- $pa >../pkgopts.d/pa-"$sd" - xa= - for xu in $pa; do # xu: package option uppercase - x=$($GMAKE show=PKGNAME_$xu) # x: subpackage name - print -r -- "$xu" >../pkglist.d/"$x" - xa="$xa $x" - done - print -r -- $xa >../pkgopts.d/xa-"$sd" +# build a cache of “ipkg package name” → “package conf option” for +# use with dependency resolution +rm -rf pkglist.d +mkdir pkglist.d +for dn in */Makefile; do + dn=${dn%/*} + cd $dn + + # ALL_PKGOPTS: all subpackage conf options + # PKGNAME_*: subpackage (ipkg) package name, by subpackage option + eval $($GMAKE dump="ALL_PKGOPTS \ + \$(foreach x,\${ALL_PKGOPTS},PKGNAME_\${x})") cd .. + + if [[ -z $ALL_PKGOPTS ]]; then + print -u2 "Warning: $dn/Makefile contains no packages, skipped" + continue + fi + + for spcu in $ALL_PKGOPTS; do # spcu: package option, ucase + eval sppn=\$PKGNAME_$spcu # sppn: subpackage (ipkg) name + # once mksh R40 is out, use its new associative arrays here! + print -r -- "$spcu" >pkglist.d/"$sppn" + done done -for sd in */Makefile; do - sd=${sd%/*} - cd $sd - pn=$($GMAKE show=PKG_NAME) # pn: package name - pfl=$($GMAKE show=PKG_FLAVOURS) # pfl: all package flavours - typeset -u dnu=${sd//-/_} # dnu: subdir name uppercase +# build Config.in files and resolve dependencies +for dn in */Makefile; do + dn=${dn%/*} + cd $dn + + # PKG_NAME: package name (directory, free-format) + # PKG_FLAVOURS: all package flavours (boolean options), uppercase + # PKG_DESCR: package description (directory) + # PKG_URL: package homepage + # PKG_CXX: uppercase varname part to use for CFrustFrust checks + # ALL_PKGOPTS: all subpackage conf options + # PKGNAME_*: subpackage (ipkg) package name, by subpackage option + # PKGDESC_*: subpackage description, by subpackage option + # PKGDEPS_*: subpackage depends on ipkg packages, by subpkg option + # CFLINE_*: one free-format Config.in line per subpackage option + # PKGFD_*: flavour description, per package flavour option + eval $($GMAKE dump="PKG_NAME PKG_FLAVOURS PKG_DESCR PKG_URL PKG_CXX \ + ALL_PKGOPTS \$(foreach x,\${ALL_PKGOPTS},PKGNAME_\${x} \ + PKGDESC_\${x} PKGDEPS_\${x} CFLINE_\${x}) \ + \$(foreach x,\${PKG_FLAVOURS},PKGFD_\${x})") + + # dnu: directory name, uppercase, y/-+/_X/ + typeset -u dnu=${dn//-/_} dnu=${dnu//+/X} - pd=$($GMAKE show=PKG_DESCR) # pd: package description - ph=$($GMAKE show=PKG_URL) # ph: package homepage - usecxx=$($GMAKE show=PKG_CXX) ( + + # Handle master package (directory) print "config ADK_COMPILE_$dnu" + if [[ -z $ALL_PKGOPTS ]]; then + # pseudo package, does not produce an ipkg package + ppnf=$PKG_NAME # ppnf: pseudopkg name, filled + if [[ -n $PKG_DESCR ]]; then + while (( ${#ppnf} < 34 )); do + ppnf=$ppnf. + done + ppnf="$ppnf $PKG_DESCR" + fi + print "\tprompt \"$ppnf\"" + fi print \\ttristate - print -n \\tdepends on - sp=' ' # local sp: space (or ' || ') - for xu in $(<../pkgopts.d/pa-"$sd"); do # xu: package option uppercase - print -n "${sp}ADK_PACKAGE_$xu" - sp=' || ' - done - print + if [[ -n $ALL_PKGOPTS ]]; then + # real (master) package, contains 1+ ipkg (sub)packages + print -n \\tdepends on + sp=' ' # local sp: space (or ' || ') + for spcu in $ALL_PKGOPTS; do # spcu: package option, ucase + print -n "${sp}ADK_PACKAGE_$spcu" + sp=' || ' + done + print + fi print \\tdefault n - for x in $(<../pkgopts.d/xa-"$sd"); do # x: subpackage name - xu=$(<../pkglist.d/"$x") # xu: package option uppercase - print \\nconfig ADK_PACKAGE_$xu - xf=$x # xf: subpackage name ........ - while (( ${#xf} < 34 )); do - xf=$xf. - done - desc=$($GMAKE show=PKGDESC_$xu) - print "\tprompt \"$xf ${desc:-${pd:-$pn}}\"" + # Handle subpackages / multipackages + for spcu in $ALL_PKGOPTS; do # spcu: package option, ucase + eval sppn=\$PKGNAME_$spcu # sppn: subpackage (ipkg) name + eval desc=\$PKGDESC_$spcu # desc: subpackage description + : ${desc:=$PKG_DESCR} # take from main pkg if empty + eval deps=\$PKGDEPS_$spcu # deps: subpackage dependencies + eval xline=\$PKGDESC_$spcu # xline: one free-format line + print \\nconfig ADK_PACKAGE_$spcu + spnf=$sppn # spnf: subpackage name, filled + if [[ -n ${desc:-$PKG_NAME} ]]; then + while (( ${#spnf} < 34 )); do + spnf=$spnf. + done + spnf="$spnf ${desc:-$PKG_NAME}" + fi + print "\tprompt \"$spnf\"" print \\ttristate print \\tdefault n - deps=$($GMAKE show=PKGDEPS_$xu) - for dep in $deps; do - [[ -n $usecxx && $dep = @(uclibc++|libstdcxx) ]] && \ + for dep in $deps; do # dep: ipkg name of one rundep. + # skip dependencies on uclibc++ and libstdcxx iff + # we produce these automatically + [[ -n $PKG_CXX && $dep = @(uclibc++|libstdcxx) ]] && \ continue case $dep { (kmod-*) + # produce dependency on kernel package + # which have special name→sym mangling typeset -u udep=${dep//-/_} print "\tselect ADK_KPACKAGE_$udep" ;; (*) + # produce dependency on regular package + # where the symbol is cached (see above) print '\tselect' \ ADK_PACKAGE_$(<../pkglist.d/"$dep") ;; } done print \\tselect ADK_COMPILE_$dnu - dep=$($GMAKE show=CFLINE_$xu) # one free-format line - [[ -n $dep ]] && print "\t$dep" - if [[ -n $pd$ph ]]; then + [[ -n $xline ]] && print "\t$xline" + if [[ -n $desc$PKG_URL ]]; then + # produce (optional) help text print \\thelp - [[ -n $pd ]] && print "\t $pd" - [[ -n $pd && -n $ph ]] && print '\t ' - [[ -n $ph ]] && print "\t $ph" + [[ -n $desc ]] && print "\t $desc" + [[ -n $desc && -n $PKG_URL ]] && print '\t ' + [[ -n $PKG_URL ]] && print "\t WWW: $PKG_URL" fi done - [[ -n $usecxx ]] && cat < flavour $pfcu}\"" print \\tdefault n print \\tdepends on ADK_COMPILE_$dnu print \\thelp - print "\t flavour ADK_PACKAGE_${dnu}_$pf" + print "\t flavour ADK_PACKAGE_${dnu}_$pfcu for $PKG_NAME" done - ) >Config.new + + ) >Config.in cd .. done -- cgit v1.2.3