iproute2: update to 4.20.0
authorDeng Qingfang <dengqf6@mail2.sysu.edu.cn>
Tue, 22 Jan 2019 11:55:21 +0000 (19:55 +0800)
committerHans Dedecker <dedeckeh@gmail.com>
Wed, 23 Jan 2019 16:55:21 +0000 (17:55 +0100)
Update to the latest version of iproute2; see https://lwn.net/Articles/776174/
for a full overview of the changes in 4.20.
Remove upstream patch 001-fix-print_0xhex-on-32-bit.patch and 002-tc-fix-xtables-incorrect-usage-of-LDFLAGS.patch
Introduce a patch to include <linux/limits.h> for XATTR_SIZE_MAX in tc

Signed-off-by: Deng Qingfang <dengqf6@mail2.sysu.edu.cn>
package/network/utils/iproute2/Makefile
package/network/utils/iproute2/patches/001-fix-print_0xhex-on-32-bit.patch [deleted file]
package/network/utils/iproute2/patches/001-tc-fix-undefined-XATTR_SIZE_MAX.patch [new file with mode: 0644]
package/network/utils/iproute2/patches/002-tc-fix-xtables-incorrect-usage-of-LDFLAGS.patch [deleted file]
package/network/utils/iproute2/patches/140-keep_libmnl_optional.patch
package/network/utils/iproute2/patches/170-ip_tiny.patch
package/network/utils/iproute2/patches/190-link-libelf-to-tc-only.patch

index c6473319188fbc2007ddf2ba51833416eeaaeee8..ec9664004dc6d9c5e053f1aa0dda4848fa2bbd33 100644 (file)
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=iproute2
-PKG_VERSION:=4.19.0
-PKG_RELEASE:=8
+PKG_VERSION:=4.20.0
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2
-PKG_HASH:=d9ec5ca1f47d8a85416fa26e7dc1cbf5d067640eb60e90bdc1c7e5bdc6a29984
+PKG_HASH:=c8adaa6a40f888476b23acb283cfa30c0dd55f07b5aa20663ed5ba2ef1f6fda8
 PKG_BUILD_PARALLEL:=1
 PKG_BUILD_DEPENDS:=iptables
 PKG_LICENSE:=GPL-2.0
diff --git a/package/network/utils/iproute2/patches/001-fix-print_0xhex-on-32-bit.patch b/package/network/utils/iproute2/patches/001-fix-print_0xhex-on-32-bit.patch
deleted file mode 100644 (file)
index 25994b4..0000000
+++ /dev/null
@@ -1,343 +0,0 @@
-From 90c5c969f0b9a2fbb0016b955fecc359aa884220 Mon Sep 17 00:00:00 2001
-From: Stephen Hemminger <stephen@networkplumber.org>
-Date: Mon, 10 Dec 2018 14:20:32 -0800
-Subject: [PATCH] fix print_0xhex on 32 bit
-
-The argument to print_0xhex is converted to unsigned long long
-so the format string give for normal printout has to be some
-variant of %llx. Otherwise, bogus values will be printed on
-32 bit platforms.
-
-Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
----
- bridge/link.c            | 2 +-
- ip/ipaddress.c           | 2 +-
- ip/iplink_bridge.c       | 2 +-
- ip/iplink_bridge_slave.c | 6 +++---
- ip/iplink_geneve.c       | 5 ++---
- ip/iplink_vxlan.c        | 8 +++-----
- ip/ipntable.c            | 2 +-
- ip/iproute.c             | 8 ++++----
- ip/iproute_lwtunnel.c    | 2 +-
- ip/iprule.c              | 6 +++---
- ip/iptuntap.c            | 2 +-
- ip/link_gre.c            | 6 +++---
- ip/link_gre6.c           | 4 ++--
- ip/link_ip6tnl.c         | 2 +-
- ip/link_iptnl.c          | 4 ++--
- ip/link_vti.c            | 2 +-
- ip/link_vti6.c           | 2 +-
- tc/m_ife.c               | 2 +-
- tc/q_htb.c               | 2 +-
- tc/q_taprio.c            | 2 +-
- 20 files changed, 34 insertions(+), 37 deletions(-)
-
---- a/bridge/link.c
-+++ b/bridge/link.c
-@@ -90,7 +90,7 @@ static void print_hwmode(__u16 mode)
- {
-       if (mode >= ARRAY_SIZE(hw_mode))
-               print_0xhex(PRINT_ANY, "hwmode",
--                          "hwmode %#hx ", mode);
-+                          "hwmode %#llx ", mode);
-       else
-               print_string(PRINT_ANY, "hwmode",
-                            "hwmode %s ", hw_mode[mode]);
---- a/ip/ipaddress.c
-+++ b/ip/ipaddress.c
-@@ -129,7 +129,7 @@ static void print_operstate(FILE *f, __u
-               if (is_json_context())
-                       print_uint(PRINT_JSON, "operstate_index", NULL, state);
-               else
--                      print_0xhex(PRINT_FP, NULL, "state %#x", state);
-+                      print_0xhex(PRINT_FP, NULL, "state %#llx", state);
-       } else if (brief) {
-               print_color_string(PRINT_ANY,
-                                  oper_state_color(state),
---- a/ip/iplink_bridge.c
-+++ b/ip/iplink_bridge.c
-@@ -524,7 +524,7 @@ static void bridge_print_opt(struct link
-       if (tb[IFLA_BR_GROUP_FWD_MASK])
-               print_0xhex(PRINT_ANY,
-                           "group_fwd_mask",
--                          "group_fwd_mask %#x ",
-+                          "group_fwd_mask %#llx ",
-                           rta_getattr_u16(tb[IFLA_BR_GROUP_FWD_MASK]));
-       if (tb[IFLA_BR_GROUP_ADDR]) {
---- a/ip/iplink_bridge_slave.c
-+++ b/ip/iplink_bridge_slave.c
-@@ -167,11 +167,11 @@ static void bridge_slave_print_opt(struc
-                            rta_getattr_u8(tb[IFLA_BRPORT_UNICAST_FLOOD]));
-       if (tb[IFLA_BRPORT_ID])
--              print_0xhex(PRINT_ANY, "id", "port_id 0x%x ",
-+              print_0xhex(PRINT_ANY, "id", "port_id %#llx ",
-                           rta_getattr_u16(tb[IFLA_BRPORT_ID]));
-       if (tb[IFLA_BRPORT_NO])
--              print_0xhex(PRINT_ANY, "no", "port_no 0x%x ",
-+              print_0xhex(PRINT_ANY, "no", "port_no %#llx ",
-                          rta_getattr_u16(tb[IFLA_BRPORT_NO]));
-       if (tb[IFLA_BRPORT_DESIGNATED_PORT])
-@@ -266,7 +266,7 @@ static void bridge_slave_print_opt(struc
-               fwd_mask = rta_getattr_u16(tb[IFLA_BRPORT_GROUP_FWD_MASK]);
-               print_0xhex(PRINT_ANY, "group_fwd_mask",
--                          "group_fwd_mask 0x%x ", fwd_mask);
-+                          "group_fwd_mask %#llx ", fwd_mask);
-               _bitmask2str(fwd_mask, convbuf, sizeof(convbuf), fwd_mask_tbl);
-               print_string(PRINT_ANY, "group_fwd_mask_str",
-                            "group_fwd_mask_str %s ", convbuf);
---- a/ip/iplink_geneve.c
-+++ b/ip/iplink_geneve.c
-@@ -276,7 +276,7 @@ static void geneve_print_opt(struct link
-               tos = rta_getattr_u8(tb[IFLA_GENEVE_TOS]);
-       if (tos) {
-               if (is_json_context() || tos != 1)
--                      print_0xhex(PRINT_ANY, "tos", "tos 0x%x ", tos);
-+                      print_0xhex(PRINT_ANY, "tos", "tos %#llx ", tos);
-               else
-                       print_string(PRINT_FP, NULL, "tos %s ", "inherit");
-       }
-@@ -286,8 +286,7 @@ static void geneve_print_opt(struct link
-               if (label)
-                       print_0xhex(PRINT_ANY,
--                                  "label",
--                                  "flowlabel %#x ",
-+                                  "label", "flowlabel %#llx ",
-                                   ntohl(label));
-       }
---- a/ip/iplink_vxlan.c
-+++ b/ip/iplink_vxlan.c
-@@ -522,7 +522,7 @@ static void vxlan_print_opt(struct link_
-               tos = rta_getattr_u8(tb[IFLA_VXLAN_TOS]);
-       if (tos) {
-               if (is_json_context() || tos != 1)
--                      print_0xhex(PRINT_ANY, "tos", "tos 0x%x ", tos);
-+                      print_0xhex(PRINT_ANY, "tos", "tos %#llx ", tos);
-               else
-                       print_string(PRINT_FP, NULL, "tos %s ", "inherit");
-       }
-@@ -542,10 +542,8 @@ static void vxlan_print_opt(struct link_
-               __u32 label = rta_getattr_u32(tb[IFLA_VXLAN_LABEL]);
-               if (label)
--                      print_0xhex(PRINT_ANY,
--                                  "label",
--                                  "flowlabel %#x ",
--                                  ntohl(label));
-+                      print_0xhex(PRINT_ANY, "label",
-+                                  "flowlabel %#llx ", ntohl(label));
-       }
-       if (tb[IFLA_VXLAN_AGEING]) {
---- a/ip/ipntable.c
-+++ b/ip/ipntable.c
-@@ -360,7 +360,7 @@ static void print_ndtconfig(const struct
-       print_uint(PRINT_ANY, "hash_rnd",
-                  "        hash_rnd %u ", ndtc->ndtc_hash_rnd);
-       print_0xhex(PRINT_ANY, "hash_mask",
--                  "hash_mask %08x ", ndtc->ndtc_hash_mask);
-+                  "hash_mask %08llx ", ndtc->ndtc_hash_mask);
-       print_uint(PRINT_ANY, "hash_chain_gc",
-                  "hash_chain_gc %u ", ndtc->ndtc_hash_chain_gc);
---- a/ip/iproute.c
-+++ b/ip/iproute.c
-@@ -346,7 +346,7 @@ static void print_rtax_features(FILE *fp
-       if (features)
-               print_0xhex(PRINT_ANY,
--                          "features", "0x%x ", of);
-+                          "features", "%#llx ", of);
- }
- static void print_rt_flags(FILE *fp, unsigned int flags)
-@@ -483,10 +483,10 @@ static void print_rta_cacheinfo(FILE *fp
-       }
-       if (ci->rta_id)
-               print_0xhex(PRINT_ANY, "ipid",
--                          "ipid 0x%04x ", ci->rta_id);
-+                          "ipid 0x%04llx ", ci->rta_id);
-       if (ci->rta_ts || ci->rta_tsage) {
-               print_0xhex(PRINT_ANY, "ts",
--                          "ts 0x%x", ci->rta_ts);
-+                          "ts 0x%llx", ci->rta_ts);
-               print_uint(PRINT_ANY, "tsage",
-                          "tsage %usec ", ci->rta_tsage);
-       }
-@@ -885,7 +885,7 @@ int print_route(const struct sockaddr_nl
-                               print_uint(PRINT_JSON, "mark", NULL, mark);
-                       else if (mark >= 16)
-                               print_0xhex(PRINT_FP, NULL,
--                                          "mark 0x%x ", mark);
-+                                          "mark 0x%llx ", mark);
-                       else
-                               print_uint(PRINT_FP, NULL,
-                                          "mark %u ", mark);
---- a/ip/iproute_lwtunnel.c
-+++ b/ip/iproute_lwtunnel.c
-@@ -115,7 +115,7 @@ static void print_srh(FILE *fp, struct i
-               tlv = (struct sr6_tlv_hmac *)((char *)srh + offset);
-               print_0xhex(PRINT_ANY, "hmac",
--                          "hmac 0x%X ", ntohl(tlv->hmackeyid));
-+                          "hmac %llX ", ntohl(tlv->hmackeyid));
-       }
- }
---- a/ip/iprule.c
-+++ b/ip/iprule.c
-@@ -263,10 +263,10 @@ int print_rule(const struct sockaddr_nl
-               if (tb[FRA_FWMASK] &&
-                   (mask = rta_getattr_u32(tb[FRA_FWMASK])) != 0xFFFFFFFF) {
--                      print_0xhex(PRINT_ANY, "fwmark", "fwmark 0x%x", mark);
--                      print_0xhex(PRINT_ANY, "fwmask", "/0x%x ", mask);
-+                      print_0xhex(PRINT_ANY, "fwmark", "fwmark %#llx", mark);
-+                      print_0xhex(PRINT_ANY, "fwmask", "/%#llx ", mask);
-               } else {
--                      print_0xhex(PRINT_ANY, "fwmark", "fwmark 0x%x ", mark);
-+                      print_0xhex(PRINT_ANY, "fwmark", "fwmark %#llx ", mark);
-               }
-       }
---- a/ip/iptuntap.c
-+++ b/ip/iptuntap.c
-@@ -254,7 +254,7 @@ static void print_flags(long flags)
-       flags &= ~(IFF_TUN | IFF_TAP | IFF_NO_PI | IFF_ONE_QUEUE |
-                  IFF_VNET_HDR | IFF_PERSIST | IFF_NOFILTER);
-       if (flags)
--              print_0xhex(PRINT_ANY, NULL, "%#x", flags);
-+              print_0xhex(PRINT_ANY, NULL, "%#llx", flags);
-       close_json_array(PRINT_JSON, NULL);
- }
---- a/ip/link_gre.c
-+++ b/ip/link_gre.c
-@@ -463,7 +463,7 @@ static void gre_print_opt(struct link_ut
-               tos = rta_getattr_u8(tb[IFLA_GRE_TOS]);
-       if (tos) {
-               if (is_json_context() || tos != 1)
--                      print_0xhex(PRINT_ANY, "tos", "tos 0x%x ", tos);
-+                      print_0xhex(PRINT_ANY, "tos", "tos %#llx ", tos);
-               else
-                       print_string(PRINT_FP, NULL, "tos %s ", "inherit");
-       }
-@@ -508,7 +508,7 @@ static void gre_print_opt(struct link_ut
-               if (fwmark) {
-                       print_0xhex(PRINT_ANY,
--                                  "fwmark", "fwmark 0x%x ", fwmark);
-+                                  "fwmark", "fwmark %#llx ", fwmark);
-               }
-       }
-@@ -541,7 +541,7 @@ static void gre_print_opt(struct link_ut
-               __u16 erspan_hwid = rta_getattr_u16(tb[IFLA_GRE_ERSPAN_HWID]);
-               print_0xhex(PRINT_ANY,
--                          "erspan_hwid", "erspan_hwid 0x%x ", erspan_hwid);
-+                          "erspan_hwid", "erspan_hwid %#llx ", erspan_hwid);
-       }
-       tnl_print_encap(tb,
---- a/ip/link_gre6.c
-+++ b/ip/link_gre6.c
-@@ -576,7 +576,7 @@ static void gre_print_opt(struct link_ut
-               if (fwmark) {
-                       print_0xhex(PRINT_ANY,
--                                  "fwmark", "fwmark 0x%x ", fwmark);
-+                                  "fwmark", "fwmark %#llx ", fwmark);
-               }
-       }
-@@ -609,7 +609,7 @@ static void gre_print_opt(struct link_ut
-               __u16 erspan_hwid = rta_getattr_u16(tb[IFLA_GRE_ERSPAN_HWID]);
-               print_0xhex(PRINT_ANY,
--                          "erspan_hwid", "erspan_hwid 0x%x ", erspan_hwid);
-+                          "erspan_hwid", "erspan_hwid %#llx ", erspan_hwid);
-       }
-       tnl_print_encap(tb,
---- a/ip/link_ip6tnl.c
-+++ b/ip/link_ip6tnl.c
-@@ -457,7 +457,7 @@ static void ip6tunnel_print_opt(struct l
-               if (fwmark) {
-                       print_0xhex(PRINT_ANY,
--                                  "fwmark", "fwmark 0x%x ", fwmark);
-+                                  "fwmark", "fwmark %#llx ", fwmark);
-               }
-       }
---- a/ip/link_iptnl.c
-+++ b/ip/link_iptnl.c
-@@ -418,7 +418,7 @@ static void iptunnel_print_opt(struct li
-               tos = rta_getattr_u8(tb[IFLA_IPTUN_TOS]);
-       if (tos) {
-               if (is_json_context() || tos != 1)
--                      print_0xhex(PRINT_ANY, "tos", "tos 0x%x ", tos);
-+                      print_0xhex(PRINT_ANY, "tos", "tos %#llx ", tos);
-               else
-                       print_string(PRINT_FP, NULL, "tos %s ", "inherit");
-       }
-@@ -476,7 +476,7 @@ static void iptunnel_print_opt(struct li
-               if (fwmark) {
-                       print_0xhex(PRINT_ANY,
--                                  "fwmark", "fwmark 0x%x ", fwmark);
-+                                  "fwmark", "fwmark %#llx ", fwmark);
-               }
-       }
---- a/ip/link_vti.c
-+++ b/ip/link_vti.c
-@@ -208,7 +208,7 @@ static void vti_print_opt(struct link_ut
-               if (fwmark) {
-                       print_0xhex(PRINT_ANY,
--                                  "fwmark", "fwmark 0x%x ", fwmark);
-+                                  "fwmark", "fwmark %#llx ", fwmark);
-               }
-       }
- }
---- a/ip/link_vti6.c
-+++ b/ip/link_vti6.c
-@@ -210,7 +210,7 @@ static void vti6_print_opt(struct link_u
-               if (fwmark) {
-                       print_0xhex(PRINT_ANY,
--                                  "fwmark", "fwmark 0x%x ", fwmark);
-+                                  "fwmark", "fwmark %#llx ", fwmark);
-               }
-       }
- }
---- a/tc/m_ife.c
-+++ b/tc/m_ife.c
-@@ -247,7 +247,7 @@ static int print_ife(struct action_util
-       if (tb[TCA_IFE_TYPE]) {
-               ife_type = rta_getattr_u16(tb[TCA_IFE_TYPE]);
-               has_optional = 1;
--              print_0xhex(PRINT_ANY, "type", "type 0x%X ", ife_type);
-+              print_0xhex(PRINT_ANY, "type", "type %#llX ", ife_type);
-       }
-       if (has_optional)
---- a/tc/q_htb.c
-+++ b/tc/q_htb.c
-@@ -332,7 +332,7 @@ static int htb_print_opt(struct qdisc_ut
-               if (RTA_PAYLOAD(tb[TCA_HTB_INIT])  < sizeof(*gopt)) return -1;
-               print_int(PRINT_ANY, "r2q", "r2q %d", gopt->rate2quantum);
--              print_0xhex(PRINT_ANY, "default", " default %x", gopt->defcls);
-+              print_0xhex(PRINT_ANY, "default", " default %#llx", gopt->defcls);
-               print_uint(PRINT_ANY, "direct_packets_stat",
-                          " direct_packets_stat %u", gopt->direct_pkts);
-               if (show_details) {
diff --git a/package/network/utils/iproute2/patches/001-tc-fix-undefined-XATTR_SIZE_MAX.patch b/package/network/utils/iproute2/patches/001-tc-fix-undefined-XATTR_SIZE_MAX.patch
new file mode 100644 (file)
index 0000000..6f28a28
--- /dev/null
@@ -0,0 +1,10 @@
+--- a/tc/f_flower.c
++++ b/tc/f_flower.c
+@@ -17,6 +17,7 @@
+ #include <linux/if_arp.h>
+ #include <linux/if_ether.h>
+ #include <linux/ip.h>
++#include <linux/limits.h>
+ #include <linux/tc_act/tc_vlan.h>
+ #include <linux/mpls.h>
diff --git a/package/network/utils/iproute2/patches/002-tc-fix-xtables-incorrect-usage-of-LDFLAGS.patch b/package/network/utils/iproute2/patches/002-tc-fix-xtables-incorrect-usage-of-LDFLAGS.patch
deleted file mode 100644 (file)
index d598136..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-From 6ddb36c3a9686df1cca2f4d06518395f1eb9d5cc Mon Sep 17 00:00:00 2001
-From: Syrone Wong <wong.syrone@gmail.com>
-Date: Wed, 12 Dec 2018 19:35:08 +0800
-Subject: [PATCH] tc: fix xtables incorrect usage of LDFLAGS
-
-The incorrect setting of LDFLAGS causes error below:
-
-> em_ipt.o: In function `em_ipt_print_epot':
-> em_ipt.c:(.text.em_ipt_print_epot+0x2e): undefined reference to
-> `xtables_init_all'
-
-em_ipt.c gets involved when TC_CONFIG_XT=y, which requires xtables,
-while tc/Makefile doesn't pass flags correctly. It adds '-lxtables'
-to LDFLAGS instead of LDLIBS.
-
-Fixes: dd296215 ("tc: add em_ipt ematch for calling xtables matches from tc matching context")
-
-Signed-off-by: Syrone Wong <wong.syrone@gmail.com>
-Acked-by: Eyal Birger <eyal.birger@gmail.com>
-Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
----
- tc/Makefile | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/tc/Makefile
-+++ b/tc/Makefile
-@@ -170,7 +170,7 @@ em_ipset.o: CFLAGS += $$($(PKG_CONFIG) x
- em_ipt.o: CFLAGS += $$($(PKG_CONFIG) xtables --cflags)
- ifeq ($(TC_CONFIG_XT),y)
--  LDFLAGS += $$($(PKG_CONFIG) xtables --libs)
-+  LDLIBS += $$($(PKG_CONFIG) xtables --libs)
- endif
- %.yacc.c: %.y
index 697a6471a7ac500f403ec76c43d690a7eafe0ffa..505f0221e3ae11bc05cf081d9cc61623c8cf94ae 100644 (file)
@@ -1,11 +1,11 @@
 --- a/configure
 +++ b/configure
-@@ -281,7 +281,7 @@ check_selinux()
+@@ -254,7 +254,7 @@ check_selinux()
  
  check_mnl()
  {
--      if ${PKG_CONFIG} libmnl --exists
-+      if [ "${HAVE_MNL}" = "y" ] && ${PKG_CONFIG} libmnl --exists
-       then
+-      if ${PKG_CONFIG} libmnl --exists; then
++      if [ "${HAVE_MNL}" = "y" ] && ${PKG_CONFIG} libmnl --exists; then
                echo "HAVE_MNL:=y" >>$CONFIG
                echo "yes"
index dc0547a25697e6db3f028a2dc0b4811c299f7d50..91240b6d2f4aa6c042f10775806157bde17bba94 100644 (file)
@@ -89,7 +89,7 @@
        { "help",       do_help },
 --- a/lib/utils.c
 +++ b/lib/utils.c
-@@ -1012,6 +1012,7 @@ const char *rt_addr_n2a_r(int af, int le
+@@ -1000,6 +1000,7 @@ const char *rt_addr_n2a_r(int af, int le
                return inet_ntop(af, addr, buf, buflen);
        case AF_MPLS:
                return mpls_ntop(af, addr, buf, buflen);
@@ -97,7 +97,7 @@
        case AF_IPX:
                return ipx_ntop(af, addr, buf, buflen);
        case AF_DECnet:
-@@ -1021,6 +1022,7 @@ const char *rt_addr_n2a_r(int af, int le
+@@ -1009,6 +1010,7 @@ const char *rt_addr_n2a_r(int af, int le
                memcpy(dna.a_addr, addr, 2);
                return dnet_ntop(af, &dna, buf, buflen);
        }
index 1c44616253c85cd2138182b897e7400e6c6d6e7d..31aacffba82231ba39c9a3c5097455c2ae28c930 100644 (file)
@@ -1,6 +1,6 @@
 --- a/configure
 +++ b/configure
-@@ -257,8 +257,9 @@ check_elf()
+@@ -231,8 +231,9 @@ check_elf()
        echo "HAVE_ELF:=y" >>$CONFIG
        echo "yes"
  
@@ -47,7 +47,7 @@
 +      rm -f $(NLOBJ) $(UTILOBJ) $(ELFOBJ) $(ADDLIB) libnetlink.a libutil.a libutil-elf.a
 --- a/tc/Makefile
 +++ b/tc/Makefile
-@@ -132,8 +132,8 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc
+@@ -133,8 +133,8 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc
  
  all: tc $(TCSO)