1b30d1939SAndy Fiddaman/*
2b30d1939SAndy Fiddaman * ksh makefile
3b30d1939SAndy Fiddaman */
4b30d1939SAndy Fiddaman
5b30d1939SAndy FiddamanSH := $(PWD:B:/[0-9]*$//:N=ksh*:-ksh)		/* name of the shell program */
6b30d1939SAndy FiddamanVERSION = 1.1
7b30d1939SAndy FiddamanLICENSE = since=1982,author=dgk
8b30d1939SAndy FiddamanCATALOG = libshell
9b30d1939SAndy FiddamanERROR_CONTEXT_T == Error_context_t /* workaround until switch from errorpush()/errorpop() => errorctx() */
10b30d1939SAndy FiddamanRELEASE := $(SH:/.*sh//)
11b30d1939SAndy FiddamanSHCOMP := shcomp$(RELEASE)
12b30d1939SAndy Fiddaman
13b30d1939SAndy Fiddaman/*
14b30d1939SAndy Fiddaman * set these variables to 1 to enable, 0 to disable, null to probe
15b30d1939SAndy Fiddaman * override SHOPT_foo=1 can be placed one per line in the build dir Makeargs
16b30d1939SAndy Fiddaman */
17b30d1939SAndy Fiddaman
18b30d1939SAndy FiddamanSHOPT_2DMATCH == 1		/* two dimensional .sh.match for ${var//pat/str} */
19b30d1939SAndy FiddamanSHOPT_ACCT ==  			/* accounting */
20b30d1939SAndy FiddamanSHOPT_ACCTFILE ==  		/* per user accounting info */
21b30d1939SAndy FiddamanSHOPT_AUDIT == 1		/* enable auditing per SHOPT_AUDITFILE */
22b30d1939SAndy FiddamanSHOPT_AUDITFILE == "/etc/ksh_audit"  		/* auditing file */
23b30d1939SAndy FiddamanSHOPT_BASH ==			/* bash compatibility code */
24b30d1939SAndy FiddamanSHOPT_BGX == 1			/* one SIGCHLD trap per completed job */
25b30d1939SAndy FiddamanSHOPT_BRACEPAT == 1		/* C-shell {...,...} expansions (, required) */
26b30d1939SAndy FiddamanSHOPT_CMDLIB_HDR ==		/* -lcmd builtin list (<cmdlist.h>) */
27b30d1939SAndy FiddamanSHOPT_CMDLIB_DIR ==		/* SHOPT_CMDLIB_HDR directory prefix (default "/opt/ast/bin") */
28b30d1939SAndy FiddamanSHOPT_COSHELL == 1		/* build with connection to coshell */
29b30d1939SAndy FiddamanSHOPT_CRNL ==			/* accept <cr><nl> for <nl> */
30b30d1939SAndy FiddamanSHOPT_DYNAMIC == 1		/* dynamic loading for builtins */
31b30d1939SAndy FiddamanSHOPT_ECHOPRINT ==		/* make echo equivalent to print */
32b30d1939SAndy FiddamanSHOPT_EDPREDICT == 1		/* predictive editing  */
33b30d1939SAndy FiddamanSHOPT_ESH == 1			/* emacs/gmacs edit mode */
34b30d1939SAndy FiddamanSHOPT_FILESCAN == 1		/* fast file scan */
35b30d1939SAndy FiddamanSHOPT_FIXEDARRAY == 1		/* fixed dimension indexed array */
36b30d1939SAndy FiddamanSHOPT_FS_3D == 			/* 3d file system */
37b30d1939SAndy FiddamanSHOPT_HISTEXPAND == 1		/* csh-style history file expansions */
38b30d1939SAndy FiddamanSHOPT_KIA == 1			/* shell information database generation */
39b30d1939SAndy FiddamanSHOPT_MULTIBYTE == 1		/* multibyte character handling */
40b30d1939SAndy FiddamanSHOPT_NAMESPACE == 1		/* allow namespaces */
41b30d1939SAndy FiddamanSHOPT_OLDTERMIO ==		/* support both TCGETA and TCGETS */
42b30d1939SAndy FiddamanSHOPT_OPTIMIZE == 1		/* optimize loop invariants */
43*bbf21555SRichard LoweSHOPT_PFSH == 1			/* solaris exec_attr(5) profile execution */
44b30d1939SAndy FiddamanSHOPT_P_SUID ==			/* real uid's that require -p for set[ug]id */
45b30d1939SAndy FiddamanSHOPT_RAWONLY == 1		/* make viraw the only vi mode */
46b30d1939SAndy FiddamanSHOPT_REGRESS ==		/* enable __regress__ builtin and instrumented intercepts for testing */
47b30d1939SAndy FiddamanSHOPT_REMOTE ==			/* enable --rc if running as a remote shell */
48b30d1939SAndy FiddamanSHOPT_SEVENBIT ==		/* strip the eigth bit from characters */
49b30d1939SAndy FiddamanSHOPT_SPAWN ==			/* use spawnveg for fork/exec */
50b30d1939SAndy FiddamanSHOPT_STATS ==	1		/* add .sh.stats variable */
51b30d1939SAndy FiddamanSHOPT_SUID_EXEC == 1		/* allow (safe) suid/sgid shell scripts */
52b30d1939SAndy FiddamanSHOPT_SYSRC ==			/* attempt . /etc/ksh.kshrc if interactive */
53b30d1939SAndy FiddamanSHOPT_TIMEOUT ==		/* number of seconds for shell timeout */
54b30d1939SAndy FiddamanSHOPT_TYPEDEF == 1		/* enable typeset type definitions */
55b30d1939SAndy FiddamanSHOPT_VSH == 1			/* vi edit mode */
56b30d1939SAndy Fiddaman
57b30d1939SAndy Fiddamanif CC.HOSTTYPE == "linux.alpha"
58b30d1939SAndy Fiddaman	/* workaround for "BUG IN DYNAMIC LINKER ld.so" */
59b30d1939SAndy Fiddaman	:PACKAGE: - m:static:noinclude /*noCC.EXPORT.DYNAMIC*/
60b30d1939SAndy Fiddamanend
61b30d1939SAndy Fiddaman
62b30d1939SAndy Fiddamanif CC.HOSTTYPE == "*.s390-64"
63b30d1939SAndy Fiddaman	CC.DLL = $(CC.DLLBIG)
64b30d1939SAndy Fiddamanend
65b30d1939SAndy Fiddaman
66b30d1939SAndy Fiddamanif SHOPT_DYNAMIC && ( "$(CC.DIALECT:N=EXPORT=DLL)" || "$(PACKAGE_OPTIONS:N=optimize-space)" )
67b30d1939SAndy Fiddaman	if "$(PACKAGE_OPTIONS:N=optimize-space)" && ! SHOPT_CMDLIB_HDR
68b30d1939SAndy Fiddaman		SHOPT_CMDLIB_HDR == <cmdlist.h>
69b30d1939SAndy Fiddaman	end
70b30d1939SAndy Fiddaman	CCFLAGS += $$(CC.DLL) $$(CC.SUFFIX.DEBUG:+$$(CC.DEBUG))
71b30d1939SAndy Fiddaman	LIBS_req = -lshell$(RELEASE)
72b30d1939SAndy Fiddamanelse
73b30d1939SAndy Fiddaman	if VARIANT
74b30d1939SAndy Fiddaman		SHOPT_DYNAMIC = 1
75b30d1939SAndy Fiddaman	else
76b30d1939SAndy Fiddaman		libtype = :static
77b30d1939SAndy Fiddaman	end
78b30d1939SAndy Fiddaman	if SHOPT_DYNAMIC
79b30d1939SAndy Fiddaman		CCLDFLAGS += $$(CC.EXPORT.DYNAMIC)
80b30d1939SAndy Fiddaman	end
81b30d1939SAndy Fiddaman	LIBS_req = +lshell$(RELEASE)
82b30d1939SAndy Fiddamanend
83b30d1939SAndy Fiddaman
84b30d1939SAndy Fiddaman:PACKAGE: ast$(libtype):20100309 coshell:order --clobber=!($(SH))
85b30d1939SAndy Fiddaman
86b30d1939SAndy Fiddaman.SOURCE : edit sh bltins data tests fun
87b30d1939SAndy Fiddaman.SOURCE.h : include
88b30d1939SAndy Fiddaman
89b30d1939SAndy Fiddaman/* documentation files */
90b30d1939SAndy FiddamanDOCFILES = sh.memo builtins.mm README RELEASE TYPES PROMO.mm COMPATIBILITY \
91b30d1939SAndy Fiddaman		DESIGN OBSOLETE RELEASE93 RELEASE88
92b30d1939SAndy Fiddaman
93b30d1939SAndy FiddamanKSHELL == 1			/* this is ksh */
94b30d1939SAndy Fiddaman
95b30d1939SAndy FiddamanSH_CMDLIB_DIR ==		/* SHOPT_CMDLIB_DIR dir prefix */
96b30d1939SAndy FiddamanSH_DICT ==			/* message catalog */
97b30d1939SAndy FiddamanDEBUG ==			/* debugging purposes only */
98b30d1939SAndy Fiddaman
99b30d1939SAndy Fiddamanif  CC.HOSTTYPE == "win32*"
100b30d1939SAndy Fiddaman	SHOPT_CRNL == 1		/* <cr><nl> is eqivalent to <nl> */
101b30d1939SAndy Fiddamanend
102b30d1939SAndy Fiddaman
103b30d1939SAndy Fiddamanif SHOPT_BASH
104b30d1939SAndy Fiddaman	BASH_HOSTTYPE == "$(CC.HOSTTYPE:S:/\.//)"
105b30d1939SAndy Fiddaman	BASH_MACHTYPE == "$(BASH_HOSTTYPE)-unknown-$(CC.HOSTTYPE:B)"
106b30d1939SAndy Fiddamanend
107b30d1939SAndy Fiddaman
108b30d1939SAndy Fiddaman/* use the following libraries only if they exist */
109b30d1939SAndy FiddamanLIBS_opt := +ljobs +li
110b30d1939SAndy Fiddaman
111b30d1939SAndy Fiddamanif  CC.HOSTTYPE == "sol([89]|[1-9][0-9]).*"
112b30d1939SAndy Fiddaman	LDFLAGS  += $(CC.LD.LAZY) $(CC.LD.NORECORD)
113b30d1939SAndy Fiddamanend
114b30d1939SAndy Fiddaman
115b30d1939SAndy Fiddamanif "$(-mam:N=static*)"
116b30d1939SAndy Fiddaman	LIBS_opt += -lsocket -lnsl
117b30d1939SAndy Fiddamanelif CC.HOSTTYPE == "sol?([789]|[1-9][0-9]).*"
118b30d1939SAndy Fiddaman	LIBS_opt += +lsocket -lnsl
119b30d1939SAndy Fiddamanelif CC.HOSTTYPE != "sgi.mips*"
120b30d1939SAndy Fiddaman	LIBS_opt += +lsocket +lnsl
121b30d1939SAndy Fiddamanend
122b30d1939SAndy Fiddamanif CC.HOSTTYPE == "linux.sparc*"
123b30d1939SAndy Fiddaman	/* the linux.sparc linker still has some problems */
124b30d1939SAndy Fiddaman	LIBS_opt += -ldll
125b30d1939SAndy Fiddamanend
126b30d1939SAndy FiddamanLIBS_opt += -lsecdb
127b30d1939SAndy Fiddamanif CC.HOSTTYPE == "sol.*"
128b30d1939SAndy Fiddaman	LIBS_opt += -lw
129b30d1939SAndy Fiddamanend
130b30d1939SAndy Fiddaman$(LIBS_opt)	: .DONTCARE
131b30d1939SAndy Fiddaman
132b30d1939SAndy FiddamanLDLIBRARIES = $(LIBS_opt)
133b30d1939SAndy Fiddaman
134b30d1939SAndy FiddamanFILES_opt =		/* optional file list enabled by vars above */
135b30d1939SAndy Fiddamanif SHOPT_ESH
136b30d1939SAndy Fiddaman	FILES_opt += emacs.c
137b30d1939SAndy Fiddamanend
138b30d1939SAndy Fiddamanif SHOPT_VSH
139b30d1939SAndy Fiddaman	FILES_opt += vi.c
140b30d1939SAndy Fiddamanend
141b30d1939SAndy Fiddamanif SHOPT_BASH
142b30d1939SAndy Fiddaman	FILES_opt += bash.c bash_pre_rc.c
143b30d1939SAndy Fiddaman	SHOPT_HISTEXPAND == 1
144b30d1939SAndy Fiddamanend
145b30d1939SAndy Fiddamanif SHOPT_HISTEXPAND
146b30d1939SAndy Fiddaman	FILES_opt += hexpand.c
147b30d1939SAndy Fiddamanend
148b30d1939SAndy Fiddamanif SHOPT_DYNAMIC
149b30d1939SAndy Fiddaman	FILES_opt += -ldll
150b30d1939SAndy Fiddamanend
151b30d1939SAndy Fiddamanif SHOPT_X
152b30d1939SAndy Fiddaman	LDFLAGS += -u _XtAppInitialize -L/usr/add-on/X11/lib
153b30d1939SAndy Fiddamanend
154b30d1939SAndy Fiddaman
155b30d1939SAndy Fiddaman:ALL: $(SH) $(SHCOMP) $(SHOPT_SUID_EXEC:+suid_exec) $(SHOPT_BASH:+bash$(RELEASE))
156b30d1939SAndy Fiddaman
157b30d1939SAndy Fiddaman$(SH) :: sh.1 pmain.c $(LIBS_req)
158b30d1939SAndy Fiddaman
159b30d1939SAndy FiddamanDATAFILES = limits.c msg.c strdata.c testops.c keywords.c options.c \
160b30d1939SAndy Fiddaman                 signals.c aliases.c builtins.c variables.c lexstates.c
161b30d1939SAndy Fiddaman
162b30d1939SAndy Fiddamanshell$(RELEASE) $(VERSION) id=shell :LIBRARY: shell.3 nval.3 alarm.c cd_pwd.c cflow.c deparse.c \
163b30d1939SAndy Fiddaman	enum.c getopts.c hist.c misc.c print.c read.c sleep.c trap.c test.c \
164b30d1939SAndy Fiddaman	typeset.c ulimit.c umask.c whence.c main.c nvdisc.c nvtype.c \
165b30d1939SAndy Fiddaman	arith.c args.c array.c completion.c defs.c edit.c expand.c regress.c \
166b30d1939SAndy Fiddaman	fault.c fcin.c history.c init.c io.c jobs.c lex.c macro.c name.c \
167b30d1939SAndy Fiddaman	nvtree.c parse.c path.c string.c streval.c subshell.c tdump.c timers.c \
168b30d1939SAndy Fiddaman	trestore.c waitevent.c xec.c env.c $(DATAFILES) $(FILES_opt) \
169b30d1939SAndy Fiddaman	$(SHOPT_COSHELL:+-lcoshell) -lcmd -last -lm
170b30d1939SAndy Fiddaman
171b30d1939SAndy Fiddaman"sol*.i386*"	:NOOPTIMIZE: main.c
172b30d1939SAndy Fiddaman"win32*"	:NOOPTIMIZE: strdata.c trestore.c
173b30d1939SAndy Fiddaman
174b30d1939SAndy Fiddamanif CC.HOSTTYPE == "win32*"
175b30d1939SAndy Fiddaman:DLL: $(CC.DEBUG)
176b30d1939SAndy Fiddamanelse
177b30d1939SAndy Fiddaman:DLL: $(CC.OPTIMIZE)
178b30d1939SAndy Fiddamanend
179b30d1939SAndy Fiddaman
180b30d1939SAndy Fiddaman:READONLY: $(DATAFILES)
181b30d1939SAndy Fiddaman
182b30d1939SAndy Fiddaman$(INCLUDEDIR) :INSTALLPROTO: nval.h shell.h history.h
183b30d1939SAndy Fiddaman
184b30d1939SAndy FiddamanLIBCMD = $(.LIB.NAME. cmd:T=F)
185b30d1939SAndy Fiddaman
186b30d1939SAndy Fiddamanif SHOPT_SUID_EXEC && ! "$(RELEASE)"
187b30d1939SAndy Fiddamansuid_exec ::	CC.DLL= suid_exec.c +last
188b30d1939SAndy Fiddamanend
189b30d1939SAndy Fiddaman
190b30d1939SAndy Fiddaman$(SHCOMP) ::	CC.DLL= SH_DICT='"libshell"' shcomp.c $(LIBS_req)
191b30d1939SAndy Fiddaman
192b30d1939SAndy Fiddaman$(FUNDIR) :INSTALLDIR: mode=+x dirs popd pushd
193b30d1939SAndy Fiddaman
194b30d1939SAndy Fiddamanshcomp.o : _BLD_DLL= $(CC.HOSTTYPE:N=cygwin.*:??_BLD_shell=?)
195b30d1939SAndy Fiddaman
196b30d1939SAndy Fiddamanif SHOPT_BASH
197b30d1939SAndy Fiddaman
198b30d1939SAndy Fiddamanbash$(RELEASE) :LINK: $(SH)
199b30d1939SAndy Fiddaman
200b30d1939SAndy Fiddamanbash_pre_rc.c : bash_pre_rc.sh
201b30d1939SAndy Fiddaman	echo "const char bash_pre_rc[] = " > $(<)
202b30d1939SAndy Fiddaman	sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/'"'"'/\\'"'"'/g' -e 's/^[[:space:]]*\(.*\)$/\"\1\\n\"/' $(*) >> $(<)
203b30d1939SAndy Fiddaman	echo ";" >> $(<)
204b30d1939SAndy Fiddaman
205b30d1939SAndy Fiddamanend
206b30d1939SAndy Fiddaman
207b30d1939SAndy Fiddaman:: math.tab syscall.s mamexec mamstate.c $(DOCFILES) \
208b30d1939SAndy Fiddaman	bash.c bash_pre_rc.sh hexpand.c mkservice.c \
209b30d1939SAndy Fiddaman	shopen.mk shopen.c
210b30d1939SAndy Fiddaman
211b30d1939SAndy Fiddaman:: shtests \
212b30d1939SAndy Fiddaman	alias.sh append.sh arith.sh arrays.sh arrays2.sh \
213b30d1939SAndy Fiddaman	attributes.sh basic.sh bracket.sh builtins.sh case.sh \
214b30d1939SAndy Fiddaman	comvar.sh comvario.sh coprocess.sh cubetype.sh enum.sh exit.sh \
215b30d1939SAndy Fiddaman	expand.sh functions.sh glob.sh grep.sh heredoc.sh io.sh \
216b30d1939SAndy Fiddaman	leaks.sh locale.sh math.sh nameref.sh namespace.sh options.sh \
217b30d1939SAndy Fiddaman	path.sh pointtype.sh pty.sh quoting.sh quoting2.sh readcsv.sh \
218b30d1939SAndy Fiddaman	recttype.sh restricted.sh return.sh select.sh shtests \
219b30d1939SAndy Fiddaman	sigchld.sh signal.sh statics.sh subshell.sh substring.sh \
220b30d1939SAndy Fiddaman	tilde.sh timetype.sh treemove.sh types.sh variables.sh \
221b30d1939SAndy Fiddaman	vartree1.sh vartree2.sh
222b30d1939SAndy Fiddaman
223b30d1939SAndy Fiddaman:: ksh-regress.rt ksh-regress.tst
224b30d1939SAndy Fiddaman
225b30d1939SAndy Fiddamanif "$(PWD:B:N=cc-*)"
226b30d1939SAndy Fiddaman
227b30d1939SAndy Fiddamantest : .NULL
228b30d1939SAndy Fiddaman
229b30d1939SAndy Fiddamanelse
230b30d1939SAndy Fiddaman
231b30d1939SAndy Fiddamantest : test.ksh
232b30d1939SAndy Fiddaman
233b30d1939SAndy Fiddamantest.ksh : $(BINDIR)/$(SH) $(SH) shtests
234b30d1939SAndy Fiddaman	$(SILENT) $(CMP) $(CMPFLAGS) $(*:O=1) $(*:O=2) 2>/dev/null ||
235b30d1939SAndy Fiddaman	echo "make install to run the tests on the latest $(SH)" >&2
236b30d1939SAndy Fiddaman	cd $(*:O=3:P=L!:D)
237b30d1939SAndy Fiddaman	SHELL=$(*:O=1:P=A) $(*:O=1:P=A) $(*:O=3:B) $(SHTESTSFLAGS)
238b30d1939SAndy Fiddaman
239b30d1939SAndy Fiddamantest.% : %.sh COSHELL_OPTIONS=separate $(BINDIR)/$(SH) $(SH) shtests
240b30d1939SAndy Fiddaman	$(SILENT) $(CMP) $(CMPFLAGS) $(*:O=2) $(*:O=3) 2>/dev/null ||
241b30d1939SAndy Fiddaman	echo "make install to run the tests on the latest $(SH)" >&2
242b30d1939SAndy Fiddaman	cd $(*:O=4:P=L!:D)
243b30d1939SAndy Fiddaman	SHELL=$(*:O=2:P=A) $(*:O=2:P=A) $(*:O=4:B) $(SHTESTSFLAGS) $(*:O=1:P=A)
244b30d1939SAndy Fiddaman
245b30d1939SAndy Fiddamanif RELEASE
246b30d1939SAndy Fiddaman
247b30d1939SAndy Fiddaman.INSTALL : .CLEAR $(*.INSTALL:N=*$(RELEASE)*([!/]))
248b30d1939SAndy Fiddaman
249b30d1939SAndy Fiddamanend
250b30d1939SAndy Fiddaman
251b30d1939SAndy Fiddamanend
252