1# SPDX-License-Identifier: BSD-2-Clause
2#
3# $Id: suffixes.mk,v 1.3 2024/02/17 17:26:57 sjg Exp $
4#
5#	@(#) Copyright (c) 2024, Simon J. Gerraty
6#
7#	This file is provided in the hope that it will
8#	be of use.  There is absolutely NO WARRANTY.
9#	Permission to copy, redistribute or otherwise
10#	use this file is hereby granted provided that
11#	the above copyright notice and this notice are
12#	left intact.
13#
14#	Please send copies of changes and bug-fixes to:
15#	sjg@crufty.net
16#
17
18# some reasonable defaults
19.SUFFIXES: .out .a .ln .o ${PICO} ${PCM} .s .S .c ${CXX_SUFFIXES} \
20	${CCM_SUFFIXES} .F .f .r .y .l .cl .p .h \
21	.sh .m4 .cpp-out
22
23#
24AFLAGS ?=
25ARFLAGS ?=	r
26.if ${MACHINE_ARCH} == "sparc64"
27AFLAGS+= -Wa,-Av9a
28.endif
29AS ?=		as
30CC ?=		cc
31CFLAGS ?=	${DBG}
32CXX ?=		c++
33CXXFLAGS ?=	${CFLAGS}
34CXXFLAGS ?=	${CFLAGS}
35DBG ?=		-O2
36FC ?=		f77
37FFLAGS ?=	-O
38INSTALL ?=	install
39LD ?=		ld
40LEX ?=		lex
41LFLAGS ?=
42NM ?=		nm
43OBJC ?=		${CC}
44OBJCFLAGS ?=	${CFLAGS}
45PC ?=		pc
46PFLAGS ?=
47RFLAGS ?=
48SIZE ?=		size
49YACC ?=		yacc
50YFLAGS ?=
51
52COMPILE.s ?=	${CC} ${AFLAGS} -c
53LINK.s ?=	${CC} ${AFLAGS} ${LDFLAGS}
54COMPILE.S ?=	${CC} ${AFLAGS} ${CPPFLAGS} -c -traditional-cpp
55LINK.S ?=	${CC} ${AFLAGS} ${CPPFLAGS} ${LDFLAGS}
56COMPILE.c ?=	${CC} ${CFLAGS} ${CPPFLAGS} -c
57LINK.c ?=	${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}
58COMPILE.cc ?=	${CXX} ${CXXFLAGS} ${CPPFLAGS} -c
59COMPILE.pcm ?=	${COMPILE.cc:N-c} --precompile -c
60LINK.cc ?=	${CXX} ${CXXFLAGS} ${CPPFLAGS} ${LDFLAGS}
61COMPILE.m ?=	${OBJC} ${OBJCFLAGS} ${CPPFLAGS} -c
62LINK.m ?=	${OBJC} ${OBJCFLAGS} ${CPPFLAGS} ${LDFLAGS}
63COMPILE.f ?=	${FC} ${FFLAGS} -c
64LINK.f ?=	${FC} ${FFLAGS} ${LDFLAGS}
65COMPILE.F ?=	${FC} ${FFLAGS} ${CPPFLAGS} -c
66LINK.F ?=	${FC} ${FFLAGS} ${CPPFLAGS} ${LDFLAGS}
67COMPILE.r ?=	${FC} ${FFLAGS} ${RFLAGS} -c
68LINK.r ?=	${FC} ${FFLAGS} ${RFLAGS} ${LDFLAGS}
69LEX.l ?=	${LEX} ${LFLAGS}
70COMPILE.p ?=	${PC} ${PFLAGS} ${CPPFLAGS} -c
71LINK.p ?=	${PC} ${PFLAGS} ${CPPFLAGS} ${LDFLAGS}
72YACC.y ?=	${YACC} ${YFLAGS}
73LEX.l ?=	${LEX} ${LFLAGS}
74
75# C
76.c:
77	${LINK.c} -o ${.TARGET} ${.IMPSRC} ${LDLIBS}
78.c.o:
79	${COMPILE.c} ${.IMPSRC}
80.c.a:
81	${COMPILE.c} ${.IMPSRC}
82	${AR} ${ARFLAGS} $@ $*.o
83	rm -f $*.o
84.c.ln:
85	${LINT} ${LINTFLAGS} ${CPPFLAGS:M-[IDU]*} -i ${.IMPSRC}
86
87# C++
88${CXX_SUFFIXES}:
89	${LINK.cc} -o ${.TARGET} ${.IMPSRC} ${LDLIBS}
90${CXX_SUFFIXES:%=%.o}:
91	${COMPILE.cc} ${.IMPSRC}
92${CXX_SUFFIXES:%=%.a}:
93	${COMPILE.cc} ${.IMPSRC}
94	${AR} ${ARFLAGS} $@ $*.o
95	rm -f $*.o
96
97# C++ precompiled modules
98${CCM_SUFFIXES:%=%${PCM}}:
99	@${COMPILE.pcm} ${.IMPSRC}
100
101# Fortran/Ratfor
102.f:
103	${LINK.f} -o ${.TARGET} ${.IMPSRC} ${LDLIBS}
104.f.o:
105	${COMPILE.f} ${.IMPSRC}
106.f.a:
107	${COMPILE.f} ${.IMPSRC}
108	${AR} ${ARFLAGS} $@ $*.o
109	rm -f $*.o
110
111.F:
112	${LINK.F} -o ${.TARGET} ${.IMPSRC} ${LDLIBS}
113.F.o:
114	${COMPILE.F} ${.IMPSRC}
115.F.a:
116	${COMPILE.F} ${.IMPSRC}
117	${AR} ${ARFLAGS} $@ $*.o
118	rm -f $*.o
119
120.r:
121	${LINK.r} -o ${.TARGET} ${.IMPSRC} ${LDLIBS}
122.r.o:
123	${COMPILE.r} ${.IMPSRC}
124.r.a:
125	${COMPILE.r} ${.IMPSRC}
126	${AR} ${ARFLAGS} $@ $*.o
127	rm -f $*.o
128
129# Pascal
130.p:
131	${LINK.p} -o ${.TARGET} ${.IMPSRC} ${LDLIBS}
132.p.o:
133	${COMPILE.p} ${.IMPSRC}
134.p.a:
135	${COMPILE.p} ${.IMPSRC}
136	${AR} ${ARFLAGS} $@ $*.o
137	rm -f $*.o
138
139# Assembly
140.s:
141	${LINK.s} -o ${.TARGET} ${.IMPSRC} ${LDLIBS}
142.s.o:
143	${COMPILE.s} ${.IMPSRC}
144.s.a:
145	${COMPILE.s} ${.IMPSRC}
146	${AR} ${ARFLAGS} $@ $*.o
147	rm -f $*.o
148.S:
149	${LINK.S} -o ${.TARGET} ${.IMPSRC} ${LDLIBS}
150.S.o:
151	${COMPILE.S} ${.IMPSRC}
152.S.a:
153	${COMPILE.S} ${.IMPSRC}
154	${AR} ${ARFLAGS} $@ $*.o
155	rm -f $*.o
156
157# Lex
158.l:
159	${LEX.l} ${.IMPSRC}
160	${LINK.c} -o ${.TARGET} lex.yy.c ${LDLIBS} -ll
161	rm -f lex.yy.c
162.l.c:
163	${LEX.l} ${.IMPSRC}
164	mv lex.yy.c ${.TARGET}
165.l.o:
166	${LEX.l} ${.IMPSRC}
167	${COMPILE.c} -o ${.TARGET} lex.yy.c
168	rm -f lex.yy.c
169
170# Yacc
171.y:
172	${YACC.y} ${.IMPSRC}
173	${LINK.c} -o ${.TARGET} y.tab.c ${LDLIBS}
174	rm -f y.tab.c
175.y.c:
176	${YACC.y} ${.IMPSRC}
177	mv y.tab.c ${.TARGET}
178.y.o:
179	${YACC.y} ${.IMPSRC}
180	${COMPILE.c} -o ${.TARGET} y.tab.c
181	rm -f y.tab.c
182
183# Shell
184.sh:
185	rm -f ${.TARGET}
186	cp ${.IMPSRC} ${.TARGET}
187	chmod a+x ${.TARGET}
188
189
190# this often helps with debugging
191.c.cpp-out:
192	@${COMPILE.c:N-c} -E ${.IMPSRC} | grep -v '^[ 	]*$$'
193
194${CXX_SUFFIXES:%=%.cpp-out}:
195	@${COMPILE.cc:N-c} -E ${.IMPSRC} | grep -v '^[ 	]*$$'
196