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