3 # This file is part of polypaudio.
5 # polypaudio is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
10 # polypaudio is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with polypaudio; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20 polypincludedir=$(includedir)/polyp
21 polypconfdir=$(sysconfdir)/polyp
23 modlibdir=$(libdir)/polypaudio-@PA_MAJORMINOR@
25 AM_CFLAGS=-D_GNU_SOURCE -I$(top_srcdir) $(PTHREAD_CFLAGS)
26 AM_CFLAGS+=-DDLSEARCHPATH=\"$(modlibdir)\"
27 AM_CFLAGS+=-DDEFAULT_CONFIG_FILE=\"$(polypconfdir)/polypaudio.pa\"
28 AM_CFLAGS+=-DPOLYPAUDIO_BINARY=\"$(bindir)/polypaudio\"
30 AM_LDADD=$(PTHREAD_LIBS) -lm
31 AM_LIBADD=$(PTHREAD_LIBS) -lm
33 EXTRA_DIST = polypaudio.pa depmod.py esdcompat.sh.in
34 bin_PROGRAMS = polypaudio pacat pactl pamodinfo
35 bin_SCRIPTS = esdcompat.sh
43 polypconf_DATA=polypaudio.pa
45 BUILT_SOURCES=polyplib-version.h
47 polypinclude_HEADERS= \
54 polyplib-introspect.h \
55 polyplib-subscribe.h \
56 polyplib-operation.h \
66 ### Warning! Due to an obscure bug in libtool/automake it is required
67 ### that the libraries in modlib_LTLIBRARIES are specified in-order,
68 ### i.e. libraries near the end of the list depend on libraries near
69 ### the head, and not the other way!
86 libprotocol-simple.la \
87 libprotocol-esound.la \
88 libprotocol-native.la \
90 module-cli-protocol-tcp.la \
91 module-cli-protocol-unix.la \
93 module-pipe-source.la \
96 module-simple-protocol-tcp.la \
97 module-simple-protocol-unix.la \
98 module-esound-protocol-tcp.la \
99 module-esound-protocol-unix.la \
100 module-native-protocol-tcp.la \
101 module-native-protocol-unix.la \
102 module-native-protocol-fd.la \
106 libpolyp-@PA_MAJORMINOR@.la \
107 libpolyp-error-@PA_MAJORMINOR@.la \
108 libpolyp-mainloop-@PA_MAJORMINOR@.la \
109 libpolyp-simple-@PA_MAJORMINOR@.la
111 polypaudio_SOURCES = idxset.c idxset.h \
115 mainloop.c mainloop.h \
116 memblock.c memblock.h \
118 sample-util.c sample-util.h \
119 memblockq.c memblockq.h \
122 source-output.c source-output.h \
123 sink-input.c sink-input.h \
127 mainloop-signal.c mainloop-signal.h \
128 mainloop-api.c mainloop-api.h \
130 hashmap.c hashmap.h \
131 namereg.c namereg.h \
133 resampler.c resampler.h \
135 memchunk.c memchunk.h \
136 sconv-s16le.c sconv-s16le.h \
137 sconv-s16be.c sconv-s16be.h \
139 modargs.c modargs.h \
140 cmdline.c cmdline.h \
141 cli-command.c cli-command.h \
142 cli-text.c cli-text.h \
143 tokenizer.c tokenizer.h \
144 dynarray.c dynarray.h \
146 sound-file.c sound-file.h \
147 play-memchunk.c play-memchunk.h \
148 autoload.c autoload.h \
149 xmalloc.c xmalloc.h \
150 subscribe.h subscribe.c \
152 sound-file-stream.c sound-file-stream.h \
153 cpulimit.c cpulimit.h \
158 polypaudio_CFLAGS = $(AM_CFLAGS) $(LIBSAMPLERATE_CFLAGS) $(LIBSNDFILE_CFLAGS)
159 polypaudio_INCLUDES = $(INCLTDL)
160 polypaudio_LDADD = $(AM_LDADD) $(LIBLTDL) $(LIBSAMPLERATE_LIBS) $(LIBSNDFILE_LIBS)
161 polypaudio_LDFLAGS=-export-dynamic
163 pamodinfo_SOURCES = log.c log.h pamodinfo.c pamodinfo.h modinfo.c modinfo.h util.c util.h xmalloc.c xmalloc.h
164 pamodinfo_CFLAGS = $(AM_CFLAGS)
165 pamodinfo_INCLUDES = $(INCLTDL)
166 pamodinfo_LDADD = $(AM_LDADD) $(LIBLTDL)
167 pamodinfo_LDFLAGS=-export-dynamic
169 libprotocol_simple_la_SOURCES = protocol-simple.c protocol-simple.h
170 libprotocol_simple_la_LDFLAGS = -avoid-version
171 libprotocol_simple_la_LIBADD = $(AM_LIBADD) libsocket-server.la libiochannel.la
173 libsocket_server_la_SOURCES = socket-server.c socket-server.h
174 libsocket_server_la_LDFLAGS = -avoid-version
175 libsocket_server_la_LIBADD = $(AM_LIBADD) libiochannel.la libsocket-util.la
177 libsocket_client_la_SOURCES = socket-client.c socket-client.h
178 libsocket_client_la_LDFLAGS = -avoid-version
179 libsocket_client_la_LIBADD = $(AM_LIBADD) libiochannel.la libsocket-util.la
181 libpstream_la_SOURCES = pstream.c pstream.h
182 libpstream_la_LDFLAGS = -avoid-version
183 libpstream_la_LIBADD = $(AM_LIBADD) libpacket.la libiochannel.la
185 libpstream_util_la_SOURCES = pstream-util.c pstream-util.h
186 libpstream_util_la_LDFLAGS = -avoid-version
187 libpstream_util_la_LIBADD = $(AM_LIBADD) libpacket.la libpstream.la libtagstruct.la
189 libpdispatch_la_SOURCES = pdispatch.c pdispatch.h
190 libpdispatch_la_LDFLAGS = -avoid-version
191 libpdispatch_la_LIBADD = $(AM_LIBADD) libtagstruct.la
193 libiochannel_la_SOURCES = iochannel.c iochannel.h
194 libiochannel_la_LDFLAGS = -avoid-version
195 libiochannel_la_LIBADD = $(AM_LIBADD) libsocket-util.la
197 libpacket_la_SOURCES = packet.c packet.h
198 libpacket_la_LDFLAGS = -avoid-version
200 liboss_util_la_SOURCES = oss-util.c oss-util.h
201 liboss_util_la_LDFLAGS = -avoid-version
203 libioline_la_SOURCES = ioline.c ioline.h
204 libioline_la_LDFLAGS = -avoid-version
205 libioline_la_LIBADD = $(AM_LIBADD) libiochannel.la
207 libcli_la_SOURCES = cli.c cli.h
208 libcli_la_LDFLAGS = -avoid-version
209 libcli_la_LIBADD = $(AM_LIBADD) libiochannel.la libioline.la
211 libprotocol_cli_la_SOURCES = protocol-cli.c protocol-cli.h
212 libprotocol_cli_la_LDFLAGS = -avoid-version
213 libprotocol_cli_la_LIBADD = $(AM_LIBADD) libsocket-server.la libiochannel.la libcli.la
215 libprotocol_native_la_SOURCES = protocol-native.c protocol-native.h native-common.h
216 libprotocol_native_la_LDFLAGS = -avoid-version
217 libprotocol_native_la_LIBADD = $(AM_LIBADD) libsocket-server.la libpstream.la libpstream-util.la libpdispatch.la libtagstruct.la libauthkey.la
219 libtagstruct_la_SOURCES = tagstruct.c tagstruct.h
220 libtagstruct_la_LDFLAGS = -avoid-version
222 libprotocol_esound_la_SOURCES = protocol-esound.c protocol-esound.h esound.h
223 libprotocol_esound_la_LDFLAGS = -avoid-version
224 libprotocol_esound_la_LIBADD = $(AM_LIBADD) libsocket-server.la libiochannel.la libauthkey.la
226 libauthkey_la_SOURCES = authkey.c authkey.h
227 libauthkey_la_LDFLAGS = -avoid-version
229 libsocket_util_la_SOURCES = socket-util.c socket-util.h
230 libsocket_util_la_LDFLAGS = -avoid-version
232 module_simple_protocol_tcp_la_SOURCES = module-protocol-stub.c
233 module_simple_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_SIMPLE $(AM_CFLAGS)
234 module_simple_protocol_tcp_la_LDFLAGS = -module -avoid-version
235 module_simple_protocol_tcp_la_LIBADD = $(AM_LIBADD) libprotocol-simple.la libsocket-server.la
237 module_simple_protocol_unix_la_SOURCES = module-protocol-stub.c
238 module_simple_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_SIMPLE $(AM_CFLAGS)
239 module_simple_protocol_unix_la_LDFLAGS = -module -avoid-version
240 module_simple_protocol_unix_la_LIBADD = $(AM_LIBADD) libprotocol-simple.la libsocket-server.la libsocket-util.la
242 module_cli_protocol_tcp_la_SOURCES = module-protocol-stub.c
243 module_cli_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_CLI $(AM_CFLAGS)
244 module_cli_protocol_tcp_la_LDFLAGS = -module -avoid-version
245 module_cli_protocol_tcp_la_LIBADD = $(AM_LIBADD) libprotocol-cli.la libsocket-server.la
247 module_cli_protocol_unix_la_SOURCES = module-protocol-stub.c
248 module_cli_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_CLI $(AM_CFLAGS)
249 module_cli_protocol_unix_la_LDFLAGS = -module -avoid-version
250 module_cli_protocol_unix_la_LIBADD = $(AM_LIBADD) libprotocol-cli.la libsocket-server.la libsocket-util.la
252 module_native_protocol_tcp_la_SOURCES = module-protocol-stub.c
253 module_native_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_NATIVE $(AM_CFLAGS)
254 module_native_protocol_tcp_la_LDFLAGS = -module -avoid-version
255 module_native_protocol_tcp_la_LIBADD = $(AM_LIBADD) libprotocol-native.la libsocket-server.la
257 module_native_protocol_unix_la_SOURCES = module-protocol-stub.c
258 module_native_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_NATIVE $(AM_CFLAGS)
259 module_native_protocol_unix_la_LDFLAGS = -module -avoid-version
260 module_native_protocol_unix_la_LIBADD = $(AM_LIBADD) libprotocol-native.la libsocket-server.la libsocket-util.la
262 module_native_protocol_fd_la_SOURCES = module-native-protocol-fd.c
263 module_native_protocol_fd_la_CFLAGS = $(AM_CFLAGS)
264 module_native_protocol_fd_la_LDFLAGS = -module -avoid-version
265 module_native_protocol_fd_la_LIBADD = $(AM_LIBADD) libprotocol-native.la libsocket-server.la libsocket-util.la
267 module_esound_protocol_tcp_la_SOURCES = module-protocol-stub.c
268 module_esound_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_ESOUND $(AM_CFLAGS)
269 module_esound_protocol_tcp_la_LDFLAGS = -module -avoid-version
270 module_esound_protocol_tcp_la_LIBADD = $(AM_LIBADD) libprotocol-esound.la libsocket-server.la
272 module_esound_protocol_unix_la_SOURCES = module-protocol-stub.c
273 module_esound_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_ESOUND $(AM_CFLAGS)
274 module_esound_protocol_unix_la_LDFLAGS = -module -avoid-version
275 module_esound_protocol_unix_la_LIBADD = $(AM_LIBADD) libprotocol-esound.la libsocket-server.la libsocket-util.la
277 module_pipe_sink_la_SOURCES = module-pipe-sink.c
278 module_pipe_sink_la_LDFLAGS = -module -avoid-version
279 module_pipe_sink_la_LIBADD = $(AM_LIBADD) libiochannel.la
281 module_pipe_source_la_SOURCES = module-pipe-source.c
282 module_pipe_source_la_LDFLAGS = -module -avoid-version
283 module_pipe_source_la_LIBADD = $(AM_LIBADD) libiochannel.la
285 module_oss_la_SOURCES = module-oss.c
286 module_oss_la_LDFLAGS = -module -avoid-version
287 module_oss_la_LIBADD = $(AM_LIBADD) libiochannel.la liboss-util.la
289 module_oss_mmap_la_SOURCES = module-oss-mmap.c
290 module_oss_mmap_la_LDFLAGS = -module -avoid-version
291 module_oss_mmap_la_LIBADD = $(AM_LIBADD) liboss-util.la
293 module_cli_la_SOURCES = module-cli.c
294 module_cli_la_LDFLAGS = -module -avoid-version
295 module_cli_la_LIBADD = $(AM_LIBADD) libcli.la libiochannel.la
297 module_sine_la_SOURCES = module-sine.c
298 module_sine_la_LDFLAGS = -module -avoid-version
299 module_sine_la_LIBADD = $(AM_LIBADD)
301 libpolyp_@PA_MAJORMINOR@_la_SOURCES = polyplib.h \
303 tagstruct.c tagstruct.h \
304 iochannel.c iochannel.h \
305 pstream.c pstream.h \
306 pstream-util.c pstream-util.h \
307 pdispatch.c pdispatch.h \
308 mainloop-api.c mainloop-api.h \
311 memblock.c memblock.h \
312 socket-client.c socket-client.h \
315 dynarray.c dynarray.h \
316 memchunk.c memchunk.h \
317 authkey.c authkey.h \
318 socket-util.c socket-util.h \
321 xmalloc.c xmalloc.h \
322 polyplib-operation.c polyplib-operation.h \
323 polyplib-context.c polyplib-context.h \
324 polyplib-stream.c polyplib-stream.h \
325 polyplib-introspect.c polyplib-introspect.h \
326 polyplib-scache.c polyplib-scache.h \
327 polyplib-subscribe.c polyplib-subscribe.h \
328 polyplib-internal.h \
334 libpolyp_@PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS)
335 libpolyp_@PA_MAJORMINOR@_la_LDFLAGS = -version-info 0:0:0
337 libpolyp_mainloop_@PA_MAJORMINOR@_la_SOURCES = mainloop-api.h mainloop-api.c \
338 mainloop.c mainloop.h \
339 mainloop-signal.c mainloop-signal.h
340 libpolyp_mainloop_@PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS)
341 libpolyp_mainloop_@PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) libpolyp-@PA_MAJORMINOR@.la
342 libpolyp_mainloop_@PA_MAJORMINOR@_la_LDFLAGS = -version-info 0:0:0
344 libpolyp_error_@PA_MAJORMINOR@_la_SOURCES = polyplib-error.c polyplib-error.h
345 libpolyp_error_@PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS)
346 libpolyp_error_@PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) libpolyp-@PA_MAJORMINOR@.la
347 libpolyp_error_@PA_MAJORMINOR@_la_LDFLAGS = -version-info 0:0:0
349 libpolyp_simple_@PA_MAJORMINOR@_la_SOURCES = polyplib-simple.c polyplib-simple.h
350 libpolyp_simple_@PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS)
351 libpolyp_simple_@PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) libpolyp-@PA_MAJORMINOR@.la libpolyp-mainloop-@PA_MAJORMINOR@.la
352 libpolyp_simple_@PA_MAJORMINOR@_la_LDFLAGS = -version-info 0:0:0
354 pacat_SOURCES = pacat.c
355 pacat_LDADD = $(AM_LDADD) libpolyp-@PA_MAJORMINOR@.la libpolyp-error-@PA_MAJORMINOR@.la libpolyp-mainloop-@PA_MAJORMINOR@.la
356 pacat_CFLAGS = $(AM_CFLAGS)
358 pactl_SOURCES = pactl.c
359 pactl_LDADD = $(AM_LDADD) libpolyp-@PA_MAJORMINOR@.la libpolyp-error-@PA_MAJORMINOR@.la libpolyp-mainloop-@PA_MAJORMINOR@.la $(LIBSNDFILE_LIBS)
360 pactl_CFLAGS = $(AM_CFLAGS) $(LIBSDNFILE_CFLAGS)
362 pacat_simple_SOURCES = pacat-simple.c
363 pacat_simple_LDADD = $(AM_LDADD) libpolyp-@PA_MAJORMINOR@.la libpolyp-simple-@PA_MAJORMINOR@.la libpolyp-error-@PA_MAJORMINOR@.la
364 pacat_simple_CFLAGS = $(AM_CFLAGS)
366 parec_simple_SOURCES = parec-simple.c
367 parec_simple_LDADD = $(AM_LDADD) libpolyp-@PA_MAJORMINOR@.la libpolyp-simple-@PA_MAJORMINOR@.la libpolyp-error-@PA_MAJORMINOR@.la
368 parec_simple_CFLAGS = $(AM_CFLAGS)
370 mainloop_test_SOURCES = mainloop-test.c
371 mainloop_test_CFLAGS = $(AM_CFLAGS)
372 mainloop_test_LDADD = $(AM_LDADD) libpolyp-mainloop-@PA_MAJORMINOR@.la libpolyp-@PA_MAJORMINOR@.la
374 cpulimit_test_SOURCES = cpulimit-test.c cpulimit.c util.c log.c
375 cpulimit_test_CFLAGS = $(AM_CFLAGS)
376 cpulimit_test_LDADD = $(AM_LDADD) libpolyp-mainloop-@PA_MAJORMINOR@.la
378 cpulimit_test2_SOURCES = cpulimit-test.c cpulimit.c util.c log.c
379 cpulimit_test2_CFLAGS = $(AM_CFLAGS) -DTEST2
380 cpulimit_test2_LDADD = $(AM_LDADD) libpolyp-mainloop-@PA_MAJORMINOR@.la
385 modlib_LTLIBRARIES+= \
388 module_x11_bell_la_SOURCES = module-x11-bell.c
389 module_x11_bell_la_CFLAGS = $(AM_CFLAGS) $(X_CFLAGS)
390 module_x11_bell_la_LDFLAGS = -module -avoid-version
391 module_x11_bell_la_LIBADD = $(AM_LIBADD) $(X_PRE_LIBS) -lX11 $(X_LIBS) $(X_EXTRA_LIB)
397 modlib_LTLIBRARIES+= \
399 module-alsa-sink.la \
400 module-alsa-source.la
402 libalsa_util_la_SOURCES = alsa-util.c alsa-util.h
403 libalsa_util_la_LDFLAGS = -avoid-version
404 libalsa_util_la_LIBADD = $(AM_LIBADD) $(ASOUNDLIB_LIBS)
405 libalsa_util_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS)
407 module_alsa_sink_la_SOURCES = module-alsa-sink.c
408 module_alsa_sink_la_LDFLAGS = -module -avoid-version
409 module_alsa_sink_la_LIBADD = $(AM_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la
410 module_alsa_sink_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS)
412 module_alsa_source_la_SOURCES = module-alsa-source.c
413 module_alsa_source_la_LDFLAGS = -module -avoid-version
414 module_alsa_source_la_LIBADD = $(AM_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la
415 module_alsa_source_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS)
422 libpolyp-mainloop-glib-@PA_MAJORMINOR@.la
427 libpolyp_mainloop_glib_@PA_MAJORMINOR@_la_SOURCES = glib-mainloop.h glib-mainloop.c
428 libpolyp_mainloop_glib_@PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) $(GLIB20_CFLAGS)
429 libpolyp_mainloop_glib_@PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) libpolyp-mainloop-@PA_MAJORMINOR@.la $(GLIB20_LIBS)
430 libpolyp_mainloop_glib_@PA_MAJORMINOR@_la_LDFLAGS = -version-info 0:0:0
432 mainloop_test_glib_SOURCES = $(mainloop_test_SOURCES)
433 mainloop_test_glib_CFLAGS = $(mainloop_test_CFLAGS) $(GLIB20_CFLAGS) -DGLIB_MAIN_LOOP
434 mainloop_test_glib_LDADD = $(mainloop_test_LDADD) $(GLIB20_LIBS) libpolyp-mainloop-glib-@PA_MAJORMINOR@.la
442 libpolyp-mainloop-glib12-@PA_MAJORMINOR@.la
446 libpolyp_mainloop_glib12_@PA_MAJORMINOR@_la_SOURCES = glib-mainloop.h glib12-mainloop.c
447 libpolyp_mainloop_glib12_@PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) $(GLIB12_CFLAGS)
448 libpolyp_mainloop_glib12_@PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) libpolyp-mainloop-@PA_MAJORMINOR@.la $(GLIB12_LIBS)
449 libpolyp_mainloop_glib12_@PA_MAJORMINOR@_la_LDFLAGS = -version-info 0:0:0
451 mainloop_test_glib12_SOURCES = $(mainloop_test_SOURCES)
452 mainloop_test_glib12_CFLAGS = $(mainloop_test_CFLAGS) $(GLIB12_CFLAGS) -DGLIB_MAIN_LOOP
453 mainloop_test_glib12_LDADD = $(mainloop_test_LDADD) $(GLIB12_LIBS) libpolyp-mainloop-glib12-@PA_MAJORMINOR@.la
457 ### libpolypcore (needs to be updated)
459 if BUILD_LIBPOLYPCORE
461 polypinclude_HEADERS+=cli-command.h\
491 lib_LTLIBRARIES+= libpolypcore.la
493 libpolypcore_la_SOURCES = idxset.c idxset.h \
496 mainloop.c mainloop.h \
497 memblock.c memblock.h \
499 sample-util.c sample-util.h \
500 memblockq.c memblockq.h \
503 source-output.c source-output.h \
504 sink-input.c sink-input.h \
508 mainloop-signal.c mainloop-signal.h \
509 mainloop-api.c mainloop-api.h \
511 hashmap.c hashmap.h \
512 namereg.c namereg.h \
514 resampler.c resampler.h \
516 memchunk.c memchunk.h \
517 sconv-s16le.c sconv-s16le.h \
518 sconv-s16be.c sconv-s16be.h \
520 modargs.c modargs.h \
521 cli-command.c cli-command.h \
522 cli-text.c cli-text.h \
523 tokenizer.c tokenizer.h \
524 dynarray.c dynarray.h
534 esdcompat.sh: esdcompat.sh.in Makefile
535 sed -e 's,@PACKAGE_VERSION\@,$(PACKAGE_VERSION),g' \
536 -e 's,@PACKAGE_NAME\@,$(PACKAGE_NAME),g' \
537 -e 's,@POLYPAUDIO_BINARY\@,$(bindir)/polypaudio,g' < $< > $@