1ae389aa9SAndy Fiddaman#!/usr/bin/ksh
2ae389aa9SAndy Fiddaman#
3ae389aa9SAndy Fiddaman#
4ae389aa9SAndy Fiddaman# This file and its contents are supplied under the terms of the
5ae389aa9SAndy Fiddaman# Common Development and Distribution License ("CDDL"), version 1.0.
6ae389aa9SAndy Fiddaman# You may only use this file in accordance with the terms of version
7ae389aa9SAndy Fiddaman# 1.0 of the CDDL.
8ae389aa9SAndy Fiddaman#
9ae389aa9SAndy Fiddaman# A full copy of the text of the CDDL should have accompanied this
10ae389aa9SAndy Fiddaman# source.  A copy of the CDDL is also available via the Internet at
11ae389aa9SAndy Fiddaman# http://www.illumos.org/license/CDDL.
12ae389aa9SAndy Fiddaman#
13ae389aa9SAndy Fiddaman
14ae389aa9SAndy Fiddaman#
15ae389aa9SAndy Fiddaman# Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
16ae389aa9SAndy Fiddaman#
17ae389aa9SAndy Fiddaman
18ae389aa9SAndy Fiddaman: "${MAKE:=/usr/bin/make}"
19ae389aa9SAndy Fiddaman: "${FILEDIR:=/opt/util-tests/tests/files}"
20ae389aa9SAndy Fiddaman
21ae389aa9SAndy Fiddaman[[ -d "$FILEDIR" ]] || fail "no files directory $FILEDIR"
22ae389aa9SAndy Fiddaman
23ae389aa9SAndy Fiddamantypeset -i fail=0
24ae389aa9SAndy Fiddaman
25ae389aa9SAndy Fiddamanfunction fail {
26ae389aa9SAndy Fiddaman	echo "FAIL $@"
27ae389aa9SAndy Fiddaman	((fail++))
28ae389aa9SAndy Fiddaman}
29ae389aa9SAndy Fiddaman
30ae389aa9SAndy Fiddamanfunction pass {
31ae389aa9SAndy Fiddaman	echo "PASS $@"
32ae389aa9SAndy Fiddaman}
33ae389aa9SAndy Fiddaman
34ae389aa9SAndy Fiddamanfunction check_results {
35ae389aa9SAndy Fiddaman	typeset expected="$1"
36ae389aa9SAndy Fiddaman	typeset actual="$2"
37ae389aa9SAndy Fiddaman	typeset name="$3"
38ae389aa9SAndy Fiddaman
39ae389aa9SAndy Fiddaman	if ! cmp -s $expected $actual; then
40ae389aa9SAndy Fiddaman		fail "$name"
41ae389aa9SAndy Fiddaman		diff -u "$expected" "$actual" | sed 's/^/    /'
42ae389aa9SAndy Fiddaman	else
43ae389aa9SAndy Fiddaman		pass "$name"
44ae389aa9SAndy Fiddaman	fi
45ae389aa9SAndy Fiddaman}
46ae389aa9SAndy Fiddaman
47ae389aa9SAndy Fiddamantest_make_C() {
48ae389aa9SAndy Fiddaman	TD=$(mktemp -d -t)
49ae389aa9SAndy Fiddaman
50ae389aa9SAndy Fiddaman	if [[ ! -d "$TD" ]]; then
51ae389aa9SAndy Fiddaman		fail "couldn't create test directory $TD"
52ae389aa9SAndy Fiddaman		return
53ae389aa9SAndy Fiddaman	fi
54ae389aa9SAndy Fiddaman
55ae389aa9SAndy Fiddaman	# Create output files corresponding to running make in each directory
56ae389aa9SAndy Fiddaman	# and to running make with a -C argument pointing to the directory.
57ae389aa9SAndy Fiddaman	# The results should be identical.
58ae389aa9SAndy Fiddaman	for s in "" a b c; do
59ae389aa9SAndy Fiddaman		# Baseline - running 'make' in the directory
60ae389aa9SAndy Fiddaman		( cd "$FILEDIR/make_a/$s"; $MAKE ) > $TD/M_a_$s.out 2>&1
61ae389aa9SAndy Fiddaman
62ae389aa9SAndy Fiddaman		# Running 'make -C' from a directory with no make* files
63ae389aa9SAndy Fiddaman		( cd "$TD"; $MAKE -C "$FILEDIR/make_a/$s" ) \
64ae389aa9SAndy Fiddaman		    > $TD/Ce_a_$s.out 2>&1
65ae389aa9SAndy Fiddaman		check_results $TD/{M,Ce}_a_$s.out \
66ae389aa9SAndy Fiddaman		    "make -C a/$s from empty directory"
67ae389aa9SAndy Fiddaman
68ae389aa9SAndy Fiddaman		# Running 'make -C' from a directory WITH make* files
69ae389aa9SAndy Fiddaman		( cd "$FILEDIR/make_a"; $MAKE -C "$FILEDIR/make_a/$s" ) \
70ae389aa9SAndy Fiddaman		    > $TD/C_a_$s.out 2>&1
71ae389aa9SAndy Fiddaman		check_results $TD/{M,C}_a_$s.out \
72ae389aa9SAndy Fiddaman		    "make -C a/$s from non-empty directory"
73ae389aa9SAndy Fiddaman
74ae389aa9SAndy Fiddaman		# Using MAKEFLAGS from a directory with no make* files
75ae389aa9SAndy Fiddaman		( cd "$TD"; MAKEFLAGS="-C $FILEDIR/make_a/$s" $MAKE) \
76ae389aa9SAndy Fiddaman		    > $TD/Fe_a_$s.out 2>&1
77ae389aa9SAndy Fiddaman		check_results $TD/{M,Fe}_a_$s.out \
78ae389aa9SAndy Fiddaman		    "makeflags -C a/$s from empty directory"
79ae389aa9SAndy Fiddaman
80ae389aa9SAndy Fiddaman		# Using MAKEFLAGS from a directory WITH make* files
81ae389aa9SAndy Fiddaman		( cd "$FILEDIR/make_a"; \
82ae389aa9SAndy Fiddaman		    MAKEFLAGS="-C $FILEDIR/make_a/$s" $MAKE) \
83ae389aa9SAndy Fiddaman		    > $TD/F_a_$s.out 2>&1
84ae389aa9SAndy Fiddaman		check_results $TD/{M,F}_a_$s.out \
85ae389aa9SAndy Fiddaman		    "makeflags -C a/$s from non-empty directory"
86ae389aa9SAndy Fiddaman	done
87ae389aa9SAndy Fiddaman
88ae389aa9SAndy Fiddaman	rm -rf "$TD"
89ae389aa9SAndy Fiddaman}
90ae389aa9SAndy Fiddaman
91ae389aa9SAndy Fiddamantest_make_C_multiple() {
92ae389aa9SAndy Fiddaman	TD=$(mktemp -d -t)
93ae389aa9SAndy Fiddaman
94ae389aa9SAndy Fiddaman	if [[ ! -d "$TD" ]]; then
95ae389aa9SAndy Fiddaman		fail "couldn't create test directory $TD"
96ae389aa9SAndy Fiddaman		return
97ae389aa9SAndy Fiddaman	fi
98ae389aa9SAndy Fiddaman
99ae389aa9SAndy Fiddaman	# Expected output
100ae389aa9SAndy Fiddaman	( cd "$FILEDIR/make_a/b"; $MAKE ) > $TD/expect 2>&1
101ae389aa9SAndy Fiddaman
102ae389aa9SAndy Fiddaman	# Running 'make -C' from a directory with no make* files
103ae389aa9SAndy Fiddaman	( cd "$TD"; $MAKE -C $FILEDIR/make_a/a -C $FILEDIR/make_a/b ) \
104ae389aa9SAndy Fiddaman	    > $TD/empty 2>&1
105ae389aa9SAndy Fiddaman	check_results $TD/{expect,empty} "make -C -C from empty directory"
106ae389aa9SAndy Fiddaman
107ae389aa9SAndy Fiddaman	# Running 'make -C' from a directory WITH make* files
108ae389aa9SAndy Fiddaman	( cd "$FILEDIR/make_a"; \
109ae389aa9SAndy Fiddaman	    $MAKE -C $FILEDIR/make_a/a -C $FILEDIR/make_a/b ) \
110ae389aa9SAndy Fiddaman	    > $TD/with 2>&1
111ae389aa9SAndy Fiddaman	check_results $TD/{expect,with} "make -C -C from non-empty directory"
112ae389aa9SAndy Fiddaman
113ae389aa9SAndy Fiddaman	# Using MAKEFLAGS from a directory with no make* files
114ae389aa9SAndy Fiddaman	( cd "$TD";
115ae389aa9SAndy Fiddaman	    MAKEFLAGS="-C $FILEDIR/make_a/a -C $FILEDIR/make_a/b" $MAKE ) \
116ae389aa9SAndy Fiddaman	    > $TD/emptyflags 2>&1
117ae389aa9SAndy Fiddaman	check_results $TD/{expect,emptyflags} \
118ae389aa9SAndy Fiddaman	    "makeflags -C -C from empty directory"
119ae389aa9SAndy Fiddaman
120ae389aa9SAndy Fiddaman	# Using MAKEFLAGS from a directory WITH make* files
121ae389aa9SAndy Fiddaman	( cd "$FILEDIR/make_a";
122ae389aa9SAndy Fiddaman	    MAKEFLAGS="-C $FILEDIR/make_a/a -C $FILEDIR/make_a/b" $MAKE ) \
123ae389aa9SAndy Fiddaman	    > $TD/withflags 2>&1
124ae389aa9SAndy Fiddaman	check_results $TD/{expect,withflags} \
125ae389aa9SAndy Fiddaman	    "makeflags -C -C from non-empty directory"
126ae389aa9SAndy Fiddaman
127ae389aa9SAndy Fiddaman	( cd "$FILEDIR/make_l"; $MAKE -C ../make_a/a -C ../b ) \
128ae389aa9SAndy Fiddaman	    > $TD/relative 2>&1
129ae389aa9SAndy Fiddaman	check_results $TD/{expect,relative} \
130ae389aa9SAndy Fiddaman	    "make -C -C relative from empty directory"
131ae389aa9SAndy Fiddaman
132ae389aa9SAndy Fiddaman	rm -rf "$TD"
133ae389aa9SAndy Fiddaman}
134ae389aa9SAndy Fiddaman
135ae389aa9SAndy Fiddamantest_make_C_invalid() {
136ae389aa9SAndy Fiddaman	outf=$(mktemp)
137ae389aa9SAndy Fiddaman
138ae389aa9SAndy Fiddaman	tst="make -C error"
139ae389aa9SAndy Fiddaman	$MAKE -C > $outf 2>&1 && fail "$tst" || pass "$tst"
140ae389aa9SAndy Fiddaman	egrep -s 'Missing argument' $outf && pass "$tst (output)" \
141ae389aa9SAndy Fiddaman	    || fail "$tst (output)"
142ae389aa9SAndy Fiddaman
143ae389aa9SAndy Fiddaman	tst="MAKEFLAGS=-C error"
144ae389aa9SAndy Fiddaman	MAKEFLAGS="-C" $MAKE > $outf 2>&1 && fail "$tst" || pass "$tst"
145ae389aa9SAndy Fiddaman	egrep -s 'Missing argument' $outf && pass "$tst (output)" \
146ae389aa9SAndy Fiddaman	    || fail "$tst (output)"
147ae389aa9SAndy Fiddaman
148ae389aa9SAndy Fiddaman	tst="make -C <noexist>"
149ae389aa9SAndy Fiddaman	$MAKE -C /no/such/directory > $outf 2>&1 && fail "$tst" || pass "$tst"
150ae389aa9SAndy Fiddaman	egrep -s 'No such file or directory' $outf && pass "$tst (output)" \
151ae389aa9SAndy Fiddaman	    || fail "$tst (output)"
152ae389aa9SAndy Fiddaman
153ae389aa9SAndy Fiddaman	tst="MAKEFLAGS=-C <noexist>"
154ae389aa9SAndy Fiddaman	MAKEFLAGS="-C /no/such/directory" $MAKE > $outf 2>&1 && fail "$tst" \
155ae389aa9SAndy Fiddaman	    || pass "$tst"
156ae389aa9SAndy Fiddaman	egrep -s 'No such file or directory' $outf  && pass "$tst (output)" \
157ae389aa9SAndy Fiddaman	    || fail "$tst (output)"
158ae389aa9SAndy Fiddaman
159ae389aa9SAndy Fiddaman	rm -f $outf
160ae389aa9SAndy Fiddaman}
161ae389aa9SAndy Fiddaman
162ae389aa9SAndy Fiddamantest_make_C
163ae389aa9SAndy Fiddamantest_make_C_multiple
164ae389aa9SAndy Fiddamantest_make_C_invalid
165ae389aa9SAndy Fiddaman
166ae389aa9SAndy Fiddaman[[ $fail -gt 0 ]] && exit -1
167ae389aa9SAndy Fiddaman
168*e7253420SAndy Fiddamanexit 0
169*e7253420SAndy Fiddaman
170