diff --git a/.github/workflows/multi-arch-build.yml b/.github/workflows/multi-arch-build.yml new file mode 100644 index 0000000..6a179a1 --- /dev/null +++ b/.github/workflows/multi-arch-build.yml @@ -0,0 +1,88 @@ +name: Multi arch build packages + +on: + push: + branches: + - main + - openwrt-24.10 + - openwrt-23.05 + paths: + - '.github/workflows/multi-arch-build.yml' + - '**/Makefile' + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + build: + name: build ${{ matrix.arch }} ${{ github.ref_name }} + runs-on: ubuntu-24.04 + strategy: + fail-fast: false + max-parallel: 1 + matrix: + arch: + - aarch64_cortex-a53 + - aarch64_cortex-a72 + - aarch64_generic + - arm_arm1176jzf-s_vfp + - arm_arm926ej-s + - arm_cortex-a15_neon-vfpv4 + - arm_cortex-a5_vfpv4 + - arm_cortex-a7 + - arm_cortex-a7_neon-vfpv4 + - arm_cortex-a7_vfpv4 + - arm_cortex-a8_vfpv3 + - arm_cortex-a9 + - arm_cortex-a9_neon + - arm_cortex-a9_vfpv3-d16 + - arm_fa526 + # - arm_mpcore # Fails to create index? + - arm_xscale + - i386_pentium-mmx + - i386_pentium4 + - mips64_octeonplus + - mips_24kc + - mips_4kec + - mips_mips32 + - mipsel_24kc + - mipsel_24kc_24kf + - mipsel_74kc + - mipsel_mips32 + - powerpc64_e5500 + - powerpc_464fp + - powerpc_8548 + - riscv64_riscv64 + - x86_64 + + steps: + - uses: actions/checkout@v4 + + - name: Build APK packages ${{ matrix.arch }} + if: ${{ github.ref_name == 'main' }} + # uses: openwrt/gh-action-sdk@main # Switch back when https://github.com/openwrt/gh-action-sdk/pull/46 is merged + uses: morytyann/gh-action-sdk@9f25772dff4788550a51688423f8f308d061025d + env: + ARCH: "${{ matrix.arch }}-${{ github.ref_name }}" + FEEDNAME: "meshtastic" + IGNORE_ERRORS: "n m y" + PRIVATE_KEY: "${{ secrets.WRT_APK_KEY }}" + INDEX: 1 + + - name: Build IPK packages ${{ matrix.arch }} + if: ${{ github.ref.name != 'main' }} + uses: openwrt/gh-action-sdk@main + env: + ARCH: "${{ matrix.arch }}-${{ github.ref_name }}" + FEEDNAME: "meshtastic" + IGNORE_ERRORS: "n m y" + KEY_BUILD: "${{ secrets.WRT_IPK_KEY }}" + INDEX: 1 + + - name: Upload packages to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + deploy_key: ${{ secrets.WRT_REPO_DEPLOY_KEY }} + external_repository: meshtastic/openwrt-repo + publish_dir: bin/packages/${{ matrix.arch }}/meshtastic/ + destination_dir: ${{ github.ref_name }}/${{ matrix.arch }} diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml new file mode 100644 index 0000000..15d9cf2 --- /dev/null +++ b/.github/workflows/pr-build.yml @@ -0,0 +1,9 @@ +name: PR Test build + +on: + pull_request: + +jobs: + build: + name: Test Build + uses: openwrt/actions-shared-workflows/.github/workflows/multi-arch-test-build.yml@main diff --git a/README.md b/README.md new file mode 100644 index 0000000..68f2b00 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Meshtastic OpenWRT +Meshtastic Packages for OpenWRT diff --git a/depends/abseil-cpp/Makefile b/depends/abseil-cpp/Makefile new file mode 100644 index 0000000..64b3f6d --- /dev/null +++ b/depends/abseil-cpp/Makefile @@ -0,0 +1,56 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=abseil-cpp +PKG_VERSION:=20240722.0 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/abseil/abseil-cpp/releases/download/$(PKG_VERSION) +PKG_HASH:=f50e5ac311a81382da7fa75b97310e4b9006474f9560ac46f54a9967f07d4ae3 + +PKG_MAINTAINER:=Austin Lane +PKG_LICENSE:=Apache-2.0 +PKG_LICENSE_FILES:=LICENSE + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/abseil-cpp + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Collection of C++ code designed to augment the C++ standard library + URL:=https://github.com/abseil/abseil-cpp + DEPENDS:=+libpthread +libstdcpp +endef + +define Package/abseil-cpp/description +Abseil is an open-source collection of C++ code (compliant to C++14) designed to augment the C++ standard library. +endef + +CMAKE_INSTALL:=1 + +CMAKE_HOST_OPTIONS += \ + -DCMAKE_CXX_STANDARD=14 \ + -DABSL_ENABLE_INSTALL=ON \ + -DABSL_USE_GOOGLETEST_HEAD=OFF + +CMAKE_OPTIONS += \ + -DCMAKE_CXX_STANDARD=14 \ + -DABSL_ENABLE_INSTALL=ON \ + -DABSL_USE_GOOGLETEST_HEAD=OFF + +TARGET_CFLAGS += $(FPIC) + +define Build/InstallDev + $(call Build/InstallDev/cmake,$(1)) + $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/absl_*.pc + $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/absl_*.pc +endef + +$(eval $(call BuildPackage,abseil-cpp)) +$(eval $(call HostBuild)) diff --git a/depends/abseil-cpp/patches/001-absl-always-use-asm-sgidefs.h.patch b/depends/abseil-cpp/patches/001-absl-always-use-asm-sgidefs.h.patch new file mode 100644 index 0000000..bf7c96b --- /dev/null +++ b/depends/abseil-cpp/patches/001-absl-always-use-asm-sgidefs.h.patch @@ -0,0 +1,34 @@ +# From https://git.openembedded.org/meta-openembedded/tree/meta-oe/recipes-devtools/abseil-cpp +From 11faa06436fdeb0c9948080a11f9a99d3b5ba16c Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Thu, 9 Apr 2020 13:06:27 -0700 +Subject: [PATCH] absl: always use + +Fixes mips/musl build, since sgidefs.h is not present on all C libraries +but on linux asm/sgidefs.h is there and contains same definitions, using +that makes it portable. + +Upstream-Status: Pending + +Signed-off-by: Khem Raj +--- + absl/base/internal/direct_mmap.h | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +--- a/absl/base/internal/direct_mmap.h ++++ b/absl/base/internal/direct_mmap.h +@@ -41,13 +41,9 @@ + + #ifdef __mips__ + // Include definitions of the ABI currently in use. +-#if defined(__BIONIC__) || !defined(__GLIBC__) +-// Android doesn't have sgidefs.h, but does have asm/sgidefs.h, which has the ++// bionic/musl C libs don't have sgidefs.h, but do have asm/sgidefs.h, which has the + // definitions we need. + #include +-#else +-#include +-#endif // __BIONIC__ || !__GLIBC__ + #endif // __mips__ + + // SYS_mmap and SYS_munmap are not defined in Android. diff --git a/depends/abseil-cpp/patches/002-Remove-maes-option-from-cross-compilation.patch b/depends/abseil-cpp/patches/002-Remove-maes-option-from-cross-compilation.patch new file mode 100644 index 0000000..eede7d5 --- /dev/null +++ b/depends/abseil-cpp/patches/002-Remove-maes-option-from-cross-compilation.patch @@ -0,0 +1,32 @@ +# From https://git.openembedded.org/meta-openembedded/tree/meta-oe/recipes-devtools/abseil-cpp +From a573ccd57e713486e7d8e782d6b3b34fde01ff9e Mon Sep 17 00:00:00 2001 +From: Sinan Kaya +Date: Mon, 3 Feb 2020 03:25:57 +0000 +Subject: [PATCH] Remove maes option from cross-compilation + +Upstream-Status: Pending +--- + absl/copts/GENERATED_AbseilCopts.cmake | 4 ---- + absl/copts/GENERATED_copts.bzl | 4 ---- + 2 files changed, 8 deletions(-) + +--- a/absl/copts/GENERATED_AbseilCopts.cmake ++++ b/absl/copts/GENERATED_AbseilCopts.cmake +@@ -229,7 +229,3 @@ list(APPEND ABSL_RANDOM_HWAES_ARM64_FLAG + list(APPEND ABSL_RANDOM_HWAES_MSVC_X64_FLAGS + ) + +-list(APPEND ABSL_RANDOM_HWAES_X64_FLAGS +- "-maes" +- "-msse4.1" +-) +--- a/absl/copts/GENERATED_copts.bzl ++++ b/absl/copts/GENERATED_copts.bzl +@@ -230,7 +230,3 @@ ABSL_RANDOM_HWAES_ARM64_FLAGS = [ + ABSL_RANDOM_HWAES_MSVC_X64_FLAGS = [ + ] + +-ABSL_RANDOM_HWAES_X64_FLAGS = [ +- "-maes", +- "-msse4.1", +-] diff --git a/depends/abseil-cpp/patches/003-Remove-neon-option-from-cross-compilation.patch b/depends/abseil-cpp/patches/003-Remove-neon-option-from-cross-compilation.patch new file mode 100644 index 0000000..131a2cc --- /dev/null +++ b/depends/abseil-cpp/patches/003-Remove-neon-option-from-cross-compilation.patch @@ -0,0 +1,43 @@ +# From https://git.openembedded.org/meta-openembedded/tree/meta-oe/recipes-devtools/abseil-cpp +From 632632508daf8bb3a5800dac937ffc33c6d85973 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski +Date: Thu, 16 Jun 2022 11:46:31 +0000 +Subject: [PATCH] Remove neon option from cross compilation + +Not every arm platform supports neon instructions, so do not enforce +them. + +Upstream-Status: Pending + +Signed-off-by: Jonas Gorski +--- + absl/copts/GENERATED_AbseilCopts.cmake | 4 ---- + absl/copts/GENERATED_copts.bzl | 4 ---- + 2 files changed, 8 deletions(-) + +--- a/absl/copts/GENERATED_AbseilCopts.cmake ++++ b/absl/copts/GENERATED_AbseilCopts.cmake +@@ -218,10 +218,6 @@ list(APPEND ABSL_MSVC_TEST_FLAGS + "/DNOMINMAX" + ) + +-list(APPEND ABSL_RANDOM_HWAES_ARM32_FLAGS +- "-mfpu=neon" +-) +- + list(APPEND ABSL_RANDOM_HWAES_ARM64_FLAGS + "-march=armv8-a+crypto" + ) +--- a/absl/copts/GENERATED_copts.bzl ++++ b/absl/copts/GENERATED_copts.bzl +@@ -219,10 +219,6 @@ ABSL_MSVC_TEST_FLAGS = [ + "/DNOMINMAX", + ] + +-ABSL_RANDOM_HWAES_ARM32_FLAGS = [ +- "-mfpu=neon", +-] +- + ABSL_RANDOM_HWAES_ARM64_FLAGS = [ + "-march=armv8-a+crypto", + ] diff --git a/depends/abseil-cpp/patches/004-abseil-ppc-fixes.patch b/depends/abseil-cpp/patches/004-abseil-ppc-fixes.patch new file mode 100644 index 0000000..c9f477a --- /dev/null +++ b/depends/abseil-cpp/patches/004-abseil-ppc-fixes.patch @@ -0,0 +1,93 @@ +# From https://git.openembedded.org/meta-openembedded/tree/meta-oe/recipes-devtools/abseil-cpp +From f9607924225ca59fb6c60222e6424b84e6f70029 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Sat, 21 Sep 2024 20:53:06 +0800 +Subject: [PATCH] abseil: ppc fixes + +An all-in-one patch that fixes several issues: + +1) UnscaledCycleClock not fully implemented for ppc*-musl (disabled on musl) +2) powerpc stacktrace implementation only works on glibc (disabled on musl) +3) powerpc stacktrace implementation has ppc64 assumptions (fixed) +4) examine_stack.cpp makes glibc assumptions on powerpc (fixed) + +Sourced from void linux + +Upstream-Status: Pending + +Signed-off-by: Khem Raj +--- + absl/base/internal/unscaledcycleclock.cc | 4 ++-- + absl/base/internal/unscaledcycleclock_config.h | 3 ++- + absl/debugging/internal/examine_stack.cc | 8 +++++++- + absl/debugging/internal/stacktrace_config.h | 2 +- + 4 files changed, 12 insertions(+), 5 deletions(-) + +--- a/absl/base/internal/unscaledcycleclock.cc ++++ b/absl/base/internal/unscaledcycleclock.cc +@@ -20,7 +20,7 @@ + #include + #endif + +-#if defined(__powerpc__) || defined(__ppc__) ++#if (defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__) + #ifdef __GLIBC__ + #include + #elif defined(__FreeBSD__) +@@ -58,7 +58,7 @@ double UnscaledCycleClock::Frequency() { + return base_internal::NominalCPUFrequency(); + } + +-#elif defined(__powerpc__) || defined(__ppc__) ++#elif (defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__) + + int64_t UnscaledCycleClock::Now() { + #ifdef __GLIBC__ +--- a/absl/base/internal/unscaledcycleclock_config.h ++++ b/absl/base/internal/unscaledcycleclock_config.h +@@ -21,7 +21,8 @@ + + // The following platforms have an implementation of a hardware counter. + #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \ +- defined(__powerpc__) || defined(__ppc__) || defined(_M_IX86) || \ ++ ((defined(__powerpc__) || defined(__ppc__)) && defined(__GLIBC__)) || \ ++ defined(_M_IX86) || \ + (defined(_M_X64) && !defined(_M_ARM64EC)) + #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 1 + #else +--- a/absl/debugging/internal/examine_stack.cc ++++ b/absl/debugging/internal/examine_stack.cc +@@ -36,6 +36,10 @@ + #include + #include + ++#if defined(__powerpc__) ++#include ++#endif ++ + #include "absl/base/attributes.h" + #include "absl/base/internal/raw_logging.h" + #include "absl/base/macros.h" +@@ -177,8 +181,10 @@ void* GetProgramCounter(void* const vuc) + return reinterpret_cast(context->uc_mcontext.pc); + #elif defined(__powerpc64__) + return reinterpret_cast(context->uc_mcontext.gp_regs[32]); +-#elif defined(__powerpc__) ++#elif defined(__powerpc__) && defined(__GLIBC__) + return reinterpret_cast(context->uc_mcontext.uc_regs->gregs[32]); ++#elif defined(__powerpc__) ++ return reinterpret_cast((context->uc_regs)->gregs[32]); + #elif defined(__riscv) + return reinterpret_cast(context->uc_mcontext.__gregs[REG_PC]); + #elif defined(__s390__) && !defined(__s390x__) +--- a/absl/debugging/internal/stacktrace_config.h ++++ b/absl/debugging/internal/stacktrace_config.h +@@ -60,7 +60,7 @@ + #elif defined(__i386__) || defined(__x86_64__) + #define ABSL_STACKTRACE_INL_HEADER \ + "absl/debugging/internal/stacktrace_x86-inl.inc" +-#elif defined(__ppc__) || defined(__PPC__) ++#elif (defined(__ppc__) || defined(__PPC__)) && defined(__GLIBC__) + #define ABSL_STACKTRACE_INL_HEADER \ + "absl/debugging/internal/stacktrace_powerpc-inl.inc" + #elif defined(__aarch64__) diff --git a/depends/abseil-cpp/patches/005-Don-t-match-Wnon-virtual-dtor-in-the-flags-are-neede.patch b/depends/abseil-cpp/patches/005-Don-t-match-Wnon-virtual-dtor-in-the-flags-are-neede.patch new file mode 100644 index 0000000..92d8342 --- /dev/null +++ b/depends/abseil-cpp/patches/005-Don-t-match-Wnon-virtual-dtor-in-the-flags-are-neede.patch @@ -0,0 +1,29 @@ +# From https://git.openembedded.org/meta-openembedded/tree/meta-oe/recipes-devtools/abseil-cpp +From 9cb5e5d15c142e5cc43a2c1db87c8e4e5b6d38a5 Mon Sep 17 00:00:00 2001 +From: Derek Mauro +Date: Mon, 5 Aug 2024 07:35:05 -0700 +Subject: [PATCH] Don't match -Wnon-virtual-dtor in the "flags are needed to + suppress warnings in headers". It should fall through to the "don't impose + our warnings on others" case. Do this by matching on "-Wno-*" instead of + "-Wno*". + +Fixes #1737 + +PiperOrigin-RevId: 659548798 +Change-Id: I49d7ba7ddcd7be30f946fca90ba9be467181e854 +Upstream-Status: Backport [https://github.com/abseil/abseil-cpp/commit/9cb5e5d15c142e5cc43a2c1db87c8e4e5b6d38a5] +--- + CMake/AbseilHelpers.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/CMake/AbseilHelpers.cmake ++++ b/CMake/AbseilHelpers.cmake +@@ -195,7 +195,7 @@ function(absl_cc_library) + # specified platform. Filter both of them out before the successor + # reaches the "^-m" filter. + set(skip_next_cflag ON) +- elseif(${cflag} MATCHES "^(-Wno|/wd)") ++ elseif(${cflag} MATCHES "^(-Wno-|/wd)") + # These flags are needed to suppress warnings that might fire in our headers. + set(PC_CFLAGS "${PC_CFLAGS} ${cflag}") + elseif(${cflag} MATCHES "^(-W|/w[1234eo])") diff --git a/depends/libyder/Makefile b/depends/libyder/Makefile new file mode 100644 index 0000000..ac4debe --- /dev/null +++ b/depends/libyder/Makefile @@ -0,0 +1,49 @@ +# Remove when https://github.com/openwrt/packages/pull/25503 is merged. + +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libyder +PKG_VERSION:=1.4.17 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/babelouest/yder/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=fb006e4e2a3e2f992985776808da92cbd87ed386dd3125984025036fdc10bfdf + +PKG_MAINTAINER:=Austin Lane +PKG_LICENSE:=LGPL-2.1-or-later +PKG_LICENSE_FILES:=LICENSE + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/yder-$(PKG_VERSION) +CMAKE_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/libyder + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Logging library written in C. + URL:=https://github.com/babelouest/yder + DEPENDS:=+liborcania +endef + +CMAKE_OPTIONS += \ + -DWITH_JOURNALD=off \ + -DCMAKE_BUILD_TYPE=Release + +define Package/libyder/description + Simple and easy to use logging library. You can log messages to the console, a file, Syslog, journald or a callback function. +endef + +define Package/libyder/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libyder.so* $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,libyder)) diff --git a/depends/protobuf/Makefile b/depends/protobuf/Makefile new file mode 100644 index 0000000..cc72fee --- /dev/null +++ b/depends/protobuf/Makefile @@ -0,0 +1,122 @@ +# +# Copyright (C) 2007-2015 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=protobuf +PKG_VERSION:=29.1 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/google/protobuf/releases/download/v$(PKG_VERSION) +PKG_HASH:=3d32940e975c4ad9b8ba69640e78f5527075bae33ca2890275bf26b853c0962c + +PKG_MAINTAINER:=Ken Keys , Austin Lane +PKG_LICENSE:=BSD-3-Clause +PKG_LICENSE_FILES:=LICENSE +PKG_CPE_ID:=cpe:/a:google:protobuf + +HOST_BUILD_DEPENDS:=abseil-cpp/host +PKG_BUILD_DEPENDS:=abseil-cpp + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/cmake.mk + +define Package/protobuf/Default + SECTION:=libs + CATEGORY:=Libraries + TITLE:=A structured data encoding library + URL:=https://github.com/google/protobuf + DEPENDS:=+zlib +libpthread +libatomic +libstdcpp +abseil-cpp +endef + +define Package/protobuf + $(call Package/protobuf/Default) + DEPENDS+=+protobuf-lite +endef + +define Package/protobuf-lite + $(call Package/protobuf/Default) +endef + +define Package/protobuf/description/Default +Protocol Buffers are a way of encoding structured data in an efficient +yet extensible format. Google uses Protocol Buffers for almost all +of its internal RPC protocols and file formats. +endef + +define Package/protobuf/description +$(call Package/protobuf/description/Default) + +This package provides the libprotoc, libprotobuf, and libprotobuf-lite +libraries. For a much smaller protobuf package, see "protobuf-lite". + +endef + +define Package/protobuf-lite/description +$(call Package/protobuf/description/Default) + +This package provides the libprotobuf-lite library. + +endef + +CMAKE_HOST_OPTIONS += \ + -Dprotobuf_ABSL_PROVIDER="package" \ + -Dprotobuf_BUILD_PROTOC_BINARIES=ON \ + -Dprotobuf_BUILD_TESTS=OFF \ + -Dprotobuf_BUILD_EXAMPLES=OFF \ + -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_INSTALL_LIBDIR=lib + +CMAKE_OPTIONS += \ + -Dprotobuf_ABSL_PROVIDER="package" \ + -Dprotobuf_BUILD_PROTOC_BINARIES=ON \ + -Dprotobuf_BUILD_TESTS=OFF \ + -Dprotobuf_BUILD_EXAMPLES=OFF \ + -Dprotobuf_WITH_ZLIB=ON \ + -DBUILD_SHARED_LIBS=ON + +TARGET_LDFLAGS += -latomic + +define Build/InstallDev + $(call Build/InstallDev/cmake,$(1)) + $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/protobuf.pc + $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/protobuf.pc + $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/protobuf-lite.pc + $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/protobuf-lite.pc + $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/upb.pc + $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/upb.pc + $(SED) 's,/usr/include,$$$${prefix}/include,g' $(1)/usr/lib/pkgconfig/utf8_range.pc + $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' $(1)/usr/lib/pkgconfig/utf8_range.pc +endef + +define Package/protobuf-lite/install + $(INSTALL_DIR) $(1)/usr/lib + + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libutf8_range.so* $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libutf8_validity.so* $(1)/usr/lib/ + $(CP) \ + $(PKG_INSTALL_DIR)/usr/lib/libprotobuf-lite.so* \ + $(1)/usr/lib/ +endef + +define Package/protobuf/install + $(INSTALL_DIR) $(1)/usr/lib + + $(CP) \ + $(PKG_INSTALL_DIR)/usr/lib/libprotoc.so* \ + $(1)/usr/lib/ + + $(CP) \ + $(PKG_INSTALL_DIR)/usr/lib/libprotobuf.so* \ + $(1)/usr/lib/ +endef + +$(eval $(call BuildPackage,protobuf)) +$(eval $(call BuildPackage,protobuf-lite)) +$(eval $(call HostBuild)) diff --git a/depends/protobuf/patches/010-rpath.patch b/depends/protobuf/patches/010-rpath.patch new file mode 100644 index 0000000..36db52f --- /dev/null +++ b/depends/protobuf/patches/010-rpath.patch @@ -0,0 +1,24 @@ +--- a/cmake/install.cmake ++++ b/cmake/install.cmake +@@ -39,8 +39,8 @@ endif () + + foreach(_library ${_protobuf_libraries}) + if (UNIX AND NOT APPLE) +- set_property(TARGET ${_library} +- PROPERTY INSTALL_RPATH "$ORIGIN") ++# set_property(TARGET ${_library} ++# PROPERTY INSTALL_RPATH "$ORIGIN") + elseif (APPLE) + set_property(TARGET ${_library} + PROPERTY INSTALL_RPATH "@loader_path") +@@ -66,8 +66,8 @@ if (protobuf_BUILD_PROTOC_BINARIES) + endif () + foreach (binary IN LISTS _protobuf_binaries) + if (UNIX AND NOT APPLE) +- set_property(TARGET ${binary} +- PROPERTY INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") ++# set_property(TARGET ${binary} ++# PROPERTY INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") + elseif (APPLE) + set_property(TARGET ${binary} + PROPERTY INSTALL_RPATH "@loader_path/../lib") diff --git a/depends/python-dotmap/Makefile b/depends/python-dotmap/Makefile new file mode 100644 index 0000000..7b86eb4 --- /dev/null +++ b/depends/python-dotmap/Makefile @@ -0,0 +1,36 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=python-dotmap +PKG_VERSION:=1.3.30 +PKG_RELEASE:=1 + +PYPI_NAME:=dotmap +PKG_HASH:=5821a7933f075fb47563417c0e92e0b7c031158b4c9a6a7e56163479b658b368 + +PKG_MAINTAINER:=Austin Lane +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=LICENSE.txt + +include $(TOPDIR)/feeds/packages/lang/python/pypi.mk +include $(INCLUDE_DIR)/package.mk +include $(TOPDIR)/feeds/packages/lang/python/python3-package.mk + +define Package/python3-dotmap + SECTION:=lang + CATEGORY:=Languages + SUBMENU:=Python + TITLE:=dot-access dictionaries for Python + URL:=https://pypi.org/project/dotmap + DEPENDS:=+python3-light +endef + +define Package/python3-dotmap/description +ordered, dynamically-expandable dot-access dictionary +endef + +$(eval $(call Py3Package,python3-dotmap)) +$(eval $(call BuildPackage,python3-dotmap)) diff --git a/depends/python-platformio/Makefile b/depends/python-platformio/Makefile new file mode 100644 index 0000000..0ee60c5 --- /dev/null +++ b/depends/python-platformio/Makefile @@ -0,0 +1,61 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=python-platformio +PKG_VERSION:=6.1.16 +PKG_RELEASE:=1 + +PYPI_NAME:=platformio +PYPI_SOURCE_NAME:=platformio +PKG_HASH:=79387b45ca7df9c0c51cae82b3b0a40ba78d11d87cea385db47e1033d781e959 + +PKG_MAINTAINER:=Austin Lane +PKG_LICENSE:=Apache-2.0 +PKG_LICENSE_FILES:=LICENSE + +PKG_HOST_ONLY:=1 +HOST_BUILD_DEPENDS:= \ + python3/host \ + python-build/host \ + python-installer/host \ + python-pyserial/host \ + python-click/host \ + python-semantic-version/host \ + python-requests/host \ + python-tabulate/host \ + python-pyelftools/host + +include $(TOPDIR)/feeds/packages/lang/python/pypi.mk +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/host-build.mk +include $(TOPDIR)/feeds/packages/lang/python/python3-package.mk +include $(TOPDIR)/feeds/packages/lang/python/python3-host-build.mk + +define Package/python3-platformio + SECTION:=meshtastic + CATEGORY:=Meshtastic + TITLE:=PlatformIO Host Tools + URL:=https://github.com/platformio/platformio-core + BUILDONLY:=1 + DEPENDS:= \ + +python3-light \ + +python3-pyserial \ + +python3-click \ + +python3-semantic-version \ + +python3-requests \ + +python3-tabulate \ + +python3-pyelftools +endef + +define Package/python3-platformio/description +PlatformIO is an open-source build system for embedded development, +supporting multiple platforms, frameworks, and boards +with features like dependency management and IDE integration. +endef + +$(eval $(call Py3Package,python3-platformio)) +$(eval $(call BuildPackage,python3-platformio)) +$(eval $(call HostBuild)) diff --git a/depends/python-print-color/Makefile b/depends/python-print-color/Makefile new file mode 100644 index 0000000..050f762 --- /dev/null +++ b/depends/python-print-color/Makefile @@ -0,0 +1,38 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=python-print-color +PKG_VERSION:=0.4.6 +PKG_RELEASE:=1 + +PYPI_NAME:=print_color +PKG_HASH:=d3aafc1666c8d31a85fffa6ee8e4f269f5d5e338d685b4e6179915c71867c585 + +PKG_MAINTAINER:=Austin Lane +PKG_LICENSE:=Apache-2.0 +PKG_LICENSE_FILES:=LICENSE + +PKG_BUILD_DEPENDS:=python-poetry-core/host + +include $(TOPDIR)/feeds/packages/lang/python/pypi.mk +include $(INCLUDE_DIR)/package.mk +include $(TOPDIR)/feeds/packages/lang/python/python3-package.mk + +define Package/python3-print-color + SECTION:=lang + CATEGORY:=Languages + SUBMENU:=Python + TITLE:=Print in color to the terminal + URL:=https://pypi.org/project/print-color + DEPENDS:=+python3-light +endef + +define Package/python3-print-color/description +A simple package to print in color to the terminal +endef + +$(eval $(call Py3Package,python3-print-color)) +$(eval $(call BuildPackage,python3-print-color)) diff --git a/depends/python-protobuf/Makefile b/depends/python-protobuf/Makefile new file mode 100644 index 0000000..fd4f4c1 --- /dev/null +++ b/depends/python-protobuf/Makefile @@ -0,0 +1,39 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=python-protobuf +PKG_VERSION:=5.29.1 +PKG_RELEASE:=1 + +PYPI_NAME:=protobuf +PKG_HASH:=683be02ca21a6ffe80db6dd02c0b5b2892322c59ca57fd6c872d652cb80549cb + +PKG_MAINTAINER:=Austin Lane +PKG_LICENSE:=BSD-3-Clause +PKG_LICENSE_FILES:=LICENSE +PKG_CPE_ID:=cpe:/a:google:protobuf + +PKG_BUILD_DEPENDS:=protobuf/host + +include $(TOPDIR)/feeds/packages/lang/python/pypi.mk +include $(INCLUDE_DIR)/package.mk +include $(TOPDIR)/feeds/packages/lang/python/python3-package.mk + +define Package/python3-protobuf + SECTION:=lang + CATEGORY:=Languages + SUBMENU:=Python + TITLE:=Protobuf support for Python + URL:=https://pypi.org/project/protobuf + DEPENDS:=+protobuf +python3-light +python3-ctypes +endef + +define Package/python3-protobuf/description +Protocol Buffers - Google's data interchange format, for Python +endef + +$(eval $(call Py3Package,python3-protobuf)) +$(eval $(call BuildPackage,python3-protobuf)) diff --git a/depends/python-pypubsub/Makefile b/depends/python-pypubsub/Makefile new file mode 100644 index 0000000..067bfab --- /dev/null +++ b/depends/python-pypubsub/Makefile @@ -0,0 +1,39 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=python-pypubsub +PKG_VERSION:=4.0.3 +PKG_RELEASE:=1 + +PYTHON3_PKG_WHEEL_NAME:=Pypubsub + +PKG_SOURCE:=pypubsub-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/schollii/pypubsub/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=0df83daa1cb0021bab858ff6812d836c9712dea59a5172be1888bb554c3a89a2 +PKG_BUILD_DIR:=$(BUILD_DIR)/pypubsub-$(PKG_VERSION) + +PKG_MAINTAINER:=Austin Lane +PKG_LICENSE:=BSD-2-Clause +PKG_LICENSE_FILES:=src/pubsub/LICENSE_BSD_Simple.txt + +include $(INCLUDE_DIR)/package.mk +include $(TOPDIR)/feeds/packages/lang/python/python3-package.mk + +define Package/python3-pypubsub + SECTION:=lang + CATEGORY:=Languages + SUBMENU:=Python + TITLE:=Python Publish-Subscribe Package + URL:=https://pypi.org/project/pypubsub + DEPENDS:=+python3-light +python3-xml +endef + +define Package/python3-pypubsub/description +Python Publish-Subscribe Package +endef + +$(eval $(call Py3Package,python3-pypubsub)) +$(eval $(call BuildPackage,python3-pypubsub)) diff --git a/depends/python-pyqrcode/Makefile b/depends/python-pyqrcode/Makefile new file mode 100644 index 0000000..3daf7c5 --- /dev/null +++ b/depends/python-pyqrcode/Makefile @@ -0,0 +1,35 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=python-pyqrcode +PKG_VERSION:=1.2.1 +PKG_RELEASE:=1 + +PYPI_NAME:=PyQRCode +PKG_HASH:=fdbf7634733e56b72e27f9bce46e4550b75a3a2c420414035cae9d9d26b234d5 + +PKG_MAINTAINER:=Austin Lane +PKG_LICENSE:=BSD-3-Clause + +include $(TOPDIR)/feeds/packages/lang/python/pypi.mk +include $(INCLUDE_DIR)/package.mk +include $(TOPDIR)/feeds/packages/lang/python/python3-package.mk + +define Package/python3-pyqrcode + SECTION:=lang + CATEGORY:=Languages + SUBMENU:=Python + TITLE:=QR code generator for Python + URL:=https://pypi.org/project/pyqrcode + DEPENDS:=+python3-light +python3-urllib +python3-xml +endef + +define Package/python3-pyqrcode/description +A QR code generator written purely in Python with SVG, EPS, PNG and terminal output +endef + +$(eval $(call Py3Package,python3-pyqrcode)) +$(eval $(call BuildPackage,python3-pyqrcode)) diff --git a/meshtasticd-web/Makefile b/meshtasticd-web/Makefile new file mode 100644 index 0000000..e8ab8c9 --- /dev/null +++ b/meshtasticd-web/Makefile @@ -0,0 +1,46 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=meshtasticd-web +PKG_VERSION:=2.5.4 +PKG_RELEASE:=1 + +PKG_SOURCE:=build.tar +PKG_SOURCE_URL:=https://github.com/meshtastic/web/releases/download/v$(PKG_VERSION)/ +PKG_HASH:=9aded26483a8bee4e8811f33744da2016ad4bca4894f6d4cbdea79a53b0a7eaa +UNPACK_CMD=\ + mkdir -p $(1)/web; \ + $(TAR) -xf $(DL_DIR)/$(PKG_SOURCE) -C $(1)/web; \ + gzip -dr $(1)/web/ + +PKG_MAINTAINER:=Austin Lane +PKG_LICENSE:=GPL-3.0 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) + +include $(INCLUDE_DIR)/package.mk + +define Package/meshtasticd-web + SECTION:=net + CATEGORY:=Network + TITLE:=Meshtastic Daemon Web Interface + URL:=http://github.com/meshtastic/firmware + DEPENDS:=meshtasticd +endef + +define Package/meshtasticd-web/description + Meshtastic Daemon Web Interface +endef + +define Build/Compile +endef + +define Package/meshtasticd-web/install + $(INSTALL_DIR) $(1)/usr/share/meshtasticd/web + $(CP) $(PKG_BUILD_DIR)/web/* $(1)/usr/share/meshtasticd/web +endef + +$(eval $(call BuildPackage,meshtasticd-web)) diff --git a/meshtasticd/Makefile b/meshtasticd/Makefile new file mode 100644 index 0000000..b670d68 --- /dev/null +++ b/meshtasticd/Makefile @@ -0,0 +1,143 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=meshtasticd +PKG_VERSION:=2.5.18 +PKG_RELEASE:=1 +PKG_SOURCE_VERSION:=b12ac6d564be4558047231d5ad946a908dfbbd7f + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://github.com/meshtastic/firmware.git +PKG_MIRROR_HASH:=4f1428b62564e77cd14c52fef1152a2bdd85d8fa016b12fba769207bcb9c4b46 +PKG_BUILD_DEPENDS:= \ + python3/host \ + python-platformio/host \ + !USE_GLIBC:argp-standalone \ + libgpiod \ + libyaml-cpp \ + zlib \ + bluez \ + i2c-tools \ + MESHTASTICD_ENABLE_USB:libusb \ + MESHTASTICD_ENABLE_WEB:openssl \ + MESHTASTICD_ENABLE_WEB:liborcania \ + MESHTASTICD_ENABLE_WEB:libyder \ + MESHTASTICD_ENABLE_WEB:libulfius + +PKG_MAINTAINER:=Austin Lane +PKG_LICENSE:=GPL-3.0 +PKG_LICENSE_FILES:=LICENSE + +include $(INCLUDE_DIR)/package.mk +include $(TOPDIR)/feeds/packages/lang/python/python3-host.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/meshtasticd/Default + SECTION:=net + CATEGORY:=Network + TITLE:=Meshtastic Daemon + URL:=http://github.com/meshtastic/firmware + DEPENDS:= \ + +libgpiod +libyaml-cpp +zlib +bluez-libs +libpthread +libi2c \ + +MESHTASTICD_ENABLE_SPI:kmod-spi-dev +MESHTASTICD_ENABLE_USB:libusb-1.0 \ + +MESHTASTICD_ENABLE_WEB:libopenssl \ + +MESHTASTICD_ENABLE_WEB:liborcania +MESHTASTICD_ENABLE_WEB:libyder +MESHTASTICD_ENABLE_WEB:libulfius-gnutls \ + $(INTL_DEPENDS) +endef + +Package/meshtasticd = $(Package/meshtasticd/Default) + +define Package/meshtasticd-avahi-service + $(call Package/meshtasticd/Default) + TITLE+= (avahi service) + DEPENDS:=meshtasticd +avahi-daemon +endef + +define Package/meshtasticd/description + Meshtastic Daemon +endef + +define Package/meshtasticd-avahi-service/description +This package contains the service definition for announcing the +meshtastic daemon via mDNS. +endef + +define Package/meshtasticd/config +config MESHTASTICD_ENABLE_SPI + bool "spi lora radio support" + default y + help + SPI LoRa radio support for meshtasticd + +config MESHTASTICD_ENABLE_USB + bool "usb lora radio support" + default y + help + USB LoRa radio support for meshtasticd + +config MESHTASTICD_ENABLE_WEB + bool "webui support" + select PACKAGE_meshtasticd-web + default y + help + Adds support for the meshtasticd webui +endef + +PLATFORMIO_BUILD_FLAGS = \ + -Os -ffunction-sections -fdata-sections -Wl,--gc-sections \ + $(if $(INTL_FULL),-lintl) \ + $(if $(CONFIG_USE_GLIBC),,-largp) \ + $(if $(CONFIG_MESHTASTICD_ENABLE_WEB),-lssl -lcrypto) \ + $(if $(CONFIG_MESHTASTICD_ENABLE_WEB),-lorcania -lyder -lulfius) + +define Build/Compile + TARGET_AR="$(TARGET_AR)" \ + TARGET_AS="$(TARGET_CC) -c $(TARGET_ASFLAGS)" \ + TARGET_CC="$(TARGET_CC)" \ + TARGET_CXX="$(TARGET_CXX)" \ + TARGET_LDFLAGS="$(TARGET_LDFLAGS)" \ + TARGET_CFLAGS="$(TARGET_CFLAGS)" \ + TARGET_CXXFLAGS="$(TARGET_CXXFLAGS)" \ + TARGET_LD="$(TARGET_LD)" \ + TARGET_OBJCOPY="$(TARGET_CROSS)objcopy" \ + TARGET_RANLIB="$(TARGET_RANLIB)" \ + PLATFORMIO_BUILD_FLAGS="$(PLATFORMIO_BUILD_FLAGS)" \ + PLATFORMIO_CACHE_DIR="$(DL_DIR)/.platformio_cache" \ + PLATFORMIO_BUILD_CACHE_DIR="$(PKG_BUILD_DIR)/.pio_build_cache" \ + $(HOST_PYTHON3_BIN) -m platformio run --environment buildroot --project-dir $(PKG_BUILD_DIR) +endef + +define Package/meshtasticd/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/.pio/build/buildroot/program $(1)/usr/sbin/meshtasticd + + $(INSTALL_DIR) $(1)/etc/meshtasticd + $(INSTALL_CONF) $(PKG_BUILD_DIR)/bin/config-dist.yaml $(1)/etc/meshtasticd/config.yaml + $(INSTALL_DIR) $(1)/etc/meshtasticd/config.d + $(INSTALL_DIR) $(1)/etc/meshtasticd/available.d + $(CP) -R $(PKG_BUILD_DIR)/bin/config.d/* $(1)/etc/meshtasticd/available.d + + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_DIR) $(1)/var/lib/meshtasticd + $(INSTALL_BIN) ./files/meshtasticd.init $(1)/etc/init.d/meshtasticd +endef + +define Package/meshtasticd-avahi-service/install + $(INSTALL_DIR) $(1)/etc/avahi/services + $(INSTALL_DATA) ./files/meshtasticd.service $(1)/etc/avahi/services/ +endef + +define Package/meshtasticd/conffiles +/etc/meshtasticd/config.yaml +endef + +define Package/meshtasticd-avahi-service/conffiles +/etc/avahi/services/meshtasticd.service +endef + +$(eval $(call BuildPackage,meshtasticd)) +$(eval $(call BuildPackage,meshtasticd-avahi-service)) diff --git a/meshtasticd/files/meshtasticd.init b/meshtasticd/files/meshtasticd.init new file mode 100644 index 0000000..84faa9a --- /dev/null +++ b/meshtasticd/files/meshtasticd.init @@ -0,0 +1,33 @@ +#!/bin/sh /etc/rc.common + +START=99 +STOP=10 +USE_PROCD=1 + +NAME=meshtasticd +DAEMON=/usr/sbin/meshtasticd +DATA_DIR=/var/lib/meshtasticd + +CONFIG_BASEDIR=/etc/config/meshtasticd +CONFIG_FILE=${CONFIG_BASEDIR}/config.yaml +CONFIG_DIR=${CONFIG_BASEDIR}/config.d/* + +# meshtasticd needs to be run from its data directory +cd $DATA_DIR + +service_triggers() { + procd_add_reload_trigger "meshtasticd" +} + +start_service() { + procd_open_instance + procd_set_param command $DAEMON + procd_append_param command --fsdir=$DATA_DIR + procd_set_param file $CONFIG_FILE + procd_set_param file $CONFIG_DIR + procd_set_param term_timeout 15 + procd_set_param respawn + procd_set_param stdout 1 + procd_set_param stderr 1 + procd_close_instance +} diff --git a/meshtasticd/files/meshtasticd.service b/meshtasticd/files/meshtasticd.service new file mode 100644 index 0000000..8240266 --- /dev/null +++ b/meshtasticd/files/meshtasticd.service @@ -0,0 +1,9 @@ + + + + Meshtastic + + _http._tcp + 80 + + diff --git a/python-meshtastic/Makefile b/python-meshtastic/Makefile new file mode 100644 index 0000000..1eb12eb --- /dev/null +++ b/python-meshtastic/Makefile @@ -0,0 +1,42 @@ +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=python-meshtastic +PKG_VERSION:=2.5.7 +PKG_RELEASE:=1 + +PYPI_NAME:=meshtastic +PKG_HASH:=45e43e192e3a5467dd31f86a378efe4160efde1fdec29af91dc61ed369e33c5d + +PKG_MAINTAINER:=Austin Lane +PKG_LICENSE:=GPL-3.0 +PKG_LICENSE_FILES:=LICENSES/GPL-3.0-only.txt + +PKG_BUILD_DEPENDS:=python-poetry-core/host + +include $(TOPDIR)/feeds/packages/lang/python/pypi.mk +include $(INCLUDE_DIR)/package.mk +include $(TOPDIR)/feeds/packages/lang/python/python3-package.mk + +define Package/python3-meshtastic + SECTION:=lang + CATEGORY:=Languages + SUBMENU:=Python + TITLE:=Meshtastic Python + URL:=https://pypi.org/project/meshtastic + DEPENDS:= \ + +python3-light +python3-asyncio +python3-decimal +python3-logging \ + +python3-pyserial +python3-requests +python3-yaml +python3-bleak \ + +python3-tabulate +python3-protobuf +python3-pypubsub \ + +python3-dotmap +python3-pyqrcode +python3-print-color +endef + +define Package/python3-meshtastic/description +Meshtastic Python CLI / API +endef + +$(eval $(call Py3Package,python3-meshtastic)) +$(eval $(call BuildPackage,python3-meshtastic))