Replace Linux build system

This commit is contained in:
nsubiron 2018-07-04 11:59:59 +02:00
parent 3cf91c54f2
commit 0b90c448bf
41 changed files with 4067 additions and 770 deletions

9
.gitignore vendored
View File

@ -1,31 +1,38 @@
Build
Dist Dist
Doxygen Doxygen
PythonClient/dist PythonClient/dist
Util/Build Util/Build
Install
*.VC.db *.VC.db
*.VC.opendb *.VC.opendb
*.a
*.egg-info *.egg-info
*.kdev4 *.kdev4
*.log *.log
*.pb.cc *.pb.cc
*.pb.h *.pb.h
*.o
*.pid *.pid
*.pri *.pri
*.pro *.pro
*.py[cod] *.py[cod]
*.sln *.sln
*.so
*.stackdump *.stackdump
*.sublime-workspace *.sublime-workspace
*.workspace *.workspace
*CodeCompletionFolders.txt *CodeCompletionFolders.txt
*CodeLitePreProcessor.txt *CodeLitePreProcessor.txt
.codelite .codelite
.gdb_history
.tags* .tags*
.vs .vs
__pycache__ __pycache__
_benchmarks_results _benchmarks_results
_images* _images*
_out _out*
_site _site
core core
profiler.csv

View File

@ -17,14 +17,15 @@ script:
matrix: matrix:
include: include:
- env: TEST="CppCheck" # CppCheck does not support C++17.
install: true # - env: TEST="CppCheck"
addons: # install: true
apt: # addons:
packages: # apt:
- cppcheck # packages:
script: # - cppcheck
- cppcheck . -iBuild -i.pb.cc --error-exitcode=1 --enable=warning --inline-suppr --quiet # script:
# - cppcheck . -iBuild -i.pb.cc --error-exitcode=1 --enable=warning --inline-suppr --quiet
- env: TEST="MkDocs" - env: TEST="MkDocs"
install: install:

View File

@ -1,149 +0,0 @@
{
"folders":
[
{
"path": ".",
"folder_exclude_patterns":
[
".clang",
".codelite",
".kdev4",
".vs",
".vscode",
"Binaries",
"Build",
"DerivedDataCache",
"Dist",
"Doxygen",
"Intermediate",
"Saved",
"Unreal/CarlaUE4/Content*",
"__pycache__",
"_site"
],
"file_exclude_patterns":
[
"*.VC.db",
"*.VC.opendb",
"*.kdev4",
"*.pri",
"*.pro",
"*.py[cod]",
"*.sln",
"*.stackdump",
"*.sublime-workspace",
"*.uasset",
"*.umap",
"*.workspace",
"*CodeCompletionFolders.txt",
"*CodeLitePreProcessor.txt",
".tags*",
"core"
]
}
],
"settings":
{
"ensure_newline_at_eof_on_save": true,
"tab_size": 2,
"translate_tabs_to_spaces": true,
"trim_trailing_white_space_on_save": true
},
"build_systems":
[
{
"name": "CARLA - Pylint",
"working_dir": "${project_path}",
"file_regex": "^\\[([^:]*):([0-9]+):?([0-9]+)?\\]:? (.*)$",
"shell_cmd": "pylint --disable=R,C --rcfile=PythonClient/.pylintrc PythonClient/carla PythonClient/*.py --msg-template='[{path}:{line:3d}:{column}]: {msg_id} {msg}'"
},
{
"name": "CARLA - CppCheck",
"working_dir": "${project_path}",
"file_regex": "^\\[([^:]*):([0-9]+):?([0-9]+)?\\]:? (.*)$",
"shell_cmd": "cppcheck . -iBuild -i.pb.cc --error-exitcode=0 --enable=warning --quiet"
},
{
"name": "CARLA - Rebuild script",
"working_dir": "${project_path}",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"linux":
{
"shell_cmd": "./Rebuild.sh"
},
"windows":
{
"shell_cmd": "start Rebuild.bat"
}
},
{
"name": "CARLA - make CarlaUE4",
"working_dir": "${project_path}/Unreal/CarlaUE4",
"file_regex": "Unreal\\/CarlaUE4\\/([^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "make CarlaUE4"
}
},
{
"name": "CARLA - make CarlaUE4 ARGS=-clean",
"working_dir": "${project_path}/Unreal/CarlaUE4",
"file_regex": "Unreal\\/CarlaUE4\\/([^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "make CarlaUE4 ARGS=-clean"
}
},
{
"name": "CARLA - make CarlaUE4Editor",
"working_dir": "${project_path}/Unreal/CarlaUE4",
"file_regex": "Unreal\\/CarlaUE4\\/([^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "make CarlaUE4Editor"
}
},
{
"name": "CARLA - make CarlaUE4Editor ARGS=-clean",
"working_dir": "${project_path}/Unreal/CarlaUE4",
"file_regex": "Unreal\\/CarlaUE4\\/([^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "make CarlaUE4Editor ARGS=-clean"
}
},
{
"name": "CARLA - make CarlaServer",
"working_dir": "${project_path}",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "make"
}
},
{
"name": "CARLA - check CarlaServer",
"working_dir": "${project_path}",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "make check"
}
},
{
"name": "CARLA - clean CarlaServer",
"working_dir": "${project_path}",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "make clean"
}
}
]
}

6
CMakeLists.txt Normal file
View File

@ -0,0 +1,6 @@
cmake_minimum_required(VERSION 3.9.0)
project(CARLA)
include("Build/CMakeLists.txt.in")
add_subdirectory("LibCarla/cmake")

110
Docs/build_system.md Normal file
View File

@ -0,0 +1,110 @@
<h1>Build system</h1>
> _This document is a work in progress, only the Linux build system is taken into account here._
The most challenging part of the setup is to compile all the dependencies and
modules to be compatible with a) Unreal Engine in the server-side, and b) Python
in the client-side.
The goal is to be able to call Unreal Engine's functions from a separate Python
process.
![modules](img/modules.png)
In Linux, we compile CARLA and all the dependencies with clang-5.0 and C++17
standard. We however link against different runtime C++ libraries depending on
where the code going to be used, since all the code that is going to be linked
with Unreal Engine needs to be compiled using `libc++`.
#### Setup
Command
```sh
make setup
```
Get and compile dependencies
* llvm-5.0 (libc++ and libc++abi)
* rpclib-2.2.1 (twice, with libstdc++ and libc++)
* boost-1.67 (headers only)
* googletest-1.8.0 (with libc++)
#### LibCarla
Compiled with CMake (minimum version required CMake 3.9).
Command
```sh
make LibCarla
```
Two configurations:
| | Server | Client |
|-----------------|--------------|-----------|
| **Unit tests** | yes | no |
| **Requires** | rpclib, gtest, boost | rpclib, boost
| **std runtime** | LLVM's `libc++` | Default `libstdc++` |
| **Output** | headers and test exes | `libcarla_client.a` |
| **Required by** | Carla plugin | PythonAPI |
#### CarlaUE4 and Carla plugin
Both compiled at the same step with Unreal Engine 4.19 build tool. They require
the `UE4_ROOT` environment variable set.
Command
```sh
make CarlaUE4Editor
```
To launch Unreal Engine's Editor run
```sh
make launch
```
#### PythonAPI
Compiled using Python's `setuptools` ("setup.py"). Currently requires the
following to be installed in the machine: Python, libpython-dev, and
libboost-python-dev; both for Python 2.7 and 3.5.
Command
```sh
make PythonAPI
```
It creates two "egg" packages
* `PythonAPI/dist/carla-0.9.0-py2.7-linux-x86_64.egg`
* `PythonAPI/dist/carla-0.9.0-py3.5-linux-x86_64.egg`
This package can be directly imported into a Python script by adding it to the
system path
```python
#!/usr/bin/env python
import sys
sys.path.append(
'PythonAPI/dist/carla-0.9.0-py%d.%d-linux-x86_64.egg' % (sys.version_info.major,
sys.version_info.minor))
import carla
# ...
```
or installed with `easy_install`
```sh
easy_install2 --user --no-deps PythonAPI/dist/carla-0.9.0-py2.7-linux-x86_64.egg
easy_install3 --user --no-deps PythonAPI/dist/carla-0.9.0-py3.5-linux-x86_64.egg
```

View File

@ -5,15 +5,23 @@
Install the build tools and dependencies Install the build tools and dependencies
$ sudo apt-get install build-essential clang-3.9 git cmake ninja-build python3-requests python-dev tzdata sed curl wget unzip autoconf libtool ```
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get install build-essential clang-5.0 lld-5.0 g++-7 ninja-build python python-pip python3 python3-pip libboost-python-dev python-dev tzdata sed curl wget unzip autoconf libtool
pip2 install --user setuptools nose2
pip3 install --user setuptools nose2
```
To avoid compatibility issues between Unreal Engine and the CARLA dependencies, To avoid compatibility issues between Unreal Engine and the CARLA dependencies,
the best configuration is to compile everything with the same compiler version the best configuration is to compile everything with the same compiler version
and C++ runtime library. We use clang 3.9 and LLVM's libc++. You may need to and C++ runtime library. We use clang 5.0 and LLVM's libc++. We recommend to
change your default clang version to compile Unreal change your default clang version to compile Unreal Engine and the CARLA
dependencies
$ sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-3.9/bin/clang++ 100 ```sh
$ sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-3.9/bin/clang 100 sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-5.0/bin/clang++ 101
sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-5.0/bin/clang 101
```
Build Unreal Engine Build Unreal Engine
------------------- -------------------
@ -23,13 +31,15 @@ Build Unreal Engine
need to add your GitHub username when you sign up at need to add your GitHub username when you sign up at
[www.unrealengine.com](https://www.unrealengine.com). [www.unrealengine.com](https://www.unrealengine.com).
Download and compile Unreal Engine 4.18. Here we will assume you install it at Download and compile Unreal Engine 4.19. Here we will assume you install it at
"~/UnrealEngine_4.18", but you can install it anywhere, just replace the path `~/UnrealEngine_4.19", but you can install it anywhere, just replace the path
where necessary. where necessary.
$ git clone --depth=1 -b 4.18 https://github.com/EpicGames/UnrealEngine.git ~/UnrealEngine_4.18 ```sh
$ cd ~/UnrealEngine_4.18 git clone --depth=1 -b 4.19 https://github.com/EpicGames/UnrealEngine.git ~/UnrealEngine_4.19
$ ./Setup.sh && ./GenerateProjectFiles.sh && make cd ~/UnrealEngine_4.19
./Setup.sh && ./GenerateProjectFiles.sh && make
```
Check Unreal's documentation Check Unreal's documentation
["Building On Linux"](https://wiki.unrealengine.com/Building_On_Linux) if any of ["Building On Linux"](https://wiki.unrealengine.com/Building_On_Linux) if any of
@ -41,56 +51,47 @@ Build CARLA
Clone or download the project from our Clone or download the project from our
[GitHub repository](https://github.com/carla-simulator/carla) [GitHub repository](https://github.com/carla-simulator/carla)
$ git clone https://github.com/carla-simulator/carla ```sh
git clone https://github.com/carla-simulator/carla
```
Note that the `master` branch contains the latest fixes and features, for the Note that the `master` branch contains the latest fixes and features, for the
latest stable code may be best to switch to the latest release tag. latest stable code may be best to switch to the latest release tag.
Run the setup script to download the content and build all dependencies. It Now you need to download the assets package, to do so we provide a handy script
takes a while (you can speed up the process by parallelizing the script with the that downloads and extracts the latest version (note that the package is >10GB,
`--jobs=8` flag) this step might take some time depending on your connection)
$ ./Setup.sh ```sh
./Update.sh
```
Once it's done it should print "Success" if everything went well. For CARLA to find your Unreal Engine's installation folder you need to set the
following environment variable
To build CARLA, use the rebuild script. This script deletes all intermediate ```sh
files, rebuilds whole CARLA, and launches the editor. Use it too for making a export UE4_ROOT=~/UnrealEngine_4.19
clean rebuild of CARLA ```
$ UE4_ROOT=~/UnrealEngine_4.18 ./Rebuild.sh You can also add this variable to your `~/.bashrc` or `~/.profile`.
It looks at the environment variable `UE4_ROOT` to find the right version of Now that the environment is set up, you can run make to run different commands
Unreal Engine. You can also add this variable to your "~/.bashrc" or similar.
Later, if you need to compile some changes without doing a full rebuild, you can ```sh
use the Makefile generated in the Unreal project folder make launch # Compiles CARLA and launches Unreal Engine's Editor.
make package # Compiles CARLA and creates a packaged version for distribution.
$ cd Unreal/CarlaUE4 make help # Print all available commands.
$ make CarlaUE4Editor ```
Updating CARLA Updating CARLA
-------------- --------------
Every new release of CARLA we release a new package with the latest changes in Every new release of CARLA we release a new package with the latest changes in
the CARLA assets. To download the latest version, run the "Update" script the CARLA assets. To download the latest version and recompile CARLA, run
$ git pull ```sh
$ ./Update.sh make clean
git pull
Launching the editor ./Update.sh
-------------------- make launch
```
To open the editor once the project is already built
$ cd Unreal/CarlaUE4
$ ~/UnrealEngine_4.18/Engine/Binaries/Linux/UE4Editor "$PWD/CarlaUE4.uproject"
Test (Optional)
---------------
A set of unit tests is available for testing the CarlaServer library (note that
these tests launch the python client, they require python3 and protobuf for
python3 installed, as well as ports 2000 and 4000 available)
$ make check

BIN
Docs/img/modules.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -21,7 +21,7 @@
* [General Structure](benchmark_structure.md) * [General Structure](benchmark_structure.md)
* [Creating Your Benchmark](benchmark_creating.md) * [Creating Your Benchmark](benchmark_creating.md)
* [Computed Performance Metrics](benchmark_metrics.md) * [Computed Performance Metrics](benchmark_metrics.md)
<h3>Advanced topics</h3> <h3>Advanced topics</h3>
* [CARLA settings](carla_settings.md) * [CARLA settings](carla_settings.md)
@ -41,3 +41,4 @@
* [How to add assets](how_to_add_assets.md) * [How to add assets](how_to_add_assets.md)
* [CARLA design](carla_design.md) * [CARLA design](carla_design.md)
* [CarlaServer documentation](carla_server.md) * [CarlaServer documentation](carla_server.md)
* [Build system](build_system.md)

View File

@ -11,7 +11,7 @@ CASE_SENSE_NAMES = YES
SORT_BRIEF_DOCS = YES SORT_BRIEF_DOCS = YES
WARN_IF_UNDOCUMENTED = NO WARN_IF_UNDOCUMENTED = NO
WARN_LOGFILE = Doxygen/warnings.log WARN_LOGFILE = Doxygen/warnings.log
INPUT = Unreal/CarlaUE4/Source Unreal/CarlaUE4/Plugins/Carla/Source Util/CarlaServer/source INPUT = Unreal/CarlaUE4/Source Unreal/CarlaUE4/Plugins/Carla/Source LibCarla/source
FILE_PATTERNS = *.cpp *.h *.hpp *.cc FILE_PATTERNS = *.cpp *.h *.hpp *.cc
RECURSIVE = YES RECURSIVE = YES
SOURCE_BROWSER = YES SOURCE_BROWSER = YES
@ -26,7 +26,7 @@ FORMULA_FONTSIZE = 12
GENERATE_LATEX = NO GENERATE_LATEX = NO
MACRO_EXPANSION = YES MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = YES EXPAND_ONLY_PREDEF = YES
INCLUDE_PATH = Unreal/CarlaUE4/Source Unreal/CarlaUE4/Plugins/Carla/Source Util/CarlaServer/source Util/CarlaServer/include INCLUDE_PATH = Unreal/CarlaUE4/Source Unreal/CarlaUE4/Plugins/Carla/Source LibCarla/source
INCLUDE_FILE_PATTERNS = *.h *.hpp INCLUDE_FILE_PATTERNS = *.h *.hpp
HIDE_UNDOC_RELATIONS = NO HIDE_UNDOC_RELATIONS = NO
HAVE_DOT = YES HAVE_DOT = YES

104
Makefile
View File

@ -1,104 +1,6 @@
INSTALL_FOLDER=$(CURDIR)/Unreal/CarlaUE4/Plugins/Carla/CarlaServer include Util/BuildTools/Vars.mk
PYTHON_CLIENT_FOLDER=$(CURDIR)/PythonClient/test
BASE_BUILD_FOLDER=$(CURDIR)/Util/Build/carlaserver-build
MY_CMAKE_FOLDER=$(CURDIR)/Util/cmake
MY_CMAKE_FLAGS=-B"$(BUILD_FOLDER)" -DCMAKE_INSTALL_PREFIX="$(INSTALL_FOLDER)"
ifeq ($(OS),Windows_NT) ifeq ($(OS),Windows_NT)
BUILD_RULE=build_windows include Util/BuildTools/Windows.mk
CLEAN_RULE=clean_windows
CALL_CMAKE_RULE=call_cmake_windows
PROTOC_COMPILE=cmd.exe /k "cd Util & call Protoc.bat & exit"
PROTOC_CLEAN=cmd.exe /k "cd Util & call Protoc.bat --clean & exit"
else else
BUILD_RULE=build_linux include Util/BuildTools/Linux.mk
CLEAN_RULE=clean_linux
CALL_CMAKE_RULE=call_cmake_linux
PROTOC_COMPILE=./Util/Protoc.sh
PROTOC_CLEAN=./Util/Protoc.sh --clean
endif endif
default: release
### Build ######################################################################
debug: BUILD_FOLDER=$(BASE_BUILD_FOLDER)/debug
debug: MY_CMAKE_FLAGS+=-DCMAKE_BUILD_TYPE=Debug
debug: $(BUILD_RULE)
release: BUILD_FOLDER=$(BASE_BUILD_FOLDER)/release
release: MY_CMAKE_FLAGS+=-DCMAKE_BUILD_TYPE=Release
release: $(BUILD_RULE)
vsproject: BUILD_FOLDER=$(BASE_BUILD_FOLDER)/visualstudio
vsproject: MY_CMAKE_FLAGS+=-DCMAKE_BUILD_TYPE=Release
vsproject: MY_CMAKE_FLAGS+=-G "Visual Studio 14 2015 Win64"
vsproject: call_cmake
vsproject15: BUILD_FOLDER=$(BASE_BUILD_FOLDER)/visualstudio
vsproject15: MY_CMAKE_FLAGS+=-DCMAKE_BUILD_TYPE=Release
vsproject15: MY_CMAKE_FLAGS+=-G "Visual Studio 15 2017 Win64"
vsproject15: call_cmake
build_linux: MY_CMAKE_FLAGS+=-G "Ninja"
build_linux: call_cmake
@cd $(BUILD_FOLDER) && ninja && ninja install
build_windows: MY_CMAKE_FLAGS+=-G "NMake Makefiles"
build_windows: call_cmake
@cd $(BUILD_FOLDER) && nmake && nmake install
call_cmake: protobuf $(CALL_CMAKE_RULE)
@cd $(BUILD_FOLDER) && cmake $(MY_CMAKE_FLAGS) "$(MY_CMAKE_FOLDER)"
protobuf:
@$(PROTOC_COMPILE)
call_cmake_linux:
@mkdir -p $(BUILD_FOLDER)
call_cmake_windows:
-@mkdir "$(BUILD_FOLDER)"
### Docs #######################################################################
docs: doxygen
doxygen:
@doxygen
@echo "Documentation index at ./Doxygen/html/index.html"
### Clean ######################################################################
clean: $(CLEAN_RULE)
@$(PROTOC_CLEAN)
clean_linux:
@rm -Rf $(BASE_BUILD_FOLDER) $(INSTALL_FOLDER) Doxygen
clean_windows:
-@rd /s /q "$(BASE_BUILD_FOLDER)" "$(INSTALL_FOLDER)" Doxygen
### Test #######################################################################
check: debug launch_test_clients run_test_debug kill_test_clients
check_release: release launch_test_clients run_test_release kill_test_clients
run_test_debug:
@-LD_LIBRARY_PATH=$(INSTALL_FOLDER)/shared $(INSTALL_FOLDER)/bin/test_carlaserverd --gtest_shuffle $(GTEST_ARGS)
run_test_release:
@-LD_LIBRARY_PATH=$(INSTALL_FOLDER)/shared $(INSTALL_FOLDER)/bin/test_carlaserver --gtest_shuffle $(GTEST_ARGS)
launch_test_clients:
@echo "Launch echo client"
@python3 $(PYTHON_CLIENT_FOLDER)/test_client.py --echo -v -p 4000 --log echo_client.log & echo $$! > echo_client.pid
@echo "Launch carla client"
@python3 $(PYTHON_CLIENT_FOLDER)/test_client.py -v -p 2000 --log carla_client.log & echo $$! > carla_client.pid
kill_test_clients:
@echo "Kill echo client"
@kill `cat echo_client.pid` && rm echo_client.pid
@echo "Kill carla client"
@kill `cat carla_client.pid` && rm carla_client.pid

View File

@ -1,121 +0,0 @@
#!/bin/bash
################################################################################
# Updates CARLA content.
################################################################################
set -e
DOC_STRING="Update CARLA content to the latest version, to be run after 'git pull'."
USAGE_STRING="Usage: $0 [-h|--help] [--no-editor]"
# ==============================================================================
# -- Parse arguments -----------------------------------------------------------
# ==============================================================================
LAUNCH_UE4_EDITOR=true
OPTS=`getopt -o h --long help,no-editor -n 'parse-options' -- "$@"`
if [ $? != 0 ] ; then echo "$USAGE_STRING" ; exit 2 ; fi
eval set -- "$OPTS"
while true; do
case "$1" in
--no-editor )
LAUNCH_UE4_EDITOR=false;
shift ;;
-h | --help )
echo "$DOC_STRING"
echo "$USAGE_STRING"
exit 1
;;
* )
break ;;
esac
done
# ==============================================================================
# -- Set up environment --------------------------------------------------------
# ==============================================================================
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
pushd "$SCRIPT_DIR" >/dev/null
UNREAL_PROJECT_FOLDER=./Unreal/CarlaUE4
UE4_INTERMEDIATE_FOLDERS="Binaries Build Intermediate DerivedDataCache"
function fatal_error {
echo -e "\033[0;31mERROR: $1\033[0m"
exit 1
}
function log {
echo -e "\033[0;33m$1\033[0m"
}
if [ ! -d "${UE4_ROOT}" ]; then
fatal_error "UE4_ROOT is not defined, or points to a non-existant directory, please set this environment variable."
else
echo "Using Unreal Engine at '$UE4_ROOT'"
fi
# ==============================================================================
# -- Make CarlaServer ----------------------------------------------------------
# ==============================================================================
log "Making CarlaServer..."
make clean && make debug && make release
# ==============================================================================
# -- Clean up intermediate Unreal files ----------------------------------------
# ==============================================================================
pushd "$UNREAL_PROJECT_FOLDER" >/dev/null
pushd "Plugins/Carla" >/dev/null
log "Cleaning up CARLA Plugin..."
rm -Rf ${UE4_INTERMEDIATE_FOLDERS}
popd > /dev/null
log "Cleaning up CARLAUE4..."
rm -Rf ${UE4_INTERMEDIATE_FOLDERS}
popd >/dev/null
# ==============================================================================
# -- Build and launch Unreal project -------------------------------------------
# ==============================================================================
pushd "$UNREAL_PROJECT_FOLDER" >/dev/null
# This command usually fails but normally we can continue anyway.
set +e
log "Generate Unreal project files..."
${UE4_ROOT}/GenerateProjectFiles.sh -project="${PWD}/CarlaUE4.uproject" -game -engine -makefiles
set -e
log "Build CarlaUE4 project..."
make CarlaUE4Editor
if $LAUNCH_UE4_EDITOR ; then
log "Launching UE4Editor..."
${UE4_ROOT}/Engine/Binaries/Linux/UE4Editor "${PWD}/CarlaUE4.uproject"
else
echo ""
echo "****************"
echo "*** Success! ***"
echo "****************"
fi
popd >/dev/null
# ==============================================================================
# -- ...and we are done --------------------------------------------------------
# ==============================================================================
popd >/dev/null

227
Setup.sh
View File

@ -1,227 +0,0 @@
#! /bin/bash
################################################################################
# CARLA Setup.sh
#
# This script sets up the environment and dependencies for compiling CARLA on
# Linux.
#
# 1) Download CARLA Content if necessary.
# 2) Download and compile libc++.
# 3) Download other third-party libraries and compile them with libc++.
#
# Thanks to the people at https://github.com/Microsoft/AirSim for providing the
# important parts of this script.
################################################################################
set -e
DOC_STRING="Download and compile CARLA content and dependencies."
USAGE_STRING="Usage: $0 [-h|--help] [-s|--skip-download] [--jobs=N]"
# ==============================================================================
# -- Parse arguments -----------------------------------------------------------
# ==============================================================================
UPDATE_SCRIPT_FLAGS=
NUMBER_OF_ASYNC_JOBS=1
OPTS=`getopt -o hs --long help,skip-download,jobs:: -n 'parse-options' -- "$@"`
if [ $? != 0 ] ; then echo "$USAGE_STRING" ; exit 2 ; fi
eval set -- "$OPTS"
while true; do
case "$1" in
-s | --skip-download )
UPDATE_SCRIPT_FLAGS=--skip-download;
shift ;;
--jobs)
case "$2" in
"") NUMBER_OF_ASYNC_JOBS=4 ; shift 2 ;;
*) NUMBER_OF_ASYNC_JOBS=$2 ; shift 2 ;;
esac ;;
-h | --help )
echo "$DOC_STRING"
echo "$USAGE_STRING"
exit 1
;;
* )
break ;;
esac
done
# ==============================================================================
# -- Set up environment --------------------------------------------------------
# ==============================================================================
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
pushd "$SCRIPT_DIR" >/dev/null
# Require clang 3.9
command -v clang++-3.9 >/dev/null 2>&1 || {
echo >&2 "clang 3.9 is required, but it's not installed.";
echo >&2 "make sure you build Unreal Engine with clang 3.9 too.";
exit 1;
}
mkdir -p Util/Build
pushd Util/Build >/dev/null
# ==============================================================================
# -- Get and compile libc++ ----------------------------------------------------
# ==============================================================================
# Get libc++ source
if [[ ! -d "llvm-source" ]]; then
echo "Retrieving libc++..."
git clone --depth=1 -b release_39 https://github.com/llvm-mirror/llvm.git llvm-source
git clone --depth=1 -b release_39 https://github.com/llvm-mirror/libcxx.git llvm-source/projects/libcxx
git clone --depth=1 -b release_39 https://github.com/llvm-mirror/libcxxabi.git llvm-source/projects/libcxxabi
else
echo "Folder llvm-source already exists, skipping git clone..."
fi
# Build libc++
rm -rf llvm-build
mkdir -p llvm-build
pushd llvm-build >/dev/null
export C_COMPILER=clang-3.9
export COMPILER=clang++-3.9
cmake -DCMAKE_C_COMPILER=${C_COMPILER} -DCMAKE_CXX_COMPILER=${COMPILER} \
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF -DLIBCXX_INSTALL_EXPERIMENTAL_LIBRARY=OFF \
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="../llvm-install" \
../llvm-source
make -j $NUMBER_OF_ASYNC_JOBS cxx
#install libc++ locally in llvm-install folder
make -j $NUMBER_OF_ASYNC_JOBS install-libcxx install-libcxxabi
popd >/dev/null
# ==============================================================================
# -- Get Boost and compile it with libc++ --------------------------------------
# ==============================================================================
# Get boost source
if [[ ! -d "boost-source" ]]; then
echo "Retrieving boost..."
wget https://dl.bintray.com/boostorg/release/1.64.0/source/boost_1_64_0.tar.gz
tar -xvzf boost_1_64_0.tar.gz
rm boost_1_64_0.tar.gz
mv boost_1_64_0 boost-source
else
echo "Folder boost-source already exists, skipping download..."
fi
pushd boost-source >/dev/null
BOOST_TOOLSET="clang-3.9"
BOOST_CFLAGS="-fPIC -std=c++1y -stdlib=libc++ -I../llvm-install/include/c++/v1"
BOOST_LFLAGS="-stdlib=libc++ -L../llvm-install/lib"
./bootstrap.sh \
--with-toolset=clang \
--prefix=../boost-install \
--with-libraries=system
./b2 clean
./b2 toolset="${BOOST_TOOLSET}" cxxflags="${BOOST_CFLAGS}" linkflags="${BOOST_LFLAGS}" --prefix="../boost-install" -j $NUMBER_OF_ASYNC_JOBS stage release
./b2 install toolset="${BOOST_TOOLSET}" cxxflags="${BOOST_CFLAGS}" linkflags="${BOOST_LFLAGS}" --prefix="../boost-install" -j $NUMBER_OF_ASYNC_JOBS
popd >/dev/null
# ==============================================================================
# -- Get Protobuf and compile it with libc++ -----------------------------------
# ==============================================================================
# Get protobuf source
if [[ ! -d "protobuf-source" ]]; then
echo "Retrieving protobuf..."
git clone --depth=1 -b v3.3.0 --recurse-submodules https://github.com/google/protobuf.git protobuf-source
else
echo "Folder protobuf-source already exists, skipping git clone..."
fi
pushd protobuf-source >/dev/null
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$PWD/../llvm-install/lib/"
./autogen.sh
./configure \
CC="clang-3.9" \
CXX="clang++-3.9" \
CXXFLAGS="-fPIC -stdlib=libc++ -I$PWD/../llvm-install/include/c++/v1" \
LDFLAGS="-stdlib=libc++ -L$PWD/../llvm-install/lib/" \
--prefix="$PWD/../protobuf-install" \
--disable-shared
make -j $NUMBER_OF_ASYNC_JOBS
make -j $NUMBER_OF_ASYNC_JOBS install
popd >/dev/null
# ==============================================================================
# -- Get GTest and compile it with libc++ --------------------------------------
# ==============================================================================
# Get googletest source
if [[ ! -d "googletest-source" ]]; then
echo "Retrieving googletest..."
git clone --depth=1 -b release-1.8.0 https://github.com/google/googletest.git googletest-source
else
echo "Folder googletest-source already exists, skipping git clone..."
fi
pushd googletest-source >/dev/null
cmake -H. -B./build \
-DCMAKE_C_COMPILER=${C_COMPILER} -DCMAKE_CXX_COMPILER=${COMPILER} \
-DCMAKE_CXX_FLAGS="-stdlib=libc++ -I$PWD/../llvm-install/include/c++/v1 -Wl,-L$PWD/../llvm-install/lib" \
-DCMAKE_INSTALL_PREFIX="../googletest-install" \
-G "Ninja"
pushd build >/dev/null
ninja
ninja install
popd >/dev/null
popd >/dev/null
# ==============================================================================
# -- Other CARLA files ---------------------------------------------------------
# ==============================================================================
popd >/dev/null
CARLA_SETTINGS_FILE="./Unreal/CarlaUE4/Config/CarlaSettings.ini"
if [[ ! -f $CARLA_SETTINGS_FILE ]]; then
echo "Copying CarlaSettings.ini..."
sed -e 's/UseNetworking=true/UseNetworking=false/' ./Docs/Example.CarlaSettings.ini > $CARLA_SETTINGS_FILE
fi
./Util/Protoc.sh
# ==============================================================================
# -- Update CARLA Content ------------------------------------------------------
# ==============================================================================
echo
./Update.sh $UPDATE_SCRIPT_FLAGS
# ==============================================================================
# -- ...and we are done --------------------------------------------------------
# ==============================================================================
popd >/dev/null
set +x
echo ""
echo "****************"
echo "*** Success! ***"
echo "****************"

View File

@ -7,6 +7,7 @@ Saved
Plugins/Carla/Binaries Plugins/Carla/Binaries
Plugins/Carla/Build Plugins/Carla/Build
Plugins/Carla/CarlaServer Plugins/Carla/CarlaServer
Plugins/Carla/CarlaDependencies
Plugins/Carla/Debug Plugins/Carla/Debug
Plugins/Carla/DerivedDataCache Plugins/Carla/DerivedDataCache
Plugins/Carla/Intermediate Plugins/Carla/Intermediate

View File

@ -1,6 +1,6 @@
{ {
"FileVersion": 3, "FileVersion": 3,
"EngineAssociation": "4.18", "EngineAssociation": "4.19",
"Category": "", "Category": "",
"Description": "", "Description": "",
"Modules": [ "Modules": [

View File

@ -3,7 +3,7 @@ ProjectID=675BF8694238308FA9368292CC440350
ProjectName=CARLA UE4 ProjectName=CARLA UE4
CompanyName=CVC CompanyName=CVC
CopyrightNotice="Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma de Barcelona (UAB). This work is licensed under the terms of the MIT license. For a copy, see <https://opensource.org/licenses/MIT>." CopyrightNotice="Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma de Barcelona (UAB). This work is licensed under the terms of the MIT license. For a copy, see <https://opensource.org/licenses/MIT>."
ProjectVersion=0.8.4 ProjectVersion=0.9.0
[/Script/UnrealEd.ProjectPackagingSettings] [/Script/UnrealEd.ProjectPackagingSettings]
BuildConfiguration=PPBC_Development BuildConfiguration=PPBC_Development

View File

@ -1,7 +1,7 @@
{ {
"FileVersion": 3, "FileVersion": 3,
"Version": 1, "Version": 1,
"VersionName": "0.8.4", "VersionName": "0.9.0",
"FriendlyName": "CARLA", "FriendlyName": "CARLA",
"Description": "Open-source simulator for autonomous driving research.", "Description": "Open-source simulator for autonomous driving research.",
"Category": "Science", "Category": "Science",

View File

@ -1,5 +1,6 @@
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
using System;
using System.IO; using System.IO;
using UnrealBuildTool; using UnrealBuildTool;
@ -78,17 +79,7 @@ public class Carla : ModuleRules
private void AddCarlaServerDependency(ReadOnlyTargetRules Target) private void AddCarlaServerDependency(ReadOnlyTargetRules Target)
{ {
string CarlaServerInstallPath = Path.GetFullPath(Path.Combine(ModuleDirectory, "../../CarlaServer")); string LibCarlaInstallPath = Path.GetFullPath(Path.Combine(ModuleDirectory, "../../CarlaDependencies"));
string CarlaServerLib;
if (UseDebugLibs(Target))
{
CarlaServerLib = "carlaserverd";
}
else
{
CarlaServerLib = "carlaserver";
}
ADelegate GetLibName = (string BaseName) => { ADelegate GetLibName = (string BaseName) => {
if (IsWindows(Target)) if (IsWindows(Target))
@ -104,23 +95,17 @@ public class Carla : ModuleRules
// Link dependencies. // Link dependencies.
if (IsWindows(Target)) if (IsWindows(Target))
{ {
// Auto-links boost libraries in folder. throw new NotImplementedException();
PublicLibraryPaths.Add(Path.Combine(CarlaServerInstallPath, "lib"));
PublicAdditionalLibraries.Add(Path.Combine(CarlaServerInstallPath, "lib", GetLibName("libprotobuf")));
PublicAdditionalLibraries.Add(Path.Combine(CarlaServerInstallPath, "lib", GetLibName(CarlaServerLib)));
} }
else else
{ {
PublicAdditionalLibraries.Add(Path.Combine(CarlaServerInstallPath, "lib", GetLibName("c++abi"))); PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("c++abi")));
PublicAdditionalLibraries.Add(Path.Combine(CarlaServerInstallPath, "lib", GetLibName("boost_system"))); PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("rpc")));
PublicAdditionalLibraries.Add(Path.Combine(CarlaServerInstallPath, "lib", GetLibName("protobuf")));
PublicAdditionalLibraries.Add(Path.Combine(CarlaServerInstallPath, "lib", GetLibName(CarlaServerLib)));
} }
// Include path. // Include path.
string CarlaServerIncludePath = Path.Combine(CarlaServerInstallPath, "include"); string LibCarlaIncludePath = Path.Combine(LibCarlaInstallPath, "include");
PublicIncludePaths.Add(CarlaServerIncludePath); PublicIncludePaths.Add(LibCarlaIncludePath);
PrivateIncludePaths.Add(CarlaServerIncludePath); PrivateIncludePaths.Add(LibCarlaIncludePath);
} }
} }

View File

@ -4,6 +4,8 @@
// This work is licensed under the terms of the MIT license. // This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>. // For a copy, see <https://opensource.org/licenses/MIT>.
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
#include "Carla.h" #include "Carla.h"
#include "CarlaEncoder.h" #include "CarlaEncoder.h"
@ -221,3 +223,5 @@ void FCarlaEncoder::Visit(const UWalkerAgentComponent &Agent)
::Encode(Agent.GetBoundingBoxTransform(), Data.bounding_box.transform); ::Encode(Agent.GetBoundingBoxTransform(), Data.bounding_box.transform);
::Encode(Agent.GetBoundingBoxExtent() * TO_METERS, Data.bounding_box.extent); ::Encode(Agent.GetBoundingBoxExtent() * TO_METERS, Data.bounding_box.extent);
} }
#endif // CARLA_COMPILE_CARLASERVER_LEGACY

View File

@ -6,6 +6,8 @@
#pragma once #pragma once
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
#include "Agent/AgentComponentVisitor.h" #include "Agent/AgentComponentVisitor.h"
#include "Sensor/SensorDataView.h" #include "Sensor/SensorDataView.h"
@ -74,3 +76,5 @@ private:
carla_agent &Data; carla_agent &Data;
}; };
#endif // CARLA_COMPILE_CARLASERVER_LEGACY

View File

@ -9,12 +9,15 @@
#include "Server/CarlaEncoder.h" #include "Server/CarlaEncoder.h"
#include <carla/carla_server.h> #ifdef CARLA_COMPILE_CARLASERVER_LEGACY
# include <carla/carla_server.h>
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
// ============================================================================= // =============================================================================
// -- Static local methods ----------------------------------------------------- // -- Static local methods -----------------------------------------------------
// ============================================================================= // =============================================================================
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
static FCarlaServer::ErrorCode ParseErrorCode(const uint32 ErrorCode) static FCarlaServer::ErrorCode ParseErrorCode(const uint32 ErrorCode)
{ {
if (ErrorCode == CARLA_SERVER_SUCCESS) { if (ErrorCode == CARLA_SERVER_SUCCESS) {
@ -25,6 +28,7 @@ static FCarlaServer::ErrorCode ParseErrorCode(const uint32 ErrorCode)
return FCarlaServer::Error; return FCarlaServer::Error;
} }
} }
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
static int32 GetTimeOut(uint32 TimeOut, const bool bBlocking) static int32 GetTimeOut(uint32 TimeOut, const bool bBlocking)
{ {
@ -38,7 +42,12 @@ static int32 GetTimeOut(uint32 TimeOut, const bool bBlocking)
FCarlaServer::FCarlaServer(const uint32 InWorldPort, const uint32 InTimeOut) : FCarlaServer::FCarlaServer(const uint32 InWorldPort, const uint32 InTimeOut) :
WorldPort(InWorldPort), WorldPort(InWorldPort),
TimeOut(InTimeOut), TimeOut(InTimeOut),
Server(carla_make_server()) { #ifdef CARLA_COMPILE_CARLASERVER_LEGACY
Server(carla_make_server())
#else
Server(nullptr)
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
{
check(Server != nullptr); check(Server != nullptr);
} }
@ -47,17 +56,26 @@ FCarlaServer::~FCarlaServer()
#ifdef CARLA_SERVER_EXTRA_LOG #ifdef CARLA_SERVER_EXTRA_LOG
UE_LOG(LogCarlaServer, Warning, TEXT("Destroying CarlaServer")); UE_LOG(LogCarlaServer, Warning, TEXT("Destroying CarlaServer"));
#endif // CARLA_SERVER_EXTRA_LOG #endif // CARLA_SERVER_EXTRA_LOG
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
carla_free_server(Server); carla_free_server(Server);
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
} }
FCarlaServer::ErrorCode FCarlaServer::Connect() FCarlaServer::ErrorCode FCarlaServer::Connect()
{ {
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
UE_LOG(LogCarlaServer, Log, TEXT("Waiting for the client to connect...")); UE_LOG(LogCarlaServer, Log, TEXT("Waiting for the client to connect..."));
return ParseErrorCode(carla_server_connect(Server, WorldPort, TimeOut)); return ParseErrorCode(carla_server_connect(Server, WorldPort, TimeOut));
#else
UE_LOG(LogCarlaServer, Error, TEXT("CarlaServer no longer supported!!"));
return ErrorCode::Error;
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
} }
FCarlaServer::ErrorCode FCarlaServer::ReadNewEpisode(FString &IniFile, const bool bBlocking) FCarlaServer::ErrorCode FCarlaServer::ReadNewEpisode(FString &IniFile, const bool bBlocking)
{ {
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
carla_request_new_episode values; carla_request_new_episode values;
auto ec = ParseErrorCode(carla_read_request_new_episode(Server, values, GetTimeOut(TimeOut, bBlocking))); auto ec = ParseErrorCode(carla_read_request_new_episode(Server, values, GetTimeOut(TimeOut, bBlocking)));
if (Success == ec) { if (Success == ec) {
@ -68,6 +86,10 @@ FCarlaServer::ErrorCode FCarlaServer::ReadNewEpisode(FString &IniFile, const boo
#endif // CARLA_SERVER_EXTRA_LOG #endif // CARLA_SERVER_EXTRA_LOG
} }
return ec; return ec;
#else
return ErrorCode::Error;
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
} }
FCarlaServer::ErrorCode FCarlaServer::SendSceneDescription( FCarlaServer::ErrorCode FCarlaServer::SendSceneDescription(
@ -76,6 +98,8 @@ FCarlaServer::ErrorCode FCarlaServer::SendSceneDescription(
const TArray<USensorDescription *> &SensorDescriptions, const TArray<USensorDescription *> &SensorDescriptions,
const bool bBlocking) const bool bBlocking)
{ {
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
carla_scene_description scene; carla_scene_description scene;
// Encode map name. // Encode map name.
const auto MapNameBuffer = FCarlaEncoder::Encode(MapName); const auto MapNameBuffer = FCarlaEncoder::Encode(MapName);
@ -95,10 +119,16 @@ FCarlaServer::ErrorCode FCarlaServer::SendSceneDescription(
UE_LOG(LogCarlaServer, Log, TEXT("Sending %d available start positions"), scene.number_of_player_start_spots); UE_LOG(LogCarlaServer, Log, TEXT("Sending %d available start positions"), scene.number_of_player_start_spots);
UE_LOG(LogCarlaServer, Log, TEXT("Sending %d sensor descriptions"), scene.number_of_sensors); UE_LOG(LogCarlaServer, Log, TEXT("Sending %d sensor descriptions"), scene.number_of_sensors);
return ParseErrorCode(carla_write_scene_description(Server, scene, GetTimeOut(TimeOut, bBlocking))); return ParseErrorCode(carla_write_scene_description(Server, scene, GetTimeOut(TimeOut, bBlocking)));
#else
return ErrorCode::Error;
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
} }
FCarlaServer::ErrorCode FCarlaServer::ReadEpisodeStart(uint32 &StartPositionIndex, const bool bBlocking) FCarlaServer::ErrorCode FCarlaServer::ReadEpisodeStart(uint32 &StartPositionIndex, const bool bBlocking)
{ {
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
carla_episode_start values; carla_episode_start values;
auto ec = ParseErrorCode(carla_read_episode_start(Server, values, GetTimeOut(TimeOut, bBlocking))); auto ec = ParseErrorCode(carla_read_episode_start(Server, values, GetTimeOut(TimeOut, bBlocking)));
if (Success == ec) { if (Success == ec) {
@ -106,17 +136,29 @@ FCarlaServer::ErrorCode FCarlaServer::ReadEpisodeStart(uint32 &StartPositionInde
UE_LOG(LogCarlaServer, Log, TEXT("Episode start received: { StartIndex = %d }"), StartPositionIndex); UE_LOG(LogCarlaServer, Log, TEXT("Episode start received: { StartIndex = %d }"), StartPositionIndex);
} }
return ec; return ec;
#else
return ErrorCode::Error;
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
} }
FCarlaServer::ErrorCode FCarlaServer::SendEpisodeReady(const bool bBlocking) FCarlaServer::ErrorCode FCarlaServer::SendEpisodeReady(const bool bBlocking)
{ {
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
UE_LOG(LogCarlaServer, Log, TEXT("Ready to play, notifying client")); UE_LOG(LogCarlaServer, Log, TEXT("Ready to play, notifying client"));
const carla_episode_ready values = {true}; const carla_episode_ready values = {true};
return ParseErrorCode(carla_write_episode_ready(Server, values, GetTimeOut(TimeOut, bBlocking))); return ParseErrorCode(carla_write_episode_ready(Server, values, GetTimeOut(TimeOut, bBlocking)));
#else
return ErrorCode::Error;
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
} }
FCarlaServer::ErrorCode FCarlaServer::ReadControl(FVehicleControl &Control, const bool bBlocking) FCarlaServer::ErrorCode FCarlaServer::ReadControl(FVehicleControl &Control, const bool bBlocking)
{ {
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
carla_control values; carla_control values;
auto ec = ParseErrorCode(carla_read_control(Server, values, GetTimeOut(TimeOut, bBlocking))); auto ec = ParseErrorCode(carla_read_control(Server, values, GetTimeOut(TimeOut, bBlocking)));
if (Success == ec) { if (Success == ec) {
@ -137,13 +179,23 @@ FCarlaServer::ErrorCode FCarlaServer::ReadControl(FVehicleControl &Control, cons
UE_LOG(LogCarlaServer, Warning, TEXT("No control received from the client this frame!")); UE_LOG(LogCarlaServer, Warning, TEXT("No control received from the client this frame!"));
} }
return ec; return ec;
#else
return ErrorCode::Error;
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
} }
FCarlaServer::ErrorCode FCarlaServer::SendSensorData(const FSensorDataView &Data) FCarlaServer::ErrorCode FCarlaServer::SendSensorData(const FSensorDataView &Data)
{ {
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
carla_sensor_data values; carla_sensor_data values;
FCarlaEncoder::Encode(Data, values); FCarlaEncoder::Encode(Data, values);
return ParseErrorCode(carla_write_sensor_data(Server, values)); return ParseErrorCode(carla_write_sensor_data(Server, values));
#else
return ErrorCode::Error;
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
} }
FCarlaServer::ErrorCode FCarlaServer::SendMeasurements( FCarlaServer::ErrorCode FCarlaServer::SendMeasurements(
@ -151,6 +203,8 @@ FCarlaServer::ErrorCode FCarlaServer::SendMeasurements(
const TArray<const UAgentComponent *> &Agents, const TArray<const UAgentComponent *> &Agents,
const bool bSendNonPlayerAgentsInfo) const bool bSendNonPlayerAgentsInfo)
{ {
#ifdef CARLA_COMPILE_CARLASERVER_LEGACY
// Encode measurements. // Encode measurements.
carla_measurements values; carla_measurements values;
FCarlaEncoder::Encode(PlayerState, values); FCarlaEncoder::Encode(PlayerState, values);
@ -166,4 +220,8 @@ FCarlaServer::ErrorCode FCarlaServer::SendMeasurements(
UE_LOG(LogCarlaServer, Log, TEXT("Sending data of %d agents"), values.number_of_non_player_agents); UE_LOG(LogCarlaServer, Log, TEXT("Sending data of %d agents"), values.number_of_non_player_agents);
#endif // CARLA_SERVER_EXTRA_LOG #endif // CARLA_SERVER_EXTRA_LOG
return ParseErrorCode(carla_write_measurements(Server, values)); return ParseErrorCode(carla_write_measurements(Server, values));
#else
return ErrorCode::Error;
#endif // CARLA_COMPILE_CARLASERVER_LEGACY
} }

View File

@ -0,0 +1,91 @@
// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#include "Carla.h"
#include "Server.h"
#include <compiler/disable-ue4-macros.h>
#include <carla/Version.h>
#include <carla/rpc/Actor.h>
#include <carla/rpc/ActorBlueprint.h>
#include <carla/rpc/Server.h>
#include <carla/rpc/Transform.h>
#include <carla/rpc/VehicleControl.h>
#include <compiler/enable-ue4-macros.h>
static FVehicleControl MakeControl(const carla::rpc::VehicleControl &cControl)
{
FVehicleControl Control;
Control.Throttle = cControl.throttle;
Control.Steer = cControl.steer;
Control.Brake = cControl.brake;
Control.bHandBrake = cControl.hand_brake;
Control.bReverse = cControl.reverse;
return Control;
}
class FRPCServer::Pimpl
{
public:
Pimpl(uint16_t port) : Server(port) {}
carla::rpc::Server Server;
};
FRPCServer::FRPCServer() : _Pimpl(nullptr) {}
FRPCServer::~FRPCServer() {}
void FRPCServer::Initialize(AServer &Server, uint16_t Port)
{
UE_LOG(LogTemp, Error, TEXT("Initializing rpc-server at port %d"), Port);
_Pimpl = std::make_unique<Pimpl>(Port);
namespace cr = carla::rpc;
auto &srv = _Pimpl->Server;
srv.BindAsync("ping", []() { return true; });
srv.BindAsync("version", []() { return std::string(carla::version()); });
srv.BindAsync("get_blueprints", []() {
return std::vector<cr::ActorBlueprint>{
cr::ActorBlueprint{"vehicle.mustang.red"},
cr::ActorBlueprint{"vehicle.mustang.also_red"},
cr::ActorBlueprint{"vehicle.mustang.still_red"}
};
});
srv.BindSync("spawn_actor", [&](
const cr::ActorBlueprint &blueprint,
const cr::Transform &transform) {
auto id = Server.SpawnAgent(transform);
return cr::Actor{static_cast<cr::Actor::id_type>(id), blueprint};
});
srv.BindSync("apply_control_to_actor", [&](
const cr::Actor &actor,
const cr::VehicleControl &control) {
Server.ApplyControl(actor.id, MakeControl(control));
});
}
void FRPCServer::Run()
{
_Pimpl->Server.AsyncRun(4);
}
void FRPCServer::RunSome()
{
using namespace std::chrono_literals;
_Pimpl->Server.SyncRunFor(20ms);
}
void FRPCServer::Stop()
{
_Pimpl->Server.Stop();
}

View File

@ -0,0 +1,35 @@
// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#pragma once
#include "CoreMinimal.h"
#include <memory>
class AServer;
class FRPCServer
{
public:
FRPCServer();
~FRPCServer();
void Initialize(AServer &Server, uint16_t Port = 8080u);
void Run();
void RunSome();
void Stop();
private:
class Pimpl;
std::unique_ptr<Pimpl> _Pimpl;
};

View File

@ -0,0 +1,72 @@
// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#include "Carla.h"
#include "Server.h"
// Sets default values
AServer::AServer()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void AServer::BeginPlay()
{
Super::BeginPlay();
_Server.Initialize(*this);
_Server.Run();
}
void AServer::EndPlay(EEndPlayReason::Type EndPlayReason)
{
_Server.Stop();
}
// Called every frame
void AServer::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
_Server.RunSome();
}
int32 AServer::SpawnAgent(const FTransform &Transform)
{
check(IsInGameThread());
UE_LOG(LogTemp, Warning, TEXT("Spawning vehicle at %s"), *Transform.ToString());
static int32 COUNT = 0u;
++COUNT;
ACarlaWheeledVehicle *Vehicle;
SpawnVehicle(Transform, Vehicle);
if ((Vehicle != nullptr) && !Vehicle->IsPendingKill())
{
// Vehicle->AIControllerClass = AWheeledVehicleAIController::StaticClass();
Vehicle->SpawnDefaultController();
_Agents.Add(COUNT, Vehicle);
return COUNT;
}
return -1;
}
bool AServer::ApplyControl(int32 AgentId, const FVehicleControl &Control)
{
UE_LOG(LogTemp, Log, TEXT("Applying control to vehicle %d: throttle = %f, steer = %f"), AgentId, Control.Throttle, Control.Steer);
if (!_Agents.Contains(AgentId))
{
UE_LOG(LogTemp, Error, TEXT("Vehicle %d does not exist!"), AgentId);
return false;
}
auto *Vehicle = _Agents[AgentId];
Vehicle->ApplyVehicleControl(Control);
return true;
}

View File

@ -0,0 +1,52 @@
// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#pragma once
#include "Vehicle/CarlaWheeledVehicle.h"
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "RPCServer.h"
#include "Vehicle/VehicleControl.h"
#include <future>
#include <mutex>
#include <queue>
#include "Server.generated.h"
UCLASS()
class CARLA_API AServer : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AServer();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
virtual void EndPlay(EEndPlayReason::Type EndPlayReason) override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UFUNCTION(BlueprintCallable)
int32 SpawnAgent(const FTransform &Transform);
UFUNCTION(BlueprintCallable)
bool ApplyControl(int32 AgentId, const FVehicleControl &Control);
UFUNCTION(BlueprintImplementableEvent)
void SpawnVehicle(const FTransform &SpawnTransform, ACarlaWheeledVehicle *&SpawnedCharacter);
private:
FRPCServer _Server;
UPROPERTY(VisibleAnywhere)
TMap<uint32, ACarlaWheeledVehicle *> _Agents;
};

View File

@ -155,7 +155,7 @@ AWalkerAIController::AWalkerAIController(const FObjectInitializer& ObjectInitial
SightConfiguration->DetectionByAffiliation.bDetectEnemies = true; SightConfiguration->DetectionByAffiliation.bDetectEnemies = true;
SightConfiguration->DetectionByAffiliation.bDetectNeutrals = true; SightConfiguration->DetectionByAffiliation.bDetectNeutrals = true;
SightConfiguration->DetectionByAffiliation.bDetectFriendlies = true; SightConfiguration->DetectionByAffiliation.bDetectFriendlies = true;
Perception->ConfigureSense(*SightConfiguration); Perception->ConfigureSense(*SightConfiguration);
Perception->SetDominantSense(SightConfiguration->GetSenseImplementation()); Perception->SetDominantSense(SightConfiguration->GetSenseImplementation());
Perception->OnPerceptionUpdated.AddDynamic(this, &AWalkerAIController::SenseActors); Perception->OnPerceptionUpdated.AddDynamic(this, &AWalkerAIController::SenseActors);
@ -163,7 +163,6 @@ AWalkerAIController::AWalkerAIController(const FObjectInitializer& ObjectInitial
TimeInState=0.0f; TimeInState=0.0f;
} }
void AWalkerAIController::Possess(APawn *aPawn) void AWalkerAIController::Possess(APawn *aPawn)
{ {
Super::Possess(aPawn); Super::Possess(aPawn);
@ -175,12 +174,12 @@ void AWalkerAIController::Tick(float DeltaSeconds)
{ {
Super::Tick(DeltaSeconds); Super::Tick(DeltaSeconds);
TimeInState+=DeltaSeconds; TimeInState+=DeltaSeconds;
if (Status != EWalkerStatus::RunOver) if (Status != EWalkerStatus::RunOver)
{ {
switch (GetMoveStatus()) switch (GetMoveStatus())
{ {
default: break; default: break;
case EPathFollowingStatus::Idle: case EPathFollowingStatus::Idle:
//case EPathFollowingStatus::Waiting: //<-- incomplete path //case EPathFollowingStatus::Waiting: //<-- incomplete path
LOG_AI_WALKER(Warning, "is stuck!"); LOG_AI_WALKER(Warning, "is stuck!");
ChangeStatus(EWalkerStatus::Stuck); ChangeStatus(EWalkerStatus::Stuck);
@ -191,7 +190,7 @@ void AWalkerAIController::Tick(float DeltaSeconds)
TryResumeMovement(); TryResumeMovement();
} }
break; break;
}; };
} }
} }
@ -208,7 +207,7 @@ FPathFollowingRequestResult AWalkerAIController::MoveTo(
; ;
#endif // CARLA_AI_WALKERS_EXTRA_LOG #endif // CARLA_AI_WALKERS_EXTRA_LOG
ChangeStatus(EWalkerStatus::Moving); ChangeStatus(EWalkerStatus::Moving);
return Super::MoveTo(MoveRequest, OutPath); return Super::MoveTo(MoveRequest, OutPath);
} }
@ -221,13 +220,12 @@ void AWalkerAIController::OnMoveCompleted(
#ifdef CARLA_AI_WALKERS_EXTRA_LOG #ifdef CARLA_AI_WALKERS_EXTRA_LOG
UE_LOG(LogCarla, Log, TEXT("Walker %s completed move at (%s)"), UE_LOG(LogCarla, Log, TEXT("Walker %s completed move at (%s)"),
*GetPawn()->GetName(), *GetPawn()->GetName(),
*GetPawn()->GetActorLocation().ToString()) *GetPawn()->GetActorLocation().ToString());
;
#endif // CARLA_AI_WALKERS_EXTRA_LOG #endif // CARLA_AI_WALKERS_EXTRA_LOG
ChangeStatus(EWalkerStatus::MoveCompleted); ChangeStatus(EWalkerStatus::MoveCompleted);
} }
void AWalkerAIController::SenseActors(TArray<AActor *> Actors) void AWalkerAIController::SenseActors(const TArray<AActor *> &Actors)
{ {
const auto *aPawn = GetPawn(); const auto *aPawn = GetPawn();
if ((Status == EWalkerStatus::Moving) && if ((Status == EWalkerStatus::Moving) &&

View File

@ -35,16 +35,17 @@ public:
virtual void Tick(float DeltaSeconds) override; virtual void Tick(float DeltaSeconds) override;
virtual FPathFollowingRequestResult MoveTo( virtual FPathFollowingRequestResult MoveTo(
const FAIMoveRequest& MoveRequest, const FAIMoveRequest& MoveRequest,
FNavPathSharedPtr* OutPath = nullptr) override; FNavPathSharedPtr* OutPath = nullptr) override;
virtual void OnMoveCompleted(FAIRequestID RequestID, const FPathFollowingResult &Result) override; virtual void OnMoveCompleted(
FAIRequestID RequestID,
const FPathFollowingResult &Result) override;
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void SenseActors(TArray<AActor *> Actors); void SenseActors(const TArray<AActor *> &Actors);
EWalkerStatus GetWalkerStatus() const EWalkerStatus GetWalkerStatus() const
{ {
@ -58,19 +59,27 @@ public:
float GetTimeInState() const { return TimeInState; } float GetTimeInState() const { return TimeInState; }
private: private:
void ChangeStatus(EWalkerStatus status); void ChangeStatus(EWalkerStatus status);
void TryResumeMovement(); void TryResumeMovement();
void TryPauseMovement(bool bItWasRunOver = false); void TryPauseMovement(bool bItWasRunOver = false);
UFUNCTION() UFUNCTION()
void OnPawnTookDamage(AActor *DamagedActor, float Damage, const UDamageType *DamageType, AController *InstigatedBy, AActor *DamageCauser); void OnPawnTookDamage(
AActor *DamagedActor,
float Damage,
const UDamageType *DamageType,
AController *InstigatedBy,
AActor *DamageCauser);
UPROPERTY(Category = "Walker AI Controller", VisibleAnywhere) UPROPERTY(Category = "Walker AI Controller", VisibleAnywhere)
UAISenseConfig_Sight *SightConfiguration; UAISenseConfig_Sight *SightConfiguration;
UPROPERTY(VisibleAnywhere) UPROPERTY(VisibleAnywhere)
EWalkerStatus Status = EWalkerStatus::Unknown; EWalkerStatus Status = EWalkerStatus::Unknown;
/** Continous time in the same EWalkerStatus */ /** Continous time in the same EWalkerStatus */
float TimeInState=0.0f; float TimeInState=0.0f;
}; };

147
Util/BuildTools/BuildCarlaUE4.sh Executable file
View File

@ -0,0 +1,147 @@
#! /bin/bash
# ==============================================================================
# -- Set up environment --------------------------------------------------------
# ==============================================================================
source $(dirname "$0")/Environment.sh
if [ ! -d "${UE4_ROOT}" ]; then
fatal_error "UE4_ROOT is not defined, or points to a non-existant directory, please set this environment variable."
else
log "Using Unreal Engine at '$UE4_ROOT'"
fi
# ==============================================================================
# -- Parse arguments -----------------------------------------------------------
# ==============================================================================
DOC_STRING="Build and launch CarlaUE4."
USAGE_STRING="Usage: $0 [-h|--help] [--build] [--rebuild] [--launch] [--clean] [--hard-clean]"
REMOVE_INTERMEDIATE=false
HARD_CLEAN=false
BUILD_CARLAUE4=false
LAUNCH_UE4_EDITOR=false
OPTS=`getopt -o h --long help,build,rebuild,launch,clean,hard-clean -n 'parse-options' -- "$@"`
if [ $? != 0 ] ; then echo "$USAGE_STRING" ; exit 2 ; fi
eval set -- "$OPTS"
while true; do
case "$1" in
--build )
BUILD_CARLAUE4=true;
shift ;;
--rebuild )
REMOVE_INTERMEDIATE=true;
BUILD_CARLAUE4=true;
shift ;;
--launch )
LAUNCH_UE4_EDITOR=true;
shift ;;
--clean )
REMOVE_INTERMEDIATE=true;
shift ;;
--hard-clean )
REMOVE_INTERMEDIATE=true;
HARD_CLEAN=true;
shift ;;
-h | --help )
echo "$DOC_STRING"
echo "$USAGE_STRING"
exit 1
;;
* )
break ;;
esac
done
if ! { ${REMOVE_INTERMEDIATE} || ${BUILD_CARLAUE4} || ${LAUNCH_UE4_EDITOR}; }; then
fatal_error "Nothing selected to be done."
fi
pushd "${CARLAUE4_ROOT_FOLDER}" >/dev/null
# ==============================================================================
# -- Clean CarlaUE4 ------------------------------------------------------------
# ==============================================================================
if ${REMOVE_INTERMEDIATE} ; then
log "Cleaning intermediate files and folders."
UE4_INTERMEDIATE_FOLDERS="Binaries Build Intermediate DerivedDataCache"
rm -Rf ${UE4_INTERMEDIATE_FOLDERS}
pushd "${CARLAUE4_PLUGIN_ROOT_FOLDER}" >/dev/null
rm -Rf ${UE4_INTERMEDIATE_FOLDERS}
popd >/dev/null
fi
if ${HARD_CLEAN} ; then
if [ ! -f Makefile ]; then
fatal_error "The project wasn't built before!"
fi
log "Doing a \"hard\" clean of the Unreal Engine project."
make CarlaUE4Editor ARGS=-clean
fi
if ${REMOVE_INTERMEDIATE} ; then
rm -f Makefile
fi
# ==============================================================================
# -- Build CarlaUE4 ------------------------------------------------------------
# ==============================================================================
if ${BUILD_CARLAUE4} ; then
if [ ! -f Makefile ]; then
# This command fails sometimes but normally we can continue anyway.
set +e
log "Generate Unreal project files."
${UE4_ROOT}/GenerateProjectFiles.sh -project="${PWD}/CarlaUE4.uproject" -game -engine -makefiles
set -e
fi
log "Build CarlaUE4 project."
make CarlaUE4Editor
fi
# ==============================================================================
# -- Launch UE4Editor ----------------------------------------------------------
# ==============================================================================
if ${LAUNCH_UE4_EDITOR} ; then
log "Launching UE4Editor..."
${UE4_ROOT}/Engine/Binaries/Linux/UE4Editor "${PWD}/CarlaUE4.uproject"
else
log "Success!"
fi
# ==============================================================================
# -- ...and we are done --------------------------------------------------------
# ==============================================================================
popd >/dev/null

131
Util/BuildTools/BuildLibCarla.sh Executable file
View File

@ -0,0 +1,131 @@
#! /bin/bash
source $(dirname "$0")/Environment.sh
# ==============================================================================
# -- Parse arguments -----------------------------------------------------------
# ==============================================================================
DOC_STRING="Build LibCarla."
USAGE_STRING="Usage: $0 [-h|--help] [--rebuild] [--server] [--client] [--clean]"
REMOVE_INTERMEDIATE=false
BUILD_SERVER=false
BUILD_CLIENT=false
OPTS=`getopt -o h --long help,rebuild,server,client,clean -n 'parse-options' -- "$@"`
if [ $? != 0 ] ; then echo "$USAGE_STRING" ; exit 2 ; fi
eval set -- "$OPTS"
while true; do
case "$1" in
--rebuild )
REMOVE_INTERMEDIATE=true;
BUILD_SERVER=true;
BUILD_CLIENT=true;
shift ;;
--server )
BUILD_SERVER=true;
shift ;;
--client )
BUILD_CLIENT=true;
shift ;;
--clean )
REMOVE_INTERMEDIATE=true;
shift ;;
-h | --help )
echo "$DOC_STRING"
echo "$USAGE_STRING"
exit 1
;;
* )
break ;;
esac
done
if ! { ${REMOVE_INTERMEDIATE} || ${BUILD_SERVER} || ${BUILD_CLIENT}; }; then
fatal_error "Nothing selected to be done."
fi
# ==============================================================================
# -- Clean intermediate files --------------------------------------------------
# ==============================================================================
if ${REMOVE_INTERMEDIATE} ; then
log "Cleaning intermediate files and folders."
rm -Rf ${LIBCARLA_BUILD_SERVER_FOLDER} ${LIBCARLA_BUILD_CLIENT_FOLDER}
rm -Rf ${LIBCARLA_INSTALL_SERVER_FOLDER} ${LIBCARLA_INSTALL_CLIENT_FOLDER}
rm -f ${LIBCARLA_ROOT_FOLDER}/source/carla/Version.h
fi
# ==============================================================================
# -- Build Server configuration ------------------------------------------------
# ==============================================================================
if ${BUILD_SERVER} ; then
log "Building LibCarla \"Server\" configuration."
mkdir -p ${LIBCARLA_BUILD_SERVER_FOLDER}
pushd "${LIBCARLA_BUILD_SERVER_FOLDER}" >/dev/null
if [ ! -f "build.ninja" ]; then
cmake \
-G "Ninja" \
-DCMAKE_BUILD_TYPE=Server \
-DCMAKE_TOOLCHAIN_FILE=${LIBCPP_TOOLCHAIN_FILE} \
-DCMAKE_INSTALL_PREFIX=${LIBCARLA_INSTALL_SERVER_FOLDER} \
${CARLA_ROOT_FOLDER}
fi
ninja
ninja install | grep -v "Up-to-date:"
popd >/dev/null
fi
# ==============================================================================
# -- Build Client configuration ------------------------------------------------
# ==============================================================================
if ${BUILD_CLIENT} ; then
log "Building LibCarla \"Client\" configuration."
mkdir -p ${LIBCARLA_BUILD_CLIENT_FOLDER}
pushd "${LIBCARLA_BUILD_CLIENT_FOLDER}" >/dev/null
if [ ! -f "build.ninja" ]; then
cmake \
-G "Ninja" \
-DCMAKE_BUILD_TYPE=Client \
-DCMAKE_TOOLCHAIN_FILE=${LIBSTDCPP_TOOLCHAIN_FILE} \
-DCMAKE_INSTALL_PREFIX=${LIBCARLA_INSTALL_CLIENT_FOLDER} \
${CARLA_ROOT_FOLDER}
fi
ninja
ninja install | grep -v "Up-to-date:"
popd >/dev/null
fi
# ==============================================================================
# -- ...and we are done --------------------------------------------------------
# ==============================================================================
log "Success!"

View File

@ -0,0 +1,99 @@
#! /bin/bash
source $(dirname "$0")/Environment.sh
export CC=clang-5.0
export CXX=clang++-5.0
# ==============================================================================
# -- Parse arguments -----------------------------------------------------------
# ==============================================================================
DOC_STRING="Build and package CARLA Python API."
USAGE_STRING="Usage: $0 [-h|--help] [--rebuild] [--py2] [--py3] [--clean]"
REMOVE_INTERMEDIATE=false
BUILD_FOR_PYTHON2=false
BUILD_FOR_PYTHON3=false
OPTS=`getopt -o h --long help,rebuild,py2,py3,clean -n 'parse-options' -- "$@"`
if [ $? != 0 ] ; then echo "$USAGE_STRING" ; exit 2 ; fi
eval set -- "$OPTS"
while true; do
case "$1" in
--rebuild )
REMOVE_INTERMEDIATE=true;
BUILD_FOR_PYTHON2=true;
BUILD_FOR_PYTHON3=true;
shift ;;
--py2 )
BUILD_FOR_PYTHON2=true;
shift ;;
--py3 )
BUILD_FOR_PYTHON3=true;
shift ;;
--clean )
REMOVE_INTERMEDIATE=true;
shift ;;
-h | --help )
echo "$DOC_STRING"
echo "$USAGE_STRING"
exit 1
;;
* )
break ;;
esac
done
if ! { ${REMOVE_INTERMEDIATE} || ${BUILD_FOR_PYTHON2} || ${BUILD_FOR_PYTHON3}; }; then
fatal_error "Nothing selected to be done."
fi
pushd "${CARLA_PYTHONAPI_ROOT_FOLDER}" >/dev/null
# ==============================================================================
# -- Clean intermediate files --------------------------------------------------
# ==============================================================================
if ${REMOVE_INTERMEDIATE} ; then
log "Cleaning intermediate files and folders."
rm -Rf build dist carla.egg-info source/carla.egg-info
find source -name "*.so" -delete
find source -name "__pycache__" -type d -exec rm -r "{}" \;
fi
# ==============================================================================
# -- Build API -----------------------------------------------------------------
# ==============================================================================
if ${BUILD_FOR_PYTHON2} ; then
log "Building Python API for Python 2."
/usr/bin/env python2 setup.py bdist_egg
fi
if ${BUILD_FOR_PYTHON3} ; then
log "Building Python API for Python 3."
/usr/bin/env python3 setup.py bdist_egg
fi
# ==============================================================================
# -- ...and we are done --------------------------------------------------------
# ==============================================================================
popd >/dev/null
log "Success!"

131
Util/BuildTools/Check.sh Executable file
View File

@ -0,0 +1,131 @@
#! /bin/bash
source $(dirname "$0")/Environment.sh
# ==============================================================================
# -- Parse arguments -----------------------------------------------------------
# ==============================================================================
DOC_STRING="Run unit tests."
USAGE_STRING=$(cat <<- END
Usage: $0 [-h|--help] [--gdb] [--gtest_args=ARGS]
Then either ran all the tests
[--all]
Or choose one or more of the following
[--libcarla-release] [--libcarla-debug]
[--python-api-2] [--python-api-3]
[--benchmark]
END
)
GDB=
GTEST_ARGS=
LIBCARLA_RELEASE=false
LIBCARLA_DEBUG=false
PYTHON_API_2=false
PYTHON_API_3=false
OPTS=`getopt -o h --long help,gdb,gtest_args:,all,libcarla-release,libcarla-debug,python-api-2,python-api-3,benchmark -n 'parse-options' -- "$@"`
if [ $? != 0 ] ; then echo "$USAGE_STRING" ; exit 2 ; fi
eval set -- "$OPTS"
while true; do
case "$1" in
--gdb )
GDB="gdb --args";
shift ;;
--gtest_args )
GTEST_ARGS="$2";
shift ;;
--all )
LIBCARLA_RELEASE=true;
LIBCARLA_DEBUG=true;
PYTHON_API_2=true;
PYTHON_API_3=true;
shift ;;
--libcarla-release )
LIBCARLA_RELEASE=true;
shift ;;
--libcarla-debug )
LIBCARLA_DEBUG=true;
shift ;;
--python-api-2 )
PYTHON_API_2=true;
shift ;;
--python-api-3 )
PYTHON_API_3=true;
shift ;;
--benchmark )
LIBCARLA_RELEASE=true;
GTEST_ARGS="--gtest_filter=benchmark*";
shift ;;
-h | --help )
echo "$DOC_STRING"
echo -e "$USAGE_STRING"
exit 1
;;
* )
break ;;
esac
done
if ! { ${LIBCARLA_RELEASE} || ${LIBCARLA_DEBUG} || ${PYTHON_API_2} || ${PYTHON_API_3}; }; then
fatal_error "Nothing selected to be done."
fi
# ==============================================================================
# -- Run LibCarla tests --------------------------------------------------------
# ==============================================================================
if ${LIBCARLA_DEBUG} ; then
log "Running LibCarla unit tests debug."
LD_LIBRARY_PATH=${LIBCARLA_INSTALL_SERVER_FOLDER}/lib ${GDB} ${LIBCARLA_INSTALL_SERVER_FOLDER}/test/libcarla_test_debug ${GTEST_ARGS}
fi
if ${LIBCARLA_RELEASE} ; then
log "Running LibCarla unit tests release."
LD_LIBRARY_PATH=${LIBCARLA_INSTALL_SERVER_FOLDER}/lib ${GDB} ${LIBCARLA_INSTALL_SERVER_FOLDER}/test/libcarla_test_release ${GTEST_ARGS}
fi
# ==============================================================================
# -- Run Python API tests ------------------------------------------------------
# ==============================================================================
pushd "${CARLA_PYTHONAPI_ROOT_FOLDER}/test" >/dev/null
if ${PYTHON_API_2} ; then
log "Running Python API for Python 2 unit tests."
/usr/bin/env python2 -m nose2
fi
if ${PYTHON_API_3} ; then
log "Running Python API for Python 3 unit tests."
/usr/bin/env python3 -m nose2
fi
popd >/dev/null
# ==============================================================================
# -- ...and we are done --------------------------------------------------------
# ==============================================================================
log "Success!"

View File

@ -0,0 +1,47 @@
#! /bin/bash
# Sets the environment for other shell scripts.
set -e
CURDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )"
source $(dirname "$0")/Vars.mk
unset CURDIR
if [ -n "${CARLA_BUILD_NO_COLOR}" ]; then
function log {
echo "`basename "$0"`: $1"
}
function fatal_error {
echo -e >&2 "`basename "$0"`: ERROR: $1"
exit 2
}
else
function log {
echo -e "\033[1;35m`basename "$0"`: $1\033[0m"
}
function fatal_error {
echo -e >&2 "\033[0;31m`basename "$0"`: ERROR: $1\033[0m"
exit 2
}
fi
function get_carla_version {
git describe --tags --dirty --always
}
function copy_if_changed {
mkdir -p $(dirname $2)
rsync -cI --out-format="%n" $1 $2
}
function move_if_changed {
copy_if_changed $1 $2
rm -f $1
}

57
Util/BuildTools/Linux.mk Normal file
View File

@ -0,0 +1,57 @@
ARGS=--all
default: help
help:
@less ${CARLA_BUILD_TOOLS_FOLDER}/Linux.mk.help
launch: LibCarla
@${CARLA_BUILD_TOOLS_FOLDER}/BuildCarlaUE4.sh --build --launch
launch-only:
@${CARLA_BUILD_TOOLS_FOLDER}/BuildCarlaUE4.sh --launch
package: CarlaUE4Editor PythonAPI
@${CARLA_BUILD_TOOLS_FOLDER}/Package.sh
docs:
@doxygen
@echo "Documentation index at ./Doxygen/html/index.html"
clean:
@${CARLA_BUILD_TOOLS_FOLDER}/BuildCarlaUE4.sh --clean
@${CARLA_BUILD_TOOLS_FOLDER}/BuildPythonAPI.sh --clean
@${CARLA_BUILD_TOOLS_FOLDER}/BuildLibCarla.sh --clean
rebuild: setup
@${CARLA_BUILD_TOOLS_FOLDER}/BuildLibCarla.sh --rebuild
@${CARLA_BUILD_TOOLS_FOLDER}/BuildPythonAPI.sh --rebuild
@${CARLA_BUILD_TOOLS_FOLDER}/BuildCarlaUE4.sh --rebuild
hard-clean: clean
@rm -Rf ${CARLA_BUILD_FOLDER}
@${CARLA_BUILD_TOOLS_FOLDER}/BuildCarlaUE4.sh --hard-clean
check: PythonAPI
@${CARLA_BUILD_TOOLS_FOLDER}/Check.sh $(ARGS)
benchmark: LibCarla
@${CARLA_BUILD_TOOLS_FOLDER}/Check.sh --benchmark
@cat profiler.csv
CarlaUE4Editor: LibCarla
@${CARLA_BUILD_TOOLS_FOLDER}/BuildCarlaUE4.sh --build
.PHONY: PythonAPI
PythonAPI: LibCarla
@${CARLA_BUILD_TOOLS_FOLDER}/BuildPythonAPI.sh --py2 --py3
.PHONY: LibCarla
LibCarla: setup
@${CARLA_BUILD_TOOLS_FOLDER}/BuildLibCarla.sh --server --client
setup:
@${CARLA_BUILD_TOOLS_FOLDER}/Setup.sh
pretty:
@${CARLA_BUILD_TOOLS_FOLDER}/Prettify.sh $(ARGS)

View File

@ -0,0 +1,77 @@
Welcome to CARLA Simulator!
===========================
This Makefile will help you building the different CARLA utilities.
Use the following commands:
help:
Display this help message.
launch:
Compile CarlaUE4 project and launch it in Unreal Engine's Editor.
launch-only:
Launch CarlaUE4 project in Unreal Engine's Editor, but skip building
step (assume the project is already built).
package:
Makes a packaged version of CARLA ready for distribution.
docs:
Build CARLA Doxygen documentation.
clean:
Remove intermediate build files.
rebuild:
Remove intermediate build files and rebuild the whole project.
hard-clean:
Remove intermediate build files and dependencies, and force a
recompilation of Unreal Engine's pre-compiled headers. Useful for
fixing "version.h has been modified since the precompiled header"
errors. Beware, recompilation takes a long time!
There are also some lower level commands for building individual modules helpful
for developers:
check:
Run unit test suites for LibCarla and PythonAPI.
benchmark:
Run the benchmark tests for LibCarla.
CarlaUE4Editor:
Build CarlaUE4 project, but do not launch the editor.
PythonAPI:
Build and package the Python API module for Python 2 and 3.
LibCarla:
Build the LibCarla library, both "Server" and "Client" configurations.
setup:
Run the setup step only.
pretty:
Prettify code files. Run uncrustify on C++ files or AutoPEP8 on Python
files. To prettify a single file, use: make pretty ARGS=-f/path/to/file.

View File

@ -1,20 +1,15 @@
#! /bin/bash #! /bin/bash
################################################################################ source $(dirname "$0")/Environment.sh
# Packages a CARLA build.
################################################################################
set -e
DOC_STRING="Makes a packaged version of CARLA for distribution.
Please make sure to run Rebuild.sh before!"
USAGE_STRING="Usage: $0 [-h|--help] [--no-packaging] [--no-zip] [--clean-intermediate]"
# ============================================================================== # ==============================================================================
# -- Parse arguments ----------------------------------------------------------- # -- Parse arguments -----------------------------------------------------------
# ============================================================================== # ==============================================================================
DOC_STRING="Makes a packaged version of CARLA for distribution."
USAGE_STRING="Usage: $0 [-h|--help] [--no-packaging] [--no-zip] [--clean-intermediate]"
DO_PACKAGE=true DO_PACKAGE=true
DO_COPY_FILES=true DO_COPY_FILES=true
DO_TARBALL=true DO_TARBALL=true
@ -47,39 +42,21 @@ while true; do
esac esac
done done
# ==============================================================================
# -- Set up environment --------------------------------------------------------
# ==============================================================================
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
pushd "$SCRIPT_DIR" >/dev/null
REPOSITORY_TAG=`git describe --tags --dirty --always`
echo "Packaging version '$REPOSITORY_TAG'."
UNREAL_PROJECT_FOLDER=${PWD}/Unreal/CarlaUE4
DIST_FOLDER=${PWD}/Dist
BUILD_FOLDER=${DIST_FOLDER}/${REPOSITORY_TAG}
function fatal_error {
echo -e "\033[0;31mERROR: $1\033[0m"
exit 1
}
function log {
echo -e "\033[0;33m$1\033[0m"
}
# ============================================================================== # ==============================================================================
# -- Package project ----------------------------------------------------------- # -- Package project -----------------------------------------------------------
# ============================================================================== # ==============================================================================
REPOSITORY_TAG=$(get_carla_version)
BUILD_FOLDER=${CARLA_DIST_FOLDER}/${REPOSITORY_TAG}
log "Packaging version '$REPOSITORY_TAG'."
if $DO_PACKAGE ; then if $DO_PACKAGE ; then
pushd "$UNREAL_PROJECT_FOLDER" >/dev/null pushd "${CARLAUE4_ROOT_FOLDER}" >/dev/null
log "Packaging the project..." log "Packaging the project."
if [ ! -d "${UE4_ROOT}" ]; then if [ ! -d "${UE4_ROOT}" ]; then
fatal_error "UE4_ROOT is not defined, or points to a non-existant directory, please set this environment variable." fatal_error "UE4_ROOT is not defined, or points to a non-existant directory, please set this environment variable."
@ -105,34 +82,25 @@ if [[ ! -d ${BUILD_FOLDER}/LinuxNoEditor ]] ; then
fi fi
# ============================================================================== # ==============================================================================
# -- Copy files (Python server, README, etc) ----------------------------------- # -- Copy files (Python API, README, etc) --------------------------------------
# ============================================================================== # ==============================================================================
if $DO_COPY_FILES ; then if $DO_COPY_FILES ; then
DESTINATION=${BUILD_FOLDER}/LinuxNoEditor DESTINATION=${BUILD_FOLDER}/LinuxNoEditor
log "Copying extra files..." log "Adding extra files to package."
cp -v ./LICENSE ${DESTINATION}/LICENSE pushd ${CARLA_ROOT_FOLDER} >/dev/null
cp -v ./CHANGELOG.md ${DESTINATION}/CHANGELOG
cp -v ./Docs/release_readme.md ${DESTINATION}/README
cp -v ./Docs/Example.CarlaSettings.ini ${DESTINATION}/Example.CarlaSettings.ini
cp -v ./Util/Docker/Release.Dockerfile ${DESTINATION}/Dockerfile
rsync -vhr --delete --delete-excluded \ copy_if_changed "./LICENSE" "${DESTINATION}/LICENSE"
--exclude "*.egg-info" \ copy_if_changed "./CHANGELOG.md" "${DESTINATION}/CHANGELOG"
--exclude "*.log" \ copy_if_changed "./Docs/release_readme.md" "${DESTINATION}/README"
--exclude "*.pyc" \ copy_if_changed "./Docs/Example.CarlaSettings.ini" "${DESTINATION}/Example.CarlaSettings.ini"
--exclude ".*" \ copy_if_changed "./Util/Docker/Release.Dockerfile" "${DESTINATION}/Dockerfile"
--exclude ".tags*" \ copy_if_changed "./PythonAPI/dist/*.egg" "${DESTINATION}/PythonAPI"
--exclude "__pycache__" \
--exclude "_benchmarks_results*" \
--exclude "_images*" \
--exclude "_out*" \
PythonClient/ ${DESTINATION}/PythonClient
echo popd >/dev/null
fi fi
@ -142,12 +110,12 @@ fi
if $DO_TARBALL ; then if $DO_TARBALL ; then
DESTINATION=${DIST_FOLDER}/CARLA_${REPOSITORY_TAG}.tar.gz DESTINATION=${CARLA_DIST_FOLDER}/CARLA_${REPOSITORY_TAG}.tar.gz
SOURCE=${BUILD_FOLDER}/LinuxNoEditor SOURCE=${BUILD_FOLDER}/LinuxNoEditor
pushd "$SOURCE" >/dev/null pushd "${SOURCE}" >/dev/null
log "Packaging build..." log "Packaging build."
rm -f ./Manifest_NonUFSFiles_Linux.txt rm -f ./Manifest_NonUFSFiles_Linux.txt
rm -Rf ./CarlaUE4/Saved rm -Rf ./CarlaUE4/Saved
@ -165,7 +133,7 @@ fi
if $DO_CLEAN_INTERMEDIATE ; then if $DO_CLEAN_INTERMEDIATE ; then
log "Removing intermediate build..." log "Removing intermediate build."
rm -Rf ${BUILD_FOLDER} rm -Rf ${BUILD_FOLDER}
@ -176,16 +144,10 @@ fi
# ============================================================================== # ==============================================================================
if $DO_TARBALL ; then if $DO_TARBALL ; then
FINAL_PACKAGE=Dist/CARLA_${REPOSITORY_TAG}.tar.gz FINAL_PACKAGE=${CARLA_DIST_FOLDER}/CARLA_${REPOSITORY_TAG}.tar.gz
else else
FINAL_PACKAGE=Dist/${REPOSITORY_TAG} FINAL_PACKAGE=${BUILD_FOLDER}
fi fi
echo log "Packaged version created at ${FINAL_PACKAGE}"
echo "Packaged version created at ${FINAL_PACKAGE}" log "Success!"
echo
echo "****************"
echo "*** Success! ***"
echo "****************"
popd >/dev/null

137
Util/BuildTools/Prettify.sh Executable file
View File

@ -0,0 +1,137 @@
#! /bin/bash
# ==============================================================================
# -- Set up environment --------------------------------------------------------
# ==============================================================================
source $(dirname "$0")/Environment.sh
# ==============================================================================
# -- Parse arguments -----------------------------------------------------------
# ==============================================================================
DOC_STRING="Prettify code files."
USAGE_STRING="Usage: $0 [-h|--help] [--all] [-f path|--file=path]"
PRETTIFY_ALL=false
PRETTIFY_FILE=false
OPTS=`getopt -o hf: --long help,all,file: -n 'parse-options' -- "$@"`
if [ $? != 0 ] ; then echo "$USAGE_STRING" ; exit 2 ; fi
eval set -- "$OPTS"
while true; do
case "$1" in
--all )
PRETTIFY_ALL=true;
shift ;;
-f | --file )
PRETTIFY_FILE="$2";
shift ;;
-h | --help )
echo "$DOC_STRING"
echo "$USAGE_STRING"
exit 1
;;
* )
break ;;
esac
done
if ! { ${PRETTIFY_ALL} || [ -n "${PRETTIFY_FILE}" ]; } ; then
fatal_error "Nothing selected to be done."
fi
if ${PRETTIFY_ALL} ; then
PRETTIFY_FILE=false
elif [[ ! -f ${PRETTIFY_FILE} ]] ; then
pwd
fatal_error "\"${PRETTIFY_FILE}\" no such file."
fi
# ==============================================================================
# -- Get latest version of uncrustify ------------------------------------------
# ==============================================================================
mkdir -p ${CARLA_BUILD_FOLDER}
pushd ${CARLA_BUILD_FOLDER} >/dev/null
UNCRUSTIFY_BASENAME=uncrustify-0.67
UNCRUSTIFY=${PWD}/${UNCRUSTIFY_BASENAME}-install/bin/uncrustify
if [[ -d "${UNCRUSTIFY_BASENAME}-install" ]] ; then
log "${UNCRUSTIFY_BASENAME} already installed."
else
rm -Rf ${UNCRUSTIFY_BASENAME}-source ${UNCRUSTIFY_BASENAME}-build
log "Retrieving Uncrustify."
git clone --depth=1 -b uncrustify-0.67 https://github.com/uncrustify/uncrustify.git ${UNCRUSTIFY_BASENAME}-source
log "Building Uncrustify."
mkdir -p ${UNCRUSTIFY_BASENAME}-build
pushd ${UNCRUSTIFY_BASENAME}-build >/dev/null
cmake -G "Ninja" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="../${UNCRUSTIFY_BASENAME}-install" \
../${UNCRUSTIFY_BASENAME}-source
ninja
ninja install
popd >/dev/null
rm -Rf ${UNCRUSTIFY_BASENAME}-source ${UNCRUSTIFY_BASENAME}-build
fi
command -v ${UNCRUSTIFY} >/dev/null 2>&1 || {
fatal_error "Failed to install Uncrustify!";
}
popd >/dev/null
command -v autopep8 >/dev/null 2>&1 || {
log "Installing autopep8 for this user."
pip3 install --user autopep8
}
# ==============================================================================
# -- Run uncrustify and/or autopep8 --------------------------------------------
# ==============================================================================
UNCRUSTIFY_CONFIG=${CARLA_BUILD_TOOLS_FOLDER}/uncrustify.cfg
UNCRUSTIFY_COMMAND="${UNCRUSTIFY} -c ${UNCRUSTIFY_CONFIG} --no-backup --replace"
AUTOPEP8_COMMAND="autopep8 --jobs 0 --in-place -a"
if ${PRETTIFY_ALL} ; then
find ${CARLA_ROOT_FOLDER} -iregex '.*\.\(py\)$' -exec ${AUTOPEP8_COMMAND} {} +
# find ${LIBCARLA_ROOT_FOLDER} -iregex '.*\.\(h\|cpp\)$' -exec ${UNCRUSTIFY_COMMAND} {} \;
elif [[ -f ${PRETTIFY_FILE} ]] ; then
if [[ ${PRETTIFY_FILE} == *.py ]] ; then
log "autopep8 ${PRETTIFY_FILE}"
${AUTOPEP8_COMMAND} ${PRETTIFY_FILE}
else
log "uncrustify ${PRETTIFY_FILE}"
${UNCRUSTIFY_COMMAND} ${PRETTIFY_FILE}
fi
fi
# ==============================================================================
# -- ...and we are done --------------------------------------------------------
# ==============================================================================
log "Success!"

267
Util/BuildTools/Setup.sh Executable file
View File

@ -0,0 +1,267 @@
#! /bin/bash
# ==============================================================================
# -- Set up environment --------------------------------------------------------
# ==============================================================================
command -v /usr/bin/clang++-5.0 >/dev/null 2>&1 || {
echo >&2 "clang 5.0 is required, but it's not installed.";
echo >&2 "make sure you build Unreal Engine with clang 5.0 too.";
exit 1;
}
export CC=/usr/bin/clang-5.0
export CXX=/usr/bin/clang++-5.0
source $(dirname "$0")/Environment.sh
mkdir -p ${CARLA_BUILD_FOLDER}
pushd ${CARLA_BUILD_FOLDER} >/dev/null
# ==============================================================================
# -- Get and compile libc++ ----------------------------------------------------
# ==============================================================================
LLVM_BASENAME=llvm-5.0
LLVM_INCLUDE=${PWD}/${LLVM_BASENAME}-install/include/c++/v1
LLVM_LIBPATH=${PWD}/${LLVM_BASENAME}-install/lib
if [[ -d "${LLVM_BASENAME}-install" ]] ; then
log "${LLVM_BASENAME} already installed."
else
rm -Rf ${LLVM_BASENAME}-source ${LLVM_BASENAME}-build
log "Retrieving libc++."
git clone --depth=1 -b release_50 https://github.com/llvm-mirror/llvm.git ${LLVM_BASENAME}-source
git clone --depth=1 -b release_50 https://github.com/llvm-mirror/libcxx.git ${LLVM_BASENAME}-source/projects/libcxx
git clone --depth=1 -b release_50 https://github.com/llvm-mirror/libcxxabi.git ${LLVM_BASENAME}-source/projects/libcxxabi
log "Compiling libc++."
mkdir -p ${LLVM_BASENAME}-build
pushd ${LLVM_BASENAME}-build >/dev/null
cmake -G "Ninja" \
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF -DLIBCXX_INSTALL_EXPERIMENTAL_LIBRARY=OFF \
-DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="../${LLVM_BASENAME}-install" \
../${LLVM_BASENAME}-source
ninja cxx
ninja install-libcxx
ninja install-libcxxabi
popd >/dev/null
# Workaround, it seems LLVM 5.0 does not install these files.
cp -v ${LLVM_BASENAME}-build/include/c++/v1/cxxabi.h ${LLVM_INCLUDE}
cp -v ${LLVM_BASENAME}-build/include/c++/v1/__cxxabi_config.h ${LLVM_INCLUDE}
rm -Rf ${LLVM_BASENAME}-source ${LLVM_BASENAME}-build
fi
unset LLVM_BASENAME
# ==============================================================================
# -- Get boost includes --------------------------------------------------------
# ==============================================================================
BOOST_BASENAME=boost-1.67.0
BOOST_INCLUDE=${PWD}/${BOOST_BASENAME}-install/include
if [[ -d "${BOOST_BASENAME}-install" ]] ; then
log "${BOOST_BASENAME} already installed."
else
log "Retrieving boost."
wget https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.tar.gz
log "Extracting boost."
tar -xzf boost_1_67_0.tar.gz
rm boost_1_67_0.tar.gz
mkdir -p ${BOOST_BASENAME}-install/include
mv boost_1_67_0/boost ${BOOST_BASENAME}-install/include/
rm -Rf boost_1_67_0
fi
unset BOOST_BASENAME
# ==============================================================================
# -- Get rpclib and compile it with libc++ and libstdc++ -----------------------
# ==============================================================================
RPCLIB_BASENAME=rpclib-2.2.1
RPCLIB_LIBCXX_INCLUDE=${PWD}/${RPCLIB_BASENAME}-libcxx-install/include
RPCLIB_LIBCXX_LIBPATH=${PWD}/${RPCLIB_BASENAME}-libcxx-install/lib
RPCLIB_LIBSTDCXX_INCLUDE=${PWD}/${RPCLIB_BASENAME}-libstdcxx-install/include
RPCLIB_LIBSTDCXX_LIBPATH=${PWD}/${RPCLIB_BASENAME}-libstdcxx-install/lib
if [[ -d "${RPCLIB_BASENAME}-libcxx-install" && -d "${RPCLIB_BASENAME}-libstdcxx-install" ]] ; then
log "${RPCLIB_BASENAME} already installed."
else
rm -Rf \
${RPCLIB_BASENAME}-source \
${RPCLIB_BASENAME}-libcxx-build ${RPCLIB_BASENAME}-libstdcxx-build \
${RPCLIB_BASENAME}-libcxx-install ${RPCLIB_BASENAME}-libstdcxx-install
log "Retrieving rpclib."
git clone --depth=1 -b v2.2.1 https://github.com/rpclib/rpclib.git ${RPCLIB_BASENAME}-source
log "Building rpclib with libc++."
mkdir -p ${RPCLIB_BASENAME}-libcxx-build
pushd ${RPCLIB_BASENAME}-libcxx-build >/dev/null
cmake -G "Ninja" \
-DCMAKE_CXX_FLAGS="-fPIC -std=c++17 -stdlib=libc++ -I${LLVM_INCLUDE} -Wl,-L${LLVM_LIBPATH}" \
-DCMAKE_INSTALL_PREFIX="../${RPCLIB_BASENAME}-libcxx-install" \
../${RPCLIB_BASENAME}-source
ninja
ninja install
popd >/dev/null
log "Building rpclib with libstdc++."
mkdir -p ${RPCLIB_BASENAME}-libstdcxx-build
pushd ${RPCLIB_BASENAME}-libstdcxx-build >/dev/null
cmake -G "Ninja" \
-DCMAKE_CXX_FLAGS="-fPIC -std=c++17" \
-DCMAKE_INSTALL_PREFIX="../${RPCLIB_BASENAME}-libstdcxx-install" \
../${RPCLIB_BASENAME}-source
ninja
ninja install
popd >/dev/null
rm -Rf ${RPCLIB_BASENAME}-source ${RPCLIB_BASENAME}-libcxx-build ${RPCLIB_BASENAME}-libstdcxx-build
fi
unset RPCLIB_BASENAME
# ==============================================================================
# -- Get GTest and compile it with libc++ --------------------------------------
# ==============================================================================
GTEST_BASENAME=googletest-1.8.0
GTEST_INCLUDE=${PWD}/${GTEST_BASENAME}-install/include
GTEST_LIBPATH=${PWD}/${GTEST_BASENAME}-install/lib
if [[ -d "${GTEST_BASENAME}-install" ]] ; then
log "${GTEST_BASENAME} already installed."
else
rm -Rf ${GTEST_BASENAME}-source ${GTEST_BASENAME}-build
log "Retrieving Google Test."
git clone --depth=1 -b release-1.8.0 https://github.com/google/googletest.git ${GTEST_BASENAME}-source
log "Building Google Test."
mkdir -p ${GTEST_BASENAME}-build
pushd ${GTEST_BASENAME}-build >/dev/null
cmake -G "Ninja" \
-DCMAKE_CXX_FLAGS="-std=c++17 -stdlib=libc++ -I${LLVM_INCLUDE} -Wl,-L${LLVM_LIBPATH}" \
-DCMAKE_INSTALL_PREFIX="../${GTEST_BASENAME}-install" \
../${GTEST_BASENAME}-source
ninja
ninja install
popd >/dev/null
rm -Rf ${GTEST_BASENAME}-source ${GTEST_BASENAME}-build
fi
# ==============================================================================
# -- Generate CMake toolchains and config --------------------------------------
# ==============================================================================
log "Generating CMake configuration files."
# -- LIBSTDCPP_TOOLCHAIN_FILE --------------------------------------------------
cat >${LIBSTDCPP_TOOLCHAIN_FILE}.gen <<EOL
# Automatically generated by `basename "$0"`
set(CMAKE_C_COMPILER ${CC})
set(CMAKE_CXX_COMPILER ${CXX})
set(CMAKE_CXX_FLAGS "\${CMAKE_CXX_FLAGS} -std=c++17 -pthread -fPIC" CACHE STRING "" FORCE)
# set(CMAKE_CXX_FLAGS "\${CMAKE_CXX_FLAGS} -Werror -Wall -Wextra" CACHE STRING "" FORCE)
EOL
# -- LIBCPP_TOOLCHAIN_FILE -----------------------------------------------------
# We can reuse the previous toolchain.
cp ${LIBSTDCPP_TOOLCHAIN_FILE}.gen ${LIBCPP_TOOLCHAIN_FILE}.gen
cat >>${LIBCPP_TOOLCHAIN_FILE}.gen <<EOL
set(CMAKE_CXX_FLAGS "\${CMAKE_CXX_FLAGS} -stdlib=libc++" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "\${CMAKE_CXX_FLAGS} -I${LLVM_INCLUDE}" CACHE STRING "" FORCE)
set(CMAKE_CXX_LINK_FLAGS "\${CMAKE_CXX_LINK_FLAGS} -L${LLVM_LIBPATH}" CACHE STRING "" FORCE)
set(CMAKE_CXX_LINK_FLAGS "\${CMAKE_CXX_LINK_FLAGS} -lc++ -lc++abi" CACHE STRING "" FORCE)
EOL
# -- CMAKE_CONFIG_FILE ---------------------------------------------------------
cat >${CMAKE_CONFIG_FILE}.gen <<EOL
# Automatically generated by `basename "$0"`
set(CARLA_VERSION $(get_carla_version))
add_definitions(-DBOOST_COROUTINES_NO_DEPRECATION_WARNING)
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
set(BOOST_INCLUDE_PATH "${BOOST_INCLUDE}")
if (CMAKE_BUILD_TYPE STREQUAL "Server")
# Here libraries linking libc++.
set(LLVM_INCLUDE_PATH "${LLVM_INCLUDE}")
set(LLVM_LIB_PATH "${LLVM_LIBPATH}")
set(GTEST_INCLUDE_PATH "${GTEST_INCLUDE}")
set(GTEST_LIB_PATH "${GTEST_LIBPATH}")
set(RPCLIB_INCLUDE_PATH "${RPCLIB_LIBCXX_INCLUDE}")
set(RPCLIB_LIB_PATH "${RPCLIB_LIBCXX_LIBPATH}")
elseif (CMAKE_BUILD_TYPE STREQUAL "Client")
# Here libraries linking libstdc++.
set(RPCLIB_INCLUDE_PATH "${RPCLIB_LIBSTDCXX_INCLUDE}")
set(RPCLIB_LIB_PATH "${RPCLIB_LIBSTDCXX_LIBPATH}")
endif ()
EOL
# -- Move files ----------------------------------------------------------------
move_if_changed "${LIBSTDCPP_TOOLCHAIN_FILE}.gen" "${LIBSTDCPP_TOOLCHAIN_FILE}"
move_if_changed "${LIBCPP_TOOLCHAIN_FILE}.gen" "${LIBCPP_TOOLCHAIN_FILE}"
move_if_changed "${CMAKE_CONFIG_FILE}.gen" "${CMAKE_CONFIG_FILE}"
# ==============================================================================
# -- ...and we are done --------------------------------------------------------
# ==============================================================================
popd >/dev/null
log "Success!"

22
Util/BuildTools/Vars.mk Normal file
View File

@ -0,0 +1,22 @@
# Here CURDIR is assumed to be the root folder of the project.
CARLA_ROOT_FOLDER=${CURDIR}
CARLA_BUILD_FOLDER=${CURDIR}/Build
CARLA_DIST_FOLDER=${CURDIR}/Dist
CARLA_BUILD_TOOLS_FOLDER=${CURDIR}/Util/BuildTools
CARLAUE4_ROOT_FOLDER=${CURDIR}/Unreal/CarlaUE4
CARLAUE4_PLUGIN_ROOT_FOLDER=${CURDIR}/Unreal/CarlaUE4/Plugins/Carla
CARLA_PYTHONAPI_ROOT_FOLDER=${CURDIR}/PythonAPI
LIBCARLA_ROOT_FOLDER=${CURDIR}/LibCarla
LIBCARLA_BUILD_SERVER_FOLDER=${CARLA_BUILD_FOLDER}/libcarla-server-build
LIBCARLA_BUILD_CLIENT_FOLDER=${CARLA_BUILD_FOLDER}/libcarla-client-build
LIBCARLA_INSTALL_SERVER_FOLDER=${CARLAUE4_PLUGIN_ROOT_FOLDER}/CarlaDependencies
LIBCARLA_INSTALL_CLIENT_FOLDER=${CARLA_PYTHONAPI_ROOT_FOLDER}/dependencies
CARLAUE4_PLUGIN_DEPS_FOLDER=${CARLAUE4_PLUGIN_ROOT_FOLDER}/CarlaDependencies
LIBSTDCPP_TOOLCHAIN_FILE=${CARLA_BUILD_FOLDER}/LibStdCppToolChain.cmake
LIBCPP_TOOLCHAIN_FILE=${CARLA_BUILD_FOLDER}/LibCppToolChain.cmake
CMAKE_CONFIG_FILE=${CARLA_BUILD_FOLDER}/CMakeLists.txt.in

View File

@ -0,0 +1,2 @@
default:
@echo "Not implemented!"

File diff suppressed because it is too large Load Diff

138
Util/CARLA.sublime-project Normal file
View File

@ -0,0 +1,138 @@
{
"folders":
[
{
"path": "..",
"file_exclude_patterns":
[
"*.VC.db",
"*.VC.opendb",
"*.gdb_history",
"*.kdev4",
"*.pri",
"*.pro",
"*.py[cod]",
"*.sln",
"*.stackdump",
"*.sublime-workspace",
"*.uasset",
"*.umap",
"*.workspace",
"*CodeCompletionFolders.txt",
"*CodeLitePreProcessor.txt",
".tags*",
"core"
],
"folder_exclude_patterns":
[
".clang",
".codelite",
".kdev4",
".vs",
".vscode",
"Binaries",
"DerivedDataCache",
"Dist",
"Doxygen",
"Intermediate",
"PythonAPI/build",
"PythonAPI/dependencies",
"PythonAPI/dist",
"Saved",
"Unreal/CarlaUE4/Content*",
"Unreal/CarlaUE4/Plugins/Carla/CarlaDependencies",
"__pycache__",
"_site"
],
}
],
"settings":
{
"ensure_newline_at_eof_on_save": true,
"tab_size": 2,
"translate_tabs_to_spaces": true,
"trim_trailing_white_space_on_save": true
},
"build_systems":
[
{
"name": "CARLA - make CarlaUE4Editor",
"working_dir": "${project_path}/..",
"file_regex": "(Unreal\\/CarlaUE4\\/[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "CARLA_BUILD_NO_COLOR=true make CarlaUE4Editor"
}
},
{
"name": "CARLA - make LibCarla",
"working_dir": "${project_path}/..",
"file_regex": "^../../([^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "CARLA_BUILD_NO_COLOR=true make LibCarla"
}
},
{
"name": "CARLA - make PythonAPI",
"working_dir": "${project_path}/..",
"file_regex": "^../../([^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "CARLA_BUILD_NO_COLOR=true make PythonAPI"
}
},
{
"name": "CARLA - make check",
"working_dir": "${project_path}/..",
"file_regex": "^../../([^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "CARLA_BUILD_NO_COLOR=true make check"
}
},
{
"name": "CARLA - make check LibCarla",
"working_dir": "${project_path}/..",
"file_regex": "^../../([^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "CARLA_BUILD_NO_COLOR=true make check ARGS=\"--carlalib-debug\""
}
},
{
"name": "CARLA - make check LibCarla (launch GDB)",
"working_dir": "${project_path}/..",
"file_regex": "^../../([^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "gnome-terminal --maximize -e 'make check ARGS=\"--gdb --carlalib-debug\"'"
}
},
{
"name": "CARLA - make clean",
"working_dir": "${project_path}/..",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "CARLA_BUILD_NO_COLOR=true make clean"
}
},
{
"name": "CARLA - Prettify this file",
"working_dir": "${project_path}/..",
"file_regex": "^([^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"linux":
{
"shell_cmd": "CARLA_BUILD_NO_COLOR=true make pretty ARGS=-f${file}"
}
}
]
}

View File

@ -35,6 +35,7 @@ pages:
- 'How to add assets': 'how_to_add_assets.md' - 'How to add assets': 'how_to_add_assets.md'
- 'CARLA design': 'carla_design.md' - 'CARLA design': 'carla_design.md'
- 'CarlaServer documentation': 'carla_server.md' - 'CarlaServer documentation': 'carla_server.md'
- 'Build system': 'build_system.md'
- Appendix: - Appendix:
- 'Driving Benchmark Sample Results Town01': 'benchmark_basic_results_town01.md' - 'Driving Benchmark Sample Results Town01': 'benchmark_basic_results_town01.md'
- 'Driving Benchmark Sample Results Town02': 'benchmark_basic_results_town02.md' - 'Driving Benchmark Sample Results Town02': 'benchmark_basic_results_town02.md'