forked from mstorsjo/llvm-mingw
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild-llvm.sh
executable file
·151 lines (136 loc) · 4.66 KB
/
build-llvm.sh
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/bin/sh
set -e
ASSERTS=OFF
BUILDDIR=build
while [ $# -gt 0 ]; do
if [ "$1" = "--disable-asserts" ]; then
ASSERTS=OFF
BUILDDIR=build
elif [ "$1" = "--enable-asserts" ]; then
ASSERTS=ON
BUILDDIR=build-asserts
elif [ "$1" = "--full-llvm" ]; then
FULL_LLVM=1
else
PREFIX="$1"
fi
shift
done
if [ -z "$PREFIX" ]; then
echo $0 [--enable-asserts] [--full-llvm] dest
exit 1
fi
mkdir -p "$PREFIX"
PREFIX="$(cd "$PREFIX" && pwd)"
: ${CORES:=$(nproc 2>/dev/null)}
: ${CORES:=$(sysctl -n hw.ncpu 2>/dev/null)}
: ${CORES:=4}
if [ ! -d llvm ]; then
# When cloning master and checking out a pinned old hash, we can't use --depth=1.
git clone -b master https://github.com/llvm-mirror/llvm.git
cd llvm/tools
git clone -b master https://github.com/llvm-mirror/clang.git
git clone -b master https://github.com/llvm-mirror/lld.git
cd ..
set +e
# Do the git-svn rebase to populate git-svn information, to make
# "clang --version" produce SVN based version numbers.
# This is optional - don't error out here if git-svn is unavailable.
git svn init https://llvm.org/svn/llvm-project/llvm/trunk
git config svn-remote.svn.fetch :refs/remotes/origin/master
git svn rebase -l
cd tools/clang
git svn init https://llvm.org/svn/llvm-project/cfe/trunk
git config svn-remote.svn.fetch :refs/remotes/origin/master
git svn rebase -l
cd ../lld
git svn init https://llvm.org/svn/llvm-project/lld/trunk
git config svn-remote.svn.fetch :refs/remotes/origin/master
git svn rebase -l
cd ../../..
set -e
CHECKOUT=1
fi
if [ -n "$SYNC" ] || [ -n "$CHECKOUT" ]; then
cd llvm
[ -z "$SYNC" ] || git fetch
git checkout 66495492c0af53c4597cace26c50f0dce44033fc
cd tools/clang
[ -z "$SYNC" ] || git fetch
git checkout 6fddf7789c74ae74d695dd571024915ad319db1b
cd ../lld
[ -z "$SYNC" ] || git fetch
git checkout 1e90cb9d20d4fcdb5d1448853370e969035d8014
cd ../../..
fi
if [ -n "$(which ninja)" ]; then
CMAKE_GENERATOR="Ninja"
NINJA=1
else
case $(uname) in
MINGW*)
CMAKE_GENERATOR="MSYS Makefiles"
;;
*)
;;
esac
fi
if [ -n "$HOST" ]; then
find_native_tools() {
if [ -d llvm/build/bin ]; then
echo $(pwd)/llvm/build/bin
elif [ -d llvm/build-asserts/bin ]; then
echo $(pwd)/llvm/build-asserts/bin
elif [ -d llvm/build-noasserts/bin ]; then
echo $(pwd)/llvm/build-noasserts/bin
elif [ -n "$(which llvm-tblgen)" ]; then
echo $(dirname $(which llvm-tblgen))
fi
}
CMAKEFLAGS="$CMAKEFLAGS -DCMAKE_SYSTEM_NAME=Windows"
CMAKEFLAGS="$CMAKEFLAGS -DCMAKE_CROSSCOMPILING=TRUE"
CMAKEFLAGS="$CMAKEFLAGS -DCMAKE_C_COMPILER=$HOST-gcc"
CMAKEFLAGS="$CMAKEFLAGS -DCMAKE_CXX_COMPILER=$HOST-g++"
CMAKEFLAGS="$CMAKEFLAGS -DCMAKE_RC_COMPILER=$HOST-windres"
CMAKEFLAGS="$CMAKEFLAGS -DCROSS_TOOLCHAIN_FLAGS_NATIVE="
native=$(find_native_tools)
if [ -n "$native" ]; then
CMAKEFLAGS="$CMAKEFLAGS -DLLVM_TABLEGEN=$native/llvm-tblgen"
CMAKEFLAGS="$CMAKEFLAGS -DCLANG_TABLEGEN=$native/clang-tblgen"
CMAKEFLAGS="$CMAKEFLAGS -DLLVM_CONFIG_PATH=$native/llvm-config"
fi
CROSS_ROOT=$(cd $(dirname $(which $HOST-gcc))/../$HOST && pwd)
CMAKEFLAGS="$CMAKEFLAGS -DCMAKE_FIND_ROOT_PATH=$CROSS_ROOT"
CMAKEFLAGS="$CMAKEFLAGS -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER"
CMAKEFLAGS="$CMAKEFLAGS -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY"
CMAKEFLAGS="$CMAKEFLAGS -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY"
# Custom, llvm-mingw specific defaults. We normally set these in
# the frontend wrappers, but this makes sure they are enabled by
# default if that wrapper is bypassed as well.
CMAKEFLAGS="$CMAKEFLAGS -DCLANG_DEFAULT_RTLIB=compiler-rt"
CMAKEFLAGS="$CMAKEFLAGS -DCLANG_DEFAULT_CXX_STDLIB=libc++"
CMAKEFLAGS="$CMAKEFLAGS -DCLANG_DEFAULT_LINKER=lld"
BUILDDIR=$BUILDDIR-$HOST
fi
TOOLCHAIN_ONLY=ON
if [ -n "$FULL_LLVM" ]; then
TOOLCHAIN_ONLY=OFF
fi
cd llvm
mkdir -p $BUILDDIR
cd $BUILDDIR
cmake \
${CMAKE_GENERATOR+-G} "$CMAKE_GENERATOR" \
-DCMAKE_INSTALL_PREFIX="$PREFIX" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=$ASSERTS \
-DLLVM_TARGETS_TO_BUILD="ARM;AArch64;X86" \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=$TOOLCHAIN_ONLY \
-DLLVM_TOOLCHAIN_TOOLS="llvm-ar;llvm-ranlib;llvm-objdump;llvm-rc;llvm-cvtres;llvm-nm;llvm-strings;llvm-readobj;llvm-dlltool;llvm-pdbutil;llvm-objcopy;llvm-strip;llvm-cov;llvm-profdata;llvm-addr2line" \
$CMAKEFLAGS \
..
if [ -n "$NINJA" ]; then
ninja -j$CORES install/strip
else
make -j$CORES install/strip
fi