ericpaulbishop / gargoyle

Gargoyle Router Management Utility
http://www.gargoyle-router.com
465 stars 222 forks source link

ath79 8MB flash build fixes and general profile consolidation #959

Closed aimacintyre closed 1 year ago

aimacintyre commented 1 year ago

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.

lantis1008 commented 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.

aimacintyre commented 1 year ago

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." and get a usable generic profile config for would seem helpful.

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).

aimacintyre commented 1 year ago

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

aimacintyre commented 1 year ago

I've now tested the gl-ar150 image from this config successfully with a Huawei E3372 4G modem as the WAN.

aimacintyre commented 1 year ago

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.

aimacintyre commented 1 year ago

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 :-(

lantis1008 commented 1 year ago

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?

lantis1008 commented 1 year ago

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

aimacintyre commented 1 year ago

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

lantis1008 commented 1 year ago

Those errors have been in for a while and not caused by the new config.in (afaik).

aimacintyre commented 1 year ago

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.

lantis1008 commented 1 year ago

Ah sorry I didn't include the patch to *-src/Config.in. The syntax should be straightforward

aimacintyre commented 1 year ago

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 :-(.

lantis1008 commented 1 year ago

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.

aimacintyre commented 1 year ago

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...

aimacintyre commented 1 year ago

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...

lantis1008 commented 1 year ago

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.

aimacintyre commented 1 year ago

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.

lantis1008 commented 1 year ago

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.

lantis1008 commented 1 year ago

@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?

aimacintyre commented 1 year ago

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.

lantis1008 commented 1 year ago

Thanks, learned something :)

lantis1008 commented 1 year ago

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?

lantis1008 commented 1 year ago
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.

aimacintyre commented 1 year ago

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/ subdirectory I gather is essentially a diffconfig file, though the ath79 example from my last build with the profiles package seems to contain a lot of "CONFIGPACKAGE* is not set" lines that could be excluded (as best I can gather, you only need the "is not set" lines in a diffconfig when you need to specifically disable a package or CONFIG variable that otherwise gets selected somehow so I believe the ath79 file should only be just over 600 lines instead of the 2719 lines in the one I have - I'll try and experiment with this over the weekend).

aimacintyre commented 1 year ago

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
aimacintyre commented 1 year ago

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.

lantis1008 commented 1 year ago

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.

lantis1008 commented 1 year ago

@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.

lantis1008 commented 1 year ago

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?

aimacintyre commented 1 year ago

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.

lantis1008 commented 1 year ago

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.

aimacintyre commented 1 year ago

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:

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?

aimacintyre commented 1 year ago

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.

aimacintyre commented 1 year ago

Followup: things that a revised set_config_custom_target.sh script could do:

lantis1008 commented 1 year ago

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.

aimacintyre commented 1 year ago

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....

lantis1008 commented 1 year ago

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" "."
aimacintyre commented 1 year ago

That all looks reasonable to me, though a couple of thoughts occur:

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.

lantis1008 commented 1 year ago

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
aimacintyre commented 1 year ago

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.

aimacintyre commented 1 year ago

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.

lantis1008 commented 1 year ago

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^

aimacintyre commented 1 year ago

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