aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/vespa/vespalib/data/slime/make_dist.sh
blob: 25db180947759fe572b2c3dbdb12e83bf7afd8bb (plain) (blame)
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/bin/sh
# Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

echo "generating Slime Mobile Edition ..."

# remove old version if present
rm -f slime_me.h
rm -f slime_me.cpp

# identify files to be included in the bundle, sort headers topologically based on include dependencies
hfiles=$(for file in *.h; do echo $file $file; cat $file | sed -n -e "s/#include \"\(.*\.h\)\"/\1 $file/p"; done | tsort)
cppfiles=$(echo *.cpp)

# bundle header files
echo "// Slime Mobile Edition"      >  slime_me.h
for file in $hfiles; do
    echo -e "\n// ---> FILE: $file" >> slime_me.h
    cat $file                       >> slime_me.h
    echo -e "// <--- FILE: $file\n" >> slime_me.h
done

# bundle cpp files
echo "// Slime Mobile Edition"      >  slime_me.cpp
echo "INCLUDE_SLIME_ME_H_HERE"      >> slime_me.cpp
for file in $cppfiles; do
    echo -e "\n// ---> FILE: $file" >> slime_me.cpp
    cat $file                       >> slime_me.cpp
    echo -e "// <--- FILE: $file\n" >> slime_me.cpp
done

# remove includes to local headers and print remaining includes
sed -i -e 's=#include "\(.*\)"=// include removed (\1)=' slime_me.h slime_me.cpp
echo -n "includes: "
cat slime_me.h slime_me.cpp | sed -n -e "s/#include \(.*\)/\1/p" | sort | uniq | xargs echo

# include slime_me.h from slime_me.cpp
sed -i -e 's=INCLUDE_SLIME_ME_H_HERE=#include "slime_me.h"=' slime_me.cpp

# move code from the vespalib namespace to the my namespace
sed -i -e 's/vespalib/my/g' slime_me.h slime_me.cpp
sed -i -e 's/VESPALIB/MY/g' slime_me.h slime_me.cpp

echo "running compilation tests ..."

# prepare temporary test directory
rm -rf tmp && mkdir tmp
cp slime_me.h slime_me.cpp tmp/

# simple single file application
cat > tmp/simple_app.cpp <<EOF
#include "slime_me.cpp"

int main() {
    my::Slime slime;
    return 0;
}
EOF
(cd tmp; set -x; make simple_app) || exit 11
(cd tmp; set -x; ./simple_app) || exit 12

# multiple includes from single compilation unit
cat > tmp/include_app.cpp <<EOF
#include "slime_me.h"
#include "include_app.h"

#include "slime_me.cpp"

int main() {
    my::Slime slime;
    return 0;
}
EOF
cat > tmp/include_app.h <<EOF
#ifndef INCLUDE_APP
#define INCLUDE_APP
#include "slime_me.h"
#endif
EOF
(cd tmp; set -x; make include_app) || exit 21
(cd tmp; set -x; ./include_app) || exit 22

# application with multiple compliation units
cat > tmp/multi_tools.h <<EOF
#ifndef MULTI_TOOLS_H
#define MULTI_TOOLS_H
struct MultiTools {
    int main();
};
#endif
EOF
cat > tmp/multi_tools.cpp <<EOF
#include "multi_tools.h"
#include "slime_me.h"

int
MultiTools::main()
{
    my::Slime slime;
    return 0;
}
EOF
cat > tmp/multi_app.cpp <<EOF
#include "slime_me.h"
#include "multi_tools.h"

int main() {
    MultiTools tools;
    return tools.main();
}
EOF
(cd tmp; set -x; g++ -c multi_tools.cpp) || exit 31
(cd tmp; set -x; g++ -c multi_app.cpp) || exit 32
(cd tmp; set -x; g++ -c slime_me.cpp) || exit 33
(cd tmp; set -x; g++ -o multi_app multi_tools.o multi_app.o slime_me.o) || exit 34
(cd tmp; set -x; ./multi_app) || exit 35

# clean up temporary test directory
rm -rf tmp

echo "AWESOME (slime_me.{h,cpp} are ready for use)"