Browse Source

massive rewrite of the pkgmaker logic

When adjusting for auto-generated package/Config.in, I found out that
the splitting into Config.in{,.lib,.kmod} done by pkgmaker was rather
subversive to my approach. Categorisation of packages and subpackages
should be done via package section, which is enabled by this patch for
subpackages, too.

Instead of filling up the package subdirectories, use a common directory
package/pkgconfigs.d/ to contain all auto-generated Config.in files. In
order to allow simple assumption from config symbol to actual package
from within menuconfig (the path to the Config.in file containing the
current config symbol is printed as part of the help text), put all
generated Config.in files for a certain package into a common
subdirectory.

pkgmaker now saves each generated config symbol (excluding the flavours)
into it's own file, therefore allowing to sort subpackages of a package
into a different section.
Phil Sutter 14 years ago
parent
commit
2c5f2d9b3b
3 changed files with 29 additions and 54 deletions
  1. 1 0
      .gitignore
  2. 1 0
      mk/package.mk
  3. 27 54
      package/pkgmaker

+ 1 - 0
.gitignore

@@ -29,6 +29,7 @@ config/lxdialog/*.o
 make.log
 dl/
 package/Config.in.auto
+package/pkgconfigs.d/
 package/*/info.mk
 package/*/Config.in
 package/*/Config.in.lib

+ 1 - 0
mk/package.mk

@@ -143,6 +143,7 @@ ALL_PKGOPTS+=	$(1)
 PKGNAME_$(1)=	$(2)
 PKGDEPS_$(1)=	$(4)
 PKGDESC_$(1)=	$(5)
+PKGSECT_$(1)=	$(6)
 IPKG_$(1)=	$(PACKAGE_DIR)/$(2)_$(3)_${CPU_ARCH}.${PKG_SUFFIX}
 IDIR_$(1)=	$(WRKDIR)/fake-${CPU_ARCH}/pkg-$(2)
 ifneq (${ADK_PACKAGE_$(1)}${DEVELOPER},)

+ 27 - 54
package/pkgmaker

@@ -40,12 +40,14 @@ for dn in */Makefile; do
 done
 
 # build Config.in files and resolve dependencies
+rm -f package_sections
+rm -rf pkgconfigs.d
+mkdir pkgconfigs.d
 for dn in */Makefile; do
 	dn=${dn%/*}
-	# skip if we take care of this one manually
-	[[ $dn != "base-files" ]] && [[ -s $dn/Config.in.manual ]] && continue
 	pbar="Pass 2: $dn ..."
 	print -nu2 "$pbar\r"
+	mkdir pkgconfigs.d/$dn
 	cd $dn
 
 	# PKG_NAME: package name (directory, free-format)
@@ -61,9 +63,9 @@ for dn in */Makefile; do
 	# CFLINE_*: one free-format Config.in line per subpackage option
 	# PKGFD_*: flavour description, per package flavour option
 	# PKG_{HOST,TARGET}_DEPENDS: add host or target dependencies
-	eval $($GMAKE dump="PKG_NAME PKG_FLAVOURS PKG_DESCR PKG_URL PKG_MULTI PKG_CXX \
+	eval $($GMAKE dump="PKG_NAME PKG_FLAVOURS PKG_DESCR PKG_SECTION PKG_URL PKG_MULTI PKG_CXX \
 	    ALL_PKGOPTS \$(foreach x,\${ALL_PKGOPTS},PKGNAME_\${x} \
-	    PKGDESC_\${x} PKGDEPS_\${x} PKGDFLT_\${x} CFLINE_\${x}) \
+	    PKGDESC_\${x} PKGDEPS_\${x} PKGDFLT_\${x} PKGSECT_\${x} CFLINE_\${x}) \
 	    \$(foreach x,\${PKG_FLAVOURS},PKGFD_\${x}) \
 	    PKG_HOST_DEPENDS PKG_TARGET_DEPENDS")
 
@@ -71,8 +73,13 @@ for dn in */Makefile; do
 	typeset -u dnu=${dn//-/_}
 	dnu=${dnu//+/X}
 
-	(	# fd 4 = Config.in; fd 5 = Config.in.lib; fd 6 = Config.in.kmod
-	g5=0
+	echo "pkgconfigs.d/$dn/Config.in ${PKG_SECTION:=none}" >>../package_sections
+	echo "$dn/Config.in.manual ${PKG_SECTION:=none}" >>../package_sections
+
+	# skip if we take care of this one manually
+	[[ $dn != "base-files" ]] && [[ -s Config.in.manual ]] && { cd ..; continue; }
+
+	exec 4>../pkgconfigs.d/$dn/Config.in
 
 	# Handle master package (directory)
 	print -u4 "config ADK_COMPILE_$dnu"
@@ -165,20 +172,15 @@ for dn in */Makefile; do
 		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 sect=\$PKGSECT_$spcu	# sect: subpackage section
+		: ${sect:=$PKG_SECTION}		# take from main pkg if empty
 		eval deps=\$PKGDEPS_$spcu	# deps: subpackage dependencies
 		eval dflt=\$PKGDFLT_$spcu	# dflt: config 'default' opt.
 		eval xline=\$CFLINE_$spcu	# xline: one free-format line
 
-		if [[ $spcu = LIB* ]]; then
-			h=5			# divert to Config.in.lib
-			(( g5++ )) && print -u5	# been here before
-		elif [[ $spcu = KMOD* ]]; then
-			h=6
-			(( g6++ )) && print -u6
-		else
-			h=4			# divert to Config.in
-			print -u4
-		fi
+		echo "pkgconfigs.d/$dn/Config.in.$sppn $sect" >>../package_sections
+		exec 4>../pkgconfigs.d/$dn/Config.in.$sppn
+		h=4
 
 		print -u$h config ADK_PACKAGE_$spcu
 		spnf=$sppn			# spnf: subpackage name, filled
@@ -261,7 +263,6 @@ EOF
 		print "\t  flavour ADK_PACKAGE_${dnu}_$pfcu for $PKG_NAME"
 	done >&4
 
-	) 4>Config.in 5>Config.in.lib 6>Config.in.kmod
 	cd ..
 done
 
@@ -285,44 +286,16 @@ function get_first_prompt() {
 	[[ -n $prompt ]] && echo $prompt
 }
 
-# collect packages along with their section and
-# create a list of '<name> <path to config.in> <section string>' for later sorting
-rm -f package_section_list
-for dn in */Makefile; do
-	dn=${dn%/*}
-	pbar="Pass 3: $dn ..."
+# prepare Config.in list for sorting
+while read config_in section; do
+	pbar="Pass 3: $config_in ..."
 	print -nu2 "$pbar\r"
 
-	cd $dn
-	eval $($GMAKE dump="PKG_NAME PKG_SECTION")
-	cd ..
-
-	# ignore section kernel, these are included inside target/config
-	[[ $PKG_SECTION = kernel ]] && continue
-
-	PKG_SECTION=${PKG_SECTION:-none}
-
-	has_config_in=false
-	if non_empty_file $dn/Config.in; then
-		prompt="$(get_first_prompt $dn/Config.in)"
-		prompt="${prompt:-$PKG_NAME}"
-		echo "$prompt $dn/Config.in $(lookup_section_string $PKG_SECTION)"
-		has_config_in=true
-	fi
-	if non_empty_file $dn/Config.in.lib; then
-		prompt="$(get_first_prompt $dn/Config.in.lib)"
-		prompt="${prompt:-$PKG_NAME}"
-		echo "$prompt $dn/Config.in.lib $(lookup_section_string libs)"
-		has_config_in=true
-	fi
-	if non_empty_file $dn/Config.in.manual; then
-		prompt="$(get_first_prompt $dn/Config.in.manual)"
-		prompt="${prompt:-$PKG_NAME}"
-		echo "$prompt $dn/Config.in.manual $(lookup_section_string $PKG_SECTION)"
-		has_config_in=true
-	fi
-	$has_config_in || print -u2 "$dn: No Config.in file found?!"
-done >package_section_list
+	non_empty_file $config_in || continue
+	prompt="$(get_first_prompt $config_in)"
+	[[ -n $prompt ]] || continue
+	echo "$prompt $config_in $(lookup_section_string $section)"
+done <package_sections >package_section_list
 
 # create the Config.in.auto from the sorted list from above
 cursec=""
@@ -339,4 +312,4 @@ sort -k 3 -k 1 -f package_section_list | while read name file section; do
 	print "source \"package/$file\""
 done >Config.in.auto
 print "endmenu\n" >>Config.in.auto
-rm -f package_section_list
+rm -f package_sections package_section_list