summaryrefslogtreecommitdiff
path: root/other/analysis/gen-file.sh
blob: 1c2a3f6d89982f83c78e8b7f60c25b3146cd6f33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/bin/bash

CPPFLAGS="-DMIN_LOGGER_LEVEL=LOGGER_LEVEL_TRACE"
CPPFLAGS+=("-isystem" "/usr/include/opus")
CPPFLAGS+=("-Iauto_tests")
CPPFLAGS+=("-Iother")
CPPFLAGS+=("-Iother/bootstrap_daemon/src")
CPPFLAGS+=("-Iother/fun")
CPPFLAGS+=("-Itesting")
CPPFLAGS+=("-Itesting/groupchats")
CPPFLAGS+=("-Itoxcore")
CPPFLAGS+=("-Itoxav")
CPPFLAGS+=("-Itoxencryptsave")

LDFLAGS=("-lopus" "-lsodium" "-lvpx" "-lpthread" "-lconfig")
LDFLAGS+=("-fuse-ld=gold")
LDFLAGS+=("-Wl,--detect-odr-violations")
LDFLAGS+=("-Wl,--warn-common")
LDFLAGS+=("-Wl,--warn-execstack")
LDFLAGS+=("-Wl,-z,noexecstack")
LDFLAGS+=("-Wl,-z,now")

put() {
  if [ "$SKIP_LINES" = "" ]; then
    echo "#line 1 \"$1\"" >>amalgamation.cc
  fi
  cat "$1" >>amalgamation.cc
}

putmain() {
  echo "namespace ${1//[^a-zA-Z0-9_]/_} {" >>amalgamation.cc
  if [ "$SKIP_LINES" = "" ]; then
    echo "#line 1 \"$1\"" >>amalgamation.cc
  fi
  sed -e 's/^int main(/static &/' "$1" >>amalgamation.cc
  echo "} //  namespace ${1//[^a-zA-Z0-9_]/_}" >>amalgamation.cc
}

callmain() {
  echo "  call(${1//[^a-zA-Z0-9_]/_}::main, argc, argv);" >>amalgamation.cc
}

: >amalgamation.cc

echo "#include <algorithm>" >>amalgamation.cc
echo "#include <cstdio>" >>amalgamation.cc
echo "#include <memory>" >>amalgamation.cc
echo "#include <random>" >>amalgamation.cc

put auto_tests/check_compat.h

FIND_QUERY="find . '-(' -name '*.cc' -or -name '*.c' '-)'"
FIND_QUERY="$FIND_QUERY -and -not -wholename './_build/*'"
FIND_QUERY="$FIND_QUERY -and -not -wholename './super_donators/*'"
FIND_QUERY="$FIND_QUERY -and -not -wholename './toxav/*.cc'"
FIND_QUERY="$FIND_QUERY -and -not -wholename './toxcore/*.cc'"
FIND_QUERY="$FIND_QUERY -and -not -wholename './toxencryptsave/*.cc'"
FIND_QUERY="$FIND_QUERY -and -not -name amalgamation.cc"
FIND_QUERY="$FIND_QUERY -and -not -name av_test.c"
FIND_QUERY="$FIND_QUERY -and -not -name dht_test.c"
FIND_QUERY="$FIND_QUERY -and -not -name version_test.c"

readarray -t FILES <<<"$(eval "$FIND_QUERY")"

(for i in "${FILES[@]}"; do
  grep -o '#include <[^>]*>' "$i" |
    grep -E -v '<win|<ws|<iphlp|<libc|<mach/|<crypto_|<randombytes|<u.h>|<sys/filio|<linux'
done) | sort -u >>amalgamation.cc

echo 'namespace {' >>amalgamation.cc
for i in "${FILES[@]}"; do
  if ! grep -q '^int main(' "$i"; then
    put "$i"
  fi
done

for i in "${FILES[@]}"; do
  if grep -q '^int main(' "$i"; then
    putmain "$i"
  fi
done

echo "static void call(int m(), int argc, char **argv) { m(); }" >>amalgamation.cc
echo "static void call(int m(int, char **), int argc, char **argv) { m(argc, argv); }" >>amalgamation.cc
echo '}  // namespace' >>amalgamation.cc

echo "int main(int argc, char **argv) {" >>amalgamation.cc
for i in "${FILES[@]}"; do
  if grep -q '^int main(' "$i"; then
    callmain "$i"
  fi
done
echo "  return 0;" >>amalgamation.cc
echo "}" >>amalgamation.cc