c10773522b
Summary: In order to enhance C++ metaprogramming capabilities, a custom preprocessing step is added before compilation. C++ code may be mixed with Lisp code in order to generate a complete C++ source code. The mechanism is hooked into cmake. To notify cmake of .lcp files, `add_lcp` function in src/CMakeLists.txt needs to be invoked. The main executable entry point is in tools/lcp, while the source code is in src/lisp/lcp.lisp The main goal of LCP is to auto generate class serialization code and member variable getter functions. This should now be significantly less error prone, since you cannot forget to serialize a member variable through this mechanism. Future uses should be generating other repeating code, such as `Clone` methods or perhaps some debug information. .lcp files may contain mixed C++ code (enclosed in #>cpp ... cpp<# blocks) with Common Lisp code. NOTE: With great power comes great responsibility. Lisp metaprogramming capabilities are incredibly powerful. To keep the sanity of the team intact, use Lisp preprocessing only when *really* necessary. Reviewers: buda, mferencevic, msantl, dgleich, ipaljak, mculinovic, mtomic Reviewed By: mtomic Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D1361
141 lines
3.8 KiB
Bash
Executable File
141 lines
3.8 KiB
Bash
Executable File
#!/bin/bash -e
|
|
|
|
# TODO: Consider putting boost library in libs/setup.sh, since the license
|
|
# allows source modification and static compilation. Unfortunately, it is quite
|
|
# a pain to set up the boost build process.
|
|
required_pkgs=(git arcanist # source code control
|
|
cmake clang-3.8 llvm-3.8 pkg-config # build system
|
|
curl wget # for downloading libs
|
|
uuid-dev default-jre-headless # required by antlr
|
|
libreadline-dev # for memgraph console
|
|
libboost-iostreams-dev
|
|
libboost-serialization-dev
|
|
python3 python-virtualenv python3-pip # for qa, macro_benchmark and stress tests
|
|
sbcl # for custom Lisp C++ preprocessing
|
|
)
|
|
|
|
optional_pkgs=(clang-format # source code formatting
|
|
doxygen graphviz # source documentation generators
|
|
php-cli # for user technical documentation generators
|
|
)
|
|
|
|
use_sudo=0
|
|
|
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
cd "$DIR"
|
|
|
|
function print_help () {
|
|
echo "Usage: $0 [OPTION]"
|
|
echo -e "Check for missing packages and install them if possible.\n"
|
|
echo "Optional arguments:"
|
|
echo -e " -s\tuse sudo apt-get for installing packages"
|
|
echo -e " -h\tdisplay this help and exit"
|
|
}
|
|
|
|
function setup_virtualenv () {
|
|
pushd $1 > /dev/null
|
|
echo "Setting up virtualenv for: $1"
|
|
|
|
# remove old virtualenv
|
|
if [ -d ve3 ]; then
|
|
rm -rf ve3
|
|
fi
|
|
|
|
# create new virtualenv
|
|
virtualenv -p python3 ve3 || exit 1
|
|
source ve3/bin/activate
|
|
# we need to increase the timeout for pip because our local cache server
|
|
# can sometimes be stupid, see: https://github.com/devpi/devpi/issues/208
|
|
pip --timeout 1000 install -i http://deps.memgraph.io:3141/root/pypi \
|
|
--trusted-host deps.memgraph.io -r requirements.txt || exit 1
|
|
deactivate
|
|
|
|
popd > /dev/null
|
|
}
|
|
|
|
if [[ $# -gt 1 ]]; then
|
|
print_help
|
|
exit 1
|
|
elif [[ $# -eq 1 ]]; then
|
|
case "$1" in
|
|
-s)
|
|
use_sudo=1
|
|
;;
|
|
-h)
|
|
print_help
|
|
exit 0
|
|
;;
|
|
*)
|
|
# unknown option
|
|
print_help
|
|
exit 1
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
echo "Started installing dependencies for Memgraph"
|
|
|
|
required_missing=0
|
|
|
|
# install all dependencies on debian based operating systems
|
|
for pkg in ${required_pkgs[@]}; do
|
|
if dpkg -s $pkg 2>/dev/null >/dev/null; then
|
|
echo "Found $pkg"
|
|
elif (( $use_sudo )); then
|
|
echo "Installing $pkg"
|
|
if [[ ! `sudo apt-get -y install $pkg` ]]; then
|
|
echo "Didn't install $pkg [required]"
|
|
required_missing=1
|
|
fi
|
|
else
|
|
echo "Missing $pkg [required]"
|
|
required_missing=1
|
|
fi
|
|
done
|
|
|
|
for pkg in ${optional_pkgs[@]}; do
|
|
if dpkg -s $pkg 2>/dev/null >/dev/null; then
|
|
echo "Found $pkg [optional]"
|
|
else
|
|
echo "Missing $pkg [optional]"
|
|
fi
|
|
done
|
|
|
|
if (( $required_missing )); then
|
|
echo "Missing required packages. EXITING!"
|
|
echo "Please, install required packages and rerun $0 again."
|
|
exit 2
|
|
fi
|
|
|
|
# create a default build directory
|
|
mkdir -p ./build
|
|
|
|
# quicklisp package manager for Common Lisp
|
|
quicklisp_install_dir="$HOME/quicklisp"
|
|
if [[ -v QUICKLISP_HOME ]]; then
|
|
quicklisp_install_dir="${QUICKLISP_HOME}"
|
|
fi
|
|
if [[ ! -f "${quicklisp_install_dir}/setup.lisp" ]]; then
|
|
wget -nv https://beta.quicklisp.org/quicklisp.lisp -O quicklisp.lisp || exit 1
|
|
echo \
|
|
"
|
|
(load \"${DIR}/quicklisp.lisp\")
|
|
(quicklisp-quickstart:install :path \"${quicklisp_install_dir}\")
|
|
" | sbcl --script || exit 1
|
|
rm -rf quicklisp.lisp || exit 1
|
|
fi
|
|
|
|
# setup libs (download)
|
|
cd libs
|
|
./cleanup.sh
|
|
./setup.sh
|
|
cd ..
|
|
|
|
# setup qa dependencies
|
|
setup_virtualenv tests/qa
|
|
|
|
# setup stress dependencies
|
|
setup_virtualenv tests/stress
|
|
|
|
echo "Done installing dependencies for Memgraph"
|