From 2b996dfbed52a0ec1592b4820990f97b5147b2d4 Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Mon, 13 Apr 2009 21:02:54 +0200 Subject: [PATCH] lib.sh: Add generate() which replaces m4(). generate() generates files with m4, awk or simply copies it. Add lib.m4 which provides the macro(s) formerly provided by m4(). Use include(../lib.m4) to load it. Also rename setup_warning() to warning(). --- lib.m4 | 10 +++++++ lib.sh | 63 ++++++++++++++++++++++++++----------------- tests/lib.sh.test | 38 +++++++++++++++++++------- tests/lib.sh.test.out | 31 ++++++++++++++++----- 4 files changed, 101 insertions(+), 41 deletions(-) create mode 100644 lib.m4 diff --git a/lib.m4 b/lib.m4 new file mode 100644 index 0000000..0d65268 --- /dev/null +++ b/lib.m4 @@ -0,0 +1,10 @@ +dnl Contains additional macros for m4. +dnl +dnl The following macros are defined: IF and FI. Example: +dnl IF(OS, debian) +dnl ... +dnl FI +dnl +dnl +define(`IF', `ifelse(`$1', `$2',dnl')dnl +define(`FI', `)dnl')dnl diff --git a/lib.sh b/lib.sh index 6cd3d2f..fbef907 100644 --- a/lib.sh +++ b/lib.sh @@ -7,9 +7,6 @@ # options supported by zsh or GNU ls. unset LS_COLORS -# Get path to m4 because it's later redefined as function. -m4=`which m4` - # Check if the given program is installed. Returns 0 if it exists, 1 # otherwise; so it can be used in if. @@ -73,40 +70,56 @@ link() { } # Write a warning to $1 to make clear it should not be modified. $2 is the -# source for the generated file. -setup_warning() { +# source for the generated file. Also print a message to stdout that the file +# $1 was generated from $2 using the command $3. +warning() { echo "###################################" > $1 echo "# WARNING! DO NOT EDIT THIS FILE! #" >> $1 echo "###################################" >> $1 echo >> $1 echo "# It was generated from $2 on `date`." >> $1 echo >> $1 + + # Write message to stdout. + echo "$3: generating '$1' from '$2'" } -# m4 wrapper which uses $1.m4 as template file, feeds it to m4 and writes it -# to $1 with a warning at the beginning to not edit the generated file. +# Generate a file using several methods. A warning is automatically added to +# the created file and a message printed to stdout through warning(). # -# All arguments (except the first which is the filename) are passed to m4. +# The following commands are possible; the file extension for the source file +# in brackets. # -# The following macros are defined: IF and FI. Example: -# IF(OS, debian) -# ... -# FI -m4() { - # First argument is file name. - file=$1 +# - m4 (.m4): pipe $2.m4 through m4 then write it to $2 +# - awk (.in): pipe $2.in through awk then write it to $2 +# - cat ($3): copy $2$3 to $2 +generate() { + # Get command and target file. + command="$1" + file="$2" + # Remove arguments from list. + shift shift - # Write a warning to the generated file to not edit it. - setup_warning $file $file.m4 + # Set extension for the used commands. When cat is used $3 is used as + # extension. + if [ x"$command" = xm4 ]; then + extension=.m4 + elif [ x"$command" = xawk ]; then + extension=.in + elif [ x"$command" = xcat ]; then + extension="$1" # is $3 in reality, $1 because of shifting + shift + # Print a warning and exit if an unsupported command is used. + else + echo "generate(): command '$command' not supported!" >&2 + exit 1 + fi - # Process $1.m4 with m4 using the given options. - echo "m4(): generating '$file' from '$file.m4' with options '$*'" - # Add useful macros. - (echo "define(\`IF', \`ifelse(\`\$1', \`\$2',dnl')dnl -define(\`FI', \`)dnl')dnl"; - # Run the file (and the default macros) through m4. - cat $file.m4) | $m4 "$@" >> $file + # Add warning to file and write a message to stdout. + warning "$file" "$file$extension" $command + # Generate $file from $file$extension using the given command. + cat "$file$extension" | $command "$@" >> "$file" - unset file + unset command file } diff --git a/tests/lib.sh.test b/tests/lib.sh.test index 911b4db..d3620cc 100644 --- a/tests/lib.sh.test +++ b/tests/lib.sh.test @@ -22,36 +22,54 @@ installed ls && echo ls installed installed doesnt-exist && echo doesnt-exist installed -# Tests for m4(). -echo "Simple test file for m4. +# Tests for generate(). +echo "Simple test file for generate() using m4. +include(../lib.m4)dnl IF(TEST,m4) m4 FI IF(TEST,n4) n4 FI" > tmp/test.m4 -m4 tmp/test -DTEST=m4 +generate m4 tmp/test -DTEST=m4 # Remove the line with the current date as it changes every time. cat tmp/test | grep -v "It was generated from tmp/test.m4" -# Test multiple arguments to m4(). -echo "Test with multiple arguments passed to m4. +# Test multiple arguments to generate(). +echo "Test with multiple arguments passed to generate(). first: FIRST second: SECOND " > tmp/test-multiple.m4 -m4 tmp/test-multiple -DFIRST=first -DSECOND=second +generate m4 tmp/test-multiple -DFIRST=first -DSECOND=second # Remove the line with the current date as it changes every time. cat tmp/test-multiple | grep -v "It was generated from tmp/test-multiple.m4" -# Test multiple arguments with spaces to m4(). -echo "Test with multiple arguments with spaces passed to m4. +# Test multiple arguments with spaces to generate(). +echo "Test with multiple arguments with spaces passed to generate(). first: FIRST second: SECOND " > tmp/test-multiple-spaces.m4 -m4 tmp/test-multiple-spaces -DFIRST="first with spaces" \ - -DSECOND="second with spaces" +generate m4 tmp/test-multiple-spaces -DFIRST="first with spaces" \ + -DSECOND="second with spaces" # Remove the line with the current date as it changes every time. cat tmp/test-multiple-spaces \ | grep -v "It was generated from tmp/test-multiple-spaces.m4" +# Test generate() using awk. +echo "Simple test fiel for generate() using awk. +first second +" > tmp/test-awk.in +generate awk tmp/test-awk '{ print $1 }' +# Remove the line with the current date as it changes every time. +cat tmp/test-awk | grep -v "It was generated from tmp/test-awk.in" + +# Test generate() using cat. +echo "Simple test fiel for generate() using cat (simple copy). + +... +" > tmp/test-cat.real +generate cat tmp/test-cat .real +# Remove the line with the current date as it changes every time. +cat tmp/test-cat | grep -v "It was generated from tmp/test-cat.real" + # vim: ft=sh diff --git a/tests/lib.sh.test.out b/tests/lib.sh.test.out index 34cfe6d..ed7a77b 100644 --- a/tests/lib.sh.test.out +++ b/tests/lib.sh.test.out @@ -2,31 +2,50 @@ ls installed Mac OS X which for ls ls installed Mac OS X which for doesnt-exist -m4(): generating 'tmp/test' from 'tmp/test.m4' with options '-DTEST=m4' +m4: generating 'tmp/test' from 'tmp/test.m4' ################################### # WARNING! DO NOT EDIT THIS FILE! # ################################### -Simple test file for m4. +Simple test file for generate() using m4. m4 -m4(): generating 'tmp/test-multiple' from 'tmp/test-multiple.m4' with options '-DFIRST=first -DSECOND=second' +m4: generating 'tmp/test-multiple' from 'tmp/test-multiple.m4' ################################### # WARNING! DO NOT EDIT THIS FILE! # ################################### -Test with multiple arguments passed to m4. +Test with multiple arguments passed to generate(). first: first second: second -m4(): generating 'tmp/test-multiple-spaces' from 'tmp/test-multiple-spaces.m4' with options '-DFIRST=first with spaces -DSECOND=second with spaces' +m4: generating 'tmp/test-multiple-spaces' from 'tmp/test-multiple-spaces.m4' ################################### # WARNING! DO NOT EDIT THIS FILE! # ################################### -Test with multiple arguments with spaces passed to m4. +Test with multiple arguments with spaces passed to generate(). first: first with spaces second: second with spaces +awk: generating 'tmp/test-awk' from 'tmp/test-awk.in' +################################### +# WARNING! DO NOT EDIT THIS FILE! # +################################### + + +Simple +first + +cat: generating 'tmp/test-cat' from 'tmp/test-cat.real' +################################### +# WARNING! DO NOT EDIT THIS FILE! # +################################### + + +Simple test fiel for generate() using cat (simple copy). + +... + -- 2.43.2