build.sh 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #!/bin/sh
  2. #shellcheck disable=SC2090,SC2086,SC2089
  3. set -ef
  4. if [ "$1" = "help" ]; then
  5. echo "Usage: ./build.sh"
  6. echo " [no]debian - Defines whether a Debian package or a source archive is to be created"
  7. echo " [no]sourcearchive - Defines whether a souce archive is to be created"
  8. echo " libsodium|tweetnacl - Defines the NaCl library to be used"
  9. echo " By default, an attempt is made to build with libsodium."
  10. echo " If libsodium is not available, the bundled tweetnacl library is used."
  11. exit
  12. fi
  13. tar="tar"
  14. if [ -z "$cc" ]; then
  15. cc="cc"
  16. fi
  17. if [ "$(uname -s)" = "OpenBSD" ] || [ "$(uname -s)" = "FreeBSD" ] || [ "$(uname -s)" = "NetBSD" ]; then
  18. echo "Detected *BSD"
  19. tar="gtar"
  20. export CPATH="/usr/local/include:${CPATH}"
  21. elif [ "$(uname -s)" = "SunOS" ]; then
  22. echo "Detected SunOS"
  23. tar="gtar"
  24. CFLAGS="$CFLAGS -DSOLARIS -m64"
  25. LDFLAGS="$LDFLAGS -lnsl -lsocket"
  26. elif [ "$(uname -s)" = "Darwin" ]; then
  27. echo "Detected Mac OS X (Darwin)"
  28. CFLAGS="$CFLAGS -arch i686"
  29. LDFLAGS="$LDFLAGS -arch i686"
  30. fi
  31. VERSION=$(cat version)
  32. CFLAGS="$CFLAGS -O2"
  33. CFLAGS="$CFLAGS -Wall -Wextra -Wpedantic"
  34. ./clean.sh
  35. mkdir -p out
  36. if [ "$2" = "sourcearchive" ]; then
  37. echo Creating source archive...
  38. $tar --transform "s,^,quicktun-$VERSION/," --exclude "debian/data" -czf "out/quicktun-$VERSION.tgz" build.sh clean.sh deb src version
  39. fi
  40. mkdir -p obj tmp tmp/include
  41. export LIBRARY_PATH="/usr/local/lib/:${LIBRARY_PATH}"
  42. echo '#include <sodium.h>' > tmp/libsodiumtest.c
  43. if [ "$3" = "libsodium" ] || ([ -z "$3" ] && $cc -shared -lsodium tmp/libsodiumtest.c -o tmp/libsodiumtest 2>/dev/null); then
  44. echo Using shared libsodium.
  45. echo '#include <sodium.h>' > tmp/include/nacl.h
  46. export CPATH="./tmp/include/:${CPATH}"
  47. export CRYPTLIB="-lsodium"
  48. else
  49. echo Building TweetNaCl...
  50. echo 'The TweetNaCl cryptography library is not optimized for performance. Please install libsodium or libnacl before building QuickTun for best performance.'
  51. $cc $CFLAGS -c src/tweetnacl.c -o obj/tweetnacl.o
  52. $cc $CFLAGS -c src/randombytes.c -o obj/randombytes.o
  53. echo '#include <src/tweetnacl.h>' > tmp/include/nacl.h
  54. export CPATH="./tmp/include/:${CPATH}"
  55. export CRYPTLIB="obj/randombytes.o obj/tweetnacl.o"
  56. fi
  57. CFLAGS="$CFLAGS -DQT_VERSION=\"$VERSION\""
  58. echo Building combined binary...
  59. $cc $CFLAGS -c -DCOMBINED_BINARY src/proto.raw.c -o obj/proto.raw.o
  60. $cc $CFLAGS -c -DCOMBINED_BINARY src/proto.nacl0.c -o obj/proto.nacl0.o
  61. $cc $CFLAGS -c -DCOMBINED_BINARY src/proto.nacltai.c -o obj/proto.nacltai.o
  62. $cc $CFLAGS -c -DCOMBINED_BINARY src/proto.salty.c -o obj/proto.salty.o
  63. $cc $CFLAGS -c -DCOMBINED_BINARY src/run.combined.c -o obj/run.combined.o
  64. $cc $CFLAGS -c src/common.c -o obj/common.o
  65. $cc $CFLAGS -o out/quicktun.combined obj/common.o obj/run.combined.o obj/proto.raw.o obj/proto.nacl0.o obj/proto.nacltai.o obj/proto.salty.o $CRYPTLIB $LDFLAGS
  66. ln out/quicktun.combined out/quicktun
  67. echo Building single protocol binaries...
  68. $cc $CFLAGS -o out/quicktun.raw src/proto.raw.c $LDFLAGS
  69. $cc $CFLAGS -o out/quicktun.nacl0 src/proto.nacl0.c $CRYPTLIB $LDFLAGS
  70. $cc $CFLAGS -o out/quicktun.nacltai src/proto.nacltai.c $CRYPTLIB $LDFLAGS
  71. $cc $CFLAGS -o out/quicktun.salty src/proto.salty.c $CRYPTLIB $LDFLAGS
  72. $cc $CFLAGS -o out/quicktun.keypair src/keypair.c $CRYPTLIB $LDFLAGS
  73. if [ "$1" = "debian" ]; then
  74. echo Building debian binary...
  75. $cc $CFLAGS -c -DCOMBINED_BINARY -DDEBIAN_BINARY src/run.combined.c -o obj/run.debian.o
  76. $cc $CFLAGS -o out/quicktun.debian obj/common.o obj/run.debian.o obj/proto.raw.o obj/proto.nacl0.o obj/proto.nacltai.o obj/proto.salty.o $CRYPTLIB $LDFLAGS
  77. if [ -x /usr/bin/dpkg-deb ] && [ -x /usr/bin/fakeroot ]; then
  78. echo Building debian package...
  79. (
  80. cd deb
  81. ./build.sh
  82. )
  83. fi
  84. fi