hairgap icon indicating copy to clipboard operation
hairgap copied to clipboard

Unable to compile on macOS Catalina

Open d9pouces opened this issue 5 years ago • 0 comments

I tried to compile Hairgap on Catalina, but there are some compilation errors:

$ make
mkdir -p build
clang -c src/hairgaps.c -o build/hairgaps.o -Wall -Wextra -fPIE -fstack-protector-strong -Wno-format-security -Werror -I./wirehair/include -Isrc/lib -D_FORTIFY_SOURCE=1 -Ofast -D_FORTIFY_SOURCE=1
clang -c src/lib/channel.c -o build/channel.o -Wall -Wextra -fPIE -fstack-protector-strong -Wno-format-security -Werror -I./wirehair/include -Isrc/lib -D_FORTIFY_SOURCE=1 -Ofast -D_FORTIFY_SOURCE=1
clang -c src/lib/common.c -o build/common.o -Wall -Wextra -fPIE -fstack-protector-strong -Wno-format-security -Werror -I./wirehair/include -Isrc/lib -D_FORTIFY_SOURCE=1 -Ofast -D_FORTIFY_SOURCE=1
clang -c src/lib/config.c -o build/config.o -Wall -Wextra -fPIE -fstack-protector-strong -Wno-format-security -Werror -I./wirehair/include -Isrc/lib -D_FORTIFY_SOURCE=1 -Ofast -D_FORTIFY_SOURCE=1
clang -c src/lib/encoding.c -o build/encoding.o -Wall -Wextra -fPIE -fstack-protector-strong -Wno-format-security -Werror -I./wirehair/include -Isrc/lib -D_FORTIFY_SOURCE=1 -Ofast -D_FORTIFY_SOURCE=1
src/lib/encoding.c:394:19: error: format specifies type 'unsigned long' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Werror,-Wformat]
                  pkt.hdr.chunk_num, dec->chunk->num, pkt.hdr.data_id);
                  ^~~~~~~~~~~~~~~~~
src/lib/common.h:45:21: note: expanded from macro 'ERROR'
    fprintf(stderr, __VA_ARGS__);\
                    ^~~~~~~~~~~
src/lib/encoding.c:394:38: error: format specifies type 'unsigned long' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Werror,-Wformat]
                  pkt.hdr.chunk_num, dec->chunk->num, pkt.hdr.data_id);
                                     ^~~~~~~~~~~~~~~
src/lib/common.h:45:21: note: expanded from macro 'ERROR'
    fprintf(stderr, __VA_ARGS__);\
                    ^~~~~~~~~~~
2 errors generated.
make: *** [build/encoding.o] Error 1

I tried to patch GNUmakefile, src/lib/encoding.c, src/lib/hgap_receive.c and src/lib/proto.c. Hairgap now compiles (and works, at least for a quick demo) but I am sure that a better fix exists.

diff --git a/GNUmakefile b/GNUmakefile
index 41d7b45..3c2b247 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -23,7 +23,7 @@ CFLAGS = -Wall -Wextra -fPIE -fstack-protector-strong \
 	 -Wno-format-security \
 	 -Werror \
          $(IFLAGS)
-LDFLAGS = $(IFLAGS) -L$(WIREHAIR)/bin -lpthread -lstdc++ -Wl,-z,now -Wl,-z,relro
+LDFLAGS = $(IFLAGS) -L$(WIREHAIR)/bin -lpthread -lstdc++ -Wl -Wl

 INSTALLDIR=/usr/local
 BIN=${INSTALLDIR}/bin
diff --git a/src/lib/encoding.c b/src/lib/encoding.c
index 4708789..0078b16 100644
--- a/src/lib/encoding.c
+++ b/src/lib/encoding.c
@@ -391,7 +391,7 @@ hgap_decoder_read(struct hgap_decoder *dec, void *raw_pkt, size_t len)
         if (!dec->chunk_complete) {
             ERROR("Error: missed too many packets "
                   "(cur chunk: %lu, last_chunk: %lu, cur_id: %u\n",
-                  pkt.hdr.chunk_num, dec->chunk->num, pkt.hdr.data_id);
+                  (unsigned long) pkt.hdr.chunk_num, (unsigned long) dec->chunk->num, pkt.hdr.data_id);
             return -HGAP_ERR_INCOMPLETE_CHUNK;
         }

diff --git a/src/lib/hgap_receive.c b/src/lib/hgap_receive.c
index 7a57079..4dfefa3 100644
--- a/src/lib/hgap_receive.c
+++ b/src/lib/hgap_receive.c
@@ -259,9 +259,6 @@ writer(struct writer_arg* args)
     int retval = HGAP_SUCCESS;

     int fd = fileno(out);
-    if (fd != -1) {
-        posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE);
-    }

     size_t data_written = 0;
     size_t data_written_total = 0;
diff --git a/src/lib/proto.c b/src/lib/proto.c
index 2d9b838..76bc390 100644
--- a/src/lib/proto.c
+++ b/src/lib/proto.c
@@ -19,7 +19,7 @@

 #include "proto.h"

-#include <endian.h>
+#include <machine/endian.h>
 #include <inttypes.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -28,6 +28,26 @@
 #include <wirehair.h>

 #include "common.h"
+#ifdef __APPLE__
+
+#include <libkern/OSByteOrder.h>
+
+#define htobe16(x) OSSwapHostToBigInt16(x)
+#define htole16(x) OSSwapHostToLittleInt16(x)
+#define be16toh(x) OSSwapBigToHostInt16(x)
+#define le16toh(x) OSSwapLittleToHostInt16(x)
+
+#define htobe32(x) OSSwapHostToBigInt32(x)
+#define htole32(x) OSSwapHostToLittleInt32(x)
+#define be32toh(x) OSSwapBigToHostInt32(x)
+#define le32toh(x) OSSwapLittleToHostInt32(x)
+
+#define htobe64(x) OSSwapHostToBigInt64(x)
+#define htole64(x) OSSwapHostToLittleInt64(x)
+#define be64toh(x) OSSwapBigToHostInt64(x)
+#define le64toh(x) OSSwapLittleToHostInt64(x)
+
+#endif

 int
 hgap_pkt_parse(struct hgap_pkt *pkt, const void *raw_pkt, size_t size)

d9pouces avatar Jan 03 '20 22:01 d9pouces