egor duda writes:

Hi!

I've created a patch to busybox' build system to allow building it in
separate tree in a manner similar to kbuild from kernel version 2.6.

That is, one runs command like
'make O=/build/some/where/for/specific/target/and/options'
and everything is built in this exact directory, provided that it exists.

I understand that applyingc such invasive changes during 'release
candidates' stage of development is at best unwise. So, i'm currently
asking for comments about this patch, starting from whether such thing
is needed at all to whether it coded properly.

'make check' should work now, and one make creates Makefile in build
directory, so one can run 'make' in build directory after that.

One possible caveat is that if we build in some directory other than
source one, the source directory should be 'distclean'ed first.

egor
diff --git a/testsuite/du/du-h-works b/testsuite/du/du-h-works
index 8ec5d4c..82041ab 100644
--- a/testsuite/du/du-h-works
+++ b/testsuite/du/du-h-works
@@ -1,3 +1,4 @@
-du -h .. > logfile.gnu
-busybox du -h .. > logfile.bb
+[ -n "$d" ] || d=..
+du -h "$d" > logfile.gnu
+busybox du -h "$d" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/du/du-k-works b/testsuite/du/du-k-works
index 43b119c..177a1a2 100644
--- a/testsuite/du/du-k-works
+++ b/testsuite/du/du-k-works
@@ -1,3 +1,4 @@
-du -k .. > logfile.gnu
-busybox du -k .. > logfile.bb
+[ -n "$d" ] || d=..
+du -k "$d" > logfile.gnu
+busybox du -k "$d" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/du/du-l-works b/testsuite/du/du-l-works
index c5d4398..61e9140 100644
--- a/testsuite/du/du-l-works
+++ b/testsuite/du/du-l-works
@@ -1,3 +1,4 @@
-du -l .. > logfile.gnu
-busybox du -l .. > logfile.bb
+[ -n "$d" ] || d=..
+du -l "$d" > logfile.gnu
+busybox du -l "$d" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/du/du-m-works b/testsuite/du/du-m-works
index e3e2d3a..bc97073 100644
--- a/testsuite/du/du-m-works
+++ b/testsuite/du/du-m-works
@@ -1,3 +1,4 @@
-du -m .. > logfile.gnu
-busybox du -m .. > logfile.bb
+[ -n "$d" ] || d=..
+du -m "$d" > logfile.gnu
+busybox du -m "$d" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/du/du-s-works b/testsuite/du/du-s-works
index 16b0a3e..f0b3bf0 100644
--- a/testsuite/du/du-s-works
+++ b/testsuite/du/du-s-works
@@ -1,3 +1,4 @@
-du -s .. > logfile.gnu
-busybox du -s .. > logfile.bb
+[ -n "$d" ] || d=..
+du -s "$d" > logfile.gnu
+busybox du -s "$d" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/du/du-works b/testsuite/du/du-works
index 87ba630..47949c6 100644
--- a/testsuite/du/du-works
+++ b/testsuite/du/du-works
@@ -1,3 +1,4 @@
-du .. > logfile.gnu
-busybox du .. > logfile.bb
+[ -n "$d" ] || d=..
+du "$d" > logfile.gnu
+busybox du "$d" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/head/head-n-works b/testsuite/head/head-n-works
index 121a1fa..db43255 100644
--- a/testsuite/head/head-n-works
+++ b/testsuite/head/head-n-works
@@ -1,3 +1,4 @@
-head -n 2 ../README > logfile.gnu
-busybox head -n 2 ../README > logfile.bb
+[ -n "$d" ] || d=..
+head -n 2 "$d/README" > logfile.gnu
+busybox head -n 2 "$d/README" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/head/head-works b/testsuite/head/head-works
index ea10ade..56ad3e3 100644
--- a/testsuite/head/head-works
+++ b/testsuite/head/head-works
@@ -1,3 +1,4 @@
-head ../README > logfile.gnu
-busybox head ../README > logfile.bb
+[ -n "$d" ] || d=..
+head "$d/README" > logfile.gnu
+busybox head "$d/README" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/ls/ls-1-works b/testsuite/ls/ls-1-works
index 8651ecd..8ad484f 100644
--- a/testsuite/ls/ls-1-works
+++ b/testsuite/ls/ls-1-works
@@ -1,3 +1,4 @@
-ls -1 .. > logfile.gnu
-busybox ls -1 .. > logfile.bb
+[ -n "$d" ] || d=..
+ls -1 "$d" > logfile.gnu
+busybox ls -1 "$d" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/ls/ls-h-works b/testsuite/ls/ls-h-works
index f54a7be..7331262 100644
--- a/testsuite/ls/ls-h-works
+++ b/testsuite/ls/ls-h-works
@@ -1,3 +1,4 @@
-ls -h .. > logfile.gnu
-busybox ls -h .. > logfile.bb
+[ -n "$d" ] || d=..
+ls -h "$d" > logfile.gnu
+busybox ls -h "$d" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/ls/ls-l-works b/testsuite/ls/ls-l-works
index 50e4459..ae5141d 100644
--- a/testsuite/ls/ls-l-works
+++ b/testsuite/ls/ls-l-works
@@ -1,3 +1,4 @@
-ls -l .. > logfile.gnu
-busybox ls -l .. > logfile.bb
+[ -n "$d" ] || d=..
+ls -l "$d" > logfile.gnu
+busybox ls -l "$d" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/ls/ls-s-works b/testsuite/ls/ls-s-works
index 98a612d..d82f328 100644
--- a/testsuite/ls/ls-s-works
+++ b/testsuite/ls/ls-s-works
@@ -1,3 +1,4 @@
-ls -1s .. > logfile.gnu
-busybox ls -1s .. > logfile.bb
+[ -n "$d" ] || d=..
+ls -1s "$d" > logfile.gnu
+busybox ls -1s "$d" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/runtest b/testsuite/runtest
index 89aba39..6ba334b 100755
--- a/testsuite/runtest
+++ b/testsuite/runtest
@@ -1,6 +1,8 @@
 #!/bin/sh
 
-PATH=$(dirname $(pwd)):$PATH
+[ -n "$srcdir" ] || srcdir=$(pwd)
+[ -n "$bindir" ] || bindir=$(dirname $(pwd))
+PATH=$bindir:$PATH
 
 run_applet_testcase ()
 {
@@ -13,7 +15,7 @@
 	local uc_applet=$(echo $applet | tr a-z A-Z)
 	local testname=$(basename $testcase)
 
-	if grep -q "^# CONFIG_${uc_applet} is not set$" ../.config; then
+	if grep -q "^# CONFIG_${uc_applet} is not set$" $bindir/.config; then
 		echo UNTESTED: $testname
 		return 0
 	fi
@@ -21,7 +23,7 @@
 	if grep -q "^# FEATURE: " $testcase; then
 		local feature=`sed -ne 's/^# FEATURE: //p' $testcase`
 
-		if grep -q "^# ${feature} is not set$" ../.config; then
+		if grep -q "^# ${feature} is not set$" $bindir/.config; then
 			echo UNTESTED: $testname
 			return 0
 		fi
@@ -31,7 +33,7 @@
 	mkdir -p tmp
 	pushd tmp >/dev/null
 
-	sh -x -e ../$testcase >.logfile.txt 2>&1
+	d=$srcdir sh -x -e $testcase >.logfile.txt 2>&1
 
 	if [ $? != 0 ] ; then
 		echo FAIL: $testname
@@ -58,8 +60,8 @@
 
 	local status=0
 
-	for testcase in $applet/*; do
-		if [ "$testcase" = "$applet/CVS" ]; then
+	for testcase in $srcdir/$applet/*; do
+		if [ "$testcase" = "$srcdir/$applet/CVS" ]; then
 			continue
 		fi
 
@@ -84,11 +86,11 @@
 if [ $# -ne 0 ]; then
 	applets="$@"
 else
-	applets="*"
+	applets=$(ls $srcdir)
 fi
 
 for applet in $applets; do
-	if [ "$applet" != CVS -a -d "$applet" ]; then
+	if [ "$applet" != CVS -a -d "$srcdir/$applet" ]; then
 		if run_applet_tests $applet; then
 			:
 		else
diff --git a/testsuite/sort/sort-n-works b/testsuite/sort/sort-n-works
index c9b63a3..878108d 100644
--- a/testsuite/sort/sort-n-works
+++ b/testsuite/sort/sort-n-works
@@ -1,3 +1,4 @@
-sort -n ../README > logfile.gnu
-busybox sort -n ../README > logfile.bb
+[ -n "$d" ] || d=..
+sort -n "$d/README" > logfile.gnu
+busybox sort -n "$d/README" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/sort/sort-r-works b/testsuite/sort/sort-r-works
index 6422ba9..6ee0ceb 100644
--- a/testsuite/sort/sort-r-works
+++ b/testsuite/sort/sort-r-works
@@ -1,3 +1,4 @@
-sort -r ../README > logfile.gnu
-busybox sort -r ../README > logfile.bb
+[ -n "$d" ] || d=..
+sort -r "$d/README" > logfile.gnu
+busybox sort -r "$d/README" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/sort/sort-works b/testsuite/sort/sort-works
index 0110aa0..14a115a 100644
--- a/testsuite/sort/sort-works
+++ b/testsuite/sort/sort-works
@@ -1,3 +1,4 @@
-sort ../README > logfile.gnu
-busybox sort ../README > logfile.bb
+[ -n "$d" ] || d=..
+sort "$d/README" > logfile.gnu
+busybox sort "$d/README" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/tail/tail-n-works b/testsuite/tail/tail-n-works
index 321db7f..27a905f 100644
--- a/testsuite/tail/tail-n-works
+++ b/testsuite/tail/tail-n-works
@@ -1,3 +1,4 @@
-tail -n 2 ../README > logfile.gnu
-busybox tail -n 2 ../README > logfile.bb
+[ -n "$d" ] || d=..
+tail -n 2 "$d/README" > logfile.gnu
+busybox tail -n 2 "$d/README" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/tail/tail-works b/testsuite/tail/tail-works
index 321db7f..27a905f 100644
--- a/testsuite/tail/tail-works
+++ b/testsuite/tail/tail-works
@@ -1,3 +1,4 @@
-tail -n 2 ../README > logfile.gnu
-busybox tail -n 2 ../README > logfile.bb
+[ -n "$d" ] || d=..
+tail -n 2 "$d/README" > logfile.gnu
+busybox tail -n 2 "$d/README" > logfile.bb
 cmp logfile.gnu logfile.bb
diff --git a/testsuite/xargs/xargs-works b/testsuite/xargs/xargs-works
index 4ad5818..c95869e 100644
--- a/testsuite/xargs/xargs-works
+++ b/testsuite/xargs/xargs-works
@@ -1,3 +1,4 @@
-find -name \*works -type f | xargs md5sum > logfile.gnu
-find -name \*works -type f | busybox xargs md5sum > logfile.bb
+[ -n "$d" ] || d=..
+find "$d" -name \*works -type f | xargs md5sum > logfile.gnu
+find "$d" -name \*works -type f | busybox xargs md5sum > logfile.bb
 diff -u logfile.gnu logfile.bb