pkgmaker 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. cd "$(dirname "$0")"
  2. export TOPDIR=$(realpath ..)
  3. if gmake --help >/dev/null 2>&1; then
  4. export GMAKE=gmake
  5. else
  6. export GMAKE=make
  7. fi
  8. # build a cache of “ipkg package name” → “package conf option” for
  9. # use with dependency resolution
  10. rm -rf pkglist.d
  11. mkdir pkglist.d
  12. for dn in */Makefile; do
  13. dn=${dn%/*}
  14. cd $dn
  15. # ALL_PKGOPTS: all subpackage conf options
  16. # PKGNAME_*: subpackage (ipkg) package name, by subpackage option
  17. eval $($GMAKE dump="ALL_PKGOPTS \
  18. \$(foreach x,\${ALL_PKGOPTS},PKGNAME_\${x})")
  19. cd ..
  20. if [[ -z $ALL_PKGOPTS ]]; then
  21. print -u2 "Warning: $dn/Makefile contains no packages, skipped"
  22. continue
  23. fi
  24. for spcu in $ALL_PKGOPTS; do # spcu: package option, ucase
  25. eval sppn=\$PKGNAME_$spcu # sppn: subpackage (ipkg) name
  26. # once mksh R40 is out, use its new associative arrays here!
  27. print -r -- "$spcu" >pkglist.d/"$sppn"
  28. done
  29. done
  30. # build Config.in files and resolve dependencies
  31. for dn in */Makefile; do
  32. dn=${dn%/*}
  33. cd $dn
  34. # PKG_NAME: package name (directory, free-format)
  35. # PKG_FLAVOURS: all package flavours (boolean options), uppercase
  36. # PKG_DESCR: package description (directory)
  37. # PKG_URL: package homepage
  38. # PKG_CXX: uppercase varname part to use for CFrustFrust checks
  39. # ALL_PKGOPTS: all subpackage conf options
  40. # PKGNAME_*: subpackage (ipkg) package name, by subpackage option
  41. # PKGDESC_*: subpackage description, by subpackage option
  42. # PKGDEPS_*: subpackage depends on ipkg packages, by subpkg option
  43. # CFLINE_*: one free-format Config.in line per subpackage option
  44. # PKGFD_*: flavour description, per package flavour option
  45. eval $($GMAKE dump="PKG_NAME PKG_FLAVOURS PKG_DESCR PKG_URL PKG_CXX \
  46. ALL_PKGOPTS \$(foreach x,\${ALL_PKGOPTS},PKGNAME_\${x} \
  47. PKGDESC_\${x} PKGDEPS_\${x} CFLINE_\${x}) \
  48. \$(foreach x,\${PKG_FLAVOURS},PKGFD_\${x})")
  49. # dnu: directory name, uppercase, y/-+/_X/
  50. typeset -u dnu=${dn//-/_}
  51. dnu=${dnu//+/X}
  52. (
  53. # Handle master package (directory)
  54. print "config ADK_COMPILE_$dnu"
  55. if [[ -z $ALL_PKGOPTS ]]; then
  56. # pseudo package, does not produce an ipkg package
  57. ppnf=$PKG_NAME # ppnf: pseudopkg name, filled
  58. if [[ -n $PKG_DESCR ]]; then
  59. while (( ${#ppnf} < 34 )); do
  60. ppnf=$ppnf.
  61. done
  62. ppnf="$ppnf $PKG_DESCR"
  63. fi
  64. print "\tprompt \"$ppnf\""
  65. fi
  66. print \\ttristate
  67. if [[ -n $ALL_PKGOPTS ]]; then
  68. # real (master) package, contains 1+ ipkg (sub)packages
  69. print -n \\tdepends on
  70. sp=' ' # local sp: space (or ' || ')
  71. for spcu in $ALL_PKGOPTS; do # spcu: package option, ucase
  72. print -n "${sp}ADK_PACKAGE_$spcu"
  73. sp=' || '
  74. done
  75. print
  76. fi
  77. print \\tdefault n
  78. # Handle subpackages / multipackages
  79. for spcu in $ALL_PKGOPTS; do # spcu: package option, ucase
  80. eval sppn=\$PKGNAME_$spcu # sppn: subpackage (ipkg) name
  81. eval desc=\$PKGDESC_$spcu # desc: subpackage description
  82. : ${desc:=$PKG_DESCR} # take from main pkg if empty
  83. eval deps=\$PKGDEPS_$spcu # deps: subpackage dependencies
  84. eval xline=\$PKGDESC_$spcu # xline: one free-format line
  85. print \\nconfig ADK_PACKAGE_$spcu
  86. spnf=$sppn # spnf: subpackage name, filled
  87. if [[ -n ${desc:-$PKG_NAME} ]]; then
  88. while (( ${#spnf} < 34 )); do
  89. spnf=$spnf.
  90. done
  91. spnf="$spnf ${desc:-$PKG_NAME}"
  92. fi
  93. print "\tprompt \"$spnf\""
  94. print \\ttristate
  95. print \\tdefault n
  96. for dep in $deps; do # dep: ipkg name of one rundep.
  97. # skip dependencies on uclibc++ and libstdcxx iff
  98. # we produce these automatically
  99. [[ -n $PKG_CXX && $dep = @(uclibc++|libstdcxx) ]] && \
  100. continue
  101. case $dep {
  102. (kmod-*)
  103. # produce dependency on kernel package
  104. # which have special name→sym mangling
  105. typeset -u udep=${dep//-/_}
  106. print "\tselect ADK_KPACKAGE_$udep"
  107. ;;
  108. (*)
  109. # produce dependency on regular package
  110. # where the symbol is cached (see above)
  111. print '\tselect' \
  112. ADK_PACKAGE_$(<../pkglist.d/"$dep")
  113. ;;
  114. }
  115. done
  116. print \\tselect ADK_COMPILE_$dnu
  117. [[ -n $xline ]] && print "\t$xline"
  118. if [[ -n $desc$PKG_URL ]]; then
  119. # produce (optional) help text
  120. print \\thelp
  121. [[ -n $desc ]] && print "\t $desc"
  122. [[ -n $desc && -n $PKG_URL ]] && print '\t '
  123. [[ -n $PKG_URL ]] && print "\t WWW: $PKG_URL"
  124. fi
  125. done
  126. # Handle CFrustFrust library selection, if necessary
  127. [[ -n $PKG_CXX ]] && cat <<EOF
  128. choice
  129. prompt "C++ library to use"
  130. depends on ADK_COMPILE_$dnu
  131. default ADK_COMPILE_${PKG_CXX}_WITH_STDCXX if ADK_TARGET_LIB_GLIBC || ADK_TARGET_LIB_EGLIBC
  132. default ADK_COMPILE_${PKG_CXX}_WITH_UCLIBCXX if ADK_TARGET_LIB_UCLIBC
  133. config ADK_COMPILE_${PKG_CXX}_WITH_STDCXX
  134. bool "GNU C++ library"
  135. select ADK_PACKAGE_LIBSTDCXX
  136. config ADK_COMPILE_${PKG_CXX}_WITH_UCLIBCXX
  137. bool "uClibc++ library"
  138. select ADK_PACKAGE_UCLIBCXX
  139. endchoice
  140. EOF
  141. # Handle flavours (per directory)
  142. for pfcu in $PKG_FLAVOURS; do # pfcu: pkg flavour conf opt.
  143. eval pfd=\$PKGFD_$pfcu # pfd: pkg flavour description
  144. print
  145. print config ADK_PACKAGE_${dnu}_$pfcu
  146. print "\tbool \"${pfd:-$PKG_NAME -> flavour $pfcu}\""
  147. print \\tdefault n
  148. print \\tdepends on ADK_COMPILE_$dnu
  149. print \\thelp
  150. print "\t flavour ADK_PACKAGE_${dnu}_$pfcu for $PKG_NAME"
  151. done
  152. ) >Config.in
  153. cd ..
  154. done