Closed aimacintyre closed 1 year ago
Hey, thanks for looking into this. What is your proposed next steps? I'm concerned about lumping usb devices in here and effectively neutering them. Note that I've not had an opportunity to inspect your config diff yet as I'm on mobile.
I've thought about introducing a Gargoyle-Config.in which includes profiles for usb, usb large etc that automatically selects the appropriate package inclusions rather than having to set them manually.
I think the next steps are to investigate why the bare bones images are so large and what (if anything) can be done to slim them down. Unfortunately I don't really know what's needed vs what's not yet so I can't make any observations other than with this config:
My understanding is that at least a few hundred kB are needed for the JFFS/UBIFS in order to be able to save basic local configs so the 8 MB device images are sailing very close to the limit (and I don't have an ath79 device in that class to test).
The per-root fs tooling in OpenWrt is including the base USB driver support for each device in the bare-bones images ; if we can slim down the basic images a bit we should be able to include the USB network, printer and local (non-shared) storage packages for the USB capable devices as device specific packages. I did have a bit of a look to see whether both WolfSSL and OpenSSL were both being pulled into the base rootfs, which would be a space killer, but I couldn't see that that had happened (it might have happened in the "large" devices but I haven't checked those).
There are also some kernel config options that perhaps could be looked at, for the 8MB image cases at least, to get some more space savings - particularly those listed as "default y if !SMALL_FLASH" in config/OpenWrt's Config-kernel.in.
As part of this I played with creating a diffconfig which seemed to work pretty well and would seem to me to get a bit closer to your Config.in idea than the current profile specific config approach. Some tweaks to the Gargoyle package and/or perhaps a meta package or two to group base package collections (particularly for USB device support, e.g. the MBIM etc modem support, and the iPhone tethering support) might make it easier to maintain longer term. A diffconfig also has the potential to be a bit more flexible in the custom target, where changing the target architecture usually seems to trigger a loss of the selected packages :-( - being able to specify "make custom.
Ultimately it may be more appropriate to split my consolidated generic profile as in this first patch to two: a "generic" (for devices with constrained flash space) and a "generic large" (for devices with plenty of flash space), which would give more latitude for space saving measures on the constrained devices without compromising performance on the others.
BTW, the ramips mt76x8 target 8MB flash devices seem to be a little more compact than the ath79 8MB images, but it's not a huge difference (about 500kB) so any decisions about the ath79 issues would likely flow through to that profile (and the other ramips profiles with 8MB flash devices too).
Oops... 2 clarifications/corrections to the 3rd last para of previous comment:
I've also attached a basic ath79 root fs squashfs image (no device specific packages) for analysis. ath79_rootfs.zip
I've now tested the gl-ar150 image from this config successfully with a Huawei E3372 4G modem as the WAN.
Yes, while it works it isn't pretty :-(
Meta packages (i.e. packages that just exist to pull in groups of other packages) was an idea I had to considerably simplify that aspect, but I have no idea whether such could be implemented in the gpkg/opkg framework - my googling only turned up a couple of vague references; if the functionality exists there may be another term for it in OpenWrt's lexicon?
Another approach that occurs to me is defining a couple of extended variants of the Gargoyle package in the package Makefile with the extra dependencies... Not sure of the full implications of that though.
One other thing I've noticed: the iPhone tethering support appears to add about 450kB to the root squashfs size when included in an image - it looks to me that this is mostly due to pulling in libxml2 as a dependency :-(
I haven't had much time for this sorry and i'm away this weekend. I'm proposing something like the following:
diff --git a/build.sh b/build.sh
index b650e312..cdbe6849 100755
--- a/build.sh
+++ b/build.sh
@@ -8,6 +8,7 @@ set_constant_variables()
top_dir="${scriptpath%/${0##*/}}"
targets_dir="$top_dir/targets"
patches_dir="$top_dir/patches-generic"
+ files_dir="$top_dir/files-generic"
compress_js_dir="$top_dir/compressed_javascript"
compress_css_dir="$top_dir/compressed_css"
@@ -654,6 +655,8 @@ for target in $targets ; do
#build, if verbosity is 0 dump most output to /dev/null, otherwise dump everything
if [ "$verbosity" = "0" ] ; then
+ cp -r "$files_dir/." .
+ cp -r "$targets_dir/$target/files/." .
scripts/patch-kernel.sh . "$patches_dir/" >/dev/null 2>&1
scripts/patch-kernel.sh . "$targets_dir/$target/patches/" >/dev/null 2>&1
if [ "$target" = "custom" ] ; then
@@ -671,6 +674,8 @@ for target in $targets ; do
make $num_build_thread_str GARGOYLE_VERSION="$numeric_gargoyle_version" GARGOYLE_VERSION_NAME="$lower_short_gargoyle_version" GARGOYLE_PROFILE="$default_profile"
else
+ cp -r "$files_dir/." .
+ cp -r "$targets_dir/$target/files/." .
scripts/patch-kernel.sh . "$patches_dir/"
scripts/patch-kernel.sh . "$targets_dir/$target/patches/"
if [ "$target" = "custom" ] ; then
diff --git a/rebuild.sh b/rebuild.sh
index cdcf4490..1afd9cf1 100755
--- a/rebuild.sh
+++ b/rebuild.sh
@@ -8,6 +8,7 @@ set_constant_variables()
targets_dir="$top_dir/targets"
patches_dir="$top_dir/patches-generic"
+ files_dir="$top_dir/files-generic"
compress_js_dir="$top_dir/compressed_javascript"
compress_css_dir="$top_dir/compressed_css"
With files-generic being a new folder at the root level, containing another folder called config, and a file inside called Config-gargoyle.in with the following contents:
# Copyright (C) 2022 Gargoyle-Router.com
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
menu "Gargoyle packages choice shortcut"
config GARGOYLE_BASIC_PACKAGES
bool "Select basic packages"
select PACKAGE_gargoyle
select PACKAGE_gargoyle-i18n
select PACKAGE_plugin-gargoyle-i18n-English-EN
select PACKAGE_bwmon-gargoyle
select PACKAGE_ddns-gargoyle
select PACKAGE_ewget
select PACKAGE_gargoyle-firewall-util
select PACKAGE_gargoyle-ip-query
select PACKAGE_qos-gargoyle
select PACKAGE_webmon-gargoyle
select PACKAGE_plugin-gargoyle-ddns
select PACKAGE_plugin-gargoyle-qos
select PACKAGE_plugin-gargoyle-upnp
select PACKAGE_plugin-gargoyle-wol
select BUSYBOX_CUSTOM
select BUSYBOX_CONFIG_ARPING
select BUSYBOX_CONFIG_SHA1SUM
help
Choose basic packages.
menu "Select VPN"
config GARGOYLE_OPENVPN
bool "Support OpenVPN"
select PACKAGE_openvpn-gargoyle-openssl
select PACKAGE_openvpn-gargoyle-easy-rsa
select OPENVPN_gargoyle_openssl_ENABLE_LZO
select OPENVPN_gargoyle_openssl_ENABLE_LZ4
select OPENVPN_gargoyle_openssl_ENABLE_SERVER
select OPENVPN_gargoyle_openssl_ENABLE_HTTP
select OPENVPN_gargoyle_openssl_ENABLE_SOCKS
select OPENVPN_gargoyle_openssl_ENABLE_FRAGMENT
select OPENVPN_gargoyle_openssl_ENABLE_MULTIHOME
select OPENVPN_gargoyle_openssl_ENABLE_PORT_SHARE
select OPENVPN_gargoyle_openssl_ENABLE_DEF_AUTH
select OPENVPN_gargoyle_openssl_ENABLE_PF
select OPENVPN_gargoyle_openssl_ENABLE_SMALL
select PACKAGE_plugin-gargoyle-openvpn
select PACKAGE_libopenssl
help
Choose packages to support openvpn.
config GARGOYLE_WIREGUARD
bool "Support WireGuard"
select PACKAGE_wireguard-tools
select PACKAGE_plugin-gargoyle-wireguard
help
Choose packages to support wireguard.
config GARGOYLE_TOR
bool "Support Tor"
select PACKAGE_plugin-gargoyle-tor
help
Choose packages to support tor.
endmenu
config GARGOYLE_USB
bool "Support basic USB functions"
select PACKAGE_plugin-gargoyle-usb-storage-noshare
help
Choose packages to support basic USB storage.
config GARGOYLE_USB_EXTRAS
bool "Support extra USB functions"
select PACKAGE_plugin-gargoyle-minidlna
select PACKAGE_plugin-gargoyle-usb-printer
select PACKAGE_plugin-gargoyle-webcam
help
Choose packages to support USB functions like media servers and printers.
config GARGOYLE_NETWORK_SHARING
bool "Support USB Network Shares"
select PACKAGE_plugin-gargoyle-usb-storage-full
help
Choose packages to support USB network shares.
endmenu
Something like this will allow the per device package selection to be boiled down to several high level key options. I don't know to what level of dependency recursion is supported here, whether all dependent packages need to be selected or whether it resolves it on its own. Thoughts?
Also, this files-generic implementation allows for the build system to pass in a files folder which is used in OpenWrt typically for providing verbatim config files. e.g. https://openwrt.org/docs/guide-developer/toolchain/use-buildsystem#custom_files
No probs about time delay...
I tried to test the Config-gargoyle.in in a manually created "make custom" environment, but when I run make menuconfig, I'm getting recursive dependency errors:
tmp/.config-package.in:1448:error: recursive dependency detected!
tmp/.config-package.in:1448: symbol PACKAGE_gargoyle depends on PACKAGE_kmod-ipt-core
tmp/.config-package.in:14542: symbol PACKAGE_kmod-ipt-core is selected by PACKAGE_kmod-ebtables
tmp/.config-package.in:14324: symbol PACKAGE_kmod-ebtables is selected by PACKAGE_ebtables
tmp/.config-package.in:67492: symbol PACKAGE_ebtables is selected by PACKAGE_gargoyle-firewall-util
tmp/.config-package.in:80940: symbol PACKAGE_gargoyle-firewall-util is selected by PACKAGE_gargoyle
For a resolution refer to Documentation/kbuild/kconfig-language.rst
subsection "Kconfig recursive dependency limitations"
tmp/.config-package.in:84851:error: recursive dependency detected!
tmp/.config-package.in:84851: symbol PACKAGE_samba36-server depends on PACKAGE_ksmbd-server
tmp/.config-package.in:67239: symbol PACKAGE_ksmbd-server depends on PACKAGE_samba36-server
For a resolution refer to Documentation/kbuild/kconfig-language.rst
subsection "Kconfig recursive dependency limitations"
After this menuconfig didn't show the Gargoyle shortcut menu (that I could find anyway).
I wondered about the "CONFLICTS=' defined in both the ksmbd-server and samba-server packages and tried removing them with no apparent effect.
I got lost in the maze of package dependencies for kmod-ipt-core but tried removing any "select" in Config-gargoyle.in for packages declared as dependencies in the gargoyle package, also with no apparent effect.
I've attached the generated .config-package.in in case it proves helpful when you get a chance to look at this: tmp_config-package.in.zip
Those errors have been in for a while and not caused by the new config.in (afaik).
Ok then, but shouldn't there be a menu item (i.e. "Gargoyle packages choice shortcut")? Searching for the top level symbols (e.g. GARGOYLE_USB) doesn't find anything either. It looks to me like Config-gargoyle.in isn't being processed.
Ah sorry I didn't include the patch to *-src/Config.in. The syntax should be straightforward
Had a chance to play with this a little more and now have the menu items appearing in custom menuconfig. They appear to work as would be expected for selecting packages in a custom image.
I then tried inserting the GARGOYLE_??? symbols into device default package specs, having created and built test ath79 profile with the GARGOYLE_BASIC_PACKAGES selected (so that symbol wouldn't be needed in the device default package specs) - e.g.
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_glinet_gl-ar150="GARGOYLE_USB_EXTRAS"
Is that how you expected to do this?
Anyway, building with the symbols inserted succeeded however the images created didn't have the extra packages included :-(.
Yes that's what I had hoped. That is a shame. :( It looks like it can only select packages not config items and technically these are classed as config. Back to square 1.
I still think these meta configs are worth including so I might finish it off but not useful for solving this.
I think these meta configs definitely appear to have value in the make custom scenario - in fact could you go as far as not even needing a base config copied to custom-src? Just make defconfig; make menuconfig? Especially if the basic package selection was defaulted to y... Seems to me that anything we can do to make "make custom" an easier way to get a satisfactory device image would be helpful.
I'll have a bit of a play with specialised variants of the gargoyle package to see if that would help simplify the device recipes (similar to the way the wpad package provides wpad-basic, wpad-openssl etc) along the lines hoped for with the meta configs, using dependency groupings such as basic, usb and large (roughly aligned with the default, ath10k/usb and ath10k_large/usb_large ath79 profiles respectively). One possible downside of this would be extra references in the menuconfig but those might also be useful for make custom users anyway...
I've been able to implement a set of pure meta packages that reflect the package collections of the default, usb/ath10k and usb_large/ath10k_large ath79 profiles. As implemented, each device's "DEVICE_PACKAGES" value is set to include 1 of the 3 meta packages - i.e. "gargoyle-basic", "gargoyle-usb" or "gargoyle-large" depending on the device profile. This compiles and builds and the resulting images are roughly the same size as the images from the structure proposed in this PR, but I've not tried to smoke test on a device yet (I only have a couple of large profile ath79 devices I can test on, no default or usb profile devices). For the other architectures, I'd expect that all mvebu, ipq806x and x86 devices would map to "gargoyle-large", ramips have all 3 types and I think the remaining architectures are probably all "gargoyle-basic". Of the architectures I hope to add support for, ramips/mt76x8 has usb and large types, ipq40xx and bc27xx are all large.
The implementation I now have uses a new OpenWrt/Gargoyle package structure ("gargoyle-profiles" for want of imagination) but I think it possible to shoehorn the meta packages into the "gargoyle" package. If that approach can be made to work, would the preference be for default profile devices to have an empty "DEVICE_PACKAGES" or have "gargoyle-basic" as above? Philosophically I like the "gargoyle-basic" value as it makes clear what the device is capable of, but it's not my project; if it's not preferred the gargoyle package dependencies might need to include the extra packages or stick with setting the minimum required packages to "y" rather than "m" in the config file.
If there's any other feedback about this general approach I'd appreciate it before I try and battle OpenWrt's byzantine GNU make package building system further (I haven't found any meta-package documentation and only a few examples to date; how some of these examples actually function is beyond my comprehension so far :-().
On the topic of images sizes for the 8MB devices, I've experimented with SquashFS block size - 512kB generally saves about 200-300kB over 256kB, 1024kB doesn't seem to get much more...
Hey mate, have you pushed these changes? I'd love to take a look. The concept sounds great! I'm out of the country for a few weeks so I won't look until end of November.
I agree on the gargoyle-basic being a minimum set and needing to be specified for each profile rather than just implicit.
meta-package changes pushed ("all supported devices" in commit msg of b47e49a should be "all supported devices except Routerstations" as these are still in the unchanged routerstation profile).
The SquashFS block size change got images for another device (WNDR-3700) built, but I need to check whether there are any others from the old usb profile still being dropped.
Great! That's looking way better. Now there's still a need for different profiles for subtype changes right? E.g. NAND in ar71xx (and ath79?), and the different cpu arch's in ramips for example. I'm sure they could be unified but that may not be worth the effort and may in fact make it more complicated.
I'll give this another look over when i get back in front of a computer but I'll likely merge it at that point. Then I may look at reduction of the config files down to a diffconfig rather than the full files.
@aimacintyre I've had a proper look at this. Very promising. I did have a query on the ath10k devices, you haven't specifically included the wifi firmware/drivers for each device. Is this an oversight in merging the profiles?
My understanding is that the default wifi firmware/driver packages are pulled in by the device recipes in the OpenWrt profile makefile, so they don't need to be declared specifically in the config device packages lists or the Gargoyle meta-packages. In fact, the config device packages list is just added to the device packages declared in the device recipes, which is why the wpad-basic-wolfssl "default" config line had to be set to "m"; the alternative was to have each device package list have a "-wpad-basic-wolfssl" entry to stop it getting included and clashing with wpad-openssl pulled in by the gargoyle package.
In fact I wondered why you did this in the ipq806x config because I never needed to do this (or in ipq40xx either).
Edit: I've just verified in my ath79 test build that ath10k packages are being pulled into the device specific SquashFS despite the lack of explicit declaration.
Thanks, learned something :)
There's something not right. The package definitions aren't being picked up in my build environment. If i run a defconfig, it removes the packages from the config file because it can't detect them.
make FULL_BUILD=true x86.x64
# wait until it finishes patching kernel/iptables, then kill build
./dev-utils/run_all_defconfig x86-src
resulting config files don't pick up the profiles items, and the ath79 ones have it removed. It also cleans up a bunch of things from your config file which i assume were brought in by a feeds install?
include $(TOPDIR)/rules.mk
PKG_NAME:=gargoyle-profiles
PKG_VERSION:=1.0.0
PKG_RELEASE:=1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/gargoyle-profiles/Default
CATEGORY:=Administration
SECTION:=admin
TITLE:=Gargoyle device profile -
MAINTAINER:=Eric Bishop <eric@gargoyle-router.com>
DEPENDS:= +gargoyle +gargoyle-i18n +plugin-gargoyle-i18n-English-EN \
+qos-gargoyle +plugin-gargoyle-qos \
+ddns-gargoyle +plugin-gargoyle-ddns \
+plugin-gargoyle-wol \
+ewget +relayd
endef
define Package/gargoyle-profiles/description/Default
A user-friendly web interface for OpenWrt
endef
define Package/gargoyle-basic
$(call Package/gargoyle-profiles/Default)
TITLE+= basic functionality
endef
define Package/gargoyle-basic/description
$(call Package/gargoyle-profiles/description/Default)
.
This meta package contains only the dependencies required for
basic Gargoyle functionality.
endef
define Package/gargoyle-basic/install
/bin/true
endef
define Package/gargoyle-usb
$(call Package/gargoyle-profiles/Default)
TITLE+= basic functionality, USB local storage, USB networking
DEPENDS+= +plugin-gargoyle-usb-storage-noshare
endef
define Package/gargoyle-usb/description
$(call Package/gargoyle-profiles/description/Default)
.
This meta package contains only the dependencies required for
basic Gargoyle functionality plus USB local storage and USB
network devices.
endef
define Package/gargoyle-usb/install
/bin/true
endef
define Package/gargoyle-large
$(call Package/gargoyle-profiles/Default)
TITLE+= full functionality
DEPENDS+= +plugin-gargoyle-usb-storage-full +plugin-gargoyle-minidlna \
+plugin-gargoyle-usb-printer +plugin-gargoyle-webcam \
+openvpn-gargoyle-openssl +plugin-gargoyle-openvpn \
+openvpn-gargoyle-easy-rsa +plugin-gargoyle-tor \
+wireguard-tools +plugin-gargoyle-wireguard \
+plugin-gargoyle-ipheth-tether
endef
define Package/gargoyle-large/description
$(call Package/gargoyle-profiles/description/Default)
.
This meta package contains only the dependencies required for
full Gargoyle functionality.
endef
define Package/gargoyle-large/install
/bin/true
endef
define Build/Compile
endef
define Build/Configure
endef
$(eval $(call BuildPackage,gargoyle-basic))
$(eval $(call BuildPackage,gargoyle-usb))
$(eval $(call BuildPackage,gargoyle-large))
This works. It's a tab vs space indentation issue i believe. Still, it isn't picked up as =m. Which means that every time i run a defconfig i'm going to need to manually set them again? I will run a test build tomorrow with them not set to check the impact but perhaps an issue.
The HIDDEN=1 was intended to keep them out of the menuconfig because I was thinking that you'd keep the Config_gargoyle.in setup for custom building as it's much more flexible; the gargoyle-profiles packages were intended (by me) to just be used in the predefined build profiles. With a diffconfig arrangement, the package=m lines are in the diffconfig and shouldn't need to be selected any other way, though I didn't get around to confirming that that worked as I expected as I went down rabbit holes looking at the image size issue (most of the 8MB ath79 -usb devices still aren't building final images even with these changes).
Edit: shouldn't have tried to reply earlier while short of time and away from build tooling, sorry.
With a diffconfig, the way I was envisaging would be that the necessary package=m lines would be added to the diffconfig and then when the make defconfig was executed the OpenWrt build system should carry that through if the packages exist. I'm a bit surprised that you had a package scanning problem, as my ath79 build setup wasn't reporting any issues - in that case I manually tweaked the config to add the package=m lines. I see from the Makefile you copied in that you've removed the HIDDEN:=1 references, so I would have expected the packages to show up in the make menuconfig as not selected and require selection; in a make defconfig generated .config I would expect the packages to appear as "is not set".
I've just checked a make defconfig in a custom-src directory with my "ath79 fix" branch checkout:
# CONFIG_PACKAGE_gargoyle-basic is not set
# CONFIG_PACKAGE_gargoyle-large is not set
# CONFIG_PACKAGE_gargoyle-usb is not set
My ath79 config changes were all made by creating the config through merging and tweaking the original 5 profile configs - I didn't go via the make custom method (though I tried that with your Config-gargoyle.in change, the generated config from which was useful to confirm the dependency package selections for the profile packages and parts of the config).
The arch-profile.buildinfo file that seems to get saved into the images/
ath79 diffconfig that replicates the current default config except for a few minor changes:
CONFIG_TARGET_ath79=y
CONFIG_TARGET_ath79_generic=y
CONFIG_TARGET_MULTI_PROFILE=y
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_buffalo_wzr-600dhp=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_buffalo_wzr-600dhp="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_buffalo_wzr-hp-ag300h=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_buffalo_wzr-hp-ag300h="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_buffalo_wzr-hp-g300nh-rb=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_buffalo_wzr-hp-g300nh-rb="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_buffalo_wzr-hp-g300nh-s=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_buffalo_wzr-hp-g300nh-s="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_buffalo_wzr-hp-g450h=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_buffalo_wzr-hp-g450h="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-505=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-505="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-825-b1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-825-b1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-825-c1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-825-c1="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-835-a1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-835-a1="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-842-c1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-842-c1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-842-c2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-842-c2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-842-c3=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-842-c3="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-859-a1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-859-a1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_engenius_eap300-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_engenius_eap300-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_glinet_gl-ar150=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_glinet_gl-ar150="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_glinet_gl-ar300m16=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_glinet_gl-ar300m16="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_glinet_gl-ar750=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_glinet_gl-ar750="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_jjplus_ja76pf2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_jjplus_ja76pf2="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndr3700=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndr3700="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndr3700-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndr3700-v2="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndr3800=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndr3800="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndr3800ch=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndr3800ch="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndrmac-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndrmac-v1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndrmac-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndrmac-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wnr2200-16m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wnr2200-16m="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wnr2200-8m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wnr2200-8m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_mr1750-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_mr1750-v1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_mr1750-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_mr1750-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_mr600-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_mr600-v1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_mr600-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_mr600-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_om2p-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_om2p-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_om2p-v4=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_om2p-v4="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_om5p=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_om5p="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_om5p-ac-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_om5p-ac-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_qxwlan_e1700ac-v2-16m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_qxwlan_e1700ac-v2-16m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_qxwlan_e1700ac-v2-8m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_qxwlan_e1700ac-v2-8m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_qxwlan_e600gac-v2-16m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_qxwlan_e600gac-v2-16m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_qxwlan_e600gac-v2-8m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_qxwlan_e600gac-v2-8m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c6-v2-us=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c6-v2-us="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-a7-v5=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-a7-v5="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c2-v3=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c2-v3="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c25-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c25-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c5-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c5-v1="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c58-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c58-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c59-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c59-v1="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c59-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c59-v2="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c6-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c6-v2="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c60-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c60-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c60-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c60-v2="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c60-v3=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c60-v3="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c7-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c7-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c7-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c7-v2="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c7-v4=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c7-v4="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c7-v5=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c7-v5="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wdr3600-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wdr3600-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wdr4300-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wdr4300-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr1043n-v5=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr1043n-v5="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr1043nd-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr1043nd-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr1043nd-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr1043nd-v2="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr1043nd-v3=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr1043nd-v3="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr1043nd-v4=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr1043nd-v4="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr2543-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr2543-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr710n-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr710n-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr710n-v2.1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr710n-v2.1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr810n-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr810n-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr810n-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr810n-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr842n-v3=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr842n-v3="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr842n-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr842n-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr842n-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr842n-v2="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr902ac-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr902ac-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_trendnet_tew-823dru=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_trendnet_tew-823dru="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_airrouter=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_airrouter="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_bullet-ac=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_bullet-ac="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_bullet-m-ar7240=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_bullet-m-ar7240="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_bullet-m-ar7241=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_bullet-m-ar7241="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_bullet-m-xw=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_bullet-m-xw="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_nanostation-m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_nanostation-m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_nanostation-m-xw=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_nanostation-m-xw="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_rocket-m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_rocket-m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_unifi=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_unifi="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_unifi-ap-outdoor-plus=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_unifi-ap-outdoor-plus="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_unifi-ap-pro=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_unifi-ap-pro="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_wd_mynet-n750=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_wd_mynet-n750="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_wd_mynet-wifi-rangeextender=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_wd_mynet-wifi-rangeextender="gargoyle-basic"
CONFIG_TARGET_PER_DEVICE_ROOTFS=y
CONFIG_TARGET_SQUASHFS_BLOCK_SIZE=512
CONFIG_BUSYBOX_CUSTOM=y
CONFIG_BUSYBOX_CONFIG_FEATURE_COMPRESS_USAGE=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_MMIN is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_SUID=y
# CONFIG_BUSYBOX_CONFIG_MONOTONIC_SYSCALL is not set
# CONFIG_BUSYBOX_CONFIG_SWAPOFF is not set
# CONFIG_BUSYBOX_CONFIG_SWAPON is not set
CONFIG_CLEAN_IPKG_PARTIAL=y
# CONFIG_KERNEL_AIO is not set
# CONFIG_KERNEL_CGROUPS is not set
# CONFIG_KERNEL_DEBUG_ATOMIC_SLEEP is not set
# CONFIG_KERNEL_DEBUG_INFO is not set
# CONFIG_KERNEL_DEBUG_KERNEL is not set
# CONFIG_KERNEL_DEBUG_VM is not set
# CONFIG_KERNEL_DETECT_HUNG_TASK is not set
# CONFIG_KERNEL_DEVPTS_MULTIPLE_INSTANCES is not set
# CONFIG_KERNEL_FANOTIFY is not set
# CONFIG_KERNEL_FHANDLE is not set
# CONFIG_KERNEL_IO_URING is not set
# CONFIG_KERNEL_KALLSYMS is not set
# CONFIG_KERNEL_KEYS is not set
# CONFIG_KERNEL_NAMESPACES is not set
# CONFIG_KERNEL_POSIX_MQUEUE is not set
CONFIG_KERNEL_PROC_STRIPPED=y
# CONFIG_KERNEL_SECCOMP is not set
# CONFIG_KERNEL_SOFTLOCKUP_DETECTOR is not set
# CONFIG_KERNEL_WQ_WATCHDOG is not set
CONFIG_KSMBD_SMB_INSECURE_SERVER=y
CONFIG_NFS_KERNEL_SERVER_V4=y
CONFIG_PACKAGE_ath10k-firmware-qca9887=m
CONFIG_PACKAGE_ath10k-firmware-qca9887-ct-full-htt=m
CONFIG_PACKAGE_ath10k-firmware-qca9888=m
CONFIG_PACKAGE_ath10k-firmware-qca9888-ct-full-htt=m
CONFIG_PACKAGE_ath10k-firmware-qca9888-ct-htt=m
CONFIG_PACKAGE_ath10k-firmware-qca988x=m
CONFIG_PACKAGE_ath10k-firmware-qca988x-ct-full-htt=m
CONFIG_PACKAGE_kmod-ath10k=m
CONFIG_PACKAGE_kmod-ath10k-smallbuffers=m
CONFIG_PACKAGE_kmod-gpio-button-hotplug=m
CONFIG_PACKAGE_bwmon-gargoyle=m
CONFIG_PACKAGE_ddns-gargoyle=m
CONFIG_PACKAGE_ewget=m
CONFIG_PACKAGE_gargoyle=y
CONFIG_PACKAGE_gargoyle-basic=m
CONFIG_PACKAGE_gargoyle-large=m
CONFIG_PACKAGE_gargoyle-usb=m
CONFIG_PACKAGE_gargoyle-firewall-util=m
CONFIG_PACKAGE_gargoyle-i18n=y
CONFIG_PACKAGE_gargoyle-ip-query=m
CONFIG_PACKAGE_gargoyle-mjpg-streamer=m
CONFIG_PACKAGE_gargoyle-tor=m
CONFIG_PACKAGE_gpkg=m
CONFIG_PACKAGE_openvpn-gargoyle-easy-rsa=m
CONFIG_PACKAGE_openvpn-gargoyle-openssl=m
CONFIG_PACKAGE_plugin-gargoyle-adblock=m
CONFIG_PACKAGE_plugin-gargoyle-cron=m
CONFIG_PACKAGE_plugin-gargoyle-ddns=m
CONFIG_PACKAGE_plugin-gargoyle-ddns-cloudflare=m
CONFIG_PACKAGE_plugin-gargoyle-diagnostics=m
CONFIG_PACKAGE_plugin-gargoyle-email-notifications=m
CONFIG_PACKAGE_plugin-gargoyle-email-notifications-nossl=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Arabic-AR=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Czech-CS=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-English-EN=y
CONFIG_PACKAGE_plugin-gargoyle-i18n-French-FR=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-German-DE=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Norwegian-NO=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Polish-PL=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Portuguese-BR=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Russian-RU=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-SimplifiedChinese-ZH-CN=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Slovak-SK=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Spanish-ES=m
CONFIG_PACKAGE_plugin-gargoyle-initd=m
CONFIG_PACKAGE_plugin-gargoyle-ipheth-tether=m
CONFIG_PACKAGE_plugin-gargoyle-logread=m
CONFIG_PACKAGE_plugin-gargoyle-minidlna=m
CONFIG_PACKAGE_plugin-gargoyle-openvpn=m
CONFIG_PACKAGE_plugin-gargoyle-ping-watchdog=m
CONFIG_PACKAGE_plugin-gargoyle-pptp=m
CONFIG_PACKAGE_plugin-gargoyle-qos=m
CONFIG_PACKAGE_plugin-gargoyle-qr-code=m
CONFIG_PACKAGE_plugin-gargoyle-spectrum-analyser=m
CONFIG_PACKAGE_plugin-gargoyle-spectrum-analyser-minimal=m
CONFIG_PACKAGE_plugin-gargoyle-stamgr=m
CONFIG_PACKAGE_plugin-gargoyle-theme-Gargoyle-Modern=m
CONFIG_PACKAGE_plugin-gargoyle-theme-by-matei=m
CONFIG_PACKAGE_plugin-gargoyle-theme-dark-one=m
CONFIG_PACKAGE_plugin-gargoyle-theme-demantoid=m
CONFIG_PACKAGE_plugin-gargoyle-theme-flat-blue=m
CONFIG_PACKAGE_plugin-gargoyle-theme-green=m
CONFIG_PACKAGE_plugin-gargoyle-theme-horchata=m
CONFIG_PACKAGE_plugin-gargoyle-theme-light=m
CONFIG_PACKAGE_plugin-gargoyle-theme-xeye=m
CONFIG_PACKAGE_plugin-gargoyle-tor=m
CONFIG_PACKAGE_plugin-gargoyle-upnp=m
CONFIG_PACKAGE_plugin-gargoyle-usb-printer=m
CONFIG_PACKAGE_plugin-gargoyle-usb-storage-full=m
CONFIG_PACKAGE_plugin-gargoyle-usb-storage-noshare=m
CONFIG_PACKAGE_plugin-gargoyle-webcam=m
CONFIG_PACKAGE_plugin-gargoyle-webshell=m
CONFIG_PACKAGE_plugin-gargoyle-wifi-schedule=m
CONFIG_PACKAGE_plugin-gargoyle-wireguard=m
CONFIG_PACKAGE_plugin-gargoyle-wol=m
CONFIG_PACKAGE_qos-gargoyle=y
CONFIG_PACKAGE_webmon-gargoyle=m
CONFIG_PACKAGE_msmtp=m
CONFIG_PACKAGE_msmtp-nossl=m
# CONFIG_PACKAGE_opkg is not set
# CONFIG_PACKAGE_wpad-basic-wolfssl is not set
CONFIG_PACKAGE_uboot-envtools=m
CONFIG_PACKAGE_libuclient=m
CONFIG_PACKAGE_uclient-fetch=m
CONFIG_PACKAGE_usteer=m
The above requires some extra dependencie which I've put in the gargoyle-profiles package Makefile although some of them might be better declared in other packages (e.g. ksmbd-utils might be better declared in the storage-full plugin?) - patch:
--- Makefile.orig 2022-12-11 18:09:12.413475291 +1100
+++ Makefile 2022-12-11 15:14:30.752466508 +1100
@@ -20,7 +20,8 @@
+qos-gargoyle +plugin-gargoyle-qos \
+ddns-gargoyle +plugin-gargoyle-ddns \
+plugin-gargoyle-wol \
- +ewget +relayd
+ +ewget +relayd +wpad-openssl +kmod-ipt-nat6 +kmod-ipt-raw6 \
+ +kmod-nf-nat6 +ip6tables-mod-nat +usteer
endef
define Package/gargoyle-profiles/description/Default
@@ -30,7 +31,6 @@
define Package/gargoyle-basic
$(call Package/gargoyle-profiles/Default)
TITLE+= basic functionality
- HIDDEN:=1
endef
define Package/gargoyle-basic/description
@@ -48,7 +48,6 @@
$(call Package/gargoyle-profiles/Default)
TITLE+= basic functionality, USB local storage, USB networking
DEPENDS+= +plugin-gargoyle-usb-storage-noshare
- HIDDEN:=1
endef
define Package/gargoyle-usb/description
@@ -71,8 +70,7 @@
+openvpn-gargoyle-openssl +plugin-gargoyle-openvpn \
+openvpn-gargoyle-easy-rsa +plugin-gargoyle-tor \
+wireguard-tools +plugin-gargoyle-wireguard \
- +plugin-gargoyle-ipheth-tether
- HIDDEN:=1
+ +plugin-gargoyle-ipheth-tether +ksmbd-utils
endef
define Package/gargoyle-large/description
Based on the above, the following untested diffconfig might be a useful starting point for the x86-64 profile:
CONFIG_TARGET_x86=y
CONFIG_TARGET_x86_64=y
CONFIG_TARGET_MULTI_PROFILE=y
CONFIG_TARGET_DEVICE_x86_64_DEVICE_generic=y
CONFIG_TARGET_DEVICE_PACKAGES_x86_64_DEVICE_generic="gargoyle-large"
CONFIG_TARGET_PER_DEVICE_ROOTFS=y
CONFIG_GRUB_BAUDRATE=38400
CONFIG_BUSYBOX_CUSTOM=y
CONFIG_BUSYBOX_CONFIG_FEATURE_COMPRESS_USAGE=y
# CONFIG_BUSYBOX_CONFIG_FEATURE_FIND_MMIN is not set
CONFIG_BUSYBOX_CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y
CONFIG_BUSYBOX_CONFIG_FEATURE_SUID=y
# CONFIG_BUSYBOX_CONFIG_MONOTONIC_SYSCALL is not set
# CONFIG_BUSYBOX_CONFIG_SWAPOFF is not set
# CONFIG_BUSYBOX_CONFIG_SWAPON is not set
CONFIG_CLEAN_IPKG_PARTIAL=y
# CONFIG_KERNEL_AIO is not set
# CONFIG_KERNEL_CGROUPS is not set
# CONFIG_KERNEL_DEBUG_ATOMIC_SLEEP is not set
# CONFIG_KERNEL_DEBUG_INFO is not set
# CONFIG_KERNEL_DEBUG_KERNEL is not set
# CONFIG_KERNEL_DEBUG_VM is not set
# CONFIG_KERNEL_DETECT_HUNG_TASK is not set
# CONFIG_KERNEL_DEVPTS_MULTIPLE_INSTANCES is not set
# CONFIG_KERNEL_FANOTIFY is not set
# CONFIG_KERNEL_FHANDLE is not set
# CONFIG_KERNEL_IO_URING is not set
# CONFIG_KERNEL_KALLSYMS is not set
# CONFIG_KERNEL_KEYS is not set
# CONFIG_KERNEL_NAMESPACES is not set
# CONFIG_KERNEL_POSIX_MQUEUE is not set
CONFIG_KERNEL_PROC_STRIPPED=y
# CONFIG_KERNEL_SECCOMP is not set
# CONFIG_KERNEL_SOFTLOCKUP_DETECTOR is not set
# CONFIG_KERNEL_WQ_WATCHDOG is not set
CONFIG_KSMBD_SMB_INSECURE_SERVER=y
CONFIG_NFS_KERNEL_SERVER_V4=y
CONFIG_PACKAGE_bwmon-gargoyle=m
CONFIG_PACKAGE_ddns-gargoyle=m
CONFIG_PACKAGE_ewget=m
CONFIG_PACKAGE_gargoyle=y
CONFIG_PACKAGE_gargoyle-basic=m
CONFIG_PACKAGE_gargoyle-large=m
CONFIG_PACKAGE_gargoyle-usb=m
CONFIG_PACKAGE_gargoyle-firewall-util=m
CONFIG_PACKAGE_gargoyle-i18n=y
CONFIG_PACKAGE_gargoyle-ip-query=m
CONFIG_PACKAGE_gargoyle-mjpg-streamer=m
CONFIG_PACKAGE_gargoyle-tor=m
CONFIG_PACKAGE_gpkg=m
CONFIG_PACKAGE_openvpn-gargoyle-easy-rsa=m
CONFIG_PACKAGE_openvpn-gargoyle-openssl=m
CONFIG_PACKAGE_plugin-gargoyle-adblock=m
CONFIG_PACKAGE_plugin-gargoyle-cron=m
CONFIG_PACKAGE_plugin-gargoyle-ddns=m
CONFIG_PACKAGE_plugin-gargoyle-ddns-cloudflare=m
CONFIG_PACKAGE_plugin-gargoyle-diagnostics=m
CONFIG_PACKAGE_plugin-gargoyle-email-notifications=m
CONFIG_PACKAGE_plugin-gargoyle-email-notifications-nossl=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Arabic-AR=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Czech-CS=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-English-EN=y
CONFIG_PACKAGE_plugin-gargoyle-i18n-French-FR=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-German-DE=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Norwegian-NO=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Polish-PL=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Portuguese-BR=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Russian-RU=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-SimplifiedChinese-ZH-CN=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Slovak-SK=m
CONFIG_PACKAGE_plugin-gargoyle-i18n-Spanish-ES=m
CONFIG_PACKAGE_plugin-gargoyle-initd=m
CONFIG_PACKAGE_plugin-gargoyle-ipheth-tether=m
CONFIG_PACKAGE_plugin-gargoyle-logread=m
CONFIG_PACKAGE_plugin-gargoyle-minidlna=m
CONFIG_PACKAGE_plugin-gargoyle-openvpn=m
CONFIG_PACKAGE_plugin-gargoyle-ping-watchdog=m
CONFIG_PACKAGE_plugin-gargoyle-pptp=m
CONFIG_PACKAGE_plugin-gargoyle-qos=m
CONFIG_PACKAGE_plugin-gargoyle-qr-code=m
CONFIG_PACKAGE_plugin-gargoyle-spectrum-analyser=m
CONFIG_PACKAGE_plugin-gargoyle-spectrum-analyser-minimal=m
CONFIG_PACKAGE_plugin-gargoyle-stamgr=m
CONFIG_PACKAGE_plugin-gargoyle-theme-Gargoyle-Modern=m
CONFIG_PACKAGE_plugin-gargoyle-theme-by-matei=m
CONFIG_PACKAGE_plugin-gargoyle-theme-dark-one=m
CONFIG_PACKAGE_plugin-gargoyle-theme-demantoid=m
CONFIG_PACKAGE_plugin-gargoyle-theme-flat-blue=m
CONFIG_PACKAGE_plugin-gargoyle-theme-green=m
CONFIG_PACKAGE_plugin-gargoyle-theme-horchata=m
CONFIG_PACKAGE_plugin-gargoyle-theme-light=m
CONFIG_PACKAGE_plugin-gargoyle-theme-xeye=m
CONFIG_PACKAGE_plugin-gargoyle-tor=m
CONFIG_PACKAGE_plugin-gargoyle-upnp=m
CONFIG_PACKAGE_plugin-gargoyle-usb-printer=m
CONFIG_PACKAGE_plugin-gargoyle-usb-storage-full=m
CONFIG_PACKAGE_plugin-gargoyle-usb-storage-noshare=m
CONFIG_PACKAGE_plugin-gargoyle-webcam=m
CONFIG_PACKAGE_plugin-gargoyle-webshell=m
CONFIG_PACKAGE_plugin-gargoyle-wifi-schedule=m
CONFIG_PACKAGE_plugin-gargoyle-wireguard=m
CONFIG_PACKAGE_plugin-gargoyle-wol=m
CONFIG_PACKAGE_qos-gargoyle=y
CONFIG_PACKAGE_webmon-gargoyle=m
CONFIG_PACKAGE_msmtp=m
CONFIG_PACKAGE_msmtp-nossl=m
# CONFIG_PACKAGE_opkg is not set
# CONFIG_PACKAGE_wpad-basic-wolfssl is not set
CONFIG_PACKAGE_libuclient=m
CONFIG_PACKAGE_uclient-fetch=m
CONFIG_PACKAGE_usteer=m
BTW, the buildinfo files seem to contain a lot of duplicate lines - a sort -u
or similar to remove them seems required before looking to massage them into usable diffconfigs.
Thanks, let me work through some of this. I've got a few weeks over the christmas holidays so i'll get this finalised and bring back in the menu items i had before. I found another bug I went down a rabbit hole chasing and couldn't figure it out, a waste of a few weeks. To be revisited anyway.
@aimacintyre looking at several parts of the build, i'm not confident that a diffconfig approach can be supported easily. There are many scripts and injection points that require to be running on a full config file. There is also the matter of patching in the kernel modules, which until that is done any defconfig operation will kill them from the file. At this stage, i'm going to rule out the diffconfig approach.
The only irk I have now (after the last 2 commits) is that if you don't =m the profile meta packages, all images end up the same (i.e. the smallest config possible). This coupled with defconfig removing them is more overhead than I am comfortable with.
I believe the solution is the introduction of an additional devices file at the targets/ath79/profiles/default/ level which maps each device to a profile. A dev-utils script can then be run which will modify the config file and set each device to the appropriate profile, and ensure that the meta packages are set to =m. It's still a bit annoying, but it's a compromise. Any thoughts?
I don't think I understand your vision here very well and I don't know the Gargoyle build system well enough at this point to comment thoroughly, but I think that you might be overlooking some of the flexibility and power of adopting the diffconfig approach.
1) the diffconfig file is just a stripped down .config that only need contain settings you want to control (i.e. set to y, m or unset) in the final .config so it's a lot easier to maintain than the full config file, and each target/profile would still have it's own diffconfig file (it could be named config
, the same as the current profile .config)
2) .config patches (e.g. any netfilter ones) can probably be built directly into the diffconfig file without having to continually patch the final .config
3) ops like the internationalisation patching can still be done on the diffconfig file when required - the diffconfig just needs to contain the bits that might need patching
4) it seems to me that a diffconfig can be mutated into the final .config by using make defconfig
at the point in build.sh (haven't looked at rebuild.sh yet) where the netfilter patching is currently done (and make menuconfig
is used in the "custom" case); a make defconfig
may be required before the make menuconfig
in the "custom" case if a diffconfig were to be used for that (I haven't checked this).
In any case, given the other patching (like the netfilter patching) being done, it seems to me a very minor additional patching step to guarantee that the packages are available, but that's in the eye of the beholder. It wasn't my expectation that the profile packages be used in all targets/profiles - just the ones where it made sense and streamlined the handling of a range of device capabilities in one profile rather than requiring multiple profiles that required nearly all exactly the same binary packages (ath79 being the extreme example with 5 almost perfectly identical sets of packages being built with the original structure, but ramips also ends up with some duplicate package sets). The approach works well within the scope of my expectations, but doesn't seem to fit quite as well within the scope of what I think you're envisaging.
Hmmm... Having written all that, browsing the OpenWrt package wiki pages again lead me to config options in packages. I'm wondering if the Kconfig language might be capable of setting the profile packages as "m" by default somehow... I'll give this some thought and experimentation next week while work is shut down.
I don't have a particular vision except for minimal overhead on maintaining the config files. I'm notoriously lazy and I'll omit the meta packages repeatedly. Need to code over my own character flaws 😀
Play this out for me in theory We switch to storing diffconfigs They're injected into the src folder here: https://github.com/ericpaulbishop/gargoyle/blob/base_on_openwrt_2102/build.sh#L584
If we are doing custom, the script here would fail (or at least not be useful) on a diffconfig, so it would need to be expanded before this step. https://github.com/ericpaulbishop/gargoyle/blob/master/dev-utils/set_config_custom_target.sh#L15
So we have to expand it immediately after copying it in. If we expand it then, any packages missing (including the netfilter patches, and openwrt package feeds if using custom) will be dropped.
On further study the i18n scripts will probably work fine. They may not be a problem here.
So really you need to defconfig here https://github.com/ericpaulbishop/gargoyle/blob/base_on_openwrt_2102/build.sh#L635
And rewrite the custom target script to blindly insert the requested target from the user.
Does this make sense? That's my read on the complications.
And lastly every time I run a diffconfig and the meta packages get switched off. So setting them by default or forcing them. Both of these come with complications around users customising the config file. Maybe it's not a use case that needs to be supported.
The defconfig would seem to be required before the make prereq
at https://github.com/ericpaulbishop/gargoyle/blob/base_on_openwrt_2102/build.sh#L649, because my incomplete understanding is that there are some prereqs that are target specific. This is thorny because it won't pick up the netfilter package changes.
My thoughts about that:
make prereq
?? in context I get the impression that checking for mkhash and only putting a simple message out isn't of much value - if it aborted the build I could see some value...make prereq
then the problem could be resolved by moving it to after the netfilter "patch OpenWrt" step (first netfilter_patch_script invocation) which would likely require some visibly extensive splitting and restructuring of the verbosity if structure to get the flow right without excessive duplication...make menuconfig
at https://github.com/ericpaulbishop/gargoyle/blob/base_on_openwrt_2102/build.sh#L664 (it's also possible that just defconfig'ing again there without restoring the backup would update the .config that already exists with the extra packages found? - needs testing).BTW, I think I have a Config-gargoyle.in patch that successfully sets the metapackages to "m" in the .config with defconfig - hope to push something in the next couple of days after some more testing. If it works as I expect, in the custom case you'd just have to select the one you wanted to build into the custom image with "y" and leave the other two as "m" (or remove them with "n" for the fussy, though that would drop the extra packages out of building if -large wasn't selected). If this works out, it might also be worth adding Config-gargoyle.in bits to set all optional plugins, themes and language translations as "m" too.
BTW 2: was the case difference between "GARGOYLE_large" and "GARGOYLE_BASIC"/"GARGOYLE_USB" deliberate in Config-gargoyle.in?
Config-gargoyle.in changes in pull request 960.
In my earlier comment I forgot to address the set_config_custom_target.sh
script - while it would need to be changed I still think it has a role in setting the target using a minimal diffconfig file to control some items that don't appear to be controllable from Config-gargoyle.in. If the 2nd patch in pull request 960 goes too far to be acceptable, the diffconfig would need to include the necessary references that are in that 2nd patch. This would still be effective though most of the "documentation" about what constitutes a Gargoyle build would be spread across 2 files rather than concentrated in one - either way I still think we will have advanced a fair bit in improving the maintainability of Gargoyle going forward.
Followup: things that a revised set_config_custom_target.sh
script could do:
do we really need that make prereq??
A while ago this became necessary. I don't know if it was a fault of the build system or not, but I could not hold a build without it. If testing reveals it is no longer necessary (again), then happy to drop it. Yes ideally it should abort the build. In practice, the build fails within 2 minutes of this anyway if mkhash doesn't exist.
BTW 2: was the case difference between "GARGOYLE_large" and "GARGOYLE_BASIC"/"GARGOYLE_USB" deliberate in Config-gargoyle.in?
Nope, just carelessness.
Additional idea for set_config_custom_target.sh
: if it specifies a target which already have at least one profile for, use the diffconfig from the first profile listed in that target's SUBTARGETS list (if it has one) rather than a default diffconfig - this would make it easier to preserve kernel and build settings in the custom run....
The following is my first scratch attempt. Internationalize seems to work fine (i need to test further language permutations). It brute force inserts a few things which it otherwise probably does not have to, but it's a safer and more consistent way of dealing with it.
I have not tested localize.
diff --git a/build.sh b/build.sh
index 2ded3686..8d878996 100755
--- a/build.sh
+++ b/build.sh
@@ -247,6 +247,34 @@ distrib_init ()
cp -fR "$top_dir/LICENSES" "$top_dir/Distribution/"
}
+loc_or_i18n ()
+{
+ local tgt="$1"
+ local actlang="$2"
+
+ [ ! -z $(which python 2>&1) ] && {
+ #finish internationalization by setting the target language & adding the i18n plugin to the config file
+ #finish localization just deletes the (now unnecessary) language packages from the config file
+ [ "$translation_type" = "localize" ] && "$top_dir/i18n-scripts/finalize_translation.py" 'localize' "$tgt" \
+ || "$top_dir/i18n-scripts/finalize_translation.py" 'internationalize' "$actlang" "$tgt"
+ } || {
+ #NOTE: localize is not supported because it requires python
+ "$top_dir/i18n-scripts/finalize_tran_ltd.sh" "$tgt-src" "$actlang"
+ }
+}
+
+set_custom_target ()
+{
+ local tgt="$1"
+ local dprof="$2"
+ local custtgt="$3"
+
+ #pre-set the target in a custom build (default target only)
+ if [ "$tgt" = "custom" ] && [ "$dprof" = "default" ] ; then
+ "$top_dir/dev-utils/set_config_custom_target.sh" "$custtgt" "$top_dir"
+ fi
+}
+
######################################################################################################
## Begin Main Body of Build Script ##
@@ -501,8 +529,6 @@ ln -s "$top_dir/downloaded" "$openwrt_src_dir/dl"
for target in $targets ; do
-
-
#remove old build files
rm -rf "$target-src"
if [ -z "$specified_profile" ] ; then
@@ -582,23 +608,6 @@ for target in $targets ; do
#copy this target configuration to build directory
cp "$targets_dir/$target/profiles/$default_profile/config" "$top_dir/${target}-src/.config"
-
- #pre-set the target in a custom build (default target only)
- if [ "$target" = "custom" ] && [ "$default_profile" = "default" ] ; then
- ./dev-utils/set_config_custom_target.sh "$custom_target"
- fi
-
-
- [ ! -z $(which python 2>&1) ] && {
- #finish internationalization by setting the target language & adding the i18n plugin to the config file
- #finish localization just deletes the (now unnecessary) language packages from the config file
- [ "$translation_type" = "localize" ] && "$top_dir/i18n-scripts/finalize_translation.py" 'localize' "$target" \
- || "$top_dir/i18n-scripts/finalize_translation.py" 'internationalize' "$active_lang" "$target"
- } || {
- #NOTE: localize is not supported because it requires python
- "$top_dir/i18n-scripts/finalize_tran_ltd.sh" "$target-src" "$active_lang"
- }
-
#if target is custom, checkout optional packages and copy all that don't
#share names with gargoyle-specific packages to build directory
@@ -653,12 +662,17 @@ for target in $targets ; do
scripts/patch-kernel.sh . "$targets_dir/$target/patches/" >/dev/null 2>&1
if [ "$target" = "custom" ] ; then
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 1 0 >/dev/null 2>&1
+ make defconfig
+ set_custom_target "$target" "$default_profile" "$custom_target"
+ loc_or_i18n "$target" "$active_lang"
make menuconfig
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 0 1 >/dev/null 2>&1
else
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 1 1 >/dev/null 2>&1
+ make defconfig
+ set_custom_target "$target" "$default_profile" "$custom_target"
+ loc_or_i18n "$target" "$active_lang"
fi
-
openwrt_target=$(get_target_from_config "./.config")
create_gargoyle_banner "$openwrt_target" "$profile_name" "$build_date" "$short_gargoyle_version" "$gargoyle_git_revision" "$branch_name" "$openwrt_abbrev_commit" "package/base-files/files/etc/banner" "."
@@ -672,13 +686,18 @@ for target in $targets ; do
scripts/patch-kernel.sh . "$targets_dir/$target/patches/"
if [ "$target" = "custom" ] ; then
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 1 0
+ make defconfig
+ set_custom_target "$target" "$default_profile" "$custom_target"
+ loc_or_i18n "$target" "$active_lang"
make menuconfig
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 0 1
else
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 1 1
+ make defconfig
+ set_custom_target "$target" "$default_profile" "$custom_target"
+ loc_or_i18n "$target" "$active_lang"
fi
-
openwrt_target=$(get_target_from_config "./.config")
create_gargoyle_banner "$openwrt_target" "$profile_name" "$build_date" "$short_gargoyle_version" "$gargoyle_git_revision" "$branch_name" "$openwrt_abbrev_commit" "package/base-files/files/etc/banner" "."
@@ -792,17 +811,8 @@ for target in $targets ; do
done
done
-
- [ ! -z $(which python 2>&1) ] && {
- #finish internationalization by setting the target language & adding the i18n plugin to the config file
- #finish localization just deletes the (now unnecessary) language packages from the config file
- [ "$translation_type" = "localize" ] && "$top_dir/i18n-scripts/finalize_translation.py" 'localize' "$target" \
- || "$top_dir/i18n-scripts/finalize_translation.py" 'internationalize' "$active_lang" "$target"
- } || {
- #NOTE: localize is not supported because it requires python
- "$top_dir/i18n-scripts/finalize_tran_ltd.sh" "$target-src" "$active_lang"
- }
-
+ make defconfig
+ loc_or_i18n "$target" "$active_lang"
openwrt_target=$(get_target_from_config "./.config")
create_gargoyle_banner "$openwrt_target" "$profile_name" "$build_date" "$short_gargoyle_version" "$gargoyle_git_revision" "$branch_name" "$openwrt_abbrev_commit" "package/base-files/files/etc/banner" "."
@@ -820,7 +830,6 @@ for target in $targets ; do
if [ "$verbosity" = "0" ] ; then
-
make $num_build_thread_str GARGOYLE_VERSION="$numeric_gargoyle_version" GARGOYLE_VERSION_NAME="$lower_short_gargoyle_version" GARGOYLE_PROFILE="$profile_name"
else
make $num_build_thread_str V=99 GARGOYLE_VERSION="$numeric_gargoyle_version" GARGOYLE_VERSION_NAME="$lower_short_gargoyle_version" GARGOYLE_PROFILE="$profile_name"
diff --git a/dev-utils/set_config_custom_target.sh b/dev-utils/set_config_custom_target.sh
index e2ae586e..27a79dee 100755
--- a/dev-utils/set_config_custom_target.sh
+++ b/dev-utils/set_config_custom_target.sh
@@ -1,17 +1,18 @@
#!/bin/sh
# this pre-sets the target for menuconfig - otherwise menuconfig seems to ignore all the preselected
-# packages that Gargoyle requires when saving. Only the default ar71xx target is commented out (target,
+# packages that Gargoyle requires when saving. Only the default ath79 target is commented out (target,
# subtarget & device) + new target (target only) commented in.
#
-# NOTE: this script assumes ar71xx is the active default target
+# NOTE: this script assumes ath79 is the active default target
target="$1"
+top_dir="$2"
echo "Setting $target as the custom build target platform in menuconfig"
-touch "custom-src/.config2"
+touch "$top_dir/custom-src/.config2"
-awk -v tgt="$target" '{ lines[x++] = $0 } END { for (y=0; y<=x;) { if (match(lines[y],"^CONFIG_TARGET_ar71xx")) { print "# " substr(lines[y], 1, length(lines[y]) - 2) " is not set"} else if (match(lines[y],"# CONFIG_TARGET_"tgt" is not set")) { print substr(lines[y], 3, length(lines[y]) - 13) "=y" } else print lines[y]; y++; } }' "custom-src/.config" >> "custom-src/.config2"
+awk -v tgt="$target" '{ lines[x++] = $0 } END { for (y=0; y<=x;) { if (match(lines[y],"^CONFIG_TARGET_ath79")) { print "# " substr(lines[y], 1, length(lines[y]) - 2) " is not set"} else if (match(lines[y],"# CONFIG_TARGET_"tgt" is not set")) { print substr(lines[y], 3, length(lines[y]) - 13) "=y" } else print lines[y]; y++; } }' "$top_dir/custom-src/.config" >> "$top_dir/custom-src/.config2"
-mv "custom-src/.config2" "custom-src/.config"
+mv "$top_dir/custom-src/.config2" "$top_dir/custom-src/.config"
diff --git a/files-generic/config/Config-gargoyle.in b/files-generic/config/Config-gargoyle.in
index df1a37e0..51497e7f 100644
--- a/files-generic/config/Config-gargoyle.in
+++ b/files-generic/config/Config-gargoyle.in
@@ -11,6 +11,7 @@ menuconfig USE_GARGOYLE_PROFILE_PKGS
select BUSYBOX_CONFIG_ARPING
select BUSYBOX_CONFIG_SHA1SUM
select PACKAGE_gargoyle
+ select PACKAGE_gargoyle-i18n
select PACKAGE_plugin-gargoyle-i18n-English-EN
if USE_GARGOYLE_PROFILE_PKGS
@@ -29,7 +30,7 @@ menuconfig USE_GARGOYLE_PROFILE_PKGS
help
Choose basic packages and those required to support USB functionality (but no network sharing).
- config GARGOYLE_large
+ config GARGOYLE_LARGE
tristate "Full Functionality"
default m
select PACKAGE_gargoyle-large
diff --git a/i18n-scripts/finalize_translation.py b/i18n-scripts/finalize_translation.py
index 137e10ea..9dd65f98 100755
--- a/i18n-scripts/finalize_translation.py
+++ b/i18n-scripts/finalize_translation.py
@@ -17,8 +17,8 @@ elif len(sys.argv) == 4 and sys.argv[1] == 'internationalize':
target_platform=sys.argv[3]
else:
sys.stderr.write('Usage: {} [localize|internationalize] $target_language $target_platform\n'.format(sys.argv[0]))
- sys.stderr.write(' example: {} internationalize English-EN ar71xx\n'.format(sys.argv[0]))
- sys.stderr.write(' example: {} localize ar71xx\n'.format(sys.argv[0]))
+ sys.stderr.write(' example: {} internationalize English-EN ath79\n'.format(sys.argv[0]))
+ sys.stderr.write(' example: {} localize ath79\n'.format(sys.argv[0]))
sys.exit(1)
#if localize, ensure hidden .config file is devoid of i18n
@@ -40,6 +40,7 @@ if os.path.exists(config_file):
found_lang=False
found_gi18n=False
found_haserl=False
+ found_haserli18n=False
i18n_section=0
for cline in cfg_doc:
anewline=''
@@ -53,6 +54,9 @@ if os.path.exists(config_file):
if cline.startswith('# CONFIG_PACKAGE_gargoyle-i18n is not set') and tran_type=='internationalize' :
anewline=cline[2:-12]+"=y\n"
found_gi18n=True
+ if cline.startswith('CONFIG_PACKAGE_gargoyle-i18n=m') and tran_type=='internationalize' :
+ anewline=cline[:-2]+"y\n"
+ found_gi18n=True
if cline.startswith('CONFIG_PACKAGE_gargoyle-i18n=y') and tran_type=='localize' :
anewline="# "+cline[:-3]+" is not set\n"
found_gi18n=True
@@ -67,6 +71,7 @@ if os.path.exists(config_file):
if cline.startswith('# CONFIG_PACKAGE_haserl-i18n is not set') and tran_type=='internationalize' :
anewline=cline[2:-12]+"=y\n"
+ found_haserli18n=True
if cline.startswith('CONFIG_PACKAGE_haserl=y') and tran_type=='internationalize' :
anewline='# '+cline[:-3]+" is not set\n"
if cline.startswith('CONFIG_PACKAGE_haserl=y') and tran_type=='localize' :
@@ -84,15 +89,26 @@ if os.path.exists(config_file):
if tran_type=='internationalize' and found_gi18n == False :
print('Warning: injecting gargoyle-i18n package into config file\n')
- garg_package=newcfg_doc.index("CONFIG_PACKAGE_gargoyle=y\n")
- newcfg_doc.insert(garg_package+1, 'CONFIG_PACKAGE_gargoyle-i18n=y\n')
+ garg_section=0
+ if "CONFIG_PACKAGE_gargoyle=y\n" in newcfg_doc:
+ garg_section=newcfg_doc.index("CONFIG_PACKAGE_gargoyle=y\n")
+ newcfg_doc.insert(garg_section+1, 'CONFIG_PACKAGE_gargoyle-i18n=y\n')
+ if tran_type=='internationalize' and found_haserli18n == False :
+ print('Warning: injecting haserl-i18n package into config file\n')
+ garg_section=0
+ if "# CONFIG_PACKAGE_haserl is not set\n" in newcfg_doc:
+ garg_section=newcfg_doc.index("# CONFIG_PACKAGE_haserl is not set\n")
+ newcfg_doc.insert(garg_section+1, 'CONFIG_PACKAGE_haserl-i18n=y\n')
if tran_type=='internationalize' and found_lang == False :
print('Warning: target language not present in config file\n')
if os.path.exists(g_base+'/package/plugin-gargoyle-i18n-'+target_lang+'/Makefile'):
if i18n_section < 15:
- i18n_section=newcfg_doc.index("CONFIG_PACKAGE_gargoyle=y\n")+1
+ if "CONFIG_PACKAGE_gargoyle=y\n" in newcfg_doc:
+ i18n_section=newcfg_doc.index("CONFIG_PACKAGE_gargoyle=y\n")+1
+ elif "CONFIG_PACKAGE_gargoyle-i18n=y\n" in newcfg_doc:
+ i18n_section=newcfg_doc.index("CONFIG_PACKAGE_gargoyle-i18n=y\n")+1
print(' Injecting target language {} into config file\n'.format(target_lang))
newcfg_doc.insert(i18n_section+1, 'CONFIG_PACKAGE_plugin-gargoyle-i18n-'+target_lang+'=y\n')
else:
@@ -101,8 +117,10 @@ if os.path.exists(config_file):
if tran_type=='localize' and found_haserl == False :
print('Warning: adding stock haserl into config file\n')
- haserl_package=newcfg_doc.index("# CONFIG_PACKAGE_haserl-i18n is not set\n")
- newcfg_doc.insert(haserl_package+1, 'CONFIG_PACKAGE_haserl=y\n')
+ haserl_section=0
+ if "# CONFIG_PACKAGE_haserl-i18n is not set\n" in newcfg_doc:
+ haserl_section=newcfg_doc.index("# CONFIG_PACKAGE_haserl-i18n is not set\n")
+ newcfg_doc.insert(haserl_section+1, 'CONFIG_PACKAGE_haserl=y\n')
cfg_fileFO = open(config_file, 'w')
diff --git a/rebuild.sh b/rebuild.sh
index 1afd9cf1..840623b3 100755
--- a/rebuild.sh
+++ b/rebuild.sh
@@ -236,6 +236,22 @@ distrib_init ()
cp -fR "$top_dir/LICENSES" "$top_dir/Distribution/"
}
+loc_or_i18n ()
+{
+ local tgt="$1"
+ local actlang="$2"
+
+ [ ! -z $(which python 2>&1) ] && {
+ #finish internationalization by setting the target language & adding the i18n plugin to the config file
+ #finish localization just deletes the (now unnecessary) language packages from the config file
+ [ "$translation_type" = "localize" ] && "$top_dir/i18n-scripts/finalize_translation.py" 'localize' "$tgt" \
+ || "$top_dir/i18n-scripts/finalize_translation.py" 'internationalize' "$actlang" "$tgt"
+ } || {
+ #NOTE: localize is not supported because it requires python
+ "$top_dir/i18n-scripts/finalize_tran_ltd.sh" "$tgt-src" "$actlang"
+ }
+}
+
######################################################################################################
## Begin Main Body of Build Script ##
@@ -542,17 +558,8 @@ for target in $targets ; do
done
done
-
- [ ! -z $(which python 2>&1) ] && {
- #finish internationalization by setting the target language & adding the i18n plugin to the config file
- #finish localization just deletes the (now unnecessary) language packages from the config file
- [ "$translation_type" = "localize" ] && "$top_dir/i18n-scripts/finalize_translation.py" 'localize' "$target" \
- || "$top_dir/i18n-scripts/finalize_translation.py" 'internationalize' "$active_lang" "$target"
- } || {
- #NOTE: localize is not supported because it requires python
- "$top_dir/i18n-scripts/finalize_tran_ltd.sh" "$target-src" "$active_lang"
- }
-
+ make defconfig
+ loc_or_i18n "$target" "$active_lang"
#enter build directory and make sure we get rid of all those pesky .svn files,
#and any crap left over from editing
@@ -577,7 +584,6 @@ for target in $targets ; do
create_gargoyle_banner "$openwrt_target" "$profile_name" "$build_date" "$short_gargoyle_version" "$gargoyle_git_revision" "$branch_name" "${openwrt_abbrev_commit}" "package/base-files/files/etc/banner" "."
if [ "$verbosity" = "0" ] ; then
make $num_build_thread_str GARGOYLE_VERSION="$numeric_gargoyle_version" GARGOYLE_VERSION_NAME="$lower_short_gargoyle_version" GARGOYLE_PROFILE="$default_profile"
-
else
make $num_build_thread_str V=99 GARGOYLE_VERSION="$numeric_gargoyle_version" GARGOYLE_VERSION_NAME="$lower_short_gargoyle_version" GARGOYLE_PROFILE="$default_profile"
fi
@@ -690,17 +696,8 @@ for target in $targets ; do
done
done
-
- [ ! -z $(which python 2>&1) ] && {
- #finish internationalization by setting the target language & adding the i18n plugin to the config file
- #finish localization just deletes the (now unnecessary) language packages from the config file
- [ "$translation_type" = "localize" ] && "$top_dir/i18n-scripts/finalize_translation.py" 'localize' "$target" \
- || "$top_dir/i18n-scripts/finalize_translation.py" 'internationalize' "$active_lang" "$target"
- } || {
- #NOTE: localize is not supported because it requires python
- "$top_dir/i18n-scripts/finalize_tran_ltd.sh" "$target-src" "$active_lang"
- }
-
+ make defconfig
+ loc_or_i18n "$target" "$active_lang"
openwrt_target=$(get_target_from_config "./.config")
create_gargoyle_banner "$openwrt_target" "$profile_name" "$build_date" "$short_gargoyle_version" "$gargoyle_git_revision" "$branch_name" "$openwrt_abbrev_commit" "package/base-files/files/etc/banner" "."
That all looks reasonable to me, though a couple of thoughts occur:
set_custom_target
needed in the non-custom case? I think this is best controlled by the profile specific diffconfig (which I believe will be required to at least set the devices and device profile meta-packages)?loc_or_i18n
is really only required for the custom case as the Config-gargoyle.in and diffconfig between them should guarantee this...make defconfig
directly on a copied diffconfig - I think this is likely to produce much better results long term.One philosophical question: in the context of current & future development of Gargoyle is it worth maintaining "localize"? The supported target builds are i18n and from what I've been able to make out dropping that doesn't seem to save much SquashFS space...
One stylistic suggestion for the build.sh changes: for the make defconfig step (only the verbose version shown here) in your patch as
scripts/patch-kernel.sh . "$targets_dir/$target/patches/"
if [ "$target" = "custom" ] ; then
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 1 0
make defconfig
set_custom_target "$target" "$default_profile" "$custom_target"
loc_or_i18n "$target" "$active_lang"
make menuconfig
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 0 1
else
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 1 1
make defconfig
set_custom_target "$target" "$default_profile" "$custom_target"
loc_or_i18n "$target" "$active_lang"
fi
if you accept some of my comments above, you could reduce duplication with a little restructuring like
scripts/patch-kernel.sh . "$targets_dir/$target/patches/"
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 1 0
if [ "$target" = "custom" ] ; then
set_custom_target "$target" "$default_profile" "$custom_target"
make defconfig
loc_or_i18n "$target" "$active_lang"
make menuconfig
else
make defconfig
fi
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 0 1
If the set_custom_target
is better after the make defconfig
, the make defconfig
can be moved to before the if
and the else
section can be deleted.
My motivation for suggesting this sort of change is that the more duplication there is, the more risk of edits to duplicates getting out of sync (I never properly learned to type so my error rate is quite high despite some speed).
With PR960 in place, an ath79 default profile diffconfig file like this should get very close to the intended supported target build:
CONFIG_TARGET_ath79=y
CONFIG_TARGET_ath79_generic=y
CONFIG_TARGET_MULTI_PROFILE=y
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_buffalo_wzr-600dhp=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_buffalo_wzr-600dhp="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_buffalo_wzr-hp-ag300h=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_buffalo_wzr-hp-ag300h="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_buffalo_wzr-hp-g300nh-rb=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_buffalo_wzr-hp-g300nh-rb="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_buffalo_wzr-hp-g300nh-s=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_buffalo_wzr-hp-g300nh-s="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_buffalo_wzr-hp-g450h=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_buffalo_wzr-hp-g450h="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-505=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-505="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-825-b1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-825-b1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-825-c1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-825-c1="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-835-a1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-835-a1="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-842-c1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-842-c1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-842-c2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-842-c2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-842-c3=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-842-c3="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_dlink_dir-859-a1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_dlink_dir-859-a1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_engenius_eap300-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_engenius_eap300-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_glinet_gl-ar150=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_glinet_gl-ar150="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_glinet_gl-ar300m16=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_glinet_gl-ar300m16="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_glinet_gl-ar750=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_glinet_gl-ar750="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_jjplus_ja76pf2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_jjplus_ja76pf2="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndr3700=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndr3700="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndr3700-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndr3700-v2="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndr3800=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndr3800="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndr3800ch=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndr3800ch="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndrmac-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndrmac-v1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wndrmac-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wndrmac-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wnr2200-16m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wnr2200-16m="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_netgear_wnr2200-8m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_netgear_wnr2200-8m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_mr1750-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_mr1750-v1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_mr1750-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_mr1750-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_mr600-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_mr600-v1="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_mr600-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_mr600-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_om2p-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_om2p-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_om2p-v4=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_om2p-v4="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_om5p=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_om5p="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_openmesh_om5p-ac-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_openmesh_om5p-ac-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_qxwlan_e1700ac-v2-16m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_qxwlan_e1700ac-v2-16m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_qxwlan_e1700ac-v2-8m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_qxwlan_e1700ac-v2-8m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_qxwlan_e600gac-v2-16m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_qxwlan_e600gac-v2-16m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_qxwlan_e600gac-v2-8m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_qxwlan_e600gac-v2-8m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c6-v2-us=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c6-v2-us="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-a7-v5=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-a7-v5="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c2-v3=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c2-v3="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c25-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c25-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c5-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c5-v1="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c58-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c58-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c59-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c59-v1="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c59-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c59-v2="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c6-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c6-v2="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c60-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c60-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c60-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c60-v2="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c60-v3=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c60-v3="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c7-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c7-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c7-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c7-v2="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c7-v4=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c7-v4="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_archer-c7-v5=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_archer-c7-v5="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wdr3600-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wdr3600-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wdr4300-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wdr4300-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr1043n-v5=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr1043n-v5="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr1043nd-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr1043nd-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr1043nd-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr1043nd-v2="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr1043nd-v3=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr1043nd-v3="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr1043nd-v4=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr1043nd-v4="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr2543-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr2543-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr710n-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr710n-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr710n-v2.1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr710n-v2.1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr810n-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr810n-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr810n-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr810n-v2="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr842n-v3=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr842n-v3="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr842n-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr842n-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr842n-v2=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr842n-v2="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_tplink_tl-wr902ac-v1=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_tplink_tl-wr902ac-v1="gargoyle-usb"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_trendnet_tew-823dru=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_trendnet_tew-823dru="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_airrouter=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_airrouter="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_bullet-ac=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_bullet-ac="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_bullet-m-ar7240=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_bullet-m-ar7240="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_bullet-m-ar7241=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_bullet-m-ar7241="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_bullet-m-xw=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_bullet-m-xw="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_nanostation-m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_nanostation-m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_nanostation-m-xw=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_nanostation-m-xw="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_rocket-m=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_rocket-m="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_unifi=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_unifi="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_unifi-ap-outdoor-plus=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_unifi-ap-outdoor-plus="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_ubnt_unifi-ap-pro=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_ubnt_unifi-ap-pro="gargoyle-basic"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_wd_mynet-n750=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_wd_mynet-n750="gargoyle-large"
CONFIG_TARGET_DEVICE_ath79_generic_DEVICE_wd_mynet-wifi-rangeextender=y
CONFIG_TARGET_DEVICE_PACKAGES_ath79_generic_DEVICE_wd_mynet-wifi-rangeextender="gargoyle-basic"
CONFIG_TARGET_PER_DEVICE_ROOTFS=y
CONFIG_TARGET_SQUASHFS_BLOCK_SIZE=512
CONFIG_CLEAN_IPKG_PARTIAL=y
# CONFIG_KERNEL_AIO is not set
# CONFIG_KERNEL_CGROUPS is not set
# CONFIG_KERNEL_DEBUG_ATOMIC_SLEEP is not set
# CONFIG_KERNEL_DEBUG_INFO is not set
# CONFIG_KERNEL_DEBUG_KERNEL is not set
# CONFIG_KERNEL_DEBUG_VM is not set
# CONFIG_KERNEL_DETECT_HUNG_TASK is not set
# CONFIG_KERNEL_DEVPTS_MULTIPLE_INSTANCES is not set
# CONFIG_KERNEL_FANOTIFY is not set
# CONFIG_KERNEL_FHANDLE is not set
# CONFIG_KERNEL_IO_URING is not set
# CONFIG_KERNEL_KALLSYMS is not set
# CONFIG_KERNEL_KEYS is not set
# CONFIG_KERNEL_NAMESPACES is not set
# CONFIG_KERNEL_POSIX_MQUEUE is not set
CONFIG_KERNEL_PROC_STRIPPED=y
# CONFIG_KERNEL_SECCOMP is not set
# CONFIG_KERNEL_SOFTLOCKUP_DETECTOR is not set
# CONFIG_KERNEL_WQ_WATCHDOG is not set
CONFIG_KSMBD_SMB_INSECURE_SERVER=y
CONFIG_NFS_KERNEL_SERVER_V4=y
CONFIG_PACKAGE_ath10k-firmware-qca9887=m
CONFIG_PACKAGE_ath10k-firmware-qca9887-ct-full-htt=m
CONFIG_PACKAGE_ath10k-firmware-qca9888=m
CONFIG_PACKAGE_ath10k-firmware-qca9888-ct-full-htt=m
CONFIG_PACKAGE_ath10k-firmware-qca9888-ct-htt=m
CONFIG_PACKAGE_ath10k-firmware-qca988x=m
CONFIG_PACKAGE_ath10k-firmware-qca988x-ct-full-htt=m
CONFIG_PACKAGE_kmod-ath10k=m
CONFIG_PACKAGE_kmod-ath10k-smallbuffers=m
CONFIG_PACKAGE_kmod-gpio-button-hotplug=m
# CONFIG_PACKAGE_opkg is not set
# CONFIG_PACKAGE_wpad-basic-wolfssl is not set
Unfortunately the diffconfig is the only way to disable the kernel config options most of which default to "y" unless the target FEATURES includes "small_flash"; for other targets such as x86 you might want to have some of those kernel options left enabled - for a pure Gargoyle experience they wouldn't make any difference but if people want to start running Docker etc on a well resourced device some of them would.
why is set_custom_target needed in the non-custom case? I think this is best controlled by the profile specific diffconfig (which I believe will be required to at least set the devices and device profile meta-packages)?
Doesn't matter as the function doesn't fire anyway in the non-custom case, but it was a copy paste inclusion
I think also that the loc_or_i18n is really only required for the custom case as the Config-gargoyle.in and diffconfig between them should guarantee this...
No it is required for a regular build as well in the case where i18n is not wanted or required and can bake in the language strings to save space.
One stylistic suggestion for the build.sh changes...
Sure, but with the above commentary in mind it becomes
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 1 0
make defconfig
set_custom_target "$target" "$default_profile" "$custom_target"
loc_or_i18n "$target" "$active_lang"
if [ "$target" = "custom" ] ; then
make menuconfig
fi
sh $netfilter_patch_script . "$top_dir/netfilter-match-modules" 0 1
Ok.
A further thought about make custom
: once the make defconfig
machinery is in place, if a supported target is specified (including ath79 as a default) is there any reason not to use the target default profile diffconfig rather than a default "custom" diffconfig? This could be implemented in set_custom_target.sh
.
In rebuild.sh
I'm also wondering whether it might be useful adding a make menuconfig
immediately after the make defconfig
if the target is custom? My thinking here is that one of the reasons to rebuild a custom target is to adjust the package selection or kernel/build settings. I'm not even sure that the make defconfig
is such a great idea in this scenario when a user might have expectations of what is in the config if make defconfig
disturbs it, though for a developer working on package changes is it more reasonable to ensure package mods get picked up.
Hmm... make menuconfig
after make defconfig
is doing something bizarre: the 3 profile meta-packages and the adblock plugin are being changed from "m" to is not set in spite of the profile meta-packages being set as device packages (in my test ath79 diffconfig) and the tor and usb-storage-full plugin references disappear completely. For the life of me I can't see why, especially as make defconfig
is doing what's expected.
Drat! Removing the "package sets" sub-menu structure (just removing the "menu" and "endmenu" lines and dedenting the lines between them) appears to fix the above bizarre make menuconfig
behaviour. Do you want to pick this up in your other changes or should I submit a PR?
There are a couple of busybox settings that are different between the original ath79 config and a current make defconfig
:
I'm wondering whether patching the busybox package config.in to change the respective defaults might be less irritating in the long run...
Except for the busybox fixes and adding lines to a) force the uboot-envtools package to =m from =y (not all ath79 devices use uboot) and b) force CONFIG_DOWNLOAD_CHECK_CERTIFICATE to is not set, the ath79 diffconfig in my previous but one comment is generating a functionally equivalent .config to the ath79 default profile config in commit b47e49a (18 Nov) after make defconfig
.
Happy for you to send through a PR. Please pick up my latest commits to avoid a merge commit if possible (not critical, just nicer when revisiting history).
Swap on/off are important for USB so that one needs picking up. The others I don't recall, happy to let them slide and reintroduce if things break.
I'm optimistically switching to 22.03 soon^tm^
Ouch... spoke too soon. Don't know what I did that changing the Config-gargoyle.in structure appeared to resolve the unset/missing entries problem, but a later re-run with that change in place still had the problematic make menuconfig
output. The only suspect I have at the moment is the fact I'm still using a Ubuntu 20.04 VM for building which has make 4.2.1 and I've come across references to behaviour changing with make 4.3+; this may be related to the issue you encountered with spaces in the Makefile for the profiles meta-packages (which I wasn't seeing). I'll build a new VM and see whether that affects the behaviour I'm seeing.
And yes, I'll make sure I pick up any outstanding commits before I put any further PR up. I think I managed to get the busybox SWAPON/SWAPOFF wrong in #959, which is why I was thinking they should be off when checking other profiles and older ath79 versions they're definitely on (which is the busybox default) so I think they're good as is.
edit: s/make 3/make 4/g
With the 21.02 source base most 8MB flash images fail to build with the 19.07 derived configs, so these images need to be stripped to bare bones to get them to build as a precursor to evaluating whether there are ways to restore functionality such as supporting USB storage etc.
As a side effect of this, the 19.07 generic, ath10k, ath10_large, usb and usb_large profiles can also be consolidated into a single generic profile by using the per-device root fs support, which will simplify building release images going forward. This consolidation also picks up some newer devices and some devices ported from the 19.07 ar71xx architecture.
NB: I have only compile tested this at this stage (which is based on what I've been preparing for the ramips mt76x8 devices) but I hope to test the gl-ar150 and gl-ar300m16 images soon.