]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
build: Fix link errors on some systems
authorRoi Dayan <roid@nvidia.com>
Tue, 12 Jan 2021 10:33:17 +0000 (12:33 +0200)
committerStephen Hemminger <stephen@networkplumber.org>
Mon, 18 Jan 2021 20:28:47 +0000 (12:28 -0800)
Since moving get_rate() and get_size() from tc to lib, on some
systems we fail to link because of missing math lib.
Move the functions that require math lib to their own c file
and add -lm to dcb that now use those functions.

../lib/libutil.a(utils.o): In function `get_rate':
utils.c:(.text+0x10dc): undefined reference to `floor'
../lib/libutil.a(utils.o): In function `get_size':
utils.c:(.text+0x1394): undefined reference to `floor'
../lib/libutil.a(json_print.o): In function `sprint_size':
json_print.c:(.text+0x14c0): undefined reference to `rint'
json_print.c:(.text+0x14f4): undefined reference to `rint'
json_print.c:(.text+0x157c): undefined reference to `rint'

Fixes: f3be0e6366ac ("lib: Move get_rate(), get_rate64() from tc here")
Fixes: 44396bdfcc0a ("lib: Move get_size() from tc here")
Fixes: adbe5de96662 ("lib: Move sprint_size() from tc here, add print_size()")
Signed-off-by: Roi Dayan <roid@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
Tested-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
dcb/Makefile
include/json_print.h
lib/Makefile
lib/json_print.c
lib/json_print_math.c [new file with mode: 0644]
lib/utils.c
lib/utils_math.c [new file with mode: 0644]

index 4add954b4bba733a2d74a6527b98b289c6018d05..7c09bb4f2e0084a8c748d5946d0cde28c5a3e172 100644 (file)
@@ -7,6 +7,7 @@ ifeq ($(HAVE_MNL),y)
 
 DCBOBJ = dcb.o dcb_buffer.o dcb_ets.o dcb_maxrate.o dcb_pfc.o
 TARGETS += dcb
+LDLIBS += -lm
 
 endif
 
index 1a1ad5ffa55298f1b2ab1ea0f7936f2e321f8f73..6fcf9fd910ecc5d158ffa0f528b2780439813826 100644 (file)
@@ -15,6 +15,9 @@
 #include "json_writer.h"
 #include "color.h"
 
+#define _IS_JSON_CONTEXT(type) (is_json_context() && (type & PRINT_JSON || type & PRINT_ANY))
+#define _IS_FP_CONTEXT(type)   (!is_json_context() && (type & PRINT_FP || type & PRINT_ANY))
+
 json_writer_t *get_json_writer(void);
 
 /*
index 764c9137d0ecd188e94a719631d7da7ea09324a7..6c98f9a61fdbdd6366924fa84b412df066fb3441 100644 (file)
@@ -3,8 +3,8 @@ include ../config.mk
 
 CFLAGS += -fPIC
 
-UTILOBJ = utils.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
-       inet_proto.o namespace.o json_writer.o json_print.o \
+UTILOBJ = utils.o utils_math.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
+       inet_proto.o namespace.o json_writer.o json_print.o json_print_math.o \
        names.o color.o bpf_legacy.o bpf_glue.o exec.o fs.o cg_map.o
 
 ifeq ($(HAVE_ELF),y)
index b086123ad1f48a758730a45aaa4c38f9593b0df9..994a2f8d6ae0e44e551d8217e1d799c2e2ef0738 100644 (file)
 
 #include <stdarg.h>
 #include <stdio.h>
-#include <math.h>
 
 #include "utils.h"
 #include "json_print.h"
 
 static json_writer_t *_jw;
 
-#define _IS_JSON_CONTEXT(type) ((type & PRINT_JSON || type & PRINT_ANY) && _jw)
-#define _IS_FP_CONTEXT(type) (!_jw && (type & PRINT_FP || type & PRINT_ANY))
-
 static void __new_json_obj(int json, bool have_array)
 {
        if (json) {
@@ -342,32 +338,3 @@ int print_color_rate(bool use_iec, enum output_type type, enum color_attr color,
        free(buf);
        return rc;
 }
-
-char *sprint_size(__u32 sz, char *buf)
-{
-       long kilo = 1024;
-       long mega = kilo * kilo;
-       size_t len = SPRINT_BSIZE - 1;
-       double tmp = sz;
-
-       if (sz >= mega && fabs(mega * rint(tmp / mega) - sz) < 1024)
-               snprintf(buf, len, "%gMb", rint(tmp / mega));
-       else if (sz >= kilo && fabs(kilo * rint(tmp / kilo) - sz) < 16)
-               snprintf(buf, len, "%gKb", rint(tmp / kilo));
-       else
-               snprintf(buf, len, "%ub", sz);
-
-       return buf;
-}
-
-int print_color_size(enum output_type type, enum color_attr color,
-                    const char *key, const char *fmt, __u32 sz)
-{
-       SPRINT_BUF(buf);
-
-       if (_IS_JSON_CONTEXT(type))
-               return print_color_uint(type, color, key, "%u", sz);
-
-       sprint_size(sz, buf);
-       return print_color_string(type, color, key, fmt, buf);
-}
diff --git a/lib/json_print_math.c b/lib/json_print_math.c
new file mode 100644 (file)
index 0000000..f4d5049
--- /dev/null
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <math.h>
+
+#include "utils.h"
+#include "json_print.h"
+
+char *sprint_size(__u32 sz, char *buf)
+{
+       long kilo = 1024;
+       long mega = kilo * kilo;
+       size_t len = SPRINT_BSIZE - 1;
+       double tmp = sz;
+
+       if (sz >= mega && fabs(mega * rint(tmp / mega) - sz) < 1024)
+               snprintf(buf, len, "%gMb", rint(tmp / mega));
+       else if (sz >= kilo && fabs(kilo * rint(tmp / kilo) - sz) < 16)
+               snprintf(buf, len, "%gKb", rint(tmp / kilo));
+       else
+               snprintf(buf, len, "%ub", sz);
+
+       return buf;
+}
+
+int print_color_size(enum output_type type, enum color_attr color,
+                    const char *key, const char *fmt, __u32 sz)
+{
+       SPRINT_BUF(buf);
+
+       if (_IS_JSON_CONTEXT(type))
+               return print_color_uint(type, color, key, "%u", sz);
+
+       sprint_size(sz, buf);
+       return print_color_string(type, color, key, fmt, buf);
+}
index de875639c60884ba9d0783c3c241635e09918bb6..a0ba5181160ef4c00440368b9ae3591d3a353b63 100644 (file)
@@ -513,120 +513,6 @@ int get_addr64(__u64 *ap, const char *cp)
        return 1;
 }
 
-/* See http://physics.nist.gov/cuu/Units/binary.html */
-static const struct rate_suffix {
-       const char *name;
-       double scale;
-} suffixes[] = {
-       { "bit",        1. },
-       { "Kibit",      1024. },
-       { "kbit",       1000. },
-       { "mibit",      1024.*1024. },
-       { "mbit",       1000000. },
-       { "gibit",      1024.*1024.*1024. },
-       { "gbit",       1000000000. },
-       { "tibit",      1024.*1024.*1024.*1024. },
-       { "tbit",       1000000000000. },
-       { "Bps",        8. },
-       { "KiBps",      8.*1024. },
-       { "KBps",       8000. },
-       { "MiBps",      8.*1024*1024. },
-       { "MBps",       8000000. },
-       { "GiBps",      8.*1024.*1024.*1024. },
-       { "GBps",       8000000000. },
-       { "TiBps",      8.*1024.*1024.*1024.*1024. },
-       { "TBps",       8000000000000. },
-       { NULL }
-};
-
-int get_rate(unsigned int *rate, const char *str)
-{
-       char *p;
-       double bps = strtod(str, &p);
-       const struct rate_suffix *s;
-
-       if (p == str)
-               return -1;
-
-       for (s = suffixes; s->name; ++s) {
-               if (strcasecmp(s->name, p) == 0) {
-                       bps *= s->scale;
-                       p += strlen(p);
-                       break;
-               }
-       }
-
-       if (*p)
-               return -1; /* unknown suffix */
-
-       bps /= 8; /* -> bytes per second */
-       *rate = bps;
-       /* detect if an overflow happened */
-       if (*rate != floor(bps))
-               return -1;
-       return 0;
-}
-
-int get_rate64(__u64 *rate, const char *str)
-{
-       char *p;
-       double bps = strtod(str, &p);
-       const struct rate_suffix *s;
-
-       if (p == str)
-               return -1;
-
-       for (s = suffixes; s->name; ++s) {
-               if (strcasecmp(s->name, p) == 0) {
-                       bps *= s->scale;
-                       p += strlen(p);
-                       break;
-               }
-       }
-
-       if (*p)
-               return -1; /* unknown suffix */
-
-       bps /= 8; /* -> bytes per second */
-       *rate = bps;
-       return 0;
-}
-
-int get_size(unsigned int *size, const char *str)
-{
-       double sz;
-       char *p;
-
-       sz = strtod(str, &p);
-       if (p == str)
-               return -1;
-
-       if (*p) {
-               if (strcasecmp(p, "kb") == 0 || strcasecmp(p, "k") == 0)
-                       sz *= 1024;
-               else if (strcasecmp(p, "gb") == 0 || strcasecmp(p, "g") == 0)
-                       sz *= 1024*1024*1024;
-               else if (strcasecmp(p, "gbit") == 0)
-                       sz *= 1024*1024*1024/8;
-               else if (strcasecmp(p, "mb") == 0 || strcasecmp(p, "m") == 0)
-                       sz *= 1024*1024;
-               else if (strcasecmp(p, "mbit") == 0)
-                       sz *= 1024*1024/8;
-               else if (strcasecmp(p, "kbit") == 0)
-                       sz *= 1024/8;
-               else if (strcasecmp(p, "b") != 0)
-                       return -1;
-       }
-
-       *size = sz;
-
-       /* detect if an overflow happened */
-       if (*size != floor(sz))
-               return -1;
-
-       return 0;
-}
-
 static void set_address_type(inet_prefix *addr)
 {
        switch (addr->family) {
diff --git a/lib/utils_math.c b/lib/utils_math.c
new file mode 100644 (file)
index 0000000..9ef3dd6
--- /dev/null
@@ -0,0 +1,123 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <asm/types.h>
+
+#include "utils.h"
+
+/* See http://physics.nist.gov/cuu/Units/binary.html */
+static const struct rate_suffix {
+       const char *name;
+       double scale;
+} suffixes[] = {
+       { "bit",        1. },
+       { "Kibit",      1024. },
+       { "kbit",       1000. },
+       { "mibit",      1024.*1024. },
+       { "mbit",       1000000. },
+       { "gibit",      1024.*1024.*1024. },
+       { "gbit",       1000000000. },
+       { "tibit",      1024.*1024.*1024.*1024. },
+       { "tbit",       1000000000000. },
+       { "Bps",        8. },
+       { "KiBps",      8.*1024. },
+       { "KBps",       8000. },
+       { "MiBps",      8.*1024*1024. },
+       { "MBps",       8000000. },
+       { "GiBps",      8.*1024.*1024.*1024. },
+       { "GBps",       8000000000. },
+       { "TiBps",      8.*1024.*1024.*1024.*1024. },
+       { "TBps",       8000000000000. },
+       { NULL }
+};
+
+int get_rate(unsigned int *rate, const char *str)
+{
+       char *p;
+       double bps = strtod(str, &p);
+       const struct rate_suffix *s;
+
+       if (p == str)
+               return -1;
+
+       for (s = suffixes; s->name; ++s) {
+               if (strcasecmp(s->name, p) == 0) {
+                       bps *= s->scale;
+                       p += strlen(p);
+                       break;
+               }
+       }
+
+       if (*p)
+               return -1; /* unknown suffix */
+
+       bps /= 8; /* -> bytes per second */
+       *rate = bps;
+       /* detect if an overflow happened */
+       if (*rate != floor(bps))
+               return -1;
+       return 0;
+}
+
+int get_rate64(__u64 *rate, const char *str)
+{
+       char *p;
+       double bps = strtod(str, &p);
+       const struct rate_suffix *s;
+
+       if (p == str)
+               return -1;
+
+       for (s = suffixes; s->name; ++s) {
+               if (strcasecmp(s->name, p) == 0) {
+                       bps *= s->scale;
+                       p += strlen(p);
+                       break;
+               }
+       }
+
+       if (*p)
+               return -1; /* unknown suffix */
+
+       bps /= 8; /* -> bytes per second */
+       *rate = bps;
+       return 0;
+}
+
+int get_size(unsigned int *size, const char *str)
+{
+       double sz;
+       char *p;
+
+       sz = strtod(str, &p);
+       if (p == str)
+               return -1;
+
+       if (*p) {
+               if (strcasecmp(p, "kb") == 0 || strcasecmp(p, "k") == 0)
+                       sz *= 1024;
+               else if (strcasecmp(p, "gb") == 0 || strcasecmp(p, "g") == 0)
+                       sz *= 1024*1024*1024;
+               else if (strcasecmp(p, "gbit") == 0)
+                       sz *= 1024*1024*1024/8;
+               else if (strcasecmp(p, "mb") == 0 || strcasecmp(p, "m") == 0)
+                       sz *= 1024*1024;
+               else if (strcasecmp(p, "mbit") == 0)
+                       sz *= 1024*1024/8;
+               else if (strcasecmp(p, "kbit") == 0)
+                       sz *= 1024/8;
+               else if (strcasecmp(p, "b") != 0)
+                       return -1;
+       }
+
+       *size = sz;
+
+       /* detect if an overflow happened */
+       if (*size != floor(sz))
+               return -1;
+
+       return 0;
+}