mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-05-23 17:47:36 +08:00
Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ad8f95cdcf | |||
| 34ca76b63c | |||
| cde7ffe7f9 | |||
| 9d98581675 | |||
| 68d8a7ce4c | |||
| 7cb36ce47d | |||
| c1069dcd2a | |||
| 2f56d44e6f | |||
| b4ad8bbaa0 | |||
| 11318ab861 | |||
| 035a829dc5 | |||
| a25d90777e | |||
| 254251f4a6 | |||
| b93eefcee7 | |||
| 5e602788d7 | |||
| b709b2bb29 | |||
| 5b209cf5f4 | |||
| 32fe48a02b | |||
| d94939b489 | |||
| bc96acb6b3 | |||
| 68b22f16cf | |||
| cc384d44c7 | |||
| 89cd709952 | |||
| 5db88fb2bc | |||
| 5e1e2c9e29 | |||
| ce85cffbee | |||
| f1a8606e74 | |||
| aec1fddc8a | |||
| b35ffa99bb | |||
| 6ac80069c2 |
@@ -0,0 +1,44 @@
|
||||
name: Build PX4 SITL AppImage
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
actions: write
|
||||
|
||||
jobs:
|
||||
build-appimage:
|
||||
name: "AppImage ${{ matrix.arch }}"
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- arch: amd64
|
||||
runner: x64
|
||||
- arch: arm64
|
||||
runner: arm64
|
||||
runs-on: [runs-on,"runner=4cpu-linux-${{ matrix.runner }}","image=ubuntu22-full-${{ matrix.runner }}","run-id=${{ github.run_id }}"]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: recursive
|
||||
|
||||
- name: Install Dependencies
|
||||
run: ./Tools/setup/ubuntu.sh
|
||||
|
||||
- name: Build PX4 SITL and AppImage
|
||||
env:
|
||||
# avoid FUSE by extracting the AppImage in‐place
|
||||
APPIMAGE_EXTRACT_AND_RUN: "1"
|
||||
run: |
|
||||
make appimage
|
||||
|
||||
- name: Upload AppImage artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: px4-sitl-appimage-${{ matrix.arch }}
|
||||
path: build/*.AppImage
|
||||
@@ -0,0 +1,189 @@
|
||||
name: SITL Container
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
- 'stable'
|
||||
- 'beta'
|
||||
- 'release/**'
|
||||
tags:
|
||||
- 'v*'
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
px4_version:
|
||||
description: 'Container tag (e.g. v1.16.0)'
|
||||
required: true
|
||||
type: string
|
||||
deploy_to_registry:
|
||||
description: 'Whether to push built images to the registry'
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
name: Set Tags and Variables
|
||||
permissions:
|
||||
contents: read
|
||||
runs-on: [runs-on,"runner=1cpu-linux-x64","image=ubuntu24-full-x64","run-id=${{ github.run_id }}",spot=false,extras=s3-cache]
|
||||
outputs:
|
||||
px4_version: ${{ steps.px4_version.outputs.px4_version }}
|
||||
meta_tags: ${{ steps.meta.outputs.tags }}
|
||||
meta_labels: ${{ steps.meta.outputs.labels }}
|
||||
steps:
|
||||
- uses: runs-on/action@v1
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-tags: true
|
||||
submodules: false
|
||||
fetch-depth: 0
|
||||
|
||||
# If manual dispatch, take the user‐provided input
|
||||
- name: Set PX4 Tag Version
|
||||
id: px4_version
|
||||
run: |
|
||||
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
||||
echo "px4_version=${{ github.event.inputs.px4_version }}" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "px4_version=$(git describe --tags --match 'v[0-9]*')" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: |
|
||||
ghcr.io/PX4/px4-sitl
|
||||
px4io/px4-sitl
|
||||
tags: |
|
||||
type=raw,enable=true,value=${{ steps.px4_version.outputs.px4_version }},priority=1000
|
||||
|
||||
build:
|
||||
name: Build (${{ matrix.arch }})
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
needs: setup
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- platform: linux/arm64
|
||||
arch: arm64
|
||||
runner: arm64
|
||||
- platform: linux/amd64
|
||||
arch: amd64
|
||||
runner: x64
|
||||
runs-on: [runs-on,"runner=8cpu-linux-${{ matrix.runner }}","image=ubuntu24-full-${{ matrix.runner }}","run-id=${{ github.run_id }}",spot=false,extras=s3-cache]
|
||||
steps:
|
||||
- uses: runs-on/action@v1
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-tags: true
|
||||
submodules: false
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install PX4 Dependencies
|
||||
run: ./Tools/setup/ubuntu.sh
|
||||
|
||||
- name: Build PX4 SITL
|
||||
run: make px4_sitl_default
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/') || (github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_to_registry) }}
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/') || (github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_to_registry) }}
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
driver: docker-container
|
||||
platforms: ${{ matrix.platform }}
|
||||
|
||||
- name: Build and Load Container Image
|
||||
uses: docker/build-push-action@v6
|
||||
id: docker
|
||||
with:
|
||||
context: .
|
||||
file: Tools/sitl-container/Dockerfile
|
||||
tags: |
|
||||
ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-${{ matrix.arch }}
|
||||
px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-${{ matrix.arch }}
|
||||
labels: ${{ needs.setup.outputs.meta_labels }}
|
||||
platforms: ${{ matrix.platform }}
|
||||
load: false
|
||||
push: ${{ startsWith(github.ref, 'refs/tags/') || (github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_to_registry) }}
|
||||
provenance: false
|
||||
cache-from: type=gha,version=1
|
||||
cache-to: type=gha,version=1,mode=max
|
||||
|
||||
deploy:
|
||||
name: Deploy To Registry
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
runs-on: [runs-on,"runner=8cpu-linux-x64","image=ubuntu24-full-x64","run-id=${{ github.run_id }}",spot=false,extras=s3-cache]
|
||||
needs: [build, setup]
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/') || (github.event_name == 'workflow_dispatch' && github.event.inputs.deploy_to_registry) }}
|
||||
steps:
|
||||
- uses: runs-on/action@v1
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-tags: true
|
||||
submodules: false
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Verify Images Exist Before Creating Manifest
|
||||
run: |
|
||||
docker manifest inspect px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 || echo "⚠️ Warning: No ARM64 image found!"
|
||||
docker manifest inspect px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64 || echo "⚠️ Warning: No AMD64 image found!"
|
||||
docker manifest inspect ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 || echo "⚠️ Warning: No ARM64 image found!"
|
||||
docker manifest inspect ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64 || echo "⚠️ Warning: No AMD64 image found!"
|
||||
|
||||
- name: Create and Push Multi-Arch Manifest for Docker Hub
|
||||
run: |
|
||||
docker manifest create px4io/px4-sitl:${{ needs.setup.outputs.px4_version }} \
|
||||
--amend px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 \
|
||||
--amend px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64
|
||||
|
||||
docker manifest annotate px4io/px4-sitl:${{ needs.setup.outputs.px4_version }} px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 --arch arm64
|
||||
docker manifest annotate px4io/px4-sitl:${{ needs.setup.outputs.px4_version }} px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64 --arch amd64
|
||||
|
||||
docker manifest push px4io/px4-sitl:${{ needs.setup.outputs.px4_version }}
|
||||
|
||||
- name: Create and Push Multi-Arch Manifest for GHCR
|
||||
run: |
|
||||
docker manifest create ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }} \
|
||||
--amend ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 \
|
||||
--amend ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64
|
||||
|
||||
docker manifest annotate ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }} ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-arm64 --arch arm64
|
||||
docker manifest annotate ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }} ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}-amd64 --arch amd64
|
||||
|
||||
docker manifest push ghcr.io/px4/px4-sitl:${{ needs.setup.outputs.px4_version }}
|
||||
@@ -264,6 +264,42 @@ px4fmu_firmware: \
|
||||
check_px4_fmu-v5x_default \
|
||||
sizes
|
||||
|
||||
# Create a one-file AppImage for PX4 SITL
|
||||
PX4_VERSION := $(shell git describe --tags --match "v[0-9]*" 2>/dev/null || echo "v0.0.0")
|
||||
.PHONY: AppImage
|
||||
appimage: build/px4_sitl_default/bin/px4 build/px4_sitl_default/romfs_files.tar
|
||||
|
||||
@$(MAKE) px4_sitl_default
|
||||
@$(RM) -rf build/px4.AppDir
|
||||
|
||||
@mkdir -p \
|
||||
build/px4.AppDir/usr/bin \
|
||||
build/px4.AppDir/usr/lib \
|
||||
build/px4.AppDir/usr/share/px4/romfs/etc \
|
||||
build/px4.AppDir/usr/share/px4/romfs/bin
|
||||
@cp build/px4_sitl_default/bin/px4 build/px4.AppDir/usr/bin/
|
||||
@echo "${PX4_VERSION}" > build/px4.AppDir/version.txt
|
||||
|
||||
# bundle required Gazebo transport libs (arch‐agnostic lookup)
|
||||
echo "→ Gathering shared-lib dependencies for px4..."
|
||||
@ldd build/px4_sitl_default/bin/px4 \
|
||||
| awk '/=>/ { print $$3 }' \
|
||||
| grep -E '^/' \
|
||||
| grep -Ev '/lib(c|gcc|stdc\+\+)\.so' \
|
||||
| sort -u \
|
||||
| while read lib; do \
|
||||
echo " → bundling $$lib"; \
|
||||
cp "$$lib" build/px4.AppDir/usr/lib/; \
|
||||
done
|
||||
|
||||
@tar xf build/px4_sitl_default/romfs_files.tar -C build/px4.AppDir/usr/share/px4/romfs/etc
|
||||
@cp build/px4_sitl_default/bin/px4-* build/px4.AppDir/usr/share/px4/romfs/bin/
|
||||
@cp Tools/appimage/px4.desktop build/px4.AppDir/
|
||||
@cp Tools/appimage/px4.svg build/px4.AppDir/
|
||||
@cp Tools/appimage/AppRun build/px4.AppDir/
|
||||
@chmod +x build/px4.AppDir/AppRun
|
||||
@cd build && appimagetool px4.AppDir
|
||||
|
||||
misc_qgc_extra_firmware: \
|
||||
check_nxp_fmuk66-v3_default \
|
||||
check_mro_x21_default \
|
||||
|
||||
Executable
+61
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
DEBUG=false
|
||||
for arg; do
|
||||
case "$arg" in
|
||||
--debug)
|
||||
DEBUG=true
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if $DEBUG; then
|
||||
echo "[DEBUG] Running in debug mode" >&2
|
||||
fi
|
||||
|
||||
CUR_VER=$(<"$APPDIR/version.txt")
|
||||
$DEBUG && echo "[DEBUG] PX4_VERSION = $CUR_VER" >&2
|
||||
|
||||
# figure out a stable logs directory
|
||||
STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}"
|
||||
DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
|
||||
ROMFS_DIR="$DATA_HOME/px4/romfs"
|
||||
mkdir -p "$DATA_HOME/px4" "$STATE_HOME/px4"
|
||||
|
||||
$DEBUG && echo "[DEBUG] STATE_HOME = $STATE_HOME" >&2
|
||||
$DEBUG && echo "[DEBUG] DATA_HOME = $STATE_HOME" >&2
|
||||
|
||||
# Read last unpacked version
|
||||
LAST_VER_FILE="$STATE_HOME/px4/version"
|
||||
LAST_VER=""
|
||||
[ -f "$LAST_VER_FILE" ] && LAST_VER=$(<"$LAST_VER_FILE")
|
||||
|
||||
# if versions differ, refresh the payload
|
||||
if [ "$CUR_VER" != "$LAST_VER" ]; then
|
||||
$DEBUG && echo "[DEBUG] Version changed ($LAST_VER → $CUR_VER); updating ROMFS..." >&2
|
||||
rm -fr "$ROMFS_DIR"
|
||||
mkdir -p "$ROMFS_DIR"
|
||||
cp -a "$APPDIR/usr/share/px4/romfs/." "$ROMFS_DIR"
|
||||
echo "$CUR_VER" > "$LAST_VER_FILE"
|
||||
else
|
||||
if $DEBUG; then
|
||||
echo "[DEBUG] Using cached ROMFS version $CUR_VER" >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
LOG_DIR="$STATE_HOME/px4/logs"
|
||||
mkdir -p "$LOG_DIR"
|
||||
$DEBUG && echo "[DEBUG] LOG_DIR = $LOG_DIR" >&2
|
||||
|
||||
# pick up bundled libs first
|
||||
export LD_LIBRARY_PATH="$APPDIR/usr/lib:$LD_LIBRARY_PATH"
|
||||
export PATH="$ROMFS_DIR/bin:$ROMFS_DIR:$PATH"
|
||||
|
||||
|
||||
$DEBUG && echo "[DEBUG] Launching: $APPDIR/usr/bin/px4 -w $ROMFS_DIR $*" >&2
|
||||
exec "$APPDIR/usr/bin/px4" -w "$ROMFS_DIR" "$@"
|
||||
@@ -0,0 +1,6 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=PX4 Autopilot SITL
|
||||
Exec=px4 %F
|
||||
Icon=px4
|
||||
Categories=Development;
|
||||
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 25 KiB |
@@ -1,18 +1,5 @@
|
||||
#! /bin/bash
|
||||
|
||||
if [ -z ${PX4_DOCKER_REPO+x} ]; then
|
||||
echo "guessing PX4_DOCKER_REPO based on input";
|
||||
if [[ $@ =~ .*clang.* ]] || [[ $@ =~ .*scan-build.* ]]; then
|
||||
# clang tools
|
||||
PX4_DOCKER_REPO="px4io/px4-dev-clang:2021-02-04"
|
||||
elif [[ $@ =~ .*tests* ]]; then
|
||||
# run all tests with simulation
|
||||
PX4_DOCKER_REPO="px4io/px4-dev-simulation-bionic:2021-12-11"
|
||||
fi
|
||||
else
|
||||
echo "PX4_DOCKER_REPO is set to '$PX4_DOCKER_REPO'";
|
||||
fi
|
||||
|
||||
# otherwise default to nuttx
|
||||
if [ -z ${PX4_DOCKER_REPO+x} ]; then
|
||||
PX4_DOCKER_REPO="px4io/px4-dev:v1.16.0-rc1-258-g0369abd556"
|
||||
|
||||
@@ -126,9 +126,11 @@ if [[ $INSTALL_NUTTX == "true" ]]; then
|
||||
genromfs \
|
||||
gettext \
|
||||
gperf \
|
||||
fuse \
|
||||
kconfig-frontends \
|
||||
libelf-dev \
|
||||
libexpat-dev \
|
||||
libfuse2 \
|
||||
libgmp-dev \
|
||||
libisl-dev \
|
||||
libmpc-dev \
|
||||
@@ -156,6 +158,11 @@ if [[ $INSTALL_NUTTX == "true" ]]; then
|
||||
gcc-arm-none-eabi \
|
||||
gcc-multilib \
|
||||
;
|
||||
|
||||
# Install the appimagetool for building AppImages
|
||||
sudo wget -O /usr/local/bin/appimagetool \
|
||||
https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage
|
||||
sudo chmod +x /usr/local/bin/appimagetool
|
||||
fi
|
||||
|
||||
if [[ "${INSTALL_ARCH}" == "aarch64" ]]; then
|
||||
@@ -163,6 +170,10 @@ if [[ $INSTALL_NUTTX == "true" ]]; then
|
||||
g++-aarch64-linux-gnu \
|
||||
g++-arm-linux-gnueabihf \
|
||||
;
|
||||
# Install the appimagetool for building AppImages
|
||||
sudo wget -O /usr/local/bin/appimagetool \
|
||||
https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-aarch64.AppImage
|
||||
sudo chmod +x /usr/local/bin/appimagetool
|
||||
fi
|
||||
|
||||
if [ -n "$USER" ]; then
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
FROM ubuntu:24.04
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
ca-certificates \
|
||||
curl \
|
||||
gnupg \
|
||||
lsb-release \
|
||||
libbsd0 \
|
||||
libcom-err2 \
|
||||
libc6 \
|
||||
libgcc-s1 \
|
||||
libgssapi-krb5-2 \
|
||||
libk5crypto3 \
|
||||
libkeyutils1 \
|
||||
libkrb5-3 \
|
||||
libkrb5support0 \
|
||||
libmd0 \
|
||||
libnorm1 \
|
||||
libpgm-5.3-0 \
|
||||
libprotobuf32 \
|
||||
libprotobuf-lite32t64 \
|
||||
libsodium23 \
|
||||
libstdc++6 \
|
||||
libuuid1 \
|
||||
libzmq5 \
|
||||
wget \
|
||||
zlib1g \
|
||||
&& rm -fr /var/lib/apt/lists/*
|
||||
|
||||
RUN curl -sSL https://packages.osrfoundation.org/gazebo.key \
|
||||
| gpg --dearmor -o /usr/share/keyrings/gazebo-archive-keyring.gpg \
|
||||
&& echo "deb [signed-by=/usr/share/keyrings/gazebo-archive-keyring.gpg] \
|
||||
http://packages.osrfoundation.org/gazebo/ubuntu-stable \
|
||||
$(lsb_release -cs) main" \
|
||||
> /etc/apt/sources.list.d/gazebo-stable.list \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
libgz-msgs10 \
|
||||
libgz-transport13 \
|
||||
libgz-utils2 \
|
||||
&& rm -fr /var/lib/apt/lists/*
|
||||
|
||||
COPY build/px4_sitl_default/bin /opt/px4/bin
|
||||
COPY build/px4_sitl_default/etc /opt/px4/etc
|
||||
|
||||
WORKDIR /opt/px4
|
||||
|
||||
COPY Tools/sitl-container/entrypoint.sh /usr/local/bin/entrypoint.sh
|
||||
RUN chmod +x /usr/local/bin/entrypoint.sh
|
||||
|
||||
EXPOSE 14540/udp 14550/udp 8888/udp
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
||||
CMD []
|
||||
Executable
+9
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
sudo docker run \
|
||||
--rm -it \
|
||||
--device /dev/fuse --cap-add SYS_ADMIN \
|
||||
-p 14540:14540/udp \
|
||||
-p 14550:14550/udp \
|
||||
-p 8888:8888/udp \
|
||||
px4-sitl:local
|
||||
Executable
+11
@@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
PX4_BIN=/opt/px4/bin/px4
|
||||
|
||||
# if no args passed, default to SITL none
|
||||
if [ $# -eq 0 ]; then
|
||||
exec "$PX4_BIN"
|
||||
else
|
||||
exec "$PX4_BIN" "$@"
|
||||
fi
|
||||
Reference in New Issue
Block a user