last-svn-commit-443-g5ee999b build-aux/build_unit_test.sh: Add support for conditional unit-tests.

--- ChangeLog | 5 + build-aux/build_unit_test.sh | 192 +++++++++++++++++++++++++++++++++--------- 2 files changed, 157 insertions(+), 40 deletions(-) diff --git a/ChangeLog b/ChangeLog index ec948cc..dfa1ef6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2010-08-10 Guillaume Lazzara <z@lrde.epita.fr> + + * build-aux/build_unit_test.sh: Add support for conditional + unit-tests. + 2010-08-03 Guillaume Lazzara <z@lrde.epita.fr> * configure.ac: Improve configure's outputs for external library diff --git a/build-aux/build_unit_test.sh b/build-aux/build_unit_test.sh index 8080ef2..15310ff 100755 --- a/build-aux/build_unit_test.sh +++ b/build-aux/build_unit_test.sh @@ -1,6 +1,6 @@ #! /bin/sh -# Copyright (C) 2007, 2009 EPITA Research and Development Laboratory +# Copyright (C) 2009, 2010 EPITA Research and Development Laboratory # (LRDE) # # This file is part of Olena. @@ -17,6 +17,25 @@ # You should have received a copy of the GNU General Public License # along with Olena. If not, see <http://www.gnu.org/licenses/>. +## Build a list of unit tests. +## +## Conditional tests (external dependencies) can be handled +## automaticaly. For each dependency, a file named +## "cond_tests_{DEPS}" must contain the list of files which need the +## dependency. If a test needs more than one dependency, several +## dependency names can be used in the file name. +## +## Ex: cond_tests_qt_tesseract +## +## All the tests listed in this file will need both qt and tesseract +## to be compiled. +## +## "cond_tests_*" files must be created in the directory where +## unit-test.mk is generated (usually the unit-tests directory). +## +## WARNING: don't forget to add "cond_tests_*" files in the COND_TESTS +## variable in the right Makefile.am. + ## FIXME: Don't use `echo -n', as echo's options are not portable. ## ## http://www.gnu.org/software/autoconf/manual/html_node/Limitations-of-Builtin... @@ -25,44 +44,38 @@ ## would be to only emit lines ended with newlines. ECHO_N=printf -# Use the C locale to have a deterministic sort. -export LC_ALL=C -test $# -eq 3 || { echo "Usage: $0 <scanned dir> <output_dir> <disabled_tests>" && exit 1; } +add_targets() +{ + HEADERS_="$1" + output_dir="$2" + output="$3" + IFDEF="$4" -scanned_dir=$1 -output_dir=$2 -disabled_tests=$3 + if ! (test -z "$IFDEF"); then + echo "# Starting a conditional unit test list." >> "$output" + else + echo "# Starting non-conditional unit test list." >> "$output" + fi -## FIXME: We do not include these directories -## -## mln/io/dicom -## mln/io/fits -## mln/io/magick -## mln/io/tiff -## -## because they contain files depending on optional (external) -## libraries. We should test them conditionally. -HEADERS=$(find $scanned_dir -type f -name "*.hh" \ - | sort \ - | sed -e 's/.*\/mln\/\(.*\)/mln\/\1/g' | sed 's/\.\.\/\.\.\///g' \ - | comm -23 - "$disabled_tests") + # Start conditions if necessary -output="$output_dir/unit-tests.mk" + # Construct a list of conditions in reverse order to write valid + # endif further. + IFDEF_TMP="" + for i in $IFDEF; do + echo "if HAVE_$i" >>"$output" + IFDEF_TMP="$i $IFDEF_TMP" + done + IFDEF="$IFDEF_TMP" -rm -f "$output" -rm -f mln_*.cc + $ECHO_N "check_PROGRAMS += " >>"$output" -# Build unit-tests.mk. -echo "## Generated by $0, do not modify." >"$output" -echo >>"$output" -$ECHO_N "check_PROGRAMS = " >>"$output" - -for i in $HEADERS; do - FILE_CC=`echo $i | sed 's/[/.]/_/g' | sed 's/_hh/\.cc/g'` + for i in $HEADERS_; do + FILE_CC=`echo $i | sed 's/[/.]/_/g' | sed 's/_hh/\.cc/g'` # Build .cc. - cat > $output_dir/$FILE_CC << EOF + cat > $output_dir/$FILE_CC << EOF // Unit test for $i. // Generated by $0, do not modify. @@ -77,16 +90,115 @@ int main() EOF # Build unit-tests.mk. - TARGET=`echo "${FILE_CC}" | sed 's/\.cc//'` - echo " \\" >>"$output" - $ECHO_N "${TARGET}" >>"$output" + TARGET=`echo "${FILE_CC}" | sed 's/\.cc//'` + echo " \\" >>"$output" + $ECHO_N "${TARGET}" >>"$output" + done + + # Build "$output". + echo "" >>"$output" + echo "" >>"$output" + for i in $HEADERS_; do + FILE_CC=`echo $i | sed 's/[/.]/_/g' | sed 's/_hh/\.cc/g'` + NAME=`echo $FILE_CC | sed 's/\.cc//g'` + + # Write specific flags if there are dependencies. + if ! (test -z "$IFDEF"); then + cppflags="${NAME}_CPPFLAGS=" + ldflags="${NAME}_LDFLAGS=" + for i in $IFDEF; do + cppflags="${cppflags} \${${i}_CPPFLAGS} " + ldflags="${ldflags} \${${i}_LDFLAGS} " + done + echo "$cppflags \${AM_CPPFLAGS}" >>"$output" + echo "$ldflags \${AM_LDFLAGS}" >>"$output" + fi + + echo "${NAME}_SOURCES = $FILE_CC" >>"$output" + done + + # End conditions if necessary + for i in $IFDEF; do + echo "endif HAVE_$i" >>"$output" + done + + echo "" >>"$output" +} + + + +# Use the C locale to have a deterministic sort. +export LC_ALL=C + +test $# -eq 4 || { echo "Usage: $0 <scanned dir> <output_dir> <disabled_tests> <base include dir>" && exit 1; } + +scanned_dir=$1 +output_dir=$2 +disabled_tests=$3 +base_inc_dir=$4 + +# Create a list of tests to be disabled or considered as conditional. +ignored_list="$output_dir/ignored_list.tmp" +cat "$disabled_tests" > $ignored_list +COND_TESTS=$(find $output_dir -type f -name "cond_tests_*" | sort) +for f in $COND_TESTS; do + cat "$f" >> "$ignored_list" done +cat "$ignored_list" | sort > "$ignored_list.tmp" +mv -f "$ignored_list.tmp" "$ignored_list" -# Build "$output". -echo "" >>"$output" +HEADERS=$(find $scanned_dir -type f -name "*.hh" \ + | sort \ + | sed -e "s/.*\/${base_inc_dir}\/\(.*\)/${base_inc_dir}\/\1/g" \ + | sed 's/\.\.\/\.\.\///g' \ + | comm -23 - "$ignored_list") + +output="$output_dir/unit-tests.mk" + +# Cleanup previously generated data. +rm -f "$output" +rm -f ${base_inc_dir}_*.cc + +# Build unit-tests.mk. +echo "## Generated by $0, do not modify." > "$output" +echo >>"$output" + +echo "check_PROGRAMS =" >>"$output" echo "" >>"$output" -for i in $HEADERS; do - FILE_CC=`echo $i | sed 's/[/.]/_/g' | sed 's/_hh/\.cc/g'` - NAME=`echo $FILE_CC | sed 's/\.cc//g'` - echo "${NAME}_SOURCES = $FILE_CC" >>"$output" + + +#----------------------------------- +# Insert lists of conditional tests. +#----------------------------------- + +for f in $COND_TESTS; do + # Generate the list of conditions. + fpostfix="`echo \"$f\" | sed -e 's/.*\/cond_tests_//g'`_" + i=1 + COND_LIST="" + while true; do + name=`echo $fpostfix | cut -s -d '_' -f $i \ + | tr "[:lower:]" "[:upper:]"` + i=$(($i+1)) + if (test -z "$name"); then + break; + fi + COND_LIST="${COND_LIST} $name" + done + + COND_HEADERS=$(cat $f) + + # Writing conditional targets + add_targets "$COND_HEADERS" "$output_dir" "$output" "$COND_LIST" done + + +#------------------------------------- +# Insert list of non-conditional tests +#------------------------------------- + +add_targets "$HEADERS" "$output_dir" "$output" "" + + +# Remove temporary files +rm -f "$ignored_list" \ No newline at end of file -- 1.5.6.5
participants (1)
-
Guillaume Lazzara