-
Notifications
You must be signed in to change notification settings - Fork 311
/
opensim-core-linux-build-script.sh
216 lines (195 loc) · 8.59 KB
/
opensim-core-linux-build-script.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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
#!/bin/bash
# Exit when an error happens instead of continue.
set -e
# Default values for flags.
DEBUG_TYPE="Release"
NUM_JOBS=4
MOCO="on"
CORE_BRANCH="main"
GENERATOR="Unix Makefiles"
Help() {
echo
echo "This script builds and installs the last available version of OpenSim-Core in your computer."
echo "Usage: ./scriptName [OPTION]..."
echo "Example: ./opensim-core-build.sh -j 4 -d \"Release\""
echo " -d Debug Type. Available Options:"
echo " Release (Default): No debugger symbols. Optimized."
echo " Debug: Debugger symbols. No optimizations (>10x slower). Library names ending with _d."
echo " RelWithDefInfo: Debugger symbols. Optimized. Bigger than Release, but not slower."
echo " MinSizeRel: No debugger symbols. Minimum size. Optimized."
echo " -j Number of jobs to use when building libraries (>=1)."
echo " -s Simple build without moco (Tropter and Casadi disabled)."
echo " -c Branch for opensim-core repository."
echo " -n Use the Ninja generator to build opensim-core. If not set, Unix Makefiles is used."
echo
exit
}
# Get flag values if any.
while getopts 'j:d:s:c:n' flag
do
case "${flag}" in
j) NUM_JOBS=${OPTARG};;
d) DEBUG_TYPE=${OPTARG};;
s) MOCO="off";;
c) CORE_BRANCH=${OPTARG};;
n) GENERATOR="Ninja";;
*) Help;
esac
done
# Check if parameters are valid.
if [[ $NUM_JOBS -lt 1 ]]
then
Help;
fi
if [[ $DEBUG_TYPE != "Release" ]] && [[ $DEBUG_TYPE != "Debug" ]] && [[ $DEBUG_TYPE != "RelWithDebInfo" ]] && [[ $DEBUG_TYPE != "MinSizeRel" ]]
then
Help;
fi
# Show values of flags:
echo
echo "Build script parameters:"
echo "DEBUG_TYPE="$DEBUG_TYPE
echo "NUM_JOBS="$NUM_JOBS
echo "MOCO="$MOCO
echo "CORE_BRANCH="$CORE_BRANCH
echo "GENERATOR="$GENERATOR
echo ""
# Check OS.
echo "LOG: CHECKING OS..."
OS_NAME=$(lsb_release -a)
if [[ $OS_NAME == *"Debian"* ]]; then
OS_NAME="Debian"
echo "The OS of this machine is Debian."
elif [[ $OS_NAME == *"Ubuntu"* ]]; then
OS_NAME="Ubuntu"
echo "The OS of this machine is Ubuntu."
else
OS_NAME="Unknown"
echo "Could not recognize the OS in your machine."
exit
fi
echo
# Install dependencies from package manager.
echo "LOG: INSTALLING DEPENDENCIES..."
sudo apt-get update && sudo apt-get install --yes build-essential cmake autotools-dev autoconf pkg-config automake libopenblas-dev liblapack-dev freeglut3-dev libxi-dev libxmu-dev doxygen python3 python3-dev python3-numpy python3-setuptools git libssl-dev libpcre3 libpcre3-dev libpcre2-dev libtool gfortran ninja-build patchelf || ( echo "Installation of dependencies using apt-get failed." && exit )
echo
# If byacc available, install it (issue #3578)
if apt-cache show byacc &> /dev/null; then
echo "byacc is available. Installing..."
sudo apt-get update
sudo apt-get install -y byacc
else
echo "byacc is not available for installation."
fi
# Check if 'bison' is available for install (issue #3578)
if apt-cache show bison &> /dev/null; then
echo "bison is available. Installing..."
sudo apt-get update
sudo apt-get install -y bison
else
echo "bison is not available for installation."
fi
# Debian does not have openjdk-8-jdk available, so install from temurin repo.
echo "LOG: INSTALLING JDK 8..."
if [[ $OS_NAME == *"Debian"* ]]; then
sudo apt-get install -y wget apt-transport-https
sudo mkdir -p /etc/apt/keyrings || true
wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/adoptium.asc
echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list
sudo apt update # update if you haven't already
sudo apt install --yes temurin-8-jdk
# Export JAVA_HOME variable.
export JAVA_HOME=$(dirname $(dirname $(readlink -f /usr/bin/java)))
elif [[ $OS_NAME == *"Ubuntu"* ]]; then
sudo apt install --yes openjdk-8-jdk
fi
echo
# Create workspace folder.
mkdir ~/opensim-workspace || true
# Check cmake version installed by apt. If < 3.15, build it from source.
echo "LOG: INSTALLING CMAKE >=3.15..."
cmake_version=$(cmake --version | perl -pe '($_)=/([0-9]+([.][0-9]+))/')
cmake_version_split=(${cmake_version//./ })
min_cmake_version=3.15
min_cmake_version_split=(${min_cmake_version//./ })
cmake_major_less=$(( ${cmake_version_split[0]} < ${min_cmake_version_split[0]} ))
cmake_major_equal=$(( ${cmake_version_split[0]} == ${min_cmake_version_split[0]} ))
cmake_minor_less=$(( ${cmake_version_split[1]} < ${min_cmake_version_split[1]} ))
if [[ $cmake_major_less == 1 ]] || $( [[ $cmake_major_equal == 1 ]] && [[ $cmake_minor_less == 1 ]] ); then
mkdir ~/opensim-workspace/cmake-3.23.3-source || true
cd ~/opensim-workspace/cmake-3.23.3-source
wget -nc -q --show-progress https://github.com/Kitware/CMake/releases/download/v3.23.3/cmake-3.23.3.tar.gz
tar -zxvf cmake-3.23.3.tar.gz
cd ~/opensim-workspace/cmake-3.23.3-source/cmake-3.23.3
./bootstrap
make -j$NUM_JOBS && sudo make install
source ~/.bashrc && cmake --version
else
echo "CMake version is higher than 3.15."
fi
echo
# Check python version installed by apt. If < 3.6, build it from source.
echo "LOG: INSTALLING PYTHON >=3.6..."
python_version=$(python3 -c 'import sys; print(str(sys.version_info[0])+"."+str(sys.version_info[1]))')
python_version_split=(${python_version//./ })
min_python_version=3.6
min_python_version_split=(${min_python_version//./ })
python_major_less=$(( ${python_version_split[0]} < ${min_python_version_split[0]} ))
python_major_equal=$(( ${python_version_split[0]} == ${min_python_version_split[0]} ))
python_minor_less=$(( ${python_version_split[1]} < ${min_python_version_split[1]} ))
if [[ $python_major_less == 1 ]] || $( [[ $python_major_equal == 1 ]] && [[ $python_minor_less == 1 ]] ); then
mkdir ~/opensim-workspace/Python-3.6.9-source || true
cd ~/opensim-workspace/Python-3.6.9-source
wget -nc -q --show-progress https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
tar -xvzf Python-3.6.9.tgz
cd ~/opensim-workspace/Python-3.6.9-source/Python-3.6.9
./configure
make -j$NUM_JOBS
sudo make altinstall
sudo /usr/local/bin/pip3.6 install numpy
else
echo "Python version is higher than 3.6."
fi
echo
# Download and install SWIG 4.1.1.
echo "LOG: INSTALLING SWIG 4.1.1..."
mkdir -p ~/opensim-workspace/swig-source || true && cd ~/opensim-workspace/swig-source
wget -nc -q --show-progress https://github.com/swig/swig/archive/refs/tags/v4.1.1.tar.gz
tar xzf v4.1.1.tar.gz && cd swig-4.1.1
sh autogen.sh && ./configure --prefix=$HOME/swig --disable-ccache
make && make -j$NUM_JOBS install
echo
# Get opensim-core.
echo "LOG: CLONING OPENSIM-CORE..."
git -C ~/opensim-workspace/opensim-core-source pull || git clone https://github.com/opensim-org/opensim-core.git ~/opensim-workspace/opensim-core-source
cd ~/opensim-workspace/opensim-core-source
git checkout $CORE_BRANCH
echo
# Build opensim-core dependencies.
echo "LOG: BUILDING OPENSIM-CORE DEPENDENCIES..."
mkdir -p ~/opensim-workspace/opensim-core-dependencies-build || true
cd ~/opensim-workspace/opensim-core-dependencies-build
cmake ~/opensim-workspace/opensim-core-source/dependencies -DCMAKE_INSTALL_PREFIX=~/opensim-workspace/opensim-core-dependencies-install/ -DSUPERBUILD_ezc3d=on -DOPENSIM_WITH_CASADI=$MOCO -DOPENSIM_WITH_TROPTER=$MOCO
cmake . -LAH
cmake --build . --config $DEBUG_TYPE -j$NUM_JOBS
echo
# Build opensim-core.
echo "LOG: BUILDING OPENSIM-CORE..."
mkdir -p ~/opensim-workspace/opensim-core-build || true
cd ~/opensim-workspace/opensim-core-build
cmake ~/opensim-workspace/opensim-core-source -G"$GENERATOR" -DOPENSIM_DEPENDENCIES_DIR=~/opensim-workspace/opensim-core-dependencies-install/ -DBUILD_JAVA_WRAPPING=on -DBUILD_PYTHON_WRAPPING=on -DOPENSIM_C3D_PARSER=ezc3d -DBUILD_TESTING=off -DCMAKE_INSTALL_PREFIX=~/opensim-core -DOPENSIM_INSTALL_UNIX_FHS=off -DSWIG_DIR=~/swig/share/swig -DSWIG_EXECUTABLE=~/swig/bin/swig
cmake . -LAH
cmake --build . --config $DEBUG_TYPE -j$NUM_JOBS
echo
# Test opensim-core.
echo "LOG: TESTING OPENSIM-CORE..."
cd ~/opensim-workspace/opensim-core-build
# TODO: Temporary for python to find Simbody libraries.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/opensim-workspace/opensim-core-dependencies-install/simbody/lib
ctest --parallel $NUM_JOBS --output-on-failure
# Install opensim-core.
echo "LOG: INSTALL OPENSIM-CORE..."
cd ~/opensim-workspace/opensim-core-build
cmake --install .
echo 'export PATH=~/opensim-core/bin:$PATH' >> ~/.bashrc
source ~/.bashrc