tests: Improve portability for perl script tests.
[dxcommon.git] / tests / scripts.at
bloba510f2529e9a2a718e86279d447240f8850b5bb7
1 dnl Copyright © 2021-2023 Nick Bowler
2 dnl
3 dnl License WTFPL2: Do What The Fuck You Want To Public License, version 2.
4 dnl This is free software: you are free to do what the fuck you want to.
5 dnl There is NO WARRANTY, to the extent permitted by law.
7 AT_BANNER([Script tests])
9 m4_define([TEST_GEN_OPTIONS],
10 [AT_KEYWORDS([gen-options awk script scripts])dnl
11 AT_DATA([m4_default([$2], [options.def])], [$1])
12 AT_CHECK([$AWK -f "$srcdir/scripts/gen-options.awk" dnl
13 <m4_default([$2], [options.def]) >options.h])])
15 m4_define([TEST_GEN_OPTIONS_SAMPLE],
16 [[--option-only
17 --option-with-val (5)
18 --option-with-flagval (&x, 5)
19 --option-with-arg=ARG
20 some "text" goes here
21 --option-with-optional-arg[=OPTIONAL]
23 hello
24 -a, --option-with-sopt
26 -b, --option-with-sopt-and-arg=SOPTARG
27 -c, --option-with-sopt-and-optional-arg[=SOPTOPTIONAL]
28 --option-with-arg-and-val=ARGVAL (42)
29 --option-with-arg-and-flagval=ARGFLAGVAL (&a[1], 'x')
30 --option-with-optional-arg-and-val[=OPTIONALARGVAL] (54)
31 --option-with-optional-arg-and-flagval[=OPTIONALFLAGVAL] (0, 0)
32 --with-sopt
33 Here is a help string
34     that has a line randomly indented
35 # with a comment
36     @&t@
37 and a blank line
38 --with-arg=ARG
39 do stuff with ARG
40 --flagval
41 ]])
43 AT_SETUP([gen-options.awk])
44 TEST_GEN_OPTIONS([TEST_GEN_OPTIONS_SAMPLE])
46 AT_DATA([context.h],
47 [[struct option { const char *name; int has_arg; int *flag; int val; };
48 int x, a[5];
49 ]])
51 # test 0: sanity test
52 AT_DATA([test0.c],
53 [[#include "context.h"
54 #include "options.h"
56 static const char sopts[] = SOPT_STRING;
57 static const struct option opts[] = { LOPTS_INITIALIZER, {0} };
59 int main(void)
61   return 0;
63 ]])
64 AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0], [], [ignore])
66 # test 1: long option names and help text
67 AT_DATA([test1.c],
68 [[#include <stdio.h>
69 #include <stdlib.h>
71 #include "context.h"
72 #include "options.h"
74 static const struct option opts[] = { LOPTS_INITIALIZER };
76 int main(void)
78   unsigned i;
80   for (i = 0; i < sizeof opts / sizeof opts[0]; i++) {
81     struct lopt_help help = { "INVALID", "INVALID" };
83     if (!lopt_get_help(&opts[i], &help))
84       return EXIT_FAILURE;
86     printf("--%s", opts[i].name);
87     if (opts[i].has_arg)
88       printf("=%s", help.arg);
89     printf("\n%s", help.desc);
90     if (help.desc[0])
91       putchar('\n');
92   }
94   return 0;
96 ]])
98 AT_DATA([lopthelp.awk],
99 [[/^#/ { next }
100 /^-/ {
101   if ($1 !~ /^--/)
102     $1 = $2;
103   if (sub(/\@:>@$/, "", $1))
104     sub(/\@<:@/, "", $1);
106   print $1;
107   next;
110 { sub(/^[ \t]*/, ""); }
111 /./ { print; }
114 $AWK -f lopthelp.awk options.def >expout
115 AT_CHECK([$CC -o test1$EXEEXT test1.c && ./test1$EXEEXT],
116   [0], [expout], [ignore])
118 # test 2: short option string
119 AT_DATA([test2.c],
120 [[#include <stdio.h>
121 #include <stdlib.h>
123 #include "context.h"
124 #include "options.h"
126 int main(void)
128   struct option lopts[] = {LOPTS_INITIALIZER};
129   unsigned i, j;
131   for (i = 0; i < sizeof SOPT_STRING - 1; i++) {
132     if (SOPT_STRING[i] != ':') {
133       for (j = 0; j < sizeof lopts / sizeof lopts[0]; j++) {
134         if (lopts[j].val == SOPT_STRING[i]) {
135           printf("--%s ", lopts[j].name);
136           break;
137         }
138       }
139     }
140     putchar(SOPT_STRING[i]);
141     if (SOPT_STRING[i+1] != ':')
142       putchar('\n');
143   }
144   return 0;
148 AT_DATA([soptstr.awk],
149 [[/^-/ {
150   if ($1 ~ /^--/)
151     next;
153   sopt = substr($1, 2, 1);
154   arg = sub(/\@:>@$/, "", $2);
155   arg += sub(/\@<:@?=.*$/, "", $2);
157   print $2 " " sopt substr("::", 1, arg);
161 $AWK -f soptstr.awk options.def >expout
162 AT_CHECK([$CC -o test2$EXEEXT test2.c && ./test2$EXEEXT],
163   [0], [expout], [ignore])
165 AT_CLEANUP
167 AT_SETUP([gen-options.awk xgettext annotation])
168 TEST_GEN_OPTIONS([TEST_GEN_OPTIONS_SAMPLE])
170 # Check that all help strings are translatable
171 AT_DATA([messages.awk],
172 [[BEGIN { lines = -1; }
173 END { output(); }
175 /^#/ { next }
176 /^-/ {
177   output();
178   if ($1 !~ /^--/)
179     $1 = $2;
181   tmp=$1;
182   arg="";
183   if (sub(/\@<:@?=.*/, "", $1)) {
184     arg = substr(tmp, index(tmp, "=")+1);
185     sub(/\@:>@$/, "", arg);
186   }
188   sub(/^--/, "", $1);
189   ctxt=("msgctxt \"" $1 "\" msgid");
191   if (arg)
192     print ctxt, ("\"" arg "\"");
193   next;
196 { sub(/^[ \t]*/, ""); }
197 /./ {
198   gsub(/"/, "\\\"", $0);
199   help[lines++] = $0;
202 function output(i)
204   if (lines >= 0) {
205     printf "%s", ctxt;
206     for (i = 0; i < lines; i++) {
207       nl = (i+1 < lines ? "\\n" : "");
208       printf(" \"%s%s\"", help[i], nl);
209     }
210     print "";
211   }
213   lines = 0;
217 dnl Antique versions of xgettext which predate the pgettext/msgctx feature
218 dnl will produce an output po file with no msgctx lines.  So try to spot
219 dnl that and skip the test with such versions.
220 AT_CHECK([xgettext --keyword=PN_:1c,2 options.h
221   test -f messages.po || exit 77
222   grep msgid messages.po >/dev/null &&
223     { grep msgctx messages.po >/dev/null || exit 77; }])
225 $AWK -f messages.awk options.def | LC_ALL=C sort >expout
226 AT_CHECK([sed -n '/^msgctxt/{
227 t next
228 :next
230 s/\nmsgstr.*//
231 t done
232 s/\s*""//
233 s/\n/ /
234 t next
235 :done
237 }' messages.po | LC_ALL=C sort], [0], [expout])
239 AT_CLEANUP
241 AT_SETUP([gen-options.awk packed format])
243 AT_DATA([test.c], [[#include <stdio.h>
244 struct option { const char *name; int has_arg; int *flag; int val; };
246 #include "options.h"
248 static unsigned opts[] = { LOPTS_PACKED_INITIALIZER };
250 int main(void)
252   unsigned i;
253   int x =
254 #if !LOPT_PACK_BITS
255   0
256 #elif LOPT_PACK_BITS <= 8
257   1
258 #elif LOPT_PACK_BITS <= 16
259   2
260 #elif LOPT_PACK_BITS <= 32
261   3
262 #else
263 #  error too big
264 #endif
265   ;
266   printf("%d\n", x);
267   for (i = 0; i < sizeof opts / sizeof opts[0]; i++) {
268     struct option o;
270     LOPT_UNPACK(o, opts[i]);
271     printf("--%s, %d, ", o.name, o.has_arg);
272     if (o.val > UCHAR_MAX)
273       printf("%d\n", o.val - UCHAR_MAX - 1);
274     else
275       printf("'%c'\n", o.val);
276   }
277   return 0;
281 TEST_GEN_OPTIONS([[--single-option
282 ]], [single.dat])
283 AT_CHECK([$CC -o single$EXEEXT test.c && ./single$EXEEXT], [0],
285 --single-option, 0, 0
288 TEST_GEN_OPTIONS([[-a, --the-first-option
289 -b, --the-second-option=ARG
290 -c, --the-third-option[=ARG]
291 -d, --the-fourth-option
292 ]], [16bit.dat])
293 AT_CHECK([$CC -o 16bit$EXEEXT test.c && ./16bit$EXEEXT], [0],
295 --the-first-option, 0, 'a'
296 --the-second-option, 1, 'b'
297 --the-third-option, 2, 'c'
298 --the-fourth-option, 0, 'd'
301 AT_CLEANUP
303 AT_SETUP([gen-strtab.awk])
304 AT_KEYWORDS([gen-strtab awk script scripts])
306 AT_DATA([test.def],
308 &a world
310 hello world
312 hello
313 world
314 &d world\n
316 \\not a newline
318 \not a newline
319 &g inline
320 continued
321 &h    no\
322 newline\
324 \   leading whitespace
325 &j oneline
326 # with a comment
329 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test.def >test.h])
331 sed -n 's/^[[&]]\([[^ ]]*\).*/\1/p' test.def >identifiers
333 # test 0: sanity test
334 { cat <<'EOF'
335 #include "test.h"
336 #include <stdio.h>
338 int main(void)
340   printf("---\n");
342 while read id; do AS_ECHO(['  printf("%s\n---\n", strtab+'"$id"');']); done
343 AS_ECHO(['  return 0;'])
344 AS_ECHO(['}'])
345 } <identifiers >test0.c
347 AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0], [---
348 world
350 hello world
353 hello
354 world
357 world
360 \not a newline
364 ot a newline
367 inline
368 continued
371 nonewline
373    leading whitespace
376 oneline
378 ], [ignore])
380 AT_CLEANUP
382 AT_SETUP([gen-strtab.awk @nozero option])
383 AT_KEYWORDS([gen-strtab awk script scripts])
385 AT_DATA([test0.def],
386 [[&hello hello
388 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test0.def >test0.h])
390 AT_DATA([test1.def],
391 [[@nozero
392 &hello hello
394 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test1.def >test1.h])
396 AT_DATA([test.c],
397 [[#include <stdio.h>
398 #include HEADER
399 int main(void) { printf("%d %s\n", hello, strtab+hello); return 0; }
401 AT_CHECK([$CC -DHEADER='"test0.h"' -o test0$EXEEXT test.c && ./test0$EXEEXT],
402   [0], [[0 hello
404 AT_CHECK([$CC -DHEADER='"test1.h"' -o test1$EXEEXT test.c && ./test1$EXEEXT],
405   [0], [[1 hello
408 AT_CLEANUP
410 AT_SETUP([gen-strtab.awk @macro option])
411 AT_KEYWORDS([gen-strtab awk script scripts])
413 AT_DATA([test0.def],
414 [[@macro
415 &foo foobar
416 &bar bar
417 &baz baz
419 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test0.def >test0.h])
421 AT_DATA([test0.c],
422 [[#include <stdio.h>
423 extern const char strtab[];
424 #include "test0.h"
426 int main(void)
428   static const char mystrtab[] = STRTAB_INITIALIZER;
429   printf("%s\n%s\n%s\n", mystrtab+foo, mystrtab+bar, mystrtab+baz);
430   return 0;
433 AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0],
434 [[foobar
439 AT_CLEANUP
441 AT_SETUP([gen-strtab.awk l10n options])
442 AT_KEYWORDS([gen-strtab awk script scripts])
444 AT_DATA([l10n.sed], dnl (
445 [[/^#/b
446 s/.*N_(\([^)]*\)).*/\1/p
449 AT_DATA([test0.def],
450 [[&a hello world
451 &b world
452 &c goodbye
454 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test0.def >test0.h])
455 AT_CHECK([sed -n -f l10n.sed test0.h | LC_ALL=C sort], [0],
456 [["goodbye"
457 "hello world"
458 "world"
461 AT_DATA([test1.def],
462 [[&a hello world
463 &&b world
464 &&c goodbye
466 AT_CHECK([$AWK -f "$srcdir/scripts/gen-strtab.awk" <test1.def >test1.h])
467 AT_CHECK([sed -n -f l10n.sed test1.h], [0],
468 [["hello world"
471 AT_DATA([test.c],
472 [[#include <stdio.h>
473 #include HEADER
475 int main(void)
477   printf("%s %s %s\n", strtab+a, strtab+b, strtab+c);
478   return 0;
482 AT_CHECK([$CC -DHEADER='"test0.h"' -o test0$EXEEXT test.c && ./test0$EXEEXT],
483   [0], [[hello world world goodbye
486 AT_CHECK([$CC -DHEADER='"test1.h"' -o test1$EXEEXT test.c && ./test1$EXEEXT],
487   [0], [[hello world world goodbye
491 AT_CLEANUP
493 AT_SETUP([gen-tree.awk])
494 AT_KEYWORDS([gen-tree awk script scripts])
496 AT_DATA([tree.def],
497 [[# comment
498 ROOT0
499   r0a, r0a_OFFSET
500     r0b, r0b_OFFSET
501       r0c
502     r0d
503   r0e, r0e_OFFSET
504     r0f
505     r0g
506 # comment
507 ROOT1
508   r1a, r1a_OFFSET
509     r1b, r1b_OFFSET
510       r1b
511       r1e
512       r1b
513   r1c, r1c_OFFSET
514     r1d, r1d_OFFSET
515       r1e
516       r1b
517       r1e
518 # comment
521 AT_CHECK([$AWK -f "$srcdir/scripts/gen-tree.awk" <tree.def >tree.h])
523 AT_DATA([test0.c],
524 [[#include "tree.h"
525 #include <stdio.h>
527 struct tree { unsigned id, subtree; };
529 static const struct tree tree0[] = {
530   ROOT0_INITIALIZER
532 static const struct tree tree1[] = {
533   ROOT1_INITIALIZER
536 void print_subtree(const struct tree *root, unsigned offset, int depth)
538   const struct tree *node;
540   for (node = &root[offset]; node->id; node++) {
541     printf("%*s%s", 2*depth, "", &tree_strtab[node->id]);
542     if (node->subtree) {
543       printf(", %s_OFFSET\n", &tree_strtab[node->id]);
544       print_subtree(root, node->subtree, depth+1);
545     } else {
546       putchar('\n');
547     }
548   }
551 int main(void)
553   printf("ROOT0\n");
554   print_subtree(tree0, 0, 1);
555   printf("ROOT1\n");
556   print_subtree(tree1, 0, 1);
557   return 0;
560 sed '/^#/d' tree.def >expout
561 AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0], [expout])
563 AT_CLEANUP
565 # Test the gen-tree features that avoid creating string labels for nodes.
566 AT_SETUP([gen-tree.awk @nostrtab option])
567 AT_KEYWORDS([gen-tree awk script scripts])
569 AT_DATA([tree.def],
570 [[@nostrtab
571 ROOT
572  a 1, a_OFFSET
573   b 1
574   c 2
575  d 2, d_OFFSET
576   e 1
577   f 2
579 AT_CHECK([$AWK -f "$srcdir/scripts/gen-tree.awk" <tree.def >tree.h])
581 AT_DATA([test0.c],
582 [[float tree_strtab = 0;
583 #define a []
584 #define b []
585 #define c []
586 #define e []
587 #define f []
588 #include "tree.h"
589 #include <stdio.h>
591 static struct { int num, offset; } root[] = { ROOT_INITIALIZER };
593 int main(void)
595   unsigned i;
596   for (i = 0; i < sizeof root / sizeof root[0]; i++) {
597     printf("%d, %d\n", root[i].num, root[i].offset);
598   }
599   return 0;
603 AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0],
604 [[1, 3
605 2, 6
606 0, 0
607 1, 0
608 2, 0
609 0, 0
610 1, 0
611 2, 0
612 0, 0
615 AT_DATA([flat.def],
616 [[FLAT
617  a 1
618  b 2
619  c 3
620 @nostrtab
622 AT_CHECK([$AWK -f "$srcdir/scripts/gen-tree.awk" <flat.def >flat.h])
624 sed -e 's/tree\.h/flat.h/' -e 's/ROOT/FLAT/' test0.c >test1.c
625 AT_CHECK([$CC -o test1$EXEEXT test1.c && ./test1$EXEEXT], [0],
626 [[1, 0
627 2, 0
628 3, 0
629 0, 0
632 AT_CLEANUP
634 AT_SETUP([join.awk])
635 AT_KEYWORDS([join awk script scripts])
637 JOIN="$AWK -f $srcdir/scripts/join.awk --"
639 AT_DATA([a],
640 [[1 a
641 3 a1 x
642 3 a2 x
643 5 a
644 6 a
645 8 a1 x
646 8 a2 x
647 9 a1
648 9 a2
649 9 a3
652 AT_DATA([b],
653 [[2 b
654 2 b
655 3 b y
656 4 b
657 6 b1 y
658 6 b2 y
659 7 b
660 8 b1 y
661 8 b2 y
664 AT_CHECK([$JOIN a b], [0],
665 [[3 a1 x b y
666 3 a2 x b y
667 6 a b1 y
668 6 a b2 y
669 8 a1 x b1 y
670 8 a1 x b2 y
671 8 a2 x b1 y
672 8 a2 x b2 y
675 AT_CHECK([$JOIN -v1 a b], [0],
676 [[1 a
677 5 a
678 9 a1
679 9 a2
680 9 a3
683 AT_CHECK([$JOIN -v2 a b], [0],
684 [[2 b
685 2 b
686 4 b
687 7 b
690 AT_CHECK([$JOIN -v1 -v2 a b], [0],
691 [[1 a
692 2 b
693 2 b
694 4 b
695 5 a
696 7 b
697 9 a1
698 9 a2
699 9 a3
702 AT_CHECK([$JOIN -a1 a b], [0],
703 [[1 a
704 3 a1 x b y
705 3 a2 x b y
706 5 a
707 6 a b1 y
708 6 a b2 y
709 8 a1 x b1 y
710 8 a1 x b2 y
711 8 a2 x b1 y
712 8 a2 x b2 y
713 9 a1
714 9 a2
715 9 a3
718 AT_CHECK([$JOIN -a2 a b], [0],
719 [[2 b
720 2 b
721 3 a1 x b y
722 3 a2 x b y
723 4 b
724 6 a b1 y
725 6 a b2 y
726 7 b
727 8 a1 x b1 y
728 8 a1 x b2 y
729 8 a2 x b1 y
730 8 a2 x b2 y
733 AT_CHECK([$JOIN -a1 -a2 a b], [0],
734 [[1 a
735 2 b
736 2 b
737 3 a1 x b y
738 3 a2 x b y
739 4 b
740 5 a
741 6 a b1 y
742 6 a b2 y
743 7 b
744 8 a1 x b1 y
745 8 a1 x b2 y
746 8 a2 x b1 y
747 8 a2 x b2 y
748 9 a1
749 9 a2
750 9 a3
753 AT_CHECK([$JOIN b a], [0],
754 [[3 b y a1 x
755 3 b y a2 x
756 6 b1 y a
757 6 b2 y a
758 8 b1 y a1 x
759 8 b1 y a2 x
760 8 b2 y a1 x
761 8 b2 y a2 x
764 AT_CHECK([$JOIN -v1 b a], [0],
765 [[2 b
766 2 b
767 4 b
768 7 b
771 AT_CHECK([$JOIN -v2 b a], [0],
772 [[1 a
773 5 a
774 9 a1
775 9 a2
776 9 a3
779 AT_CHECK([$JOIN -v1 -v2 b a], [0],
780 [[1 a
781 2 b
782 2 b
783 4 b
784 5 a
785 7 b
786 9 a1
787 9 a2
788 9 a3
791 AT_CHECK([$JOIN -a1 b a], [0],
792 [[2 b
793 2 b
794 3 b y a1 x
795 3 b y a2 x
796 4 b
797 6 b1 y a
798 6 b2 y a
799 7 b
800 8 b1 y a1 x
801 8 b1 y a2 x
802 8 b2 y a1 x
803 8 b2 y a2 x
806 AT_CHECK([$JOIN -a2 b a], [0],
807 [[1 a
808 3 b y a1 x
809 3 b y a2 x
810 5 a
811 6 b1 y a
812 6 b2 y a
813 8 b1 y a1 x
814 8 b1 y a2 x
815 8 b2 y a1 x
816 8 b2 y a2 x
817 9 a1
818 9 a2
819 9 a3
822 AT_CHECK([$JOIN -a1 -a2 b a], [0],
823 [[1 a
824 2 b
825 2 b
826 3 b y a1 x
827 3 b y a2 x
828 4 b
829 5 a
830 6 b1 y a
831 6 b2 y a
832 7 b
833 8 b1 y a1 x
834 8 b1 y a2 x
835 8 b2 y a1 x
836 8 b2 y a2 x
837 9 a1
838 9 a2
839 9 a3
842 AT_CHECK([echo wat | $JOIN -v1 - /dev/null], [0],
843 [[wat
846 AT_CLEANUP
848 m4_divert_push([PREPARE_TESTS])dnl
849 test_fix_ltdl () {
850   $PERL -e 'my $x = 42; exit $x;'; test $? = 42 || exit 77
851   $PERL "$srcdir/scripts/fix-ltdl.pl" "$@"
853 test_fix_gnulib () {
854   $PERL -e 'my $x = 42; exit $x;'; test $? = 42 || exit 77
855   $PERL "$srcdir/scripts/fix-gnulib.pl" "$@"
857 test_gnulib_mk () {
858   echo;
859   for arg
860   do
861     sed -n -e \
862       "/^## begin gnulib module $arg/,/^## end   gnulib module $arg/p" \
863       "$srcdir/tests/data/gnulib.mk"
864   done
866 m4_divert_pop([PREPARE_TESTS])
868 AT_SETUP([fix-gnulib.pl SED_HEADER variables])
869 AT_KEYWORDS([fix-gnulib perl script scripts])
871 test_gnulib_mk gen-header >test.mk.in
872 AT_CHECK([grep SED_HEADER test.mk.in >expout || exit 99])
873 AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
874 grep SED_HEADER test.mk], [0], [expout])
876 AT_CLEANUP
878 AT_SETUP([fix-gnulib.pl %reldir% substitution])
879 AT_KEYWORDS([fix-gnulib perl script scripts])
881 test_gnulib_mk sys_types >test.mk.in
882 AT_CHECK([grep '%reldir%' test.mk.in >/dev/null || exit 99])
884 sed -n <test.mk.in >expout '
888 /^## begin gnulib/,/^## end   gnulib/!b
889 /^#/{
893 s|(srcdir)|(top_srcdir)|
894 s|%reldir%|lib|
895 s|BUILT_SOURCES|gnulib_core_headers|
896 s|sys[[/_]]|lib/&|g
897 /^MOSTLYCLEANFILES/{
903 AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
904 sed -n -e '/^## begin gnulib/,/^## end   gnulib/p' \
905        -e '/CLEANFILES/p' test.mk],
906 [0], [expout])
908 AT_CLEANUP
910 AT_SETUP([fix-gnulib.pl warning removal])
911 AT_KEYWORDS([fix-gnulib perl script scripts])
913 AT_DATA([test.mk.in], [[
914 ## test begin
915 noinst_LTLIBRARIES += libgnu.la
916 libgnu_la_CFLAGS = $(AM_CFLAGS) $(GL_CFLAG_GNULIB_WARNINGS)
917 noinst_LIBRARIES += libgnu.a
918 libgnu_a_CFLAGS = $(AM_CFLAGS) $(GL_CFLAG_GNULIB_WARNINGS)
919 ## test end
921 AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
922 sed -n '/^## test begin/,/^## test end/p' test.mk], [0], [## test begin
923 EXTRA_LTLIBRARIES += libgnu.la
924 EXTRA_LIBRARIES += libgnu.a
925 ## test end
928 AT_CLEANUP
930 AT_SETUP([fix-gnulib.pl header directory creation])
931 AT_KEYWORDS([fix-gnulib perl script scripts])
933 AT_DATA([extract.sed],
934 [[/AM_V_GEN/b ok
935 /gl_V_at/b ok
936 s/:.*/:/
940 s/'//g
945 s/[)].*/)/
949 test_gnulib_mk alloca-opt sys_types stddef >test.mk.in
950 AT_CHECK([test_fix_gnulib -i test.mk.in -o test.mk || exit
951 sed -n -f extract.sed test.mk], [0],
952 [[lib/alloca.h:
953         $(AM_V_GEN)$(MKDIR_P) lib
954         $(AM_V_at)
955 lib/sys/types.h:
956         $(AM_V_GEN)$(MKDIR_P) lib/sys
957         $(AM_V_at)
958 lib/stddef.h:
959         $(AM_V_GEN)$(MKDIR_P) lib
960         $(AM_V_at)
963 AT_CLEANUP
965 dnl TEST_FIND_AUTOMAKE_VER([to-check], [test-action])
967 dnl For each whitespace-separated version token in to-check, check if we can
968 dnl run the programs automake-VER and aclocal-VER.  The special token 'default'
969 dnl also checks the unversioned automake and aclocal (or, if set in the
970 dnl environment, $AUTOMAKE and $ACLOCAL).
972 dnl Then test-action is expanded such that shell variables $ac and $am refer to
973 dnl the aclocal and automake programs, and $amver is the actual version
974 dnl reported by --version.  The action should do nothing if the version is
975 dnl acceptable, or "continue" if the version is unacceptable.
977 dnl If an acceptable version is found, the AUTOMAKE and ACLOCAL environment
978 dnl variables are set accordingly.  Otherwise, the test group is skipped.
979 m4_define([TEST_FIND_AUTOMAKE],
980 [have_am=false
981 for am in $1; do
982   AS_CASE([$am],
983     [default], [ac=${ACLOCAL-aclocal} am=${AUTOMAKE-automake}],
984     [ac=aclocal-$am; am=automake-$am])
985   amver=`$am --version | sed -n '1s/.* //p'`
986   acver=`$ac --version | sed -n '1s/.* //p'`
987   set x $amver $acver; shift; test x"$[]#" = x"2" || continue
988   test x"$amver" = x"$acver" || continue
989   $2
990   have_am=:; break
991 done
992 AT_CHECK([$have_am || exit 77])
993 AUTOMAKE=$am; export AUTOMAKE
994 ACLOCAL=$ac; export ACLOCAL
995 AT_CHECK([$ACLOCAL --version && $AUTOMAKE --version], [0], [stdout])
998 m4_define([TEST_LTDL_LIBOBJ_MANGLING],
999 [TEST_CONFIGURE_AC([[AM_INIT_AUTOMAKE([foreign subdir-objects])
1000 AC_PROG_CC
1001 LT_INIT
1002 AC_SUBST([ltdl_LTLIBOBJS], [libltdl/test.lo])
1003 AC_CONFIG_FILES([Makefile])
1006 mkdir libltdl
1007 AT_DATA([ltdl.mk.in], [[
1008 AM_CPPFLAGS += -DSTRING=\"helloworld\"
1010 noinst_LTLIBRARIES = libltdl/libltdl.la
1011 libltdl_libltdl_la_SOURCES = libltdl/ltdl.c
1012 libltdl_libltdl_la_LIBADD = $(ltdl_LTLIBOBJS)
1013 libltdl_libltdl_la_DEPENDENCIES = $(ltdl_LTLIBOBJS)
1015 EXTRA_DIST += libltdl/test.c
1017 AT_DATA([Makefile.am], [[AM_CPPFLAGS =
1018 include $(top_srcdir)/ltdl.mk
1019 AM_LIBTOOLFLAGS = --quiet
1020 bin_PROGRAMS = test
1021 test_SOURCES =
1022 test_LDADD = libltdl/libltdl.la
1023 all-local: ; @printf '%s\n' $(AM_CPPFLAGS)
1025 AT_DATA([libltdl/test.c], [[#include <stdio.h>
1026 int foo(void) { printf("%s\n", STRING); return 0; }
1028 AT_DATA([libltdl/ltdl.c], [[int foo(void); int main(void) { return foo(); }
1031 AT_CHECK([test_fix_ltdl -i ltdl.mk.in -o ltdl.mk])
1032 libtoolize; TEST_AUTORECONF
1033 TEST_CONFIGURE([--disable-shared])
1034 AT_CHECK([make -s && ./test], [0], [
1035 helloworld
1036 ])])
1038 AT_SETUP([fix-ltdl.pl LIBOBJ mangling (<automake-1.16)])
1039 AT_KEYWORDS([fix-ltdl perl script scripts])
1041 TEST_FIND_AUTOMAKE([default 1.10 1.11 1.12 1.13 1.14 1.15],
1042   [AS_VERSION_COMPARE(["$amver"], [1.16], [], [continue], [continue])])
1043 TEST_LTDL_LIBOBJ_MANGLING
1045 AT_CLEANUP
1047 AT_SETUP([fix-ltdl.pl LIBOBJ mangling (>=automake-1.16)])
1048 AT_KEYWORDS([fix-ltdl perl script scripts])
1050 TEST_FIND_AUTOMAKE([default 1.16 1.17 1.18 1.19],
1051   [AS_VERSION_COMPARE(["$amver"], [1.16], [continue])])
1052 TEST_LTDL_LIBOBJ_MANGLING
1054 AT_CLEANUP