diff options
author | Marc Kleine-Budde <mkl@pengutronix.de> | 2009-05-29 09:50:34 +0000 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2009-05-29 09:50:34 +0000 |
commit | aea0fb0f148bdc4ad1e46b5d3697b7acb901977e (patch) | |
tree | d66c89a4d98f834d6300883cb2c2a957d2d5577b | |
parent | 0dc4fb01f24e7ba3eddf38e293eabd51ffdf4241 (diff) | |
download | ptxdist-aea0fb0f148bdc4ad1e46b5d3697b7acb901977e.tar.gz ptxdist-aea0fb0f148bdc4ad1e46b5d3697b7acb901977e.tar.xz |
[dhcp] cleanups + add install alternative for config files
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
git-svn-id: https://svn.pengutronix.de/svn/ptxdist/trunks/ptxdist-trunk@10605 33e552b5-05e3-0310-8538-816dae2090ed
-rw-r--r-- | generic/etc/dhclient-script | 300 | ||||
-rw-r--r-- | generic/etc/dhclient.conf | 36 | ||||
-rw-r--r-- | generic/etc/dhcpd.conf | 104 | ||||
-rw-r--r-- | rules/dhcp.in | 54 | ||||
-rw-r--r-- | rules/dhcp.make | 72 |
5 files changed, 509 insertions, 57 deletions
diff --git a/generic/etc/dhclient-script b/generic/etc/dhclient-script new file mode 100644 index 00000000..8b4d7a4a --- /dev/null +++ b/generic/etc/dhclient-script @@ -0,0 +1,300 @@ +#!/bin/sh +# dhclient-script for Linux. Dan Halbert, March, 1997. +# Updated for Linux 2.[12] by Brian J. Murrell, January 1999. +# No guarantees about this. I'm a novice at the details of Linux +# networking. + +# Notes: + +# 0. This script is based on the netbsd script supplied with dhcp-970306. + +# 1. ifconfig down apparently deletes all relevant routes and flushes +# the arp cache, so this doesn't need to be done explicitly. + +# 2. The alias address handling here has not been tested AT ALL. +# I'm just going by the doc of modern Linux ip aliasing, which uses +# notations like eth0:0, eth0:1, for each alias. + +# 3. I have to calculate the network address, and calculate the broadcast +# address if it is not supplied. This might be much more easily done +# by the dhclient C code, and passed on. + +# 4. TIMEOUT not tested. ping has a flag I don't know, and I'm suspicious +# of the $1 in its args. + +# 'ip' just looks too weird. /sbin/ip looks less weird. +ip=/sbin/ip + +make_resolv_conf() { + if [ x"$new_domain_name_servers" != x ]; then + cat /dev/null > /etc/resolv.conf.dhclient + chmod 644 /etc/resolv.conf.dhclient + if [ x"$new_domain_search" != x ]; then + echo search $new_domain_search >> /etc/resolv.conf.dhclient + elif [ x"$new_domain_name" != x ]; then + # Note that the DHCP 'Domain Name Option' is really just a domain + # name, and that this practice of using the domain name option as + # a search path is both nonstandard and deprecated. + echo search $new_domain_name >> /etc/resolv.conf.dhclient + fi + for nameserver in $new_domain_name_servers; do + echo nameserver $nameserver >>/etc/resolv.conf.dhclient + done + + mv /etc/resolv.conf.dhclient /etc/resolv.conf + elif [ "x${new_dhcp6_name_servers}" != x ] ; then + cat /dev/null > /etc/resolv.conf.dhclient6 + chmod 644 /etc/resolv.conf.dhclient6 + + if [ "x${new_dhcp6_domain_search}" != x ] ; then + echo search ${new_dhcp6_domain_search} >> /etc/resolv.conf.dhclient6 + fi + for nameserver in ${new_dhcp6_name_servers} ; do + echo nameserver ${nameserver} >> /etc/resolv.conf.dhclient6 + done + + mv /etc/resolv.conf.dhclient6 /etc/resolv.conf + fi +} + +# Must be used on exit. Invokes the local dhcp client exit hooks, if any. +exit_with_hooks() { + exit_status=$1 + if [ -f /etc/dhclient-exit-hooks ]; then + . /etc/dhclient-exit-hooks + fi +# probably should do something with exit status of the local script + exit $exit_status +} + +# Invoke the local dhcp client enter hooks, if they exist. +if [ -f /etc/dhclient-enter-hooks ]; then + exit_status=0 + . /etc/dhclient-enter-hooks + # allow the local script to abort processing of this state + # local script must set exit_status variable to nonzero. + if [ $exit_status -ne 0 ]; then + exit $exit_status + fi +fi + +release=`uname -r` +release=`expr $release : '\(.*\)\..*'` +relminor=`echo $release |sed -e 's/[0-9]*\.\([0-9][0-9]*\)\(\..*\)*$/\1/'` +relmajor=`echo $release |sed -e 's/\([0-9][0-9]*\)\..*$/\1/'` + +### +### DHCPv4 Handlers +### + +if [ x$new_broadcast_address != x ]; then + new_broadcast_arg="broadcast $new_broadcast_address" +fi +if [ x$old_broadcast_address != x ]; then + old_broadcast_arg="broadcast $old_broadcast_address" +fi +if [ x$new_subnet_mask != x ]; then + new_subnet_arg="netmask $new_subnet_mask" +fi +if [ x$old_subnet_mask != x ]; then + old_subnet_arg="netmask $old_subnet_mask" +fi +if [ x$alias_subnet_mask != x ]; then + alias_subnet_arg="netmask $alias_subnet_mask" +fi + +if [ x$reason = xMEDIUM ]; then + # Linux doesn't do mediums (ok, ok, media). + exit_with_hooks 0 +fi + +if [ x$reason = xPREINIT ]; then + if [ x$alias_ip_address != x ]; then + # Bring down alias interface. Its routes will disappear too. + ifconfig $interface:0- inet 0 + fi + if [ $relmajor -lt 2 ] || ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ) + then + ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \ + broadcast 255.255.255.255 up + # Add route to make broadcast work. Do not omit netmask. + route add default dev $interface netmask 0.0.0.0 + else + ifconfig $interface 0 up + fi + + # We need to give the kernel some time to get the interface up. + sleep 1 + + exit_with_hooks 0 +fi + +if [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then + exit_with_hooks 0 +fi + +if [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \ + [ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then + current_hostname=`hostname` + if [ x$current_hostname = x ] || \ + [ x$current_hostname = x$old_host_name ]; then + if [ x$current_hostname = x ] || \ + [ x$new_host_name != x$old_host_name ]; then + hostname $new_host_name + fi + fi + + if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \ + [ x$alias_ip_address != x$old_ip_address ]; then + # Possible new alias. Remove old alias. + ifconfig $interface:0- inet 0 + fi + if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ]; then + # IP address changed. Bringing down the interface will delete all routes, + # and clear the ARP cache. + ifconfig $interface inet 0 down + + fi + if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \ + [ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then + + ifconfig $interface inet $new_ip_address $new_subnet_arg \ + $new_broadcast_arg + # Add a network route to the computed network address. + if [ $relmajor -lt 2 ] || \ + ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then + route add -net $new_network_number $new_subnet_arg dev $interface + fi + for router in $new_routers; do + if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then + route add -host $router dev $interface + fi + route add default gw $router + done + fi + if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ]; + then + ifconfig $interface:0- inet 0 + ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg + route add -host $alias_ip_address $interface:0 + fi + make_resolv_conf + exit_with_hooks 0 +fi + +if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \ + || [ x$reason = xSTOP ]; then + if [ x$alias_ip_address != x ]; then + # Turn off alias interface. + ifconfig $interface:0- inet 0 + fi + if [ x$old_ip_address != x ]; then + # Shut down interface, which will delete routes and clear arp cache. + ifconfig $interface inet 0 down + fi + if [ x$alias_ip_address != x ]; then + ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg + route add -host $alias_ip_address $interface:0 + fi + exit_with_hooks 0 +fi + +if [ x$reason = xTIMEOUT ]; then + if [ x$alias_ip_address != x ]; then + ifconfig $interface:0- inet 0 + fi + ifconfig $interface inet $new_ip_address $new_subnet_arg \ + $new_broadcast_arg + set $new_routers + if ping -q -c 1 $1; then + if [ x$new_ip_address != x$alias_ip_address ] && \ + [ x$alias_ip_address != x ]; then + ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg + route add -host $alias_ip_address dev $interface:0 + fi + if [ $relmajor -lt 2 ] || \ + ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then + route add -net $new_network_number + fi + for router in $new_routers; do + if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then + route add -host $router dev $interface + fi + route add default gw $router + done + make_resolv_conf + exit_with_hooks 0 + fi + ifconfig $interface inet 0 down + exit_with_hooks 1 +fi + +### +### DHCPv6 Handlers +### + +if [ ${reason} = PREINIT6 ] ; then + # Ensure interface is up. + ${ip} link set ${interface} up + + # Remove any stale addresses from aborted clients. + ${ip} -f inet6 addr flush dev ${interface} scope global permanent + + exit_with_hooks 0 +fi + +if [ x${old_ip6_prefix} != x ] || [ x${new_ip6_prefix} != x ] ; then + echo Prefix ${reason} old=${old_ip6_prefix} new=${new_ip6_prefix} + + exit_with_hooks 0 +fi + +if [ ${reason} = BOUND6 ] ; then + if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then + exit_with_hooks 2; + fi + + ${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ + dev ${interface} scope global + + # Check for nameserver options. + make_resolv_conf + + exit_with_hooks 0 +fi + +if [ ${reason} = RENEW6 ] || [ ${reason} = REBIND6 ] ; then + # Make sure nothing has moved around on us. + + # Nameservers/domains/etc. + if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] || + [ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then + make_resolv_conf + fi + + exit_with_hooks 0 +fi + +if [ ${reason} = DEPREF6 ] ; then + if [ x${new_ip6_prefixlen} = x ] ; then + exit_with_hooks 2; + fi + + ${ip} -f inet6 addr change ${new_ip6_address}/${new_ip6_prefixlen} \ + dev ${interface} scope global preferred_lft 0 + + exit_with_hooks 0 +fi + +if [ ${reason} = EXPIRE6 -o ${reason} = RELEASE6 -o ${reason} = STOP6 ] ; then + if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then + exit_with_hooks 2; + fi + + ${ip} -f inet6 addr del ${old_ip6_address}/${old_ip6_prefixlen} \ + dev ${interface} + + exit_with_hooks 0 +fi + +exit_with_hooks 0 diff --git a/generic/etc/dhclient.conf b/generic/etc/dhclient.conf new file mode 100644 index 00000000..147e0045 --- /dev/null +++ b/generic/etc/dhclient.conf @@ -0,0 +1,36 @@ +send host-name "andare.fugue.com"; +send dhcp-client-identifier 1:0:a0:24:ab:fb:9c; +send dhcp-lease-time 3600; +supersede domain-name "fugue.com home.vix.com"; +prepend domain-name-servers 127.0.0.1; +request subnet-mask, broadcast-address, time-offset, routers, + domain-name, domain-name-servers, host-name; +require subnet-mask, domain-name-servers; +timeout 60; +retry 60; +reboot 10; +select-timeout 5; +initial-interval 2; +script "/etc/dhclient-script"; +media "-link0 -link1 -link2", "link0 link1"; +reject 192.33.137.209; + +alias { + interface "ep0"; + fixed-address 192.5.5.213; + option subnet-mask 255.255.255.255; +} + +lease { + interface "ep0"; + fixed-address 192.33.137.200; + medium "link0 link1"; + option host-name "andare.swiftmedia.com"; + option subnet-mask 255.255.255.0; + option broadcast-address 192.33.137.255; + option routers 192.33.137.250; + option domain-name-servers 127.0.0.1; + renew 2 2000/1/12 00:00:01; + rebind 2 2000/1/12 00:00:01; + expire 2 2000/1/12 00:00:01; +} diff --git a/generic/etc/dhcpd.conf b/generic/etc/dhcpd.conf new file mode 100644 index 00000000..5eab9516 --- /dev/null +++ b/generic/etc/dhcpd.conf @@ -0,0 +1,104 @@ +# dhcpd.conf +# +# Sample configuration file for ISC dhcpd +# + +# option definitions common to all supported networks... +option domain-name "example.org"; +option domain-name-servers ns1.example.org, ns2.example.org; + +default-lease-time 600; +max-lease-time 7200; + +# Use this to enble / disable dynamic dns updates globally. +#ddns-update-style none; + +# If this DHCP server is the official DHCP server for the local +# network, the authoritative directive should be uncommented. +#authoritative; + +# Use this to send dhcp log messages to a different log file (you also +# have to hack syslog.conf to complete the redirection). +log-facility local7; + +# No service will be given on this subnet, but declaring it helps the +# DHCP server to understand the network topology. + +subnet 10.152.187.0 netmask 255.255.255.0 { +} + +# This is a very basic subnet declaration. + +subnet 10.254.239.0 netmask 255.255.255.224 { + range 10.254.239.10 10.254.239.20; + option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org; +} + +# This declaration allows BOOTP clients to get dynamic addresses, +# which we don't really recommend. + +subnet 10.254.239.32 netmask 255.255.255.224 { + range dynamic-bootp 10.254.239.40 10.254.239.60; + option broadcast-address 10.254.239.31; + option routers rtr-239-32-1.example.org; +} + +# A slightly different configuration for an internal subnet. +subnet 10.5.5.0 netmask 255.255.255.224 { + range 10.5.5.26 10.5.5.30; + option domain-name-servers ns1.internal.example.org; + option domain-name "internal.example.org"; + option routers 10.5.5.1; + option broadcast-address 10.5.5.31; + default-lease-time 600; + max-lease-time 7200; +} + +# Hosts which require special configuration options can be listed in +# host statements. If no address is specified, the address will be +# allocated dynamically (if possible), but the host-specific information +# will still come from the host declaration. + +host passacaglia { + hardware ethernet 0:0:c0:5d:bd:95; + filename "vmunix.passacaglia"; + server-name "toccata.fugue.com"; +} + +# Fixed IP addresses can also be specified for hosts. These addresses +# should not also be listed as being available for dynamic assignment. +# Hosts for which fixed IP addresses have been specified can boot using +# BOOTP or DHCP. Hosts for which no fixed address is specified can only +# be booted with DHCP, unless there is an address range on the subnet +# to which a BOOTP client is connected which has the dynamic-bootp flag +# set. +host fantasia { + hardware ethernet 08:00:07:26:c0:a5; + fixed-address fantasia.fugue.com; +} + +# You can declare a class of clients and then do address allocation +# based on that. The example below shows a case where all clients +# in a certain class get addresses on the 10.17.224/24 subnet, and all +# other clients get addresses on the 10.0.29/24 subnet. + +class "foo" { + match if substring (option vendor-class-identifier, 0, 4) = "SUNW"; +} + +shared-network 224-29 { + subnet 10.17.224.0 netmask 255.255.255.0 { + option routers rtr-224.example.org; + } + subnet 10.0.29.0 netmask 255.255.255.0 { + option routers rtr-29.example.org; + } + pool { + allow members of "foo"; + range 10.17.224.10 10.17.224.250; + } + pool { + deny members of "foo"; + range 10.0.29.10 10.0.29.230; + } +} diff --git a/rules/dhcp.in b/rules/dhcp.in index a4909c49..2ffc9ac9 100644 --- a/rules/dhcp.in +++ b/rules/dhcp.in @@ -22,6 +22,17 @@ config DHCP_SERVER help FIXME +config DHCP_DHCPD_CONF + bool "Install /etc/dhcpd.conf" + depends on DHCP_SERVER + default y + help + Installs (if present) the "./projectroot/etc/dhcpd.conf" + file from your workspace, otherwise a generic one from the + ptxdist installation + ("<PTXDIST>/generic/etc/dhcpd.conf"). + + config DHCP_CLIENT bool prompt "DHCP Client dhclient" @@ -30,34 +41,27 @@ config DHCP_CLIENT with an IP adress. It also handles a lease refresh if it expires. -config DHCP_CLIENT_CONFIG - bool - depends on DHCP_CLIENT - prompt "Install /etc/dhclient.conf" - help - PTXdist installs a /etc/dhclient.conf from a selectable source. +if DHCP_CLIENT -choice - prompt "Kind of dhclient.conf" - default DHCP_CLIENT_CONFIG_DEFAULT - depends on DHCP_CLIENT_CONFIG - - config DHCP_CLIENT_CONFIG_DEFAULT - bool - prompt "Use generic" - help - Installs a generic /etc/dhclient.conf from the dhcp package. - See <build-target/dhcp-?.?.?/client/dhclient.conf +config DHCP_DHCLIENT_CONF + bool "Install /etc/dhclient.conf" + default y + help + Installs (if present) the "./projectroot/etc/dhclient.conf" + file from your workspace, otherwise a generic one from the + ptxdist installation + ("<PTXDIST>/generic/etc/dhclient.conf"). - config DHCP_CLIENT_CONFIG_USER - bool - prompt "User defined" - help - This uses a user defined /etc/dhclient.conf file. PTXdist - uses files projectroot/etc/dhclient.conf in your local - project +config DHCP_DHCLIENT_SCRIPT + bool "Install /etc/dhclient-script" + depends on DHCP_DHCLIENT_CONF + help + Installs (if present) the "./projectroot/etc/dhclient-script" + file from your workspace, otherwise a generic one from the + ptxdist installation + ("<PTXDIST>/generic/etc/dhclient-script"). -endchoice +endif config DHCP_RELAY bool diff --git a/rules/dhcp.make b/rules/dhcp.make index 6c3751c6..487bb8d0 100644 --- a/rules/dhcp.make +++ b/rules/dhcp.make @@ -18,13 +18,15 @@ PACKAGES-$(PTXCONF_DHCP) += dhcp # # Paths and names # -DHCP_VERSION = 4.1.0 -DHCP = dhcp-$(DHCP_VERSION) -DHCP_SUFFIX = tar.gz -DHCP_URL = http://ftp.isc.org/isc/dhcp/$(DHCP).$(DHCP_SUFFIX) \ - http://ftp.isc.org/isc/dhcp/dhcp-4.1-history/$(DHCP).$(DHCP_SUFFIX) -DHCP_SOURCE = $(SRCDIR)/$(DHCP).$(DHCP_SUFFIX) -DHCP_DIR = $(BUILDDIR)/$(DHCP) +DHCP_VERSION := 4.1.0 +DHCP := dhcp-$(DHCP_VERSION) +DHCP_SUFFIX := tar.gz +DHCP_SOURCE := $(SRCDIR)/$(DHCP).$(DHCP_SUFFIX) +DHCP_DIR := $(BUILDDIR)/$(DHCP) + +DHCP_URL := \ + http://ftp.isc.org/isc/dhcp/$(DHCP).$(DHCP_SUFFIX) \ + http://ftp.isc.org/isc/dhcp/dhcp-4.1-history/$(DHCP).$(DHCP_SUFFIX) # ---------------------------------------------------------------------------- # Get @@ -34,66 +36,72 @@ $(DHCP_SOURCE): @$(call targetinfo) @$(call get, DHCP) - # ---------------------------------------------------------------------------- # Prepare # ---------------------------------------------------------------------------- DHCP_PATH := PATH=$(CROSS_PATH) -DHCP_ENV := $(CROSS_ENV) \ - ac_cv_file__dev_random=yes -DHCP_AUTOCONF := $(CROSS_AUTOCONF_USR) \ - --disable-dhcpv6 -# ^ sorry bbu ;) +DHCP_ENV := \ + $(CROSS_ENV) \ + ac_cv_file__dev_random=yes + +# +# autoconf +# +DHCP_AUTOCONF := \ + $(CROSS_AUTOCONF_ROOT) \ + --disable-dhcpv6 # ---------------------------------------------------------------------------- # Target-Install # ---------------------------------------------------------------------------- $(STATEDIR)/dhcp.targetinstall: - - @$(call targetinfo, $@) + @$(call targetinfo) @$(call install_init, dhcp) @$(call install_fixup, dhcp,PACKAGE,dhcp) @$(call install_fixup, dhcp,PRIORITY,optional) @$(call install_fixup, dhcp,VERSION,$(DHCP_VERSION)) @$(call install_fixup, dhcp,SECTION,base) - @$(call install_fixup, dhcp,AUTHOR,"Robert Schwebel <r.schwebel\@pengutronix.de>") + @$(call install_fixup, dhcp,AUTHOR,"Robert Schwebel <r.schwebel@pengutronix.de>") @$(call install_fixup, dhcp,DEPENDS,) @$(call install_fixup, dhcp,DESCRIPTION,missing) ifdef PTXCONF_DHCP_SERVER - @$(call install_copy, dhcp, 0, 0, 0755, \ - $(DHCP_DIR)/server/dhcpd, /sbin/dhcpd) + @$(call install_copy, dhcp, 0, 0, 0755, -, \ + /sbin/dhcpd) +endif + +ifdef PTXCONF_DHCP_DHCPD_CONF + @$(call install_alternative, dhcp, 0, 0, 0644, /etc/dhcpd.conf) endif ifdef PTXCONF_DHCP_CLIENT - @$(call install_copy, dhcp, 0, 0, 0755, \ - $(DHCP_DIR)/client/dhclient, /sbin/dhclient) + @$(call install_copy, dhcp, 0, 0, 0755, /var/db) @$(call install_copy, dhcp, 0, 0, 0755, /var/state/dhcp ) -ifdef PTXCONF_DHCP_CLIENT_CONFIG_DEFAULT - @$(call install_copy, dhcp, 0, 0, 0755, \ - $(DHCP_DIR)/client/dhclient.conf, /etc/dhclient.conf, n) + @$(call install_copy, dhcp, 0, 0, 0755, -, \ + /sbin/dhclient) + endif -ifdef PTXCONF_DHCP_CLIENT_CONFIG_USER - @$(call install_copy, dhcp, 0, 0, 0755, \ - ${PTXDIST_WORKSPACE}/projectroot/etc/dhclient.conf, \ - /etc/dhclient.conf, n) + +ifdef PTXCONF_DHCP_DHCLIENT_SCRIPT + @$(call install_alternative, dhcp, 0, 0, 0755, /etc/dhclient-script) endif - @$(call install_copy, dhcp, 0, 0, 0755, /var/db) - @$(call install_copy, dhcp, 0, 0, 0755, \ - $(DHCP_DIR)/client/scripts/linux, /etc/dhclient-script, n) + +ifdef PTXCONF_DHCP_DHCLIENT_CONF + @$(call install_alternative, dhcp, 0, 0, 0644, /etc/dhclient.conf) endif ifdef PTXCONF_DHCP_RELAY - @$(call install_copy, dhcp, 0, 0, 0755, $(DHCP_DIR)/relay/dhcrelay, /sbin/dhcrelay) + @$(call install_copy, dhcp, 0, 0, 0755, -, \ + /sbin/dhcrelay) endif @$(call install_finish, dhcp) - @$(call touch, $@) + @$(call touch) # ---------------------------------------------------------------------------- # Clean |