commit 6d0099d1a1c623997fcf7da38737cdeac94884fb Author: domenico Date: Tue Jun 24 16:07:44 2025 +0200 Initial commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fa1385d --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* -text diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..4d7a726 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: [ 'https://openwrt.org/donate' ] diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..fed2b8d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,84 @@ +name: Bug report +description: Create a bug report to help us improve +labels: + - bug +body: + - type: textarea + id: description + attributes: + label: Describe the bug + description: A clear and concise description of the bug. + validations: + required: true + - type: input + id: version + attributes: + label: OpenWrt version + description: | + The OpenWrt release or commit hash where this bug occurs (use command below). + ```. /etc/openwrt_release && echo $DISTRIB_REVISION``` + validations: + required: true + - type: input + id: target + attributes: + label: OpenWrt target/subtarget + description: | + The OpenWrt target and subtarget where this bug is observed (use command below). + ```. /etc/openwrt_release && echo $DISTRIB_TARGET``` + validations: + required: true + - type: input + id: device + attributes: + label: Device + description: | + The device exhibiting this bug (if unsure, use command below). + ```cat /tmp/sysinfo/model``` + validations: + required: true + - type: dropdown + id: image_kind + attributes: + label: Image kind + options: + - Official downloaded image + - Self-built image + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: Steps to reproduce + description: Steps to reproduce the reported behaviour. + - type: textarea + id: behaviour + attributes: + label: Actual behaviour + description: A clear and concise description of what actually happens. + - type: textarea + id: expected + attributes: + label: Expected behaviour + description: A clear and concise description of what you expected to happen. + - type: textarea + id: additional + attributes: + label: Additional info + description: Add any additional info you think might be helfpul. + - type: textarea + id: diffconfig + attributes: + label: Diffconfig + description: | + In case of a self-built image, please attach diffconfig. + ```./scripts/diffconfig.sh``` + render: text + - type: checkboxes + id: terms + attributes: + label: Terms + description: By submitting this issue, you agree to the terms below. + options: + - label: I am reporting an issue for OpenWrt, not an unsupported fork. + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..91e2489 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,12 @@ +--- +blank_issues_enabled: false +contact_links: + - name: Feature request + url: https://forum.openwrt.org/c/feature-requests + about: The OpenWrt project relies on volunteers. While we appreciate feature requests, we might lack the manpower to handle them. Ideally, you get familiar with the codebase and attempt to contribute the feature yourself. We recommend to post in the forum, as this is the most likely place to receive feedback on feature requests. + - name: OpenWrt community + url: https://openwrt.org/contact + about: Consider reaching out to our community to get help. OpenWrt is a complex software project with many pitfalls; there is a good chance someone can help you solve your issue in no time. + - name: OpenWrt documentation + url: https://openwrt.org/docs/start + about: The OpenWrt documentation contains a lot of valuable information. diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 0000000..6d53d58 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,138 @@ +# target/* +"target/airoha": + - "target/linux/airoha/**" +"target/apm821xx": + - "target/linux/apm821xx/**" +"target/archs38": + - "target/linux/archs38/**" +"target/armsr": + - "target/linux/armsr/**" +"target/at91": + - "target/linux/at91/**" + - "package/boot/at91bootstrap/**" + - "package/boot/uboot-at91/**" +"target/ath25": + - "target/linux/ath25/**" +"target/ath79": + - "target/linux/ath79/**" +"target/bcm27xx": + - "target/linux/bcm27xx/**" + - "package/kernel/bcm27xx-gpu-fw/**" +"target/bcm47xx": + - "target/linux/bcm47xx/**" +"target/bcm4908": + - "target/linux/bcm4908/**" + - "package/boot/uboot-bcm4908/**" +"target/bcm53xx": + - "target/linux/bcm53xx/**" +"target/bcm63xx": + - "target/linux/bcm63xx/**" + - "package/kernel/bcm63xx-cfe/**" + - "package/boot/arm-trusted-firmware-bcm63xx/**" +"target/bmips": + - "target/linux/bmips/**" +"target/gemini": + - "target/linux/gemini/**" +"target/imx": + - "target/linux/imx/**" + - "package/boot/imx-bootlets/**" + - "package/boot/uboot-imx/**" +"target/ipq40xx": + - "target/linux/ipq40xx/**" +"target/ipq806x": + - "target/linux/ipq806x/**" +"target/ipq807x": + - "target/linux/ipq807x/**" +"target/kirkwood": + - "target/linux/kirkwood/**" + - "package/boot/uboot-kirkwood/**" +"target/lantiq": + - "target/linux/lantiq/**" + - "package/kernel/lantiq/**" + - "package/firmware/lantiq/**" + - "package/boot/uboot-lantiq/**" +"target/layerscape": + - "target/linux/layerscape/**" + - "package/firmware/layerscape/**" + - "package/boot/tfa-layerscape/**" + - "package/boot/uboot-layerscape/**" + - "package/network/utils/layerscape/**" +"target/malta": + - "target/linux/malta/**" +"target/mediatek": + - "target/linux/mediatek/**" + - "package/boot/arm-trusted-firmware-mediatek/**" + - "package/boot/uboot-mediatek/**" +"target/mpc85xx": + - "target/linux/mpc85xx/**" +"target/mvebu": + - "target/linux/mvebu/**" + - "package/boot/arm-trusted-firmware-mvebu/**" + - "package/boot/uboot-mvebu/**" +"target/mxs": + - "target/linux/mxs/**" + - "package/boot/uboot-mxs/**" +"target/octeon": + - "target/linux/octeon/**" +"target/octeontx": + - "target/linux/octeontx/**" +"target/omap": + - "target/linux/omap/**" + - "package/boot/uboot-omap/**" +"target/oxnas": + - "target/linux/oxnas/**" + - "package/boot/uboot-oxnas/**" +"target/pistachio": + - "target/linux/pistachio/**" +"target/qoriq": + - "target/linux/qoriq/**" +"target/ramips": + - "target/linux/ramips/**" +"target/realtek": + - "target/linux/realtek/**" +"target/rockchip": + - "target/linux/rockchip/**" + - "package/boot/arm-trusted-firmware-rockchip/**" + - "package/boot/uboot-rockchip/**" +"target/sifiveu": + - "target/linux/sifiveu/**" + - "package/boot/uboot-sifiveu/**" + - "package/boot/opensbi/**" +"target/sunxi": + - "target/linux/sunxi/**" + - "package/boot/arm-trusted-firmware-sunxi/**" + - "package/boot/uboot-sunxi/**" +"target/tegra": + - "target/linux/tegra/**" + - "package/boot/uboot-tegra/**" +"target/uml": + - "target/linux/uml/**" +"target/x86": + - "target/linux/x86/**" +"target/zynq": + - "target/linux/zynq/**" + - "package/boot/uboot-zynq/**" +# target/imagebuilder +"target/imagebuilder": + - "target/imagebuilder/**" +# kernel +"kernel": + - "target/linux/generic/**" + - "target/linux/**/config-*" + - "target/linux/**/patches-*" + - "target/linux/**/files/**" + - "package/kernel/linux/**" +# core packages +"core packages": + - "package/**" +# build/scripts/tools +"build/scripts/tools": + - "include/**" + - "scripts/**" + - "tools/**" +# toolchain +"toolchain": + - "toolchain/**" +# GitHub/CI +"GitHub/CI": + - ".github/**" diff --git a/.github/pull_request_template b/.github/pull_request_template new file mode 100644 index 0000000..a2d6bd1 --- /dev/null +++ b/.github/pull_request_template @@ -0,0 +1,8 @@ +Thanks for your contribution to OpenWrt! + +To help keep the codebase consistent and readable, +and to help people review your contribution, +we ask you to follow the rules you find in the wiki at this link +https://openwrt.org/submitting-patches + +Please remove this message before posting the pull request. diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml new file mode 100644 index 0000000..f546959 --- /dev/null +++ b/.github/workflows/coverity.yml @@ -0,0 +1,19 @@ +name: Coverity scan build + +on: + schedule: + - cron: '30 2 * * 6' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + +jobs: + coverity_build: + name: Coverity x86/64 build + secrets: + coverity_api_token: ${{ secrets.COVERITY_API_TOKEN }} + permissions: + contents: read + packages: read + actions: write + uses: openwrt/actions-shared-workflows/.github/workflows/coverity.yml@main diff --git a/.github/workflows/formal.yml b/.github/workflows/formal.yml new file mode 100644 index 0000000..8083c58 --- /dev/null +++ b/.github/workflows/formal.yml @@ -0,0 +1,73 @@ +name: Test Formalities + +on: + pull_request: + +permissions: + contents: read + +jobs: + build: + name: Test Formalities + runs-on: ubuntu-latest + strategy: + fail-fast: false + + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 0 + + - name: Determine branch name + run: | + BRANCH="${GITHUB_BASE_REF#refs/heads/}" + echo "Building for $BRANCH" + echo "BRANCH=$BRANCH" >> $GITHUB_ENV + + - name: Test formalities + run: | + source .github/workflows/scripts/ci_helpers.sh + + RET=0 + for commit in $(git rev-list HEAD ^origin/$BRANCH); do + info "=== Checking commit '$commit'" + if git show --format='%P' -s $commit | grep -qF ' '; then + err "Pull request should not include merge commits" + RET=1 + fi + + author="$(git show -s --format=%aN $commit)" + if echo $author | grep -q '\S\+\s\+\S\+'; then + success "Author name ($author) seems ok" + else + err "Author name ($author) need to be your real name 'firstname lastname'" + RET=1 + fi + + subject="$(git show -s --format=%s $commit)" + if echo "$subject" | grep -q -e '^[0-9A-Za-z,+/_\.-]\+: ' -e '^Revert '; then + success "Commit subject line seems ok ($subject)" + else + err "Commit subject line MUST start with ': ' ($subject)" + RET=1 + fi + + body="$(git show -s --format=%b $commit)" + sob="$(git show -s --format='Signed-off-by: %aN <%aE>' $commit)" + if echo "$body" | grep -qF "$sob"; then + success "Signed-off-by match author" + else + err "Signed-off-by is missing or doesn't match author (should be '$sob')" + RET=1 + fi + + if echo "$body" | grep -v "Signed-off-by:"; then + success "A commit message exists" + else + err "Missing commit message. Please describe your changes" + RET=1 + fi + done + + exit $RET diff --git a/.github/workflows/github-release.yml b/.github/workflows/github-release.yml new file mode 100644 index 0000000..55d01f8 --- /dev/null +++ b/.github/workflows/github-release.yml @@ -0,0 +1,24 @@ +name: Create GitHub release + +permissions: + contents: write + +on: + push: + tags: + - "v*" + workflow_dispatch: + +jobs: + release: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Release + uses: softprops/action-gh-release@v1 + with: + draft: true + prerelease: true diff --git a/.github/workflows/kernel.yml b/.github/workflows/kernel.yml new file mode 100644 index 0000000..43c610a --- /dev/null +++ b/.github/workflows/kernel.yml @@ -0,0 +1,42 @@ +name: Build Kernel + +on: + pull_request: + paths: + - '.github/workflows/check-kernel-patches.yml' + - '.github/workflows/build.yml' + - '.github/workflows/kernel.yml' + - 'include/kernel*' + - 'package/kernel/**' + - 'target/linux/**' + push: + paths: + - '.github/workflows/check-kernel-patches.yml' + - '.github/workflows/build.yml' + - '.github/workflows/kernel.yml' + - 'include/kernel*' + - 'package/kernel/**' + - 'target/linux/**' + branches-ignore: + - master + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + build-kernels: + name: Build all affected Kernels + permissions: + contents: read + packages: read + actions: write + secrets: + ccache_s3_endpoint: ${{ secrets.CCACHE_S3_ENDPOINT }} + ccache_s3_bucket: ${{ secrets.CCACHE_S3_BUCKET }} + ccache_s3_access_key: ${{ secrets.CCACHE_S3_ACCESS_KEY }} + ccache_s3_secret_key: ${{ secrets.CCACHE_S3_SECRET_KEY }} + uses: openwrt/actions-shared-workflows/.github/workflows/kernel.yml@main diff --git a/.github/workflows/label-kernel.yml b/.github/workflows/label-kernel.yml new file mode 100644 index 0000000..655d7d6 --- /dev/null +++ b/.github/workflows/label-kernel.yml @@ -0,0 +1,16 @@ +# ci:kernel:x86:64 is going to trigger CI kernel check jobs for x86/64 target + +name: Build kernel and check patches for target specified in labels +on: + pull_request: + types: + - labeled + +jobs: + build-kernels-label: + name: Build all affected Kernels from defined label + permissions: + contents: read + packages: read + actions: write + uses: openwrt/actions-shared-workflows/.github/workflows/label-kernel.yml@main diff --git a/.github/workflows/label-target.yml b/.github/workflows/label-target.yml new file mode 100644 index 0000000..989ee9f --- /dev/null +++ b/.github/workflows/label-target.yml @@ -0,0 +1,16 @@ +# ci:target:x86:64 is going to trigger CI target check jobs for x86/64 target + +name: Build check target specified in labels +on: + pull_request: + types: + - labeled + +jobs: + build-target-label: + name: Build target from defined label + permissions: + contents: read + packages: read + actions: write + uses: openwrt/actions-shared-workflows/.github/workflows/label-target.yml@main diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 0000000..5f82b88 --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,33 @@ +name: 'Pull Request Labeler' +on: + - pull_request_target + +permissions: + contents: read + +jobs: + labeler: + permissions: + contents: read # to determine modified files (actions/labeler) + pull-requests: write # to add labels to PRs (actions/labeler) + + name: Pull Request Labeler + runs-on: ubuntu-latest + steps: + - uses: actions/labeler@v4 + with: + repo-token: '${{ secrets.GITHUB_TOKEN }}' + + - name: Check Branch + id: check-branch + run: | + if echo "${{ github.base_ref }}" | grep -q -E 'openwrt-[0-9][0-9]\.[0-9][0-9]'; then + echo "release-tag=$(echo ${{ github.base_ref }} | sed 's/openwrt-/release\//')" >> $GITHUB_OUTPUT + fi + + - uses: buildsville/add-remove-label@v2.0.0 + if: ${{ steps.check-branch.outputs.release-tag }} + with: + token: ${{secrets.GITHUB_TOKEN}} + labels: ${{ steps.check-branch.outputs.release-tag }} + type: add diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml new file mode 100644 index 0000000..f061c1c --- /dev/null +++ b/.github/workflows/packages.yml @@ -0,0 +1,42 @@ +name: Build all core packages + +on: + pull_request: + paths: + - '.github/workflows/packages.yml' + - 'config/**' + - 'include/**' + - 'package/**' + - 'target/linux/generic/**' + - 'toolchain/**' + push: + paths: + - '.github/workflows/packages.yml' + - 'config/**' + - 'include/**' + - 'package/**' + - 'target/linux/generic/**' + - 'toolchain/**' + branches-ignore: + - master + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + build-packages: + name: Build all core packages for selected target + permissions: + contents: read + packages: read + actions: write + secrets: + ccache_s3_endpoint: ${{ secrets.CCACHE_S3_ENDPOINT }} + ccache_s3_bucket: ${{ secrets.CCACHE_S3_BUCKET }} + ccache_s3_access_key: ${{ secrets.CCACHE_S3_ACCESS_KEY }} + ccache_s3_secret_key: ${{ secrets.CCACHE_S3_SECRET_KEY }} + uses: openwrt/actions-shared-workflows/.github/workflows/packages.yml@main diff --git a/.github/workflows/push-containers.yml b/.github/workflows/push-containers.yml new file mode 100644 index 0000000..74f534d --- /dev/null +++ b/.github/workflows/push-containers.yml @@ -0,0 +1,28 @@ +name: Build and Push prebuilt tools container + +on: + push: + paths: + - 'include/version.mk' + - 'include/cmake.mk' + - 'tools/**' + - '.github/workflows/push-containers.yml' + - 'toolchain/**' + branches-ignore: + - master + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-push-containers: + name: Build and Push all prebuilt containers + permissions: + contents: read + packages: write + actions: write + uses: openwrt/actions-shared-workflows/.github/workflows/push-containers.yml@main diff --git a/.github/workflows/scripts/ci_helpers.sh b/.github/workflows/scripts/ci_helpers.sh new file mode 100644 index 0000000..2f9daf8 --- /dev/null +++ b/.github/workflows/scripts/ci_helpers.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +color_out() { + printf "\e[0;$1m%s\e[0;0m\n" "$2" +} + +success() { + color_out 32 "$1" +} + +info() { + color_out 36 "$1" +} + +err() { + color_out 31 "$1" +} + +warn() { + color_out 33 "$1" +} + +err_die() { + err "$1" + exit 1 +} diff --git a/.github/workflows/scripts/show_build_failures.sh b/.github/workflows/scripts/show_build_failures.sh new file mode 100755 index 0000000..7b1a021 --- /dev/null +++ b/.github/workflows/scripts/show_build_failures.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +original_exit_code="${ret:-1}" +log_dir_path="${1:-logs}" +context="${2:-10}" + +show_make_build_errors() { + grep -slr 'make\[[[:digit:]]\+\].*Error [[:digit:]]\+$' "$log_dir_path" | while IFS= read -r log_file; do + printf "====== Make errors from %s ======\n" "$log_file"; + grep -r -C"$context" 'make\[[[:digit:]]\+\].*Error [[:digit:]]\+$' "$log_file" ; + done +} + +show_make_build_errors +exit "$original_exit_code" diff --git a/.github/workflows/toolchain.yml b/.github/workflows/toolchain.yml new file mode 100644 index 0000000..0bc9fec --- /dev/null +++ b/.github/workflows/toolchain.yml @@ -0,0 +1,29 @@ +name: Build Toolchains + +on: + pull_request: + paths: + - '.github/workflows/toolchain.yml' + - 'toolchain/**' + push: + paths: + - '.github/workflows/toolchain.yml' + - 'toolchain/**' + branches-ignore: + - master + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + build-toolchains: + name: Build Toolchains for each target + permissions: + contents: read + packages: read + actions: write + uses: openwrt/actions-shared-workflows/.github/workflows/toolchain.yml@main diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml new file mode 100644 index 0000000..35904a5 --- /dev/null +++ b/.github/workflows/tools.yml @@ -0,0 +1,27 @@ +name: Build host tools + +on: + pull_request: + paths: + - 'include/**' + - 'tools/**' + - '.github/workflows/tools.yml' + push: + paths: + - 'include/**' + - 'tools/**' + - '.github/workflows/tools.yml' + branches-ignore: + - master + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + build-tools: + name: Build host tools for linux and macos based systems + uses: openwrt/actions-shared-workflows/.github/workflows/tools.yml@main diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..84cfc99 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +*.o +.DS_Store +.*.swp +/env +/dl +/.config +/.config.old +/.toolchain_build_ver +/bin +/build_dir +/staging_dir +/tmp +/logs +/feeds +/feeds.conf +/files +/target/linux/feeds +/overlay +/package/feeds +/package/openwrt-packages +/*.patch +/llvm-bpf* +key-build* +*.orig +*.rej +*~ +.#* +*# +.emacs.desktop* +TAGS*~ +git-src +.project +.cproject +.ccache +.vscode* diff --git a/BSDmakefile b/BSDmakefile new file mode 100644 index 0000000..66fe088 --- /dev/null +++ b/BSDmakefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006 OpenWrt.org + +world ${.TARGETS}: + @gmake $@ diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..ea81124 --- /dev/null +++ b/COPYING @@ -0,0 +1,12 @@ +OpenWrt is provided under: + + SPDX-License-Identifier: GPL-2.0-only + +Being under the terms of the GNU General Public License version 2 only, +according with: + + LICENSES/GPL-2.0 + +In addition, other licenses may also apply. + +All contributions to OpenWrt are subject to this COPYING file. diff --git a/Config.in b/Config.in new file mode 100644 index 0000000..6d71d4c --- /dev/null +++ b/Config.in @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2013 OpenWrt.org + +mainmenu "OpenWrt Configuration" + +config MODULES + modules + bool + default y + +config HAVE_DOT_CONFIG + bool + default y + +HOST_OS := $(shell, uname) + +config HOST_OS_LINUX + def_bool $(shell, ./config/check-uname.sh Linux) + +config HOST_OS_MACOS + def_bool $(shell, ./config/check-uname.sh Darwin) + +source "target/Config.in" + +source "config/Config-images.in" + +source "config/Config-build.in" + +source "config/Config-devel.in" + +source "toolchain/Config.in" + +source "target/imagebuilder/Config.in" + +source "target/sdk/Config.in" + +source "target/toolchain/Config.in" + +source "tmp/.config-package.in" diff --git a/LICENSES/BSD-2-Clause b/LICENSES/BSD-2-Clause new file mode 100644 index 0000000..da366e2 --- /dev/null +++ b/LICENSES/BSD-2-Clause @@ -0,0 +1,32 @@ +Valid-License-Identifier: BSD-2-Clause +SPDX-URL: https://spdx.org/licenses/BSD-2-Clause.html +Usage-Guide: + To use the BSD 2-clause "Simplified" License put the following SPDX + tag/value pair into a comment according to the placement guidelines in + the licensing rules documentation: + SPDX-License-Identifier: BSD-2-Clause +License-Text: + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/LICENSES/BSD-3-Clause b/LICENSES/BSD-3-Clause new file mode 100644 index 0000000..34c7f05 --- /dev/null +++ b/LICENSES/BSD-3-Clause @@ -0,0 +1,36 @@ +Valid-License-Identifier: BSD-3-Clause +SPDX-URL: https://spdx.org/licenses/BSD-3-Clause.html +Usage-Guide: + To use the BSD 3-clause "New" or "Revised" License put the following SPDX + tag/value pair into a comment according to the placement guidelines in + the licensing rules documentation: + SPDX-License-Identifier: BSD-3-Clause +License-Text: + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/LICENSES/GPL-1.0 b/LICENSES/GPL-1.0 new file mode 100644 index 0000000..1c50e3b --- /dev/null +++ b/LICENSES/GPL-1.0 @@ -0,0 +1,261 @@ +Valid-License-Identifier: GPL-1.0-or-later +Valid-License-Identifier: GPL-1.0+ +SPDX-URL: https://spdx.org/licenses/GPL-1.0.html +Usage-Guide: + The GNU General Public License (GPL) version 1 should not be used in new + code. For existing kernel code the 'or any later version' option is + required to be compatible with the general license of the project: GPLv2. + To use the license in source code, put the following SPDX tag/value pair + into a comment according to the placement guidelines in the licensing + rules documentation: + SPDX-License-Identifier: GPL-1.0-or-later +License-Text: + + GNU GENERAL PUBLIC LICENSE + Version 1, February 1989 + + Copyright (C) 1989 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The license agreements of most software companies try to keep users +at the mercy of those companies. By contrast, our General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. The +General Public License applies to the Free Software Foundation's +software and to any other program whose authors commit to using it. +You can use it for your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Specifically, the General Public License is designed to make +sure that you have the freedom to give away or sell copies of free +software, that you receive source code or can get it if you want it, +that you can change the software or use pieces of it in new free +programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of a such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must tell them their rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any program or other work which +contains a notice placed by the copyright holder saying it may be +distributed under the terms of this General Public License. The +"Program", below, refers to any such program or work, and a "work based +on the Program" means either the Program or any work containing the +Program or a portion of it, either verbatim or with modifications. Each +licensee is addressed as "you". + + 1. You may copy and distribute verbatim copies of the Program's source +code as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this +General Public License and to the absence of any warranty; and give any +other recipients of the Program a copy of this General Public License +along with the Program. You may charge a fee for the physical act of +transferring a copy. + + 2. You may modify your copy or copies of the Program or any portion of +it, and copy and distribute such modifications under the terms of Paragraph +1 above, provided that you also do the following: + + a) cause the modified files to carry prominent notices stating that + you changed the files and the date of any change; and + + b) cause the whole of any work that you distribute or publish, that + in whole or in part contains the Program or any part thereof, either + with or without modifications, to be licensed at no charge to all + third parties under the terms of this General Public License (except + that you may choose to grant warranty protection to some or all + third parties, at your option). + + c) If the modified program normally reads commands interactively when + run, you must cause it, when started running for such interactive use + in the simplest and most usual way, to print or display an + announcement including an appropriate copyright notice and a notice + that there is no warranty (or else, saying that you provide a + warranty) and that users may redistribute the program under these + conditions, and telling the user how to view a copy of this General + Public License. + + d) You may charge a fee for the physical act of transferring a + copy, and you may at your option offer warranty protection in + exchange for a fee. + +Mere aggregation of another independent work with the Program (or its +derivative) on a volume of a storage or distribution medium does not bring +the other work under the scope of these terms. + + 3. You may copy and distribute the Program (or a portion or derivative of +it, under Paragraph 2) in object code or executable form under the terms of +Paragraphs 1 and 2 above provided that you also do one of the following: + + a) accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of + Paragraphs 1 and 2 above; or, + + b) accompany it with a written offer, valid for at least three + years, to give any third party free (except for a nominal charge + for the cost of distribution) a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of + Paragraphs 1 and 2 above; or, + + c) accompany it with the information you received as to where the + corresponding source code may be obtained. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form alone.) + +Source code for a work means the preferred form of the work for making +modifications to it. For an executable file, complete source code means +all the source code for all modules it contains; but, as a special +exception, it need not include source code for modules which are standard +libraries that accompany the operating system on which the executable +file runs, or for standard header files or definitions files that +accompany that operating system. + + 4. You may not copy, modify, sublicense, distribute or transfer the +Program except as expressly provided under this General Public License. +Any attempt otherwise to copy, modify, sublicense, distribute or transfer +the Program is void, and will automatically terminate your rights to use +the Program under this License. However, parties who have received +copies, or rights to use copies, from you under this General Public +License will not have their licenses terminated so long as such parties +remain in full compliance. + + 5. By copying, distributing or modifying the Program (or any work based +on the Program) you indicate your acceptance of this license to do so, +and all its terms and conditions. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these +terms and conditions. You may not impose any further restrictions on the +recipients' exercise of the rights granted herein. + + 7. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of the license which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +the license, you may choose any version ever published by the Free Software +Foundation. + + 8. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to humanity, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + + To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively convey +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 1, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19xx name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w' and `show +c'; they could even be mouse-clicks or menu items--whatever suits your +program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program `Gnomovision' (a program to direct compilers to make passes + at assemblers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/LICENSES/GPL-2.0 b/LICENSES/GPL-2.0 new file mode 100644 index 0000000..4d90dc1 --- /dev/null +++ b/LICENSES/GPL-2.0 @@ -0,0 +1,355 @@ +Valid-License-Identifier: GPL-2.0-only +Valid-License-Identifier: GPL-2.0 +Valid-License-Identifier: GPL-2.0-or-later +Valid-License-Identifier: GPL-2.0+ +SPDX-URL: https://spdx.org/licenses/GPL-2.0.html +Usage-Guide: + To use this license in source code, put one of the following SPDX + tag/value pairs into a comment according to the placement + guidelines in the licensing rules documentation. + For 'GNU General Public License (GPL) version 2 only' use: + SPDX-License-Identifier: GPL-2.0-only + For 'GNU General Public License (GPL) version 2 or any later version' use: + SPDX-License-Identifier: GPL-2.0-or-later +License-Text: + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/LICENSES/ISC b/LICENSES/ISC new file mode 100644 index 0000000..8953c31 --- /dev/null +++ b/LICENSES/ISC @@ -0,0 +1,24 @@ +Valid-License-Identifier: ISC +SPDX-URL: https://spdx.org/licenses/ISC.html +Usage-Guide: + To use the ISC License put the following SPDX tag/value pair into a + comment according to the placement guidelines in the licensing rules + documentation: + SPDX-License-Identifier: ISC +License-Text: + +ISC License + +Copyright (c) + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/LICENSES/Linux-syscall-note b/LICENSES/Linux-syscall-note new file mode 100644 index 0000000..eb17068 --- /dev/null +++ b/LICENSES/Linux-syscall-note @@ -0,0 +1,25 @@ +SPDX-Exception-Identifier: Linux-syscall-note +SPDX-URL: https://spdx.org/licenses/Linux-syscall-note.html +SPDX-Licenses: GPL-2.0-only, GPL-2.0, GPL-2.0-or-later, GPL-2.0+, GPL-1.0-or-later, GPL-1.0+, LGPL-2.0, LGPL-2.0+, LGPL-2.1, LGPL-2.1+ +Usage-Guide: + This exception is used together with one of the above SPDX-Licenses + to mark user space API (uapi) header files so they can be included + into non GPL compliant user space application code. + To use this exception add it with the keyword WITH to one of the + identifiers in the SPDX-Licenses tag: + SPDX-License-Identifier: WITH Linux-syscall-note +License-Text: + + NOTE! This copyright does *not* cover user programs that use kernel + services by normal system calls - this is merely considered normal use + of the kernel, and does *not* fall under the heading of "derived work". + Also note that the GPL below is copyrighted by the Free Software + Foundation, but the instance of code that it refers to (the Linux + kernel) is copyrighted by me and others who actually wrote it. + + Also note that the only valid version of the GPL as far as the kernel + is concerned is _this_ particular version of the license (ie v2, not + v2.2 or v3.x or whatever), unless explicitly otherwise stated. + + Linus Torvalds + diff --git a/LICENSES/MIT b/LICENSES/MIT new file mode 100644 index 0000000..f33a68c --- /dev/null +++ b/LICENSES/MIT @@ -0,0 +1,30 @@ +Valid-License-Identifier: MIT +SPDX-URL: https://spdx.org/licenses/MIT.html +Usage-Guide: + To use the MIT License put the following SPDX tag/value pair into a + comment according to the placement guidelines in the licensing rules + documentation: + SPDX-License-Identifier: MIT +License-Text: + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7c52acc --- /dev/null +++ b/Makefile @@ -0,0 +1,143 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2007 OpenWrt.org + +TOPDIR:=${CURDIR} +LC_ALL:=C +LANG:=C +TZ:=UTC +export TOPDIR LC_ALL LANG TZ + +empty:= +space:= $(empty) $(empty) +$(if $(findstring $(space),$(TOPDIR)),$(error ERROR: The path to the OpenWrt directory must not include any spaces)) + +world: + +DISTRO_PKG_CONFIG:=$(shell $(TOPDIR)/scripts/command_all.sh pkg-config | grep -e '/usr' -e '/nix/store' -m 1) + +export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH)) +export PATH:=$(if $(STAGING_DIR),$(abspath $(STAGING_DIR)/../host/bin),$(TOPDIR)/staging_dir/host/bin):$(PATH) + +ifneq ($(OPENWRT_BUILD),1) + _SINGLE=export MAKEFLAGS=$(space); + + override OPENWRT_BUILD=1 + export OPENWRT_BUILD + GREP_OPTIONS= + export GREP_OPTIONS + CDPATH= + export CDPATH + include $(TOPDIR)/include/debug.mk + include $(TOPDIR)/include/depends.mk + include $(TOPDIR)/include/toplevel.mk +else + include rules.mk + include $(INCLUDE_DIR)/depends.mk + include $(INCLUDE_DIR)/subdir.mk + include target/Makefile + include package/Makefile + include tools/Makefile + include toolchain/Makefile + +# Include the test suite Makefile if it exists +-include tests/Makefile + +$(toolchain/stamp-compile): $(tools/stamp-compile) $(if $(CONFIG_BUILDBOT),toolchain_rebuild_check) +$(target/stamp-compile): $(toolchain/stamp-compile) $(tools/stamp-compile) $(BUILD_DIR)/.prepared +$(package/stamp-compile): $(target/stamp-compile) $(package/stamp-cleanup) +$(package/stamp-install): $(package/stamp-compile) +$(target/stamp-install): $(package/stamp-compile) $(package/stamp-install) +check: $(tools/stamp-check) $(toolchain/stamp-check) $(package/stamp-check) + +printdb: + @true + +prepare: $(target/stamp-compile) + +_clean: FORCE + rm -rf $(BUILD_DIR) $(STAGING_DIR) $(BIN_DIR) $(OUTPUT_DIR)/packages/$(ARCH_PACKAGES) $(TOPDIR)/staging_dir/packages + +clean: _clean + rm -rf $(BUILD_LOG_DIR) + +targetclean: _clean + rm -rf $(TOOLCHAIN_DIR) $(BUILD_DIR_BASE)/hostpkg $(BUILD_DIR_TOOLCHAIN) + +dirclean: targetclean clean + rm -rf $(STAGING_DIR_HOST) $(STAGING_DIR_HOSTPKG) $(BUILD_DIR_BASE)/host + rm -rf $(TMP_DIR) + $(MAKE) -C $(TOPDIR)/scripts/config clean + +toolchain_rebuild_check: + $(SCRIPT_DIR)/check-toolchain-clean.sh + +cacheclean: +ifneq ($(CONFIG_CCACHE),) + $(STAGING_DIR_HOST)/bin/ccache -C +endif + +ifndef DUMP_TARGET_DB +$(BUILD_DIR)/.prepared: Makefile + @mkdir -p $$(dirname $@) + @touch $@ + +tmp/.prereq_packages: .config + unset ERROR; \ + for package in $(sort $(prereq-y) $(prereq-m)); do \ + $(_SINGLE)$(NO_TRACE_MAKE) -s -r -C package/$$package prereq || ERROR=1; \ + done; \ + if [ -n "$$ERROR" ]; then \ + echo "Package prerequisite check failed."; \ + false; \ + fi + touch $@ +endif + +# check prerequisites before starting to build +prereq: $(target/stamp-prereq) tmp/.prereq_packages + @if [ ! -f "$(INCLUDE_DIR)/site/$(ARCH)" ]; then \ + echo 'ERROR: Missing site config for architecture "$(ARCH)" !'; \ + echo ' The missing file will cause configure scripts to fail during compilation.'; \ + echo ' Please provide a "$(INCLUDE_DIR)/site/$(ARCH)" file and restart the build.'; \ + exit 1; \ + fi + +$(BIN_DIR)/profiles.json: FORCE + $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \ + WORK_DIR=$(BUILD_DIR)/json_info_files \ + $(SCRIPT_DIR)/json_overview_image_info.py $@ \ + ) + +json_overview_image_info: $(BIN_DIR)/profiles.json + +checksum: FORCE + $(call sha256sums,$(BIN_DIR),$(CONFIG_BUILDBOT)) + +buildversion: FORCE + $(SCRIPT_DIR)/getver.sh > $(BIN_DIR)/version.buildinfo + +feedsversion: FORCE + $(SCRIPT_DIR)/feeds list -fs > $(BIN_DIR)/feeds.buildinfo + +diffconfig: FORCE + mkdir -p $(BIN_DIR) + $(SCRIPT_DIR)/diffconfig.sh > $(BIN_DIR)/config.buildinfo + +buildinfo: FORCE + $(_SINGLE)$(SUBMAKE) -r diffconfig buildversion feedsversion + +prepare: .config $(tools/stamp-compile) $(toolchain/stamp-compile) + $(_SINGLE)$(SUBMAKE) -r buildinfo + +world: prepare $(target/stamp-compile) $(package/stamp-compile) $(package/stamp-install) $(target/stamp-install) FORCE + $(_SINGLE)$(SUBMAKE) -r package/index + $(_SINGLE)$(SUBMAKE) -r json_overview_image_info + $(_SINGLE)$(SUBMAKE) -r checksum +ifneq ($(CONFIG_CCACHE),) + $(STAGING_DIR_HOST)/bin/ccache -s +endif + +.PHONY: clean dirclean prereq prepare world package/symlinks package/symlinks-install package/symlinks-clean + +endif diff --git a/README.md b/README.md new file mode 100644 index 0000000..29ff89f --- /dev/null +++ b/README.md @@ -0,0 +1,108 @@ +![OpenWrt logo](include/logo.png) + +OpenWrt Project is a Linux operating system targeting embedded devices. Instead +of trying to create a single, static firmware, OpenWrt provides a fully +writable filesystem with package management. This frees you from the +application selection and configuration provided by the vendor and allows you +to customize the device through the use of packages to suit any application. +For developers, OpenWrt is the framework to build an application without having +to build a complete firmware around it; for users this means the ability for +full customization, to use the device in ways never envisioned. + +Sunshine! + +## Download + +Built firmware images are available for many architectures and come with a +package selection to be used as WiFi home router. To quickly find a factory +image usable to migrate from a vendor stock firmware to OpenWrt, try the +*Firmware Selector*. + +* [OpenWrt Firmware Selector](https://firmware-selector.openwrt.org/) + +If your device is supported, please follow the **Info** link to see install +instructions or consult the support resources listed below. + +## + +An advanced user may require additional or specific package. (Toolchain, SDK, ...) For everything else than simple firmware download, try the wiki download page: + +* [OpenWrt Wiki Download](https://openwrt.org/downloads) + +## Development + +To build your own firmware you need a GNU/Linux, BSD or MacOSX system (case +sensitive filesystem required). Cygwin is unsupported because of the lack of a +case sensitive file system. + +### Requirements + +You need the following tools to compile OpenWrt, the package names vary between +distributions. A complete list with distribution specific packages is found in +the [Build System Setup](https://openwrt.org/docs/guide-developer/build-system/install-buildsystem) +documentation. + +``` +binutils bzip2 diff find flex gawk gcc-6+ getopt grep install libc-dev libz-dev +make4.1+ perl python3.6+ rsync subversion unzip which +``` + +### Quickstart + +1. Run `./scripts/feeds update -a` to obtain all the latest package definitions + defined in feeds.conf / feeds.conf.default + +2. Run `./scripts/feeds install -a` to install symlinks for all obtained + packages into package/feeds/ + +3. Run `make menuconfig` to select your preferred configuration for the + toolchain, target system & firmware packages. + +4. Run `make` to build your firmware. This will download all sources, build the + cross-compile toolchain and then cross-compile the GNU/Linux kernel & all chosen + applications for your target system. + +### Related Repositories + +The main repository uses multiple sub-repositories to manage packages of +different categories. All packages are installed via the OpenWrt package +manager called `opkg`. If you're looking to develop the web interface or port +packages to OpenWrt, please find the fitting repository below. + +* [LuCI Web Interface](https://github.com/openwrt/luci): Modern and modular + interface to control the device via a web browser. + +* [OpenWrt Packages](https://github.com/openwrt/packages): Community repository + of ported packages. + +* [OpenWrt Routing](https://github.com/openwrt/routing): Packages specifically + focused on (mesh) routing. + +* [OpenWrt Video](https://github.com/openwrt/video): Packages specifically + focused on display servers and clients (Xorg and Wayland). + +## Support Information + +For a list of supported devices see the [OpenWrt Hardware Database](https://openwrt.org/supported_devices) + +### Documentation + +* [Quick Start Guide](https://openwrt.org/docs/guide-quick-start/start) +* [User Guide](https://openwrt.org/docs/guide-user/start) +* [Developer Documentation](https://openwrt.org/docs/guide-developer/start) +* [Technical Reference](https://openwrt.org/docs/techref/start) + +### Support Community + +* [Forum](https://forum.openwrt.org): For usage, projects, discussions and hardware advise. +* [Support Chat](https://webchat.oftc.net/#openwrt): Channel `#openwrt` on **oftc.net**. + +### Developer Community + +* [Bug Reports](https://bugs.openwrt.org): Report bugs in OpenWrt +* [Dev Mailing List](https://lists.openwrt.org/mailman/listinfo/openwrt-devel): Send patches +* [Dev Chat](https://webchat.oftc.net/#openwrt-devel): Channel `#openwrt-devel` on **oftc.net**. + +## License + +OpenWrt is licensed under GPL-2.0 diff --git a/config/Config-build.in b/config/Config-build.in new file mode 100644 index 0000000..fe16d81 --- /dev/null +++ b/config/Config-build.in @@ -0,0 +1,400 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2013 OpenWrt.org +# Copyright (C) 2016 LEDE Project + +config EXPERIMENTAL + bool "Enable experimental features by default" + help + Set this option to build with latest bleeding edge features + which may or may not work as expected. + If you would like to help the development of OpenWrt, you are + encouraged to set this option and provide feedback (both + positive and negative). But do so only if you know how to + recover your device in case of flashing potentially non-working + firmware. + + If you plan to use this build in production, say NO! + +menu "Global build settings" + + config JSON_OVERVIEW_IMAGE_INFO + bool "Create JSON info file overview per target" + default y + help + Create a JSON info file called profiles.json in the target + directory containing machine readable list of built profiles + and resulting images. + + config JSON_CYCLONEDX_SBOM + bool "Create CycloneDX SBOM JSON" + default BUILDBOT + help + Create a JSON files *.bom.cdx.json in the build + directory containing Software Bill Of Materials in CycloneDX + format. + + config ALL_NONSHARED + bool "Select all target specific packages by default" + select ALL_KMODS + default BUILDBOT + + config ALL_KMODS + bool "Select all kernel module packages by default" + + config ALL + bool "Select all userspace packages by default" + select ALL_KMODS + select ALL_NONSHARED + + config BUILDBOT + bool "Set build defaults for automatic builds (e.g. via buildbot)" + help + This option changes several defaults to be more suitable for + automatic builds. This includes the following changes: + - Deleting build directories after compiling (to save space) + - Enabling per-device rootfs support + ... + + config SIGNED_PACKAGES + bool "Cryptographically signed package lists" + default y + + config SIGNATURE_CHECK + bool "Enable signature checking in opkg" + default SIGNED_PACKAGES + + config DOWNLOAD_CHECK_CERTIFICATE + bool "Enable TLS certificate verification during package download" + default y + + comment "General build options" + + config TESTING_KERNEL + bool "Use the testing kernel version" + depends on HAS_TESTING_KERNEL + default EXPERIMENTAL + help + If the target supports a newer kernel version than the default, + you can use this config option to enable it + + + config DISPLAY_SUPPORT + bool "Show packages that require graphics support (local or remote)" + + config BUILD_PATENTED + bool "Compile with support for patented functionality" + help + When this option is disabled, software which provides patented functionality + will not be built. In case software provides optional support for patented + functionality, this optional support will get disabled for this package. + + config BUILD_NLS + bool "Compile with full language support" + help + When this option is enabled, packages are built with the full versions of + iconv and GNU gettext instead of the default OpenWrt stubs. If uClibc is + used, it is also built with locale support. + + config SHADOW_PASSWORDS + bool + default y + + config CLEAN_IPKG + bool + prompt "Remove ipkg/opkg status data files in final images" + help + This removes all ipkg/opkg status data files from the target directory + before building the root filesystem. + + config IPK_FILES_CHECKSUMS + bool + prompt "Record files checksums in package metadata" + help + This makes file checksums part of package metadata. It increases size + but provides you with pkg_check command to check for flash corruptions. + + config INCLUDE_CONFIG + bool "Include build configuration in firmware" if DEVEL + help + If enabled, buildinfo files will be stored in /etc/build.* of firmware. + + config REPRODUCIBLE_DEBUG_INFO + bool "Make debug information reproducible" + default BUILDBOT + help + This strips the local build path out of debug information. This has the + advantage of making it reproducible, but the disadvantage of making local + debugging using ./scripts/remote-gdb harder, since the debug data will + no longer point to the full path on the build host. + + config COLLECT_KERNEL_DEBUG + bool + prompt "Collect kernel debug information" + select KERNEL_DEBUG_INFO + default BUILDBOT + help + This collects debugging symbols from the kernel and all compiled modules. + Useful for release builds, so that kernel issues can be debugged offline + later. + + menu "Kernel build options" + + source "config/Config-kernel.in" + + endmenu + + comment "Package build options" + + config DEBUG + bool + prompt "Compile packages with debugging info" + help + Adds -g3 to the CFLAGS. + + config USE_GC_SECTIONS + bool + prompt "Dead code and data elimination for all packages (EXPERIMENTAL)" + help + Places functions and data items into its own sections to use the linker's + garbage collection capabilites. + Packages can choose to opt-out via setting PKG_BUILD_FLAGS:=no-gc-sections + + config USE_LTO + bool + prompt "Use the link-time optimizer for all packages (EXPERIMENTAL)" + help + Adds LTO flags to the CFLAGS and LDFLAGS. + Packages can choose to opt-out via setting PKG_BUILD_FLAGS:=no-lto + + config IPV6 + def_bool y + + comment "Stripping options" + + choice + prompt "Binary stripping method" + default USE_STRIP if USE_GLIBC + default USE_SSTRIP + help + Select the binary stripping method you wish to use. + + config NO_STRIP + bool "none" + help + This will install unstripped binaries (useful for native + compiling/debugging). + + config USE_STRIP + bool "strip" + help + This will install binaries stripped using strip from binutils. + + + config USE_SSTRIP + bool "sstrip" + depends on !USE_GLIBC + help + This will install binaries stripped using sstrip. + endchoice + + config STRIP_ARGS + string + prompt "Strip arguments" + depends on USE_STRIP + default "--strip-unneeded --remove-section=.comment --remove-section=.note" if DEBUG + default "--strip-all" + help + Specifies arguments passed to the strip command when stripping binaries. + + config SSTRIP_ARGS + string + prompt "Sstrip arguments" + depends on USE_SSTRIP + default "-z" + help + Specifies arguments passed to the sstrip command when stripping binaries. + + config STRIP_KERNEL_EXPORTS + bool "Strip unnecessary exports from the kernel image" + help + Reduces kernel size by stripping unused kernel exports from the kernel + image. Note that this might make the kernel incompatible with any kernel + modules that were not selected at the time the kernel image was created. + + config USE_MKLIBS + bool "Strip unnecessary functions from libraries" + help + Reduces libraries to only those functions that are necessary for using all + selected packages (including those selected as ). Note that this will + make the system libraries incompatible with most of the packages that are + not selected during the build process. + + comment "Hardening build options" + + config PKG_CHECK_FORMAT_SECURITY + bool + prompt "Enable gcc format-security" + default y + help + Add -Wformat -Werror=format-security to the CFLAGS. You can disable + this per package by adding PKG_CHECK_FORMAT_SECURITY:=0 in the package + Makefile. + + choice + prompt "User space ASLR PIE compilation" + default PKG_ASLR_PIE_NONE if ((SMALL_FLASH || LOW_MEMORY_FOOTPRINT) && !SDK) + default PKG_ASLR_PIE_REGULAR + help + Add -fPIC to CFLAGS and -specs=hardened-build-ld to LDFLAGS. + This enables package build as Position Independent Executables (PIE) + to protect against "return-to-text" attacks. This belongs to the + feature of Address Space Layout Randomisation (ASLR), which is + implemented by the kernel and the ELF loader by randomising the + location of memory allocations. This makes memory addresses harder + to predict when an attacker is attempting a memory-corruption exploit. + You can disable this per package by adding PKG_ASLR_PIE:=0 in the package + Makefile. + Be ware that ASLR increases the binary size. + config PKG_ASLR_PIE_NONE + bool "None" + help + PIE is deactivated for all applications + config PKG_ASLR_PIE_REGULAR + bool "Regular" + help + PIE is activated for some binaries, mostly network exposed applications + config PKG_ASLR_PIE_ALL + bool "All" + select BUSYBOX_DEFAULT_PIE + help + PIE is activated for all applications + endchoice + + choice + prompt "User space Stack-Smashing Protection" + default PKG_CC_STACKPROTECTOR_REGULAR + help + Enable GCC Stack Smashing Protection (SSP) for userspace applications + config PKG_CC_STACKPROTECTOR_NONE + bool "None" + config PKG_CC_STACKPROTECTOR_REGULAR + bool "Regular" + config PKG_CC_STACKPROTECTOR_STRONG + bool "Strong" + endchoice + + choice + prompt "Kernel space Stack-Smashing Protection" + default KERNEL_CC_STACKPROTECTOR_REGULAR + help + Enable GCC Stack-Smashing Protection (SSP) for the kernel + config KERNEL_CC_STACKPROTECTOR_NONE + bool "None" + config KERNEL_CC_STACKPROTECTOR_REGULAR + bool "Regular" + config KERNEL_CC_STACKPROTECTOR_STRONG + bool "Strong" + endchoice + + config KERNEL_STACKPROTECTOR + bool + default KERNEL_CC_STACKPROTECTOR_REGULAR || KERNEL_CC_STACKPROTECTOR_STRONG + + config KERNEL_STACKPROTECTOR_STRONG + bool + default KERNEL_CC_STACKPROTECTOR_STRONG + + choice + prompt "Enable buffer-overflows detection (FORTIFY_SOURCE)" + default PKG_FORTIFY_SOURCE_1 + help + Enable the _FORTIFY_SOURCE macro which introduces additional + checks to detect buffer-overflows in the following standard library + functions: memcpy, mempcpy, memmove, memset, strcpy, stpcpy, + strncpy, strcat, strncat, sprintf, vsprintf, snprintf, vsnprintf, + gets. "Conservative" (_FORTIFY_SOURCE set to 1) only introduces + checks that shouldn't change the behavior of conforming programs, + while "aggressive" (_FORTIFY_SOURCES set to 2) some more checking is + added, but some conforming programs might fail. + config PKG_FORTIFY_SOURCE_NONE + bool "None" + config PKG_FORTIFY_SOURCE_1 + bool "Conservative" + config PKG_FORTIFY_SOURCE_2 + bool "Aggressive" + endchoice + + choice + prompt "Enable RELRO protection" + default PKG_RELRO_FULL + help + Enable a link-time protection known as RELRO (Relocation Read Only) + which helps to protect from certain type of exploitation techniques + altering the content of some ELF sections. "Partial" RELRO makes the + .dynamic section not writeable after initialization, introducing + almost no performance penalty, while "full" RELRO also marks the GOT + as read-only at the cost of initializing all of it at startup. + config PKG_RELRO_NONE + bool "None" + config PKG_RELRO_PARTIAL + bool "Partial" + config PKG_RELRO_FULL + bool "Full" + endchoice + + config TARGET_ROOTFS_SECURITY_LABELS + bool + select KERNEL_SQUASHFS_XATTR + select KERNEL_EXT4_FS_SECURITY + select KERNEL_F2FS_FS_SECURITY + select KERNEL_UBIFS_FS_SECURITY + select KERNEL_JFFS2_FS_SECURITY + + config SELINUX + bool "Enable SELinux" + select KERNEL_SECURITY_SELINUX + select TARGET_ROOTFS_SECURITY_LABELS + select PACKAGE_procd-selinux + select PACKAGE_busybox-selinux + help + This option enables SELinux kernel features, applies security labels + in squashfs rootfs and selects the selinux-variants of busybox and procd. + + Selecting this option results in about 0.5MiB of additional flash space + usage accounting for increased kernel and rootfs size. + + choice + prompt "default SELinux type" + depends on TARGET_ROOTFS_SECURITY_LABELS + default SELINUXTYPE_dssp + help + Select SELinux policy to be installed and used for applying rootfs labels. + + config SELINUXTYPE_targeted + bool "targeted" + select PACKAGE_refpolicy + help + SELinux Reference Policy (refpolicy) + + config SELINUXTYPE_dssp + bool "dssp" + select PACKAGE_selinux-policy + help + Defensec SELinux Security Policy -- OpenWrt edition + + endchoice + + config SECCOMP + bool "Enable SECCOMP" + select KERNEL_SECCOMP + select PACKAGE_procd-seccomp + depends on (aarch64 || arm || armeb || mips || mipsel || mips64 || mips64el || i386 || powerpc || x86_64) + depends on !TARGET_uml + default y + help + This option enables seccomp kernel features to safely + execute untrusted bytecode and selects the seccomp-variants + of procd + +endmenu diff --git a/config/Config-devel.in b/config/Config-devel.in new file mode 100644 index 0000000..cbac91c --- /dev/null +++ b/config/Config-devel.in @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2013 OpenWrt.org + +menuconfig DEVEL + bool "Advanced configuration options (for developers)" + + config BROKEN + bool "Show broken platforms / packages / devices" if DEVEL + + config BINARY_FOLDER + string "Binary folder" if DEVEL + default "" + help + Store built firmware images and filesystem images in this directory. + If not set, uses './bin/$(BOARD)' + + config DOWNLOAD_TOOL_CUSTOM + string "Use custom download tool" if DEVEL + default "" + help + Use and force custom download tool instead of relying on autoselection + between curl if available and wget as a fallback. + + download.pl supports 3 tools officially aria2c, curl and wget. + If one of the tool is used in this config, download.pl will use the + default args to make use of them. + + If the provided string is different than aria2c, curl or wget, the command + is used as is and the download url will be appended at the end of such command. + + config DOWNLOAD_FOLDER + string "Download folder" if DEVEL + default "" + help + Store downloaded source bundles in this directory. + If not set then defaults to './dl', which is removed by operations such as + 'git clean -xdf' or 'make distclean'. + This option is useful if you have a low bandwidth Internet connection, and by + setting a path outside the OpenWrt tree downloads will be saved. + + config LOCALMIRROR + string "Local mirror for source packages" if DEVEL + default "" + + config AUTOREBUILD + bool "Automatic rebuild of packages" if DEVEL + default y + help + Automatically rebuild packages when their files change. + + config AUTOREMOVE + bool "Automatic removal of build directories" if DEVEL + help + Automatically delete build directories after make target completed. + This allows you to symlink build_dir into a scratch location, e.g. a ramdisk, + which does not have enough space to keep a complete build_dir. + + config BUILD_ALL_HOST_TOOLS + bool "Compile all host tools" if DEVEL + help + Compile all host host tools even if not needed. This is needed to prepare a + universal precompiled host tools archive to use in another buildroot. + + config BUILD_SUFFIX + string "Build suffix to append to the target BUILD_DIR variable" if DEVEL + default "" + help + Build suffix to append to the BUILD_DIR variable, i.e: './build_dir/{target-build-dir}_$(BUILD_SUFFIX)'. + This allows you to switch to a different .config whilst retaining all the build + objects generated by the first .config + + config TARGET_ROOTFS_DIR + string "Override the default TARGET_ROOTFS_DIR variable" if DEVEL + default "" + help + Override the default TARGET_ROOTFS_DIR variable content $(BUILD_DIR) with + custom path. Use this option to re-define the location of the target + root filesystem directory. + + config CCACHE + bool "Use ccache" if DEVEL + help + Compiler cache; see https://ccache.samba.org/ + + config CCACHE_DIR + string "Set ccache directory" if CCACHE + default "" + help + Store ccache in this directory. + If not set, uses './.ccache' + + config KERNEL_CFLAGS + string "Kernel extra CFLAGS" if DEVEL + default "-falign-functions=32" if TARGET_bcm53xx + default "" + + config EXTERNAL_KERNEL_TREE + string "Use external kernel tree" if DEVEL + default "" + + config KERNEL_GIT_CLONE_URI + string "Enter git repository to clone" if DEVEL + default "" + help + Enter the full git repository path i.e.: + git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git + This will create a git clone of the kernel in your build directory. + + config KERNEL_GIT_LOCAL_REPOSITORY + string "Enter path to local reference repository" if DEVEL + depends on (KERNEL_GIT_CLONE_URI != "") + default "" + help + Enter a full pathname to a local reference git repository. + In this instance, the --reference option of git clone will + be used thus creating a quick local clone of your repo. + + config KERNEL_GIT_REF + string "Enter git ref at which to checkout" if DEVEL + depends on (KERNEL_GIT_CLONE_URI != "") + default "" + help + Enter the git ref at which to checkout the git repository + after it is cloned, and before making it a tar-ball. + It can be a git hash or a branch name. + If unused, the clone's repository HEAD will be checked-out. + + config KERNEL_GIT_MIRROR_HASH + string "Enter hash of Git kernel tree source checkout tarball" if DEVEL + depends on (KERNEL_GIT_CLONE_URI != "") + default "" + + config BUILD_LOG + bool "Enable log files during build process" if DEVEL + help + If enabled, log files will be written to the ./log directory. + + config BUILD_LOG_DIR + string "Log folder" if DEVEL + default "" + help + Store build logs in this directory. + If not set, uses './logs' + + config SRC_TREE_OVERRIDE + bool "Enable package source tree override" if DEVEL + help + If enabled, you can force a package to use a git tree as source + code instead of the normal tarball. Create a symlink 'git-src' + in the package directory, pointing to the .git tree that you want + to pull the source code from. + + config EXTRA_OPTIMIZATION + string "Additional compiler options" if DEVEL + default "-fno-caller-saves -fno-plt" if !CONFIG_EXTERNAL_TOOLCHAIN && !arc + default "-fno-caller-saves" + help + Extra target-independent optimizations to use when building for the target. diff --git a/config/Config-images.in b/config/Config-images.in new file mode 100644 index 0000000..c32fa00 --- /dev/null +++ b/config/Config-images.in @@ -0,0 +1,321 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2013 OpenWrt.org + +menu "Target Images" + + menuconfig TARGET_ROOTFS_INITRAMFS + bool "ramdisk" + default y if USES_INITRAMFS + help + Embed the root filesystem into the kernel (initramfs). + + choice + prompt "Compression" + default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_apm821xx + default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_ath79_mikrotik + default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_lantiq + default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_mpc85xx + default TARGET_INITRAMFS_COMPRESSION_LZMA if TARGET_ramips + default TARGET_INITRAMFS_COMPRESSION_ZSTD if TARGET_ipq807x + default TARGET_INITRAMFS_COMPRESSION_XZ if USES_SEPARATE_INITRAMFS + default TARGET_INITRAMFS_COMPRESSION_NONE + depends on TARGET_ROOTFS_INITRAMFS + help + Select ramdisk compression. + + config TARGET_INITRAMFS_COMPRESSION_NONE + bool "none" + + config TARGET_INITRAMFS_COMPRESSION_GZIP + bool "gzip" + + config TARGET_INITRAMFS_COMPRESSION_BZIP2 + bool "bzip2" + + config TARGET_INITRAMFS_COMPRESSION_LZMA + bool "lzma" + + config TARGET_INITRAMFS_COMPRESSION_LZO + bool "lzo" + + config TARGET_INITRAMFS_COMPRESSION_LZ4 + bool "lz4" + + config TARGET_INITRAMFS_COMPRESSION_XZ + bool "xz" + + config TARGET_INITRAMFS_COMPRESSION_ZSTD + bool "zstd" + endchoice + + config EXTERNAL_CPIO + string + prompt "Use external cpio" if TARGET_ROOTFS_INITRAMFS + default "" + help + Kernel uses specified external cpio as INITRAMFS_SOURCE. + + config TARGET_INITRAMFS_FORCE + bool "Force" + depends on TARGET_ROOTFS_INITRAMFS + help + Ignore the initramfs passed by the bootloader. + + config TARGET_ROOTFS_INITRAMFS_SEPARATE + bool "separate ramdisk" + depends on USES_SEPARATE_INITRAMFS && TARGET_ROOTFS_INITRAMFS && !TARGET_INITRAMFS_FORCE + default y if USES_SEPARATE_INITRAMFS + help + Generate separate initrd.cpio instead of embedding it. + This is useful for generating images with a dedicated + ramdisk e.g. in U-Boot's uImage and uImage.FIT formats. + + comment "Root filesystem archives" + + config TARGET_ROOTFS_CPIOGZ + bool "cpio.gz" + default y if USES_CPIOGZ + help + Build a compressed cpio archive of the root filesystem. + + config TARGET_ROOTFS_TARGZ + bool "tar.gz" + default y if USES_TARGZ + help + Build a compressed tar archive of the root filesystem. + + comment "Root filesystem images" + + menuconfig TARGET_ROOTFS_EXT4FS + bool "ext4" + default y if USES_EXT4 + help + Build an ext4 root filesystem. + + config TARGET_EXT4_RESERVED_PCT + int "Percentage of reserved blocks in root filesystem" + depends on TARGET_ROOTFS_EXT4FS + default 0 + help + Select the percentage of reserved blocks in the root filesystem. + + choice + prompt "Root filesystem block size" + default TARGET_EXT4_BLOCKSIZE_4K + depends on TARGET_ROOTFS_EXT4FS + help + Select the block size of the root filesystem. + + config TARGET_EXT4_BLOCKSIZE_4K + bool "4k" + + config TARGET_EXT4_BLOCKSIZE_2K + bool "2k" + + config TARGET_EXT4_BLOCKSIZE_1K + bool "1k" + endchoice + + config TARGET_EXT4_BLOCKSIZE + int + default 4096 if TARGET_EXT4_BLOCKSIZE_4K + default 2048 if TARGET_EXT4_BLOCKSIZE_2K + default 1024 if TARGET_EXT4_BLOCKSIZE_1K + depends on TARGET_ROOTFS_EXT4FS + + config TARGET_EXT4_JOURNAL + bool "Create a journaling filesystem" + depends on TARGET_ROOTFS_EXT4FS + default y + help + Create an ext4 filesystem with a journal. + + config TARGET_ROOTFS_JFFS2 + bool "jffs2" + depends on USES_JFFS2 + help + Build a JFFS2 root filesystem. + + config TARGET_ROOTFS_JFFS2_NAND + bool "jffs2 for NAND" + default y if USES_JFFS2_NAND + depends on USES_JFFS2_NAND + help + Build a JFFS2 root filesystem for NAND flash. + + menuconfig TARGET_ROOTFS_SQUASHFS + bool "squashfs" + default y if USES_SQUASHFS + help + Build a squashfs root filesystem. + + config TARGET_SQUASHFS_BLOCK_SIZE + int "Block size (in KiB)" + depends on TARGET_ROOTFS_SQUASHFS + default 64 if LOW_MEMORY_FOOTPRINT + default 1024 if (SMALL_FLASH && !LOW_MEMORY_FOOTPRINT) + default 256 + help + Select squashfs block size, must be one of: + 4, 8, 16, 32, 64, 128, 256, 512, 1024 + + menuconfig TARGET_ROOTFS_UBIFS + bool "ubifs" + default y if USES_UBIFS + depends on USES_UBIFS + help + Build a UBIFS root filesystem. + + choice + prompt "compression" + default TARGET_UBIFS_COMPRESSION_ZLIB + depends on TARGET_ROOTFS_UBIFS + help + Select compression type + + config TARGET_UBIFS_COMPRESSION_NONE + bool "none" + + config TARGET_UBIFS_COMPRESSION_LZO + bool "lzo" + + config TARGET_UBIFS_COMPRESSION_ZLIB + bool "zlib" + endchoice + + config TARGET_UBIFS_FREE_SPACE_FIXUP + bool "free space fixup" if TARGET_ROOTFS_UBIFS + default y + help + The filesystem free space has to be fixed up on first mount. + + config TARGET_UBIFS_JOURNAL_SIZE + string + prompt "journal size" if TARGET_ROOTFS_UBIFS + default "" + + config GRUB_IMAGES + bool "Build GRUB images (Linux x86 or x86_64 host only)" + depends on TARGET_x86 + depends on TARGET_ROOTFS_EXT4FS || TARGET_ROOTFS_JFFS2 || TARGET_ROOTFS_SQUASHFS + select PACKAGE_grub2 + select PACKAGE_grub2-bios-setup + default y + + config GRUB_EFI_IMAGES + bool "Build GRUB EFI images (Linux x86 or x86_64 host only)" + depends on TARGET_x86 || TARGET_armsr + depends on TARGET_ROOTFS_EXT4FS || TARGET_ROOTFS_JFFS2 || TARGET_ROOTFS_SQUASHFS + select PACKAGE_grub2 if TARGET_x86 + select PACKAGE_grub2-efi if TARGET_x86 + select PACKAGE_grub2-bios-setup if TARGET_x86 + select PACKAGE_grub2-efi-arm if TARGET_armsr + select PACKAGE_kmod-fs-vfat + default y + + config GRUB_CONSOLE + bool "Use Console Terminal (in addition to Serial)" + depends on GRUB_IMAGES || GRUB_EFI_IMAGES + default y + + config GRUB_SERIAL + string "Serial port device" + depends on GRUB_IMAGES || GRUB_EFI_IMAGES + default "ttyS0" + + config GRUB_BAUDRATE + int "Serial port baud rate" + depends on GRUB_IMAGES || GRUB_EFI_IMAGES + default 38400 if TARGET_x86_generic + default 115200 + + config GRUB_FLOWCONTROL + bool "Use RTE/CTS on serial console" + depends on GRUB_SERIAL != "" + + config GRUB_BOOTOPTS + string "Extra kernel boot options" + depends on GRUB_IMAGES || GRUB_EFI_IMAGES + help + If you don't know, just leave it blank. + + config GRUB_TIMEOUT + string "Seconds to wait before booting the default entry" + depends on GRUB_IMAGES || GRUB_EFI_IMAGES + default "5" + help + If you don't know, 5 seconds is a reasonable default. + + config GRUB_TITLE + string "Title for the menu entry in GRUB" + depends on GRUB_IMAGES || GRUB_EFI_IMAGES + default "OpenWrt" + help + This is the title of the GRUB menu entry. + If unspecified, it defaults to OpenWrt. + + config ISO_IMAGES + bool "Build LiveCD image (ISO)" + depends on TARGET_x86 + depends on GRUB_IMAGES || GRUB_EFI_IMAGES + + config VDI_IMAGES + bool "Build VirtualBox image files (VDI)" + depends on TARGET_x86 + depends on GRUB_IMAGES || GRUB_EFI_IMAGES + select PACKAGE_kmod-e1000 + + config VMDK_IMAGES + bool "Build VMware image files (VMDK)" + depends on TARGET_x86 || TARGET_armsr + depends on GRUB_IMAGES || GRUB_EFI_IMAGES + select PACKAGE_kmod-e1000 + + config VHDX_IMAGES + bool "Build Hyper-V image files (VHDX)" + depends on TARGET_x86 + depends on GRUB_IMAGES || GRUB_EFI_IMAGES + select PACKAGE_kmod-e1000 + + config TARGET_IMAGES_GZIP + bool "GZip images" + depends on TARGET_ROOTFS_EXT4FS || TARGET_x86 || TARGET_armsr || TARGET_malta + default y + + comment "Image Options" + + source "target/linux/*/image/Config.in" + source "target/linux/*/*/image/Config.in" + + config TARGET_KERNEL_PARTSIZE + int "Kernel partition size (in MiB)" + depends on USES_BOOT_PART + default 8 if TARGET_apm821xx_sata + default 64 if TARGET_bcm27xx + default 128 if TARGET_armsr + default 16 + + config TARGET_ROOTFS_PARTSIZE + int "Root filesystem partition size (in MiB)" + depends on USES_ROOTFS_PART || TARGET_ROOTFS_EXT4FS + default 104 + help + Select the root filesystem partition size. + + config TARGET_ROOTFS_PARTNAME + string "Root partition on target device" + depends on GRUB_IMAGES || GRUB_EFI_IMAGES + help + Override the root partition on the final device. If left empty, + it will be mounted by PARTUUID which makes the kernel find the + appropriate disk automatically. + + config TARGET_ROOTFS_PERSIST_VAR + bool "Make /var persistent" + help + Do not symlink /var to /tmp, so that its content will persist + across reboots. When enabled, /var/run will still be linked + to /tmp/run. + +endmenu diff --git a/config/Config-kernel.in b/config/Config-kernel.in new file mode 100644 index 0000000..ea828ae --- /dev/null +++ b/config/Config-kernel.in @@ -0,0 +1,1346 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2014 OpenWrt.org + +config KERNEL_BUILD_USER + string "Custom Kernel Build User Name" + default "builder" if BUILDBOT + default "" + help + Sets the Kernel build user string, which for example will be returned + by 'uname -a' on running systems. + If not set, uses system user at build time. + +config KERNEL_BUILD_DOMAIN + string "Custom Kernel Build Domain Name" + default "buildhost" if BUILDBOT + default "" + help + Sets the Kernel build domain string, which for example will be + returned by 'uname -a' on running systems. + If not set, uses system hostname at build time. + +config KERNEL_PRINTK + bool "Enable support for printk" + default y + +config KERNEL_SWAP + bool "Support for paging of anonymous memory (swap)" + default y if !SMALL_FLASH + +config KERNEL_PROC_STRIPPED + bool "Strip non-essential /proc functionality to reduce code size" + default y if SMALL_FLASH + +config KERNEL_DEBUG_FS + bool "Compile the kernel with debug filesystem enabled" + default y + help + debugfs is a virtual file system that kernel developers use to put + debugging files into. Enable this option to be able to read and + write to these files. Many common debugging facilities, such as + ftrace, require the existence of debugfs. + +config KERNEL_MIPS_FP_SUPPORT + bool + default y if TARGET_pistachio + +config KERNEL_ARM_PMU + bool + default y if TARGET_armsr_armv8 + depends on (arm || aarch64) + +config KERNEL_X86_VSYSCALL_EMULATION + bool "Enable vsyscall emulation" + depends on x86_64 + help + This enables emulation of the legacy vsyscall page. Disabling + it is roughly equivalent to booting with vsyscall=none, except + that it will also disable the helpful warning if a program + tries to use a vsyscall. With this option set to N, offending + programs will just segfault, citing addresses of the form + 0xffffffffff600?00. + + This option is required by many programs built before 2013, and + care should be used even with newer programs if set to N. + + Disabling this option saves about 7K of kernel size and + possibly 4K of additional runtime pagetable memory. + +config KERNEL_PERF_EVENTS + bool "Compile the kernel with performance events and counters" + select KERNEL_ARM_PMU if (arm || aarch64) + +config KERNEL_PROFILING + bool "Compile the kernel with profiling enabled" + select KERNEL_PERF_EVENTS + help + Enable the extended profiling support mechanisms used by profilers such + as OProfile. + +config KERNEL_RPI_AXIPERF + bool "Compile the kernel with RaspberryPi AXI Performance monitors" + default y + depends on KERNEL_PERF_EVENTS && TARGET_bcm27xx + +config KERNEL_UBSAN + bool "Compile the kernel with undefined behaviour sanity checker" + help + This option enables undefined behaviour sanity checker + Compile-time instrumentation is used to detect various undefined + behaviours in runtime. Various types of checks may be enabled + via boot parameter ubsan_handle + (see: Documentation/dev-tools/ubsan.rst). + +config KERNEL_UBSAN_SANITIZE_ALL + bool "Enable instrumentation for the entire kernel" + depends on KERNEL_UBSAN + default y + help + This option activates instrumentation for the entire kernel. + If you don't enable this option, you have to explicitly specify + UBSAN_SANITIZE := y for the files/directories you want to check for UB. + Enabling this option will get kernel image size increased + significantly. + +config KERNEL_UBSAN_ALIGNMENT + bool "Enable checking of pointers alignment" + depends on KERNEL_UBSAN + help + This option enables detection of unaligned memory accesses. + Enabling this option on architectures that support unaligned + accesses may produce a lot of false positives. + +config KERNEL_UBSAN_BOUNDS + bool "Perform array index bounds checking" + depends on KERNEL_UBSAN + help + This option enables detection of directly indexed out of bounds array + accesses, where the array size is known at compile time. Note that + this does not protect array overflows via bad calls to the + {str,mem}*cpy() family of functions (that is addressed by + FORTIFY_SOURCE). + +config KERNEL_UBSAN_NULL + bool "Enable checking of null pointers" + depends on KERNEL_UBSAN + help + This option enables detection of memory accesses via a + null pointer. + +config KERNEL_UBSAN_TRAP + bool "On Sanitizer warnings, abort the running kernel code" + depends on KERNEL_UBSAN + help + Building kernels with Sanitizer features enabled tends to grow the + kernel size by around 5%, due to adding all the debugging text on + failure paths. To avoid this, Sanitizer instrumentation can just + issue a trap. This reduces the kernel size overhead but turns all + warnings (including potentially harmless conditions) into full + exceptions that abort the running kernel code (regardless of context, + locks held, etc), which may destabilize the system. For some system + builders this is an acceptable trade-off. + +config KERNEL_KASAN + bool "Compile the kernel with KASan: runtime memory debugger" + select KERNEL_SLUB_DEBUG + depends on (x86_64 || aarch64) + help + Enables kernel address sanitizer - runtime memory debugger, + designed to find out-of-bounds accesses and use-after-free bugs. + This is strictly a debugging feature and it requires a gcc version + of 4.9.2 or later. Detection of out of bounds accesses to stack or + global variables requires gcc 5.0 or later. + This feature consumes about 1/8 of available memory and brings about + ~x3 performance slowdown. + For better error detection enable CONFIG_STACKTRACE. + Currently CONFIG_KASAN doesn't work with CONFIG_DEBUG_SLAB + (the resulting kernel does not boot). + +config KERNEL_KASAN_VMALLOC + bool "Back mappings in vmalloc space with real shadow memory" + depends on KERNEL_KASAN + help + By default, the shadow region for vmalloc space is the read-only + zero page. This means that KASAN cannot detect errors involving + vmalloc space. + + Enabling this option will hook in to vmap/vmalloc and back those + mappings with real shadow memory allocated on demand. This allows + for KASAN to detect more sorts of errors (and to support vmapped + stacks), but at the cost of higher memory usage. + + This option depends on HAVE_ARCH_KASAN_VMALLOC, but we can't + depend on that in here, so it is possible that enabling this + will have no effect. + +if KERNEL_KASAN + config KERNEL_KASAN_GENERIC + def_bool y + + config KERNEL_KASAN_SW_TAGS + def_bool n +endif + +choice + prompt "Instrumentation type" + depends on KERNEL_KASAN + default KERNEL_KASAN_OUTLINE + +config KERNEL_KASAN_OUTLINE + bool "Outline instrumentation" + help + Before every memory access compiler insert function call + __asan_load*/__asan_store*. These functions performs check + of shadow memory. This is slower than inline instrumentation, + however it doesn't bloat size of kernel's .text section so + much as inline does. + +config KERNEL_KASAN_INLINE + bool "Inline instrumentation" + help + Compiler directly inserts code checking shadow memory before + memory accesses. This is faster than outline (in some workloads + it gives about x2 boost over outline instrumentation), but + make kernel's .text size much bigger. + This requires a gcc version of 5.0 or later. + +endchoice + +config KERNEL_KCOV + bool "Compile the kernel with code coverage for fuzzing" + select KERNEL_DEBUG_FS + help + KCOV exposes kernel code coverage information in a form suitable + for coverage-guided fuzzing (randomized testing). + + If RANDOMIZE_BASE is enabled, PC values will not be stable across + different machines and across reboots. If you need stable PC values, + disable RANDOMIZE_BASE. + + For more details, see Documentation/kcov.txt. + +config KERNEL_KCOV_ENABLE_COMPARISONS + bool "Enable comparison operands collection by KCOV" + depends on KERNEL_KCOV + help + KCOV also exposes operands of every comparison in the instrumented + code along with operand sizes and PCs of the comparison instructions. + These operands can be used by fuzzing engines to improve the quality + of fuzzing coverage. + +config KERNEL_KCOV_INSTRUMENT_ALL + bool "Instrument all code by default" + depends on KERNEL_KCOV + default y if KERNEL_KCOV + help + If you are doing generic system call fuzzing (like e.g. syzkaller), + then you will want to instrument the whole kernel and you should + say y here. If you are doing more targeted fuzzing (like e.g. + filesystem fuzzing with AFL) then you will want to enable coverage + for more specific subsets of files, and should say n here. + +config KERNEL_TASKSTATS + bool "Compile the kernel with task resource/io statistics and accounting" + help + Enable the collection and publishing of task/io statistics and + accounting. Enable this option to enable i/o monitoring in system + monitors. + +if KERNEL_TASKSTATS + + config KERNEL_TASK_DELAY_ACCT + def_bool y + + config KERNEL_TASK_IO_ACCOUNTING + def_bool y + + config KERNEL_TASK_XACCT + def_bool y + +endif + +config KERNEL_KALLSYMS + bool "Compile the kernel with symbol table information" + default y if !SMALL_FLASH + help + This will give you more information in stack traces from kernel oopses. + +config KERNEL_FTRACE + bool "Compile the kernel with tracing support" + depends on !TARGET_uml + +config KERNEL_FTRACE_SYSCALLS + bool "Trace system calls" + depends on KERNEL_FTRACE + +config KERNEL_ENABLE_DEFAULT_TRACERS + bool "Trace process context switches and events" + depends on KERNEL_FTRACE + +config KERNEL_FUNCTION_TRACER + bool "Function tracer" + depends on KERNEL_FTRACE + +config KERNEL_FUNCTION_GRAPH_TRACER + bool "Function graph tracer" + depends on KERNEL_FUNCTION_TRACER + +config KERNEL_DYNAMIC_FTRACE + bool "Enable/disable function tracing dynamically" + depends on KERNEL_FUNCTION_TRACER + +config KERNEL_FUNCTION_PROFILER + bool "Function profiler" + depends on KERNEL_FUNCTION_TRACER + +config KERNEL_IRQSOFF_TRACER + bool "Interrupts-off Latency Tracer" + depends on KERNEL_FTRACE + help + This option measures the time spent in irqs-off critical + sections, with microsecond accuracy. + + The default measurement method is a maximum search, which is + disabled by default and can be runtime (re-)started + via: + + echo 0 > /sys/kernel/debug/tracing/tracing_max_latency + + (Note that kernel size and overhead increase with this option + enabled. This option and the preempt-off timing option can be + used together or separately.) + +config KERNEL_PREEMPT_TRACER + bool "Preemption-off Latency Tracer" + depends on KERNEL_FTRACE + help + This option measures the time spent in preemption-off critical + sections, with microsecond accuracy. + + The default measurement method is a maximum search, which is + disabled by default and can be runtime (re-)started + via: + + echo 0 > /sys/kernel/debug/tracing/tracing_max_latency + + (Note that kernel size and overhead increase with this option + enabled. This option and the irqs-off timing option can be + used together or separately.) + +config KERNEL_HIST_TRIGGERS + bool "Histogram triggers" + depends on KERNEL_FTRACE + help + Hist triggers allow one or more arbitrary trace event fields to be + aggregated into hash tables and dumped to stdout by reading a + debugfs/tracefs file. They're useful for gathering quick and dirty + (though precise) summaries of event activity as an initial guide for + further investigation using more advanced tools. + + Inter-event tracing of quantities such as latencies is also + supported using hist triggers under this option. + +config KERNEL_DEBUG_KERNEL + bool + +config KERNEL_DEBUG_INFO + bool "Compile the kernel with debug information" + default y if !SMALL_FLASH + select KERNEL_DEBUG_KERNEL + help + This will compile your kernel and modules with debug information. + +config KERNEL_DEBUG_INFO_BTF + + bool "Enable additional BTF type information" + depends on !HOST_OS_MACOS + depends on KERNEL_DEBUG_INFO && !KERNEL_DEBUG_INFO_REDUCED + select DWARVES + help + Generate BPF Type Format (BTF) information from DWARF debug info. + Turning this on expects presence of pahole tool, which will convert + DWARF type info into equivalent deduplicated BTF type info. + + Required to run BPF CO-RE applications. + +config KERNEL_DEBUG_INFO_REDUCED + bool "Reduce debugging information" + default y + depends on KERNEL_DEBUG_INFO + help + If you say Y here gcc is instructed to generate less debugging + information for structure types. This means that tools that + need full debugging information (like kgdb or systemtap) won't + be happy. But if you merely need debugging information to + resolve line numbers there is no loss. Advantage is that + build directory object sizes shrink dramatically over a full + DEBUG_INFO build and compile times are reduced too. + Only works with newer gcc versions. + +config KERNEL_FRAME_WARN + int + range 0 8192 + default 1280 if KERNEL_KASAN && !ARCH_64BIT + default 1024 if !ARCH_64BIT + default 2048 if ARCH_64BIT + help + Tell the compiler to warn at build time for stack frames larger than this. + Setting this too low will cause a lot of warnings. + Setting it to 0 disables the warning. + +# KERNEL_DEBUG_LL symbols must have the default value set as otherwise +# KConfig wont evaluate them unless KERNEL_EARLY_PRINTK is selected +# which means that buildroot wont override the DEBUG_LL symbols in target +# kernel configurations and lead to devices that dont have working console +config KERNEL_DEBUG_LL_UART_NONE + bool + default n + depends on arm + +config KERNEL_DEBUG_LL + bool + default n + depends on arm + select KERNEL_DEBUG_LL_UART_NONE + help + ARM low level debugging. + +config KERNEL_DEBUG_VIRTUAL + bool "Compile the kernel with VM translations debugging" + select KERNEL_DEBUG_KERNEL + help + Enable checks sanity checks to catch invalid uses of + virt_to_phys()/phys_to_virt() against the non-linear address space. + +config KERNEL_DYNAMIC_DEBUG + bool "Compile the kernel with dynamic printk" + select KERNEL_DEBUG_FS + help + Compiles debug level messages into the kernel, which would not + otherwise be available at runtime. These messages can then be + enabled/disabled based on various levels of scope - per source file, + function, module, format string, and line number. This mechanism + implicitly compiles in all pr_debug() and dev_dbg() calls, which + enlarges the kernel text size by about 2%. + +config KERNEL_EARLY_PRINTK + bool "Compile the kernel with early printk" + default y if TARGET_bcm53xx + depends on arm + select KERNEL_DEBUG_KERNEL + select KERNEL_DEBUG_LL if arm + help + Compile the kernel with early printk support. This is only useful for + debugging purposes to send messages over the serial console in early boot. + Enable this to debug early boot problems. + +config KERNEL_KPROBES + bool "Compile the kernel with kprobes support" + select KERNEL_FTRACE + select KERNEL_PERF_EVENTS + help + Compiles the kernel with KPROBES support, which allows you to trap + at almost any kernel address and execute a callback function. + register_kprobe() establishes a probepoint and specifies the + callback. Kprobes is useful for kernel debugging, non-intrusive + instrumentation and testing. + If in doubt, say "N". + +config KERNEL_KPROBE_EVENTS + bool + default y if KERNEL_KPROBES + +config KERNEL_BPF_EVENTS + bool "Compile the kernel with BPF event support" + select KERNEL_KPROBES + help + Allows to attach BPF programs to kprobe, uprobe and tracepoint events. + This is required to use BPF maps of type BPF_MAP_TYPE_PERF_EVENT_ARRAY + for sending data from BPF programs to user-space for post-processing + or logging. + +config KERNEL_BPF_KPROBE_OVERRIDE + bool + depends on KERNEL_KPROBES + default n + +config KERNEL_AIO + bool "Compile the kernel with asynchronous IO support" + default y if !SMALL_FLASH + +config KERNEL_IO_URING + bool "Compile the kernel with io_uring support" + depends on !SMALL_FLASH + default y if (x86_64 || aarch64) + +config KERNEL_FHANDLE + bool "Compile the kernel with support for fhandle syscalls" + default y if !SMALL_FLASH + +config KERNEL_FANOTIFY + bool "Compile the kernel with modern file notification support" + default y if !SMALL_FLASH + +config KERNEL_BLK_DEV_BSG + bool "Compile the kernel with SCSI generic v4 support for any block device" + +config KERNEL_TRANSPARENT_HUGEPAGE + bool + +choice + prompt "Transparent Hugepage Support sysfs defaults" + depends on KERNEL_TRANSPARENT_HUGEPAGE + default KERNEL_TRANSPARENT_HUGEPAGE_ALWAYS + + config KERNEL_TRANSPARENT_HUGEPAGE_ALWAYS + bool "always" + + config KERNEL_TRANSPARENT_HUGEPAGE_MADVISE + bool "madvise" +endchoice + +config KERNEL_HUGETLBFS + bool + +config KERNEL_HUGETLB_PAGE + bool "Compile the kernel with HugeTLB support" + select KERNEL_TRANSPARENT_HUGEPAGE + select KERNEL_HUGETLBFS + +config KERNEL_MAGIC_SYSRQ + bool "Compile the kernel with SysRq support" + default y + +config KERNEL_DEBUG_PINCTRL + bool "Compile the kernel with pinctrl debugging" + select KERNEL_DEBUG_KERNEL + +config KERNEL_DEBUG_GPIO + bool "Compile the kernel with gpio debugging" + select KERNEL_DEBUG_KERNEL + +config KERNEL_COREDUMP + bool + +config KERNEL_ELF_CORE + bool "Enable process core dump support" + select KERNEL_COREDUMP + default y if !SMALL_FLASH + +config KERNEL_PROVE_LOCKING + bool "Enable kernel lock checking" + select KERNEL_DEBUG_KERNEL + +config KERNEL_SOFTLOCKUP_DETECTOR + bool "Compile the kernel with detect Soft Lockups" + depends on KERNEL_DEBUG_KERNEL + help + Say Y here to enable the kernel to act as a watchdog to detect + soft lockups. + + Softlockups are bugs that cause the kernel to loop in kernel + mode for more than 20 seconds, without giving other tasks a + chance to run. The current stack trace is displayed upon + detection and the system will stay locked up. + +config KERNEL_HARDLOCKUP_DETECTOR + bool "Compile the kernel with detect Hard Lockups" + depends on KERNEL_DEBUG_KERNEL + help + Say Y here to enable the kernel to act as a watchdog to detect + hard lockups. + + Hardlockups are bugs that cause the CPU to loop in kernel mode + for more than 10 seconds, without letting other interrupts have a + chance to run. The current stack trace is displayed upon detection + and the system will stay locked up. + +config KERNEL_DETECT_HUNG_TASK + bool "Compile the kernel with detect Hung Tasks" + depends on KERNEL_DEBUG_KERNEL + default KERNEL_SOFTLOCKUP_DETECTOR + help + Say Y here to enable the kernel to detect "hung tasks", + which are bugs that cause the task to be stuck in + uninterruptible "D" state indefinitely. + + When a hung task is detected, the kernel will print the + current stack trace (which you should report), but the + task will stay in uninterruptible state. If lockdep is + enabled then all held locks will also be reported. This + feature has negligible overhead. + +config KERNEL_WQ_WATCHDOG + bool "Compile the kernel with detect Workqueue Stalls" + depends on KERNEL_DEBUG_KERNEL + help + Say Y here to enable stall detection on workqueues. If a + worker pool doesn't make forward progress on a pending work + item for over a given amount of time, 30s by default, a + warning message is printed along with dump of workqueue + state. This can be configured through kernel parameter + "workqueue.watchdog_thresh" and its sysfs counterpart. + +config KERNEL_DEBUG_ATOMIC_SLEEP + bool "Compile the kernel with sleep inside atomic section checking" + depends on KERNEL_DEBUG_KERNEL + help + If you say Y here, various routines which may sleep will become very + noisy if they are called inside atomic sections: when a spinlock is + held, inside an rcu read side critical section, inside preempt disabled + sections, inside an interrupt, etc... + +config KERNEL_DEBUG_VM + bool "Compile the kernel with debug VM" + depends on KERNEL_DEBUG_KERNEL + help + Enable this to turn on extended checks in the virtual-memory system + that may impact performance. + + If unsure, say N. + +config KERNEL_PRINTK_TIME + bool "Enable printk timestamps" + default y + +config KERNEL_SLUB_DEBUG + bool + +config KERNEL_SLUB_DEBUG_ON + bool + +config KERNEL_SLABINFO + select KERNEL_SLUB_DEBUG + select KERNEL_SLUB_DEBUG_ON + bool "Enable /proc slab debug info" + +config KERNEL_PROC_PAGE_MONITOR + bool "Enable /proc page monitoring" + +config KERNEL_RELAY + bool + +config KERNEL_KEXEC + bool "Enable kexec support" + +config KERNEL_PROC_VMCORE + bool + +config KERNEL_PROC_KCORE + bool + +config KERNEL_CRASH_DUMP + depends on i386 || x86_64 || arm || armeb + select KERNEL_KEXEC + select KERNEL_PROC_VMCORE + select KERNEL_PROC_KCORE + bool "Enable support for kexec crashdump" + default y + +config USE_RFKILL + bool "Enable rfkill support" + default RFKILL_SUPPORT + +config USE_SPARSE + bool "Enable sparse check during kernel build" + +config KERNEL_DEVTMPFS + bool "Compile the kernel with device tmpfs enabled" + help + devtmpfs is a simple, kernel-managed /dev filesystem. The kernel creates + devices nodes for all registered devices to simplify boot, but leaves more + complex tasks to userspace (e.g. udev). + +if KERNEL_DEVTMPFS + + config KERNEL_DEVTMPFS_MOUNT + bool "Automatically mount devtmpfs after root filesystem is mounted" + +endif + +config KERNEL_KEYS + bool "Enable kernel access key retention support" + default !SMALL_FLASH + +config KERNEL_PERSISTENT_KEYRINGS + bool "Enable kernel persistent keyrings" + depends on KERNEL_KEYS + +config KERNEL_KEYS_REQUEST_CACHE + bool "Enable temporary caching of the last request_key() result" + depends on KERNEL_KEYS + +config KERNEL_BIG_KEYS + bool "Enable large payload keys on kernel keyrings" + depends on KERNEL_KEYS + +# +# CGROUP support symbols +# + +config KERNEL_CGROUPS + bool "Enable kernel cgroups" + default y if !SMALL_FLASH + +if KERNEL_CGROUPS + + config KERNEL_CGROUP_DEBUG + bool "Example debug cgroup subsystem" + help + This option enables a simple cgroup subsystem that + exports useful debugging information about the cgroups + framework. + + config KERNEL_FREEZER + bool + + config KERNEL_CGROUP_FREEZER + bool "legacy Freezer cgroup subsystem" + select KERNEL_FREEZER + help + Provides a way to freeze and unfreeze all tasks in a + cgroup. + (legacy cgroup1-only controller, in cgroup2 freezer + is integrated in the Memory controller) + + config KERNEL_CGROUP_DEVICE + bool "legacy Device controller for cgroups" + help + Provides a cgroup implementing whitelists for devices which + a process in the cgroup can mknod or open. + (legacy cgroup1-only controller) + + config KERNEL_CGROUP_HUGETLB + bool "HugeTLB controller" + select KERNEL_HUGETLB_PAGE + + config KERNEL_CGROUP_PIDS + bool "PIDs cgroup subsystem" + default y + help + Provides enforcement of process number limits in the scope of a + cgroup. + + config KERNEL_CGROUP_RDMA + bool "RDMA controller for cgroups" + default y + + config KERNEL_CGROUP_BPF + bool "Support for eBPF programs attached to cgroups" + default y + + config KERNEL_CPUSETS + bool "Cpuset support" + default y + help + This option will let you create and manage CPUSETs which + allow dynamically partitioning a system into sets of CPUs and + Memory Nodes and assigning tasks to run only within those sets. + This is primarily useful on large SMP or NUMA systems. + + config KERNEL_PROC_PID_CPUSET + bool "Include legacy /proc//cpuset file" + depends on KERNEL_CPUSETS + + config KERNEL_CGROUP_CPUACCT + bool "Simple CPU accounting cgroup subsystem" + default y + help + Provides a simple Resource Controller for monitoring the + total CPU consumed by the tasks in a cgroup. + + config KERNEL_RESOURCE_COUNTERS + bool "Resource counters" + default y + help + This option enables controller independent resource accounting + infrastructure that works with cgroups. + + config KERNEL_MM_OWNER + bool + default y if KERNEL_MEMCG + + config KERNEL_MEMCG + bool "Memory Resource Controller for Control Groups" + default y + select KERNEL_FREEZER + depends on KERNEL_RESOURCE_COUNTERS + help + Provides a memory resource controller that manages both anonymous + memory and page cache. (See Documentation/cgroups/memory.txt) + + Note that setting this option increases fixed memory overhead + associated with each page of memory in the system. By this, + 20(40)bytes/PAGE_SIZE on 32(64)bit system will be occupied by memory + usage tracking struct at boot. Total amount of this is printed out + at boot. + + Only enable when you're ok with these tradeoffs and really + sure you need the memory resource controller. Even when you enable + this, you can set "cgroup_disable=memory" at your boot option to + disable memory resource controller and you can avoid overheads + (but lose benefits of memory resource controller). + + This config option also selects MM_OWNER config option, which + could in turn add some fork/exit overhead. + + config KERNEL_MEMCG_SWAP + bool "Memory Resource Controller Swap Extension" + default y + depends on KERNEL_MEMCG + help + Add swap management feature to memory resource controller. When you + enable this, you can limit mem+swap usage per cgroup. In other words, + when you disable this, memory resource controller has no cares to + usage of swap...a process can exhaust all of the swap. This extension + is useful when you want to avoid exhaustion swap but this itself + adds more overheads and consumes memory for remembering information. + Especially if you use 32bit system or small memory system, please + be careful about enabling this. When memory resource controller + is disabled by boot option, this will be automatically disabled and + there will be no overhead from this. Even when you set this config=y, + if boot option "swapaccount=0" is set, swap will not be accounted. + Now, memory usage of swap_cgroup is 2 bytes per entry. If swap page + size is 4096bytes, 512k per 1Gbytes of swap. + + config KERNEL_MEMCG_SWAP_ENABLED + bool "Memory Resource Controller Swap Extension enabled by default" + depends on KERNEL_MEMCG_SWAP + help + Memory Resource Controller Swap Extension comes with its price in + a bigger memory consumption. General purpose distribution kernels + which want to enable the feature but keep it disabled by default + and let the user enable it by swapaccount boot command line + parameter should have this option unselected. + + Those who want to have the feature enabled by default should + select this option (if, for some reason, they need to disable it, + then swapaccount=0 does the trick). + + + config KERNEL_MEMCG_KMEM + bool "Memory Resource Controller Kernel Memory accounting (EXPERIMENTAL)" + default y + depends on KERNEL_MEMCG + help + The Kernel Memory extension for Memory Resource Controller can limit + the amount of memory used by kernel objects in the system. Those are + fundamentally different from the entities handled by the standard + Memory Controller, which are page-based, and can be swapped. Users of + the kmem extension can use it to guarantee that no group of processes + will ever exhaust kernel resources alone. + + config KERNEL_CGROUP_PERF + bool "Enable perf_event per-cpu per-container group (cgroup) monitoring" + select KERNEL_PERF_EVENTS + help + This option extends the per-cpu mode to restrict monitoring to + threads which belong to the cgroup specified and run on the + designated cpu. + + menuconfig KERNEL_CGROUP_SCHED + bool "Group CPU scheduler" + default y + help + This feature lets CPU scheduler recognize task groups and control CPU + bandwidth allocation to such task groups. It uses cgroups to group + tasks. + + if KERNEL_CGROUP_SCHED + + config KERNEL_FAIR_GROUP_SCHED + bool "Group scheduling for SCHED_OTHER" + default y + + config KERNEL_CFS_BANDWIDTH + bool "CPU bandwidth provisioning for FAIR_GROUP_SCHED" + default y + depends on KERNEL_FAIR_GROUP_SCHED + help + This option allows users to define CPU bandwidth rates (limits) for + tasks running within the fair group scheduler. Groups with no limit + set are considered to be unconstrained and will run with no + restriction. + See tip/Documentation/scheduler/sched-bwc.txt for more information. + + config KERNEL_RT_GROUP_SCHED + bool "Group scheduling for SCHED_RR/FIFO" + default y + help + This feature lets you explicitly allocate real CPU bandwidth + to task groups. If enabled, it will also make it impossible to + schedule realtime tasks for non-root users until you allocate + realtime bandwidth for them. + + endif + + config KERNEL_BLK_CGROUP + bool "Block IO controller" + default y + help + Generic block IO controller cgroup interface. This is the common + cgroup interface which should be used by various IO controlling + policies. + + Currently, CFQ IO scheduler uses it to recognize task groups and + control disk bandwidth allocation (proportional time slice allocation) + to such task groups. It is also used by bio throttling logic in + block layer to implement upper limit in IO rates on a device. + + This option only enables generic Block IO controller infrastructure. + One needs to also enable actual IO controlling logic/policy. For + enabling proportional weight division of disk bandwidth in CFQ, set + CONFIG_CFQ_GROUP_IOSCHED=y; for enabling throttling policy, set + CONFIG_BLK_DEV_THROTTLING=y. + + if KERNEL_BLK_CGROUP + + config KERNEL_CFQ_GROUP_IOSCHED + bool "Proportional weight of disk bandwidth in CFQ" + + config KERNEL_BLK_DEV_THROTTLING + bool "Enable throttling policy" + default y + + config KERNEL_BLK_DEV_THROTTLING_LOW + bool "Block throttling .low limit interface support (EXPERIMENTAL)" + depends on KERNEL_BLK_DEV_THROTTLING + endif + + config KERNEL_DEBUG_BLK_CGROUP + bool "Enable Block IO controller debugging" + depends on KERNEL_BLK_CGROUP + help + Enable some debugging help. Currently it exports additional stat + files in a cgroup which can be useful for debugging. + + config KERNEL_NET_CLS_CGROUP + bool "legacy Control Group Classifier" + + config KERNEL_CGROUP_NET_CLASSID + bool "legacy Network classid cgroup" + + config KERNEL_CGROUP_NET_PRIO + bool "legacy Network priority cgroup" + +endif + +# +# Namespace support symbols +# + +config KERNEL_NAMESPACES + bool "Enable kernel namespaces" + default y if !SMALL_FLASH + +if KERNEL_NAMESPACES + + config KERNEL_UTS_NS + bool "UTS namespace" + default y + help + In this namespace, tasks see different info provided + with the uname() system call. + + config KERNEL_IPC_NS + bool "IPC namespace" + default y + help + In this namespace, tasks work with IPC ids which correspond to + different IPC objects in different namespaces. + + config KERNEL_USER_NS + bool "User namespace (EXPERIMENTAL)" + default y + help + This allows containers, i.e. vservers, to use user namespaces + to provide different user info for different servers. + + config KERNEL_PID_NS + bool "PID Namespaces" + default y + help + Support process id namespaces. This allows having multiple + processes with the same pid as long as they are in different + pid namespaces. This is a building block of containers. + + config KERNEL_NET_NS + bool "Network namespace" + default y + help + Allow user space to create what appear to be multiple instances + of the network stack. + +endif + +config KERNEL_DEVPTS_MULTIPLE_INSTANCES + bool "Support multiple instances of devpts" + default y if !SMALL_FLASH + help + Enable support for multiple instances of devpts filesystem. + If you want to have isolated PTY namespaces (eg: in containers), + say Y here. Otherwise, say N. If enabled, each mount of devpts + filesystem with the '-o newinstance' option will create an + independent PTY namespace. + +config KERNEL_POSIX_MQUEUE + bool "POSIX Message Queues" + default y if !SMALL_FLASH + help + POSIX variant of message queues is a part of IPC. In POSIX message + queues every message has a priority which decides about succession + of receiving it by a process. If you want to compile and run + programs written e.g. for Solaris with use of its POSIX message + queues (functions mq_*) say Y here. + + POSIX message queues are visible as a filesystem called 'mqueue' + and can be mounted somewhere if you want to do filesystem + operations on message queues. + + +config KERNEL_SECCOMP_FILTER + bool + default y if !SMALL_FLASH + +config KERNEL_SECCOMP + bool "Enable seccomp support" + depends on !(TARGET_uml) + select KERNEL_SECCOMP_FILTER + default y if !SMALL_FLASH + help + Build kernel with support for seccomp. + +# +# IPv4 configuration +# + +config KERNEL_IP_MROUTE + bool "Enable IPv4 multicast routing" + default y + help + Multicast routing requires a multicast routing daemon in + addition to kernel support. + +if KERNEL_IP_MROUTE + + config KERNEL_IP_MROUTE_MULTIPLE_TABLES + def_bool y + + config KERNEL_IP_PIMSM_V1 + def_bool y + + config KERNEL_IP_PIMSM_V2 + def_bool y + +endif + +# +# IPv6 configuration +# + +config KERNEL_IPV6 + def_bool IPV6 + +if KERNEL_IPV6 + + config KERNEL_IPV6_MULTIPLE_TABLES + def_bool y + + config KERNEL_IPV6_SUBTREES + def_bool y + + config KERNEL_IPV6_MROUTE + bool "Enable IPv6 multicast routing" + default y + help + Multicast routing requires a multicast routing daemon in + addition to kernel support. + + if KERNEL_IPV6_MROUTE + + config KERNEL_IPV6_MROUTE_MULTIPLE_TABLES + def_bool y + + config KERNEL_IPV6_PIMSM_V2 + def_bool y + + endif + + config KERNEL_IPV6_SEG6_LWTUNNEL + bool "Enable support for lightweight tunnels" + default y if !SMALL_FLASH + help + Using lwtunnel (needed for IPv6 segment routing) requires ip-full package. + + config KERNEL_LWTUNNEL_BPF + def_bool n + +endif + +# +# Miscellaneous network configuration +# + +config KERNEL_NET_L3_MASTER_DEV + bool "L3 Master device support" + help + This module provides glue between core networking code and device + drivers to support L3 master devices like VRF. + +config KERNEL_XDP_SOCKETS + bool "XDP sockets support" + help + XDP sockets allows a channel between XDP programs and + userspace applications. + +config KERNEL_WIRELESS_EXT + def_bool n + +config KERNEL_WEXT_CORE + def_bool KERNEL_WIRELESS_EXT + +config KERNEL_WEXT_PRIV + def_bool KERNEL_WIRELESS_EXT + +config KERNEL_WEXT_PROC + def_bool KERNEL_WIRELESS_EXT + +config KERNEL_WEXT_SPY + def_bool KERNEL_WIRELESS_EXT + +config KERNEL_PAGE_POOL + def_bool n + +config KERNEL_PAGE_POOL_STATS + bool "Page pool stats support" + depends on KERNEL_PAGE_POOL + +# +# NFS related symbols +# +config KERNEL_IP_PNP + bool "Compile the kernel with rootfs on NFS" + help + If you want to make your kernel boot off a NFS server as root + filesystem, select Y here. + +if KERNEL_IP_PNP + + config KERNEL_IP_PNP_DHCP + def_bool y + + config KERNEL_IP_PNP_BOOTP + def_bool n + + config KERNEL_IP_PNP_RARP + def_bool n + + config KERNEL_NFS_FS + def_bool y + + config KERNEL_NFS_V2 + def_bool y + + config KERNEL_NFS_V3 + def_bool y + + config KERNEL_ROOT_NFS + def_bool y + +endif + +menu "Filesystem ACL and attr support options" + config USE_FS_ACL_ATTR + bool "Use filesystem ACL and attr support by default" + help + Make using ACLs (e.g. POSIX ACL, NFSv4 ACL) the default + for kernel and packages, except tmpfs, flash filesystems, + and old NFS. Also enable userspace extended attribute support + by default. (OpenWrt already has an expection it will be + present in the kernel). + + config KERNEL_FS_POSIX_ACL + bool "Enable POSIX ACL support" + default y if USE_FS_ACL_ATTR + + config KERNEL_BTRFS_FS_POSIX_ACL + bool "Enable POSIX ACL for BtrFS Filesystems" + select KERNEL_FS_POSIX_ACL + default y if USE_FS_ACL_ATTR + + config KERNEL_EXT4_FS_POSIX_ACL + bool "Enable POSIX ACL for Ext4 Filesystems" + select KERNEL_FS_POSIX_ACL + default y if USE_FS_ACL_ATTR + + config KERNEL_F2FS_FS_POSIX_ACL + bool "Enable POSIX ACL for F2FS Filesystems" + select KERNEL_FS_POSIX_ACL + + config KERNEL_JFFS2_FS_POSIX_ACL + bool "Enable POSIX ACL for JFFS2 Filesystems" + select KERNEL_FS_POSIX_ACL + + config KERNEL_TMPFS_POSIX_ACL + bool "Enable POSIX ACL for TMPFS Filesystems" + select KERNEL_FS_POSIX_ACL + + config KERNEL_CIFS_ACL + bool "Enable CIFS ACLs" + select KERNEL_FS_POSIX_ACL + default y if USE_FS_ACL_ATTR + + config KERNEL_HFS_FS_POSIX_ACL + bool "Enable POSIX ACL for HFS Filesystems" + select KERNEL_FS_POSIX_ACL + default y if USE_FS_ACL_ATTR + + config KERNEL_HFSPLUS_FS_POSIX_ACL + bool "Enable POSIX ACL for HFS+ Filesystems" + select KERNEL_FS_POSIX_ACL + default y if USE_FS_ACL_ATTR + + config KERNEL_NFS_ACL_SUPPORT + bool "Enable ACLs for NFS" + default y if USE_FS_ACL_ATTR + + config KERNEL_NFS_V3_ACL_SUPPORT + bool "Enable ACLs for NFSv3" + + config KERNEL_NFSD_V2_ACL_SUPPORT + bool "Enable ACLs for NFSDv2" + + config KERNEL_NFSD_V3_ACL_SUPPORT + bool "Enable ACLs for NFSDv3" + + config KERNEL_REISER_FS_POSIX_ACL + bool "Enable POSIX ACLs for ReiserFS" + select KERNEL_FS_POSIX_ACL + default y if USE_FS_ACL_ATTR + + config KERNEL_XFS_POSIX_ACL + bool "Enable POSIX ACLs for XFS" + select KERNEL_FS_POSIX_ACL + default y if USE_FS_ACL_ATTR + + config KERNEL_JFS_POSIX_ACL + bool "Enable POSIX ACLs for JFS" + select KERNEL_FS_POSIX_ACL + default y if USE_FS_ACL_ATTR + +endmenu + +config KERNEL_DEVMEM + bool "/dev/mem virtual device support" + help + Say Y here if you want to support the /dev/mem device. + The /dev/mem device is used to access areas of physical + memory. + +config KERNEL_DEVKMEM + bool "/dev/kmem virtual device support" + help + Say Y here if you want to support the /dev/kmem device. The + /dev/kmem device is rarely used, but can be used for certain + kind of kernel debugging operations. + +config KERNEL_SQUASHFS_FRAGMENT_CACHE_SIZE + int "Number of squashfs fragments cached" + default 2 if (SMALL_FLASH && !LOW_MEMORY_FOOTPRINT) + default 3 + +config KERNEL_SQUASHFS_XATTR + bool "Squashfs XATTR support" + +# +# compile optimization setting +# +choice + prompt "Compiler optimization level" + default KERNEL_CC_OPTIMIZE_FOR_SIZE if SMALL_FLASH + +config KERNEL_CC_OPTIMIZE_FOR_PERFORMANCE + bool "Optimize for performance" + help + This is the default optimization level for the kernel, building + with the "-O2" compiler flag for best performance and most + helpful compile-time warnings. + +config KERNEL_CC_OPTIMIZE_FOR_SIZE + bool "Optimize for size" + help + Enabling this option will pass "-Os" instead of "-O2" to + your compiler resulting in a smaller kernel. + +endchoice + +config KERNEL_AUDIT + bool "Auditing support" + +config KERNEL_SECURITY + bool "Enable different security models" + +config KERNEL_SECURITY_NETWORK + bool "Socket and Networking Security Hooks" + select KERNEL_SECURITY + +config KERNEL_SECURITY_SELINUX + bool "NSA SELinux Support" + select KERNEL_SECURITY_NETWORK + select KERNEL_AUDIT + +config KERNEL_SECURITY_SELINUX_BOOTPARAM + bool "NSA SELinux boot parameter" + depends on KERNEL_SECURITY_SELINUX + default y + +config KERNEL_SECURITY_SELINUX_DISABLE + bool "NSA SELinux runtime disable" + depends on KERNEL_SECURITY_SELINUX + +config KERNEL_SECURITY_SELINUX_DEVELOP + bool "NSA SELinux Development Support" + depends on KERNEL_SECURITY_SELINUX + default y + +config KERNEL_SECURITY_SELINUX_SIDTAB_HASH_BITS + int + depends on KERNEL_SECURITY_SELINUX + default 9 + +config KERNEL_SECURITY_SELINUX_SID2STR_CACHE_SIZE + int + depends on KERNEL_SECURITY_SELINUX + default 256 + +config KERNEL_LSM + string + default "lockdown,yama,loadpin,safesetid,integrity,selinux" + depends on KERNEL_SECURITY_SELINUX + +config KERNEL_EXT4_FS_SECURITY + bool "Ext4 Security Labels" + +config KERNEL_F2FS_FS_SECURITY + bool "F2FS Security Labels" + +config KERNEL_UBIFS_FS_SECURITY + bool "UBIFS Security Labels" + +config KERNEL_JFFS2_FS_SECURITY + bool "JFFS2 Security Labels" + +config KERNEL_WERROR + bool "Compile the kernel with warnings as errors" + help + A kernel build should not cause any compiler warnings, and this + enables the '-Werror' (for C) and '-Dwarnings' (for Rust) flags + to enforce that rule by default. Certain warnings from other tools + such as the linker may be upgraded to errors with this option as + well. + + However, if you have a new (or very old) compiler or linker with odd + and unusual warnings, or you have some architecture with problems, + you may need to disable this config option in order to + successfully build the kernel. diff --git a/config/check-uname.sh b/config/check-uname.sh new file mode 100755 index 0000000..1f1bf9e --- /dev/null +++ b/config/check-uname.sh @@ -0,0 +1 @@ +[ "$(uname)" = "$1" ] && echo y || echo n diff --git a/feeds.conf.default b/feeds.conf.default new file mode 100644 index 0000000..1c1aaf8 --- /dev/null +++ b/feeds.conf.default @@ -0,0 +1,6 @@ +src-git packages https://github.com/openwrt/packages.git;openwrt-23.05 +src-git luci https://github.com/openwrt/luci.git;openwrt-23.05 +src-git routing https://git.openwrt.org/feed/routing.git;openwrt-23.05 +src-git telephony https://git.openwrt.org/feed/telephony.git;openwrt-23.05 +#src-git nss https://github.com/ACwifidude/nss-packages.git;NSS-11.2-K5.15 +src-git nss https://github.com/ricsc/nss-packages.git;NSS-11.2-K5.15 diff --git a/include/autotools.mk b/include/autotools.mk new file mode 100644 index 0000000..7fc6f37 --- /dev/null +++ b/include/autotools.mk @@ -0,0 +1,170 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2007-2020 OpenWrt.org + +ifneq ($(__autotools_inc),1) +__autotools_inc=1 + +autoconf_bool = $(patsubst %,$(if $($(1)),--enable,--disable)-%,$(2)) + +# delete *.la-files from staging_dir - we can not yet remove respective lines within all package +# Makefiles, since backfire still uses libtool v1.5.x which (may) require those files +define libtool_remove_files + find $(1) -name '*.la' | $(XARGS) rm -f; +endef + + +AM_TOOL_PATHS:= \ + AUTOM4TE=$(STAGING_DIR_HOST)/bin/autom4te \ + AUTOCONF=$(STAGING_DIR_HOST)/bin/autoconf \ + AUTOMAKE=$(STAGING_DIR_HOST)/bin/automake \ + ACLOCAL=$(STAGING_DIR_HOST)/bin/aclocal \ + AUTOHEADER=$(STAGING_DIR_HOST)/bin/autoheader \ + LIBTOOLIZE=$(STAGING_DIR_HOST)/bin/libtoolize \ + LIBTOOL=$(STAGING_DIR_HOST)/bin/libtool \ + M4=$(STAGING_DIR_HOST)/bin/m4 \ + AUTOPOINT=true \ + GTKDOCIZE=true + +AM_TOOL_PATHS_FAKE:=$(subst = ,=,$(patsubst "%,"$(TRUE)",$(subst =,= ",$(AM_TOOL_PATHS)))) + +# 1: build dir +# 2: remove files +# 3: automake paths +# 4: libtool paths +# 5: extra m4 dirs +define autoreconf + (cd $(1); \ + $(patsubst %,rm -f %;,$(2)) \ + $(foreach p,$(3), \ + if [ -f $(p)/configure.ac ] || [ -f $(p)/configure.in ]; then \ + [ -d $(p)/autom4te.cache ] && rm -rf $(p)/autom4te.cache; \ + [ -e $(p)/config.rpath ] || \ + ln -s $(SCRIPT_DIR)/config.rpath $(p)/config.rpath; \ + touch NEWS AUTHORS COPYING ABOUT-NLS ChangeLog; \ + $(AM_TOOL_PATHS) \ + LIBTOOLIZE='$(STAGING_DIR_HOST)/bin/libtoolize --install' \ + $(STAGING_DIR_HOST)/bin/autoreconf -v -f -i \ + $(if $(word 2,$(3)),--no-recursive) \ + -B $(STAGING_DIR_HOST)/share/aclocal \ + $(patsubst %,-I %,$(5)) \ + $(patsubst %,-I %,$(4)) $(p) || true; \ + fi; \ + ) \ + ); +endef + +# 1: build dir +define patch_libtool + @(cd $(1); \ + for lt in $$$$($$(STAGING_DIR_HOST)/bin/find . -name ltmain.sh); do \ + lt_version="$$$$($$(STAGING_DIR_HOST)/bin/sed -ne 's,^[[:space:]]*VERSION="\?\([0-9]\.[0-9]\+\).*,\1,p' $$$$lt)"; \ + case "$$$$lt_version" in \ + 1.5|2.2|2.4) echo "autotools.mk: Found libtool v$$$$lt_version - applying patch to $$$$lt"; \ + (cd $$$$(dirname $$$$lt) && $$(PATCH) -N -s -p1 < $$(TOPDIR)/tools/libtool/files/libtool-v$$$$lt_version.patch || true) ;; \ + *) echo "autotools.mk: error: Unsupported libtool version v$$$$lt_version - cannot patch $$$$lt"; exit 1 ;; \ + esac; \ + done; \ + ); +endef + +define set_libtool_abiver + sed -i \ + -e 's,^soname_spec=.*,soname_spec="\\$$$${libname}\\$$$${shared_ext}.$(PKG_ABI_VERSION)",' \ + -e 's,^library_names_spec=.*,library_names_spec="\\$$$${libname}\\$$$${shared_ext}.$(PKG_ABI_VERSION) \\$$$${libname}\\$$$${shared_ext}",' \ + $(PKG_BUILD_DIR)/libtool +endef + +PKG_LIBTOOL_PATHS?=$(CONFIGURE_PATH) +PKG_AUTOMAKE_PATHS?=$(CONFIGURE_PATH) +PKG_MACRO_PATHS?=m4 +PKG_REMOVE_FILES?=aclocal.m4 + +Hooks/InstallDev/Post += libtool_remove_files + +define autoreconf_target + $(strip $(call autoreconf, \ + $(PKG_BUILD_DIR), $(PKG_REMOVE_FILES), \ + $(PKG_AUTOMAKE_PATHS), $(PKG_LIBTOOL_PATHS), \ + $(STAGING_DIR)/host/share/aclocal $(STAGING_DIR_HOSTPKG)/share/aclocal $(STAGING_DIR)/usr/share/aclocal $(PKG_MACRO_PATHS))) +endef + +define patch_libtool_target + $(strip $(call patch_libtool, \ + $(PKG_BUILD_DIR))) +endef + +define gettext_version_target + (cd $(PKG_BUILD_DIR) && \ + GETTEXT_VERSION=$(shell $(STAGING_DIR_HOSTPKG)/bin/gettext -V | $(STAGING_DIR_HOST)/bin/sed -rne '1s/.*\b([0-9]\.[0-9]+(\.[0-9]+)?)\b.*/\1/p' ) && \ + $(STAGING_DIR_HOST)/bin/sed \ + -i $(PKG_BUILD_DIR)/configure.ac \ + -e "s/AM_GNU_GETTEXT_VERSION(.*)/AM_GNU_GETTEXT_VERSION(\[$$$$GETTEXT_VERSION\])/g" && \ + $(STAGING_DIR_HOSTPKG)/bin/autopoint --force \ + ); +endef + +ifneq ($(filter gettext-version,$(PKG_FIXUP)),) + Hooks/Configure/Pre += gettext_version_target + ifeq ($(filter no-autoreconf,$(PKG_FIXUP)),) + Hooks/Configure/Pre += autoreconf_target + endif +endif + +ifneq ($(filter patch-libtool,$(PKG_FIXUP)),) + Hooks/Configure/Pre += patch_libtool_target +endif + +ifneq ($(filter libtool,$(PKG_FIXUP)),) + PKG_BUILD_DEPENDS += libtool + ifeq ($(filter no-autoreconf,$(PKG_FIXUP)),) + Hooks/Configure/Pre += autoreconf_target + endif +endif + +ifneq ($(filter libtool-abiver,$(PKG_FIXUP)),) + Hooks/Configure/Post += set_libtool_abiver +endif + +ifneq ($(filter autoreconf,$(PKG_FIXUP)),) + ifeq ($(filter autoreconf,$(Hooks/Configure/Pre)),) + Hooks/Configure/Pre += autoreconf_target + endif +endif + + +HOST_FIXUP?=$(PKG_FIXUP) +HOST_LIBTOOL_PATHS?=$(if $(PKG_LIBTOOL_PATHS),$(PKG_LIBTOOL_PATHS),.) +HOST_AUTOMAKE_PATHS?=$(if $(PKG_AUTOMAKE_PATHS),$(PKG_AUTOMAKE_PATHS),.) +HOST_MACRO_PATHS?=$(if $(PKG_MACRO_PATHS),$(PKG_MACRO_PATHS),m4) +HOST_REMOVE_FILES?=$(PKG_REMOVE_FILES) + +define autoreconf_host + $(strip $(call autoreconf, \ + $(HOST_BUILD_DIR), $(HOST_REMOVE_FILES), \ + $(HOST_AUTOMAKE_PATHS), $(HOST_LIBTOOL_PATHS), \ + $(HOST_MACRO_PATHS))) +endef + +define patch_libtool_host + $(strip $(call patch_libtool, \ + $(HOST_BUILD_DIR))) +endef + +ifneq ($(filter patch-libtool,$(HOST_FIXUP)),) + Hooks/HostConfigure/Pre += patch_libtool_host +endif + +ifneq ($(filter libtool,$(HOST_FIXUP)),) + ifeq ($(filter no-autoreconf,$(HOST_FIXUP)),) + Hooks/HostConfigure/Pre += autoreconf_host + endif +endif + +ifneq ($(filter autoreconf,$(HOST_FIXUP)),) + ifeq ($(filter autoreconf,$(Hooks/HostConfigure/Pre)),) + Hooks/HostConfigure/Pre += autoreconf_host + endif +endif + +endif #__autotools_inc diff --git a/include/bpf.mk b/include/bpf.mk new file mode 100644 index 0000000..ec3f04e --- /dev/null +++ b/include/bpf.mk @@ -0,0 +1,85 @@ +BPF_DEPENDS := @HAS_BPF_TOOLCHAIN +LLVM_VER:= + +CLANG_MIN_VER:=12 + +ifneq ($(CONFIG_USE_LLVM_HOST),) + BPF_TOOLCHAIN_HOST_PATH:=$(call qstrip,$(CONFIG_BPF_TOOLCHAIN_HOST_PATH)) + ifneq ($(BPF_TOOLCHAIN_HOST_PATH),) + BPF_PATH:=$(BPF_TOOLCHAIN_HOST_PATH)/bin:$(PATH) + else + BPF_PATH:=$(PATH) + endif + CLANG:=$(firstword $(shell PATH='$(BPF_PATH)' command -v clang clang-13 clang-12 clang-11)) + LLVM_VER:=$(subst clang,,$(notdir $(CLANG))) +endif +ifneq ($(CONFIG_USE_LLVM_PREBUILT),) + CLANG:=$(TOPDIR)/llvm-bpf/bin/clang +endif +ifneq ($(CONFIG_USE_LLVM_BUILD),) + CLANG:=$(STAGING_DIR_HOST)/llvm-bpf/bin/clang +endif + +LLVM_PATH:=$(dir $(CLANG)) +LLVM_LLC:=$(LLVM_PATH)/llc$(LLVM_VER) +LLVM_DIS:=$(LLVM_PATH)/llvm-dis$(LLVM_VER) +LLVM_OPT:=$(LLVM_PATH)/opt$(LLVM_VER) +LLVM_STRIP:=$(LLVM_PATH)/llvm-strip$(LLVM_VER) + +BPF_KARCH:=mips +BPF_ARCH:=mips$(if $(CONFIG_ARCH_64BIT),64)$(if $(CONFIG_BIG_ENDIAN),,el) +BPF_TARGET:=bpf$(if $(CONFIG_BIG_ENDIAN),eb,el) + +BPF_HEADERS_DIR:=$(STAGING_DIR)/bpf-headers + +BPF_KERNEL_INCLUDE := \ + -nostdinc -isystem $(TOOLCHAIN_DIR)/include \ + -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include \ + -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/asm/mach-generic \ + -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/generated \ + -I$(BPF_HEADERS_DIR)/include \ + -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/uapi \ + -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/generated/uapi \ + -I$(BPF_HEADERS_DIR)/include/uapi \ + -I$(BPF_HEADERS_DIR)/include/generated/uapi \ + -I$(BPF_HEADERS_DIR)/tools/lib \ + -I$(BPF_HEADERS_DIR)/tools/testing/selftests \ + -I$(BPF_HEADERS_DIR)/samples/bpf \ + -include linux/kconfig.h -include asm_goto_workaround.h + +BPF_CFLAGS := \ + $(BPF_KERNEL_INCLUDE) -I$(PKG_BUILD_DIR) \ + -D__KERNEL__ -D__BPF_TRACING__ -DCONFIG_GENERIC_CSUM \ + -D__TARGET_ARCH_${BPF_KARCH} \ + -m$(if $(CONFIG_BIG_ENDIAN),big,little)-endian \ + -fno-stack-protector -Wall \ + -Wno-unused-value -Wno-pointer-sign \ + -Wno-compare-distinct-pointer-types \ + -Wno-gnu-variable-sized-type-not-at-end \ + -Wno-address-of-packed-member -Wno-tautological-compare \ + -Wno-unknown-warning-option \ + -fno-asynchronous-unwind-tables \ + -Wno-uninitialized -Wno-unused-variable \ + -Wno-unused-label \ + -O2 -emit-llvm -Xclang -disable-llvm-passes + +ifneq ($(CONFIG_HAS_BPF_TOOLCHAIN),) +ifeq ($(DUMP)$(filter download refresh,$(MAKECMDGOALS)),) + CLANG_VER:=$(shell $(CLANG) -dM -E - < /dev/null | grep __clang_major__ | cut -d' ' -f3) + CLANG_VER_VALID:=$(shell [ "$(CLANG_VER)" -ge "$(CLANG_MIN_VER)" ] && echo 1 ) + ifeq ($(CLANG_VER_VALID),) + $(error ERROR: LLVM/clang version too old. Minimum required: $(CLANG_MIN_VER), found: $(CLANG_VER)) + endif +endif +endif + +define CompileBPF + $(CLANG) -g -target $(BPF_ARCH)-linux-gnu $(BPF_CFLAGS) $(2) \ + -c $(1) -o $(patsubst %.c,%.bc,$(1)) + $(LLVM_OPT) -O2 -mtriple=$(BPF_TARGET) < $(patsubst %.c,%.bc,$(1)) > $(patsubst %.c,%.opt,$(1)) + $(LLVM_DIS) < $(patsubst %.c,%.opt,$(1)) > $(patsubst %.c,%.S,$(1)) + $(LLVM_LLC) -march=$(BPF_TARGET) -mcpu=v3 -filetype=obj -o $(patsubst %.c,%.o,$(1)) < $(patsubst %.c,%.S,$(1)) + $(CP) $(patsubst %.c,%.o,$(1)) $(patsubst %.c,%.debug.o,$(1)) + $(LLVM_STRIP) --strip-debug $(patsubst %.c,%.o,$(1)) +endef + diff --git a/include/cmake.mk b/include/cmake.mk new file mode 100644 index 0000000..278d6e2 --- /dev/null +++ b/include/cmake.mk @@ -0,0 +1,182 @@ +cmake_bool = $(patsubst %,-D%:BOOL=$(if $($(1)),ON,OFF),$(2)) + +PKG_USE_NINJA ?= 1 +HOST_USE_NINJA ?= 1 +ifeq ($(PKG_USE_NINJA),1) + PKG_BUILD_PARALLEL ?= 1 +endif +ifeq ($(HOST_USE_NINJA),1) + HOST_BUILD_PARALLEL ?= 1 +endif +PKG_INSTALL:=1 + +ifneq ($(findstring c,$(OPENWRT_VERBOSE)),) + MAKE_FLAGS+=VERBOSE=1 + HOST_MAKE_FLAGS+=VERBOSE=1 +endif + +CMAKE_BINARY_DIR = $(PKG_BUILD_DIR)$(if $(CMAKE_BINARY_SUBDIR),/$(CMAKE_BINARY_SUBDIR)) +CMAKE_SOURCE_DIR = $(PKG_BUILD_DIR)$(if $(CMAKE_SOURCE_SUBDIR),/$(CMAKE_SOURCE_SUBDIR)) +HOST_CMAKE_SOURCE_DIR = $(HOST_BUILD_DIR)$(if $(CMAKE_SOURCE_SUBDIR),/$(CMAKE_SOURCE_SUBDIR)) +HOST_CMAKE_BINARY_DIR = $(HOST_BUILD_DIR)$(if $(CMAKE_BINARY_SUBDIR),/$(CMAKE_BINARY_SUBDIR)) +MAKE_PATH = $(firstword $(CMAKE_BINARY_SUBDIR) .) + +ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) + cmake_tool=$(TOOLCHAIN_DIR)/bin/$(1) +else + cmake_tool=$(shell command -v $(1)) +endif + +ifeq ($(CONFIG_CCACHE),) + CMAKE_C_COMPILER_LAUNCHER:= + CMAKE_CXX_COMPILER_LAUNCHER:= + CMAKE_C_COMPILER:=$(call cmake_tool,$(TARGET_CC)) + CMAKE_CXX_COMPILER:=$(call cmake_tool,$(TARGET_CXX)) + + CMAKE_HOST_C_COMPILER:=$(HOSTCC) + CMAKE_HOST_CXX_COMPILER:=$(HOSTCXX) +else + CCACHE:=$(STAGING_DIR_HOST)/bin/ccache + CMAKE_C_COMPILER_LAUNCHER:=$(CCACHE) + CMAKE_CXX_COMPILER_LAUNCHER:=$(CCACHE) + CMAKE_C_COMPILER:=$(TARGET_CC_NOCACHE) + CMAKE_CXX_COMPILER:=$(TARGET_CXX_NOCACHE) + + CMAKE_HOST_C_COMPILER:=$(HOSTCC_NOCACHE) + CMAKE_HOST_CXX_COMPILER:=$(HOSTCXX_NOCACHE) +endif +CMAKE_AR:=$(call cmake_tool,$(TARGET_AR)) +CMAKE_NM:=$(call cmake_tool,$(TARGET_NM)) +CMAKE_RANLIB:=$(call cmake_tool,$(TARGET_RANLIB)) + +CMAKE_FIND_ROOT_PATH:=$(STAGING_DIR)/usr;$(TOOLCHAIN_DIR)$(if $(CONFIG_EXTERNAL_TOOLCHAIN),;$(CONFIG_TOOLCHAIN_ROOT)) +CMAKE_HOST_FIND_ROOT_PATH:=$(STAGING_DIR)/host;$(STAGING_DIR_HOSTPKG);$(STAGING_DIR_HOST) +CMAKE_SHARED_LDFLAGS:=-Wl,-Bsymbolic-functions +CMAKE_HOST_INSTALL_PREFIX = $(HOST_BUILD_PREFIX) + +ifeq ($(HOST_USE_NINJA),1) + CMAKE_HOST_OPTIONS += -DCMAKE_GENERATOR="Ninja" + + define Host/Compile/Default + +$(NINJA) -C $(HOST_CMAKE_BINARY_DIR) $(1) + endef + + define Host/Install/Default + +$(NINJA) -C $(HOST_CMAKE_BINARY_DIR) install + endef + + define Host/Uninstall/Default + +$(NINJA) -C $(HOST_CMAKE_BINARY_DIR) uninstall + endef +else + CMAKE_HOST_OPTIONS += -DCMAKE_GENERATOR="Unix Makefiles" +endif + +ifeq ($(PKG_USE_NINJA),1) + CMAKE_OPTIONS += -DCMAKE_GENERATOR="Ninja" + + define Build/Compile/Default + +$(NINJA) -C $(CMAKE_BINARY_DIR) $(1) + endef + + define Build/Install/Default + +DESTDIR="$(PKG_INSTALL_DIR)" $(NINJA) -C $(CMAKE_BINARY_DIR) install + endef +else + CMAKE_OPTIONS += -DCMAKE_GENERATOR="Unix Makefiles" +endif + +define Build/Configure/Default + mkdir -p $(CMAKE_BINARY_DIR) + (cd $(CMAKE_BINARY_DIR); \ + CFLAGS="$(TARGET_CFLAGS) $(EXTRA_CFLAGS)" \ + CXXFLAGS="$(TARGET_CXXFLAGS) $(EXTRA_CXXFLAGS)" \ + LDFLAGS="$(TARGET_LDFLAGS) $(EXTRA_LDFLAGS)" \ + cmake \ + -DCMAKE_SYSTEM_NAME=Linux \ + -DCMAKE_SYSTEM_VERSION=1 \ + -DCMAKE_SYSTEM_PROCESSOR=$(ARCH) \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG" \ + -DCMAKE_CXX_FLAGS_RELEASE="-DNDEBUG" \ + -DCMAKE_C_COMPILER_LAUNCHER="$(CMAKE_C_COMPILER_LAUNCHER)" \ + -DCMAKE_C_COMPILER="$(CMAKE_C_COMPILER)" \ + -DCMAKE_CXX_COMPILER_LAUNCHER="$(CMAKE_CXX_COMPILER_LAUNCHER)" \ + -DCMAKE_CXX_COMPILER="$(CMAKE_CXX_COMPILER)" \ + -DCMAKE_ASM_COMPILER_LAUNCHER="$(CMAKE_C_COMPILER_LAUNCHER)" \ + -DCMAKE_ASM_COMPILER="$(CMAKE_C_COMPILER)" \ + -DCMAKE_EXE_LINKER_FLAGS:STRING="$(TARGET_LDFLAGS)" \ + -DCMAKE_MODULE_LINKER_FLAGS:STRING="$(TARGET_LDFLAGS) $(CMAKE_SHARED_LDFLAGS)" \ + -DCMAKE_SHARED_LINKER_FLAGS:STRING="$(TARGET_LDFLAGS) $(CMAKE_SHARED_LDFLAGS)" \ + -DCMAKE_AR="$(CMAKE_AR)" \ + -DCMAKE_NM="$(CMAKE_NM)" \ + -DCMAKE_RANLIB="$(CMAKE_RANLIB)" \ + -DCMAKE_FIND_ROOT_PATH="$(CMAKE_FIND_ROOT_PATH)" \ + -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=BOTH \ + -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \ + -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \ + -DCMAKE_STRIP=: \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DDL_LIBRARY=$(STAGING_DIR) \ + -DCMAKE_PREFIX_PATH=$(STAGING_DIR) \ + -DCMAKE_SKIP_RPATH=TRUE \ + -DCMAKE_EXPORT_PACKAGE_REGISTRY=FALSE \ + -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=TRUE \ + -DCMAKE_FIND_USE_PACKAGE_REGISTRY=FALSE \ + -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=TRUE \ + -DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=FALSE \ + -DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=TRUE \ + $(CMAKE_OPTIONS) \ + $(CMAKE_SOURCE_DIR) \ + ) +endef + +define Build/InstallDev/cmake + $(INSTALL_DIR) $(1) + $(CP) $(PKG_INSTALL_DIR)/* $(1)/ +endef + +Build/InstallDev = $(if $(CMAKE_INSTALL),$(Build/InstallDev/cmake)) + +define Host/Configure/Default + mkdir -p "$(HOST_CMAKE_BINARY_DIR)" + (cd $(HOST_CMAKE_BINARY_DIR); \ + CFLAGS="$(HOST_CFLAGS)" \ + CXXFLAGS="$(HOST_CFLAGS)" \ + LDFLAGS="$(HOST_LDFLAGS)" \ + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_COMPILER_LAUNCHER="$(CMAKE_C_COMPILER_LAUNCHER)" \ + -DCMAKE_C_COMPILER="$(CMAKE_HOST_C_COMPILER)" \ + -DCMAKE_CXX_COMPILER_LAUNCHER="$(CMAKE_CXX_COMPILER_LAUNCHER)" \ + -DCMAKE_CXX_COMPILER="$(CMAKE_HOST_CXX_COMPILER)" \ + -DCMAKE_ASM_COMPILER_LAUNCHER="$(CMAKE_C_COMPILER_LAUNCHER)" \ + -DCMAKE_ASM_COMPILER="$(CMAKE_HOST_C_COMPILER)" \ + -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG" \ + -DCMAKE_CXX_FLAGS_RELEASE="-DNDEBUG" \ + -DCMAKE_EXE_LINKER_FLAGS:STRING="$(HOST_LDFLAGS)" \ + -DCMAKE_MODULE_LINKER_FLAGS:STRING="$(HOST_LDFLAGS)" \ + -DCMAKE_SHARED_LINKER_FLAGS:STRING="$(HOST_LDFLAGS)" \ + -DCMAKE_FIND_ROOT_PATH="$(CMAKE_HOST_FIND_ROOT_PATH)" \ + -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=BOTH \ + -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \ + -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \ + -DCMAKE_STRIP=: \ + -DCMAKE_INSTALL_PREFIX=$(CMAKE_HOST_INSTALL_PREFIX) \ + -DCMAKE_PREFIX_PATH=$(HOST_BUILD_PREFIX) \ + -DCMAKE_SKIP_RPATH=TRUE \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_EXPORT_PACKAGE_REGISTRY=FALSE \ + -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=TRUE \ + -DCMAKE_FIND_USE_PACKAGE_REGISTRY=FALSE \ + -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=TRUE \ + -DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=FALSE \ + -DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=TRUE \ + $(CMAKE_HOST_OPTIONS) \ + $(HOST_CMAKE_SOURCE_DIR) \ + ) +endef + +MAKE_FLAGS += \ + CMAKE_COMMAND='$$(if $$(CMAKE_DISABLE_$$@),:,$(STAGING_DIR_HOST)/bin/cmake)' \ + CMAKE_DISABLE_cmake_check_build_system=1 diff --git a/include/debug.mk b/include/debug.mk new file mode 100644 index 0000000..98a1d6e --- /dev/null +++ b/include/debug.mk @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2007-2020 OpenWrt.org + +# debug flags: +# +# d: show subdirectory tree +# t: show added targets +# l: show legacy targets +# r: show autorebuild messages +# v: verbose (no .SILENCE for common targets) + +ifeq ($(DUMP),) + ifeq ($(DEBUG),all) + build_debug:=dltvr + else + build_debug:=$(DEBUG) + endif +endif + +ifneq ($(DEBUG),) + +define debug +$$(findstring $(2),$$(if $$(DEBUG_SCOPE_DIR),$$(if $$(filter $$(DEBUG_SCOPE_DIR)%,$(1)),$(build_debug)),$(build_debug))) +endef + +define warn +$$(if $(call debug,$(1),$(2)),$$(warning $(3))) +endef + +define debug_eval +$$(if $(call debug,$(1),$(2)),$(3)) +endef + +define warn_eval +$(call warn,$(1),$(2),$(3) $(4)) +$(4) +endef + +else + +debug:= +warn:= +debug_eval:= +warn_eval = $(4) + +endif + diff --git a/include/depends.mk b/include/depends.mk new file mode 100644 index 0000000..a858d4b --- /dev/null +++ b/include/depends.mk @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2007-2020 OpenWrt.org + +# define a dependency on a subtree +# parameters: +# 1: directories/files +# 2: directory dependency +# 3: tempfile for file listings +# 4: find options + +DEP_FINDPARAMS := -x "*/.svn*" -x ".*" -x "*:*" -x "*\!*" -x "* *" -x "*\\\#*" -x "*/.*_check" -x "*/.*.swp" -x "*/.pkgdir*" + +find_md5=find $(wildcard $(1)) -type f $(patsubst -x,-and -not -path,$(DEP_FINDPARAMS) $(2)) -printf "%p%T@\n" | sort | $(MKHASH) md5 +find_md5_reproducible=find $(wildcard $(1)) -type f $(patsubst -x,-and -not -path,$(DEP_FINDPARAMS) $(2)) -print0 | xargs -0 $(MKHASH) md5 | sort | $(MKHASH) md5 + +define rdep + .PRECIOUS: $(2) + .SILENT: $(2)_check + + $(2): $(2)_check + check-depends: $(2)_check + +ifneq ($(wildcard $(2)),) + $(2)_check:: + $(if $(3), \ + $(call find_md5,$(1),$(4)) > $(3).1; \ + { [ \! -f "$(3)" ] || diff $(3) $(3).1 >/dev/null; } && \ + ) \ + { \ + [ -f "$(2)_check.1" ] && mv "$(2)_check.1" "$(2)_check"; \ + $(TOPDIR)/scripts/timestamp.pl $(DEP_FINDPARAMS) $(4) -n $(2) $(1) && { \ + $(call debug_eval,$(SUBDIR),r,echo "No need to rebuild $(2)";) \ + touch -r "$(2)" "$(2)_check"; \ + } \ + } || { \ + $(call debug_eval,$(SUBDIR),r,echo "Need to rebuild $(2)";) \ + touch "$(2)_check"; \ + } + $(if $(3), mv $(3).1 $(3)) +else + $(2)_check:: + $(if $(3), rm -f $(3) $(3).1) + $(call debug_eval,$(SUBDIR),r,echo "Target $(2) not built") +endif + +endef + +ifeq ($(filter .%,$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),$(MAKECMDGOALS),x)) + define rdep + $(2): $(2)_check + endef +endif diff --git a/include/device_table.txt b/include/device_table.txt new file mode 100644 index 0000000..f45b158 --- /dev/null +++ b/include/device_table.txt @@ -0,0 +1,5 @@ +# minimal device table file for OpenWrt + +# +/dev d 755 0 0 - - - - - +/dev/console c 600 0 0 5 1 0 0 - diff --git a/include/download.mk b/include/download.mk new file mode 100644 index 0000000..9ab0b6c --- /dev/null +++ b/include/download.mk @@ -0,0 +1,343 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2012 OpenWrt.org +# Copyright (C) 2016 LEDE project + +PROJECT_GIT = https://git.openwrt.org + +OPENWRT_GIT = $(PROJECT_GIT) +LEDE_GIT = $(PROJECT_GIT) + +ifdef PKG_SOURCE_VERSION + ifndef PKG_VERSION + PKG_VERSION := $(if $(PKG_SOURCE_DATE),$(PKG_SOURCE_DATE)-)$(call version_abbrev,$(PKG_SOURCE_VERSION)) + endif + PKG_SOURCE_SUBDIR ?= $(PKG_NAME)-$(PKG_VERSION) + PKG_SOURCE ?= $(PKG_SOURCE_SUBDIR).tar.xz +endif + +DOWNLOAD_RDEP=$(STAMP_PREPARED) $(HOST_STAMP_PREPARED) + +# Export options for download.pl +export DOWNLOAD_CHECK_CERTIFICATE:=$(CONFIG_DOWNLOAD_CHECK_CERTIFICATE) +export DOWNLOAD_TOOL_CUSTOM:=$(CONFIG_DOWNLOAD_TOOL_CUSTOM) + +define dl_method_git +$(if $(filter https://github.com/% git://github.com/%,$(1)),github_archive,git) +endef + +# Try to guess the download method from the URL +define dl_method +$(strip \ + $(if $(filter git,$(2)),$(call dl_method_git,$(1),$(2)), + $(if $(2),$(2), \ + $(if $(filter @OPENWRT @APACHE/% @DEBIAN/% @GITHUB/% @GNOME/% @GNU/% @KERNEL/% @SF/% @SAVANNAH/% ftp://% http://% https://% file://%,$(1)),default, \ + $(if $(filter git://%,$(1)),$(call dl_method_git,$(1),$(2)), \ + $(if $(filter svn://%,$(1)),svn, \ + $(if $(filter cvs://%,$(1)),cvs, \ + $(if $(filter hg://%,$(1)),hg, \ + $(if $(filter sftp://%,$(1)),bzr, \ + unknown \ + ) \ + ) \ + ) \ + ) \ + ) \ + ) \ + ) \ + ) \ +) +endef + +# code for creating tarballs from cvs/svn/git/bzr/hg/darcs checkouts - useful for mirror support +dl_pack/bz2=bzip2 -c > $(1) +dl_pack/gz=gzip -nc > $(1) +dl_pack/xz=xz -zc -7e > $(1) +dl_pack/zst=zstd -T0 --ultra -20 -c > $(1) +dl_pack/unknown=$(error ERROR: Unknown pack format for file $(1)) +define dl_pack + $(if $(dl_pack/$(call ext,$(1))),$(dl_pack/$(call ext,$(1))),$(dl_pack/unknown)) +endef +define dl_tar_pack + $(TAR) --numeric-owner --owner=0 --group=0 --mode=a-s --sort=name \ + $$$${TAR_TIMESTAMP:+--mtime="$$$$TAR_TIMESTAMP"} -c $(2) | $(call dl_pack,$(1)) +endef + +gen_sha256sum = $(shell $(MKHASH) sha256 $(DL_DIR)/$(1)) + +# Used in Build/CoreTargets and HostBuild/Core as an integrity check for +# downloaded files. It will add a FORCE rule if the sha256 hash does not +# match, so that the download can be more thoroughly handled by download.pl. +define check_download_integrity + expected_hash:=$(strip $(if $(filter-out x,$(HASH)),$(HASH),$(MIRROR_HASH))) + $$(if $$(and $(FILE),$$(wildcard $(DL_DIR)/$(FILE)), \ + $$(filter undefined,$$(flavor DownloadChecked/$(FILE)))), \ + $$(eval DownloadChecked/$(FILE):=1) \ + $$(if $$(filter-out $$(call gen_sha256sum,$(FILE)),$$(expected_hash)), \ + $(DL_DIR)/$(FILE): FORCE) \ + ) +endef + +ifdef CHECK +check_escape=$(subst ','\'',$(1)) +#') + +# $(1): suffix of the F_, C_ variables, e.g. hash_deprecated, hash_mismatch, etc. +# $(2): filename +# $(3): expected hash value +# $(4): var name of the the form: {PKG_,Download/:}{,MIRROR_}{HASH,MIRROR_HASH} +check_warn_nofix = $(info $(shell printf "$(_R)WARNING: %s$(_N)" '$(call check_escape,$(call C_$(1),$(2),$(3),$(4)))')) +ifndef FIXUP + check_warn = $(check_warn_nofix) +else + check_warn = $(if $(filter-out undefined,$(origin F_$(1))),$(filter ,$(shell $(call F_$(1),$(2),$(3),$(4)) >&2)),$(check_warn_nofix)) +endif + +ifdef FIXUP +F_hash_deprecated = $(SCRIPT_DIR)/fixup-makefile.pl $(CURDIR)/Makefile fix-hash $(3) $(call gen_sha256sum,$(1)) $(2) +F_hash_mismatch = $(F_hash_deprecated) +F_hash_missing = $(SCRIPT_DIR)/fixup-makefile.pl $(CURDIR)/Makefile add-hash $(3) $(call gen_sha256sum,$(1)) +endif + +# $(1): filename +# $(2): expected hash value +# $(3): var name of the the form: {PKG_,Download/:}{,MIRROR_}{HASH,MIRROR_HASH} +C_download_missing = $(1) is missing, please run make download before re-running this check +C_hash_mismatch = $(3) does not match $(1) hash $(call gen_sha256sum,$(1)) +C_hash_deprecated = $(3) uses deprecated hash, set to $(call gen_sha256sum,$(1)) +C_hash_missing = $(3) is missing, set to $(call gen_sha256sum,$(1)) + +# $(1): filename +# $(2): expected hash value +# $(3): var name of the the form: {PKG_,Download/:}{,MIRROR_}{HASH,MIRROR_HASH} +check_hash = \ + $(if $(wildcard $(DL_DIR)/$(1)), \ + $(if $(filter-out x,$(2)), \ + $(if $(filter 64,$(shell printf '%s' '$(2)' | wc -c)), \ + $(if $(filter $(2),$(call gen_sha256sum,$(1))),, \ + $(call check_warn,hash_mismatch,$(1),$(2),$(3)) \ + ), \ + $(call check_warn,hash_deprecated,$(1),$(2),$(3)), \ + ), \ + $(call check_warn,hash_missing,$(1),$(2),$(3)) \ + ), \ + $(call check_warn,download_missing,$(1),$(2),$(3)) \ + ) + +ifdef FIXUP +F_md5_deprecated = $(SCRIPT_DIR)/fixup-makefile.pl $(CURDIR)/Makefile rename-var $(2) $(3) +endif + +C_md5_deprecated = Use of $(2) is deprecated, switch to $(3) + +check_md5 = \ + $(if $(filter-out x,$(1)), \ + $(call check_warn,md5_deprecated,$(1),$(2),$(3)) \ + ) + +hash_var = $(if $(filter-out x,$(1)),MD5SUM,HASH) +endif + +define DownloadMethod/unknown + echo "ERROR: No download method available"; false +endef + +define DownloadMethod/default + $(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "$(HASH)" "$(URL_FILE)" $(foreach url,$(URL),"$(url)") \ + $(if $(filter check,$(1)), \ + $(call check_hash,$(FILE),$(HASH),$(2)$(call hash_var,$(MD5SUM))) \ + $(call check_md5,$(MD5SUM),$(2)MD5SUM,$(2)HASH) \ + ) +endef + +# $(1): "check" +# $(2): "PKG_" if as in Download/ is "default", otherwise "Download/:" +# $(3): shell command sequence to do the download +define wrap_mirror +$(if $(if $(MIRROR),$(filter-out x,$(MIRROR_HASH))),$(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(FILE)" "$(MIRROR_HASH)" "" || ( $(3) ),$(3)) \ +$(if $(filter check,$(1)), \ + $(call check_hash,$(FILE),$(MIRROR_HASH),$(2)MIRROR_$(call hash_var,$(MIRROR_MD5SUM))) \ + $(call check_md5,$(MIRROR_MD5SUM),$(2)MIRROR_MD5SUM,$(2)MIRROR_HASH) \ +) +endef + +define DownloadMethod/cvs + $(call wrap_mirror,$(1),$(2), \ + echo "Checking out files from the cvs repository..."; \ + mkdir -p $(TMP_DIR)/dl && \ + cd $(TMP_DIR)/dl && \ + rm -rf $(SUBDIR) && \ + [ \! -d $(SUBDIR) ] && \ + cvs -d $(URL) export $(VERSION) $(SUBDIR) && \ + echo "Packing checkout..." && \ + $(call dl_tar_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \ + mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \ + rm -rf $(SUBDIR); \ + ) +endef + +define DownloadMethod/svn + $(call wrap_mirror,$(1),$(2), \ + echo "Checking out files from the svn repository..."; \ + mkdir -p $(TMP_DIR)/dl && \ + cd $(TMP_DIR)/dl && \ + rm -rf $(SUBDIR) && \ + [ \! -d $(SUBDIR) ] && \ + ( svn help export | grep -q trust-server-cert && \ + svn export --non-interactive --trust-server-cert -r$(VERSION) $(URL) $(SUBDIR) || \ + svn export --non-interactive -r$(VERSION) $(URL) $(SUBDIR) ) && \ + echo "Packing checkout..." && \ + export TAR_TIMESTAMP="`svn info -r$(VERSION) --show-item last-changed-date $(URL)`" && \ + $(call dl_tar_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \ + mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \ + rm -rf $(SUBDIR); \ + ) +endef + +define DownloadMethod/git + $(call wrap_mirror,$(1),$(2), \ + $(call DownloadMethod/rawgit) \ + ) +endef + +define DownloadMethod/github_archive + $(call wrap_mirror,$(1),$(2), \ + $(SCRIPT_DIR)/dl_github_archive.py \ + --dl-dir="$(DL_DIR)" \ + --url="$(URL)" \ + --version="$(VERSION)" \ + --subdir="$(SUBDIR)" \ + --source="$(FILE)" \ + --hash="$(MIRROR_HASH)" \ + || ( $(call DownloadMethod/rawgit) ); \ + ) +endef + +# Only intends to be called as a submethod from other DownloadMethod +define DownloadMethod/rawgit + echo "Checking out files from the git repository..."; \ + mkdir -p $(TMP_DIR)/dl && \ + cd $(TMP_DIR)/dl && \ + rm -rf $(SUBDIR) && \ + [ \! -d $(SUBDIR) ] && \ + git clone $(OPTS) $(URL) $(SUBDIR) && \ + (cd $(SUBDIR) && git checkout $(VERSION) && \ + git submodule update --init --recursive) && \ + echo "Packing checkout..." && \ + export TAR_TIMESTAMP=`cd $(SUBDIR) && git log -1 --format='@%ct'` && \ + rm -rf $(SUBDIR)/.git && \ + $(call dl_tar_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \ + mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \ + rm -rf $(SUBDIR); +endef + +define DownloadMethod/bzr + $(call wrap_mirror,$(1),$(2), \ + echo "Checking out files from the bzr repository..."; \ + mkdir -p $(TMP_DIR)/dl && \ + cd $(TMP_DIR)/dl && \ + rm -rf $(SUBDIR) && \ + [ \! -d $(SUBDIR) ] && \ + bzr export --per-file-timestamps -r$(VERSION) $(SUBDIR) $(URL) && \ + echo "Packing checkout..." && \ + export TAR_TIMESTAMP="" && \ + $(call dl_tar_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \ + mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \ + rm -rf $(SUBDIR); \ + ) +endef + +define DownloadMethod/hg + $(call wrap_mirror,$(1),$(2), \ + echo "Checking out files from the hg repository..."; \ + mkdir -p $(TMP_DIR)/dl && \ + cd $(TMP_DIR)/dl && \ + rm -rf $(SUBDIR) && \ + [ \! -d $(SUBDIR) ] && \ + hg clone -r $(VERSION) $(URL) $(SUBDIR) && \ + export TAR_TIMESTAMP=`cd $(SUBDIR) && hg log --template '@{date}' -l 1` && \ + find $(SUBDIR) -name .hg | xargs rm -rf && \ + echo "Packing checkout..." && \ + $(call dl_tar_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \ + mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \ + rm -rf $(SUBDIR); \ + ) +endef + +define DownloadMethod/darcs + $(call wrap_mirror, $(1), $(2), \ + echo "Checking out files from the darcs repository..."; \ + mkdir -p $(TMP_DIR)/dl && \ + cd $(TMP_DIR)/dl && \ + rm -rf $(SUBDIR) && \ + [ \! -d $(SUBDIR) ] && \ + darcs get -t $(VERSION) $(URL) $(SUBDIR) && \ + export TAR_TIMESTAMP=`cd $(SUBDIR) && LC_ALL=C darcs log --last 1 | sed -ne 's!^Date: \+!!p'` && \ + find $(SUBDIR) -name _darcs | xargs rm -rf && \ + echo "Packing checkout..." && \ + $(call dl_tar_pack,$(TMP_DIR)/dl/$(FILE),$(SUBDIR)) && \ + mv $(TMP_DIR)/dl/$(FILE) $(DL_DIR)/ && \ + rm -rf $(SUBDIR); \ + ) +endef + +Validate/cvs=VERSION SUBDIR +Validate/svn=VERSION SUBDIR +Validate/git=VERSION SUBDIR +Validate/bzr=VERSION SUBDIR +Validate/hg=VERSION SUBDIR +Validate/darcs=VERSION SUBDIR + +define Download/Defaults + URL:= + FILE:= + URL_FILE:= + PROTO:= + HASH=$$(MD5SUM) + MD5SUM:=x + SUBDIR:= + MIRROR:=1 + MIRROR_HASH=$$(MIRROR_MD5SUM) + MIRROR_MD5SUM:=x + VERSION:= + OPTS:= +endef + +define Download/default + FILE:=$(PKG_SOURCE) + URL:=$(PKG_SOURCE_URL) + URL_FILE:=$(PKG_SOURCE_URL_FILE) + SUBDIR:=$(PKG_SOURCE_SUBDIR) + PROTO:=$(PKG_SOURCE_PROTO) + $(if $(PKG_SOURCE_MIRROR),MIRROR:=$(filter 1,$(PKG_MIRROR))) + $(if $(PKG_MIRROR_MD5SUM),MIRROR_MD5SUM:=$(PKG_MIRROR_MD5SUM)) + $(if $(PKG_MIRROR_HASH),MIRROR_HASH:=$(PKG_MIRROR_HASH)) + VERSION:=$(PKG_SOURCE_VERSION) + $(if $(PKG_MD5SUM),MD5SUM:=$(PKG_MD5SUM)) + $(if $(PKG_HASH),HASH:=$(PKG_HASH)) +endef + +define Download + $(eval $(Download/Defaults)) + $(eval $(Download/$(1))) + $(foreach FIELD,URL FILE $(Validate/$(call dl_method,$(URL),$(PROTO))), + ifeq ($($(FIELD)),) + $$(error Download/$(1) is missing the $(FIELD) field.) + endif + ) + + $(foreach dep,$(DOWNLOAD_RDEP), + $(dep): $(DL_DIR)/$(FILE) + ) + download: $(DL_DIR)/$(FILE) + + $(DL_DIR)/$(FILE): + mkdir -p $(DL_DIR) + $(call locked, \ + $(if $(DownloadMethod/$(call dl_method,$(URL),$(PROTO))), \ + $(call DownloadMethod/$(call dl_method,$(URL),$(PROTO)),check,$(if $(filter default,$(1)),PKG_,Download/$(1):)), \ + $(DownloadMethod/unknown) \ + ),\ + $(FILE)) + +endef diff --git a/include/feeds.mk b/include/feeds.mk new file mode 100644 index 0000000..a499714 --- /dev/null +++ b/include/feeds.mk @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2014 OpenWrt.org +# Copyright (C) 2016 LEDE Project + +-include $(TMP_DIR)/.packageauxvars + +FEEDS_INSTALLED:=$(notdir $(wildcard $(TOPDIR)/package/feeds/*)) +FEEDS_AVAILABLE:=$(sort $(FEEDS_INSTALLED) $(shell $(SCRIPT_DIR)/feeds list -n 2>/dev/null)) + +PACKAGE_SUBDIRS=$(PACKAGE_DIR) +ifneq ($(CONFIG_PER_FEED_REPO),) + PACKAGE_SUBDIRS += $(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/base + PACKAGE_SUBDIRS += $(foreach FEED,$(FEEDS_AVAILABLE),$(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/$(FEED)) +endif + +opkg_package_files = $(wildcard \ + $(foreach dir,$(PACKAGE_SUBDIRS), \ + $(foreach pkg,$(1), $(dir)/$(pkg)_*.ipk))) + +# 1: package name +define FeedPackageDir +$(strip $(if $(CONFIG_PER_FEED_REPO), \ + $(if $(Package/$(1)/subdir), \ + $(abspath $(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/$(Package/$(1)/subdir)), \ + $(PACKAGE_DIR)), \ + $(PACKAGE_DIR))) +endef + +# 1: destination file +define FeedSourcesAppend +( \ + echo 'src/gz %d_core %U/targets/%S/packages'; \ + $(strip $(if $(CONFIG_PER_FEED_REPO), \ + echo 'src/gz %d_base %U/packages/%A/base'; \ + $(if $(CONFIG_BUILDBOT), \ + echo 'src/gz %d_kmods %U/targets/%S/kmods/$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC)';) \ + $(foreach feed,$(FEEDS_AVAILABLE), \ + $(if $(CONFIG_FEED_$(feed)), \ + echo '$(if $(filter m,$(CONFIG_FEED_$(feed))),# )src/gz %d_$(feed) %U/packages/%A/$(feed)';)))) \ +) >> $(1) +endef + +# 1: package name +define GetABISuffix +$(if $(ABIV_$(1)),$(ABIV_$(1)),$(call FormatABISuffix,$(1),$(foreach v,$(wildcard $(STAGING_DIR)/pkginfo/$(1).version),$(shell cat $(v))))) +endef + +# 1: package name +# 2: abi version +define FormatABISuffix +$(if $(filter-out kmod-%,$(1)),$(if $(2),$(if $(filter %0 %1 %2 %3 %4 %5 %6 %7 %8 %9,$(1)),-)$(2))) +endef diff --git a/include/hardened-ld-pie.specs b/include/hardened-ld-pie.specs new file mode 100644 index 0000000..7317b19 --- /dev/null +++ b/include/hardened-ld-pie.specs @@ -0,0 +1,2 @@ +*self_spec: ++ %{no-pie|static|r|shared:;:-pie} diff --git a/include/hardening.mk b/include/hardening.mk new file mode 100644 index 0000000..6acd862 --- /dev/null +++ b/include/hardening.mk @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2015-2020 OpenWrt.org + +PKG_CHECK_FORMAT_SECURITY ?= 1 +PKG_ASLR_PIE ?= 1 +PKG_ASLR_PIE_REGULAR ?= 0 +PKG_SSP ?= 1 +PKG_FORTIFY_SOURCE ?= 1 +PKG_RELRO ?= 1 + +ifdef CONFIG_PKG_CHECK_FORMAT_SECURITY + ifeq ($(strip $(PKG_CHECK_FORMAT_SECURITY)),1) + TARGET_CFLAGS += -Wformat -Werror=format-security + endif +endif +ifdef CONFIG_PKG_ASLR_PIE_ALL + ifeq ($(strip $(PKG_ASLR_PIE)),1) + TARGET_CFLAGS += $(FPIC) + TARGET_LDFLAGS += $(FPIC) -specs=$(INCLUDE_DIR)/hardened-ld-pie.specs + endif +endif +ifdef CONFIG_PKG_ASLR_PIE_REGULAR + ifeq ($(strip $(PKG_ASLR_PIE_REGULAR)),1) + TARGET_CFLAGS += $(FPIC) + TARGET_LDFLAGS += $(FPIC) -specs=$(INCLUDE_DIR)/hardened-ld-pie.specs + endif +endif +ifdef CONFIG_PKG_CC_STACKPROTECTOR_REGULAR + ifeq ($(strip $(PKG_SSP)),1) + TARGET_CFLAGS += -fstack-protector + endif +endif +ifdef CONFIG_PKG_CC_STACKPROTECTOR_STRONG + ifeq ($(strip $(PKG_SSP)),1) + TARGET_CFLAGS += -fstack-protector-strong + endif +endif +ifdef CONFIG_PKG_FORTIFY_SOURCE_1 + ifeq ($(strip $(PKG_FORTIFY_SOURCE)),1) + TARGET_CFLAGS += -D_FORTIFY_SOURCE=1 + endif +endif +ifdef CONFIG_PKG_FORTIFY_SOURCE_2 + ifeq ($(strip $(PKG_FORTIFY_SOURCE)),1) + TARGET_CFLAGS += -D_FORTIFY_SOURCE=2 + endif +endif +ifdef CONFIG_PKG_RELRO_PARTIAL + ifeq ($(strip $(PKG_RELRO)),1) + TARGET_CFLAGS += -Wl,-z,relro + TARGET_LDFLAGS += -zrelro + endif +endif +ifdef CONFIG_PKG_RELRO_FULL + ifeq ($(strip $(PKG_RELRO)),1) + TARGET_CFLAGS += -Wl,-z,now -Wl,-z,relro + TARGET_LDFLAGS += -znow -zrelro + endif +endif + diff --git a/include/host-build.mk b/include/host-build.mk new file mode 100644 index 0000000..2d0c416 --- /dev/null +++ b/include/host-build.mk @@ -0,0 +1,215 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +include $(INCLUDE_DIR)/download.mk + +HOST_BUILD_DIR ?= $(BUILD_DIR_HOST)/$(PKG_NAME)$(if $(PKG_VERSION),-$(PKG_VERSION)) +HOST_INSTALL_DIR ?= $(HOST_BUILD_DIR)/host-install +HOST_BUILD_PARALLEL ?= + +HOST_MAKE_J:=$(if $(MAKE_JOBSERVER),$(MAKE_JOBSERVER) $(if $(filter 3.% 4.0 4.1,$(MAKE_VERSION)),-j)) + +ifeq ($(strip $(HOST_BUILD_PARALLEL)),0) +HOST_JOBS?=-j1 +else +HOST_JOBS?=$(if $(HOST_BUILD_PARALLEL),$(HOST_MAKE_J),-j1) +endif + +include $(INCLUDE_DIR)/unpack.mk +include $(INCLUDE_DIR)/depends.mk +include $(INCLUDE_DIR)/quilt.mk + +BUILD_TYPES += host +HOST_STAMP_PREPARED=$(HOST_BUILD_DIR)/.prepared$(if $(HOST_QUILT)$(DUMP),,$(shell $(call $(if $(CONFIG_AUTOREMOVE),find_md5_reproducible,find_md5),${CURDIR} $(PKG_FILE_DEPENDS),))_$(call confvar,CONFIG_AUTOREMOVE $(HOST_PREPARED_DEPENDS))) +HOST_STAMP_CONFIGURED:=$(HOST_BUILD_DIR)/.configured +HOST_STAMP_BUILT:=$(HOST_BUILD_DIR)/.built +HOST_BUILD_PREFIX?=$(if $(IS_PACKAGE_BUILD),$(STAGING_DIR_HOSTPKG),$(STAGING_DIR_HOST)) +HOST_STAMP_INSTALLED:=$(HOST_BUILD_PREFIX)/stamp/.$(PKG_NAME)_installed +HOST_STAMP_PROGRAMS:=$(foreach program,$(PKG_PROGRAMS),$(subst $(PKG_NAME),$(program),$(HOST_STAMP_INSTALLED)) ) + +override MAKEFLAGS= + +include $(INCLUDE_DIR)/autotools.mk + +_host_target:=$(if $(HOST_QUILT),,.) + +Host/Patch:=$(Host/Patch/Default) +define Host/Prepare/Default + $(if $(strip $(HOST_UNPACK)),$(HOST_UNPACK)) + [ ! -d ./src/ ] || $(CP) ./src/* $(HOST_BUILD_DIR) + $(Host/Patch) +endef + +define Host/Prepare + $(call Host/Prepare/Default) +endef + +HOST_CONFIGURE_VARS = \ + CC="$(HOSTCC)" \ + CFLAGS="$(HOST_CFLAGS)" \ + CXX="$(HOSTCXX)" \ + CPPFLAGS="$(HOST_CPPFLAGS)" \ + CXXFLAGS="$(HOST_CXXFLAGS)" \ + LDFLAGS="$(HOST_LDFLAGS)" \ + CONFIG_SHELL="$(SHELL)" + +HOST_CONFIGURE_ARGS = \ + --target=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --build=$(GNU_HOST_NAME) \ + --disable-dependency-tracking \ + --program-prefix="" \ + --program-suffix="" \ + --prefix=$(HOST_BUILD_PREFIX) \ + --exec-prefix=$(HOST_BUILD_PREFIX) \ + --sysconfdir=$(HOST_BUILD_PREFIX)/etc \ + --localstatedir=$(HOST_BUILD_PREFIX)/var \ + --sbindir=$(HOST_BUILD_PREFIX)/bin + +HOST_MAKE_VARS = \ + CFLAGS="$(HOST_CFLAGS)" \ + CPPFLAGS="$(HOST_CPPFLAGS)" \ + CXXFLAGS="$(HOST_CXXFLAGS)" \ + LDFLAGS="$(HOST_LDFLAGS)" + +HOST_MAKE_FLAGS = + +HOST_CONFIGURE_CMD = $(BASH) ./configure + +ifeq ($(HOST_OS),Darwin) + HOST_CONFIG_SITE:=$(INCLUDE_DIR)/site/darwin +endif + +define Host/Configure/Default + $(if $(HOST_CONFIGURE_PARALLEL),+)(cd $(HOST_BUILD_DIR)/$(3); \ + if [ -x configure ]; then \ + $(CP) $(SCRIPT_DIR)/config.{guess,sub} $(HOST_BUILD_DIR)/$(3)/ && \ + $(HOST_CONFIGURE_VARS) \ + $(2) \ + $(HOST_CONFIGURE_CMD) \ + $(HOST_CONFIGURE_ARGS) \ + $(1); \ + fi \ + ) +endef + +define Host/Configure + $(call Host/Configure/Default) +endef + +define Host/Compile/Default + +$(HOST_MAKE_VARS) \ + $(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR) \ + $(HOST_MAKE_FLAGS) \ + $(1) +endef + +define Host/Compile + $(call Host/Compile/Default) +endef + +define Host/Install/Default + $(call Host/Compile/Default,install) +endef + +define Host/Install + $(call Host/Install/Default,$(HOST_BUILD_PREFIX)) +endef + + +ifneq ($(if $(HOST_QUILT),,$(CONFIG_AUTOREBUILD)),) + define HostHost/Autoclean + $(call rdep,${CURDIR} $(PKG_FILE_DEPENDS),$(HOST_STAMP_PREPARED)) + $(if $(if $(Host/Compile),$(filter prepare,$(MAKECMDGOALS)),1),,$(call rdep,$(HOST_BUILD_DIR),$(HOST_STAMP_BUILT))) + endef +endif + +define Host/Exports/Default + $(1) : export ACLOCAL_INCLUDE=$$(foreach p,$$(wildcard $$(STAGING_DIR_HOST)/share/aclocal $$(STAGING_DIR_HOST)/share/aclocal-* $(if $(IS_PACKAGE_BUILD),$$(STAGING_DIR)/host/share/aclocal $$(STAGING_DIR_HOSTPKG)/share/aclocal $$(STAGING_DIR)/host/share/aclocal-*)),-I $$(p)) + $(1) : export STAGING_PREFIX=$$(HOST_BUILD_PREFIX) + $(1) : export PKG_CONFIG_PATH=$$(STAGING_DIR_HOST)/lib/pkgconfig:$$(HOST_BUILD_PREFIX)/lib/pkgconfig + $(1) : export PKG_CONFIG_LIBDIR=$$(HOST_BUILD_PREFIX)/lib/pkgconfig + $(1) : export GIT_CEILING_DIRECTORIES=$$(BUILD_DIR_HOST) + $(if $(HOST_CONFIG_SITE),$(1) : export CONFIG_SITE:=$(HOST_CONFIG_SITE)) + $(if $(IS_PACKAGE_BUILD),$(1) : export PATH=$$(TARGET_PATH_PKG)) +endef +Host/Exports=$(Host/Exports/Default) + +.NOTPARALLEL: + +ifndef DUMP + define HostBuild/Core + $(if $(HOST_QUILT),$(Host/Quilt)) + $(if $(DUMP),,$(call HostHost/Autoclean)) + + $(HOST_STAMP_PREPARED): + @-rm -rf $(HOST_BUILD_DIR) + @mkdir -p $(HOST_BUILD_DIR) + $(foreach hook,$(Hooks/HostPrepare/Pre),$(call $(hook))$(sep)) + $(call Host/Prepare) + $(foreach hook,$(Hooks/HostPrepare/Post),$(call $(hook))$(sep)) + touch $$@ + + $(call Host/Exports,$(HOST_STAMP_CONFIGURED)) + $(HOST_STAMP_CONFIGURED): $(HOST_STAMP_PREPARED) + $(foreach hook,$(Hooks/HostConfigure/Pre),$(call $(hook))$(sep)) + $(call Host/Configure) + $(foreach hook,$(Hooks/HostConfigure/Post),$(call $(hook))$(sep)) + touch $$@ + + $(call Host/Exports,$(HOST_STAMP_BUILT)) + $(HOST_STAMP_BUILT): $(HOST_STAMP_CONFIGURED) + $(foreach hook,$(Hooks/HostCompile/Pre),$(call $(hook))$(sep)) + $(call Host/Compile) + $(foreach hook,$(Hooks/HostCompile/Post),$(call $(hook))$(sep)) + touch $$@ + + $(call Host/Exports,$(HOST_STAMP_INSTALLED)) + $(HOST_STAMP_INSTALLED): $(HOST_STAMP_BUILT) $(if $(FORCE_HOST_INSTALL),FORCE) + $(call Host/Install,$(HOST_BUILD_PREFIX)) + $(foreach hook,$(Hooks/HostInstall/Post),$(call $(hook))$(sep)) + mkdir -p $$(shell dirname $$@) + touch $(HOST_STAMP_BUILT) + touch $$@ $(HOST_STAMP_PROGRAMS) + + $(call DefaultTargets,$(patsubst %,host-%,$(DEFAULT_SUBDIR_TARGETS))) + ifndef STAMP_BUILT + $(foreach t,$(DEFAULT_SUBDIR_TARGETS), + $(t): host-$(t) + .$(t): .host-$(t) + ) + clean-build: host-clean-build + endif + + $(call check_download_integrity) + + $(_host_target)host-prepare: $(HOST_STAMP_PREPARED) + $(_host_target)host-configure: $(HOST_STAMP_CONFIGURED) + $(_host_target)host-compile: $(HOST_STAMP_BUILT) $(HOST_STAMP_INSTALLED) $(HOST_STAMP_PROGRAMS) + host-install: host-compile + + host-clean-build: FORCE + $(call Host/Uninstall) + rm -rf $(HOST_BUILD_DIR) $(HOST_STAMP_BUILT) + + host-clean: host-clean-build + $(call Host/Clean) + rm -rf $(HOST_STAMP_INSTALLED) $(HOST_STAMP_PROGRAMS) + + ifneq ($(CONFIG_AUTOREMOVE),) + host-compile: + $(FIND) $(HOST_BUILD_DIR) -mindepth 1 -maxdepth 1 -not '(' -type f -and -name '.*' -and -size 0 ')' -print0 | \ + $(XARGS) -0 rm -rf + endif + endef +endif + +define HostBuild + $(HostBuild/Core) + $(if $(if $(PKG_HOST_ONLY),,$(if $(and $(filter host-%,$(MAKECMDGOALS)),$(PKG_SKIP_DOWNLOAD)),,$(STAMP_PREPARED))),, + $(if $(and $(CONFIG_AUTOREMOVE), $(wildcard $(HOST_STAMP_INSTALLED), $(wildcard $(HOST_STAMP_BUILT)))),, + $(if $(strip $(PKG_SOURCE_URL)),$(call Download,default)) + ) + ) +endef diff --git a/include/image-commands.mk b/include/image-commands.mk new file mode 100644 index 0000000..12cbbb2 --- /dev/null +++ b/include/image-commands.mk @@ -0,0 +1,669 @@ +# Build commands that can be called from Device/* templates + +IMAGE_KERNEL = $(word 1,$^) +IMAGE_ROOTFS = $(word 2,$^) + +define ModelNameLimit16 +$(shell printf %.16s "$(word 2, $(subst _, ,$(1)))") +endef + +define rootfs_align +$(patsubst %-256k,0x40000,$(patsubst %-128k,0x20000,$(patsubst %-64k,0x10000,$(patsubst squashfs%,0x4,$(patsubst root.%,%,$(1)))))) +endef + + +define Build/append-dtb + cat $(KDIR)/image-$(firstword $(DEVICE_DTS)).dtb >> $@ +endef + +define Build/append-dtb-elf + $(TARGET_CROSS)objcopy \ + --set-section-flags=.appended_dtb=alloc,contents \ + --update-section \ + .appended_dtb=$(KDIR)/image-$(firstword $(DEVICE_DTS)).dtb $@ +endef + +define Build/append-kernel + dd if=$(IMAGE_KERNEL) >> $@ +endef + +define Build/package-kernel-ubifs + mkdir $@.kernelubifs + cp $@ $@.kernelubifs/kernel + $(STAGING_DIR_HOST)/bin/mkfs.ubifs \ + $(KERNEL_UBIFS_OPTS) \ + -r $@.kernelubifs $@ + rm -r $@.kernelubifs +endef + +define Build/append-image + cp "$(BIN_DIR)/$(DEVICE_IMG_PREFIX)-$(1)" "$@.stripmeta" + fwtool -s /dev/null -t "$@.stripmeta" || : + fwtool -i /dev/null -t "$@.stripmeta" || : + dd if="$@.stripmeta" >> "$@" + rm "$@.stripmeta" +endef + +ifdef IB +define Build/append-image-stage + dd if=$(STAGING_DIR_IMAGE)/$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET))-$(DEVICE_NAME)-$(1) >> $@ +endef +else +define Build/append-image-stage + cp "$(BIN_DIR)/$(DEVICE_IMG_PREFIX)-$(1)" "$@.stripmeta" + fwtool -s /dev/null -t "$@.stripmeta" || : + fwtool -i /dev/null -t "$@.stripmeta" || : + mkdir -p "$(STAGING_DIR_IMAGE)" + dd if="$@.stripmeta" of="$(STAGING_DIR_IMAGE)/$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET))-$(DEVICE_NAME)-$(1)" + dd if="$@.stripmeta" >> "$@" + rm "$@.stripmeta" +endef +endif + + +compat_version=$(if $(DEVICE_COMPAT_VERSION),$(DEVICE_COMPAT_VERSION),1.0) +json_quote=$(subst ','\'',$(subst ",\",$(1))) +#")') + +legacy_supported_message=$(SUPPORTED_DEVICES) - Image version mismatch: image $(compat_version), \ + device 1.0. Please wipe config during upgrade (force required) or reinstall. \ + $(if $(DEVICE_COMPAT_MESSAGE),Reason: $(DEVICE_COMPAT_MESSAGE),Please check documentation ...) + +metadata_devices=$(if $(1),$(subst "$(space)","$(comma)",$(strip $(foreach v,$(1),"$(call json_quote,$(v))")))) +metadata_json = \ + '{ $(if $(IMAGE_METADATA),$(IMAGE_METADATA)$(comma)) \ + "metadata_version": "1.1", \ + "compat_version": "$(call json_quote,$(compat_version))", \ + $(if $(DEVICE_COMPAT_MESSAGE),"compat_message": "$(call json_quote,$(DEVICE_COMPAT_MESSAGE))"$(comma)) \ + $(if $(filter-out 1.0,$(compat_version)),"new_supported_devices": \ + [$(call metadata_devices,$(SUPPORTED_DEVICES))]$(comma) \ + "supported_devices": ["$(call json_quote,$(legacy_supported_message))"]$(comma)) \ + $(if $(filter 1.0,$(compat_version)),"supported_devices":[$(call metadata_devices,$(SUPPORTED_DEVICES))]$(comma)) \ + "version": { \ + "dist": "$(call json_quote,$(VERSION_DIST))", \ + "version": "$(call json_quote,$(VERSION_NUMBER))", \ + "revision": "$(call json_quote,$(REVISION))", \ + "target": "$(call json_quote,$(TARGETID))", \ + "board": "$(call json_quote,$(if $(BOARD_NAME),$(BOARD_NAME),$(DEVICE_NAME)))" \ + } \ + }' + +define Build/append-metadata + $(if $(SUPPORTED_DEVICES),-echo $(call metadata_json) | fwtool -I - $@) + sha256sum "$@" | cut -d" " -f1 > "$@.sha256sum" + [ ! -s "$(BUILD_KEY)" -o ! -s "$(BUILD_KEY).ucert" -o ! -s "$@" ] || { \ + cp "$(BUILD_KEY).ucert" "$@.ucert" ;\ + usign -S -m "$@" -s "$(BUILD_KEY)" -x "$@.sig" ;\ + ucert -A -c "$@.ucert" -x "$@.sig" ;\ + fwtool -S "$@.ucert" "$@" ;\ + } +endef + +define Build/append-rootfs + dd if=$(IMAGE_ROOTFS) >> $@ +endef + +define Build/append-squashfs-fakeroot-be + rm -rf $@.fakefs $@.fakesquashfs + mkdir $@.fakefs + $(STAGING_DIR_HOST)/bin/mksquashfs3-lzma \ + $@.fakefs $@.fakesquashfs \ + -noappend -root-owned -be -nopad -b 65536 \ + $(if $(SOURCE_DATE_EPOCH),-fixed-time $(SOURCE_DATE_EPOCH)) + cat $@.fakesquashfs >> $@ +endef + +define Build/append-squashfs4-fakeroot + rm -rf $@.fakefs $@.fakesquashfs + mkdir $@.fakefs + $(STAGING_DIR_HOST)/bin/mksquashfs4 \ + $@.fakefs $@.fakesquashfs \ + -nopad -noappend -root-owned + cat $@.fakesquashfs >> $@ +endef + +define Build/append-string + echo -n $(1) >> $@ +endef + +define Build/append-md5sum-ascii-salted + cp $@ $@.salted + echo -ne $(1) >> $@.salted + $(STAGING_DIR_HOST)/bin/mkhash md5 $@.salted | head -c32 >> $@ + rm $@.salted +endef + +define Build/append-ubi + sh $(TOPDIR)/scripts/ubinize-image.sh \ + $(if $(UBOOTENV_IN_UBI),--uboot-env) \ + $(if $(KERNEL_IN_UBI),--kernel $(IMAGE_KERNEL)) \ + $(foreach part,$(UBINIZE_PARTS),--part $(part)) \ + --rootfs $(IMAGE_ROOTFS) \ + $@.tmp \ + -p $(BLOCKSIZE:%k=%KiB) -m $(PAGESIZE) \ + $(if $(SUBPAGESIZE),-s $(SUBPAGESIZE)) \ + $(if $(VID_HDR_OFFSET),-O $(VID_HDR_OFFSET)) \ + $(UBINIZE_OPTS) + cat $@.tmp >> $@ + rm $@.tmp +endef + +define Build/ubinize-kernel + cp $@ $@.tmp + sh $(TOPDIR)/scripts/ubinize-image.sh \ + --kernel $@.tmp \ + $@ \ + -p $(BLOCKSIZE:%k=%KiB) -m $(PAGESIZE) \ + $(if $(SUBPAGESIZE),-s $(SUBPAGESIZE)) \ + $(if $(VID_HDR_OFFSET),-O $(VID_HDR_OFFSET)) \ + $(UBINIZE_OPTS) + rm $@.tmp +endef + +define Build/append-uboot + dd if=$(UBOOT_PATH) >> $@ +endef + +# append a fake/empty uImage header, to fool bootloaders rootfs integrity check +# for example +define Build/append-uImage-fakehdr + $(eval type=$(word 1,$(1))) + $(eval magic=$(word 2,$(1))) + touch $@.fakehdr + $(STAGING_DIR_HOST)/bin/mkimage \ + -A $(LINUX_KARCH) -O linux -T $(type) -C none \ + -n '$(VERSION_DIST) fake $(type)' \ + $(if $(magic),-M $(magic)) \ + -d $@.fakehdr \ + -s \ + $@.fakehdr + cat $@.fakehdr >> $@ +endef + +define Build/buffalo-dhp-image + $(STAGING_DIR_HOST)/bin/mkdhpimg $@ $@.new + mv $@.new $@ +endef + +define Build/buffalo-enc + $(eval product=$(word 1,$(1))) + $(eval version=$(word 2,$(1))) + $(eval args=$(wordlist 3,$(words $(1)),$(1))) + $(STAGING_DIR_HOST)/bin/buffalo-enc \ + -p $(product) -v $(version) $(args) \ + -i $@ -o $@.new + mv $@.new $@ +endef + +define Build/buffalo-enc-tag + $(call Build/buffalo-enc,'' '' -S 152 $(1)) +endef + +define Build/buffalo-tag-dhp + $(eval product=$(word 1,$(1))) + $(eval region=$(word 2,$(1))) + $(eval language=$(word 3,$(1))) + $(STAGING_DIR_HOST)/bin/buffalo-tag \ + -d 0x01000000 -w 1 \ + -a $(BUFFALO_TAG_PLATFORM) \ + -v $(BUFFALO_TAG_VERSION) -m $(BUFFALO_TAG_MINOR) \ + -b $(product) -p $(product) \ + -r $(region) -r $(region) -l $(language) \ + -I $@ -o $@.new + mv $@.new $@ +endef + +define Build/check-size + @imagesize="$$(stat -c%s $@)"; \ + limitsize="$$(($(subst k,* 1024,$(subst m, * 1024k,$(if $(1),$(1),$(IMAGE_SIZE))))))"; \ + [ $$limitsize -ge $$imagesize ] || { \ + $(call ERROR_MESSAGE, WARNING: Image file $@ is too big: $$imagesize > $$limitsize); \ + rm -f $@; \ + } +endef + +define Build/copy-file + cat "$(1)" > "$@" +endef + +# Create a header for a D-Link AI series recovery image and add it at the beginning of the image +# Currently supported: AQUILA M30, EAGLE M32 and R32 +# Arguments: +# 1: Start string of the header +# 2: Firmware version +# 3: Block start address +# 4: Block length +# 5: Device FMID +define Build/dlink-ai-recovery-header + $(eval header_start=$(word 1,$(1))) + $(eval firmware_version=$(word 2,$(1))) + $(eval block_start=$(word 3,$(1))) + $(eval block_length=$(word 4,$(1))) + $(eval device_fmid=$(word 5,$(1))) +# create $@.header without the checksum + echo -en "$(header_start)\x00\x00" > "$@.header" +# Calculate checksum over data area ($@) and append it to the header. +# The checksum is the 2byte-sum over the whole data area. +# Every overflow during the checksum calculation must increment the current checksum value by 1. + od -v -w2 -tu2 -An --endian little "$@" | awk '{ s+=$$1; } END { s%=65535; printf "%c%c",s%256,s/256; }' >> "$@.header" + echo -en "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" >> "$@.header" + echo -en "$(firmware_version)" >> "$@.header" +# Only one block supported: Erase start/length is identical to data start/length + echo -en "$(block_start)$(block_length)$(block_start)$(block_length)" >> "$@.header" +# Only zeros + echo -en "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" >> "$@.header" +# Last 16 bytes, but without checksum + echo -en "\x42\x48\x02\x00\x00\x00\x08\x00\x00\x00\x00\x00" >> "$@.header" + echo -en "$(device_fmid)" >> "$@.header" +# Calculate and append checksum: The checksum must be set so that the 2byte-sum of the whole header is 0. +# Every overflow during the checksum calculation must increment the current checksum value by 1. + od -v -w2 -tu2 -An --endian little "$@.header" | awk '{s+=65535-$$1;}END{s%=65535;printf "%c%c",s%256,s/256;}' >> "$@.header" + cat "$@.header" "$@" > "$@.new" + mv "$@.new" "$@" + rm "$@.header" +endef + +define Build/dlink-sge-image + $(STAGING_DIR_HOST)/bin/dlink-sge-image $(1) $@ $@.enc + mv $@.enc $@ +endef + +define Build/edimax-header + $(STAGING_DIR_HOST)/bin/mkedimaximg -i $@ -o $@.new $(1) + @mv $@.new $@ +endef + +define Build/elecom-product-header + $(eval product=$(word 1,$(1))) + $(eval fw=$(if $(word 2,$(1)),$(word 2,$(1)),$@)) + + ( \ + echo -n -e "ELECOM\x00\x00$(product)" | dd bs=40 count=1 conv=sync; \ + echo -n "0.00" | dd bs=16 count=1 conv=sync; \ + dd if=$(fw); \ + ) > $(fw).new + mv $(fw).new $(fw) +endef + +define Build/elecom-wrc-gs-factory + $(eval product=$(word 1,$(1))) + $(eval version=$(word 2,$(1))) + $(eval hash_opt=$(word 3,$(1))) + $(MKHASH) md5 $(hash_opt) $@ >> $@ + ( \ + echo -n "ELECOM $(product) v$(version)" | \ + dd bs=32 count=1 conv=sync; \ + dd if=$@; \ + ) > $@.new + mv $@.new $@ +endef + +define Build/elx-header + $(eval hw_id=$(word 1,$(1))) + $(eval xor_pattern=$(word 2,$(1))) + ( \ + echo -ne "\x00\x00\x00\x00\x00\x00\x00\x03" | \ + dd bs=42 count=1 conv=sync; \ + hw_id="$(hw_id)"; \ + echo -ne "\x$${hw_id:0:2}\x$${hw_id:2:2}\x$${hw_id:4:2}\x$${hw_id:6:2}" | \ + dd bs=20 count=1 conv=sync; \ + echo -ne "$$(printf '%08x' $$(stat -c%s $@) | fold -s2 | xargs -I {} echo \\x{} | tr -d '\n')" | \ + dd bs=8 count=1 conv=sync; \ + echo -ne "$$($(MKHASH) md5 $@ | fold -s2 | xargs -I {} echo \\x{} | tr -d '\n')" | \ + dd bs=58 count=1 conv=sync; \ + ) > $(KDIR)/tmp/$(DEVICE_NAME).header + $(call Build/xor-image,-p $(xor_pattern) -x) + cat $(KDIR)/tmp/$(DEVICE_NAME).header $@ > $@.new + mv $@.new $@ + rm -rf $(KDIR)/tmp/$(DEVICE_NAME).header +endef + +define Build/eva-image + $(STAGING_DIR_HOST)/bin/lzma2eva $(KERNEL_LOADADDR) $(KERNEL_LOADADDR) $@ $@.new + mv $@.new $@ +endef + +define Build/initrd_compression + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_BZIP2),.bzip2) \ + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_GZIP),.gzip) \ + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZ4),.lz4) \ + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZMA),.lzma) \ + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZO),.lzo) \ + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_XZ),.xz) \ + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_ZSTD),.zstd) +endef + +define Build/fit + $(TOPDIR)/scripts/mkits.sh \ + -D $(DEVICE_NAME) -o $@.its -k $@ \ + -C $(word 1,$(1)) \ + $(if $(word 2,$(1)),\ + $(if $(findstring 11,$(if $(DEVICE_DTS_OVERLAY),1)$(if $(findstring $(KERNEL_BUILD_DIR)/image-,$(word 2,$(1))),,1)), \ + -d $(KERNEL_BUILD_DIR)/image-$$(basename $(word 2,$(1))), \ + -d $(word 2,$(1)))) \ + $(if $(findstring with-rootfs,$(word 3,$(1))),-r $(IMAGE_ROOTFS)) \ + $(if $(findstring with-initrd,$(word 3,$(1))), \ + $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS_SEPARATE), \ + -i $(KERNEL_BUILD_DIR)/initrd.cpio$(strip $(call Build/initrd_compression)))) \ + -a $(KERNEL_LOADADDR) -e $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \ + $(if $(DEVICE_FDT_NUM),-n $(DEVICE_FDT_NUM)) \ + $(if $(DEVICE_DTS_DELIMITER),-l $(DEVICE_DTS_DELIMITER)) \ + $(if $(DEVICE_DTS_LOADADDR),-s $(DEVICE_DTS_LOADADDR)) \ + $(if $(DEVICE_DTS_OVERLAY),$(foreach dtso,$(DEVICE_DTS_OVERLAY), -O $(dtso):$(KERNEL_BUILD_DIR)/image-$(dtso).dtbo)) \ + -c $(if $(DEVICE_DTS_CONFIG),$(DEVICE_DTS_CONFIG),"config-1") \ + -A $(LINUX_KARCH) -v $(LINUX_VERSION) + PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage $(if $(findstring external,$(word 3,$(1))),\ + -E -B 0x1000 $(if $(findstring static,$(word 3,$(1))),-p 0x1000)) -f $@.its $@.new + @mv $@.new $@ +endef + +define Build/libdeflate-gzip + $(STAGING_DIR_HOST)/bin/libdeflate-gzip -f -12 -c $@ $(1) > $@.new + @mv $@.new $@ +endef + +define Build/gzip + $(STAGING_DIR_HOST)/bin/gzip -f -9n -c $@ $(1) > $@.new + @mv $@.new $@ +endef + +define Build/gzip-filename + @mkdir -p $@.tmp + @cp $@ $@.tmp/$(word 1,$(1)) + $(if $(SOURCE_DATE_EPOCH),touch -hcd "@$(SOURCE_DATE_EPOCH)" $@.tmp/$(word 1,$(1)) $(word 2,$(1))) + $(STAGING_DIR_HOST)/bin/gzip -f -9 -N -c $@.tmp/$(word 1,$(1)) $(word 2,$(1)) > $@.new + @mv $@.new $@ + @rm -rf $@.tmp +endef + +define Build/install-dtb + $(call locked, \ + $(foreach dts,$(DEVICE_DTS), \ + $(CP) \ + $(DTS_DIR)/$(dts).dtb \ + $(BIN_DIR)/$(IMG_PREFIX)-$(dts).dtb; \ + ), \ + install-dtb-$(IMG_PREFIX) \ + ) +endef + +define Build/iptime-crc32 + $(STAGING_DIR_HOST)/bin/iptime-crc32 $(1) $@ $@.new + mv $@.new $@ +endef + +define Build/iptime-naspkg + $(STAGING_DIR_HOST)/bin/iptime-naspkg $(1) $@ $@.new + mv $@.new $@ +endef + +define Build/jffs2 + rm -rf $(KDIR_TMP)/$(DEVICE_NAME)/jffs2 && \ + mkdir -p $(KDIR_TMP)/$(DEVICE_NAME)/jffs2/$$(dirname $(1)) && \ + cp $@ $(KDIR_TMP)/$(DEVICE_NAME)/jffs2/$(1) && \ + $(STAGING_DIR_HOST)/bin/mkfs.jffs2 --pad \ + $(if $(CONFIG_BIG_ENDIAN),--big-endian,--little-endian) \ + --squash-uids -v -e $(patsubst %k,%KiB,$(BLOCKSIZE)) \ + -o $@.new \ + -d $(KDIR_TMP)/$(DEVICE_NAME)/jffs2 \ + 2>&1 1>/dev/null | awk '/^.+$$$$/' && \ + $(STAGING_DIR_HOST)/bin/padjffs2 $@.new -J $(patsubst %k,,$(BLOCKSIZE)) + -rm -rf $(KDIR_TMP)/$(DEVICE_NAME)/jffs2/ + @mv $@.new $@ +endef + +define Build/kernel2minor + $(eval temp_file := $(shell mktemp)) + cp $@ $(temp_file) + kernel2minor -k $(temp_file) -r $(temp_file).new $(1) + mv $(temp_file).new $@ + rm -f $(temp_file) +endef + +define Build/kernel-bin + rm -f $@ + cp $< $@ +endef + +define Build/linksys-image + $(TOPDIR)/scripts/linksys-image.sh \ + "$(call param_get_default,type,$(1),$(DEVICE_NAME))" \ + $@ $@.new + mv $@.new $@ +endef + +define Build/lzma + $(call Build/lzma-no-dict,-lc1 -lp2 -pb2 $(1)) +endef + +define Build/lzma-no-dict + $(STAGING_DIR_HOST)/bin/lzma e $@ $(1) $@.new + @mv $@.new $@ +endef + +define Build/netgear-chk + $(STAGING_DIR_HOST)/bin/mkchkimg \ + -o $@.new \ + -k $@ \ + -b $(NETGEAR_BOARD_ID) \ + $(if $(NETGEAR_REGION),-r $(NETGEAR_REGION),) + mv $@.new $@ +endef + +define Build/netgear-dni + $(STAGING_DIR_HOST)/bin/mkdniimg \ + -B $(NETGEAR_BOARD_ID) -v $(shell cat $(VERSION_DIST)| sed -e 's/[[:space:]]/-/g').$(firstword $(subst -, ,$(REVISION))) \ + $(if $(NETGEAR_HW_ID),-H $(NETGEAR_HW_ID)) \ + -r "$(1)" \ + -i $@ -o $@.new + mv $@.new $@ +endef + +define Build/netgear-encrypted-factory + $(TOPDIR)/scripts/netgear-encrypted-factory.py \ + --input-file $@ \ + --output-file $@ \ + --model $(NETGEAR_ENC_MODEL) \ + --region $(NETGEAR_ENC_REGION) \ + $(if $(NETGEAR_ENC_HW_ID_LIST),--hw-id-list "$(NETGEAR_ENC_HW_ID_LIST)") \ + $(if $(NETGEAR_ENC_MODEL_LIST),--model-list "$(NETGEAR_ENC_MODEL_LIST)") \ + --version V1.0.0.0.$(shell cat $(VERSION_DIST)| sed -e 's/[[:space:]]/-/g').$(firstword $(subst -, ,$(REVISION))) \ + --encryption-block-size 0x20000 \ + --openssl-bin "$(STAGING_DIR_HOST)/bin/openssl" \ + --key 6865392d342b4d212964363d6d7e7765312c7132613364316e26322a5a5e2538 \ + --iv 4a253169516c38243d6c6d2d3b384145 +endef + +define Build/openmesh-image + $(TOPDIR)/scripts/om-fwupgradecfg-gen.sh \ + "$(call param_get_default,ce_type,$(1),$(DEVICE_NAME))" \ + "$@-fwupgrade.cfg" \ + "$(call param_get_default,kernel,$(1),$(IMAGE_KERNEL))" \ + "$(call param_get_default,rootfs,$(1),$@)" + $(TOPDIR)/scripts/combined-ext-image.sh \ + "$(call param_get_default,ce_type,$(1),$(DEVICE_NAME))" "$@" \ + "$@-fwupgrade.cfg" "fwupgrade.cfg" \ + "$(call param_get_default,kernel,$(1),$(IMAGE_KERNEL))" "kernel" \ + "$(call param_get_default,rootfs,$(1),$@)" "rootfs" +endef + +define Build/pad-extra + dd if=/dev/zero bs=$(1) count=1 >> $@ +endef + +define Build/pad-offset + let \ + size="$$(stat -c%s $@)" \ + pad="$(subst k,* 1024,$(word 1, $(1)))" \ + offset="$(subst k,* 1024,$(word 2, $(1)))" \ + pad="(pad - ((size + offset) % pad)) % pad" \ + newsize='size + pad'; \ + dd if=$@ of=$@.new bs=$$newsize count=1 conv=sync + mv $@.new $@ +endef + +define Build/pad-rootfs + $(STAGING_DIR_HOST)/bin/padjffs2 $@ $(1) \ + $(if $(BLOCKSIZE),$(BLOCKSIZE:%k=%),4 8 16 64 128 256) +endef + +define Build/pad-to + $(call Image/pad-to,$@,$(1)) +endef + +define Build/patch-cmdline + $(STAGING_DIR_HOST)/bin/patch-cmdline $@ '$(CMDLINE)' +endef + +# Convert a raw image into a $1 type image. +# E.g. | qemu-image vdi +define Build/qemu-image + if command -v qemu-img; then \ + qemu-img convert -f raw -O $1 $@ $@.new; \ + mv $@.new $@; \ + else \ + echo "WARNING: Install qemu-img to create VDI/VMDK images" >&2; exit 1; \ + fi +endef + +define Build/qsdk-ipq-factory-nand + $(TOPDIR)/scripts/mkits-qsdk-ipq-image.sh \ + $@.its ubi $@ + PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage -f $@.its $@.new + @mv $@.new $@ +endef + +define Build/qsdk-ipq-factory-nor + $(TOPDIR)/scripts/mkits-qsdk-ipq-image.sh \ + $@.its hlos $(IMAGE_KERNEL) rootfs $(IMAGE_ROOTFS) + PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage -f $@.its $@.new + @mv $@.new $@ +endef + +define Build/seama + $(STAGING_DIR_HOST)/bin/seama -i $@ \ + -m "dev=/dev/mtdblock/$(SEAMA_MTDBLOCK)" -m "type=firmware" + mv $@.seama $@ +endef + +define Build/seama-seal + $(STAGING_DIR_HOST)/bin/seama -i $@ -s $@.seama \ + -m "signature=$(SEAMA_SIGNATURE)" + mv $@.seama $@ +endef + +define Build/senao-header + $(STAGING_DIR_HOST)/bin/mksenaofw $(1) -e $@ -o $@.new + mv $@.new $@ +endef + +define Build/sysupgrade-tar + sh $(TOPDIR)/scripts/sysupgrade-tar.sh \ + --board $(if $(BOARD_NAME),$(BOARD_NAME),$(DEVICE_NAME)) \ + --kernel $(call param_get_default,kernel,$(1),$(IMAGE_KERNEL)) \ + --rootfs $(call param_get_default,rootfs,$(1),$(IMAGE_ROOTFS)) \ + $@ +endef + +define Build/tplink-safeloader + -$(STAGING_DIR_HOST)/bin/tplink-safeloader \ + -B $(TPLINK_BOARD_ID) \ + -V $(REVISION) \ + -k $(IMAGE_KERNEL) \ + -r $@ \ + -o $@.new \ + -j \ + $(wordlist 2,$(words $(1)),$(1)) \ + $(if $(findstring sysupgrade,$(word 1,$(1))),-S) && mv $@.new $@ || rm -f $@ +endef + +define Build/tplink-v1-header + $(STAGING_DIR_HOST)/bin/mktplinkfw \ + -c -H $(TPLINK_HWID) -W $(TPLINK_HWREV) -L $(KERNEL_LOADADDR) \ + -E $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \ + -m $(TPLINK_HEADER_VERSION) -N "$(VERSION_DIST)" -V $(REVISION) \ + -k $@ -o $@.new $(1) + @mv $@.new $@ +endef + +# combine kernel and rootfs into one image +# mktplinkfw +# is "sysupgrade" or "factory" +# +# -a align the rootfs start on an bytes boundary +# -j add jffs2 end-of-filesystem markers +# -s strip padding from end of the image +# -X reserve bytes in the firmware image (hexval prefixed with 0x) +define Build/tplink-v1-image + -$(STAGING_DIR_HOST)/bin/mktplinkfw \ + -H $(TPLINK_HWID) -W $(TPLINK_HWREV) -F $(TPLINK_FLASHLAYOUT) \ + -N "$(VERSION_DIST)" -V $(REVISION) -m $(TPLINK_HEADER_VERSION) \ + -k $(IMAGE_KERNEL) -r $(IMAGE_ROOTFS) -o $@.new -j -X 0x40000 \ + -a $(call rootfs_align,$(FILESYSTEM)) \ + $(wordlist 2,$(words $(1)),$(1)) \ + $(if $(findstring sysupgrade,$(word 1,$(1))),-s) && mv $@.new $@ || rm -f $@ +endef + +define Build/tplink-v2-header + $(STAGING_DIR_HOST)/bin/mktplinkfw2 \ + -c -H $(TPLINK_HWID) -W $(TPLINK_HWREV) -L $(KERNEL_LOADADDR) \ + -E $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \ + -w $(TPLINK_HWREVADD) -F "$(TPLINK_FLASHLAYOUT)" \ + -T $(TPLINK_HVERSION) -V "ver. 2.0" \ + -k $@ -o $@.new $(1) + @mv $@.new $@ +endef + +define Build/tplink-v2-image + $(STAGING_DIR_HOST)/bin/mktplinkfw2 \ + -H $(TPLINK_HWID) -W $(TPLINK_HWREV) \ + -w $(TPLINK_HWREVADD) -F "$(TPLINK_FLASHLAYOUT)" \ + -T $(TPLINK_HVERSION) -V "ver. 2.0" -a 0x4 -j \ + -k $(IMAGE_KERNEL) -r $(IMAGE_ROOTFS) -o $@.new $(1) + cat $@.new >> $@ + rm -rf $@.new +endef + +define Build/uImage + $(if $(UIMAGE_TIME),SOURCE_DATE_EPOCH="$(UIMAGE_TIME)") \ + mkimage \ + -A $(LINUX_KARCH) \ + -O linux \ + -T kernel \ + -C $(word 1,$(1)) \ + -a $(KERNEL_LOADADDR) \ + -e $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \ + -n '$(if $(UIMAGE_NAME),$(UIMAGE_NAME),$(call toupper,$(LINUX_KARCH)) $(VERSION_DIST) Linux-$(LINUX_VERSION))' \ + $(if $(UIMAGE_MAGIC),-M $(UIMAGE_MAGIC)) \ + $(wordlist 2,$(words $(1)),$(1)) \ + -d $@ $@.new + mv $@.new $@ +endef + +define Build/xor-image + $(STAGING_DIR_HOST)/bin/xorimage -i $@ -o $@.xor $(1) + mv $@.xor $@ +endef + +define Build/zip + rm -rf $@.tmp + mkdir $@.tmp + mv $@ $@.tmp/$(word 1,$(1)) + TZ=UTC $(STAGING_DIR_HOST)/bin/zip -j -X \ + $(wordlist 2,$(words $(1)),$(1)) \ + $@ $@.tmp/$(if $(word 1,$(1)),$(word 1,$(1)),$$(basename $@)) + rm -rf $@.tmp +endef + +define Build/zyxel-ras-image + let \ + newsize="$(subst k,* 1024,$(RAS_ROOTFS_SIZE))"; \ + $(STAGING_DIR_HOST)/bin/mkrasimage \ + -b $(RAS_BOARD) \ + -v $(RAS_VERSION) \ + -r $@ \ + -s $$newsize \ + -o $@.new \ + $(if $(findstring separate-kernel,$(word 1,$(1))),-k $(IMAGE_KERNEL)) \ + && mv $@.new $@ +endef diff --git a/include/image.mk b/include/image.mk new file mode 100644 index 0000000..6a62f47 --- /dev/null +++ b/include/image.mk @@ -0,0 +1,876 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +override TARGET_BUILD= +include $(INCLUDE_DIR)/prereq.mk +include $(INCLUDE_DIR)/kernel.mk +include $(INCLUDE_DIR)/version.mk +include $(INCLUDE_DIR)/image-commands.mk + +ifndef IB + ifdef CONFIG_TARGET_PER_DEVICE_ROOTFS + TARGET_PER_DEVICE_ROOTFS := 1 + endif +endif + +include $(INCLUDE_DIR)/feeds.mk +include $(INCLUDE_DIR)/rootfs.mk + +override MAKE:=$(_SINGLE)$(SUBMAKE) +override NO_TRACE_MAKE:=$(_SINGLE)$(NO_TRACE_MAKE) + +target_params = $(subst +,$(space),$*) +param_get = $(patsubst $(1)=%,%,$(filter $(1)=%,$(2))) +param_get_default = $(firstword $(call param_get,$(1),$(2)) $(3)) +param_mangle = $(subst $(space),_,$(strip $(1))) +param_unmangle = $(subst _,$(space),$(1)) + +mkfs_packages_id = $(shell echo $(sort $(1)) | $(MKHASH) md5 | cut -b1-8) +mkfs_target_dir = $(if $(call param_get,pkg,$(1)),$(KDIR)/target-dir-$(call param_get,pkg,$(1)),$(TARGET_DIR)) + +KDIR=$(KERNEL_BUILD_DIR) +KDIR_TMP=$(KDIR)/tmp +DTS_DIR:=$(LINUX_DIR)/arch/$(LINUX_KARCH)/boot/dts + +IMG_PREFIX_EXTRA:=$(if $(EXTRA_IMAGE_NAME),$(call sanitize,$(EXTRA_IMAGE_NAME))-) +IMG_PREFIX_VERNUM:=$(if $(CONFIG_VERSION_FILENAMES),$(call sanitize,$(VERSION_NUMBER))-) +IMG_PREFIX_VERCODE:=$(if $(CONFIG_VERSION_CODE_FILENAMES),$(call sanitize,$(VERSION_CODE))-) + +IMG_PREFIX:=$(VERSION_DIST_SANITIZED)-$(IMG_PREFIX_VERNUM)$(IMG_PREFIX_VERCODE)$(IMG_PREFIX_EXTRA)$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET)) +IMG_ROOTFS:=$(IMG_PREFIX)-rootfs +IMG_COMBINED:=$(IMG_PREFIX)-combined +ifeq ($(DUMP),) +IMG_PART_SIGNATURE:=$(shell echo $(SOURCE_DATE_EPOCH)$(LINUX_VERMAGIC) | $(MKHASH) md5 | cut -b1-8) +IMG_PART_DISKGUID:=$(shell echo $(SOURCE_DATE_EPOCH)$(LINUX_VERMAGIC) | $(MKHASH) md5 | sed -E 's/(.{8})(.{4})(.{4})(.{4})(.{10})../\1-\2-\3-\4-\500/') +endif + +MKFS_DEVTABLE_OPT := -D $(INCLUDE_DIR)/device_table.txt + +ifneq ($(CONFIG_BIG_ENDIAN),) + JFFS2OPTS := --big-endian --squash-uids -v +else + JFFS2OPTS := --little-endian --squash-uids -v +endif + +ifeq ($(CONFIG_JFFS2_RTIME),y) + JFFS2OPTS += -X rtime +endif +ifeq ($(CONFIG_JFFS2_ZLIB),y) + JFFS2OPTS += -X zlib +endif +ifeq ($(CONFIG_JFFS2_LZMA),y) + JFFS2OPTS += -X lzma --compression-mode=size +endif +ifneq ($(CONFIG_JFFS2_RTIME),y) + JFFS2OPTS += -x rtime +endif +ifneq ($(CONFIG_JFFS2_ZLIB),y) + JFFS2OPTS += -x zlib +endif +ifneq ($(CONFIG_JFFS2_LZMA),y) + JFFS2OPTS += -x lzma +endif + +JFFS2OPTS += $(MKFS_DEVTABLE_OPT) + +SQUASHFS_BLOCKSIZE := $(CONFIG_TARGET_SQUASHFS_BLOCK_SIZE)k +SQUASHFSOPT := -b $(SQUASHFS_BLOCKSIZE) +SQUASHFSOPT += -p '/dev d 755 0 0' -p '/dev/console c 600 0 0 5 1' +SQUASHFSOPT += $(if $(CONFIG_SELINUX),-xattrs,-no-xattrs) +SQUASHFSCOMP := gzip +LZMA_XZ_OPTIONS := -Xpreset 9 -Xe -Xlc 0 -Xlp 2 -Xpb 2 +ifeq ($(CONFIG_SQUASHFS_XZ),y) + ifneq ($(filter arm x86 powerpc sparc,$(LINUX_KARCH)),) + BCJ_FILTER:=-Xbcj $(LINUX_KARCH) + endif + SQUASHFSCOMP := xz $(LZMA_XZ_OPTIONS) $(BCJ_FILTER) +endif + +JFFS2_BLOCKSIZE ?= 64k 128k + +fs-types-$(CONFIG_TARGET_ROOTFS_SQUASHFS) += squashfs +fs-types-$(CONFIG_TARGET_ROOTFS_JFFS2) += $(addprefix jffs2-,$(JFFS2_BLOCKSIZE)) +fs-types-$(CONFIG_TARGET_ROOTFS_JFFS2_NAND) += $(addprefix jffs2-nand-,$(NAND_BLOCKSIZE)) +fs-types-$(CONFIG_TARGET_ROOTFS_EXT4FS) += ext4 +fs-types-$(CONFIG_TARGET_ROOTFS_UBIFS) += ubifs +fs-subtypes-$(CONFIG_TARGET_ROOTFS_JFFS2) += $(addsuffix -raw,$(addprefix jffs2-,$(JFFS2_BLOCKSIZE))) + +TARGET_FILESYSTEMS := $(fs-types-y) + +FS_64K := $(filter-out jffs2-%,$(TARGET_FILESYSTEMS)) jffs2-64k +FS_128K := $(filter-out jffs2-%,$(TARGET_FILESYSTEMS)) jffs2-128k +FS_256K := $(filter-out jffs2-%,$(TARGET_FILESYSTEMS)) jffs2-256k + +define add_jffs2_mark + echo -ne '\xde\xad\xc0\xde' >> $(1) +endef + +PROFILE_SANITIZED := $(call tolower,$(subst DEVICE_,,$(subst $(space),-,$(PROFILE)))) + +define split_args +$(foreach data, \ + $(subst |,$(space),\ + $(subst $(space),^,$(1))), \ + $(call $(2),$(strip $(subst ^,$(space),$(data))))) +endef + +define build_cmd +$(if $(Build/$(word 1,$(1))),,$(error Missing Build/$(word 1,$(1)))) +$(call Build/$(word 1,$(1)),$(wordlist 2,$(words $(1)),$(1))) + +endef + +define concat_cmd +$(call split_args,$(1),build_cmd) +endef + +# pad to 4k, 8k, 16k, 64k, 128k, 256k and add jffs2 end-of-filesystem mark +define prepare_generic_squashfs + $(STAGING_DIR_HOST)/bin/padjffs2 $(1) 4 8 16 64 128 256 +endef + +define Image/BuildKernel/Initramfs + $(call Image/Build/Initramfs) +endef + +define Image/BuildKernel/MkuImage + mkimage -A $(ARCH) -O linux -T kernel -C $(1) -a $(2) -e $(3) \ + -n '$(call toupper,$(ARCH)) $(VERSION_DIST) Linux-$(LINUX_VERSION)' -d $(4) $(5) +endef + +ifdef CONFIG_TARGET_IMAGES_GZIP + define Image/Gzip + rm -f $(1).gz + gzip -9n $(1) + endef +endif + + +# Disable noisy checks by default as in upstream +DTC_WARN_FLAGS := \ + -Wno-unit_address_vs_reg \ + -Wno-simple_bus_reg \ + -Wno-unit_address_format \ + -Wno-pci_bridge \ + -Wno-pci_device_bus_num \ + -Wno-pci_device_reg \ + -Wno-avoid_unnecessary_addr_size \ + -Wno-alias_paths \ + -Wno-graph_child_address \ + -Wno-graph_port \ + -Wno-unique_unit_address + +DTC_FLAGS += $(DTC_WARN_FLAGS) +DTCO_FLAGS += $(DTC_WARN_FLAGS) + +define Image/pad-to + dd if=$(1) of=$(1).new bs=$(2) conv=sync + mv $(1).new $(1) +endef + +ifeq ($(DUMP),) +ROOTFS_PARTSIZE=$(shell echo $$(($(CONFIG_TARGET_ROOTFS_PARTSIZE)*1024*1024))) +endif + +define Image/pad-root-squashfs + $(call Image/pad-to,$(KDIR)/root.squashfs,$(if $(1),$(1),$(ROOTFS_PARTSIZE))) +endef + +# $(1) source dts file +# $(2) target dtb file +# $(3) extra CPP flags +# $(4) extra DTC flags +define Image/BuildDTB/sub + $(TARGET_CROSS)cpp -nostdinc -x assembler-with-cpp \ + $(DTS_CPPFLAGS) \ + -I$(DTS_DIR) \ + -I$(DTS_DIR)/include \ + -I$(LINUX_DIR)/include/ \ + -undef -D__DTS__ $(3) \ + -o $(2).tmp $(1) + $(LINUX_DIR)/scripts/dtc/dtc -O dtb \ + -i$(dir $(1)) $(4) \ + $(if $(CONFIG_HAS_DT_OVERLAY_SUPPORT),-@) \ + -o $(2) $(2).tmp + $(RM) $(2).tmp +endef + +define Image/BuildDTB + $(call Image/BuildDTB/sub,$(1),$(2),$(3),$(DTC_FLAGS) $(DEVICE_DTC_FLAGS) $(4)) +endef + +define Image/BuildDTBO + $(call Image/BuildDTB/sub,$(1),$(2),$(3),$(DTCO_FLAGS) $(DEVICE_DTCO_FLAGS) $(4)) +endef + +define Image/mkfs/jffs2/sub-raw + $(STAGING_DIR_HOST)/bin/mkfs.jffs2 \ + $(2) \ + -e $(patsubst %k,%KiB,$(1)) \ + -o $@ -d $(call mkfs_target_dir,$(3)) \ + -v 2>&1 1>/dev/null | awk '/^.+$$$$/' +endef + +define Image/mkfs/jffs2/sub + $(call Image/mkfs/jffs2/sub-raw,$(1),--pad $(2),$(3)) + $(call add_jffs2_mark,$@) +endef + +define Image/mkfs/jffs2/template + Image/mkfs/jffs2-$(1) = $$(call Image/mkfs/jffs2/sub,$(1),$(JFFS2OPTS),$$(1)) + Image/mkfs/jffs2-$(1)-raw = $$(call Image/mkfs/jffs2/sub-raw,$(1),$(JFFS2OPTS),$$(1)) + +endef + +define Image/mkfs/jffs2-nand/template + Image/mkfs/jffs2-nand-$(1) = \ + $$(call Image/mkfs/jffs2/sub, \ + $(word 2,$(subst -, ,$(1))), \ + $(JFFS2OPTS) --no-cleanmarkers --pagesize=$(word 1,$(subst -, ,$(1))),$$(1)) + +endef + +$(eval $(foreach S,$(JFFS2_BLOCKSIZE),$(call Image/mkfs/jffs2/template,$(S)))) +$(eval $(foreach S,$(NAND_BLOCKSIZE),$(call Image/mkfs/jffs2-nand/template,$(S)))) + +define Image/mkfs/squashfs-common + $(STAGING_DIR_HOST)/bin/mksquashfs4 $(call mkfs_target_dir,$(1)) $@ \ + -nopad -noappend -root-owned \ + -comp $(SQUASHFSCOMP) $(SQUASHFSOPT) +endef + +ifeq ($(CONFIG_TARGET_ROOTFS_SECURITY_LABELS),y) +define Image/mkfs/squashfs + echo ". $(call mkfs_target_dir,$(1))/etc/selinux/config" > $@.fakeroot-script + echo "$(STAGING_DIR_HOST)/bin/setfiles -r" \ + "$(call mkfs_target_dir,$(1))" \ + "$(call mkfs_target_dir,$(1))/etc/selinux/\$${SELINUXTYPE}/contexts/files/file_contexts " \ + "$(call mkfs_target_dir,$(1))" >> $@.fakeroot-script + echo "$(Image/mkfs/squashfs-common)" >> $@.fakeroot-script + chmod +x $@.fakeroot-script + $(FAKEROOT) "$@.fakeroot-script" +endef +else +define Image/mkfs/squashfs + $(call Image/mkfs/squashfs-common,$(1)) +endef +endif + +define Image/mkfs/ubifs + $(STAGING_DIR_HOST)/bin/mkfs.ubifs \ + $(UBIFS_OPTS) $(call param_unmangle,$(call param_get,fs,$(1))) \ + $(if $(CONFIG_TARGET_UBIFS_FREE_SPACE_FIXUP),--space-fixup) \ + $(if $(CONFIG_TARGET_UBIFS_COMPRESSION_NONE),--compr=none) \ + $(if $(CONFIG_TARGET_UBIFS_COMPRESSION_LZO),--compr=lzo) \ + $(if $(CONFIG_TARGET_UBIFS_COMPRESSION_ZLIB),--compr=zlib) \ + $(if $(shell echo $(CONFIG_TARGET_UBIFS_JOURNAL_SIZE)),--jrn-size=$(CONFIG_TARGET_UBIFS_JOURNAL_SIZE)) \ + --squash-uids \ + -o $@ -d $(call mkfs_target_dir,$(1)) +endef + +define Image/mkfs/ext4 + $(STAGING_DIR_HOST)/bin/make_ext4fs -L rootfs \ + -l $(ROOTFS_PARTSIZE) -b $(CONFIG_TARGET_EXT4_BLOCKSIZE) \ + $(if $(CONFIG_TARGET_EXT4_RESERVED_PCT),-m $(CONFIG_TARGET_EXT4_RESERVED_PCT)) \ + $(if $(CONFIG_TARGET_EXT4_JOURNAL),,-J) \ + $(if $(SOURCE_DATE_EPOCH),-T $(SOURCE_DATE_EPOCH)) \ + $@ $(call mkfs_target_dir,$(1))/ +endef + +define Image/Manifest + $(call opkg,$(TARGET_DIR_ORIG)) list-installed > \ + $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest +ifndef IB + $(if $(CONFIG_JSON_CYCLONEDX_SBOM), \ + $(SCRIPT_DIR)/package-metadata.pl imgcyclonedxsbom \ + $(TMP_DIR)/.packageinfo \ + $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest > \ + $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).bom.cdx.json) +endif +endef + +define Image/gzip-ext4-padded-squashfs + + define Image/Build/squashfs + $(call Image/pad-root-squashfs) + endef + + ifneq ($(CONFIG_TARGET_IMAGES_GZIP),) + define Image/Build/gzip/ext4 + $(call Image/Build/gzip,ext4) + endef + define Image/Build/gzip/squashfs + $(call Image/Build/gzip,squashfs) + endef + endif + +endef + +ifdef CONFIG_TARGET_ROOTFS_TARGZ + define Image/Build/targz + $(TAR) -cp --numeric-owner --owner=0 --group=0 --mode=a-s --sort=name \ + $(if $(SOURCE_DATE_EPOCH),--mtime="@$(SOURCE_DATE_EPOCH)") \ + -C $(TARGET_DIR)/ . | gzip -9n > $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED))-rootfs.tar.gz + endef +endif + +ifdef CONFIG_TARGET_ROOTFS_CPIOGZ + define Image/Build/cpiogz + ( cd $(TARGET_DIR); find . | $(STAGING_DIR_HOST)/bin/cpio -o -H newc -R 0:0 | gzip -9n >$(BIN_DIR)/$(IMG_ROOTFS).cpio.gz ) + endef +endif + +mkfs_packages = $(filter-out @%,$(PACKAGES_$(call param_get,pkg,pkg=$(target_params)))) +mkfs_packages_add = $(foreach pkg,$(filter-out -%,$(mkfs_packages)),$(pkg)$(call GetABISuffix,$(pkg))) +mkfs_packages_remove = $(foreach pkg,$(patsubst -%,%,$(filter -%,$(mkfs_packages))),$(pkg)$(call GetABISuffix,$(pkg))) +mkfs_cur_target_dir = $(call mkfs_target_dir,pkg=$(target_params)) + +opkg_target = \ + $(call opkg,$(mkfs_cur_target_dir)) \ + -f $(mkfs_cur_target_dir).conf + +target-dir-%: FORCE + rm -rf $(mkfs_cur_target_dir) $(mkfs_cur_target_dir).opkg + $(CP) $(TARGET_DIR_ORIG) $(mkfs_cur_target_dir) + -mv $(mkfs_cur_target_dir)/etc/opkg $(mkfs_cur_target_dir).opkg + echo 'src default file://$(PACKAGE_DIR_ALL)' > $(mkfs_cur_target_dir).conf + $(if $(mkfs_packages_remove), \ + -$(call opkg,$(mkfs_cur_target_dir)) remove \ + $(mkfs_packages_remove)) + $(if $(call opkg_package_files,$(mkfs_packages_add)), \ + $(opkg_target) update && \ + $(opkg_target) install \ + $(call opkg_package_files,$(mkfs_packages_add))) + -$(CP) -T $(mkfs_cur_target_dir).opkg/ $(mkfs_cur_target_dir)/etc/opkg/ + rm -rf $(mkfs_cur_target_dir).opkg $(mkfs_cur_target_dir).conf + $(call prepare_rootfs,$(mkfs_cur_target_dir),$(TOPDIR)/files) + +$(KDIR)/root.%: kernel_prepare + $(call Image/mkfs/$(word 1,$(target_params)),$(target_params)) + +define Device/InitProfile + PROFILES := $(PROFILE) + DEVICE_TITLE = $$(DEVICE_VENDOR) $$(DEVICE_MODEL)$$(if $$(DEVICE_VARIANT), $$(DEVICE_VARIANT)) + DEVICE_ALT0_TITLE = $$(DEVICE_ALT0_VENDOR) $$(DEVICE_ALT0_MODEL)$$(if $$(DEVICE_ALT0_VARIANT), $$(DEVICE_ALT0_VARIANT)) + DEVICE_ALT1_TITLE = $$(DEVICE_ALT1_VENDOR) $$(DEVICE_ALT1_MODEL)$$(if $$(DEVICE_ALT1_VARIANT), $$(DEVICE_ALT1_VARIANT)) + DEVICE_ALT2_TITLE = $$(DEVICE_ALT2_VENDOR) $$(DEVICE_ALT2_MODEL)$$(if $$(DEVICE_ALT2_VARIANT), $$(DEVICE_ALT2_VARIANT)) + DEVICE_ALT3_TITLE = $$(DEVICE_ALT3_VENDOR) $$(DEVICE_ALT3_MODEL)$$(if $$(DEVICE_ALT3_VARIANT), $$(DEVICE_ALT3_VARIANT)) + DEVICE_ALT4_TITLE = $$(DEVICE_ALT4_VENDOR) $$(DEVICE_ALT4_MODEL)$$(if $$(DEVICE_ALT4_VARIANT), $$(DEVICE_ALT4_VARIANT)) + DEVICE_VENDOR := + DEVICE_MODEL := + DEVICE_VARIANT := + DEVICE_ALT0_VENDOR := + DEVICE_ALT0_MODEL := + DEVICE_ALT0_VARIANT := + DEVICE_ALT1_VENDOR := + DEVICE_ALT1_MODEL := + DEVICE_ALT1_VARIANT := + DEVICE_ALT2_VENDOR := + DEVICE_ALT2_MODEL := + DEVICE_ALT2_VARIANT := + DEVICE_ALT3_VENDOR := + DEVICE_ALT3_MODEL := + DEVICE_ALT3_VARIANT := + DEVICE_ALT4_VENDOR := + DEVICE_ALT4_MODEL := + DEVICE_ALT4_VARIANT := + DEVICE_PACKAGES := + DEVICE_DESCRIPTION = Build firmware images for $$(DEVICE_TITLE) +endef + +define Device/Init + DEVICE_NAME := $(1) + KERNEL:= + KERNEL_INITRAMFS = $$(KERNEL) + CMDLINE:= + + IMAGES := + ARTIFACTS := + DEVICE_IMG_PREFIX := $(IMG_PREFIX)-$(1) + DEVICE_IMG_NAME = $$(DEVICE_IMG_PREFIX)-$$(1)-$$(2) + FACTORY_IMG_NAME := + IMAGE_SIZE := + KERNEL_PREFIX = $$(DEVICE_IMG_PREFIX) + KERNEL_SUFFIX := -kernel.bin + KERNEL_INITRAMFS_SUFFIX = $$(KERNEL_SUFFIX) + KERNEL_IMAGE = $$(KERNEL_PREFIX)$$(KERNEL_SUFFIX) + KERNEL_INITRAMFS_PREFIX = $$(DEVICE_IMG_PREFIX)-initramfs + KERNEL_INITRAMFS_IMAGE = $$(KERNEL_INITRAMFS_PREFIX)$$(KERNEL_INITRAMFS_SUFFIX) + KERNEL_INITRAMFS_NAME = $$(KERNEL_NAME)-initramfs + KERNEL_INSTALL := + KERNEL_NAME := vmlinux + KERNEL_DEPENDS := + KERNEL_SIZE := + + UBOOTENV_IN_UBI := + KERNEL_IN_UBI := + BLOCKSIZE := + PAGESIZE := + SUBPAGESIZE := + VID_HDR_OFFSET := + UBINIZE_OPTS := + UBINIZE_PARTS := + MKUBIFS_OPTS := + + FS_OPTIONS/ubifs = $$(MKUBIFS_OPTS) + + DEVICE_DTS := + DEVICE_DTS_CONFIG := + DEVICE_DTS_DELIMITER := + DEVICE_DTS_DIR := + DEVICE_DTS_LOADADDR := + DEVICE_DTS_OVERLAY := + DEVICE_FDT_NUM := + DEVICE_DTC_FLAGS := + DEVICE_DTCO_FLAGS := + SOC := + + BOARD_NAME := + UIMAGE_MAGIC := + UIMAGE_NAME := + UIMAGE_TIME := + DEVICE_COMPAT_VERSION := 1.0 + DEVICE_COMPAT_MESSAGE := + SUPPORTED_DEVICES := $(subst _,$(comma),$(1)) + IMAGE_METADATA := + + FILESYSTEMS := $(TARGET_FILESYSTEMS) + + UBOOT_PATH := $(STAGING_DIR_IMAGE)/uboot-$(1) + + BROKEN := + DEFAULT := +endef + +DEFAULT_DEVICE_VARS := \ + DEVICE_NAME KERNEL KERNEL_INITRAMFS KERNEL_INITRAMFS_IMAGE KERNEL_SIZE \ + CMDLINE UBOOTENV_IN_UBI KERNEL_IN_UBI BLOCKSIZE PAGESIZE SUBPAGESIZE \ + VID_HDR_OFFSET UBINIZE_OPTS UBINIZE_PARTS MKUBIFS_OPTS DEVICE_DTC_FLAGS \ + DEVICE_DTCO_FLAGS DEVICE_DTS DEVICE_DTS_CONFIG DEVICE_DTS_DELIMITER \ + DEVICE_DTS_DIR DEVICE_DTS_OVERLAY DEVICE_DTS_LOADADDR \ + DEVICE_FDT_NUM DEVICE_IMG_PREFIX SOC BOARD_NAME UIMAGE_MAGIC UIMAGE_NAME \ + UIMAGE_TIME SUPPORTED_DEVICES IMAGE_METADATA KERNEL_ENTRY KERNEL_LOADADDR \ + UBOOT_PATH IMAGE_SIZE \ + FACTORY_IMG_NAME FACTORY_SIZE \ + DEVICE_PACKAGES DEVICE_COMPAT_VERSION DEVICE_COMPAT_MESSAGE \ + DEVICE_VENDOR DEVICE_MODEL DEVICE_VARIANT \ + DEVICE_ALT0_VENDOR DEVICE_ALT0_MODEL DEVICE_ALT0_VARIANT \ + DEVICE_ALT1_VENDOR DEVICE_ALT1_MODEL DEVICE_ALT1_VARIANT \ + DEVICE_ALT2_VENDOR DEVICE_ALT2_MODEL DEVICE_ALT2_VARIANT \ + DEVICE_ALT3_VENDOR DEVICE_ALT3_MODEL DEVICE_ALT3_VARIANT \ + DEVICE_ALT4_VENDOR DEVICE_ALT4_MODEL DEVICE_ALT4_VARIANT + +define Device/ExportVar + $(1) : $(2):=$$($(2)) + +endef +define Device/Export + $(foreach var,$(DEVICE_VARS) $(DEFAULT_DEVICE_VARS),$(call Device/ExportVar,$(1),$(var))) + $(1) : FILESYSTEM:=$(2) +endef + +ifdef IB + DEVICE_CHECK_PROFILE = $(filter $(1),DEVICE_$(PROFILE) $(PROFILE)) +else + DEVICE_CHECK_PROFILE = $(CONFIG_TARGET_$(if $(CONFIG_TARGET_MULTI_PROFILE),DEVICE_)$(call target_conf,$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET)))_$(1)) +endif + +DEVICE_EXTRA_PACKAGES = $(call qstrip,$(CONFIG_TARGET_DEVICE_PACKAGES_$(call target_conf,$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET)))_DEVICE_$(1))) + +define merge_packages + $(1) := + $(foreach pkg,$(2), + $(1) := $$(strip $$(filter-out -$$(patsubst -%,%,$(pkg)) $$(patsubst -%,%,$(pkg)),$$($(1))) $(pkg)) + ) +endef + +define Device/Check/Common + _PROFILE_SET = $$(strip $$(foreach profile,$$(PROFILES) DEVICE_$(1),$$(call DEVICE_CHECK_PROFILE,$$(profile)))) + # Check if device is disabled and if so do not mark to be installed when ImageBuilder is used + ifeq ($(IB),1) + ifeq ($$(DEFAULT),n) + _PROFILE_SET := + endif + ifeq ($$(BROKEN),y) + _PROFILE_SET := + endif + endif + DEVICE_PACKAGES += $$(call extra_packages,$$(DEVICE_PACKAGES)) + ifdef TARGET_PER_DEVICE_ROOTFS + $$(eval $$(call merge_packages,_PACKAGES,$$(DEVICE_PACKAGES) $$(call DEVICE_EXTRA_PACKAGES,$(1)))) + ROOTFS_ID/$(1) := $$(if $$(_PROFILE_SET),$$(call mkfs_packages_id,$$(_PACKAGES))) + PACKAGES_$$(ROOTFS_ID/$(1)) := $$(_PACKAGES) + endif +endef + +define Device/Check + $(Device/Check/Common) + KDIR_KERNEL_IMAGE := $(KDIR)/$(1)$$(KERNEL_SUFFIX) + _TARGET := $$(if $$(_PROFILE_SET),install-images,install-disabled) + ifndef IB + _COMPILE_TARGET := $$(if $(CONFIG_IB)$$(_PROFILE_SET),compile,compile-disabled) + endif +endef + +ifndef IB +define Device/Build/initramfs + $(call Device/Export,$(KDIR)/tmp/$$(KERNEL_INITRAMFS_IMAGE),$(1)) + $$(_TARGET): $$(if $$(KERNEL_INITRAMFS),$(BIN_DIR)/$$(KERNEL_INITRAMFS_IMAGE) \ + $$(if $$(CONFIG_JSON_OVERVIEW_IMAGE_INFO), $(BUILD_DIR)/json_info_files/$$(KERNEL_INITRAMFS_IMAGE).json,)) + + $(KDIR)/$$(KERNEL_INITRAMFS_NAME):: image_prepare + $(1)-initramfs-images: $$(if $$(KERNEL_INITRAMFS),$(BIN_DIR)/$$(KERNEL_INITRAMFS_IMAGE)) + $(BIN_DIR)/$$(KERNEL_INITRAMFS_IMAGE): $(KDIR)/tmp/$$(KERNEL_INITRAMFS_IMAGE) + cp $$^ $$@ + + $(KDIR)/tmp/$$(KERNEL_INITRAMFS_IMAGE): $(KDIR)/$$(KERNEL_INITRAMFS_NAME) $(CURDIR)/Makefile $$(KERNEL_DEPENDS) image_prepare + @rm -f $$@ + $$(call concat_cmd,$$(KERNEL_INITRAMFS)) + + $(call Device/Export,$(BUILD_DIR)/json_info_files/$$(KERNEL_INITRAMFS_IMAGE).json,$(1)) + + $(BUILD_DIR)/json_info_files/$$(KERNEL_INITRAMFS_IMAGE).json: $(BIN_DIR)/$$(KERNEL_INITRAMFS_IMAGE) + @mkdir -p $$(shell dirname $$@) + DEVICE_ID="$(1)" \ + SOURCE_DATE_EPOCH=$(SOURCE_DATE_EPOCH) \ + FILE_NAME="$$(notdir $$^)" \ + FILE_DIR="$(KDIR)/tmp" \ + FILE_TYPE="kernel" \ + FILE_FILESYSTEM="initramfs" \ + DEVICE_IMG_PREFIX="$$(DEVICE_IMG_PREFIX)" \ + DEVICE_VENDOR="$$(DEVICE_VENDOR)" \ + DEVICE_MODEL="$$(DEVICE_MODEL)" \ + DEVICE_VARIANT="$$(DEVICE_VARIANT)" \ + DEVICE_ALT0_VENDOR="$$(DEVICE_ALT0_VENDOR)" \ + DEVICE_ALT0_MODEL="$$(DEVICE_ALT0_MODEL)" \ + DEVICE_ALT0_VARIANT="$$(DEVICE_ALT0_VARIANT)" \ + DEVICE_ALT1_VENDOR="$$(DEVICE_ALT1_VENDOR)" \ + DEVICE_ALT1_MODEL="$$(DEVICE_ALT1_MODEL)" \ + DEVICE_ALT1_VARIANT="$$(DEVICE_ALT1_VARIANT)" \ + DEVICE_ALT2_VENDOR="$$(DEVICE_ALT2_VENDOR)" \ + DEVICE_ALT2_MODEL="$$(DEVICE_ALT2_MODEL)" \ + DEVICE_ALT2_VARIANT="$$(DEVICE_ALT2_VARIANT)" \ + DEVICE_ALT3_VENDOR="$$(DEVICE_ALT3_VENDOR)" \ + DEVICE_ALT3_MODEL="$$(DEVICE_ALT3_MODEL)" \ + DEVICE_ALT3_VARIANT="$$(DEVICE_ALT3_VARIANT)" \ + DEVICE_ALT4_VENDOR="$$(DEVICE_ALT4_VENDOR)" \ + DEVICE_ALT4_MODEL="$$(DEVICE_ALT4_MODEL)" \ + DEVICE_ALT4_VARIANT="$$(DEVICE_ALT4_VARIANT)" \ + DEVICE_TITLE="$$(DEVICE_TITLE)" \ + DEVICE_PACKAGES="$$(DEVICE_PACKAGES)" \ + TARGET="$(BOARD)" \ + SUBTARGET="$(if $(SUBTARGET),$(SUBTARGET),generic)" \ + VERSION_NUMBER="$(VERSION_NUMBER)" \ + VERSION_CODE="$(VERSION_CODE)" \ + SUPPORTED_DEVICES="$$(SUPPORTED_DEVICES)" \ + $(TOPDIR)/scripts/json_add_image_info.py $$@ +endef +endif + +define Device/Build/compile + $$(_COMPILE_TARGET): $(KDIR)/$(1) + $(eval $(call Device/Export,$(KDIR)/$(1))) + $(KDIR)/$(1): FORCE + rm -f $(KDIR)/$(1) + $$(call concat_cmd,$(COMPILE/$(1))) + +endef + +ifndef IB +define Device/Build/dtb + ifndef BUILD_DTS_$(1) + BUILD_DTS_$(1) := 1 + $(KDIR)/image-$(1).dtb: FORCE + $(call Image/BuildDTB,$(strip $(2))/$(strip $(3)).dts,$$@) + + compile-dtb: $(KDIR)/image-$(1).dtb + endif + +endef + +define Device/Build/dtbo + ifndef BUILD_DTSO_$(1) + BUILD_DTSO_$(1) := 1 + $(KDIR)/image-$(1).dtbo: FORCE + $(call Image/BuildDTBO,$(strip $(2))/$(strip $(3)).dtso,$$@) + + compile-dtb: $(KDIR)/image-$(1).dtbo + endif + +endef +endif + +define Device/Build/kernel + $$(eval $$(foreach dts,$$(DEVICE_DTS), \ + $$(call Device/Build/dtb,$$(notdir $$(dts)), \ + $$(if $$(DEVICE_DTS_DIR),$$(DEVICE_DTS_DIR),$$(DTS_DIR)), \ + $$(dts) \ + ) \ + )) + $$(eval $$(foreach dtso,$$(DEVICE_DTS_OVERLAY), \ + $$(call Device/Build/dtbo,$$(notdir $$(dtso)), \ + $$(if $$(DEVICE_DTS_DIR),$$(DEVICE_DTS_DIR),$$(DTS_DIR)), \ + $$(dtso) \ + ) \ + )) + + $(KDIR)/$$(KERNEL_NAME):: image_prepare + $$(_TARGET): $$(if $$(KERNEL_INSTALL),$(BIN_DIR)/$$(KERNEL_IMAGE)) + $(call Device/Export,$$(KDIR_KERNEL_IMAGE),$(1)) + $(BIN_DIR)/$$(KERNEL_IMAGE): $$(KDIR_KERNEL_IMAGE) + cp $$^ $$@ + ifndef IB + ifdef CONFIG_IB + install: $$(KDIR_KERNEL_IMAGE) + endif + $$(KDIR_KERNEL_IMAGE): $(KDIR)/$$(KERNEL_NAME) $(CURDIR)/Makefile $$(KERNEL_DEPENDS) image_prepare + @rm -f $$@ + $$(call concat_cmd,$$(KERNEL)) + $$(if $$(KERNEL_SIZE),$$(call Build/check-size,$$(KERNEL_SIZE))) + endif +endef + +define Device/Build/image + GZ_SUFFIX := $(if $(filter %dtb %gz,$(2)),,$(if $(and $(findstring ext4,$(1)),$(CONFIG_TARGET_IMAGES_GZIP)),.gz)) + $$(_TARGET): $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \ + $(BUILD_DIR)/json_info_files/$(call DEVICE_IMG_NAME,$(1),$(2)).json, \ + $(BIN_DIR)/$(call DEVICE_IMG_NAME,$(1),$(2))$$(GZ_SUFFIX)) + $(eval $(call Device/Export,$(KDIR)/tmp/$(call DEVICE_IMG_NAME,$(1),$(2)),$(1))) + $(3)-images: $(BIN_DIR)/$(call DEVICE_IMG_NAME,$(1),$(2))$$(GZ_SUFFIX) + + ROOTFS/$(1)/$(3) := \ + $(KDIR)/root.$(1)$$(strip \ + $$(if $$(FS_OPTIONS/$(1)),+fs=$$(call param_mangle,$$(FS_OPTIONS/$(1)))) \ + )$$(strip \ + $(if $(TARGET_PER_DEVICE_ROOTFS),+pkg=$$(ROOTFS_ID/$(3))) \ + ) + ifndef IB + $$(ROOTFS/$(1)/$(3)): $(if $(TARGET_PER_DEVICE_ROOTFS),target-dir-$$(ROOTFS_ID/$(3))) + endif + $(KDIR)/tmp/$(call DEVICE_IMG_NAME,$(1),$(2)): $$(KDIR_KERNEL_IMAGE) $$(ROOTFS/$(1)/$(3)) $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(if $(IB),,$(3)-initramfs-images)) + @rm -f $$@ + [ -f $$(word 1,$$^) -a -f $$(word 2,$$^) ] + $$(call concat_cmd,$(if $(IMAGE/$(2)/$(1)),$(IMAGE/$(2)/$(1)),$(IMAGE/$(2)))) + + .IGNORE: $(BIN_DIR)/$(call DEVICE_IMG_NAME,$(1),$(2)) + + $(BIN_DIR)/$(call DEVICE_IMG_NAME,$(1),$(2)).gz: $(KDIR)/tmp/$(call DEVICE_IMG_NAME,$(1),$(2)) + gzip -c -9n $$^ > $$@ + + $(BIN_DIR)/$(call DEVICE_IMG_NAME,$(1),$(2)): $(KDIR)/tmp/$(call DEVICE_IMG_NAME,$(1),$(2)) + cp $$^ $$@ + + $(BUILD_DIR)/json_info_files/$(call DEVICE_IMG_NAME,$(1),$(2)).json: $(BIN_DIR)/$(call DEVICE_IMG_NAME,$(1),$(2))$$(GZ_SUFFIX) + @mkdir -p $$(shell dirname $$@) + DEVICE_ID="$(DEVICE_NAME)" \ + SOURCE_DATE_EPOCH=$(SOURCE_DATE_EPOCH) \ + FILE_NAME="$(DEVICE_IMG_NAME)" \ + FILE_DIR="$(KDIR)/tmp" \ + FILE_TYPE=$(word 1,$(subst ., ,$(2))) \ + FILE_FILESYSTEM="$(1)" \ + DEVICE_IMG_PREFIX="$(DEVICE_IMG_PREFIX)" \ + DEVICE_VENDOR="$(DEVICE_VENDOR)" \ + DEVICE_MODEL="$(DEVICE_MODEL)" \ + DEVICE_VARIANT="$(DEVICE_VARIANT)" \ + DEVICE_ALT0_VENDOR="$(DEVICE_ALT0_VENDOR)" \ + DEVICE_ALT0_MODEL="$(DEVICE_ALT0_MODEL)" \ + DEVICE_ALT0_VARIANT="$(DEVICE_ALT0_VARIANT)" \ + DEVICE_ALT1_VENDOR="$(DEVICE_ALT1_VENDOR)" \ + DEVICE_ALT1_MODEL="$(DEVICE_ALT1_MODEL)" \ + DEVICE_ALT1_VARIANT="$(DEVICE_ALT1_VARIANT)" \ + DEVICE_ALT2_VENDOR="$(DEVICE_ALT2_VENDOR)" \ + DEVICE_ALT2_MODEL="$(DEVICE_ALT2_MODEL)" \ + DEVICE_ALT2_VARIANT="$(DEVICE_ALT2_VARIANT)" \ + DEVICE_ALT3_VENDOR="$(DEVICE_ALT3_VENDOR)" \ + DEVICE_ALT3_MODEL="$(DEVICE_ALT3_MODEL)" \ + DEVICE_ALT3_VARIANT="$(DEVICE_ALT3_VARIANT)" \ + DEVICE_ALT4_VENDOR="$(DEVICE_ALT4_VENDOR)" \ + DEVICE_ALT4_MODEL="$(DEVICE_ALT4_MODEL)" \ + DEVICE_ALT4_VARIANT="$(DEVICE_ALT4_VARIANT)" \ + DEVICE_TITLE="$(DEVICE_TITLE)" \ + DEVICE_PACKAGES="$(DEVICE_PACKAGES)" \ + TARGET="$(BOARD)" \ + SUBTARGET="$(if $(SUBTARGET),$(SUBTARGET),generic)" \ + VERSION_NUMBER="$(VERSION_NUMBER)" \ + VERSION_CODE="$(VERSION_CODE)" \ + SUPPORTED_DEVICES="$(SUPPORTED_DEVICES)" \ + $(TOPDIR)/scripts/json_add_image_info.py $$@ + +endef + +define Device/Build/artifact + $$(_TARGET): $(if $(CONFIG_JSON_OVERVIEW_IMAGE_INFO), \ + $(BUILD_DIR)/json_info_files/$(DEVICE_IMG_PREFIX)-$(1).json, \ + $(BIN_DIR)/$(DEVICE_IMG_PREFIX)-$(1)) + $(eval $(call Device/Export,$(KDIR)/tmp/$(DEVICE_IMG_PREFIX)-$(1))) + $(KDIR)/tmp/$(DEVICE_IMG_PREFIX)-$(1): $$(KDIR_KERNEL_IMAGE) $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(if $(IB),,$(2)-initramfs-images)) $(2)-images + @rm -f $$@ + $$(call concat_cmd,$(ARTIFACT/$(1))) + + .IGNORE: $(BIN_DIR)/$(DEVICE_IMG_PREFIX)-$(1) + + $(BIN_DIR)/$(DEVICE_IMG_PREFIX)-$(1): $(KDIR)/tmp/$(DEVICE_IMG_PREFIX)-$(1) + cp $$^ $$@ + + $(BUILD_DIR)/json_info_files/$(DEVICE_IMG_PREFIX)-$(1).json: $(BIN_DIR)/$(DEVICE_IMG_PREFIX)-$(1) + @mkdir -p $$(shell dirname $$@) + DEVICE_ID="$(DEVICE_NAME)" \ + SOURCE_DATE_EPOCH=$(SOURCE_DATE_EPOCH) \ + FILE_NAME="$(DEVICE_IMG_PREFIX)-$(1)" \ + FILE_DIR="$(KDIR)/tmp" \ + FILE_TYPE="$(1)" \ + DEVICE_IMG_PREFIX="$(DEVICE_IMG_PREFIX)" \ + DEVICE_VENDOR="$(DEVICE_VENDOR)" \ + DEVICE_MODEL="$(DEVICE_MODEL)" \ + DEVICE_VARIANT="$(DEVICE_VARIANT)" \ + DEVICE_ALT0_VENDOR="$(DEVICE_ALT0_VENDOR)" \ + DEVICE_ALT0_MODEL="$(DEVICE_ALT0_MODEL)" \ + DEVICE_ALT0_VARIANT="$(DEVICE_ALT0_VARIANT)" \ + DEVICE_ALT1_VENDOR="$(DEVICE_ALT1_VENDOR)" \ + DEVICE_ALT1_MODEL="$(DEVICE_ALT1_MODEL)" \ + DEVICE_ALT1_VARIANT="$(DEVICE_ALT1_VARIANT)" \ + DEVICE_ALT2_VENDOR="$(DEVICE_ALT2_VENDOR)" \ + DEVICE_ALT2_MODEL="$(DEVICE_ALT2_MODEL)" \ + DEVICE_ALT2_VARIANT="$(DEVICE_ALT2_VARIANT)" \ + DEVICE_ALT3_VENDOR="$(DEVICE_ALT3_VENDOR)" \ + DEVICE_ALT3_MODEL="$(DEVICE_ALT3_MODEL)" \ + DEVICE_ALT3_VARIANT="$(DEVICE_ALT3_VARIANT)" \ + DEVICE_ALT4_VENDOR="$(DEVICE_ALT4_VENDOR)" \ + DEVICE_ALT4_MODEL="$(DEVICE_ALT4_MODEL)" \ + DEVICE_ALT4_VARIANT="$(DEVICE_ALT4_VARIANT)" \ + DEVICE_TITLE="$(DEVICE_TITLE)" \ + DEVICE_PACKAGES="$(DEVICE_PACKAGES)" \ + TARGET="$(BOARD)" \ + SUBTARGET="$(if $(SUBTARGET),$(SUBTARGET),generic)" \ + VERSION_NUMBER="$(VERSION_NUMBER)" \ + VERSION_CODE="$(VERSION_CODE)" \ + SUPPORTED_DEVICES="$(SUPPORTED_DEVICES)" \ + $(TOPDIR)/scripts/json_add_image_info.py $$@ + +endef + +define Device/Build + $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(call Device/Build/initramfs,$(1))) + $(call Device/Build/kernel,$(1)) + + $$(eval $$(foreach compile,$$(COMPILE), \ + $$(call Device/Build/compile,$$(compile),$(1)))) + + $$(eval $$(foreach image,$$(IMAGES), \ + $$(foreach fs,$$(filter $(TARGET_FILESYSTEMS),$$(FILESYSTEMS)), \ + $$(call Device/Build/image,$$(fs),$$(image),$(1))))) + + $$(eval $$(foreach artifact,$$(ARTIFACTS), \ + $$(call Device/Build/artifact,$$(artifact),$(1)))) + +endef + +define Device/DumpInfo +Target-Profile: DEVICE_$(1) +Target-Profile-Name: $(DEVICE_DISPLAY) +Target-Profile-Packages: $(DEVICE_PACKAGES) +Target-Profile-hasImageMetadata: $(if $(foreach image,$(IMAGES),$(findstring append-metadata,$(IMAGE/$(image)))),1,0) +Target-Profile-SupportedDevices: $(SUPPORTED_DEVICES) +$(if $(BROKEN),Target-Profile-Broken: $(BROKEN)) +$(if $(DEFAULT),Target-Profile-Default: $(DEFAULT)) +Target-Profile-Description: +$(DEVICE_DESCRIPTION) +$(if $(strip $(DEVICE_ALT0_TITLE)),Alternative device titles: +- $(DEVICE_ALT0_TITLE)) +$(if $(strip $(DEVICE_ALT1_TITLE)),- $(DEVICE_ALT1_TITLE)) +$(if $(strip $(DEVICE_ALT2_TITLE)),- $(DEVICE_ALT2_TITLE)) +$(if $(strip $(DEVICE_ALT3_TITLE)),- $(DEVICE_ALT3_TITLE)) +$(if $(strip $(DEVICE_ALT4_TITLE)),- $(DEVICE_ALT4_TITLE)) +@@ + +endef + +define Device/Dump +ifneq ($$(strip $$(DEVICE_ALT0_TITLE)),) +DEVICE_DISPLAY = $$(DEVICE_ALT0_TITLE) ($$(DEVICE_TITLE)) +$$(info $$(call Device/DumpInfo,$(1))) +endif +ifneq ($$(strip $$(DEVICE_ALT1_TITLE)),) +DEVICE_DISPLAY = $$(DEVICE_ALT1_TITLE) ($$(DEVICE_TITLE)) +$$(info $$(call Device/DumpInfo,$(1))) +endif +ifneq ($$(strip $$(DEVICE_ALT2_TITLE)),) +DEVICE_DISPLAY = $$(DEVICE_ALT2_TITLE) ($$(DEVICE_TITLE)) +$$(info $$(call Device/DumpInfo,$(1))) +endif +ifneq ($$(strip $$(DEVICE_ALT3_TITLE)),) +DEVICE_DISPLAY = $$(DEVICE_ALT3_TITLE) ($$(DEVICE_TITLE)) +$$(info $$(call Device/DumpInfo,$(1))) +endif +ifneq ($$(strip $$(DEVICE_ALT4_TITLE)),) +DEVICE_DISPLAY = $$(DEVICE_ALT4_TITLE) ($$(DEVICE_TITLE)) +$$(info $$(call Device/DumpInfo,$(1))) +endif +DEVICE_DISPLAY = $$(DEVICE_TITLE) +$$(eval $$(if $$(DEVICE_TITLE),$$(info $$(call Device/DumpInfo,$(1))))) +endef + +define Device + $(call Device/InitProfile,$(1)) + $(call Device/Init,$(1)) + $(call Device/Default,$(1)) + $(call Device/$(1),$(1)) + $(call Device/Check,$(1)) + $(call Device/$(if $(DUMP),Dump,Build),$(1)) + +endef + +define BuildImage + + ifneq ($(DUMP),) + all: dumpinfo + dumpinfo: FORCE + @true + endif + + download: + prepare: + compile: + compile-dtb: + clean: + image_prepare: + + ifeq ($(IB),) + .PHONY: download prepare compile compile-dtb clean image_prepare kernel_prepare install install-images + compile: + $(call Build/Compile) + + clean: + $(call Build/Clean) + + compile-dtb: + image_prepare: compile compile-dtb + mkdir -p $(BIN_DIR) $(KDIR)/tmp + rm -rf $(BUILD_DIR)/json_info_files + $(call Image/Prepare) + + else + image_prepare: + rm -rf $(KDIR)/tmp + mkdir -p $(BIN_DIR) $(KDIR)/tmp + endif + + kernel_prepare: image_prepare + $(call Image/Build/targz) + $(call Image/Build/cpiogz) + $(call Image/BuildKernel) + $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(if $(IB),,$(call Image/BuildKernel/Initramfs))) + $(call Image/InstallKernel) + + $(foreach device,$(TARGET_DEVICES),$(call Device,$(device))) + + install-images: kernel_prepare $(foreach fs,$(filter-out $(if $(UBIFS_OPTS),,ubifs),$(TARGET_FILESYSTEMS) $(fs-subtypes-y)),$(KDIR)/root.$(fs)) + $(foreach fs,$(TARGET_FILESYSTEMS), + $(call Image/Build,$(fs)) + ) + + install: install-images + $(call Image/Manifest) + +endef diff --git a/include/kernel-5.15 b/include/kernel-5.15 new file mode 100644 index 0000000..5e3c3bc --- /dev/null +++ b/include/kernel-5.15 @@ -0,0 +1,2 @@ +LINUX_VERSION-5.15 = .189 +LINUX_KERNEL_HASH-5.15.189 = e3d0025b87278e14733cb326700f17c7cceb54d920622b0d5fcd58a88c6850c3 diff --git a/include/kernel-build.mk b/include/kernel-build.mk new file mode 100644 index 0000000..435a2fe --- /dev/null +++ b/include/kernel-build.mk @@ -0,0 +1,187 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +include $(INCLUDE_DIR)/prereq.mk +include $(INCLUDE_DIR)/depends.mk + +ifneq ($(DUMP),1) + all: compile +endif + +KERNEL_FILE_DEPENDS=$(GENERIC_BACKPORT_DIR) $(GENERIC_PATCH_DIR) $(GENERIC_HACK_DIR) $(PATCH_DIR) $(GENERIC_FILES_DIR) $(FILES_DIR) +STAMP_PREPARED=$(LINUX_DIR)/.prepared$(if $(QUILT)$(DUMP),,_$(shell $(call $(if $(CONFIG_AUTOREMOVE),find_md5_reproducible,find_md5),$(KERNEL_FILE_DEPENDS),))) +STAMP_CONFIGURED:=$(LINUX_DIR)/.configured +include $(INCLUDE_DIR)/download.mk +include $(INCLUDE_DIR)/quilt.mk +include $(INCLUDE_DIR)/kernel-defaults.mk + +define Kernel/Prepare + $(call Kernel/Prepare/Default) +endef + +define Kernel/Configure + $(call Kernel/Configure/Default) +endef + +define Kernel/CompileModules + $(call Kernel/CompileModules/Default) +endef + +define Kernel/CompileImage + $(call Kernel/CompileImage/Default) + $(call Kernel/CompileImage/Initramfs) +endef + +define Kernel/Clean + $(call Kernel/Clean/Default) +endef + +define Download/kernel + URL:=$(LINUX_SITE) + FILE:=$(LINUX_SOURCE) + HASH:=$(LINUX_KERNEL_HASH) +endef + +KERNEL_GIT_OPTS:= +ifneq ($(strip $(CONFIG_KERNEL_GIT_LOCAL_REPOSITORY)),"") + KERNEL_GIT_OPTS+=--reference $(CONFIG_KERNEL_GIT_LOCAL_REPOSITORY) +endif + +define Download/git-kernel + URL:=$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)) + PROTO:=git + VERSION:=$(CONFIG_KERNEL_GIT_REF) + FILE:=$(LINUX_SOURCE) + SUBDIR:=linux-$(LINUX_VERSION) + OPTS:=$(KERNEL_GIT_OPTS) +endef + +ifdef CONFIG_COLLECT_KERNEL_DEBUG + define Kernel/CollectDebug + rm -rf $(KERNEL_BUILD_DIR)/debug + mkdir -p $(KERNEL_BUILD_DIR)/debug/modules + $(CP) $(LINUX_DIR)/vmlinux $(KERNEL_BUILD_DIR)/debug/ + -$(CP) \ + $(STAGING_DIR_ROOT)/lib/modules/$(LINUX_VERSION)/* \ + $(KERNEL_BUILD_DIR)/debug/modules/ + $(FIND) $(KERNEL_BUILD_DIR)/debug -type f | $(XARGS) $(KERNEL_CROSS)strip --only-keep-debug + $(TAR) c -C $(KERNEL_BUILD_DIR) debug \ + $(if $(SOURCE_DATE_EPOCH),--mtime="@$(SOURCE_DATE_EPOCH)") \ + | zstd -T0 -f -o $(BIN_DIR)/kernel-debug.tar.zst + endef +endif + +ifeq ($(DUMP)$(filter prereq clean refresh update,$(MAKECMDGOALS)),) + ifneq ($(if $(QUILT),,$(CONFIG_AUTOREBUILD)),) + define Kernel/Autoclean + $(PKG_BUILD_DIR)/.dep_files: $(STAMP_PREPARED) + $(call rdep,$(KERNEL_FILE_DEPENDS),$(STAMP_PREPARED),$(PKG_BUILD_DIR)/.dep_files,-x "*/.dep_*") + endef + endif +endif + +define BuildKernel + $(if $(QUILT),$(Build/Quilt)) + $(if $(LINUX_SITE),$(call Download,kernel)) + $(if $(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),$(call Download,git-kernel)) + + .NOTPARALLEL: + + $(Kernel/Autoclean) + $(STAMP_PREPARED): $(if $(LINUX_SITE),$(DL_DIR)/$(LINUX_SOURCE)) + -rm -rf $(KERNEL_BUILD_DIR) + -mkdir -p $(KERNEL_BUILD_DIR) + $(Kernel/Prepare) + touch $$@ + + $(KERNEL_BUILD_DIR)/symtab.h: FORCE + rm -f $(KERNEL_BUILD_DIR)/symtab.h + touch $(KERNEL_BUILD_DIR)/symtab.h + +$(KERNEL_MAKE) vmlinux + find $(LINUX_DIR) $(STAGING_DIR_ROOT)/lib/modules -name \*.ko | \ + xargs $(TARGET_CROSS)nm | \ + awk '$$$$1 == "U" { print $$$$2 } ' | \ + sort -u > $(KERNEL_BUILD_DIR)/mod_symtab.txt + $(TARGET_CROSS)nm -n $(LINUX_DIR)/vmlinux.o | awk '/^[0-9a-f]+ [rR] __ksymtab_/ {print substr($$$$3,11)}' > $(KERNEL_BUILD_DIR)/kernel_symtab.txt + grep -Ff $(KERNEL_BUILD_DIR)/mod_symtab.txt $(KERNEL_BUILD_DIR)/kernel_symtab.txt > $(KERNEL_BUILD_DIR)/sym_include.txt + grep -Fvf $(KERNEL_BUILD_DIR)/mod_symtab.txt $(KERNEL_BUILD_DIR)/kernel_symtab.txt > $(KERNEL_BUILD_DIR)/sym_exclude.txt + ( \ + echo '#define SYMTAB_KEEP \'; \ + cat $(KERNEL_BUILD_DIR)/sym_include.txt | \ + awk '{print "KEEP(*(___ksymtab+" $$$$1 ")) \\" }'; \ + echo; \ + echo '#define SYMTAB_KEEP_GPL \'; \ + cat $(KERNEL_BUILD_DIR)/sym_include.txt | \ + awk '{print "KEEP(*(___ksymtab_gpl+" $$$$1 ")) \\" }'; \ + echo; \ + echo '#define SYMTAB_DISCARD \'; \ + cat $(KERNEL_BUILD_DIR)/sym_exclude.txt | \ + awk '{print "*(___ksymtab+" $$$$1 ") \\" }'; \ + echo; \ + echo '#define SYMTAB_DISCARD_GPL \'; \ + cat $(KERNEL_BUILD_DIR)/sym_exclude.txt | \ + awk '{print "*(___ksymtab_gpl+" $$$$1 ") \\" }'; \ + echo; \ + ) > $$@ + + $(STAMP_CONFIGURED): $(STAMP_PREPARED) $(LINUX_KCONFIG_LIST) $(TOPDIR)/.config FORCE + $(Kernel/Configure) + touch $$@ + + $(LINUX_DIR)/.modules: export STAGING_PREFIX=$$(STAGING_DIR_HOST) + $(LINUX_DIR)/.modules: export PKG_CONFIG_PATH=$$(STAGING_DIR_HOST)/lib/pkgconfig + $(LINUX_DIR)/.modules: export PKG_CONFIG_LIBDIR=$$(STAGING_DIR_HOST)/lib/pkgconfig + $(LINUX_DIR)/.modules: export FAIL_ON_UNCONFIGURED=1 + $(LINUX_DIR)/.modules: $(STAMP_CONFIGURED) $(LINUX_DIR)/.config FORCE + $(Kernel/CompileModules) + touch $$@ + + $(LINUX_DIR)/.image: export STAGING_PREFIX=$$(STAGING_DIR_HOST) + $(LINUX_DIR)/.image: export PKG_CONFIG_PATH=$$(STAGING_DIR_HOST)/lib/pkgconfig + $(LINUX_DIR)/.image: export PKG_CONFIG_LIBDIR=$$(STAGING_DIR_HOST)/lib/pkgconfig + $(LINUX_DIR)/.image: $(STAMP_CONFIGURED) $(if $(CONFIG_STRIP_KERNEL_EXPORTS),$(KERNEL_BUILD_DIR)/symtab.h) FORCE + $(Kernel/CompileImage) + $(Kernel/CollectDebug) + touch $$@ + + mostlyclean: FORCE + $(Kernel/Clean) + + define BuildKernel + endef + + download: $(if $(LINUX_SITE),$(DL_DIR)/$(LINUX_SOURCE)) + prepare: $(STAMP_PREPARED) + compile: $(LINUX_DIR)/.modules + $(MAKE) -C image compile TARGET_BUILD= + + dtb: $(STAMP_CONFIGURED) + $(_SINGLE)$(KERNEL_MAKE) scripts_dtc + $(MAKE) -C image compile-dtb TARGET_BUILD= + + oldconfig menuconfig nconfig xconfig: $(STAMP_PREPARED) $(STAMP_CHECKED) FORCE + rm -f $(LINUX_DIR)/.config.prev + rm -f $(STAMP_CONFIGURED) + $(LINUX_RECONF_CMD) > $(LINUX_DIR)/.config + $(_SINGLE)$(KERNEL_MAKE) \ + $(if $(findstring Darwin,$(HOST_OS)), \ + HOSTLDLIBS_mconf="-L$(STAGING_DIR_HOST)/lib -lncurses" \ + filechk_conf_cfg=" :" \ + ) \ + YACC=$(STAGING_DIR_HOST)/bin/bison \ + $$@ + $(call LINUX_RECONF_DIFF,$(LINUX_DIR)/.config) > $(LINUX_RECONFIG_TARGET) + + install: $(LINUX_DIR)/.image + +$(MAKE) -C image compile install TARGET_BUILD= + + clean: FORCE + rm -rf $(KERNEL_BUILD_DIR) + + image-prereq: + @+$(NO_TRACE_MAKE) -s -C image prereq TARGET_BUILD= + + prereq: image-prereq + +endef diff --git a/include/kernel-defaults.mk b/include/kernel-defaults.mk new file mode 100644 index 0000000..b17ff7f --- /dev/null +++ b/include/kernel-defaults.mk @@ -0,0 +1,195 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +ifdef CONFIG_STRIP_KERNEL_EXPORTS + KERNEL_MAKEOPTS_IMAGE += \ + EXTRA_LDSFLAGS="-I$(KERNEL_BUILD_DIR) -include symtab.h" +endif + +INITRAMFS_EXTRA_FILES ?= $(GENERIC_PLATFORM_DIR)/image/initramfs-base-files.txt + +ifneq (,$(KERNEL_CC)) + KERNEL_MAKEOPTS += CC="$(KERNEL_CC)" +endif + +export HOST_EXTRACFLAGS=-I$(STAGING_DIR_HOST)/include + +# defined in quilt.mk +Kernel/Patch:=$(Kernel/Patch/Default) + +ifneq (,$(findstring .xz,$(LINUX_SOURCE))) + LINUX_CAT:=xzcat +else + LINUX_CAT:=$(STAGING_DIR_HOST)/bin/libdeflate-gzip -dc +endif + +ifeq ($(strip $(CONFIG_EXTERNAL_KERNEL_TREE)),"") + ifeq ($(strip $(CONFIG_KERNEL_GIT_CLONE_URI)),"") + define Kernel/Prepare/Default + $(LINUX_CAT) $(DL_DIR)/$(LINUX_SOURCE) | $(TAR) -C $(KERNEL_BUILD_DIR) $(TAR_OPTIONS) + $(Kernel/Patch) + $(if $(QUILT),touch $(LINUX_DIR)/.quilt_used) + endef + else + define Kernel/Prepare/Default + $(LINUX_CAT) $(DL_DIR)/$(LINUX_SOURCE) | $(TAR) -C $(KERNEL_BUILD_DIR) $(TAR_OPTIONS) + endef + endif +else + define Kernel/Prepare/Default + mkdir -p $(KERNEL_BUILD_DIR) + if [ -d $(LINUX_DIR) ]; then \ + rmdir $(LINUX_DIR); \ + fi + ln -s $(CONFIG_EXTERNAL_KERNEL_TREE) $(LINUX_DIR) + if [ -d $(LINUX_DIR)/user_headers ]; then \ + rm -rf $(LINUX_DIR)/user_headers; \ + fi + endef +endif + +ifeq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y) + ifeq ($(CONFIG_TARGET_ROOTFS_INITRAMFS_SEPARATE),y) + define Kernel/SetInitramfs/PreConfigure + grep -v -e CONFIG_BLK_DEV_INITRD $(LINUX_DIR)/.config.old > $(LINUX_DIR)/.config + echo 'CONFIG_BLK_DEV_INITRD=y' >> $(LINUX_DIR)/.config + echo 'CONFIG_INITRAMFS_SOURCE=""' >> $(LINUX_DIR)/.config + endef + else + ifeq ($(strip $(CONFIG_EXTERNAL_CPIO)),"") + define Kernel/SetInitramfs/PreConfigure + grep -v -e INITRAMFS -e CONFIG_RD_ -e CONFIG_BLK_DEV_INITRD $(LINUX_DIR)/.config.old > $(LINUX_DIR)/.config + echo 'CONFIG_BLK_DEV_INITRD=y' >> $(LINUX_DIR)/.config + echo 'CONFIG_INITRAMFS_SOURCE="$(strip $(TARGET_DIR) $(INITRAMFS_EXTRA_FILES))"' >> $(LINUX_DIR)/.config + endef + else + define Kernel/SetInitramfs/PreConfigure + grep -v INITRAMFS $(LINUX_DIR)/.config.old > $(LINUX_DIR)/.config + echo 'CONFIG_INITRAMFS_SOURCE="$(call qstrip,$(CONFIG_EXTERNAL_CPIO))"' >> $(LINUX_DIR)/.config + endef + endif +endif + + define Kernel/SetInitramfs + rm -f $(LINUX_DIR)/.config.prev + mv $(LINUX_DIR)/.config $(LINUX_DIR)/.config.old + $(call Kernel/SetInitramfs/PreConfigure) + ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS_SEPARATE),y) + echo 'CONFIG_INITRAMFS_ROOT_UID=$(shell id -u)' >> $(LINUX_DIR)/.config + echo 'CONFIG_INITRAMFS_ROOT_GID=$(shell id -g)' >> $(LINUX_DIR)/.config + echo "$(if $(CONFIG_TARGET_INITRAMFS_FORCE),CONFIG_INITRAMFS_FORCE=y,# CONFIG_INITRAMFS_FORCE is not set)" >> $(LINUX_DIR)/.config + else + echo "# CONFIG_INITRAMFS_FORCE is not set" >> $(LINUX_DIR)/.config + endif + echo "$(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_NONE),CONFIG_INITRAMFS_COMPRESSION_NONE=y,# CONFIG_INITRAMFS_COMPRESSION_NONE is not set)" >> $(LINUX_DIR)/.config + echo -e "$(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_GZIP),CONFIG_INITRAMFS_COMPRESSION_GZIP=y\nCONFIG_RD_GZIP=y,# CONFIG_INITRAMFS_COMPRESSION_GZIP is not set\n# CONFIG_RD_GZIP is not set)" >> $(LINUX_DIR)/.config + echo -e "$(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_BZIP2),CONFIG_INITRAMFS_COMPRESSION_BZIP2=y\nCONFIG_RD_BZIP2=y,# CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set\n# CONFIG_RD_BZIP2 is not set)" >> $(LINUX_DIR)/.config + echo -e "$(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZMA),CONFIG_INITRAMFS_COMPRESSION_LZMA=y\nCONFIG_RD_LZMA=y,# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set\n# CONFIG_RD_LZMA is not set)" >> $(LINUX_DIR)/.config + echo -e "$(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZO),CONFIG_INITRAMFS_COMPRESSION_LZO=y\nCONFIG_RD_LZO=y,# CONFIG_INITRAMFS_COMPRESSION_LZO is not set\n# CONFIG_RD_LZO is not set)" >> $(LINUX_DIR)/.config + echo -e "$(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_XZ),CONFIG_INITRAMFS_COMPRESSION_XZ=y\nCONFIG_RD_XZ=y,# CONFIG_INITRAMFS_COMPRESSION_XZ is not set\n# CONFIG_RD_XZ is not set)" >> $(LINUX_DIR)/.config + echo -e "$(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZ4),CONFIG_INITRAMFS_COMPRESSION_LZ4=y\nCONFIG_RD_LZ4=y,# CONFIG_INITRAMFS_COMPRESSION_LZ4 is not set\n# CONFIG_RD_LZ4 is not set)" >> $(LINUX_DIR)/.config + echo -e "$(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_ZSTD),CONFIG_INITRAMFS_COMPRESSION_ZSTD=y\nCONFIG_RD_ZSTD=y,# CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set\n# CONFIG_RD_ZSTD is not set)" >> $(LINUX_DIR)/.config + endef +else +endif + +define Kernel/SetNoInitramfs + mv $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config.old + grep -v INITRAMFS $(LINUX_DIR)/.config.old > $(LINUX_DIR)/.config.set + echo 'CONFIG_INITRAMFS_SOURCE=""' >> $(LINUX_DIR)/.config.set + echo '# CONFIG_INITRAMFS_FORCE is not set' >> $(LINUX_DIR)/.config.set +endef + +define Kernel/Configure/Default + rm -f $(LINUX_DIR)/localversion + $(LINUX_CONF_CMD) > $(LINUX_DIR)/.config.target +# copy CONFIG_KERNEL_* settings over to .config.target + awk '/^(#[[:space:]]+)?CONFIG_KERNEL/{sub("CONFIG_KERNEL_","CONFIG_");print}' $(TOPDIR)/.config >> $(LINUX_DIR)/.config.target + echo "# CONFIG_KALLSYMS_EXTRA_PASS is not set" >> $(LINUX_DIR)/.config.target + echo "# CONFIG_KALLSYMS_ALL is not set" >> $(LINUX_DIR)/.config.target + echo "CONFIG_KALLSYMS_UNCOMPRESSED=y" >> $(LINUX_DIR)/.config.target + $(SCRIPT_DIR)/package-metadata.pl kconfig $(TMP_DIR)/.packageinfo $(TOPDIR)/.config $(KERNEL_PATCHVER) > $(LINUX_DIR)/.config.override + $(SCRIPT_DIR)/kconfig.pl 'm+' '+' $(LINUX_DIR)/.config.target /dev/null $(LINUX_DIR)/.config.override > $(LINUX_DIR)/.config.set + $(call Kernel/SetNoInitramfs) + rm -rf $(KERNEL_BUILD_DIR)/modules + cmp -s $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config.prev || { \ + cp $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config; \ + cp $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config.prev; \ + } + $(_SINGLE) [ -d $(LINUX_DIR)/user_headers ] || $(KERNEL_MAKE) $(if $(findstring uml,$(BOARD)),ARCH=$(ARCH)) INSTALL_HDR_PATH=$(LINUX_DIR)/user_headers headers_install + grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | $(MKHASH) md5 > $(LINUX_DIR)/.vermagic +endef + +define Kernel/Configure/Initramfs + $(call Kernel/SetInitramfs) +endef + +define Kernel/CompileModules/Default + rm -f $(LINUX_DIR)/vmlinux $(LINUX_DIR)/System.map + +$(KERNEL_MAKE) $(if $(KERNELNAME),$(KERNELNAME),all) modules + # If .config did not change, use the previous timestamp to avoid package rebuilds + cmp -s $(LINUX_DIR)/.config $(LINUX_DIR)/.config.modules.save && \ + mv $(LINUX_DIR)/.config.modules.save $(LINUX_DIR)/.config; \ + $(CP) $(LINUX_DIR)/.config $(LINUX_DIR)/.config.modules.save +endef + +OBJCOPY_STRIP = -R .reginfo -R .notes -R .note -R .comment -R .mdebug -R .note.gnu.build-id + +# AMD64 shares the location with x86 +ifeq ($(LINUX_KARCH),x86_64) +IMAGES_DIR:=../../x86/boot +endif + +define Kernel/CopyImage + cmp -s $(LINUX_DIR)/vmlinux $(KERNEL_BUILD_DIR)/vmlinux$(1).debug || { \ + $(KERNEL_CROSS)objcopy -O binary $(OBJCOPY_STRIP) -S $(LINUX_DIR)/vmlinux $(LINUX_KERNEL)$(1); \ + $(KERNEL_CROSS)objcopy $(OBJCOPY_STRIP) -S $(LINUX_DIR)/vmlinux $(KERNEL_BUILD_DIR)/vmlinux$(1).elf; \ + $(CP) $(LINUX_DIR)/vmlinux $(KERNEL_BUILD_DIR)/vmlinux$(1).debug; \ + $(foreach k, \ + $(if $(KERNEL_IMAGES),$(KERNEL_IMAGES),$(filter-out vmlinux dtbs,$(KERNELNAME))), \ + $(CP) $(LINUX_DIR)/arch/$(LINUX_KARCH)/boot/$(IMAGES_DIR)/$(k) $(KERNEL_BUILD_DIR)/$(k)$(1); \ + ) \ + } +endef + +define Kernel/CompileImage/Default + rm -f $(TARGET_DIR)/init + +$(KERNEL_MAKE) $(KERNEL_MAKEOPTS_IMAGE) $(if $(KERNELNAME),$(KERNELNAME),all) + $(call Kernel/CopyImage) +endef + +ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),) +define Kernel/CompileImage/Initramfs + $(call Kernel/Configure/Initramfs) + $(CP) $(GENERIC_PLATFORM_DIR)/other-files/init $(TARGET_DIR)/init + $(if $(SOURCE_DATE_EPOCH),touch -hcd "@$(SOURCE_DATE_EPOCH)" $(TARGET_DIR) $(TARGET_DIR)/init) + rm -rf $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)/usr/initramfs_data.cpio* +ifeq ($(CONFIG_TARGET_ROOTFS_INITRAMFS_SEPARATE),y) +ifneq ($(call qstrip,$(CONFIG_EXTERNAL_CPIO)),) + $(CP) $(CONFIG_EXTERNAL_CPIO) $(KERNEL_BUILD_DIR)/initrd.cpio +else + ( cd $(TARGET_DIR); find . | LC_ALL=C sort | $(STAGING_DIR_HOST)/bin/cpio --reproducible -o -H newc -R 0:0 > $(KERNEL_BUILD_DIR)/initrd.cpio ) +endif + $(if $(SOURCE_DATE_EPOCH),touch -hcd "@$(SOURCE_DATE_EPOCH)" $(KERNEL_BUILD_DIR)/initrd.cpio) + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_BZIP2),$(STAGING_DIR_HOST)/bin/bzip2 -9 -c < $(KERNEL_BUILD_DIR)/initrd.cpio > $(KERNEL_BUILD_DIR)/initrd.cpio.bzip2) + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_GZIP),$(STAGING_DIR_HOST)/bin/libdeflate-gzip -n -f -S .gzip -12 $(KERNEL_BUILD_DIR)/initrd.cpio) + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZ4),$(STAGING_DIR_HOST)/bin/lz4c -l -c1 -fz --favor-decSpeed $(KERNEL_BUILD_DIR)/initrd.cpio) + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZMA),$(STAGING_DIR_HOST)/bin/lzma e -lc1 -lp2 -pb2 $(KERNEL_BUILD_DIR)/initrd.cpio $(KERNEL_BUILD_DIR)/initrd.cpio.lzma) + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_LZO),$(STAGING_DIR_HOST)/bin/lzop -9 -f $(KERNEL_BUILD_DIR)/initrd.cpio) + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_XZ),$(STAGING_DIR_HOST)/bin/xz -T$(if $(filter 1,$(NPROC)),2,0) -9 -fz --check=crc32 $(KERNEL_BUILD_DIR)/initrd.cpio) + $(if $(CONFIG_TARGET_INITRAMFS_COMPRESSION_ZSTD),$(STAGING_DIR_HOST)/bin/zstd -T0 -f -o $(KERNEL_BUILD_DIR)/initrd.cpio.zstd $(KERNEL_BUILD_DIR)/initrd.cpio) +endif + +$(KERNEL_MAKE) $(KERNEL_MAKEOPTS_IMAGE) $(if $(KERNELNAME),$(KERNELNAME),all) + $(call Kernel/CopyImage,-initramfs) +endef +else +define Kernel/CompileImage/Initramfs +endef +endif + +define Kernel/Clean/Default + rm -f $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)/.configured + rm -f $(LINUX_KERNEL) + $(_SINGLE)$(MAKE) -C $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION) clean +endef diff --git a/include/kernel-version.mk b/include/kernel-version.mk new file mode 100644 index 0000000..958ed9b --- /dev/null +++ b/include/kernel-version.mk @@ -0,0 +1,51 @@ + +# Use the default kernel version if the Makefile doesn't override it +LINUX_RELEASE?=1 + +ifdef CONFIG_TESTING_KERNEL + KERNEL_PATCHVER:=$(KERNEL_TESTING_PATCHVER) +endif + +KERNEL_DETAILS_FILE=$(INCLUDE_DIR)/kernel-$(KERNEL_PATCHVER) +ifeq ($(wildcard $(KERNEL_DETAILS_FILE)),) + $(error Missing kernel version/hash file for $(KERNEL_PATCHVER). Please create $(KERNEL_DETAILS_FILE)) +endif + +include $(KERNEL_DETAILS_FILE) + +ifdef KERNEL_TESTING_PATCHVER + KERNEL_TESTING_DETAILS_FILE=$(INCLUDE_DIR)/kernel-$(KERNEL_TESTING_PATCHVER) + ifeq ($(wildcard $(KERNEL_TESTING_DETAILS_FILE)),) + $(error Missing kernel version/hash file for $(KERNEL_TESTING_PATCHVER). Please create $(KERNEL_TESTING_DETAILS_FILE)) + endif + + include $(KERNEL_TESTING_DETAILS_FILE) +endif + +remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) +sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1))))))) + +ifneq ($(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),) + LINUX_VERSION:=$(call sanitize_uri,$(call remove_uri_prefix,$(CONFIG_KERNEL_GIT_CLONE_URI))) + ifeq ($(call qstrip,$(CONFIG_KERNEL_GIT_REF)),) + CONFIG_KERNEL_GIT_REF:=HEAD + endif + LINUX_VERSION:=$(LINUX_VERSION)-$(call sanitize_uri,$(CONFIG_KERNEL_GIT_REF)) +else +ifdef KERNEL_PATCHVER + LINUX_VERSION:=$(KERNEL_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_PATCHVER))) +endif +ifdef KERNEL_TESTING_PATCHVER + LINUX_TESTING_VERSION:=$(KERNEL_TESTING_PATCHVER)$(strip $(LINUX_VERSION-$(KERNEL_TESTING_PATCHVER))) +endif +endif + +split_version=$(subst ., ,$(1)) +merge_version=$(subst $(space),.,$(1)) +KERNEL_BASE=$(firstword $(subst -, ,$(LINUX_VERSION))) +KERNEL=$(call merge_version,$(wordlist 1,2,$(call split_version,$(KERNEL_BASE)))) +KERNEL_PATCHVER ?= $(KERNEL) + +# disable the md5sum check for unknown kernel versions +LINUX_KERNEL_HASH:=$(LINUX_KERNEL_HASH-$(strip $(LINUX_VERSION))) +LINUX_KERNEL_HASH?=x diff --git a/include/kernel.mk b/include/kernel.mk new file mode 100644 index 0000000..3012eb8 --- /dev/null +++ b/include/kernel.mk @@ -0,0 +1,303 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +ifneq ($(filter check,$(MAKECMDGOALS)),) +CHECK:=1 +DUMP:=1 +endif + +ifneq ($(SOURCE_DATE_EPOCH),) + ifndef DUMP + KBUILD_BUILD_TIMESTAMP:=$(shell perl -e 'print scalar gmtime($(SOURCE_DATE_EPOCH))') + endif +endif + +ifeq ($(__target_inc),) + ifndef CHECK + include $(INCLUDE_DIR)/target.mk + endif +endif + +ifeq ($(DUMP),1) + KERNEL?= + BOARD?= + LINUX_VERSION?= + LINUX_VERMAGIC?= +else + ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) + export GCC_HONOUR_COPTS=s + endif + + LINUX_KMOD_SUFFIX=ko + + ifneq (,$(findstring uml,$(BOARD))) + KERNEL_CC?=$(HOSTCC) + KERNEL_CROSS?= + else + KERNEL_CC?=$(TARGET_CC) + KERNEL_CROSS?=$(TARGET_CROSS) + endif + + ifeq ($(TARGET_BUILD),1) + PATCH_DIR ?= $(CURDIR)/patches$(if $(wildcard ./patches-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER)) + FILES_DIR ?= $(foreach dir,$(wildcard $(CURDIR)/files $(CURDIR)/files-$(KERNEL_PATCHVER)),"$(dir)") + endif + KERNEL_BUILD_DIR ?= $(BUILD_DIR)/linux-$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET)) + LINUX_DIR ?= $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION) + LINUX_UAPI_DIR=uapi/ + LINUX_VERMAGIC:=$(strip $(shell cat $(LINUX_DIR)/.vermagic 2>/dev/null)) + LINUX_VERMAGIC:=$(if $(LINUX_VERMAGIC),$(LINUX_VERMAGIC),unknown) + + LINUX_UNAME_VERSION:=$(KERNEL_BASE) + ifneq ($(findstring -rc,$(LINUX_VERSION)),) + LINUX_UNAME_VERSION:=$(LINUX_UNAME_VERSION)-$(strip $(lastword $(subst -, ,$(LINUX_VERSION)))) + endif + + LINUX_KERNEL:=$(KERNEL_BUILD_DIR)/vmlinux + + ifneq (,$(findstring -rc,$(LINUX_VERSION))) + LINUX_SOURCE:=linux-$(LINUX_VERSION).tar.gz + else + LINUX_SOURCE:=linux-$(LINUX_VERSION).tar.xz + endif + + ifneq (,$(findstring -rc,$(LINUX_VERSION))) + LINUX_SITE:=https://git.kernel.org/torvalds/t + else ifeq ($(call qstrip,$(CONFIG_EXTERNAL_KERNEL_TREE))$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),) + LINUX_SITE:=@KERNEL/linux/kernel/v$(word 1,$(subst ., ,$(KERNEL_BASE))).x + else + LINUX_UNAME_VERSION:=$(strip $(shell cat $(LINUX_DIR)/include/config/kernel.release 2>/dev/null)) + endif + + MODULES_SUBDIR:=lib/modules/$(LINUX_UNAME_VERSION) + TARGET_MODULES_DIR:=$(LINUX_TARGET_DIR)/$(MODULES_SUBDIR) + + ifneq ($(TARGET_BUILD),1) + PKG_BUILD_DIR ?= $(KERNEL_BUILD_DIR)/$(if $(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)$(PKG_NAME)$(if $(PKG_VERSION),-$(PKG_VERSION)) + endif +endif + +ifneq (,$(findstring uml,$(BOARD))) + LINUX_KARCH=um +else ifneq (,$(findstring $(ARCH) , aarch64 aarch64_be )) + LINUX_KARCH := arm64 +else ifneq (,$(findstring $(ARCH) , arceb )) + LINUX_KARCH := arc +else ifneq (,$(findstring $(ARCH) , armeb )) + LINUX_KARCH := arm +else ifneq (,$(findstring $(ARCH) , mipsel mips64 mips64el )) + LINUX_KARCH := mips +else ifneq (,$(findstring $(ARCH) , powerpc64 )) + LINUX_KARCH := powerpc +else ifneq (,$(findstring $(ARCH) , riscv64 )) + LINUX_KARCH := riscv +else ifneq (,$(findstring $(ARCH) , sh2 sh3 sh4 )) + LINUX_KARCH := sh +else ifneq (,$(findstring $(ARCH) , i386 x86_64 )) + LINUX_KARCH := x86 +else + LINUX_KARCH := $(ARCH) +endif + +KERNEL_MAKE = $(MAKE) $(KERNEL_MAKEOPTS) + +KERNEL_MAKE_FLAGS = \ + KCFLAGS="$(call iremap,$(BUILD_DIR),$(notdir $(BUILD_DIR))) $(filter-out -fno-plt,$(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION))) $(call qstrip,$(CONFIG_KERNEL_CFLAGS))" \ + HOSTCFLAGS="$(HOST_CFLAGS) -Wall -Wmissing-prototypes -Wstrict-prototypes" \ + CROSS_COMPILE="$(KERNEL_CROSS)" \ + ARCH="$(LINUX_KARCH)" \ + KBUILD_HAVE_NLS=no \ + KBUILD_BUILD_USER="$(call qstrip,$(CONFIG_KERNEL_BUILD_USER))" \ + KBUILD_BUILD_HOST="$(call qstrip,$(CONFIG_KERNEL_BUILD_DOMAIN))" \ + KBUILD_BUILD_TIMESTAMP="$(KBUILD_BUILD_TIMESTAMP)" \ + KBUILD_BUILD_VERSION="0" \ + KBUILD_HOSTLDFLAGS="-L$(STAGING_DIR_HOST)/lib" \ + CONFIG_SHELL="$(BASH)" \ + $(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') \ + $(if $(PKG_BUILD_ID),LDFLAGS_MODULE=--build-id=0x$(PKG_BUILD_ID)) \ + cmd_syscalls= \ + $(if $(__package_mk),KBUILD_EXTRA_SYMBOLS="$(wildcard $(PKG_SYMVERS_DIR)/*.symvers)") + +KERNEL_NOSTDINC_FLAGS = \ + -nostdinc $(if $(DUMP),, -isystem $(shell $(TARGET_CC) -print-file-name=include)) + +ifeq ($(call qstrip,$(CONFIG_EXTERNAL_KERNEL_TREE))$(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),) + KERNEL_MAKE_FLAGS += \ + KERNELRELEASE=$(LINUX_VERSION) +endif + +ifneq ($(HOST_OS),Linux) + KERNEL_MAKE_FLAGS += CONFIG_STACK_VALIDATION= + export SKIP_STACK_VALIDATION:=1 +endif + +KERNEL_MAKEOPTS = -C $(LINUX_DIR) $(KERNEL_MAKE_FLAGS) + +ifdef CONFIG_USE_SPARSE + KERNEL_MAKEOPTS += C=1 CHECK=$(STAGING_DIR_HOST)/bin/sparse +endif + +PKG_EXTMOD_SUBDIRS ?= . + +PKG_SYMVERS_DIR = $(KERNEL_BUILD_DIR)/symvers + +define collect_module_symvers + for subdir in $(PKG_EXTMOD_SUBDIRS); do \ + realdir=$$$$(readlink -f $(PKG_BUILD_DIR)); \ + grep -F $(PKG_BUILD_DIR) $(PKG_BUILD_DIR)/$$$$subdir/Module.symvers >> $(PKG_BUILD_DIR)/Module.symvers.tmp; \ + [ "$(PKG_BUILD_DIR)" = "$$$$realdir" ] || \ + grep -F $$$$realdir $(PKG_BUILD_DIR)/$$$$subdir/Module.symvers >> $(PKG_BUILD_DIR)/Module.symvers.tmp; \ + done; \ + sort -u $(PKG_BUILD_DIR)/Module.symvers.tmp > $(PKG_BUILD_DIR)/Module.symvers; \ + mkdir -p $(PKG_SYMVERS_DIR); \ + mv $(PKG_BUILD_DIR)/Module.symvers $(PKG_SYMVERS_DIR)/$(PKG_NAME).symvers +endef + +define KernelPackage/hooks + ifneq ($(PKG_NAME),kernel) + Hooks/Compile/Post += collect_module_symvers + endif + define KernelPackage/hooks + endef +endef + +define KernelPackage/Defaults + FILES:= + AUTOLOAD:= + MODPARAMS:= + PKGFLAGS+=nonshared +endef + +# 1: name +# 2: install prefix +# 3: module priority prefix +# 4: required for boot +# 5: module list +define ModuleAutoLoad + $(if $(5), \ + mkdir -p $(2)/etc/modules.d; \ + ($(foreach mod,$(5), \ + echo "$(mod)$(if $(MODPARAMS.$(mod)), $(MODPARAMS.$(mod)),$(if $(MODPARAMS), $(MODPARAMS)))"; )) > $(2)/etc/modules.d/$(3)$(1); \ + $(if $(4), \ + mkdir -p $(2)/etc/modules-boot.d; \ + ln -sf ../modules.d/$(3)$(1) $(2)/etc/modules-boot.d/;)) +endef + +ifeq ($(DUMP)$(TARGET_BUILD),) + -include $(LINUX_DIR)/.config +endif + +define KernelPackage/depends + $(STAMP_BUILT): $(LINUX_DIR)/.config + define KernelPackage/depends + endef +endef + +define KernelPackage + NAME:=$(1) + $(eval $(call Package/Default)) + $(eval $(call KernelPackage/Defaults)) + $(eval $(call KernelPackage/$(1))) + $(eval $(call KernelPackage/$(1)/$(BOARD))) + $(eval $(call KernelPackage/$(1)/$(BOARD)/$(if $(SUBTARGET),$(SUBTARGET),generic))) + + define Package/kmod-$(1) + TITLE:=$(TITLE) + SECTION:=kernel + CATEGORY:=Kernel modules + DESCRIPTION:=$(DESCRIPTION) + EXTRA_DEPENDS:=kernel (=$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC)) + VERSION:=$(LINUX_VERSION)$(if $(PKG_VERSION),+$(PKG_VERSION))-$(if $(PKG_RELEASE),$(PKG_RELEASE),$(LINUX_RELEASE)) + PKGFLAGS:=$(PKGFLAGS) + $(call KernelPackage/$(1)) + $(call KernelPackage/$(1)/$(BOARD)) + $(call KernelPackage/$(1)/$(BOARD)/$(if $(SUBTARGET),$(SUBTARGET),generic)) + endef + + ifdef KernelPackage/$(1)/conffiles + define Package/kmod-$(1)/conffiles +$(call KernelPackage/$(1)/conffiles) + endef + endif + + ifdef KernelPackage/$(1)/description + define Package/kmod-$(1)/description +$(call KernelPackage/$(1)/description) + endef + endif + + ifdef KernelPackage/$(1)/config + define Package/kmod-$(1)/config +$(call KernelPackage/$(1)/config) + endef + endif + + $(call KernelPackage/depends) + $(call KernelPackage/hooks) + + ifneq ($(if $(filter-out %=y %=n %=m,$(KCONFIG)),$(filter m y,$(foreach c,$(call version_filter,$(filter-out %=y %=n %=m,$(KCONFIG))),$($(c)))),.),) + define Package/kmod-$(1)/install + @for mod in $$(call version_filter,$$(FILES)); do \ + if grep -q "$$$$$$$${mod##$(LINUX_DIR)/}" "$(LINUX_DIR)/modules.builtin"; then \ + echo "NOTICE: module '$$$$$$$$mod' is built-in."; \ + elif [ -e $$$$$$$$mod ]; then \ + mkdir -p $$(1)/$(MODULES_SUBDIR) ; \ + $(CP) -L $$$$$$$$mod $$(1)/$(MODULES_SUBDIR)/ ; \ + else \ + echo "ERROR: module '$$$$$$$$mod' is missing." >&2; \ + exit 1; \ + fi; \ + done; + $(call ModuleAutoLoad,$(1),$$(1),$(filter-out 0-,$(word 1,$(AUTOLOAD))-),$(filter-out 0,$(word 2,$(AUTOLOAD))),$(sort $(wordlist 3,99,$(AUTOLOAD)))) + $(call KernelPackage/$(1)/install,$$(1)) + endef + $(if $(CONFIG_PACKAGE_kmod-$(1)), + else + compile: $(1)-disabled + $(1)-disabled: + @echo "WARNING: kmod-$(1) is not available in the kernel config - generating empty package" >&2 + + define Package/kmod-$(1)/install + true + endef + ) + endif + $$(eval $$(call BuildPackage,kmod-$(1))) + + $$(IPKG_kmod-$(1)): $$(wildcard $$(call version_filter,$$(FILES))) + +endef + +version_filter=$(if $(findstring @,$(1)),$(shell $(SCRIPT_DIR)/package-metadata.pl version_filter $(KERNEL_PATCHVER) $(1)),$(1)) + +# 1: priority (optional) +# 2: module list +# 3: boot flag +define AutoLoad + $(if $(1),$(1),0) $(if $(3),1,0) $(call version_filter,$(2)) +endef + +# 1: module list +# 2: boot flag +define AutoProbe + $(call AutoLoad,,$(1),$(2)) +endef + +version_field=$(if $(word $(1),$(2)),$(word $(1),$(2)),0) +kernel_version_merge=$$(( ($(call version_field,1,$(1)) << 24) + ($(call version_field,2,$(1)) << 16) + ($(call version_field,3,$(1)) << 8) + $(call version_field,4,$(1)) )) + +ifdef DUMP + kernel_version_cmp= +else + kernel_version_cmp=$(shell [ $(call kernel_version_merge,$(call split_version,$(2))) $(1) $(call kernel_version_merge,$(call split_version,$(3))) ] && echo 1 ) +endif + +CompareKernelPatchVer=$(if $(call kernel_version_cmp,-$(2),$(1),$(3)),1,0) + +kernel_patchver_gt=$(call kernel_version_cmp,-gt,$(KERNEL_PATCHVER),$(1)) +kernel_patchver_ge=$(call kernel_version_cmp,-ge,$(KERNEL_PATCHVER),$(1)) +kernel_patchver_eq=$(call kernel_version_cmp,-eq,$(KERNEL_PATCHVER),$(1)) +kernel_patchver_le=$(call kernel_version_cmp,-le,$(KERNEL_PATCHVER),$(1)) +kernel_patchver_lt=$(call kernel_version_cmp,-lt,$(KERNEL_PATCHVER),$(1)) + diff --git a/include/logo.png b/include/logo.png new file mode 100644 index 0000000..bb208dd Binary files /dev/null and b/include/logo.png differ diff --git a/include/logo.svg b/include/logo.svg new file mode 100644 index 0000000..ff4b8ad --- /dev/null +++ b/include/logo.svg @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/include/meson.mk b/include/meson.mk new file mode 100644 index 0000000..7d67dcf --- /dev/null +++ b/include/meson.mk @@ -0,0 +1,146 @@ +# To build your package using meson: +# +# include $(INCLUDE_DIR)/meson.mk +# MESON_ARGS+=-Dfoo -Dbar=baz +# +# To pass additional environment variables to meson: +# +# MESON_VARS+=FOO=bar +# +# Default configure/compile/install targets are provided, but can be +# overwritten if required: +# +# define Build/Configure +# $(call Build/Configure/Meson) +# ... +# endef +# +# same for Build/Compile and Build/Install +# +# Host packages are built in the same fashion, just use these vars instead: +# +# MESON_HOST_ARGS+=-Dfoo -Dbar=baz +# MESON_HOST_VARS+=FOO=bar + +MESON_DIR:=$(STAGING_DIR_HOST)/lib/meson + +MESON_HOST_BUILD_DIR:=$(HOST_BUILD_DIR)/openwrt-build +MESON_HOST_VARS:= +MESON_HOST_ARGS:= + +MESON_BUILD_DIR:=$(PKG_BUILD_DIR)/openwrt-build +MESON_VARS:= +MESON_ARGS:= + +ifneq ($(findstring i386,$(CONFIG_ARCH)),) +MESON_ARCH:="x86" +else ifneq ($(findstring powerpc64,$(CONFIG_ARCH)),) +MESON_ARCH:="ppc64" +else ifneq ($(findstring powerpc,$(CONFIG_ARCH)),) +MESON_ARCH:="ppc" +else ifneq ($(findstring mips64el,$(CONFIG_ARCH)),) +MESON_ARCH:="mips64" +else ifneq ($(findstring mipsel,$(CONFIG_ARCH)),) +MESON_ARCH:="mips" +else ifneq ($(findstring armeb,$(CONFIG_ARCH)),) +MESON_ARCH:="arm" +else +MESON_ARCH:=$(CONFIG_ARCH) +endif + +# this is undefined for just x64_64 +ifeq ($(origin CPU_TYPE),undefined) +MESON_CPU:="generic" +else +MESON_CPU:="$(CPU_TYPE)$(if $(CPU_SUBTYPE),+$(CPU_SUBTYPE))" +endif + +define Meson + $(2) $(STAGING_DIR_HOST)/bin/$(PYTHON) $(STAGING_DIR_HOST)/bin/meson.py $(1) +endef + +define Meson/CreateNativeFile + $(STAGING_DIR_HOST)/bin/sed \ + -e "s|@CC@|$(foreach BIN,$(HOSTCC),'$(BIN)',)|" \ + -e "s|@CXX@|$(foreach BIN,$(HOSTCXX),'$(BIN)',)|" \ + -e "s|@PKGCONFIG@|$(PKG_CONFIG)|" \ + -e "s|@CMAKE@|$(STAGING_DIR_HOST)/bin/cmake|" \ + -e "s|@PYTHON@|$(STAGING_DIR_HOST)/bin/python3|" \ + -e "s|@CFLAGS@|$(foreach FLAG,$(HOST_CFLAGS) $(HOST_CPPFLAGS),'$(FLAG)',)|" \ + -e "s|@CXXFLAGS@|$(foreach FLAG,$(HOST_CXXFLAGS) $(HOST_CPPFLAGS),'$(FLAG)',)|" \ + -e "s|@LDFLAGS@|$(foreach FLAG,$(HOST_LDFLAGS),'$(FLAG)',)|" \ + -e "s|@PREFIX@|$(HOST_BUILD_PREFIX)|" \ + < $(MESON_DIR)/openwrt-native.txt.in \ + > $(1) +endef + +define Meson/CreateCrossFile + $(STAGING_DIR_HOST)/bin/sed \ + -e "s|@CC@|$(foreach BIN,$(TARGET_CC),'$(BIN)',)|" \ + -e "s|@CXX@|$(foreach BIN,$(TARGET_CXX),'$(BIN)',)|" \ + -e "s|@AR@|$(TARGET_AR)|" \ + -e "s|@STRIP@|$(TARGET_CROSS)strip|" \ + -e "s|@NM@|$(TARGET_NM)|" \ + -e "s|@PKGCONFIG@|$(PKG_CONFIG)|" \ + -e "s|@CMAKE@|$(STAGING_DIR_HOST)/bin/cmake|" \ + -e "s|@PYTHON@|$(STAGING_DIR_HOST)/bin/python3|" \ + -e "s|@CFLAGS@|$(foreach FLAG,$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS),'$(FLAG)',)|" \ + -e "s|@CXXFLAGS@|$(foreach FLAG,$(TARGET_CXXFLAGS) $(EXTRA_CXXFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS),'$(FLAG)',)|" \ + -e "s|@LDFLAGS@|$(foreach FLAG,$(TARGET_LDFLAGS) $(EXTRA_LDFLAGS),'$(FLAG)',)|" \ + -e "s|@ARCH@|$(MESON_ARCH)|" \ + -e "s|@CPU@|$(MESON_CPU)|" \ + -e "s|@ENDIAN@|$(if $(CONFIG_BIG_ENDIAN),big,little)|" \ + < $(MESON_DIR)/openwrt-cross.txt.in \ + > $(1) +endef + +define Host/Configure/Meson + $(call Meson/CreateNativeFile,$(HOST_BUILD_DIR)/openwrt-native.txt) + $(call Meson, \ + --native-file $(HOST_BUILD_DIR)/openwrt-native.txt \ + $(MESON_HOST_ARGS) \ + $(MESON_HOST_BUILD_DIR) \ + $(MESON_HOST_BUILD_DIR)/.., \ + $(MESON_HOST_VARS)) +endef + +define Host/Compile/Meson + +$(NINJA) -C $(MESON_HOST_BUILD_DIR) $(1) +endef + +define Host/Install/Meson + +$(NINJA) -C $(MESON_HOST_BUILD_DIR) install +endef + +define Host/Uninstall/Meson + +$(NINJA) -C $(MESON_HOST_BUILD_DIR) uninstall || true +endef + +define Build/Configure/Meson + $(call Meson/CreateNativeFile,$(PKG_BUILD_DIR)/openwrt-native.txt) + $(call Meson/CreateCrossFile,$(PKG_BUILD_DIR)/openwrt-cross.txt) + $(call Meson, \ + --buildtype plain \ + --native-file $(PKG_BUILD_DIR)/openwrt-native.txt \ + --cross-file $(PKG_BUILD_DIR)/openwrt-cross.txt \ + $(MESON_ARGS) \ + $(MESON_BUILD_DIR) \ + $(MESON_BUILD_DIR)/.., \ + $(MESON_VARS)) +endef + +define Build/Compile/Meson + +$(NINJA) -C $(MESON_BUILD_DIR) $(1) +endef + +define Build/Install/Meson + +DESTDIR="$(PKG_INSTALL_DIR)" $(NINJA) -C $(MESON_BUILD_DIR) install +endef + +Host/Configure=$(call Host/Configure/Meson) +Host/Compile=$(call Host/Compile/Meson) +Host/Install=$(call Host/Install/Meson) +Host/Uninstall=$(call Host/Uninstall/Meson) +Build/Configure=$(call Build/Configure/Meson) +Build/Compile=$(call Build/Compile/Meson) +Build/Install=$(call Build/Install/Meson) diff --git a/include/netfilter.mk b/include/netfilter.mk new file mode 100644 index 0000000..7d1f038 --- /dev/null +++ b/include/netfilter.mk @@ -0,0 +1,391 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +ifneq ($(__inc_netfilter),1) +__inc_netfilter:=1 + +ifeq ($(NF_KMOD),1) +P_V4:=ipv4/netfilter/ +P_V6:=ipv6/netfilter/ +P_XT:=netfilter/ +P_EBT:=bridge/netfilter/ +endif + +# 1: variable +# 2: kconfig symbols +# 3: file list +# 4: version dependency +define nf_add + $(if $(4),ifeq ($$(strip $$(call CompareKernelPatchVer,$$(KERNEL_PATCHVER),$(firstword $(4)),$(lastword $(4)))),1)) + $(1)-$$($(2)) += $(3) + $(if $(4),endif) + KCONFIG_$(1) = $(filter-out $(2),$(KCONFIG_$(1))) $(2) +endef + + +# core + +# kernel only +$(eval $(if $(NF_KMOD),$(call nf_add,NF_REJECT,CONFIG_NF_REJECT_IPV4, $(P_V4)nf_reject_ipv4),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NF_IPT,CONFIG_IP_NF_IPTABLES, $(P_V4)ip_tables),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NF_IPT,CONFIG_NETFILTER_XTABLES, $(P_XT)x_tables),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,IPT_CORE,CONFIG_NETFILTER_XTABLES, $(P_XT)xt_tcpudp),)) +$(eval $(if $(NF_KMOD),$(call nf_add,IPT_CORE,CONFIG_IP_NF_FILTER, $(P_V4)iptable_filter),)) +$(eval $(if $(NF_KMOD),$(call nf_add,IPT_CORE,CONFIG_IP_NF_MANGLE, $(P_V4)iptable_mangle),)) + +# userland only +$(eval $(if $(NF_KMOD),,$(call nf_add,IPT_CORE,CONFIG_IP_NF_IPTABLES, xt_standard ipt_icmp xt_tcp xt_udp xt_comment xt_set xt_SET))) + +$(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_MATCH_LIMIT, $(P_XT)xt_limit)) +$(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_MATCH_MAC, $(P_XT)xt_mac)) +$(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_MATCH_MULTIPORT, $(P_XT)xt_multiport)) +$(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_MATCH_COMMENT, $(P_XT)xt_comment)) + +#cluster +$(eval $(call nf_add,IPT_CLUSTER,CONFIG_NETFILTER_XT_MATCH_CLUSTER, $(P_XT)xt_cluster)) + +$(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_TARGET_LOG, $(P_XT)xt_LOG)) +$(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_TARGET_TCPMSS, $(P_XT)xt_TCPMSS)) +$(eval $(call nf_add,IPT_CORE,CONFIG_IP_NF_TARGET_REJECT, $(P_V4)ipt_REJECT)) +$(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_MATCH_TIME, $(P_XT)xt_time)) +$(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_MARK, $(P_XT)xt_mark)) + +# kernel has xt_MARK.ko merged into xt_mark.ko, userspace is still separate +# userland: xt_MARK.so +$(eval $(if $(NF_KMOD),,$(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_MARK, $(P_XT)xt_MARK))) + + +# conntrack + +# kernel only +$(eval $(if $(NF_KMOD),$(call nf_add,NF_CONNTRACK,CONFIG_NF_CONNTRACK, $(P_XT)nf_conntrack),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NF_CONNTRACK,CONFIG_NF_DEFRAG_IPV4, $(P_V4)nf_defrag_ipv4),)) + +$(eval $(call nf_add,IPT_CONNTRACK,CONFIG_NETFILTER_XT_MATCH_STATE, $(P_XT)xt_state)) +$(eval $(call nf_add,IPT_CONNTRACK,CONFIG_NETFILTER_XT_TARGET_CT, $(P_XT)xt_CT)) +$(eval $(call nf_add,IPT_CONNTRACK,CONFIG_NETFILTER_XT_MATCH_CONNTRACK, $(P_XT)xt_conntrack)) + + +# conntrack-extra + +$(eval $(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_XT_MATCH_CONNBYTES, $(P_XT)xt_connbytes)) +$(eval $(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_XT_MATCH_CONNLIMIT, $(P_XT)xt_connlimit)) +$(eval $(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_XT_CONNMARK, $(P_XT)xt_connmark)) +$(eval $(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_XT_MATCH_HELPER, $(P_XT)xt_helper)) +$(eval $(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_XT_MATCH_RECENT, $(P_XT)xt_recent)) + +$(eval $(if $(NF_KMOD),,$(call nf_add,IPT_CONNTRACK_EXTRA,CONFIG_NETFILTER_XT_CONNMARK, $(P_XT)xt_CONNMARK))) + +#conntrack-label + +$(eval $(call nf_add,IPT_CONNTRACK_LABEL,CONFIG_NETFILTER_XT_MATCH_CONNLABEL, $(P_XT)xt_connlabel)) + +# extra + +$(eval $(call nf_add,IPT_EXTRA,CONFIG_NETFILTER_XT_MATCH_ADDRTYPE, $(if $(NF_KMOD),$(P_XT)xt_addrtype,$(P_XT)ipt_addrtype))) +$(eval $(call nf_add,IPT_EXTRA,CONFIG_NETFILTER_XT_MATCH_OWNER, $(P_XT)xt_owner)) +$(eval $(call nf_add,IPT_EXTRA,CONFIG_NETFILTER_XT_MATCH_PKTTYPE, $(P_XT)xt_pkttype)) +$(eval $(call nf_add,IPT_EXTRA,CONFIG_NETFILTER_XT_MATCH_QUOTA, $(P_XT)xt_quota)) +$(eval $(call nf_add,IPT_EXTRA,CONFIG_NETFILTER_XT_MATCH_CGROUP, $(P_XT)xt_cgroup)) + +#$(eval $(call nf_add,IPT_EXTRA,CONFIG_IP_NF_TARGET_ROUTE, $(P_V4)ipt_ROUTE)) + +# physdev + +$(eval $(call nf_add,IPT_PHYSDEV,CONFIG_NETFILTER_XT_MATCH_PHYSDEV, $(P_XT)xt_physdev)) + +# filter + +$(eval $(call nf_add,IPT_FILTER,CONFIG_NETFILTER_XT_MATCH_STRING, $(P_XT)xt_string)) +$(eval $(call nf_add,IPT_FILTER,CONFIG_NETFILTER_XT_MATCH_BPF, $(P_XT)xt_bpf)) + + +# ipopt + +$(eval $(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_MATCH_DSCP, $(P_XT)xt_dscp)) +$(eval $(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_TARGET_DSCP, $(P_XT)xt_DSCP)) +$(eval $(call nf_add,IPT_HASHLIMIT,CONFIG_NETFILTER_XT_MATCH_HASHLIMIT, $(P_XT)xt_hashlimit)) +$(eval $(call nf_add,IPT_RPFILTER,CONFIG_IP_NF_MATCH_RPFILTER, $(P_V4)ipt_rpfilter)) +$(eval $(call nf_add,IPT_RPFILTER,CONFIG_IP6_NF_MATCH_RPFILTER, $(P_V6)ip6t_rpfilter)) +$(eval $(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_MATCH_LENGTH, $(P_XT)xt_length)) +$(eval $(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_MATCH_STATISTIC, $(P_XT)xt_statistic)) +$(eval $(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_MATCH_TCPMSS, $(P_XT)xt_tcpmss)) + +$(eval $(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_TARGET_CLASSIFY, $(P_XT)xt_CLASSIFY)) +$(eval $(call nf_add,IPT_IPOPT,CONFIG_IP_NF_TARGET_ECN, $(P_V4)ipt_ECN)) + +$(eval $(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_MATCH_ECN, $(P_XT)xt_ecn)) + +# userland only +$(eval $(if $(NF_KMOD),,$(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_MATCH_DSCP, xt_tos))) +$(eval $(if $(NF_KMOD),,$(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_TARGET_DSCP, xt_TOS))) +$(eval $(if $(NF_KMOD),,$(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_MATCH_HL, ipt_ttl))) +$(eval $(if $(NF_KMOD),,$(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_TARGET_HL, ipt_TTL))) + +$(eval $(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_MATCH_HL, $(P_XT)xt_hl)) +$(eval $(call nf_add,IPT_IPOPT,CONFIG_NETFILTER_XT_TARGET_HL, $(P_XT)xt_HL)) + +# iprange +$(eval $(call nf_add,IPT_IPRANGE,CONFIG_NETFILTER_XT_MATCH_IPRANGE, $(P_XT)xt_iprange)) + +#clusterip +$(eval $(call nf_add,IPT_CLUSTERIP,CONFIG_IP_NF_TARGET_CLUSTERIP, $(P_V4)ipt_CLUSTERIP)) + +# ipsec +$(eval $(call nf_add,IPT_IPSEC,CONFIG_IP_NF_MATCH_AH, $(P_V4)ipt_ah)) +$(eval $(call nf_add,IPT_IPSEC,CONFIG_NETFILTER_XT_MATCH_ESP, $(P_XT)xt_esp)) +$(eval $(call nf_add,IPT_IPSEC,CONFIG_NETFILTER_XT_MATCH_POLICY, $(P_XT)xt_policy)) + +# flow offload support +$(eval $(call nf_add,IPT_FLOW,CONFIG_NETFILTER_XT_TARGET_FLOWOFFLOAD, $(P_XT)xt_FLOWOFFLOAD)) + +# IPv6 + +# kernel only +$(eval $(if $(NF_KMOD),$(call nf_add,NF_REJECT6,CONFIG_NF_REJECT_IPV6, $(P_V6)nf_reject_ipv6),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NF_IPT6,CONFIG_IP6_NF_IPTABLES, $(P_V6)ip6_tables),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NF_CONNTRACK,CONFIG_NF_DEFRAG_IPV6, $(P_V6)nf_defrag_ipv6),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,IPT_IPV6,CONFIG_IP6_NF_FILTER, $(P_V6)ip6table_filter),)) +$(eval $(if $(NF_KMOD),$(call nf_add,IPT_IPV6,CONFIG_IP6_NF_MANGLE, $(P_V6)ip6table_mangle),)) + +$(eval $(if $(NF_KMOD),,$(call nf_add,IPT_IPV6,CONFIG_IP6_NF_IPTABLES, ip6t_icmp6))) + + +$(eval $(call nf_add,IPT_IPV6,CONFIG_IP6_NF_TARGET_REJECT, $(P_V6)ip6t_REJECT)) + +# ipv6 extra +$(eval $(call nf_add,IPT_IPV6_EXTRA,CONFIG_IP6_NF_MATCH_IPV6HEADER, $(P_V6)ip6t_ipv6header)) +$(eval $(call nf_add,IPT_IPV6_EXTRA,CONFIG_IP6_NF_MATCH_AH, $(P_V6)ip6t_ah)) +$(eval $(call nf_add,IPT_IPV6_EXTRA,CONFIG_IP6_NF_MATCH_MH, $(P_V6)ip6t_mh)) +$(eval $(call nf_add,IPT_IPV6_EXTRA,CONFIG_IP6_NF_MATCH_EUI64, $(P_V6)ip6t_eui64)) +$(eval $(call nf_add,IPT_IPV6_EXTRA,CONFIG_IP6_NF_MATCH_OPTS, $(P_V6)ip6t_hbh)) +$(eval $(call nf_add,IPT_IPV6_EXTRA,CONFIG_IP6_NF_MATCH_FRAG, $(P_V6)ip6t_frag)) +$(eval $(call nf_add,IPT_IPV6_EXTRA,CONFIG_IP6_NF_MATCH_RT, $(P_V6)ip6t_rt)) + +# log + +$(eval $(call nf_add,NF_LOG,CONFIG_NF_LOG_COMMON, $(P_XT)nf_log_common, lt 5.13)) +$(eval $(call nf_add,NF_LOG,CONFIG_NF_LOG_IPV4, $(P_V4)nf_log_ipv4, lt 5.13)) +$(eval $(call nf_add,NF_LOG,CONFIG_NF_LOG_SYSLOG, $(P_XT)nf_log_syslog, ge 5.13)) +$(eval $(if $(NF_KMOD),$(call nf_add,NF_LOG6,CONFIG_NF_LOG_IPV6, $(P_V6)nf_log_ipv6,lt 5.13),)) + +# nat + +# kernel only +$(eval $(if $(NF_KMOD),$(call nf_add,NF_NAT,CONFIG_NF_NAT, $(P_XT)nf_nat),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,IPT_NAT,CONFIG_NETFILTER_XT_NAT, $(P_XT)xt_nat),)) +$(eval $(if $(NF_KMOD),$(call nf_add,IPT_NAT,CONFIG_IP_NF_NAT, $(P_V4)iptable_nat),)) +$(eval $(if $(NF_KMOD),$(call nf_add,IPT_NAT6,CONFIG_IP6_NF_NAT, $(P_V6)ip6table_nat),)) +$(eval $(if $(NF_KMOD),$(call nf_add,IPT_NAT6,CONFIG_IP6_NF_TARGET_NPT, $(P_V6)ip6t_NPT),)) + +# userland only +$(eval $(if $(NF_KMOD),,$(call nf_add,IPT_NAT,CONFIG_NF_NAT, ipt_SNAT ipt_DNAT))) +$(eval $(if $(NF_KMOD),,$(call nf_add,IPT_NAT6,CONFIG_IP6_NF_TARGET_NPT, ip6t_DNPT ip6t_SNPT))) + +$(eval $(call nf_add,IPT_NAT,CONFIG_NETFILTER_XT_TARGET_MASQUERADE, $(P_XT)xt_MASQUERADE)) +$(eval $(call nf_add,IPT_NAT,CONFIG_NETFILTER_XT_TARGET_REDIRECT, $(P_XT)xt_REDIRECT)) + + +# nat-extra + +$(eval $(call nf_add,IPT_NAT_EXTRA,CONFIG_IP_NF_TARGET_NETMAP, $(P_XT)xt_NETMAP)) + + +# nathelper + +$(eval $(call nf_add,NF_NATHELPER,CONFIG_NF_CONNTRACK_FTP, $(P_XT)nf_conntrack_ftp)) +$(eval $(call nf_add,NF_NATHELPER,CONFIG_NF_NAT_FTP, $(P_XT)nf_nat_ftp)) + + +# nathelper-extra + +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_CONNTRACK_BROADCAST, $(P_XT)nf_conntrack_broadcast)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_CONNTRACK_AMANDA, $(P_XT)nf_conntrack_amanda)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_NAT_AMANDA, $(P_XT)nf_nat_amanda)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_CONNTRACK_H323, $(P_XT)nf_conntrack_h323)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_NAT_H323, $(P_V4)nf_nat_h323)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_CONNTRACK_PPTP, $(P_XT)nf_conntrack_pptp)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_NAT_PPTP, $(P_V4)nf_nat_pptp)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_CONNTRACK_SIP, $(P_XT)nf_conntrack_sip)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_NAT_SIP, $(P_XT)nf_nat_sip)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_CONNTRACK_SNMP, $(P_XT)nf_conntrack_snmp)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_NAT_SNMP_BASIC, $(P_V4)nf_nat_snmp_basic)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_CONNTRACK_TFTP, $(P_XT)nf_conntrack_tftp)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_NAT_TFTP, $(P_XT)nf_nat_tftp)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_CONNTRACK_IRC, $(P_XT)nf_conntrack_irc)) +$(eval $(call nf_add,NF_NATHELPER_EXTRA,CONFIG_NF_NAT_IRC, $(P_XT)nf_nat_irc)) + + +# nflog + +$(eval $(call nf_add,IPT_NFLOG,CONFIG_NETFILTER_XT_TARGET_NFLOG, $(P_XT)xt_NFLOG)) + + +# nfqueue + +$(eval $(call nf_add,IPT_NFQUEUE,CONFIG_NETFILTER_XT_TARGET_NFQUEUE, $(P_XT)xt_NFQUEUE)) + + +# debugging + +$(eval $(call nf_add,IPT_DEBUG,CONFIG_NETFILTER_XT_TARGET_TRACE, $(P_XT)xt_TRACE)) + +# socket +$(eval $(call nf_add,NF_SOCKET,CONFIG_NF_SOCKET_IPV4, $(P_V4)nf_socket_ipv4)) +$(eval $(call nf_add,NF_SOCKET,CONFIG_NF_SOCKET_IPV6, $(P_V6)nf_socket_ipv6)) +$(eval $(call nf_add,IPT_SOCKET,CONFIG_NETFILTER_XT_MATCH_SOCKET, $(P_XT)xt_socket)) + +# tproxy +$(eval $(call nf_add,NF_TPROXY,CONFIG_NF_TPROXY_IPV4, $(P_V4)nf_tproxy_ipv4)) +$(eval $(call nf_add,NF_TPROXY,CONFIG_NF_TPROXY_IPV6, $(P_V6)nf_tproxy_ipv6)) +$(eval $(call nf_add,IPT_TPROXY,CONFIG_NETFILTER_XT_TARGET_TPROXY, $(P_XT)xt_TPROXY)) + +# led +$(eval $(call nf_add,IPT_LED,CONFIG_NETFILTER_XT_TARGET_LED, $(P_XT)xt_LED)) + +# tee + +$(eval $(call nf_add,IPT_TEE,CONFIG_NETFILTER_XT_TARGET_TEE, $(P_XT)xt_TEE)) + +# u32 + +$(eval $(call nf_add,IPT_U32,CONFIG_NETFILTER_XT_MATCH_U32, $(P_XT)xt_u32)) + +# checksum + +$(eval $(call nf_add,IPT_CHECKSUM,CONFIG_NETFILTER_XT_TARGET_CHECKSUM, $(P_XT)xt_CHECKSUM)) + + +# netlink + +$(eval $(call nf_add,NFNETLINK,CONFIG_NETFILTER_NETLINK, $(P_XT)nfnetlink)) + +# nflog + +$(eval $(call nf_add,NFNETLINK_LOG,CONFIG_NETFILTER_NETLINK_LOG, $(P_XT)nfnetlink_log)) + +# nfqueue + +$(eval $(call nf_add,NFNETLINK_QUEUE,CONFIG_NETFILTER_NETLINK_QUEUE, $(P_XT)nfnetlink_queue)) + +# conncount + +$(eval $(if $(NF_KMOD),$(call nf_add,NF_CONNCOUNT,CONFIG_NETFILTER_CONNCOUNT, $(P_XT)nf_conncount),)) + +# +# ebtables +# + +$(eval $(if $(NF_KMOD),$(call nf_add,EBTABLES,CONFIG_BRIDGE_NF_EBTABLES, $(P_EBT)ebtables),)) + +# ebtables: tables +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_BROUTE, $(P_EBT)ebtable_broute)) +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_T_FILTER, $(P_EBT)ebtable_filter)) +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_T_NAT, $(P_EBT)ebtable_nat)) + +# ebtables: matches +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_802_3, $(P_EBT)ebt_802_3)) +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_AMONG, $(P_EBT)ebt_among)) +$(eval $(call nf_add,EBTABLES_IP4,CONFIG_BRIDGE_EBT_ARP, $(P_EBT)ebt_arp)) +$(eval $(call nf_add,EBTABLES_IP4,CONFIG_BRIDGE_EBT_IP, $(P_EBT)ebt_ip)) +$(eval $(call nf_add,EBTABLES_IP6,CONFIG_BRIDGE_EBT_IP6, $(P_EBT)ebt_ip6)) +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_LIMIT, $(P_EBT)ebt_limit)) +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_MARK, $(P_EBT)ebt_mark_m)) +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_PKTTYPE, $(P_EBT)ebt_pkttype)) +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_STP, $(P_EBT)ebt_stp)) +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_VLAN, $(P_EBT)ebt_vlan)) + +# targets +$(eval $(call nf_add,EBTABLES_IP4,CONFIG_BRIDGE_EBT_ARPREPLY, $(P_EBT)ebt_arpreply)) +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_MARK_T, $(P_EBT)ebt_mark)) +$(eval $(call nf_add,EBTABLES_IP4,CONFIG_BRIDGE_EBT_DNAT, $(P_EBT)ebt_dnat)) +$(eval $(call nf_add,EBTABLES,CONFIG_BRIDGE_EBT_REDIRECT, $(P_EBT)ebt_redirect)) +$(eval $(call nf_add,EBTABLES_IP4,CONFIG_BRIDGE_EBT_SNAT, $(P_EBT)ebt_snat)) + +# watchers +$(eval $(call nf_add,EBTABLES_WATCHERS,CONFIG_BRIDGE_EBT_LOG, $(P_EBT)ebt_log)) +$(eval $(call nf_add,EBTABLES_WATCHERS,CONFIG_BRIDGE_EBT_NFLOG, $(P_EBT)ebt_nflog)) +$(eval $(call nf_add,EBTABLES_WATCHERS,CONFIG_BRIDGE_EBT_NFQUEUE, $(P_EBT)ebt_nfqueue)) + +# nftables +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NF_TABLES, $(P_XT)nf_tables),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NF_TABLES_SET, $(P_XT)nf_tables_set),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_COUNTER, $(P_XT)nft_counter),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_CT, $(P_XT)nft_ct),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_HASH, $(P_XT)nft_hash),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_LIMIT, $(P_XT)nft_limit),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_LOG, $(P_XT)nft_log),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_META, $(P_XT)nft_meta),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_NUMGEN, $(P_XT)nft_numgen),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_OBJREF, $(P_XT)nft_objref),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_QUOTA, $(P_XT)nft_quota),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_REDIR, $(P_XT)nft_redir),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_REJECT, $(P_XT)nft_reject $(P_V4)nft_reject_ipv4 $(P_V6)nft_reject_ipv6),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_REJECT_INET, $(P_XT)nft_reject_inet),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_BRIDGE,CONFIG_NFT_BRIDGE_META, $(P_EBT)nft_meta_bridge),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_BRIDGE,CONFIG_NFT_BRIDGE_REJECT, $(P_EBT)nft_reject_bridge),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_BRIDGE,CONFIG_NF_CONNTRACK_BRIDGE, $(P_EBT)nf_conntrack_bridge),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_NAT,CONFIG_NFT_NAT, $(P_XT)nft_nat),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_NAT,CONFIG_NFT_NAT, $(P_XT)nft_chain_nat),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_NAT,CONFIG_NFT_MASQ, $(P_XT)nft_masq),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_FIB,CONFIG_NFT_FIB, $(P_XT)nft_fib),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_FIB,CONFIG_NFT_FIB_INET, $(P_XT)nft_fib_inet),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_FIB,CONFIG_NFT_FIB_IPV4, $(P_V4)nft_fib_ipv4),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_FIB,CONFIG_NFT_FIB_IPV6, $(P_V6)nft_fib_ipv6),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_QUEUE,CONFIG_NFT_QUEUE, $(P_XT)nft_queue),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_SOCKET,CONFIG_NFT_SOCKET, $(P_XT)nft_socket),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_TPROXY,CONFIG_NFT_TPROXY, $(P_XT)nft_tproxy),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_COMPAT,CONFIG_NFT_COMPAT, $(P_XT)nft_compat),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_XFRM,CONFIG_NFT_XFRM, $(P_XT)nft_xfrm),)) + +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CONNLIMIT,CONFIG_NFT_CONNLIMIT, $(P_XT)nft_connlimit),)) + +# userland only +IPT_BUILTIN += $(NF_IPT-y) $(NF_IPT-m) +IPT_BUILTIN += $(IPT_CORE-y) $(IPT_CORE-m) +IPT_BUILTIN += $(NF_CONNTRACK-y) +IPT_BUILTIN += $(NF_CONNTRACK6-y) +IPT_BUILTIN += $(IPT_CONNTRACK-y) +IPT_BUILTIN += $(IPT_CONNTRACK_EXTRA-y) +IPT_BUILTIN += $(IPT_EXTRA-y) +IPT_BUILTIN += $(IPT_PHYSDEV-y) +IPT_BUILTIN += $(IPT_FILTER-y) +IPT_BUILTIN += $(IPT_FLOW-y) $(IPT_FLOW-m) +IPT_BUILTIN += $(IPT_IPOPT-y) +IPT_BUILTIN += $(IPT_IPRANGE-y) +IPT_BUILTIN += $(IPT_CLUSTER-y) +IPT_BUILTIN += $(IPT_CLUSTERIP-y) +IPT_BUILTIN += $(IPT_IPSEC-y) +IPT_BUILTIN += $(IPT_IPV6-y) $(IPT_IPV6-m) +IPT_BUILTIN += $(NF_NAT-y) +IPT_BUILTIN += $(NF_NAT6-y) +IPT_BUILTIN += $(IPT_NAT-y) +IPT_BUILTIN += $(IPT_NAT6-y) +IPT_BUILTIN += $(IPT_NAT_EXTRA-y) +IPT_BUILTIN += $(NF_NATHELPER-y) +IPT_BUILTIN += $(NF_NATHELPER_EXTRA-y) +IPT_BUILTIN += $(IPT_TPROXY-y) +IPT_BUILTIN += $(NFNETLINK-y) +IPT_BUILTIN += $(NFNETLINK_LOG-y) +IPT_BUILTIN += $(NFNETLINK_QUEUE-y) +IPT_BUILTIN += $(EBTABLES-y) +IPT_BUILTIN += $(EBTABLES_IP4-y) +IPT_BUILTIN += $(EBTABLES_IP6-y) +IPT_BUILTIN += $(EBTABLES_WATCHERS-y) + +endif # __inc_netfilter diff --git a/include/nls.mk b/include/nls.mk new file mode 100644 index 0000000..f054d2b --- /dev/null +++ b/include/nls.mk @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2011-2020 OpenWrt.org + +# iconv full +ifeq ($(CONFIG_BUILD_NLS),y) + ICONV_PREFIX:=$(STAGING_DIR)/usr/lib/libiconv-full + ICONV_FULL:=1 + + INTL_PREFIX:=$(STAGING_DIR)/usr/lib/libintl-full + INTL_FULL:=1 + + CMAKE_OPTIONS += -DCMAKE_PREFIX_PATH="$(ICONV_PREFIX);$(INTL_PREFIX)" +else + ICONV_PREFIX:= + ICONV_FULL:= + + INTL_PREFIX:= + INTL_FULL:= +endif + +PKG_CONFIG_DEPENDS += CONFIG_BUILD_NLS + +ICONV_DEPENDS:=+BUILD_NLS:libiconv-full +ifeq ($(CONFIG_BUILD_NLS),y) + ICONV_CFLAGS:=-I$(ICONV_PREFIX)/include + ICONV_CPPFLAGS:=-I$(ICONV_PREFIX)/include + ICONV_LDFLAGS:=-L$(ICONV_PREFIX)/lib -Wl,-rpath-link=$(ICONV_PREFIX)/lib +else + ICONV_CFLAGS:= + ICONV_CPPFLAGS:= + ICONV_LDFLAGS:= +endif + +INTL_DEPENDS:=+BUILD_NLS:libintl-full +ifeq ($(CONFIG_BUILD_NLS),y) + INTL_CFLAGS:=-I$(INTL_PREFIX)/include + INTL_CPPFLAGS:=-I$(INTL_PREFIX)/include + INTL_LDFLAGS:=-L$(INTL_PREFIX)/lib -Wl,-rpath-link=$(INTL_PREFIX)/lib +else + INTL_CFLAGS:= + INTL_CPPFLAGS:= + INTL_LDFLAGS:= +endif + +TARGET_CFLAGS += $(ICONV_CFLAGS) $(INTL_CFLAGS) +TARGET_CPPFLAGS += $(ICONV_CPPFLAGS) $(INTL_CPPFLAGS) +TARGET_LDFLAGS += $(ICONV_LDFLAGS) $(INTL_LDFLAGS) diff --git a/include/openssl-module.mk b/include/openssl-module.mk new file mode 100644 index 0000000..7348a10 --- /dev/null +++ b/include/openssl-module.mk @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2022-2023 Enéas Ulir de Queiroz + +ENGINES_DIR=engines-3 + +define Package/openssl/module/Default + SECTION:=libs + CATEGORY:=Libraries + SUBMENU:=SSL + DEPENDS:=libopenssl +libopenssl-conf +endef + +define Package/openssl/engine/Default + $(Package/openssl/module/Default) + DEPENDS+=@OPENSSL_ENGINE +endef + + +# 1 = moudule type (engine|provider) +# 2 = module name +# 3 = directory to save .so file +# 4 = [ package name, defaults to libopenssl-$(2) ] +define Package/openssl/add-module + $(eval MOD_TYPE:=$(1)) + $(eval MOD_NAME:=$(2)) + $(eval MOD_DIR:=$(3)) + $(eval OSSL_PKG:=$(if $(4),$(4),libopenssl-$(MOD_NAME))) + $(info Package/openssl/add-module 1='$(1)'; 2='$(2)'; 3='$(3)' 4='$(4)') + $(info MOD_TYPE='$(MOD_TYPE)'; MOD_NAME='$(MOD_NAME)'; MOD_DIR='$(MOD_DIR)' OSSL_PKG='$(OSSL_PKG)') + Package/$(OSSL_PKG)/conffiles:=/etc/ssl/modules.cnf.d/$(MOD_NAME).cnf + + define Package/$(OSSL_PKG)/install + $$(INSTALL_DIR) $$(1)/$(MOD_DIR) + $$(INSTALL_BIN) $$(PKG_INSTALL_DIR)/$(MOD_DIR)/$(MOD_NAME).so \ + $$(1)/$(MOD_DIR) + $$(INSTALL_DIR) $$(1)/etc/ssl/modules.cnf.d + $$(INSTALL_DATA) ./files/$(MOD_NAME).cnf $$(1)/etc/ssl/modules.cnf.d/ + endef + + define Package/$(OSSL_PKG)/postinst +#!/bin/sh +OPENSSL_UCI="$$$${IPKG_INSTROOT}/etc/config/openssl" + +[ -z "$$$${IPKG_INSTROOT}" ] \ + && uci -q get openssl.$(MOD_NAME) >/dev/null \ + && exit 0 + +cat << EOF >> "$$$${OPENSSL_UCI}" + +config $(MOD_TYPE) '$(MOD_NAME)' + option enabled '1' +EOF + +[ -n "$$$${IPKG_INSTROOT}" ] || /etc/init.d/openssl reload +exit 0 + endef + + define Package/$(OSSL_PKG)/postrm +#!/bin/sh +[ -n "$$$${IPKG_INSTROOT}" ] && exit 0 +uci -q delete openssl.$(MOD_NAME) && uci commit openssl +/etc/init.d/openssl reload +exit 0 + endef +endef + +# 1 = engine name +# 2 - package name, defaults to libopenssl-$(1) +define Package/openssl/add-engine + $(call Package/openssl/add-module,engine,$(1),/usr/lib/$(ENGINES_DIR),$(2)) +endef + +# 1 = provider name +# 2 = [ package name, defaults to libopenssl-$(1) ] +define Package/openssl/add-provider + $(call Package/openssl/add-module,provider,$(1),/usr/lib/ossl-modules,$(2)) +endef + diff --git a/include/package-bin.mk b/include/package-bin.mk new file mode 100644 index 0000000..4ca4921 --- /dev/null +++ b/include/package-bin.mk @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2007-2020 OpenWrt.org + +ifeq ($(DUMP),) + define BuildTarget/bin + TARGET_VARIANT=$(if $(ALL_VARIANTS),$(if $(VARIANT),$(filter-out *,$(VARIANT)),$(firstword $(ALL_VARIANTS)))) + ifeq ($(if $(TARGET_VARIANT),$(BUILD_VARIANT)),$(TARGET_VARIANT)) + ifdef Package/$(1)/install + ifneq ($(CONFIG_PACKAGE_$(1))$(DEVELOPER),) + $(_pkg_target)compile: $(PKG_BUILD_DIR)/.pkgdir/$(1).installed + compile: install-bin-$(1) + else + compile: $(1)-disabled + $(1)-disabled: + @echo "WARNING: skipping $(1) -- package not selected" >&2 + endif + endif + endif + + $(PKG_BUILD_DIR)/.pkgdir/$(1).installed: $(STAMP_BUILT) + rm -rf $(PKG_BUILD_DIR)/.pkgdir/$(1) $$@ + mkdir -p $(PKG_BUILD_DIR)/.pkgdir/$(1) + $(call Package/$(1)/install,$(PKG_BUILD_DIR)/.pkgdir/$(1)) + touch $$@ + + install-bin-$(1): $(PKG_BUILD_DIR)/.pkgdir/$(1).installed + rm -rf $(BIN_DIR)/$(1) + -rmdir $(PKG_BUILD_DIR)/.pkgdir/$(1) >/dev/null 2>/dev/null + if [ -d $(PKG_BUILD_DIR)/.pkgdir/$(1) ]; then \ + $(INSTALL_DIR) $(BIN_DIR)/$(1) && \ + $(CP) $(PKG_BUILD_DIR)/.pkgdir/$(1)/. $(BIN_DIR)/$(1)/; \ + fi + + clean-$(1): + rm -rf $(BIN_DIR)/$(1) + + clean: clean-$(1) + .PHONY: install-bin-$(1) + endef +endif diff --git a/include/package-defaults.mk b/include/package-defaults.mk new file mode 100644 index 0000000..af92d4a --- /dev/null +++ b/include/package-defaults.mk @@ -0,0 +1,163 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +PKG_DEFAULT_DEPENDS = +libc + +ifneq ($(PKG_NAME),toolchain) + PKG_FIXUP_DEPENDS = $(if $(filter kmod-%,$(1)),$(2),$(PKG_DEFAULT_DEPENDS) $(filter-out $(PKG_DEFAULT_DEPENDS),$(2))) +else + PKG_FIXUP_DEPENDS = $(2) +endif + +define Package/Default + CONFIGFILE:= + SECTION:=opt + CATEGORY:=Extra packages + DEPENDS:= + MDEPENDS:= + CONFLICTS:= + PROVIDES:= + EXTRA_DEPENDS:= + MAINTAINER:=$(PKG_MAINTAINER) + SOURCE:=$(patsubst $(TOPDIR)/%,%,$(patsubst $(TOPDIR)/package/%,feeds/base/%,$(CURDIR))) + ifneq ($(PKG_VERSION),) + ifneq ($(PKG_RELEASE),) + VERSION:=$(PKG_VERSION)-$(PKG_RELEASE) + else + VERSION:=$(PKG_VERSION) + endif + else + VERSION:=$(PKG_RELEASE) + endif + ABI_VERSION:= + ifneq ($(PKG_FLAGS),) + PKGFLAGS:=$(PKG_FLAGS) + else + PKGFLAGS:= + endif + ifneq ($(ARCH_PACKAGES),) + PKGARCH:=$(ARCH_PACKAGES) + else + PKGARCH:=$(BOARD) + endif + DEFAULT:= + MENU:= + SUBMENU:= + SUBMENUDEP:= + TITLE:= + KCONFIG:= + BUILDONLY:= + HIDDEN:= + URL:= + VARIANT:= + DEFAULT_VARIANT:= + USERID:= + ALTERNATIVES:= + LICENSE:=$(PKG_LICENSE) + LICENSE_FILES:=$(PKG_LICENSE_FILES) + FILE_MODES:=$(PKG_FILE_MODES) +endef + +Build/Patch:=$(Build/Patch/Default) +ifneq ($(strip $(PKG_UNPACK)),) + define Build/Prepare/Default + $(PKG_UNPACK) + [ ! -d ./src/ ] || $(CP) ./src/. $(PKG_BUILD_DIR) + $(Build/Patch) + endef +endif + +EXTRA_CXXFLAGS = $(EXTRA_CFLAGS) +ifeq ($(CONFIG_BUILD_NLS),y) + DISABLE_NLS:= +else + DISABLE_NLS:=--disable-nls +endif + +CONFIGURE_PREFIX:=/usr +CONFIGURE_ARGS = \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --disable-dependency-tracking \ + --program-prefix="" \ + --program-suffix="" \ + --prefix=$(CONFIGURE_PREFIX) \ + --exec-prefix=$(CONFIGURE_PREFIX) \ + --bindir=$(CONFIGURE_PREFIX)/bin \ + --sbindir=$(CONFIGURE_PREFIX)/sbin \ + --libexecdir=$(CONFIGURE_PREFIX)/lib \ + --sysconfdir=/etc \ + --datadir=$(CONFIGURE_PREFIX)/share \ + --localstatedir=/var \ + --mandir=$(CONFIGURE_PREFIX)/man \ + --infodir=$(CONFIGURE_PREFIX)/info \ + $(DISABLE_NLS) \ + $(DISABLE_IPV6) + +CONFIGURE_VARS = \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS) $(EXTRA_CFLAGS)" \ + CXXFLAGS="$(TARGET_CXXFLAGS) $(EXTRA_CXXFLAGS)" \ + CPPFLAGS="$(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)" \ + LDFLAGS="$(TARGET_LDFLAGS) $(EXTRA_LDFLAGS)" \ + +CONFIGURE_PATH = . +CONFIGURE_CMD = ./configure + +replace_script=$(FIND) $(1) -name $(2) | $(XARGS) chmod u+w; \ + $(FIND) $(1) -name $(2) | $(XARGS) -n1 cp --remove-destination \ + $(SCRIPT_DIR)/$(2); + +define Build/Configure/Default + (cd $(PKG_BUILD_DIR)/$(CONFIGURE_PATH)/$(strip $(3)); \ + if [ -x $(CONFIGURE_CMD) ]; then \ + $(call replace_script,$(PKG_BUILD_DIR)/$(3),config.guess) \ + $(call replace_script,$(PKG_BUILD_DIR)/$(3),config.sub) \ + $(CONFIGURE_VARS) \ + $(2) \ + $(CONFIGURE_CMD) \ + $(CONFIGURE_ARGS) \ + $(1); \ + fi; \ + ) +endef + +MAKE_VARS = \ + CFLAGS="$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)" \ + CXXFLAGS="$(TARGET_CXXFLAGS) $(EXTRA_CXXFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)" \ + LDFLAGS="$(TARGET_LDFLAGS) $(EXTRA_LDFLAGS)" + +MAKE_FLAGS = \ + $(TARGET_CONFIGURE_OPTS) \ + CROSS="$(TARGET_CROSS)" \ + ARCH="$(ARCH)" + +MAKE_INSTALL_FLAGS = \ + $(MAKE_FLAGS) \ + DESTDIR="$(PKG_INSTALL_DIR)" + +MAKE_PATH ?= . + +define Build/Compile/Default + +$(MAKE_VARS) \ + $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(MAKE_PATH) \ + $(MAKE_FLAGS) \ + $(1); +endef + +define Build/Install/Default + $(MAKE_VARS) \ + $(MAKE) -C $(PKG_BUILD_DIR)/$(MAKE_PATH) \ + $(MAKE_INSTALL_FLAGS) \ + $(if $(1), $(1), install); +endef + +define Build/Dist/Default + $(call Build/Compile/Default, DESTDIR="$(PKG_BUILD_DIR)/tmp" CC="$(TARGET_CC)" dist) +endef + +define Build/DistCheck/Default + $(call Build/Compile/Default, DESTDIR="$(PKG_BUILD_DIR)/tmp" CC="$(TARGET_CC)" distcheck) +endef diff --git a/include/package-dumpinfo.mk b/include/package-dumpinfo.mk new file mode 100644 index 0000000..6baf102 --- /dev/null +++ b/include/package-dumpinfo.mk @@ -0,0 +1,59 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +ifneq ($(DUMP),) + + +define SOURCE_INFO +$(if $(PKG_BUILD_DEPENDS),Build-Depends: $(PKG_BUILD_DEPENDS) +)$(if $(HOST_BUILD_DEPENDS),Build-Depends/host: $(HOST_BUILD_DEPENDS) +)$(if $(BUILD_TYPES),Build-Types: $(BUILD_TYPES) +) + +endef + +define Dumpinfo/Package +$(info $(SOURCE_INFO)Package: $(1) +$(if $(MENU),Menu: $(MENU) +)$(if $(SUBMENU),Submenu: $(SUBMENU) +)$(if $(SUBMENUDEP),Submenu-Depends: $(SUBMENUDEP) +)$(if $(DEFAULT),Default: $(DEFAULT) +)$(if $(findstring $(PREREQ_CHECK),1),Prereq-Check: 1 +)Version: $(VERSION) +Depends: $(call PKG_FIXUP_DEPENDS,$(1),$(DEPENDS)) +Conflicts: $(CONFLICTS) +Menu-Depends: $(MDEPENDS) +Provides: $(PROVIDES) +$(if $(VARIANT),Build-Variant: $(VARIANT) +$(if $(DEFAULT_VARIANT),Default-Variant: $(VARIANT) +))Section: $(SECTION) +Category: $(CATEGORY) +$(if $(filter nonshared,$(PKGFLAGS)),,Repository: $(if $(FEED),$(FEED),base) +)Title: $(TITLE) +Maintainer: $(MAINTAINER) +$(if $(USERID),Require-User: $(USERID) +)Source: $(PKG_SOURCE) +$(if $(LICENSE),License: $(LICENSE) +)$(if $(LICENSE_FILES),LicenseFiles: $(LICENSE_FILES) +)$(if $(PKG_CPE_ID),CPE-ID: $(PKG_CPE_ID) +)$(if $(ABI_VERSION),ABI-Version: $(ABI_VERSION) +)Type: $(if $(Package/$(1)/targets),$(Package/$(1)/targets),$(if $(PKG_TARGETS),$(PKG_TARGETS),ipkg)) +$(if $(KCONFIG),Kernel-Config: $(KCONFIG) +)$(if $(BUILDONLY),Build-Only: $(BUILDONLY) +)$(if $(HIDDEN),Hidden: $(HIDDEN) +)Description: $(if $(Package/$(1)/description),$(Package/$(1)/description),$(TITLE)) +$(if $(URL),$(URL) +)$(MAINTAINER) +@@ +$(if $(Package/$(1)/config),Config: +$(Package/$(1)/config) +@@ +)) +SOURCE_INFO := +endef + +dumpinfo: FORCE + $(if $(SOURCE_INFO),$(info $(SOURCE_INFO))) + +endif diff --git a/include/package-ipkg.mk b/include/package-ipkg.mk new file mode 100644 index 0000000..3063a86 --- /dev/null +++ b/include/package-ipkg.mk @@ -0,0 +1,276 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +ifndef DUMP + include $(INCLUDE_DIR)/feeds.mk +endif + +IPKG_REMOVE:= \ + $(SCRIPT_DIR)/ipkg-remove + +IPKG_STATE_DIR:=$(TARGET_DIR)/usr/lib/opkg + +# Generates a make statement to return a wildcard for candidate ipkg files +# 1: package name +define gen_ipkg_wildcard + $(1)$$(if $$(filter -%,$$(ABIV_$(1))),,[^a-z-])* +endef + +# 1: package name +# 2: candidate ipk files +define remove_ipkg_files + $(if $(strip $(2)),$(IPKG_REMOVE) $(1) $(2)) +endef + +# 1: package name +# 2: variable name +# 3: variable suffix +# 4: file is a script +define BuildIPKGVariable +ifdef Package/$(1)/$(2) + $$(IPKG_$(1)) : VAR_$(2)$(3)=$$(Package/$(1)/$(2)) + $(call shexport,Package/$(1)/$(2)) + $(1)_COMMANDS += echo "$$$$$$$$$(call shvar,Package/$(1)/$(2))" > $(2)$(3); $(if $(4),chmod 0755 $(2)$(3);) +endif +endef + +PARENL :=( +PARENR :=) + +dep_split=$(subst :,$(space),$(1)) +dep_rem=$(subst !,,$(subst $(strip $(PARENL)),,$(subst $(strip $(PARENR)),,$(word 1,$(call dep_split,$(1)))))) +dep_and=dep_and_res:=$$(and $(subst $(space),$(comma),$(foreach cond,$(subst &&, ,$(1)),$$(CONFIG_$(cond))))) +dep_confvar=$(strip $(foreach cond,$(subst ||, ,$(call dep_rem,$(1))),$(eval $(call dep_and,$(cond)))$(dep_and_res))) +dep_pos=$(if $(call dep_confvar,$(1)),$(call dep_val,$(1))) +dep_neg=$(if $(call dep_confvar,$(1)),,$(call dep_val,$(1))) +dep_if=$(if $(findstring !,$(1)),$(call dep_neg,$(1)),$(call dep_pos,$(1))) +dep_val=$(word 2,$(call dep_split,$(1))) +strip_deps=$(strip $(subst +,,$(filter-out @%,$(1)))) +filter_deps=$(foreach dep,$(call strip_deps,$(1)),$(if $(findstring :,$(dep)),$(call dep_if,$(dep)),$(dep))) + +define AddDependency + $$(if $(1),$$(if $(2),$$(foreach pkg,$(1),$$(IPKG_$$(pkg))): $$(foreach pkg,$(2),$$(IPKG_$$(pkg))))) +endef + +define FixupReverseDependencies + DEPS := $$(filter %:$(1),$$(IDEPEND)) + DEPS := $$(patsubst %:$(1),%,$$(DEPS)) + DEPS := $$(filter $$(DEPS),$$(IPKGS)) + $(call AddDependency,$$(DEPS),$(1)) +endef + +define FixupDependencies + DEPS := $$(filter $(1):%,$$(IDEPEND)) + DEPS := $$(patsubst $(1):%,%,$$(DEPS)) + DEPS := $$(filter $$(DEPS),$$(IPKGS)) + $(call AddDependency,$(1),$$(DEPS)) +endef + +ifneq ($(PKG_NAME),toolchain) + define CheckDependencies + @( \ + rm -f $(PKG_INFO_DIR)/$(1).missing; \ + ( \ + export \ + READELF=$(TARGET_CROSS)readelf \ + OBJCOPY=$(TARGET_CROSS)objcopy \ + XARGS="$(XARGS)"; \ + $(SCRIPT_DIR)/gen-dependencies.sh "$$(IDIR_$(1))"; \ + ) | while read FILE; do \ + grep -qxF "$$$$FILE" $(PKG_INFO_DIR)/$(1).provides || \ + echo "$$$$FILE" >> $(PKG_INFO_DIR)/$(1).missing; \ + done; \ + if [ -f "$(PKG_INFO_DIR)/$(1).missing" ]; then \ + echo "Package $(1) is missing dependencies for the following libraries:" >&2; \ + cat "$(PKG_INFO_DIR)/$(1).missing" >&2; \ + false; \ + fi; \ + ) + endef +endif + +_addsep=$(word 1,$(1))$(foreach w,$(wordlist 2,$(words $(1)),$(1)),$(strip $(2) $(w))) +_cleansep=$(subst $(space)$(2)$(space),$(2)$(space),$(1)) +mergelist=$(call _cleansep,$(call _addsep,$(1),$(comma)),$(comma)) +addfield=$(if $(strip $(2)),$(1): $(2)) +_define=define +_endef=endef + +ifeq ($(DUMP),) + define BuildTarget/ipkg + ABIV_$(1):=$(call FormatABISuffix,$(1),$(ABI_VERSION)) + PDIR_$(1):=$(call FeedPackageDir,$(1)) + IPKG_$(1):=$$(PDIR_$(1))/$(1)$$(ABIV_$(1))_$(VERSION)_$(PKGARCH).ipk + IDIR_$(1):=$(PKG_BUILD_DIR)/ipkg-$(PKGARCH)/$(1) + KEEP_$(1):=$(strip $(call Package/$(1)/conffiles)) + + TARGET_VARIANT:=$$(if $(ALL_VARIANTS),$$(if $$(VARIANT),$$(filter-out *,$$(VARIANT)),$(firstword $(ALL_VARIANTS)))) + ifeq ($(BUILD_VARIANT),$$(if $$(TARGET_VARIANT),$$(TARGET_VARIANT),$(BUILD_VARIANT))) + do_install= + ifdef Package/$(1)/install + do_install=yes + endif + ifdef Package/$(1)/install-overlay + do_install=yes + endif + ifdef do_install + ifneq ($(CONFIG_PACKAGE_$(1))$(DEVELOPER),) + IPKGS += $(1) + $(_pkg_target)compile: $$(IPKG_$(1)) $(PKG_INFO_DIR)/$(1).provides $(PKG_BUILD_DIR)/.pkgdir/$(1).installed + prepare-package-install: $$(IPKG_$(1)) + compile: $(STAGING_DIR_ROOT)/stamp/.$(1)_installed + else + $(if $(CONFIG_PACKAGE_$(1)),$$(info WARNING: skipping $(1) -- package not selected)) + endif + + .PHONY: $(PKG_INSTALL_STAMP).$(1) + ifeq ($(CONFIG_PACKAGE_$(1)),y) + compile: $(PKG_INSTALL_STAMP).$(1) + endif + $(PKG_INSTALL_STAMP).$(1): prepare-package-install + echo "$(1)" >> $(PKG_INSTALL_STAMP) + else + $(if $(CONFIG_PACKAGE_$(1)),$$(warning WARNING: skipping $(1) -- package has no install section)) + endif + endif + + DEPENDS:=$(call PKG_FIXUP_DEPENDS,$(1),$(DEPENDS)) + IDEPEND_$(1):=$$(call filter_deps,$$(DEPENDS)) + IDEPEND += $$(patsubst %,$(1):%,$$(IDEPEND_$(1))) + $(FixupDependencies) + $(FixupReverseDependencies) + + $(eval $(call BuildIPKGVariable,$(1),conffiles)) + $(eval $(call BuildIPKGVariable,$(1),preinst,,1)) + $(eval $(call BuildIPKGVariable,$(1),postinst,-pkg,1)) + $(eval $(call BuildIPKGVariable,$(1),prerm,-pkg,1)) + $(eval $(call BuildIPKGVariable,$(1),postrm,,1)) + + $(PKG_BUILD_DIR)/.pkgdir/$(1).installed : export PATH=$$(TARGET_PATH_PKG) + $(PKG_BUILD_DIR)/.pkgdir/$(1).installed: $(STAMP_BUILT) + rm -rf $$@ $(PKG_BUILD_DIR)/.pkgdir/$(1) + mkdir -p $(PKG_BUILD_DIR)/.pkgdir/$(1) + $(call Package/$(1)/install,$(PKG_BUILD_DIR)/.pkgdir/$(1)) + $(call Package/$(1)/install_lib,$(PKG_BUILD_DIR)/.pkgdir/$(1)) + touch $$@ + + $(STAGING_DIR_ROOT)/stamp/.$(1)_installed: $(PKG_BUILD_DIR)/.pkgdir/$(1).installed + mkdir -p $(STAGING_DIR_ROOT)/stamp + $(if $(ABI_VERSION),echo '$(ABI_VERSION)' | cmp -s - $(PKG_INFO_DIR)/$(1).version || { \ + echo '$(ABI_VERSION)' > $(PKG_INFO_DIR)/$(1).version; \ + $(foreach pkg,$(filter-out $(1),$(PROVIDES)), \ + cp $(PKG_INFO_DIR)/$(1).version $(PKG_INFO_DIR)/$(pkg).version; \ + ) \ + } ) + $(call locked,$(CP) $(PKG_BUILD_DIR)/.pkgdir/$(1)/. $(STAGING_DIR_ROOT)/,root-copy) + touch $$@ + + Package/$(1)/DEPENDS := $$(call mergelist,$$(foreach dep,$$(filter-out @%,$$(IDEPEND_$(1))),$$(dep)$$(call GetABISuffix,$$(dep)))) + ifneq ($$(EXTRA_DEPENDS),) + Package/$(1)/DEPENDS := $$(EXTRA_DEPENDS)$$(if $$(Package/$(1)/DEPENDS),$$(comma) $$(Package/$(1)/DEPENDS)) + endif + +$(_define) Package/$(1)/CONTROL +Package: $(1)$$(ABIV_$(1)) +Version: $(VERSION) +$$(call addfield,Depends,$$(Package/$(1)/DEPENDS) +)$$(call addfield,Conflicts,$$(call mergelist,$(CONFLICTS)) +)$$(call addfield,Provides,$$(call mergelist,$$(filter-out $(1)$$(ABIV_$(1)),$(PROVIDES)$$(if $$(ABIV_$(1)), $(1) $(foreach provide,$(PROVIDES),$(provide)$$(ABIV_$(1)))))) +)$$(call addfield,Alternatives,$$(call mergelist,$(ALTERNATIVES)) +)$$(call addfield,Source,$(SOURCE) +)$$(call addfield,SourceName,$(1) +)$$(call addfield,License,$(LICENSE) +)$$(call addfield,LicenseFiles,$(LICENSE_FILES) +)$$(call addfield,Section,$(SECTION) +)$$(call addfield,Require-User,$(USERID) +)$$(call addfield,SourceDateEpoch,$(PKG_SOURCE_DATE_EPOCH) +)$$(if $$(ABIV_$(1)),ABIVersion: $$(ABIV_$(1)) +)$(if $(PKG_CPE_ID),CPE-ID: $(PKG_CPE_ID) +)$(if $(filter hold,$(PKG_FLAGS)),Status: unknown hold not-installed +)$(if $(filter essential,$(PKG_FLAGS)),Essential: yes +)$(if $(MAINTAINER),Maintainer: $(MAINTAINER) +)Architecture: $(PKGARCH) +Installed-Size: 0 +$(_endef) + + $$(IPKG_$(1)) : export CONTROL=$$(Package/$(1)/CONTROL) + $$(IPKG_$(1)) : export DESCRIPTION=$$(Package/$(1)/description) + $$(IPKG_$(1)) : export PATH=$$(TARGET_PATH_PKG) + $$(IPKG_$(1)) : export PKG_SOURCE_DATE_EPOCH:=$(PKG_SOURCE_DATE_EPOCH) + $(PKG_INFO_DIR)/$(1).provides $$(IPKG_$(1)): $(STAMP_BUILT) $(INCLUDE_DIR)/package-ipkg.mk + @rm -rf $$(IDIR_$(1)); \ + $$(call remove_ipkg_files,$(1),$$(call opkg_package_files,$(call gen_ipkg_wildcard,$(1)))) + mkdir -p $(PACKAGE_DIR) $$(IDIR_$(1))/CONTROL $(PKG_INFO_DIR) + $(call Package/$(1)/install,$$(IDIR_$(1))) + $(if $(Package/$(1)/install-overlay),mkdir -p $(PACKAGE_DIR) $$(IDIR_$(1))/rootfs-overlay) + $(call Package/$(1)/install-overlay,$$(IDIR_$(1))/rootfs-overlay) + -find $$(IDIR_$(1)) -name 'CVS' -o -name '.svn' -o -name '.#*' -o -name '*~'| $(XARGS) rm -rf + @( \ + find $$(IDIR_$(1)) -name lib\*.so\* -or -name \*.ko | awk -F/ '{ print $$$$NF }'; \ + for file in $$(patsubst %,$(PKG_INFO_DIR)/%.provides,$$(IDEPEND_$(1))); do \ + if [ -f "$$$$file" ]; then \ + cat $$$$file; \ + fi; \ + done; $(Package/$(1)/extra_provides) \ + ) | sort -u > $(PKG_INFO_DIR)/$(1).provides + $(if $(PROVIDES),@for pkg in $(filter-out $(1),$(PROVIDES)); do cp $(PKG_INFO_DIR)/$(1).provides $(PKG_INFO_DIR)/$$$$pkg.provides; done) + $(CheckDependencies) + + $(RSTRIP) $$(IDIR_$(1)) + + ifneq ($$(CONFIG_IPK_FILES_CHECKSUMS),) + (cd $$(IDIR_$(1)); \ + ( \ + find . -type f \! -path ./CONTROL/\* -exec $(MKHASH) sha256 -n \{\} \; 2> /dev/null | \ + sed 's|\([[:blank:]]\)\./| \1/|' > $$(IDIR_$(1))/CONTROL/files-sha256sum \ + ) || true \ + ) + endif + (cd $$(IDIR_$(1))/CONTROL; \ + ( \ + echo "$$$$CONTROL"; \ + printf "Description: "; echo "$$$$DESCRIPTION" | sed -e 's,^[[:space:]]*, ,g'; \ + ) > control; \ + chmod 644 control; \ + ( \ + echo "#!/bin/sh"; \ + echo "[ \"\$$$${IPKG_NO_SCRIPT}\" = \"1\" ] && exit 0"; \ + echo "[ -s "\$$$${IPKG_INSTROOT}/lib/functions.sh" ] || exit 0"; \ + echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \ + echo "default_postinst \$$$$0 \$$$$@"; \ + ) > postinst; \ + ( \ + echo "#!/bin/sh"; \ + echo "[ -s "\$$$${IPKG_INSTROOT}/lib/functions.sh" ] || exit 0"; \ + echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \ + echo "default_prerm \$$$$0 \$$$$@"; \ + ) > prerm; \ + chmod 0755 postinst prerm; \ + $($(1)_COMMANDS) \ + ) + + ifneq ($$(KEEP_$(1)),) + @( \ + keepfiles=""; \ + for x in $$(KEEP_$(1)); do \ + [ -f "$$(IDIR_$(1))/$$$$x" ] || keepfiles="$$$${keepfiles:+$$$$keepfiles }$$$$x"; \ + done; \ + [ -z "$$$$keepfiles" ] || { \ + mkdir -p $$(IDIR_$(1))/lib/upgrade/keep.d; \ + for x in $$$$keepfiles; do echo $$$$x >> $$(IDIR_$(1))/lib/upgrade/keep.d/$(1); done; \ + }; \ + ) + endif + + $(INSTALL_DIR) $$(PDIR_$(1)) + $(FAKEROOT) $(STAGING_DIR_HOST)/bin/bash $(SCRIPT_DIR)/ipkg-build -m "$(FILE_MODES)" $$(IDIR_$(1)) $$(PDIR_$(1)) + @[ -f $$(IPKG_$(1)) ] + + $(1)-clean: + $$(call remove_ipkg_files,$(1),$$(call opkg_package_files,$(call gen_ipkg_wildcard,$(1)))) + + clean: $(1)-clean + + endef +endif diff --git a/include/package-seccomp.mk b/include/package-seccomp.mk new file mode 100644 index 0000000..86e8344 --- /dev/null +++ b/include/package-seccomp.mk @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2015-2020 OpenWrt.org + +PKG_CONFIG_DEPENDS+= CONFIG_KERNEL_SECCOMP + +ifeq ($(CONFIG_KERNEL_SECCOMP),y) + define InstallSeccomp + $(INSTALL_DIR) $(1)/etc/seccomp + $(INSTALL_DATA) $(2) $(1)/etc/seccomp/ + endef +endif diff --git a/include/package.mk b/include/package.mk new file mode 100644 index 0000000..c391d32 --- /dev/null +++ b/include/package.mk @@ -0,0 +1,376 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +__package_mk:=1 + +all: $(if $(DUMP),dumpinfo,$(if $(CHECK),check,compile)) + +include $(INCLUDE_DIR)/download.mk + +PKG_BUILD_DIR ?= $(BUILD_DIR)/$(if $(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)$(PKG_NAME)$(if $(PKG_VERSION),-$(PKG_VERSION)) +PKG_INSTALL_DIR ?= $(PKG_BUILD_DIR)/ipkg-install +PKG_BUILD_PARALLEL ?= +PKG_SKIP_DOWNLOAD=$(USE_SOURCE_DIR)$(USE_GIT_TREE)$(USE_GIT_SRC_CHECKOUT) + +MAKE_J:=$(if $(MAKE_JOBSERVER),$(MAKE_JOBSERVER) $(if $(filter 3.% 4.0 4.1,$(MAKE_VERSION)),-j)) + +PKG_SOURCE_DATE_EPOCH:=$(if $(DUMP),,$(shell $(TOPDIR)/scripts/get_source_date_epoch.sh $(CURDIR))) + +ifeq ($(strip $(PKG_BUILD_PARALLEL)),0) +PKG_JOBS?=-j1 +else +PKG_JOBS?=$(if $(PKG_BUILD_PARALLEL),$(MAKE_J),-j1) +endif + +PKG_BUILD_FLAGS?= +__unknown_flags=$(filter-out no-iremap no-mips16 gc-sections no-gc-sections lto no-lto,$(PKG_BUILD_FLAGS)) +ifneq ($(__unknown_flags),) + $(error unknown PKG_BUILD_FLAGS: $(__unknown_flags)) +endif + +# $1=flagname, $2=default (0/1) +define pkg_build_flag +$(if $(filter no-$(1),$(PKG_BUILD_FLAGS)),0,$(if $(filter $(1),$(PKG_BUILD_FLAGS)),1,$(2))) +endef + +ifeq ($(call pkg_build_flag,iremap,1),1) + IREMAP_CFLAGS = $(call iremap,$(PKG_BUILD_DIR),$(notdir $(PKG_BUILD_DIR))) + TARGET_CFLAGS += $(IREMAP_CFLAGS) +endif +ifdef CONFIG_USE_MIPS16 + ifeq ($(call pkg_build_flag,mips16,1),1) + TARGET_ASFLAGS_DEFAULT = $(filter-out -mips16 -minterlink-mips16,$(TARGET_CFLAGS)) + TARGET_CFLAGS += -mips16 -minterlink-mips16 + TARGET_CXXFLAGS += -mips16 -minterlink-mips16 + endif +endif +ifeq ($(call pkg_build_flag,gc-sections,$(if $(CONFIG_USE_GC_SECTIONS),1,0)),1) + TARGET_CFLAGS+= -ffunction-sections -fdata-sections + TARGET_CXXFLAGS+= -ffunction-sections -fdata-sections + TARGET_LDFLAGS+= -Wl,--gc-sections +endif +ifeq ($(call pkg_build_flag,lto,$(if $(CONFIG_USE_LTO),1,0)),1) + TARGET_CFLAGS+= -flto=auto -fno-fat-lto-objects + TARGET_CXXFLAGS+= -flto=auto -fno-fat-lto-objects + TARGET_LDFLAGS+= -flto=auto -fuse-linker-plugin +endif + +include $(INCLUDE_DIR)/hardening.mk +include $(INCLUDE_DIR)/prereq.mk +include $(INCLUDE_DIR)/unpack.mk +include $(INCLUDE_DIR)/depends.mk + +ifneq ($(wildcard $(TOPDIR)/git-src/$(PKG_NAME)/.git),) + USE_GIT_SRC_CHECKOUT:=1 + QUILT:=1 +endif +ifneq ($(if $(CONFIG_SRC_TREE_OVERRIDE),$(wildcard ./git-src)),) + USE_GIT_TREE:=1 + QUILT:=1 +endif +ifdef USE_SOURCE_DIR + QUILT:=1 +endif +ifneq ($(wildcard $(PKG_BUILD_DIR)/.source_dir),) + QUILT:=1 +endif + +include $(INCLUDE_DIR)/quilt.mk + +find_library_dependencies = \ + $(wildcard $(patsubst %,$(STAGING_DIR)/pkginfo/%.version, \ + $(filter-out $(BUILD_PACKAGES), $(sort $(foreach dep4, \ + $(sort $(foreach dep3, \ + $(sort $(foreach dep2, \ + $(sort $(foreach dep1, \ + $(sort $(foreach dep0, \ + $(Package/$(1)/depends), \ + $(Package/$(dep0)/depends) $(dep0) \ + )), \ + $(Package/$(dep1)/depends) $(dep1) \ + )), \ + $(Package/$(dep2)/depends) $(dep2) \ + )), \ + $(Package/$(dep3)/depends) $(dep3) \ + )), \ + $(Package/$(dep4)/depends) $(dep4) \ + ))) \ + )) + + +PKG_DIR_NAME:=$(lastword $(subst /,$(space),$(CURDIR))) +STAMP_NO_AUTOREBUILD=$(wildcard $(PKG_BUILD_DIR)/.no_autorebuild) +PREV_STAMP_PREPARED:=$(if $(STAMP_NO_AUTOREBUILD),$(wildcard $(PKG_BUILD_DIR)/.prepared*)) +ifneq ($(PREV_STAMP_PREPARED),) + STAMP_PREPARED:=$(PREV_STAMP_PREPARED) + CONFIG_AUTOREBUILD:= +else + STAMP_PREPARED=$(PKG_BUILD_DIR)/.prepared$(if $(QUILT)$(DUMP),,_$(shell $(call $(if $(CONFIG_AUTOREMOVE),find_md5_reproducible,find_md5),${CURDIR} $(PKG_FILE_DEPENDS),))_$(call confvar,CONFIG_AUTOREMOVE $(PKG_PREPARED_DEPENDS))) +endif +STAMP_CONFIGURED=$(PKG_BUILD_DIR)/.configured$(if $(DUMP),,_$(call confvar,$(PKG_CONFIG_DEPENDS))) +STAMP_CONFIGURED_WILDCARD=$(PKG_BUILD_DIR)/.configured_* +STAMP_BUILT:=$(PKG_BUILD_DIR)/.built +STAMP_INSTALLED:=$(STAGING_DIR)/stamp/.$(PKG_DIR_NAME)$(if $(BUILD_VARIANT),.$(BUILD_VARIANT),)_installed + +STAGING_FILES_LIST:=$(PKG_DIR_NAME)$(if $(BUILD_VARIANT),.$(BUILD_VARIANT),).list + +define CleanStaging + rm -f $(STAMP_INSTALLED) + @-(\ + if [ -f $(STAGING_DIR)/packages/$(STAGING_FILES_LIST) ]; then \ + $(SCRIPT_DIR)/clean-package.sh \ + "$(STAGING_DIR)/packages/$(STAGING_FILES_LIST)" \ + "$(STAGING_DIR)"; \ + fi; \ + ) +endef + + +PKG_INSTALL_STAMP:=$(PKG_INFO_DIR)/$(PKG_DIR_NAME).$(if $(BUILD_VARIANT),$(BUILD_VARIANT),default).install + +include $(INCLUDE_DIR)/package-defaults.mk +include $(INCLUDE_DIR)/package-dumpinfo.mk +include $(INCLUDE_DIR)/package-ipkg.mk +include $(INCLUDE_DIR)/package-bin.mk +include $(INCLUDE_DIR)/autotools.mk + +_pkg_target:=$(if $(QUILT),,.) + +override MAKEFLAGS= +CONFIG_SITE:=$(INCLUDE_DIR)/site/$(ARCH) +CUR_MAKEFILE:=$(filter-out Makefile,$(firstword $(MAKEFILE_LIST))) +SUBMAKE:=$(NO_TRACE_MAKE) $(if $(CUR_MAKEFILE),-f $(CUR_MAKEFILE)) +PKG_CONFIG_PATH=$(STAGING_DIR)/usr/lib/pkgconfig:$(STAGING_DIR)/usr/share/pkgconfig +unexport QUIET CONFIG_SITE + +ifeq ($(DUMP)$(filter prereq clean refresh update,$(MAKECMDGOALS)),) + ifneq ($(if $(QUILT),,$(CONFIG_AUTOREBUILD)),) + define Build/Autoclean + $(PKG_BUILD_DIR)/.dep_files: $(STAMP_PREPARED) + $(call rdep,${CURDIR} $(PKG_FILE_DEPENDS),$(STAMP_PREPARED),$(PKG_BUILD_DIR)/.dep_files,-x "*/.dep_*") + $(if $(filter prepare,$(MAKECMDGOALS)),,$(call rdep,$(PKG_BUILD_DIR),$(STAMP_BUILT),,-x "*/.dep_*" -x "*/ipkg*")) + endef + endif +endif + +ifdef USE_GIT_SRC_CHECKOUT + define Build/Prepare/Default + mkdir -p $(PKG_BUILD_DIR) + ln -s $(TOPDIR)/git-src/$(PKG_NAME)/.git $(PKG_BUILD_DIR)/.git + ( cd $(PKG_BUILD_DIR); \ + git checkout .; \ + git submodule update --recursive; \ + git submodule foreach git config --unset core.worktree; \ + git submodule foreach git checkout .; \ + ) + endef +endif +ifdef USE_GIT_TREE + define Build/Prepare/Default + mkdir -p $(PKG_BUILD_DIR) + ln -s $(CURDIR)/git-src $(PKG_BUILD_DIR)/.git + ( cd $(PKG_BUILD_DIR); \ + git checkout .; \ + git submodule update --recursive; \ + git submodule foreach git config --unset core.worktree; \ + git submodule foreach git checkout .; \ + ) + endef +endif +ifdef USE_SOURCE_DIR + define Build/Prepare/Default + rm -rf $(PKG_BUILD_DIR) + $(if $(wildcard $(USE_SOURCE_DIR)/*),,@echo "Error: USE_SOURCE_DIR=$(USE_SOURCE_DIR) path not found"; false) + ln -snf $(USE_SOURCE_DIR) $(PKG_BUILD_DIR) + touch $(PKG_BUILD_DIR)/.source_dir + endef +endif + +define Build/Exports/Default + $(1) : export ACLOCAL_INCLUDE=$$(foreach p,$$(wildcard $$(STAGING_DIR)/usr/share/aclocal $$(STAGING_DIR)/usr/share/aclocal-* $$(STAGING_DIR_HOSTPKG)/share/aclocal $$(STAGING_DIR_HOSTPKG)/share/aclocal-* $$(STAGING_DIR)/host/share/aclocal $$(STAGING_DIR)/host/share/aclocal-*),-I $$(p)) + $(1) : export STAGING_PREFIX=$$(STAGING_DIR)/usr + $(1) : export PATH=$$(TARGET_PATH_PKG) + $(1) : export CONFIG_SITE:=$$(CONFIG_SITE) + $(1) : export PKG_CONFIG_PATH:=$$(PKG_CONFIG_PATH) + $(1) : export PKG_CONFIG_LIBDIR:=$$(PKG_CONFIG_PATH) + $(1) : export GIT_CEILING_DIRECTORIES:=$$(BUILD_DIR) +endef +Build/Exports=$(Build/Exports/Default) + +define Build/CoreTargets + STAMP_PREPARED:=$$(STAMP_PREPARED) + STAMP_CONFIGURED:=$$(STAMP_CONFIGURED) + + $(if $(QUILT),$(Build/Quilt)) + $(call Build/Autoclean) + $(call DefaultTargets) + + $(call check_download_integrity) + + download: + $(foreach hook,$(Hooks/Download), + $(call $(hook))$(sep) + ) + + $(STAMP_PREPARED) : export PATH=$$(TARGET_PATH_PKG) + $(STAMP_PREPARED): $(STAMP_PREPARED_DEPENDS) + @-rm -rf $(PKG_BUILD_DIR) + @mkdir -p $(PKG_BUILD_DIR) + touch $$@_check + $(foreach hook,$(Hooks/Prepare/Pre),$(call $(hook))$(sep)) + $(Build/Prepare) + $(foreach hook,$(Hooks/Prepare/Post),$(call $(hook))$(sep)) + touch $$@ + + $(call Build/Exports,$(STAMP_CONFIGURED)) + $(STAMP_CONFIGURED): $(STAMP_PREPARED) $(STAMP_CONFIGURED_DEPENDS) + rm -f $(STAMP_CONFIGURED_WILDCARD) + $(CleanStaging) + $(foreach hook,$(Hooks/Configure/Pre),$(call $(hook))$(sep)) + $(Build/Configure) + $(foreach hook,$(Hooks/Configure/Post),$(call $(hook))$(sep)) + touch $$@ + + $(call Build/Exports,$(STAMP_BUILT)) + $(STAMP_BUILT): $(STAMP_CONFIGURED) $(STAMP_BUILT_DEPENDS) + rm -f $$@ + touch $$@_check + $(foreach hook,$(Hooks/Compile/Pre),$(call $(hook))$(sep)) + $(Build/Compile) + $(foreach hook,$(Hooks/Compile/Post),$(call $(hook))$(sep)) + $(Build/Install) + $(foreach hook,$(Hooks/Install/Post),$(call $(hook))$(sep)) + touch $$@ + + $(STAMP_INSTALLED) : export PATH=$$(TARGET_PATH_PKG) + $(STAMP_INSTALLED): $(STAMP_BUILT) + rm -rf $(TMP_DIR)/stage-$(PKG_DIR_NAME) + mkdir -p $(TMP_DIR)/stage-$(PKG_DIR_NAME)/host $(STAGING_DIR)/packages + $(foreach hook,$(Hooks/InstallDev/Pre),\ + $(call $(hook),$(TMP_DIR)/stage-$(PKG_DIR_NAME),$(TMP_DIR)/stage-$(PKG_DIR_NAME)/host)$(sep)\ + ) + $(call Build/InstallDev,$(TMP_DIR)/stage-$(PKG_DIR_NAME),$(TMP_DIR)/stage-$(PKG_DIR_NAME)/host) + $(foreach hook,$(Hooks/InstallDev/Post),\ + $(call $(hook),$(TMP_DIR)/stage-$(PKG_DIR_NAME),$(TMP_DIR)/stage-$(PKG_DIR_NAME)/host)$(sep)\ + ) + if [ -f $(STAGING_DIR)/packages/$(STAGING_FILES_LIST) ]; then \ + $(SCRIPT_DIR)/clean-package.sh \ + "$(STAGING_DIR)/packages/$(STAGING_FILES_LIST)" \ + "$(STAGING_DIR)"; \ + fi + if [ -d $(TMP_DIR)/stage-$(PKG_DIR_NAME) ]; then \ + (cd $(TMP_DIR)/stage-$(PKG_DIR_NAME); find ./ > $(TMP_DIR)/stage-$(PKG_DIR_NAME).files); \ + $(call locked, \ + mv $(TMP_DIR)/stage-$(PKG_DIR_NAME).files $(STAGING_DIR)/packages/$(STAGING_FILES_LIST) && \ + $(CP) $(TMP_DIR)/stage-$(PKG_DIR_NAME)/* $(STAGING_DIR)/; \ + ,staging-dir); \ + fi + rm -rf $(TMP_DIR)/stage-$(PKG_DIR_NAME) + touch $$@ + + ifdef Build/InstallDev + $(_pkg_target)compile: $(STAMP_INSTALLED) + endif + + $(_pkg_target)prepare: $(STAMP_PREPARED) + $(_pkg_target)configure: $(STAMP_CONFIGURED) + $(_pkg_target)dist: $(STAMP_CONFIGURED) + $(_pkg_target)distcheck: $(STAMP_CONFIGURED) + + ifneq ($(CONFIG_AUTOREMOVE),) + compile: + -touch -r $(PKG_BUILD_DIR)/.built $(PKG_BUILD_DIR)/.autoremove 2>/dev/null >/dev/null + $(FIND) $(PKG_BUILD_DIR) -mindepth 1 -maxdepth 1 -not '(' -type f -and -name '.*' -and -size 0 ')' -and -not -name '.pkgdir' -print0 | \ + $(XARGS) -0 rm -rf + endif +endef + +define Build/DefaultTargets + $(if $(PKG_SKIP_DOWNLOAD),,$(if $(strip $(PKG_SOURCE_URL)),$(call Download,default))) + $(if $(DUMP),,$(Build/CoreTargets)) + + define Build/DefaultTargets + endef +endef + +define BuildPackage + $(eval $(Package/Default)) + $(eval $(Package/$(1))) + +ifdef DESCRIPTION +$$(error DESCRIPTION:= is obsolete, use Package/PKG_NAME/description) +endif + +ifndef Package/$(1)/description +define Package/$(1)/description + $(TITLE) +endef +endif + + BUILD_PACKAGES += $(1) + $(STAMP_PREPARED): $$(if $(QUILT)$(DUMP),,$(call find_library_dependencies,$(1))) + + $(foreach FIELD, TITLE CATEGORY SECTION VERSION, + ifeq ($($(FIELD)),) + $$(error Package/$(1) is missing the $(FIELD) field) + endif + ) + + $(if $(DUMP), \ + $(if $(CHECK),,$(Dumpinfo/Package)), \ + $(foreach target, \ + $(if $(Package/$(1)/targets),$(Package/$(1)/targets), \ + $(if $(PKG_TARGETS),$(PKG_TARGETS), ipkg) \ + ), $(BuildTarget/$(target)) \ + ) \ + ) + $(if $(PKG_HOST_ONLY),,$(call Build/DefaultTargets,$(1))) +endef + +define pkg_install_files + $(foreach install_file,$(1),$(INSTALL_DIR) $(3)/`dirname $(install_file)`; $(INSTALL_DATA) $(2)/$(install_file) $(3)/`dirname $(install_file)`;) +endef + +define pkg_install_bin + $(foreach install_apps,$(1),$(INSTALL_DIR) $(3)/`dirname $(install_apps)`; $(INSTALL_BIN) $(2)/$(install_apps) $(3)/`dirname $(install_apps)`;) +endef + +Build/Prepare=$(call Build/Prepare/Default,) +Build/Configure=$(call Build/Configure/Default,) +Build/Compile=$(call Build/Compile/Default,) +Build/Install=$(if $(PKG_INSTALL),$(call Build/Install/Default,)) +Build/Dist=$(call Build/Dist/Default,) +Build/DistCheck=$(call Build/DistCheck/Default,) + +.NOTPARALLEL: + +.PHONY: prepare-package-install +prepare-package-install: + @mkdir -p $(PKG_INFO_DIR) + @rm -f $(PKG_INSTALL_STAMP) + @echo "$(filter-out essential nonshared,$(PKG_FLAGS))" > $(PKG_INSTALL_STAMP).flags + +$(PACKAGE_DIR): + mkdir -p $@ + +compile: +.install: .compile +install: compile + +force-clean-build: FORCE + rm -rf $(PKG_BUILD_DIR) + +clean-build: $(if $(wildcard $(PKG_BUILD_DIR)/.autoremove),force-clean-build) + +clean: force-clean-build + $(CleanStaging) + $(call Build/UninstallDev,$(STAGING_DIR),$(STAGING_DIR)/host) + $(Build/Clean) + rm -f $(STAGING_DIR)/packages/$(STAGING_FILES_LIST) + +dist: + $(Build/Dist) + +distcheck: + $(Build/DistCheck) diff --git a/include/prereq-build.mk b/include/prereq-build.mk new file mode 100644 index 0000000..94fc0f8 --- /dev/null +++ b/include/prereq-build.mk @@ -0,0 +1,240 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/prereq.mk + +SHELL:=sh +PKG_NAME:=Build dependency + +$(eval $(call TestHostCommand,true, \ + Please install GNU 'coreutils', \ + $(TRUE))) + +$(eval $(call TestHostCommand,false, \ + Please install GNU 'coreutils', \ + $(FALSE); [ $$$$$$$$? = 1 ] && $(TRUE))) + +# Required for the toolchain +$(eval $(call TestHostCommand,working-make, \ + Please install GNU make v4.1 or later., \ + $(MAKE) -v | grep -E 'Make (4\.[1-9]|[5-9]\.)')) + +$(eval $(call TestHostCommand,case-sensitive-fs, \ + OpenWrt can only be built on a case-sensitive filesystem, \ + rm -f $(TMP_DIR)/test.*; touch $(TMP_DIR)/test.fs; \ + test ! -f $(TMP_DIR)/test.FS)) + +$(eval $(call TestHostCommand,proper-umask, \ + Please build with umask 022 - other values produce broken packages, \ + umask | grep -xE 0?0[012][012])) + +ifndef IB +$(eval $(call SetupHostCommand,gcc, \ + Please install the GNU C Compiler (gcc) 6 or later, \ + $(CC) -dumpversion | grep -E '^([6-9]\.?|1[0-9]\.?)', \ + gcc -dumpversion | grep -E '^([6-9]\.?|1[0-9]\.?)', \ + gcc --version | grep -E 'Apple.(LLVM|clang)' )) + +$(eval $(call TestHostCommand,working-gcc, \ + Please reinstall the GNU C Compiler (6 or later) - \ + it appears to be broken, \ + echo 'int main(int argc, char **argv) { return 0; }' | \ + gcc -x c -o $(TMP_DIR)/a.out -)) + +$(eval $(call SetupHostCommand,g++, \ + Please install the GNU C++ Compiler (g++) 6 or later, \ + $(CXX) -dumpversion | grep -E '^([6-9]\.?|1[0-9]\.?)', \ + g++ -dumpversion | grep -E '^([6-9]\.?|1[0-9]\.?)', \ + g++ --version | grep -E 'Apple.(LLVM|clang)' )) + +$(eval $(call TestHostCommand,working-g++, \ + Please reinstall the GNU C++ Compiler (6 or later) - \ + it appears to be broken, \ + echo 'int main(int argc, char **argv) { return 0; }' | \ + g++ -x c++ -o $(TMP_DIR)/a.out - -lstdc++ && \ + $(TMP_DIR)/a.out)) + +$(eval $(call RequireCHeader,ncurses.h, \ + Please install ncurses. (Missing libncurses.so or ncurses.h), \ + initscr(), -lncurses)) + +$(eval $(call SetupHostCommand,git,Please install Git (git-core) >= 1.7.12.2, \ + git --exec-path | xargs -I % -- grep -q -- --recursive %/git-submodule, \ + git submodule --help | grep -- --recursive)) + +$(eval $(call SetupHostCommand,rsync,Please install 'rsync', \ + rsync --version &1 | grep GNU, \ + gnutar --version 2>&1 | grep GNU, \ + tar --version 2>&1 | grep GNU)) + +$(eval $(call SetupHostCommand,find,Please install GNU 'find', \ + gfind --version 2>&1 | grep GNU, \ + find --version 2>&1 | grep GNU)) + +$(eval $(call SetupHostCommand,bash,Please install GNU 'bash', \ + bash --version 2>&1 | grep GNU)) + +$(eval $(call SetupHostCommand,xargs, \ + Please install 'xargs' that supports '-r/--no-run-if-empty', \ + gxargs -r --version, \ + xargs -r --version)) + +$(eval $(call SetupHostCommand,patch,Please install GNU 'patch', \ + gpatch --version 2>&1 | grep 'Free Software Foundation', \ + patch --version 2>&1 | grep 'Free Software Foundation')) + +$(eval $(call SetupHostCommand,diff,Please install GNU diffutils, \ + gdiff --version 2>&1 | grep GNU, \ + diff --version 2>&1 | grep GNU)) + +$(eval $(call SetupHostCommand,cp,Please install GNU fileutils, \ + gcp --help 2>&1 | grep 'Copy SOURCE', \ + cp --help 2>&1 | grep 'Copy SOURCE')) + +$(eval $(call SetupHostCommand,seq,Please install seq, \ + gseq --version, \ + seq --version 2>&1 | grep seq)) + +$(eval $(call SetupHostCommand,awk,Please install GNU 'awk', \ + gawk --version 2>&1 | grep GNU, \ + awk --version 2>&1 | grep GNU)) + +$(eval $(call SetupHostCommand,grep,Please install GNU 'grep', \ + ggrep --version 2>&1 | grep GNU, \ + grep --version 2>&1 | grep GNU)) + +$(eval $(call SetupHostCommand,egrep,Please install GNU 'grep', \ + gegrep --version 2>&1 | grep GNU, \ + egrep --version 2>&1 | grep GNU)) + +$(eval $(call SetupHostCommand,getopt, \ + Please install an extended getopt version that supports --long, \ + gnugetopt -o t --long test -- --test | grep '^ *--test *--', \ + getopt -o t --long test -- --test | grep '^ *--test *--', \ + /usr/local/opt/gnu-getopt/bin/getopt -o t --long test -- --test | grep '^ *--test *--', \ + /opt/local/bin/getopt -o t --long test -- --test | grep '^ *--test *--')) + +$(eval $(call SetupHostCommand,realpath,Please install a 'realpath' utility, \ + grealpath /, \ + realpath /)) + +$(eval $(call SetupHostCommand,stat,Cannot find a file stat utility, \ + gnustat -c%s $(TOPDIR)/Makefile, \ + gstat -c%s $(TOPDIR)/Makefile, \ + stat -c%s $(TOPDIR)/Makefile)) + +$(eval $(call SetupHostCommand,gzip,Please install 'gzip', \ + gzip --version &1 | grep zipfile, \ + unzip)) + +$(eval $(call SetupHostCommand,bzip2,Please install 'bzip2', \ + bzip2 --version = 3.6, \ + python3.12 -V 2>&1 | grep 'Python 3', \ + python3.11 -V 2>&1 | grep 'Python 3', \ + python3.10 -V 2>&1 | grep 'Python 3', \ + python3.9 -V 2>&1 | grep 'Python 3', \ + python3.8 -V 2>&1 | grep 'Python 3', \ + python3.7 -V 2>&1 | grep 'Python 3', \ + python3.6 -V 2>&1 | grep 'Python 3', \ + python3 -V 2>&1 | grep -E 'Python 3\.([6-9]|[0-9][0-9])\.?')) + +$(eval $(call SetupHostCommand,python3,Please install Python >= 3.6, \ + python3.12 -V 2>&1 | grep 'Python 3', \ + python3.11 -V 2>&1 | grep 'Python 3', \ + python3.10 -V 2>&1 | grep 'Python 3', \ + python3.9 -V 2>&1 | grep 'Python 3', \ + python3.8 -V 2>&1 | grep 'Python 3', \ + python3.7 -V 2>&1 | grep 'Python 3', \ + python3.6 -V 2>&1 | grep 'Python 3', \ + python3 -V 2>&1 | grep -E 'Python 3\.([6-9]|[0-9][0-9])\.?')) + +$(eval $(call TestHostCommand,python3-distutils, \ + Please install the Python3 distutils module, \ + printf 'from sys import version_info\nif version_info < (3, 12):\n\tfrom distutils import util' | \ + $(STAGING_DIR_HOST)/bin/python3 -)) + +$(eval $(call TestHostCommand,python3-stdlib, \ + Please install the Python3 stdlib module, \ + $(STAGING_DIR_HOST)/bin/python3 -c 'import ntpath')) + +$(eval $(call SetupHostCommand,file,Please install the 'file' package, \ + file --version 2>&1 | grep file)) + +$(eval $(call SetupHostCommand,which,Please install 'which', \ + /usr/bin/which which, \ + /bin/which which, \ + which which)) + +ifeq ($(HOST_OS),Linux) + $(eval $(call RequireCHeader,argp.h, \ + Missing argp.h Please install the argp-standalone package if musl libc)) + + $(eval $(call RequireCHeader,fts.h, \ + Missing fts.h Please install the musl-fts-dev package if musl libc)) + + $(eval $(call RequireCHeader,obstack.h, \ + Missing obstack.h Please install the musl-obstack-dev package if musl libc)) + + $(eval $(call RequireCHeader,libintl.h, \ + Missing libintl.h Please install the musl-libintl package if musl libc)) +endif + +$(STAGING_DIR_HOST)/bin/mkhash: $(SCRIPT_DIR)/mkhash.c + mkdir -p $(dir $@) + $(CC) -O2 -I$(TOPDIR)/tools/include -o $@ $< + +$(STAGING_DIR_HOST)/bin/xxd: $(SCRIPT_DIR)/xxdi.pl + $(LN) $< $@ + +prereq: $(STAGING_DIR_HOST)/bin/mkhash $(STAGING_DIR_HOST)/bin/xxd + +# Install ldconfig stub +$(eval $(call TestHostCommand,ldconfig-stub,Failed to install stub, \ + $(LN) $(firstword $(wildcard /bin/true /usr/bin/true)) $(STAGING_DIR_HOST)/bin/ldconfig)) diff --git a/include/prereq.mk b/include/prereq.mk new file mode 100644 index 0000000..9f1ff70 --- /dev/null +++ b/include/prereq.mk @@ -0,0 +1,125 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +ifneq ($(__prereq_inc),1) +__prereq_inc:=1 + +prereq: + if [ -f $(TMP_DIR)/.prereq-error ]; then \ + echo; \ + cat $(TMP_DIR)/.prereq-error; \ + rm -f $(TMP_DIR)/.prereq-error; \ + echo; \ + false; \ + fi + +.SILENT: prereq +endif + +PREREQ_PREV= + +# 1: display name +# 2: error message +define Require + export PREREQ_CHECK=1 + ifeq ($$(CHECK_$(1)),) + prereq: prereq-$(1) + + prereq-$(1): $(if $(PREREQ_PREV),prereq-$(PREREQ_PREV)) FORCE + printf "Checking '$(1)'... " + if $(NO_TRACE_MAKE) -f $(firstword $(MAKEFILE_LIST)) check-$(1) PATH="$(ORIG_PATH)" >/dev/null 2>/dev/null; then \ + echo 'ok.'; \ + elif $(NO_TRACE_MAKE) -f $(firstword $(MAKEFILE_LIST)) check-$(1) PATH="$(ORIG_PATH)" >/dev/null 2>/dev/null; then \ + echo 'updated.'; \ + else \ + echo 'failed.'; \ + echo "$(PKG_NAME): $(strip $(2))" >> $(TMP_DIR)/.prereq-error; \ + fi + + check-$(1): FORCE + $(call Require/$(1)) + CHECK_$(1):=1 + + .SILENT: prereq-$(1) check-$(1) + .NOTPARALLEL: + endif + + PREREQ_PREV=$(1) +endef + + +define RequireCommand + define Require/$(1) + command -v $(1) + endef + + $$(eval $$(call Require,$(1),$(2))) +endef + +define RequireHeader + define Require/$(1) + [ -e "$(1)" ] + endef + + $$(eval $$(call Require,$(1),$(2))) +endef + +# 1: header to test +# 2: failure message +# 3: optional compile time test +# 4: optional link library test (example -lncurses) +define RequireCHeader + define Require/$(1) + echo 'int main(int argc, char **argv) { $(3); return 0; }' | gcc -include $(1) -x c -o $(TMP_DIR)/a.out - $(4) + endef + + $$(eval $$(call Require,$(1),$(2))) +endef + +define QuoteHostCommand +'$(subst ','"'"',$(strip $(1)))' +endef + +# 1: display name +# 2: failure message +# 3: test +define TestHostCommand + define Require/$(1) + ($(3)) >/dev/null 2>/dev/null + endef + + $$(eval $$(call Require,$(1),$(2))) +endef + +# 1: canonical name +# 2: failure message +# 3+: candidates +define SetupHostCommand + define Require/$(1) + mkdir -p "$(STAGING_DIR_HOST)/bin"; \ + for cmd in $(call QuoteHostCommand,$(3)) $(call QuoteHostCommand,$(4)) \ + $(call QuoteHostCommand,$(5)) $(call QuoteHostCommand,$(6)) \ + $(call QuoteHostCommand,$(7)) $(call QuoteHostCommand,$(8)) \ + $(call QuoteHostCommand,$(9)) $(call QuoteHostCommand,$(10)) \ + $(call QuoteHostCommand,$(11)) $(call QuoteHostCommand,$(12)); do \ + if [ -n "$$$$$$$$cmd" ]; then \ + bin="$$$$$$$$(command -v "$$$$$$$${cmd%% *}")"; \ + if [ -x "$$$$$$$$bin" ] && eval "$$$$$$$$cmd" >/dev/null 2>/dev/null; then \ + case "$$$$$$$$(ls -dl -- $(STAGING_DIR_HOST)/bin/$(strip $(1)))" in \ + "-"* | \ + *" -> $$$$$$$$bin"* | \ + *" -> "[!/]*) \ + [ -x "$(STAGING_DIR_HOST)/bin/$(strip $(1))" ] && exit 0 \ + ;; \ + esac; \ + ln -sf "$$$$$$$$bin" "$(STAGING_DIR_HOST)/bin/$(strip $(1))"; \ + exit 0; \ + fi; \ + fi; \ + done; \ + exit 1 + endef + + $$(eval $$(call Require,$(1),$(if $(2),$(2),Missing $(1) command))) +endef diff --git a/include/quilt.mk b/include/quilt.mk new file mode 100644 index 0000000..a58390f --- /dev/null +++ b/include/quilt.mk @@ -0,0 +1,184 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2007-2020 OpenWrt.org + +ifeq ($(TARGET_BUILD),1) + PKG_BUILD_DIR:=$(LINUX_DIR) +endif + +ifneq ($(filter host-refresh refresh,$(MAKECMDGOALS)),) + override QUILT=1 + override HOST_QUILT=1 +endif + +ifneq ($(PKG_BUILD_DIR),) + QUILT?=$(if $(wildcard $(PKG_BUILD_DIR)/.quilt_used),y) + ifneq ($(QUILT),) + STAMP_CHECKED:=$(PKG_BUILD_DIR)/.quilt_checked + override CONFIG_AUTOREBUILD= + override CONFIG_AUTOREMOVE= + quilt-check: $(STAMP_CHECKED) + endif +endif + +ifneq ($(HOST_BUILD_DIR),) + HOST_QUILT?=$(if $(findstring command,$(origin QUILT)),$(QUILT),$(if $(wildcard $(HOST_BUILD_DIR)/.quilt_used),y)) + ifneq ($(HOST_QUILT),) + HOST_STAMP_CHECKED:=$(HOST_BUILD_DIR)/.quilt_checked + override CONFIG_AUTOREBUILD= + override CONFIG_AUTOREMOVE= + host-quilt-check: $(HOST_STAMP_CHECKED) + endif +endif + +ifneq ($(if $(DUMP),1,$(__quilt_inc)),1) +__quilt_inc:=1 + +PATCH_DIR?=$(CURDIR)/patches +FILES_DIR?=$(CURDIR)/files +HOST_PATCH_DIR?=$(PATCH_DIR) +HOST_FILES_DIR?=$(FILES_DIR) + +QUILT_CMD:=quilt --quiltrc=- + +define filter_series +sed -e s,\\\#.*,, $(1) | grep -E \[a-zA-Z0-9\] +endef + +define PatchDir/Quilt + @mkdir -p "$(1)/patches$(if $(3),/$(patsubst %/,%,$(3)))" + @if [ -s "$(2)/series" ]; then \ + mkdir -p "$(1)/patches/$(3)"; \ + cp "$(2)/series" "$(1)/patches/$(3)"; \ + fi + @for patch in $$$$( (cd "$(2)" && if [ -f series ]; then $(call filter_series,series); else ls | sort; fi; ) 2>/dev/null ); do ( \ + cp "$(2)/$$$$patch" "$(1)/patches/$(3)"; \ + echo "$(3)$$$$patch" >> "$(1)/patches/series"; \ + ); done + $(if $(3),@echo $(3) >> "$(1)/patches/.subdirs") +endef + +define PatchDir/Default + @if [ -d "$(2)" ] && [ "$$$$(ls $(2) | wc -l)" -gt 0 ]; then \ + export PATCH="$(PATCH)"; \ + if [ -s "$(2)/series" ]; then \ + $(call filter_series,$(2)/series) | xargs -n1 \ + $(KPATCH) "$(1)" "$(2)"; \ + else \ + $(KPATCH) "$(1)" "$(2)"; \ + fi; \ + fi +endef + +define PatchDir +$(call PatchDir/$(if $(strip $(QUILT)),Quilt,Default),$(strip $(1)),$(strip $(2)),$(strip $(3))) +endef + +define HostPatchDir +$(call PatchDir/$(if $(strip $(HOST_QUILT)),Quilt,Default),$(strip $(1)),$(strip $(2)),$(strip $(3))) +endef + +define Host/Patch/Default + $(if $(HOST_QUILT),rm -rf $(HOST_BUILD_DIR)/patches; mkdir -p $(HOST_BUILD_DIR)/patches) + $(call HostPatchDir,$(HOST_BUILD_DIR),$(HOST_PATCH_DIR),) + $(if $(HOST_QUILT),touch $(HOST_BUILD_DIR)/.quilt_used) +endef + +define Build/Patch/Default + $(if $(QUILT),rm -rf $(PKG_BUILD_DIR)/patches; mkdir -p $(PKG_BUILD_DIR)/patches) + $(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR),) + $(if $(QUILT),touch $(PKG_BUILD_DIR)/.quilt_used) +endef + +kernel_files=$(foreach fdir,$(GENERIC_FILES_DIR) $(FILES_DIR),$(fdir)/.) +define Kernel/Patch/Default + $(if $(QUILT),rm -rf $(LINUX_DIR)/patches; mkdir -p $(LINUX_DIR)/patches) + $(if $(kernel_files),$(CP) $(kernel_files) $(LINUX_DIR)/) + find $(LINUX_DIR)/ -name \*.rej -or -name \*.orig | $(XARGS) rm -f + if [ -d $(GENERIC_PLATFORM_DIR)/patches$(if $(wildcard $(GENERIC_PLATFORM_DIR)/patches-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER)) ]; then \ + echo "generic patches directory is present. please move your patches to the pending directory" ; \ + exit 1; \ + fi + $(call PatchDir,$(LINUX_DIR),$(GENERIC_BACKPORT_DIR),generic-backport/) + $(call PatchDir,$(LINUX_DIR),$(GENERIC_PATCH_DIR),generic/) + $(call PatchDir,$(LINUX_DIR),$(GENERIC_HACK_DIR),generic-hack/) + $(call PatchDir,$(LINUX_DIR),$(PATCH_DIR),platform/) +endef + +define Quilt/RefreshDir + -rm -rf $(2) 2>/dev/null >/dev/null + [ -f $(1)/.quilt_no_patch ] || mkdir -p $(2) + @[ -f $(1)/.quilt_no_patch ] || { \ + for patch in $$$$($(if $(3),grep "^$(3)",cat) $(1)/patches/series | awk '{print $$$$1}'); do \ + $(CP) -v "$(1)/patches/$$$$patch" $(2); \ + done; \ + } + @-rm -f $(1)/.quilt_no_patch 2>/dev/null >/dev/null; +endef + +define Quilt/Refresh/Host + $(call Quilt/RefreshDir,$(HOST_BUILD_DIR),$(HOST_PATCH_DIR)) +endef + +define Quilt/Refresh/Package + $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)) +endef + +define Quilt/Refresh/Kernel + @[ -z "$$(grep -v '^generic/' $(PKG_BUILD_DIR)/patches/series | grep -v '^platform/')" ] || { \ + echo "All kernel patches must start with either generic/ or platform/"; \ + false; \ + } + $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(GENERIC_BACKPORT_DIR),generic-backport/) + $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(GENERIC_PATCH_DIR),generic/) + $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(GENERIC_HACK_DIR),generic-hack/) + $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR),platform/) +endef + +define Quilt/Template + $($(2)STAMP_CONFIGURED): $($(2)STAMP_CHECKED) + $(if $(NO_RECONFIGURE),$($(2)STAMP_BUILT),$($(2)STAMP_CONFIGURED)): FORCE + $($(2)STAMP_CHECKED): $($(2)STAMP_PREPARED) + if [ -s "$(1)/patches/series" ]; then \ + (cd "$(1)"; \ + if $(QUILT_CMD) next >/dev/null 2>&1; then \ + $(QUILT_CMD) push -a; \ + else \ + $(QUILT_CMD) top >/dev/null 2>&1; \ + fi \ + ); \ + fi + touch "$$@" + + $(3)quilt-check: $($(2)STAMP_PREPARED) FORCE + @[ -f "$(1)/.quilt_used" ] || { \ + echo "The source directory was not unpacked using quilt. Please rebuild with QUILT=1"; \ + false; \ + } + @[ -f "$(1)/patches/series" ] || { \ + echo "The source directory contains no quilt patches."; \ + touch $(1)/patches/series $(1)/.quilt_no_patch; \ + } + @[ -n "$$$$(ls $(1)/patches/series)" -o \ + "$$$$(cat $(1)/patches/series | $(MKHASH) md5)" = "$$(sort $(1)/patches/series | $(MKHASH) md5)" ] || { \ + echo "The patches are not sorted in the right order. Please fix."; \ + false; \ + } + + $(3)refresh: $(3)quilt-check + @[ -f $(1)/.quilt_no_patch ] || { \ + cd "$(1)"; $(QUILT_CMD) pop -a -f >/dev/null 2>/dev/null; \ + while $(QUILT_CMD) next 2>/dev/null >/dev/null && $(QUILT_CMD) push; do \ + QUILT_DIFF_OPTS="-p" $(QUILT_CMD) refresh -p ab --no-index --no-timestamps; \ + done; ! $(QUILT_CMD) next 2>/dev/null >/dev/null; \ + } + $(Quilt/Refresh/$(4)) + + $(3)update: $(3)quilt-check + $(Quilt/Refresh/$(4)) +endef + +Build/Quilt=$(call Quilt/Template,$(PKG_BUILD_DIR),,,$(if $(TARGET_BUILD),Kernel,Package)) +Host/Quilt=$(call Quilt/Template,$(HOST_BUILD_DIR),HOST_,host-,Host) + +endif diff --git a/include/rootfs.mk b/include/rootfs.mk new file mode 100644 index 0000000..f2ed648 --- /dev/null +++ b/include/rootfs.mk @@ -0,0 +1,101 @@ +ifdef CONFIG_USE_MKLIBS + define mklibs + rm -rf $(TMP_DIR)/mklibs-progs $(TMP_DIR)/mklibs-out + # first find all programs and add them to the mklibs list + find $(STAGING_DIR_ROOT) -type f -perm /100 -exec \ + file -r -N -F '' {} + | \ + awk ' /executable.*dynamically/ { print $$1 }' > $(TMP_DIR)/mklibs-progs + # find all loadable objects that are not regular libraries and add them to the list as well + find $(STAGING_DIR_ROOT) -type f -name \*.so\* -exec \ + file -r -N -F '' {} + | \ + awk ' /shared object/ { print $$1 }' > $(TMP_DIR)/mklibs-libs + mkdir -p $(TMP_DIR)/mklibs-out + $(STAGING_DIR_HOST)/bin/mklibs -D \ + -d $(TMP_DIR)/mklibs-out \ + --sysroot $(STAGING_DIR_ROOT) \ + `cat $(TMP_DIR)/mklibs-libs | sed 's:/*[^/]\+/*$$::' | uniq | sed 's:^$(STAGING_DIR_ROOT):-L :'` \ + --ldlib $(patsubst $(STAGING_DIR_ROOT)/%,/%,$(firstword $(wildcard \ + $(foreach name,ld-uClibc.so.* ld-linux.so.* ld-*.so ld-musl-*.so.*, \ + $(STAGING_DIR_ROOT)/lib/$(name) \ + )))) \ + --target $(REAL_GNU_TARGET_NAME) \ + `cat $(TMP_DIR)/mklibs-progs $(TMP_DIR)/mklibs-libs` 2>&1 + $(RSTRIP) $(TMP_DIR)/mklibs-out + for lib in `ls $(TMP_DIR)/mklibs-out/*.so.* 2>/dev/null`; do \ + LIB="$${lib##*/}"; \ + DEST="`ls "$(1)/lib/$$LIB" "$(1)/usr/lib/$$LIB" 2>/dev/null`"; \ + [ -n "$$DEST" ] || continue; \ + echo "Copying stripped library $$lib to $$DEST"; \ + cp "$$lib" "$$DEST" || exit 1; \ + done + endef +endif + +# where to build (and put) .ipk packages +opkg = \ + IPKG_NO_SCRIPT=1 \ + IPKG_INSTROOT=$(1) \ + TMPDIR=$(1)/tmp \ + $(STAGING_DIR_HOST)/bin/opkg \ + --offline-root $(1) \ + --force-postinstall \ + --add-dest root:/ \ + --add-arch all:100 \ + --add-arch $(if $(ARCH_PACKAGES),$(ARCH_PACKAGES),$(BOARD)):200 + +TARGET_DIR_ORIG := $(TARGET_ROOTFS_DIR)/root.orig-$(BOARD) + +ifdef CONFIG_CLEAN_IPKG + define clean_ipkg + -find $(1)/usr/lib/opkg/info -type f -and -not -name '*.control' -delete + -sed -i -ne '/^Require-User: /p' $(1)/usr/lib/opkg/info/*.control + awk ' \ + BEGIN { conffiles = 0; print "Conffiles:" } \ + /^Conffiles:/ { conffiles = 1; next } \ + !/^ / { conffiles = 0; next } \ + conffiles == 1 { print } \ + ' $(1)/usr/lib/opkg/status >$(1)/usr/lib/opkg/status.new + mv $(1)/usr/lib/opkg/status.new $(1)/usr/lib/opkg/status + -find $(1)/usr/lib/opkg -empty -delete + endef +endif + +define prepare_rootfs + $(if $(2),@if [ -d '$(2)' ]; then \ + $(call file_copy,$(2)/.,$(1)); \ + fi) + @mkdir -p $(1)/etc/rc.d + @mkdir -p $(1)/var/lock + @( \ + cd $(1); \ + for script in ./usr/lib/opkg/info/*.postinst; do \ + IPKG_INSTROOT=$(1) $$(command -v bash) $$script; \ + ret=$$?; \ + if [ $$ret -ne 0 ]; then \ + echo "postinst script $$script has failed with exit code $$ret" >&2; \ + exit 1; \ + fi; \ + done; \ + for script in ./etc/init.d/*; do \ + grep '#!/bin/sh /etc/rc.common' $$script >/dev/null || continue; \ + if ! echo " $(3) " | grep -q " $$(basename $$script) "; then \ + IPKG_INSTROOT=$(1) $$(command -v bash) ./etc/rc.common $$script enable; \ + echo "Enabling" $$(basename $$script); \ + else \ + IPKG_INSTROOT=$(1) $$(command -v bash) ./etc/rc.common $$script disable; \ + echo "Disabling" $$(basename $$script); \ + fi; \ + done || true \ + ) + $(if $(SOURCE_DATE_EPOCH),sed -i "s/Installed-Time: .*/Installed-Time: $(SOURCE_DATE_EPOCH)/" $(1)/usr/lib/opkg/status) + @-find $(1) -name CVS -o -name .svn -o -name .git -o -name '.#*' | $(XARGS) rm -rf + rm -rf \ + $(1)/boot \ + $(1)/tmp/* \ + $(1)/usr/lib/opkg/info/*.postinst* \ + $(1)/usr/lib/opkg/lists/* \ + $(1)/var/lock/*.lock + $(call clean_ipkg,$(1)) + $(call mklibs,$(1)) + $(if $(SOURCE_DATE_EPOCH),find $(1)/ -mindepth 1 -execdir touch -hcd "@$(SOURCE_DATE_EPOCH)" "{}" +) +endef diff --git a/include/scan.awk b/include/scan.awk new file mode 100644 index 0000000..0f02782 --- /dev/null +++ b/include/scan.awk @@ -0,0 +1,19 @@ +BEGIN { FS="/" } +$1 ~ /^feeds/ { FEEDS[$NF]=$0 } +$1 !~ /^feeds/ { PKGS[$NF]=$0 } +END { + # Filter-out OpenWrt packages which have a feeds equivalent + for (pkg in PKGS) + if (pkg in FEEDS) { + print PKGS[pkg] > of + delete PKGS[pkg] + } + n = asort(PKGS) + for (i=1; i <= n; i++) { + print PKGS[i] + } + n = asort(FEEDS) + for (i=1; i <= n; i++){ + print FEEDS[i] + } +} diff --git a/include/scan.mk b/include/scan.mk new file mode 100644 index 0000000..2e0ee0c --- /dev/null +++ b/include/scan.mk @@ -0,0 +1,122 @@ +include $(TOPDIR)/include/verbose.mk +include $(TOPDIR)/rules.mk +TMP_DIR:=$(TOPDIR)/tmp + +all: $(TMP_DIR)/.$(SCAN_TARGET) + +SCAN_TARGET ?= packageinfo +SCAN_NAME ?= package +SCAN_DIR ?= package +TARGET_STAMP:=$(TMP_DIR)/info/.files-$(SCAN_TARGET).stamp +FILELIST:=$(TMP_DIR)/info/.files-$(SCAN_TARGET)-$(SCAN_COOKIE) +OVERRIDELIST:=$(TMP_DIR)/info/.overrides-$(SCAN_TARGET)-$(SCAN_COOKIE) + +export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH)) +export PATH:=$(STAGING_DIR_HOST)/bin:$(PATH) + +define feedname +$(if $(patsubst feeds/%,,$(1)),,$(word 2,$(subst /, ,$(1)))) +endef + +ifeq ($(SCAN_NAME),target) + SCAN_DEPS=image/Makefile profiles/*.mk $(TOPDIR)/include/kernel*.mk $(TOPDIR)/include/target.mk image/*.mk +else + SCAN_DEPS=$(TOPDIR)/include/package*.mk +ifneq ($(call feedname,$(SCAN_DIR)),) + SCAN_DEPS += $(TOPDIR)/feeds/$(call feedname,$(SCAN_DIR))/*.mk +endif +endif + +ifeq ($(IS_TTY),1) + ifneq ($(strip $(NO_COLOR)),1) + define progress + printf "\033[M\r$(1)" >&2; + endef + else + define progress + printf "\r$(1)" >&2; + endef + endif +else + define progress + :; + endef +endif + +define PackageDir + $(TMP_DIR)/.$(SCAN_TARGET): $(TMP_DIR)/info/.$(SCAN_TARGET)-$(1) + $(TMP_DIR)/info/.$(SCAN_TARGET)-$(1): $(SCAN_DIR)/$(2)/Makefile $(foreach DEP,$(DEPS_$(SCAN_DIR)/$(2)/Makefile) $(SCAN_DEPS),$(wildcard $(if $(filter /%,$(DEP)),$(DEP),$(SCAN_DIR)/$(2)/$(DEP)))) + { \ + $$(call progress,Collecting $(SCAN_NAME) info: $(SCAN_DIR)/$(2)) \ + echo Source-Makefile: $(SCAN_DIR)/$(2)/Makefile; \ + $(if $(3),echo Override: $(3),true); \ + $(if $(findstring c,$(OPENWRT_VERBOSE)),$(MAKE),$(NO_TRACE_MAKE) --no-print-dir) -r DUMP=1 FEED="$(call feedname,$(2))" -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) \ + $(if $(findstring c,$(OPENWRT_VERBOSE)),,2>/dev/null) || { \ + mkdir -p "$(TOPDIR)/logs/$(SCAN_DIR)/$(2)"; \ + $(NO_TRACE_MAKE) --no-print-dir -r DUMP=1 FEED="$(call feedname,$(2))" -C $(SCAN_DIR)/$(2) $(SCAN_MAKEOPTS) > $(TOPDIR)/logs/$(SCAN_DIR)/$(2)/dump.txt 2>&1; \ + $$(call progress,ERROR: please fix $(SCAN_DIR)/$(2)/Makefile - see logs/$(SCAN_DIR)/$(2)/dump.txt for details\n) \ + rm -f $$@; \ + }; \ + echo; \ + } > $$@.tmp + mv $$@.tmp $$@ +endef + +$(OVERRIDELIST): + rm -f $(TMP_DIR)/info/.overrides-$(SCAN_TARGET)-* + touch $@ + +ifeq ($(SCAN_NAME),target) + GREP_STRING=BuildTarget +else + GREP_STRING=(Build/DefaultTargets|BuildPackage|KernelPackage) +endif + +$(FILELIST): $(OVERRIDELIST) + rm -f $(TMP_DIR)/info/.files-$(SCAN_TARGET)-* + find -L $(SCAN_DIR) -mindepth 1 $(if $(SCAN_DEPTH),-maxdepth $(SCAN_DEPTH)) $(SCAN_EXTRA) -name Makefile | xargs grep -aHE 'call $(GREP_STRING)' | sed -e 's#^$(SCAN_DIR)/##' -e 's#/Makefile:.*##' | uniq | awk -v of=$(OVERRIDELIST) -f include/scan.awk > $@ + +$(TMP_DIR)/info/.files-$(SCAN_TARGET).mk: $(FILELIST) + ( \ + cat $< | awk '{print "$(SCAN_DIR)/" $$0 "/Makefile" }' | xargs grep -HE '^ *SCAN_DEPS *= *' | awk -F: '{ gsub(/^.*DEPS *= */, "", $$2); print "DEPS_" $$1 "=" $$2 }'; \ + awk -F/ -v deps="$$DEPS" -v of="$(OVERRIDELIST)" ' \ + BEGIN { \ + while (getline < (of)) \ + override[$$NF]=$$0; \ + close(of) \ + } \ + { \ + info=$$0; \ + gsub(/\//, "_", info); \ + dir=$$0; \ + pkg=""; \ + if($$NF in override) \ + pkg=override[$$NF]; \ + print "$$(eval $$(call PackageDir," info "," dir "," pkg "))"; \ + } ' < $<; \ + true; \ + ) > $@.tmp + mv $@.tmp $@ + +-include $(TMP_DIR)/info/.files-$(SCAN_TARGET).mk + +$(TARGET_STAMP):: + +( \ + $(NO_TRACE_MAKE) $(FILELIST); \ + MD5SUM=$$(cat $(FILELIST) $(OVERRIDELIST) | $(MKHASH) md5 | awk '{print $$1}'); \ + [ -f "$@.$$MD5SUM" ] || { \ + rm -f $@.*; \ + touch $@.$$MD5SUM; \ + touch $@; \ + } \ + ) + +$(TMP_DIR)/.$(SCAN_TARGET): $(TARGET_STAMP) + $(call progress,Collecting $(SCAN_NAME) info: merging...) + -cat $(FILELIST) | awk '{gsub(/\//, "_", $$0);print "$(TMP_DIR)/info/.$(SCAN_TARGET)-" $$0}' | xargs cat > $@ 2>/dev/null + $(call progress,Collecting $(SCAN_NAME) info: done) + echo + +FORCE: +.PHONY: FORCE +.NOTPARALLEL: diff --git a/include/shell.sh b/include/shell.sh new file mode 100644 index 0000000..6ee0cf6 --- /dev/null +++ b/include/shell.sh @@ -0,0 +1,15 @@ +getvar() { + eval "echo \"\${$1}\"" +} + +var2file() { + local var + eval "var=\"\${$1}\"" + if [ -n "$var" ]; then echo "$var" > "$2"; fi +} + +isset() { + local var + eval "var=\"\${$1}\"" + [ -n "$var" ] +} diff --git a/include/site/aarch64 b/include/site/aarch64 new file mode 100644 index 0000000..c5aa9c5 --- /dev/null +++ b/include/site/aarch64 @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=yes} +ac_cv_c_bigendian=${ac_cv_c_bigendian=no} + +ac_cv_sizeof___int64=8 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=8 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=8 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=8 +ac_cv_sizeof_ssize_t=8 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=8 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=8 diff --git a/include/site/aarch64_be b/include/site/aarch64_be new file mode 100644 index 0000000..19e75ab --- /dev/null +++ b/include/site/aarch64_be @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=no} +ac_cv_c_bigendian=${ac_cv_c_bigendian=yes} + +ac_cv_sizeof___int64=8 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=8 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=8 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=8 +ac_cv_sizeof_ssize_t=8 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=8 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=8 diff --git a/include/site/arc b/include/site/arc new file mode 100644 index 0000000..72a3805 --- /dev/null +++ b/include/site/arc @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=yes} +ac_cv_c_bigendian=${ac_cv_c_bigendian=no} + +ac_cv_sizeof___int64=0 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=4 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=4 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=4 +ac_cv_sizeof_ssize_t=4 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=4 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=4 diff --git a/include/site/arm b/include/site/arm new file mode 100644 index 0000000..72a3805 --- /dev/null +++ b/include/site/arm @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=yes} +ac_cv_c_bigendian=${ac_cv_c_bigendian=no} + +ac_cv_sizeof___int64=0 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=4 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=4 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=4 +ac_cv_sizeof_ssize_t=4 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=4 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=4 diff --git a/include/site/armeb b/include/site/armeb new file mode 100644 index 0000000..a5626a7 --- /dev/null +++ b/include/site/armeb @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=no} +ac_cv_c_bigendian=${ac_cv_c_bigendian=yes} + +ac_cv_sizeof___int64=0 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=4 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=4 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=4 +ac_cv_sizeof_ssize_t=4 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=4 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=4 diff --git a/include/site/darwin b/include/site/darwin new file mode 100644 index 0000000..ec38f67 --- /dev/null +++ b/include/site/darwin @@ -0,0 +1,2 @@ +ac_cv_func_futimens=no +ac_cv_func_utimensat=no diff --git a/include/site/i386 b/include/site/i386 new file mode 100644 index 0000000..78f1557 --- /dev/null +++ b/include/site/i386 @@ -0,0 +1,3 @@ +#!/bin/sh +. $TOPDIR/include/site/i486 + diff --git a/include/site/i486 b/include/site/i486 new file mode 100644 index 0000000..72a3805 --- /dev/null +++ b/include/site/i486 @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=yes} +ac_cv_c_bigendian=${ac_cv_c_bigendian=no} + +ac_cv_sizeof___int64=0 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=4 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=4 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=4 +ac_cv_sizeof_ssize_t=4 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=4 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=4 diff --git a/include/site/i686 b/include/site/i686 new file mode 100644 index 0000000..78f1557 --- /dev/null +++ b/include/site/i686 @@ -0,0 +1,3 @@ +#!/bin/sh +. $TOPDIR/include/site/i486 + diff --git a/include/site/linux b/include/site/linux new file mode 100644 index 0000000..63fc3aa --- /dev/null +++ b/include/site/linux @@ -0,0 +1,78 @@ +ac_atomic_add=yes +ac_atomic_sub=yes +ac_cv_c_gettext_without_libintl=yes +ac_cv_c_long_double=no +ac_cv_conv_longlong_to_float=yes +ac_cv_file__dev_zero=yes +ac_cv_func___va_copy=no +ac_cv_func__exit=yes +ac_cv_func_bcopy=yes +ac_cv_func_bzero=yes +ac_cv_func_bcmp=yes +ac_cv_func_creal=yes +ac_cv_func_cimag=yes +ac_cv_func_fchmod=yes +ac_cv_func_getaddrinfo=yes +ac_cv_func_getcwd=yes +ac_cv_func_getdomainname=yes +ac_cv_func_getpgrp_void=yes +ac_cv_func_getpwuid_r=yes +ac_cv_func_gettimeofday=yes +ac_cv_func_index=yes +ac_cv_func_lstat_dereferences_slashed_symlink=yes +ac_cv_func_lstat_empty_string_bug=no +ac_cv_func_lstat=yes +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_malloc_works=yes +ac_cv_func_memcmp_clean=yes +ac_cv_func_memcmp_working=yes +ac_cv_func_posix_getgrgid_r=yes +ac_cv_func_posix_getpwuid_r=yes +ac_cv_func_psignal=yes +ac_cv_func_pthread_key_delete=yes +ac_cv_func_realloc_0_nonnull=yes +ac_cv_func_realloc_works=yes +ac_cv_func_rename=yes +ac_cv_func_rindex=yes +ac_cv_func_setlocale=yes +ac_cv_func_setgrent_void=yes +ac_cv_func_setpgrp_void=yes +ac_cv_func_setresuid=yes +ac_cv_func_setvbuf_reversed=no +ac_cv_func_stat_empty_string_bug=no +ac_cv_func_stat_ignores_trailing_slash=no +ac_cv_func_strerror=yes +ac_cv_func_strftime=yes +ac_cv_func_utimes=yes +ac_cv_func___adjtimex=yes +ac_cv_func_va_copy=no +ac_cv_func_vsnprintf=yes +ac_cv_have_accrights_in_msghdr=no +ac_cv_have_broken_snprintf=no +ac_cv_have_control_in_msghdr=yes +ac_cv_have_decl_sys_siglist=no +ac_cv_have_openpty_ctty_bug=yes +ac_cv_have_space_d_name_in_struct_dirent=yes +ac_cv_header_netinet_sctp_h=no +ac_cv_header_netinet_sctp_uio_h=no +ac_cv_int64_t=yes +ac_cv_lbl_unaligned_fail=no +ac_cv_linux_kernel_pppoe=yes +ac_cv_linux_vers=2 +ac_cv_pack_bitfields_reversed=yes +ac_cv_path_LDCONFIG= +ac_cv_regexec_segfault_emptystr=no +ac_cv_sctp=no +ac_cv_sys_restartable_syscalls=yes +ac_cv_time_r_type=POSIX +ac_cv_type_suseconds_t=yes +ac_cv_uchar=no +ac_cv_uint=yes +ac_cv_uint64_t=yes +ac_cv_ulong=yes +ac_cv_ushort=yes +ac_cv_va_copy=C99 +ac_cv_va_val_copy=yes +as_cv_unaligned_access=yes +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_realloc_0_nonnull=yes diff --git a/include/site/m68k b/include/site/m68k new file mode 100644 index 0000000..0037600 --- /dev/null +++ b/include/site/m68k @@ -0,0 +1,28 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=no} +ac_cv_c_bigendian=${ac_cv_c_bigendian=yes} + +ac_cv_sizeof___int64=0 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=4 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=4 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=4 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=4 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=4 diff --git a/include/site/mips b/include/site/mips new file mode 100644 index 0000000..a5626a7 --- /dev/null +++ b/include/site/mips @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=no} +ac_cv_c_bigendian=${ac_cv_c_bigendian=yes} + +ac_cv_sizeof___int64=0 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=4 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=4 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=4 +ac_cv_sizeof_ssize_t=4 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=4 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=4 diff --git a/include/site/mips64 b/include/site/mips64 new file mode 100644 index 0000000..19e75ab --- /dev/null +++ b/include/site/mips64 @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=no} +ac_cv_c_bigendian=${ac_cv_c_bigendian=yes} + +ac_cv_sizeof___int64=8 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=8 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=8 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=8 +ac_cv_sizeof_ssize_t=8 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=8 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=8 diff --git a/include/site/mips64el b/include/site/mips64el new file mode 100644 index 0000000..c5aa9c5 --- /dev/null +++ b/include/site/mips64el @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=yes} +ac_cv_c_bigendian=${ac_cv_c_bigendian=no} + +ac_cv_sizeof___int64=8 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=8 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=8 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=8 +ac_cv_sizeof_ssize_t=8 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=8 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=8 diff --git a/include/site/mipsel b/include/site/mipsel new file mode 100644 index 0000000..72a3805 --- /dev/null +++ b/include/site/mipsel @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=yes} +ac_cv_c_bigendian=${ac_cv_c_bigendian=no} + +ac_cv_sizeof___int64=0 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=4 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=4 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=4 +ac_cv_sizeof_ssize_t=4 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=4 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=4 diff --git a/include/site/powerpc b/include/site/powerpc new file mode 100644 index 0000000..a5626a7 --- /dev/null +++ b/include/site/powerpc @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=no} +ac_cv_c_bigendian=${ac_cv_c_bigendian=yes} + +ac_cv_sizeof___int64=0 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=4 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=4 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=4 +ac_cv_sizeof_ssize_t=4 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=4 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=4 diff --git a/include/site/powerpc64 b/include/site/powerpc64 new file mode 100644 index 0000000..6a66346 --- /dev/null +++ b/include/site/powerpc64 @@ -0,0 +1,26 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=no} +ac_cv_c_bigendian=${ac_cv_c_bigendian=yes} + +ac_cv_sizeof_char=1 +ac_cv_sizeof_char_p=8 +ac_cv_sizeof_double=8 +ac_cv_sizeof_float=4 +ac_cv_sizeof_int=4 +ac_cv_sizeof_long=8 +ac_cv_sizeof_long_double=16 +ac_cv_sizeof_long_int=8 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long_long_int=8 +ac_cv_sizeof_short=2 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_signed_char=1 +ac_cv_sizeof_unsigned_char=1 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=8 +ac_cv_sizeof_unsigned_long_int=8 +ac_cv_sizeof_unsigned_long_long_int=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_unsigned_short_int=2 +ac_cv_sizeof_void_p=8 diff --git a/include/site/riscv64 b/include/site/riscv64 new file mode 100644 index 0000000..c5aa9c5 --- /dev/null +++ b/include/site/riscv64 @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=yes} +ac_cv_c_bigendian=${ac_cv_c_bigendian=no} + +ac_cv_sizeof___int64=8 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=8 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=8 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=8 +ac_cv_sizeof_ssize_t=8 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=8 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=8 diff --git a/include/site/sparc b/include/site/sparc new file mode 100644 index 0000000..a5626a7 --- /dev/null +++ b/include/site/sparc @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=no} +ac_cv_c_bigendian=${ac_cv_c_bigendian=yes} + +ac_cv_sizeof___int64=0 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=4 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=4 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=4 +ac_cv_sizeof_ssize_t=4 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=4 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=4 diff --git a/include/site/x86_64 b/include/site/x86_64 new file mode 100644 index 0000000..b8d581d --- /dev/null +++ b/include/site/x86_64 @@ -0,0 +1,30 @@ +#!/bin/sh +. $TOPDIR/include/site/linux +ac_cv_c_littleendian=${ac_cv_c_littleendian=yes} +ac_cv_c_bigendian=${ac_cv_c_bigendian=no} + +ac_cv_sizeof___int64=0 +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_int16_t=2 +ac_cv_sizeof_int32_t=4 +ac_cv_sizeof_int64_t=8 +ac_cv_sizeof_long_int=8 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_long=8 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_short_int=2 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=8 +ac_cv_sizeof_ssize_t=8 +ac_cv_sizeof_u_int16_t=2 +ac_cv_sizeof_u_int32_t=4 +ac_cv_sizeof_u_int64_t=8 +ac_cv_sizeof_uint16_t=2 +ac_cv_sizeof_uint32_t=4 +ac_cv_sizeof_uint64_t=8 +ac_cv_sizeof_unsigned_int=4 +ac_cv_sizeof_unsigned_long=8 +ac_cv_sizeof_unsigned_long_long=8 +ac_cv_sizeof_unsigned_short=2 +ac_cv_sizeof_void_p=8 diff --git a/include/subdir.mk b/include/subdir.mk new file mode 100644 index 0000000..b4edbf8 --- /dev/null +++ b/include/subdir.mk @@ -0,0 +1,109 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2007-2020 OpenWrt.org + +ifeq ($(MAKECMDGOALS),prereq) + SUBTARGETS:=prereq + PREREQ_ONLY:=1 +# For target/linux related target add dtb to selectively compile dtbs +else ifneq ($(filter target/linux/%,$(MAKECMDGOALS)),) + SUBTARGETS:=$(DEFAULT_SUBDIR_TARGETS) dtb +else + SUBTARGETS:=$(DEFAULT_SUBDIR_TARGETS) +endif + +subtarget-default = $(filter-out ., \ + $(if $($(1)/builddirs-$(2)),$($(1)/builddirs-$(2)), \ + $(if $($(1)/builddirs-default),$($(1)/builddirs-default), \ + $($(1)/builddirs)))) + +define subtarget + $(call warn_eval,$(1),t,T,$(1)/$(2): $($(1)/) $(foreach bd,$(call subtarget-default,$(1),$(2)),$(1)/$(bd)/$(2))) + +endef + +define ERROR + ($(call MESSAGE, $(2)); $(if $(BUILD_LOG), echo "$(2)" >> $(BUILD_LOG_DIR)/$(1)/error.txt;) $(if $(3),, exit 1;)) +endef + +lastdir=$(word $(words $(subst /, ,$(1))),$(subst /, ,$(1))) +diralias=$(if $(findstring $(1),$(call lastdir,$(1))),,$(call lastdir,$(1))) + +subdir_make_opts = \ + $(if $(SUBDIR_MAKE_DEBUG),-d) -r -C $(1) \ + BUILD_SUBDIR="$(1)" \ + BUILD_VARIANT="$(4)" \ + ALL_VARIANTS="$(5)" + +# 1: subdir +# 2: target +# 3: build type +# 4: build variant +# 5: all variants +log_make = \ + $(if $(call debug,$(1),v),,@)+ \ + $(if $(BUILD_LOG), \ + set -o pipefail; \ + mkdir -p $(BUILD_LOG_DIR)/$(1)$(if $(4),/$(4));) \ + $(SCRIPT_DIR)/time.pl "time: $(1)$(if $(4),/$(4))/$(if $(3),$(3)-)$(2)" \ + $$(SUBMAKE) $(subdir_make_opts) $(if $(3),$(3)-)$(2) \ + $(if $(BUILD_LOG),SILENT= 2>&1 | tee $(BUILD_LOG_DIR)/$(1)$(if $(4),/$(4))/$(if $(3),$(3)-)$(2).txt) + +ifdef CONFIG_AUTOREMOVE +rebuild_check = \ + @-$$(NO_TRACE_MAKE) $(subdir_make_opts) check-depends >/dev/null 2>/dev/null; \ + $(if $(BUILD_LOG),mkdir -p $(BUILD_LOG_DIR)/$(1)$(if $(4),/$(4));) \ + $$(NO_TRACE_MAKE) $(if $(BUILD_LOG),-d) -q $(subdir_make_opts) .$(if $(3),$(3)-)$(2) \ + > $(if $(BUILD_LOG),$(BUILD_LOG_DIR)/$(1)$(if $(4),/$(4))/check-$(if $(3),$(3)-)$(2).txt,/dev/null) 2>&1 || \ + $$(SUBMAKE) $(subdir_make_opts) clean-build >/dev/null 2>/dev/null + +endif + +# Parameters: +define subdir + $(call warn,$(1),d,D $(1)) + $(foreach bd,$($(1)/builddirs), + $(call warn,$(1),d,BD $(1)/$(bd)) + $(foreach target,$(SUBTARGETS) $($(1)/subtargets), + $(foreach btype,$(buildtypes-$(bd)), + $(call warn_eval,$(1)/$(bd),t,T,$(1)/$(bd)/$(btype)/$(target): $(if $(NO_DEPS)$(QUILT),,$($(1)/$(bd)/$(btype)/$(target)) $(call $(1)//$(btype)/$(target),$(1)/$(bd)/$(btype)))) + $(call log_make,$(1)/$(bd),$(target),$(btype),$(filter-out __default,$(variant)),$($(1)/$(bd)/variants)) \ + || $(call ERROR,$(2), ERROR: $(1)/$(bd) [$(btype)] failed to build.,$(findstring $(bd),$($(1)/builddirs-ignore-$(btype)-$(target)))) + $(if $(call diralias,$(bd)),$(call warn_eval,$(1)/$(bd),l,T,$(1)/$(call diralias,$(bd))/$(btype)/$(target): $(1)/$(bd)/$(btype)/$(target))) + ) + $(call warn_eval,$(1)/$(bd),t,T,$(1)/$(bd)/$(target): $(if $(NO_DEPS)$(QUILT),,$($(1)/$(bd)/$(target)) $(call $(1)//$(target),$(1)/$(bd)))) + $(foreach variant,$(filter-out *,$(if $(BUILD_VARIANT),$(BUILD_VARIANT),$(if $(strip $($(1)/$(bd)/variants)),$($(1)/$(bd)/variants),$(if $($(1)/$(bd)/default-variant),$($(1)/$(bd)/default-variant),__default)))), + $(if $(BUILD_LOG),@mkdir -p $(BUILD_LOG_DIR)/$(1)/$(bd)/$(filter-out __default,$(variant))) + $(if $($(1)/autoremove),$(call rebuild_check,$(1)/$(bd),$(target),,$(filter-out __default,$(variant)),$($(1)/$(bd)/variants))) + $(call log_make,$(1)/$(bd),$(target),,$(filter-out __default,$(variant)),$($(1)/$(bd)/variants)) \ + || $(call ERROR,$(1), ERROR: $(1)/$(bd) failed to build$(if $(filter-out __default,$(variant)), (build variant: $(variant))).,$(findstring $(bd),$($(1)/builddirs-ignore-$(target)))) + ) + $(if $(PREREQ_ONLY)$(DUMP_TARGET_DB),, + # aliases + $(if $(call diralias,$(bd)),$(call warn_eval,$(1)/$(bd),l,T,$(1)/$(call diralias,$(bd))/$(target): $(1)/$(bd)/$(target))) + ) + ) + ) + $(foreach target,$(SUBTARGETS) $($(1)/subtargets),$(call subtarget,$(1),$(target))) +endef + +ifndef DUMP_TARGET_DB +# Parameters: +define stampfile + $(1)/stamp-$(3):=$(if $(6),$(6),$(STAGING_DIR))/stamp/.$(2)_$(3)$(5) + $$($(1)/stamp-$(3)): $(TMP_DIR)/.build $(4) + @+$(SCRIPT_DIR)/timestamp.pl -n $$($(1)/stamp-$(3)) $(1) $(4) || \ + $(MAKE) $(if $(QUIET),--no-print-directory) $$($(1)/flags-$(3)) $(1)/$(3) + @mkdir -p $$$$(dirname $$($(1)/stamp-$(3))) + @touch $$($(1)/stamp-$(3)) + + $$(if $(call debug,$(1),v),,.SILENT: $$($(1)/stamp-$(3))) + + .PRECIOUS: $$($(1)/stamp-$(3)) # work around a make bug + + $(1)//clean:=$(1)/stamp-$(3)/clean + $(1)/stamp-$(3)/clean: FORCE + @rm -f $$($(1)/stamp-$(3)) + +endef +endif diff --git a/include/target.mk b/include/target.mk new file mode 100644 index 0000000..f72ef32 --- /dev/null +++ b/include/target.mk @@ -0,0 +1,372 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2007-2008 OpenWrt.org +# Copyright (C) 2016 LEDE Project + +ifneq ($(__target_inc),1) +__target_inc=1 + +# default device type +DEVICE_TYPE?=router + +# Default packages - the really basic set +DEFAULT_PACKAGES:=\ + base-files \ + ca-bundle \ + dropbear \ + fstools \ + libc \ + libgcc \ + libustream-mbedtls \ + logd \ + mtd \ + netifd \ + opkg \ + uci \ + uclient-fetch \ + urandom-seed \ + urngd + +ifneq ($(CONFIG_SELINUX),) +DEFAULT_PACKAGES+=busybox-selinux procd-selinux +else +DEFAULT_PACKAGES+=busybox procd +endif + +# include ujail on systems with enough storage +ifeq ($(CONFIG_SMALL_FLASH),) +DEFAULT_PACKAGES+=procd-ujail +endif + +# include seccomp ld-preload hooks if kernel supports it +ifneq ($(CONFIG_SECCOMP),) +DEFAULT_PACKAGES+=procd-seccomp +endif + +# For the basic set +DEFAULT_PACKAGES.basic:= +# For nas targets +DEFAULT_PACKAGES.nas:=\ + block-mount \ + fdisk \ + lsblk \ + mdadm +# For router targets +DEFAULT_PACKAGES.router:=\ + dnsmasq \ + firewall4 \ + nftables \ + kmod-nft-offload \ + odhcp6c \ + odhcpd-ipv6only \ + ppp \ + ppp-mod-pppoe + +ifneq ($(DUMP),) + all: dumpinfo +endif + +target_conf=$(subst .,_,$(subst -,_,$(subst /,_,$(1)))) +ifeq ($(DUMP),) + PLATFORM_DIR:=$(firstword $(wildcard $(TOPDIR)/target/linux/feeds/$(BOARD) $(TOPDIR)/target/linux/$(BOARD))) + SUBTARGET:=$(strip $(foreach subdir,$(patsubst $(PLATFORM_DIR)/%/target.mk,%,$(wildcard $(PLATFORM_DIR)/*/target.mk)),$(if $(CONFIG_TARGET_$(call target_conf,$(BOARD)_$(subdir))),$(subdir)))) +else + PLATFORM_DIR:=${CURDIR} + ifeq ($(SUBTARGETS),) + SUBTARGETS:=$(strip $(patsubst $(PLATFORM_DIR)/%/target.mk,%,$(wildcard $(PLATFORM_DIR)/*/target.mk))) + endif +endif + +TARGETID:=$(BOARD)$(if $(SUBTARGET),/$(SUBTARGET)) +PLATFORM_SUBDIR:=$(PLATFORM_DIR)$(if $(SUBTARGET),/$(SUBTARGET)) + +ifneq ($(TARGET_BUILD),1) + ifndef DUMP + include $(PLATFORM_DIR)/Makefile + ifneq ($(PLATFORM_DIR),$(PLATFORM_SUBDIR)) + include $(PLATFORM_SUBDIR)/target.mk + endif + endif +else + ifneq ($(SUBTARGET),) + -include ./$(SUBTARGET)/target.mk + endif +endif + +# Add device specific packages (here below to allow device type set from subtarget) +DEFAULT_PACKAGES += $(DEFAULT_PACKAGES.$(DEVICE_TYPE)) + +filter_packages = $(filter-out -% $(patsubst -%,%,$(filter -%,$(1))),$(1)) +extra_packages = $(if $(filter wpad wpad-% nas,$(1)),iwinfo) + +define ProfileDefault + NAME:= + PRIORITY:= + PACKAGES:= +endef + +ifndef Profile +define Profile + $(eval $(call ProfileDefault)) + $(eval $(call Profile/$(1))) + dumpinfo : $(call shexport,Profile/$(1)/Description) + PACKAGES := $(filter-out -%,$(PACKAGES)) + DUMPINFO += \ + echo "Target-Profile: $(1)"; \ + $(if $(PRIORITY), echo "Target-Profile-Priority: $(PRIORITY)"; ) \ + echo "Target-Profile-Name: $(NAME)"; \ + echo "Target-Profile-Packages: $(PACKAGES) $(call extra_packages,$(DEFAULT_PACKAGES) $(PACKAGES))"; \ + echo "Target-Profile-Description:"; \ + echo "$$$$$$$$$(call shvar,Profile/$(1)/Description)"; \ + echo "@@"; \ + echo; +endef +endif + +ifneq ($(PLATFORM_DIR),$(PLATFORM_SUBDIR)) + define IncludeProfiles + -include $(sort $(wildcard $(PLATFORM_DIR)/profiles/*.mk)) + -include $(sort $(wildcard $(PLATFORM_SUBDIR)/profiles/*.mk)) + endef +else + define IncludeProfiles + -include $(sort $(wildcard $(PLATFORM_DIR)/profiles/*.mk)) + endef +endif + +PROFILE?=$(call qstrip,$(CONFIG_TARGET_PROFILE)) + +ifeq ($(TARGET_BUILD),1) + ifneq ($(DUMP),) + $(eval $(call IncludeProfiles)) + endif +endif + +ifneq ($(TARGET_BUILD)$(if $(DUMP),,1),) + include $(INCLUDE_DIR)/kernel-version.mk +endif + +GENERIC_PLATFORM_DIR := $(TOPDIR)/target/linux/generic +GENERIC_BACKPORT_DIR := $(GENERIC_PLATFORM_DIR)/backport$(if $(wildcard $(GENERIC_PLATFORM_DIR)/backport-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER)) +GENERIC_PATCH_DIR := $(GENERIC_PLATFORM_DIR)/pending$(if $(wildcard $(GENERIC_PLATFORM_DIR)/pending-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER)) +GENERIC_HACK_DIR := $(GENERIC_PLATFORM_DIR)/hack$(if $(wildcard $(GENERIC_PLATFORM_DIR)/hack-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER)) +GENERIC_FILES_DIR := $(foreach dir,$(wildcard $(GENERIC_PLATFORM_DIR)/files $(GENERIC_PLATFORM_DIR)/files-$(KERNEL_PATCHVER)),"$(dir)") + +__config_name_list = $(1)/config-$(KERNEL_PATCHVER) $(1)/config-default +__config_list = $(firstword $(wildcard $(call __config_name_list,$(1)))) +find_kernel_config=$(if $(__config_list),$(__config_list),$(lastword $(__config_name_list))) + +GENERIC_LINUX_CONFIG = $(call find_kernel_config,$(GENERIC_PLATFORM_DIR)) +LINUX_TARGET_CONFIG = $(call find_kernel_config,$(PLATFORM_DIR)) +ifneq ($(PLATFORM_DIR),$(PLATFORM_SUBDIR)) + LINUX_SUBTARGET_CONFIG = $(call find_kernel_config,$(PLATFORM_SUBDIR)) +endif + +# config file list used for compiling +LINUX_KCONFIG_LIST = $(wildcard $(GENERIC_LINUX_CONFIG) $(LINUX_TARGET_CONFIG) $(LINUX_SUBTARGET_CONFIG) $(TOPDIR)/env/kernel-config) + +# default config list for reconfiguring +# defaults to subtarget if subtarget exists and target does not +# defaults to target otherwise +USE_SUBTARGET_CONFIG = $(if $(wildcard $(LINUX_TARGET_CONFIG)),,$(if $(LINUX_SUBTARGET_CONFIG),1)) + +LINUX_RECONFIG_LIST = $(wildcard $(GENERIC_LINUX_CONFIG) $(LINUX_TARGET_CONFIG) $(if $(USE_SUBTARGET_CONFIG),$(LINUX_SUBTARGET_CONFIG))) +LINUX_RECONFIG_TARGET = $(if $(USE_SUBTARGET_CONFIG),$(LINUX_SUBTARGET_CONFIG),$(LINUX_TARGET_CONFIG)) + +CFG_TARGET = $(CONFIG_TARGET) +ifeq ($(CFG_TARGET),platform) + CFG_TARGET = target + $(warning Deprecation warning: use CONFIG_TARGET=target instead.) +else ifeq ($(CFG_TARGET),subtarget_platform) + CFG_TARGET = subtarget_target + $(warning Deprecation warning: use CONFIG_TARGET=subtarget_target instead.) +endif + +# select the config file to be changed by kernel_menuconfig/kernel_oldconfig +ifeq ($(CFG_TARGET),target) + LINUX_RECONFIG_LIST = $(wildcard $(GENERIC_LINUX_CONFIG) $(LINUX_TARGET_CONFIG)) + LINUX_RECONFIG_TARGET = $(LINUX_TARGET_CONFIG) +else ifeq ($(CFG_TARGET),subtarget) + LINUX_RECONFIG_LIST = $(wildcard $(GENERIC_LINUX_CONFIG) $(LINUX_TARGET_CONFIG) $(LINUX_SUBTARGET_CONFIG)) + LINUX_RECONFIG_TARGET = $(LINUX_SUBTARGET_CONFIG) +else ifeq ($(CFG_TARGET),subtarget_target) + LINUX_RECONFIG_LIST = $(wildcard $(GENERIC_LINUX_CONFIG) $(LINUX_SUBTARGET_CONFIG) $(LINUX_TARGET_CONFIG)) + LINUX_RECONFIG_TARGET = $(LINUX_TARGET_CONFIG) +else ifeq ($(CFG_TARGET),env) + LINUX_RECONFIG_LIST = $(LINUX_KCONFIG_LIST) + LINUX_RECONFIG_TARGET = $(TOPDIR)/env/kernel-config +else ifneq ($(strip $(CFG_TARGET)),) + $(error CONFIG_TARGET=$(CFG_TARGET) is invalid. Valid: target|subtarget|subtarget_target|env) +endif + +__linux_confcmd = $(2) $(patsubst %,+,$(wordlist 2,9999,$(1))) $(1) + +LINUX_CONF_CMD = $(SCRIPT_DIR)/kconfig.pl $(call __linux_confcmd,$(LINUX_KCONFIG_LIST)) +LINUX_RECONF_CMD = $(SCRIPT_DIR)/kconfig.pl $(call __linux_confcmd,$(LINUX_RECONFIG_LIST)) +LINUX_RECONF_DIFF = $(SCRIPT_DIR)/kconfig.pl - '>' $(call __linux_confcmd,$(filter-out $(LINUX_RECONFIG_TARGET),$(LINUX_RECONFIG_LIST))) $(1) $(GENERIC_PLATFORM_DIR)/config-filter + +ifeq ($(DUMP),1) + BuildTarget=$(BuildTargets/DumpCurrent) + + CPU_CFLAGS = -Os -pipe + ifneq ($(findstring mips,$(ARCH)),) + ifneq ($(findstring mips64,$(ARCH)),) + CPU_TYPE ?= mips64 + else + CPU_TYPE ?= mips32 + endif + CPU_CFLAGS += -mno-branch-likely + CPU_CFLAGS_mips32 = -mips32 -mtune=mips32 + CPU_CFLAGS_mips64 = -mips64 -mtune=mips64 -mabi=64 + CPU_CFLAGS_mips64r2 = -mips64r2 -mtune=mips64r2 -mabi=64 + CPU_CFLAGS_4kec = -mips32r2 -mtune=4kec + CPU_CFLAGS_24kc = -mips32r2 -mtune=24kc + CPU_CFLAGS_74kc = -mips32r2 -mtune=74kc + CPU_CFLAGS_octeonplus = -march=octeon+ -mabi=64 + endif + ifeq ($(ARCH),i386) + CPU_TYPE ?= pentium-mmx + CPU_CFLAGS_pentium-mmx = -march=pentium-mmx + CPU_CFLAGS_pentium4 = -march=pentium4 + endif + ifneq ($(findstring arm,$(ARCH)),) + CPU_TYPE ?= xscale + endif + ifeq ($(ARCH),powerpc) + CPU_CFLAGS_603e:=-mcpu=603e + CPU_CFLAGS_8540:=-mcpu=8540 + CPU_CFLAGS_8548:=-mcpu=8548 + CPU_CFLAGS_405:=-mcpu=405 + CPU_CFLAGS_440:=-mcpu=440 + CPU_CFLAGS_464fp:=-mcpu=464fp + endif + ifeq ($(ARCH),powerpc64) + CPU_TYPE ?= powerpc64 + CPU_CFLAGS_e5500:=-mcpu=e5500 + CPU_CFLAGS_powerpc64:=-mcpu=powerpc64 + endif + ifeq ($(ARCH),sparc) + CPU_TYPE = sparc + CPU_CFLAGS_ultrasparc = -mcpu=ultrasparc + endif + ifeq ($(ARCH),aarch64) + CPU_TYPE ?= generic + CPU_CFLAGS_generic = -mcpu=generic + CPU_CFLAGS_cortex-a53 = -mcpu=cortex-a53 + endif + ifeq ($(ARCH),arc) + CPU_TYPE ?= arc700 + CPU_CFLAGS += -matomic + CPU_CFLAGS_arc700 = -mcpu=arc700 + CPU_CFLAGS_archs = -mcpu=archs + endif + ifeq ($(ARCH),riscv64) + CPU_TYPE ?= riscv64 + CPU_CFLAGS_riscv64:=-mabi=lp64d -march=rv64imafdc + endif + ifneq ($(CPU_TYPE),) + ifndef CPU_CFLAGS_$(CPU_TYPE) + $(warning CPU_TYPE "$(CPU_TYPE)" doesn't correspond to a known type) + endif + endif + DEFAULT_CFLAGS=$(strip $(CPU_CFLAGS) $(CPU_CFLAGS_$(CPU_TYPE)) $(CPU_CFLAGS_$(CPU_SUBTYPE))) + + ifneq ($(BOARD),) + TMP_CONFIG:=$(TMP_DIR)/.kconfig-$(call target_conf,$(TARGETID)) + $(TMP_CONFIG): $(LINUX_KCONFIG_LIST) + $(LINUX_CONF_CMD) > $@ || rm -f $@ + -include $(TMP_CONFIG) + .SILENT: $(TMP_CONFIG) + .PRECIOUS: $(TMP_CONFIG) + + ifdef KERNEL_TESTING_PATCHVER + ifneq ($(KERNEL_TESTING_PATCHVER),$(KERNEL_PATCHVER)) + FEATURES += testing-kernel + endif + endif + ifneq ($(CONFIG_OF),) + FEATURES += dt + endif + ifneq ($(CONFIG_GENERIC_GPIO)$(CONFIG_GPIOLIB),) + FEATURES += gpio + endif + ifneq ($(CONFIG_PCI),) + FEATURES += pci + endif + ifneq ($(CONFIG_PCIEPORTBUS),) + FEATURES += pcie + endif + ifneq ($(CONFIG_USB)$(CONFIG_USB_SUPPORT),) + ifneq ($(CONFIG_USB_ARCH_HAS_HCD)$(CONFIG_USB_EHCI_HCD),) + FEATURES += usb + endif + endif + ifneq ($(CONFIG_PCMCIA)$(CONFIG_PCCARD),) + FEATURES += pcmcia + endif + ifneq ($(CONFIG_VGA_CONSOLE)$(CONFIG_FB),) + FEATURES += display + endif + ifneq ($(CONFIG_RTC_CLASS),) + FEATURES += rtc + endif + ifneq ($(CONFIG_VIRTIO),) + FEATURES += virtio + endif + ifneq ($(CONFIG_CPU_MIPS32_R2),) + FEATURES += mips16 + endif + ifneq ($(CONFIG_CPU_V6),) + FEATURES += arm_v6 + endif + ifneq ($(CONFIG_CPU_V6K),) + FEATURES += arm_v6 + endif + ifneq ($(CONFIG_CPU_V7),) + FEATURES += arm_v7 + endif + + # remove duplicates + FEATURES:=$(sort $(FEATURES)) + endif +endif + +CUR_SUBTARGET:=$(SUBTARGET) +ifeq ($(SUBTARGETS),) + CUR_SUBTARGET := default +endif + +define BuildTargets/DumpCurrent + .PHONY: dumpinfo + dumpinfo : export DESCRIPTION=$$(Target/Description) + dumpinfo: + @echo 'Target: $(TARGETID)'; \ + echo 'Target-Board: $(BOARD)'; \ + echo 'Target-Name: $(BOARDNAME)$(if $(SUBTARGETS),$(if $(SUBTARGET),))'; \ + echo 'Target-Arch: $(ARCH)'; \ + echo 'Target-Arch-Packages: $(if $(ARCH_PACKAGES),$(ARCH_PACKAGES),$(ARCH)$(if $(CPU_TYPE),_$(CPU_TYPE))$(if $(CPU_SUBTYPE),_$(CPU_SUBTYPE)))'; \ + echo 'Target-Features: $(FEATURES)'; \ + echo 'Target-Depends: $(DEPENDS)'; \ + echo 'Target-Optimization: $(if $(CFLAGS),$(CFLAGS),$(DEFAULT_CFLAGS))'; \ + echo 'CPU-Type: $(CPU_TYPE)$(if $(CPU_SUBTYPE),+$(CPU_SUBTYPE))'; \ + echo 'Linux-Version: $(LINUX_VERSION)'; \ + $(if $(LINUX_TESTING_VERSION),echo 'Linux-Testing-Version: $(LINUX_TESTING_VERSION)';) \ + echo 'Linux-Release: $(LINUX_RELEASE)'; \ + echo 'Linux-Kernel-Arch: $(LINUX_KARCH)'; \ + $(if $(SUBTARGET),,$(if $(DEFAULT_SUBTARGET), echo 'Default-Subtarget: $(DEFAULT_SUBTARGET)'; )) \ + echo 'Target-Description:'; \ + echo "$$$$DESCRIPTION"; \ + echo '@@'; \ + echo 'Default-Packages: $(DEFAULT_PACKAGES) $(call extra_packages,$(DEFAULT_PACKAGES))'; \ + $(DUMPINFO) + $(if $(CUR_SUBTARGET),$(SUBMAKE) -r --no-print-directory -C image -s DUMP=1 SUBTARGET=$(CUR_SUBTARGET)) + $(if $(SUBTARGET),,@$(foreach SUBTARGET,$(SUBTARGETS),$(SUBMAKE) -s DUMP=1 SUBTARGET=$(SUBTARGET); )) +endef + +include $(INCLUDE_DIR)/kernel.mk +ifeq ($(TARGET_BUILD),1) + include $(INCLUDE_DIR)/kernel-build.mk + BuildTarget?=$(BuildKernel) +endif + +endif #__target_inc diff --git a/include/toolchain-build.mk b/include/toolchain-build.mk new file mode 100644 index 0000000..87ba831 --- /dev/null +++ b/include/toolchain-build.mk @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2009-2020 OpenWrt.org + +override CONFIG_AUTOREBUILD= +override CONFIG_AUTOREMOVE= + +HOST_BUILD_PREFIX:=$(TOOLCHAIN_DIR) +BUILD_DIR_HOST:=$(BUILD_DIR_TOOLCHAIN) + +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/hardening.mk + +HOST_STAMP_PREPARED=$(HOST_BUILD_DIR)/.prepared + +define FixupLibdir + if [ -d $(1)/lib64 -a \! -L $(1)/lib64 ]; then \ + mkdir -p $(1)/lib; \ + mv $(1)/lib64/* $(1)/lib/; \ + rm -rf $(1)/lib64; \ + ln -sf lib $(1)/lib64; \ + fi +endef diff --git a/include/toplevel.mk b/include/toplevel.mk new file mode 100644 index 0000000..f377933 --- /dev/null +++ b/include/toplevel.mk @@ -0,0 +1,272 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2007-2020 OpenWrt.org + +PREP_MK= OPENWRT_BUILD= QUIET=0 + +export IS_TTY=$(if $(MAKE_TERMOUT),1,0) + +include $(TOPDIR)/include/verbose.mk + +ifeq ($(SDK),1) + include $(TOPDIR)/include/version.mk +else + REVISION:=$(shell $(TOPDIR)/scripts/getver.sh) + SOURCE_DATE_EPOCH:=$(shell $(TOPDIR)/scripts/get_source_date_epoch.sh) +endif + +export REVISION +export SOURCE_DATE_EPOCH +export GIT_CONFIG_PARAMETERS='core.autocrlf=false' +export GIT_ASKPASS:=/bin/true +export MAKE_JOBSERVER=$(filter --jobserver%,$(MAKEFLAGS)) +export GNU_HOST_NAME:=$(shell $(TOPDIR)/scripts/config.guess) +export HOST_OS:=$(shell uname) +export HOST_ARCH:=$(shell uname -m) + +ifeq ($(HOST_OS),Darwin) + ifneq ($(filter /Applications/Xcode.app/% /Library/Developer/%,$(MAKE)),) + $(error Please use a newer version of GNU make. The version shipped by Apple is not supported) + endif +endif + +# prevent perforce from messing with the patch utility +unexport P4PORT P4USER P4CONFIG P4CLIENT + +# prevent user defaults for quilt from interfering +unexport QUILT_PATCHES QUILT_PATCH_OPTS + +unexport C_INCLUDE_PATH CROSS_COMPILE ARCH + +# prevent distro default LPATH from interfering +unexport LPATH + +# make sure that a predefined CFLAGS variable does not disturb packages +export CFLAGS= +export LDFLAGS= + +empty:= +space:= $(empty) $(empty) +path:=$(subst :,$(space),$(PATH)) +path:=$(filter-out .%,$(path)) +path:=$(subst $(space),:,$(path)) +export ORIG_PATH:=$(if $(ORIG_PATH),$(ORIG_PATH),$(PATH)) +export PATH:=$(path) +export STAGING_DIR_HOST:=$(if $(STAGING_DIR),$(abspath $(STAGING_DIR)/../host),$(TOPDIR)/staging_dir/host) + +unexport TAR_OPTIONS + +ifeq ($(FORCE),) + .config scripts/config/conf scripts/config/mconf: $(STAGING_DIR_HOST)/.prereq-build +endif + +SCAN_COOKIE?=$(shell echo $$$$) +export SCAN_COOKIE + +SUBMAKE:=umask 022; $(SUBMAKE) + +ULIMIT_FIX=_limit=`ulimit -n`; [ "$$_limit" = "unlimited" -o "$$_limit" -ge 1024 ] || ulimit -n 1024; + +prepare-mk: $(STAGING_DIR_HOST)/.prereq-build FORCE ; + +ifdef SDK + IGNORE_PACKAGES = linux +endif + +_ignore = $(foreach p,$(IGNORE_PACKAGES),--ignore $(p)) + +prepare-tmpinfo: FORCE + @+$(MAKE) -r -s $(STAGING_DIR_HOST)/.prereq-build $(PREP_MK) + mkdir -p tmp/info feeds + [ -e $(TOPDIR)/feeds/base ] || ln -sf $(TOPDIR)/package $(TOPDIR)/feeds/base + $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="packageinfo" SCAN_DIR="package" SCAN_NAME="package" SCAN_DEPTH=5 SCAN_EXTRA="" + $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="targetinfo" SCAN_DIR="target/linux" SCAN_NAME="target" SCAN_DEPTH=3 SCAN_EXTRA="" SCAN_MAKEOPTS="TARGET_BUILD=1" + for type in package target; do \ + f=tmp/.$${type}info; t=tmp/.config-$${type}.in; \ + [ "$$t" -nt "$$f" ] || ./scripts/$${type}-metadata.pl $(_ignore) config "$$f" > "$$t" || { rm -f "$$t"; echo "Failed to build $$t"; false; break; }; \ + done + [ tmp/.config-feeds.in -nt tmp/.packageauxvars ] || ./scripts/feeds feed_config > tmp/.config-feeds.in + ./scripts/package-metadata.pl mk tmp/.packageinfo > tmp/.packagedeps || { rm -f tmp/.packagedeps; false; } + ./scripts/package-metadata.pl pkgaux tmp/.packageinfo > tmp/.packageauxvars || { rm -f tmp/.packageauxvars; false; } + ./scripts/package-metadata.pl usergroup tmp/.packageinfo > tmp/.packageusergroup || { rm -f tmp/.packageusergroup; false; } + touch $(TOPDIR)/tmp/.build + +.config: ./scripts/config/conf $(if $(CONFIG_HAVE_DOT_CONFIG),,prepare-tmpinfo) + @+if [ \! -e .config ] || ! grep CONFIG_HAVE_DOT_CONFIG .config >/dev/null; then \ + [ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig .config; \ + $(_SINGLE)$(NO_TRACE_MAKE) menuconfig $(PREP_MK); \ + fi + +ifeq ($(RECURSIVE_DEP_IS_ERROR),1) + KCONF_FLAGS=--fatalrecursive +endif +ifneq ($(DISTRO_PKG_CONFIG),) +scripts/config/%onf: export PATH:=$(dir $(DISTRO_PKG_CONFIG)):$(PATH) +endif +scripts/config/%onf: CFLAGS+= -O2 +scripts/config/%onf: FORCE + @$(_SINGLE)$(SUBMAKE) $(if $(findstring s,$(OPENWRT_VERBOSE)),,-s) \ + -C scripts/config $(notdir $@) + +$(eval $(call rdep,scripts/config,scripts/config/mconf)) + +config: scripts/config/conf prepare-tmpinfo FORCE + [ -L .config ] && export KCONFIG_OVERWRITECONFIG=1; \ + $< $(KCONF_FLAGS) Config.in + +config-clean: FORCE + $(_SINGLE)$(NO_TRACE_MAKE) -C scripts/config clean + +defconfig: scripts/config/conf prepare-tmpinfo FORCE + touch .config + @if [ ! -s .config -a -e $(HOME)/.openwrt/defconfig ]; then cp $(HOME)/.openwrt/defconfig .config; fi + [ -L .config ] && export KCONFIG_OVERWRITECONFIG=1; \ + $< $(KCONF_FLAGS) --defconfig=.config Config.in + +confdefault-y=allyes +confdefault-m=allmod +confdefault-n=allno +confdefault:=$(confdefault-$(CONFDEFAULT)) + +oldconfig: scripts/config/conf prepare-tmpinfo FORCE + [ -L .config ] && export KCONFIG_OVERWRITECONFIG=1; \ + $< $(KCONF_FLAGS) --$(if $(confdefault),$(confdefault),old)config Config.in + +menuconfig: scripts/config/mconf prepare-tmpinfo FORCE + if [ \! -e .config -a -e $(HOME)/.openwrt/defconfig ]; then \ + cp $(HOME)/.openwrt/defconfig .config; \ + fi + [ -L .config ] && export KCONFIG_OVERWRITECONFIG=1; \ + $< Config.in + +nconfig: scripts/config/nconf prepare-tmpinfo FORCE + if [ \! -e .config -a -e $(HOME)/.openwrt/defconfig ]; then \ + cp $(HOME)/.openwrt/defconfig .config; \ + fi + [ -L .config ] && export KCONFIG_OVERWRITECONFIG=1; \ + $< Config.in + +xconfig: scripts/config/qconf prepare-tmpinfo FORCE + if [ \! -e .config -a -e $(HOME)/.openwrt/defconfig ]; then \ + cp $(HOME)/.openwrt/defconfig .config; \ + fi + $< Config.in + +prepare_kernel_conf: .config toolchain/install FORCE + +ifeq ($(wildcard $(STAGING_DIR_HOST)/bin/quilt),) + prepare_kernel_conf: + @+$(SUBMAKE) -r tools/quilt/compile +else + prepare_kernel_conf: ; +endif + +kernel_oldconfig: prepare_kernel_conf + $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux oldconfig + +ifneq ($(DISTRO_PKG_CONFIG),) +kernel_menuconfig: export PATH:=$(dir $(DISTRO_PKG_CONFIG)):$(PATH) +kernel_nconfig: export PATH:=$(dir $(DISTRO_PKG_CONFIG)):$(PATH) +kernel_xconfig: export PATH:=$(dir $(DISTRO_PKG_CONFIG)):$(PATH) +endif +kernel_menuconfig: prepare_kernel_conf + $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux menuconfig + +kernel_nconfig: prepare_kernel_conf + $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux nconfig + +kernel_xconfig: prepare_kernel_conf + $(_SINGLE)$(NO_TRACE_MAKE) -C target/linux xconfig + +$(STAGING_DIR_HOST)/.prereq-build: include/prereq-build.mk + mkdir -p tmp + @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq 2>/dev/null || { \ + echo "Prerequisite check failed. Use FORCE=1 to override."; \ + false; \ + } + ifneq ($(realpath $(TOPDIR)/include/prepare.mk),) + @$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prepare.mk prepare 2>/dev/null || { \ + echo "Preparation failed."; \ + false; \ + } + endif + touch $@ + +printdb: FORCE + @$(_SINGLE)$(NO_TRACE_MAKE) -p $@ V=99 DUMP_TARGET_DB=1 2>&1 + +ifndef SDK + DOWNLOAD_DIRS = tools/download toolchain/download package/download target/download +else + DOWNLOAD_DIRS = package/download +endif + +download: .config FORCE $(if $(wildcard $(STAGING_DIR_HOST)/bin/flock),,tools/flock/compile) + @+$(foreach dir,$(DOWNLOAD_DIRS),$(SUBMAKE) $(dir);) + +clean dirclean: .config + @+$(SUBMAKE) -r $@ + +prereq:: prepare-tmpinfo .config + @+$(NO_TRACE_MAKE) -r -s $@ + +check: .config FORCE + @+$(NO_TRACE_MAKE) -r -s $@ QUIET= V=s + +val.%: FORCE + @+$(NO_TRACE_MAKE) -r -s $@ QUIET= V=s + +WARN_PARALLEL_ERROR = $(if $(BUILD_LOG),,$(and $(filter -j,$(MAKEFLAGS)),$(findstring s,$(OPENWRT_VERBOSE)))) + +ifeq ($(SDK),1) + +%:: + @+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq + @./scripts/config/conf $(KCONF_FLAGS) --defconfig=.config Config.in + @+$(ULIMIT_FIX) $(SUBMAKE) -r $@ + +else + +%:: + @+$(PREP_MK) $(NO_TRACE_MAKE) -r -s prereq + @( \ + cp .config tmp/.config; \ + ./scripts/config/conf $(KCONF_FLAGS) --defconfig=tmp/.config -w tmp/.config Config.in > /dev/null 2>&1; \ + if ./scripts/kconfig.pl '>' .config tmp/.config | grep -q CONFIG; then \ + printf "$(_R)WARNING: your configuration is out of sync. Please run make menuconfig, oldconfig or defconfig!$(_N)\n" >&2; \ + fi \ + ) + @+$(ULIMIT_FIX) $(SUBMAKE) -r $@ $(if $(WARN_PARALLEL_ERROR), || { \ + printf "$(_R)Build failed - please re-run with -j1 to see the real error message$(_N)\n" >&2; \ + false; \ + } ) + +endif + +# update all feeds, re-create index files, install symlinks +package/symlinks: + ./scripts/feeds update -a + ./scripts/feeds install -a + +# re-create index files, install symlinks +package/symlinks-install: + ./scripts/feeds update -i + ./scripts/feeds install -a + +# remove all symlinks, don't touch ./feeds +package/symlinks-clean: + ./scripts/feeds uninstall -a + +help: + cat README.md + +distclean: + rm -rf bin build_dir .ccache .config* dl feeds key-build* logs package/feeds staging_dir tmp + @$(_SINGLE)$(SUBMAKE) -C scripts/config clean + +ifeq ($(findstring v,$(DEBUG)),) + .SILENT: symlinkclean clean dirclean distclean config-clean download help tmpinfo-clean .config scripts/config/mconf scripts/config/conf menuconfig $(STAGING_DIR_HOST)/.prereq-build tmp/.prereq-package prepare-tmpinfo +endif +.PHONY: help FORCE +.NOTPARALLEL: + diff --git a/include/trusted-firmware-a.mk b/include/trusted-firmware-a.mk new file mode 100644 index 0000000..0c0118e --- /dev/null +++ b/include/trusted-firmware-a.mk @@ -0,0 +1,102 @@ +PKG_NAME ?= trusted-firmware-a +PKG_CPE_ID ?= cpe:/a:arm:trusted_firmware-a + +ifndef PKG_SOURCE_PROTO +PKG_SOURCE = trusted-firmware-a-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/snapshot +endif + +PKG_BUILD_DIR = $(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION) + +PKG_TARGETS := bin +PKG_FLAGS:=nonshared + +PKG_LICENSE:=BSD-3-Clause +PKG_LICENSE_FILES:=docs/license.rst + +PKG_BUILD_PARALLEL:=1 + +export GCC_HONOUR_COPTS=s + +define Package/trusted-firmware-a/install/default + $(CP) $(patsubst %,$(PKG_BUILD_DIR)/build/$(PLAT)/release/%,$(TFA_IMAGE)) $(1)/ +endef + +Package/trusted-firmware-a/install = $(Package/trusted-firmware-a/install/default) + +define Trusted-Firmware-A/Init + BUILD_TARGET:= + BUILD_SUBTARGET:= + BUILD_DEVICES:= + NAME:= + DEPENDS:= + HIDDEN:= + DEFAULT:= + PLAT:= + VARIANT:=$(1) + TFA_IMAGE:= +endef + +TARGET_DEP = TARGET_$(BUILD_TARGET)$(if $(BUILD_SUBTARGET),_$(BUILD_SUBTARGET)) + +define Build/Trusted-Firmware-A/Target + $(eval $(call Trusted-Firmware-A/Init,$(1))) + $(eval $(call Trusted-Firmware-A/Default,$(1))) + $(eval $(call Trusted-Firmware-A/$(1),$(1))) + + define Package/trusted-firmware-a-$(1) + SECTION:=boot + CATEGORY:=Boot Loaders + TITLE:=Trusted-Firmware-A for $(NAME) + VARIANT:=$(VARIANT) + DEPENDS:=@!IN_SDK $(DEPENDS) + HIDDEN:=$(HIDDEN) + ifneq ($(BUILD_TARGET),) + DEPENDS += @$(TARGET_DEP) + ifneq ($(BUILD_DEVICES),) + DEFAULT := y if ($(TARGET_DEP)_Default \ + $(patsubst %,|| $(TARGET_DEP)_DEVICE_%,$(BUILD_DEVICES)) \ + $(patsubst %,|| $(patsubst TARGET_%,TARGET_DEVICE_%,$(TARGET_DEP))_DEVICE_%,$(BUILD_DEVICES))) + endif + endif + $(if $(DEFAULT),DEFAULT:=$(DEFAULT)) + URL:=https://www.trustedfirmware.org/projects/tf-a/ + endef + + define Package/trusted-firmware-a-$(1)/install + $$(Package/trusted-firmware-a/install) + endef +endef + +define Build/Configure/Trusted-Firmware-A + $(INSTALL_DIR) $(STAGING_DIR)/usr/include +endef + +DTC=$(wildcard $(LINUX_DIR)/scripts/dtc/dtc) + +define Build/Compile/Trusted-Firmware-A + +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \ + CROSS_COMPILE=$(TARGET_CROSS) \ + OPENSSL_DIR=$(STAGING_DIR_HOST) \ + $(if $(DTC),DTC="$(DTC)") \ + PLAT=$(PLAT) \ + BUILD_STRING="OpenWrt v$(PKG_VERSION)-$(PKG_RELEASE) ($(VARIANT))" \ + $(if $(CONFIG_BINUTILS_VERSION_2_37)$(CONFIG_BINUTILS_VERSION_2_38),,LDFLAGS="-no-warn-rwx-segments") \ + $(TFA_MAKE_FLAGS) +endef + +define BuildPackage/Trusted-Firmware-A/Defaults + Build/Configure/Default = $$$$(Build/Configure/Trusted-Firmware-A) + Build/Compile/Default = $$$$(Build/Compile/Trusted-Firmware-A) +endef + +define BuildPackage/Trusted-Firmware-A + $(eval $(call BuildPackage/Trusted-Firmware-A/Defaults)) + $(foreach type,$(if $(DUMP),$(TFA_TARGETS),$(BUILD_VARIANT)), \ + $(eval $(call Build/Trusted-Firmware-A/Target,$(type))) + ) + $(eval $(call Build/DefaultTargets)) + $(foreach type,$(if $(DUMP),$(TFA_TARGETS),$(BUILD_VARIANT)), \ + $(call BuildPackage,trusted-firmware-a-$(type)) + ) +endef diff --git a/include/u-boot.mk b/include/u-boot.mk new file mode 100644 index 0000000..2b81064 --- /dev/null +++ b/include/u-boot.mk @@ -0,0 +1,114 @@ +PKG_NAME ?= u-boot + +ifndef PKG_SOURCE_PROTO +PKG_SOURCE = $(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL = \ + https://mirror.cyberbits.eu/u-boot \ + https://ftp.denx.de/pub/u-boot \ + ftp://ftp.denx.de/pub/u-boot +endif + +PKG_BUILD_DIR = $(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION) + +PKG_TARGETS := bin +PKG_FLAGS:=nonshared + +PKG_LICENSE:=GPL-2.0 GPL-2.0+ +PKG_LICENSE_FILES:=Licenses/README + +PKG_BUILD_PARALLEL:=1 + +export GCC_HONOUR_COPTS=s + +define Package/u-boot/install/default + $(CP) $(patsubst %,$(PKG_BUILD_DIR)/%,$(UBOOT_IMAGE)) $(1)/ +endef + +Package/u-boot/install = $(Package/u-boot/install/default) + +define U-Boot/Init + BUILD_TARGET:= + BUILD_SUBTARGET:= + BUILD_DEVICES:= + NAME:= + DEPENDS:= + HIDDEN:= + DEFAULT:= + VARIANT:=$(1) + UBOOT_CONFIG:=$(1) + UBOOT_IMAGE:=u-boot.bin +endef + +TARGET_DEP = TARGET_$(BUILD_TARGET)$(if $(BUILD_SUBTARGET),_$(BUILD_SUBTARGET)) + +UBOOT_MAKE_FLAGS = \ + HOSTCC="$(HOSTCC)" \ + HOSTCFLAGS="$(HOST_CFLAGS) $(HOST_CPPFLAGS) -std=gnu11" \ + HOSTLDFLAGS="$(HOST_LDFLAGS)" \ + LOCALVERSION="-OpenWrt-$(REVISION)" \ + STAGING_PREFIX="$(STAGING_DIR_HOST)" \ + PKG_CONFIG_PATH="$(STAGING_DIR_HOST)/lib/pkgconfig" \ + PKG_CONFIG_LIBDIR="$(STAGING_DIR_HOST)/lib/pkgconfig" \ + PKG_CONFIG_EXTRAARGS="--static" \ + $(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') + +define Build/U-Boot/Target + $(eval $(call U-Boot/Init,$(1))) + $(eval $(call U-Boot/Default,$(1))) + $(eval $(call U-Boot/$(1),$(1))) + + define Package/u-boot-$(1) + SECTION:=boot + CATEGORY:=Boot Loaders + TITLE:=U-Boot for $(NAME) + VARIANT:=$(VARIANT) + DEPENDS:=@!IN_SDK $(DEPENDS) + HIDDEN:=$(HIDDEN) + ifneq ($(BUILD_TARGET),) + DEPENDS += @$(TARGET_DEP) + ifneq ($(BUILD_DEVICES),) + DEFAULT := y if ($(TARGET_DEP)_Default \ + $(patsubst %,|| $(TARGET_DEP)_DEVICE_%,$(BUILD_DEVICES)) \ + $(patsubst %,|| $(patsubst TARGET_%,TARGET_DEVICE_%,$(TARGET_DEP))_DEVICE_%,$(BUILD_DEVICES))) + endif + endif + $(if $(DEFAULT),DEFAULT:=$(DEFAULT)) + URL:=http://www.denx.de/wiki/U-Boot + endef + + define Package/u-boot-$(1)/install + $$(Package/u-boot/install) + endef +endef + +define Build/Configure/U-Boot + +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) $(UBOOT_CONFIGURE_VARS) $(UBOOT_CONFIG)_config + $(if $(strip $(UBOOT_CUSTOMIZE_CONFIG)), + $(PKG_BUILD_DIR)/scripts/config --file $(PKG_BUILD_DIR)/.config $(UBOOT_CUSTOMIZE_CONFIG) + +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) $(UBOOT_CONFIGURE_VARS) oldconfig) +endef + +DTC=$(wildcard $(LINUX_DIR)/scripts/dtc/dtc) + +define Build/Compile/U-Boot + +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \ + CROSS_COMPILE=$(TARGET_CROSS) \ + $(if $(DTC),DTC="$(DTC)") \ + $(UBOOT_MAKE_FLAGS) +endef + +define BuildPackage/U-Boot/Defaults + Build/Configure/Default = $$$$(Build/Configure/U-Boot) + Build/Compile/Default = $$$$(Build/Compile/U-Boot) +endef + +define BuildPackage/U-Boot + $(eval $(call BuildPackage/U-Boot/Defaults)) + $(foreach type,$(if $(DUMP),$(UBOOT_TARGETS),$(BUILD_VARIANT)), \ + $(eval $(call Build/U-Boot/Target,$(type))) + ) + $(eval $(call Build/DefaultTargets)) + $(foreach type,$(if $(DUMP),$(UBOOT_TARGETS),$(BUILD_VARIANT)), \ + $(call BuildPackage,u-boot-$(type)) + ) +endef diff --git a/include/uclibc++.mk b/include/uclibc++.mk new file mode 100644 index 0000000..10f8d98 --- /dev/null +++ b/include/uclibc++.mk @@ -0,0 +1,2 @@ +$(warn uclibc++.mk is deprecated. Please remove it and CXX_DEPENDS) +CXX_DEPENDS = +libstdcpp diff --git a/include/unpack.mk b/include/unpack.mk new file mode 100644 index 0000000..5959d55 --- /dev/null +++ b/include/unpack.mk @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +HOST_TAR:=$(TAR) +TAR_CMD=$(HOST_TAR) -C $(1)/.. $(TAR_OPTIONS) +UNZIP_CMD=unzip -q -d $(1)/.. $(DL_DIR)/$(PKG_SOURCE) + +ifeq ($(PKG_SOURCE),) + PKG_UNPACK ?= true +else + +ifeq ($(strip $(UNPACK_CMD)),) + ifeq ($(strip $(PKG_CAT)),) + # try to autodetect file type + EXT:=$(call ext,$(PKG_SOURCE)) + EXT1:=$(EXT) + + ifeq ($(filter gz tgz,$(EXT)),$(EXT)) + EXT:=$(call ext,$(PKG_SOURCE:.$(EXT)=)) + DECOMPRESS_CMD:=$(STAGING_DIR_HOST)/bin/libdeflate-gzip -dc $(DL_DIR)/$(PKG_SOURCE) | + endif + ifeq ($(filter bzip2 bz2 bz tbz2 tbz,$(EXT)),$(EXT)) + EXT:=$(call ext,$(PKG_SOURCE:.$(EXT)=)) + DECOMPRESS_CMD:=bzcat $(DL_DIR)/$(PKG_SOURCE) | + endif + ifeq ($(filter xz txz,$(EXT)),$(EXT)) + EXT:=$(call ext,$(PKG_SOURCE:.$(EXT)=)) + DECOMPRESS_CMD:=xzcat $(DL_DIR)/$(PKG_SOURCE) | + endif + ifeq (zst,$(EXT)) + EXT:=$(call ext,$(PKG_SOURCE:.$(EXT)=)) + DECOMPRESS_CMD:=zstdcat $(DL_DIR)/$(PKG_SOURCE) | + endif + ifeq ($(filter tgz tbz tbz2 txz,$(EXT1)),$(EXT1)) + EXT:=tar + endif + DECOMPRESS_CMD ?= cat $(DL_DIR)/$(PKG_SOURCE) | + ifeq ($(EXT),tar) + UNPACK_CMD=$(DECOMPRESS_CMD) $(TAR_CMD) + endif + ifeq ($(EXT),cpio) + UNPACK_CMD=$(DECOMPRESS_CMD) (cd $(1)/..; $(STAGING_DIR_HOST)/bin/cpio -i -d) + endif + ifeq ($(EXT),zip) + UNPACK_CMD=$(UNZIP_CMD) + endif + endif + + # compatibility code for packages that set PKG_CAT + ifeq ($(strip $(UNPACK_CMD)),) + # use existing PKG_CAT + UNPACK_CMD=$(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | $(TAR_CMD) + ifeq ($(PKG_CAT),unzip) + UNPACK_CMD=$(UNZIP_CMD) + endif + # replace zcat with $(ZCAT), because some system don't support it properly + ifeq ($(PKG_CAT),zcat) + UNPACK_CMD=$(STAGING_DIR_HOST)/bin/libdeflate-gzip -dc $(DL_DIR)/$(PKG_SOURCE) | $(TAR_CMD) + endif + endif +endif + +ifdef PKG_BUILD_DIR + PKG_UNPACK ?= $(SH_FUNC) $(call UNPACK_CMD,$(PKG_BUILD_DIR)) +endif +ifdef HOST_BUILD_DIR + HOST_UNPACK ?= $(SH_FUNC) $(call UNPACK_CMD,$(HOST_BUILD_DIR)) +endif + +endif # PKG_SOURCE + diff --git a/include/verbose.mk b/include/verbose.mk new file mode 100644 index 0000000..4487a20 --- /dev/null +++ b/include/verbose.mk @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2006-2020 OpenWrt.org + +ifndef OPENWRT_VERBOSE + OPENWRT_VERBOSE:= +endif +ifeq ("$(origin V)", "command line") + OPENWRT_VERBOSE:=$(V) +endif + +ifeq ($(OPENWRT_VERBOSE),1) + OPENWRT_VERBOSE:=w +endif +ifeq ($(OPENWRT_VERBOSE),99) + OPENWRT_VERBOSE:=s +endif + +ifeq ($(NO_TRACE_MAKE),) +NO_TRACE_MAKE := $(MAKE) V=s$(OPENWRT_VERBOSE) +export NO_TRACE_MAKE +endif + +ifeq ($(IS_TTY),1) + ifneq ($(strip $(NO_COLOR)),1) + _Y:=\\033[33m + _R:=\\033[31m + _N:=\\033[m + endif +endif + +define ERROR_MESSAGE + printf "$(_R)%s$(_N)\n" "$(1)" >&8 +endef + +ifeq ($(findstring s,$(OPENWRT_VERBOSE)),) + define MESSAGE + printf "$(_Y)%s$(_N)\n" "$(1)" >&8 + endef + + ifeq ($(QUIET),1) + ifneq ($(CURDIR),$(TOPDIR)) + _DIR:=$(patsubst $(TOPDIR)/%,%,${CURDIR}) + else + _DIR:= + endif + _NULL:=$(if $(MAKECMDGOALS),$(shell \ + $(call MESSAGE, make[$(MAKELEVEL)]$(if $(_DIR), -C $(_DIR)) $(MAKECMDGOALS)); \ + )) + SUBMAKE=$(MAKE) + else + SILENT:=>/dev/null $(if $(findstring w,$(OPENWRT_VERBOSE)),,2>&1) + export QUIET:=1 + SUBMAKE=cmd() { $(SILENT) $(MAKE) -s "$$@" < /dev/null || { echo "make $$*: build failed. Please re-run make with -j1 V=s or V=sc for a higher verbosity level to see what's going on"; false; } } 8>&1 9>&2; cmd + endif + + .SILENT: $(MAKECMDGOALS) +else + SUBMAKE=$(MAKE) -w + define MESSAGE + printf "%s\n" "$(1)" + endef +endif diff --git a/include/version.mk b/include/version.mk new file mode 100644 index 0000000..924bf83 --- /dev/null +++ b/include/version.mk @@ -0,0 +1,108 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (C) 2012-2015 OpenWrt.org +# Copyright (C) 2016 LEDE Project + +# Substituted by SDK, do not remove +# REVISION:=x +# SOURCE_DATE_EPOCH:=x + +PKG_CONFIG_DEPENDS += \ + CONFIG_VERSION_HOME_URL \ + CONFIG_VERSION_BUG_URL \ + CONFIG_VERSION_NUMBER \ + CONFIG_VERSION_CODE \ + CONFIG_VERSION_REPO \ + CONFIG_VERSION_DIST \ + CONFIG_VERSION_MANUFACTURER \ + CONFIG_VERSION_MANUFACTURER_URL \ + CONFIG_VERSION_PRODUCT \ + CONFIG_VERSION_SUPPORT_URL \ + CONFIG_VERSION_HWREV \ + +sanitize = $(call tolower,$(subst _,-,$(subst $(space),-,$(1)))) + +VERSION_NUMBER:=$(call qstrip,$(CONFIG_VERSION_NUMBER)) +VERSION_NUMBER:=$(if $(VERSION_NUMBER),$(VERSION_NUMBER),23.05-SNAPSHOT) + +VERSION_CODE:=$(call qstrip,$(CONFIG_VERSION_CODE)) +VERSION_CODE:=$(if $(VERSION_CODE),$(VERSION_CODE),$(REVISION)) + +VERSION_REPO:=$(call qstrip,$(CONFIG_VERSION_REPO)) +VERSION_REPO:=$(if $(VERSION_REPO),$(VERSION_REPO),https://downloads.openwrt.org/releases/23.05-SNAPSHOT) + +VERSION_DIST:=$(call qstrip,$(CONFIG_VERSION_DIST)) +VERSION_DIST:=$(if $(VERSION_DIST),$(VERSION_DIST),OpenWrt) +VERSION_DIST_SANITIZED:=$(call sanitize,$(VERSION_DIST)) + +VERSION_MANUFACTURER:=$(call qstrip,$(CONFIG_VERSION_MANUFACTURER)) +VERSION_MANUFACTURER:=$(if $(VERSION_MANUFACTURER),$(VERSION_MANUFACTURER),OpenWrt) + +VERSION_MANUFACTURER_URL:=$(call qstrip,$(CONFIG_VERSION_MANUFACTURER_URL)) +VERSION_MANUFACTURER_URL:=$(if $(VERSION_MANUFACTURER_URL),$(VERSION_MANUFACTURER_URL),https://openwrt.org/) + +VERSION_BUG_URL:=$(call qstrip,$(CONFIG_VERSION_BUG_URL)) +VERSION_BUG_URL:=$(if $(VERSION_BUG_URL),$(VERSION_BUG_URL),https://bugs.openwrt.org/) + +VERSION_HOME_URL:=$(call qstrip,$(CONFIG_VERSION_HOME_URL)) +VERSION_HOME_URL:=$(if $(VERSION_HOME_URL),$(VERSION_HOME_URL),https://openwrt.org/) + +VERSION_SUPPORT_URL:=$(call qstrip,$(CONFIG_VERSION_SUPPORT_URL)) +VERSION_SUPPORT_URL:=$(if $(VERSION_SUPPORT_URL),$(VERSION_SUPPORT_URL),https://forum.openwrt.org/) + +VERSION_PRODUCT:=$(call qstrip,$(CONFIG_VERSION_PRODUCT)) +VERSION_PRODUCT:=$(if $(VERSION_PRODUCT),$(VERSION_PRODUCT),Generic) + +VERSION_HWREV:=$(call qstrip,$(CONFIG_VERSION_HWREV)) +VERSION_HWREV:=$(if $(VERSION_HWREV),$(VERSION_HWREV),v0) + +define taint2sym +$(CONFIG_$(firstword $(subst :, ,$(subst +,,$(subst -,,$(1)))))) +endef + +define taint2name +$(lastword $(subst :, ,$(1))) +endef + +VERSION_TAINT_SPECS := \ + -ALL_KMODS:no-all \ + -IPV6:no-ipv6 \ + +USE_GLIBC:glibc \ + +USE_MKLIBS:mklibs \ + +BUSYBOX_CUSTOM:busybox \ + +OVERRIDE_PKGS:override \ + +VERSION_TAINTS := $(strip $(foreach taint,$(VERSION_TAINT_SPECS), \ + $(if $(findstring +,$(taint)), \ + $(if $(call taint2sym,$(taint)),$(call taint2name,$(taint))), \ + $(if $(call taint2sym,$(taint)),,$(call taint2name,$(taint))) \ + ))) + +PKG_CONFIG_DEPENDS += $(foreach taint,$(VERSION_TAINT_SPECS),$(call taint2sym,$(taint))) + +# escape commas, backslashes, squotes, and ampersands for sed +define sed_escape +$(subst &,\&,$(subst $(comma),\$(comma),$(subst ','\'',$(subst \,\\,$(1))))) +endef +#' + +VERSION_SED_SCRIPT:=$(SED) 's,%U,$(call sed_escape,$(VERSION_REPO)),g' \ + -e 's,%V,$(call sed_escape,$(VERSION_NUMBER)),g' \ + -e 's,%v,\L$(call sed_escape,$(subst $(space),_,$(VERSION_NUMBER))),g' \ + -e 's,%C,$(call sed_escape,$(VERSION_CODE)),g' \ + -e 's,%c,\L$(call sed_escape,$(subst $(space),_,$(VERSION_CODE))),g' \ + -e 's,%D,$(call sed_escape,$(VERSION_DIST)),g' \ + -e 's,%d,\L$(call sed_escape,$(subst $(space),_,$(VERSION_DIST))),g' \ + -e 's,%R,$(call sed_escape,$(REVISION)),g' \ + -e 's,%T,$(call sed_escape,$(BOARD)),g' \ + -e 's,%S,$(call sed_escape,$(BOARD)/$(if $(SUBTARGET),$(SUBTARGET),generic)),g' \ + -e 's,%A,$(call sed_escape,$(ARCH_PACKAGES)),g' \ + -e 's,%t,$(call sed_escape,$(VERSION_TAINTS)),g' \ + -e 's,%M,$(call sed_escape,$(VERSION_MANUFACTURER)),g' \ + -e 's,%m,$(call sed_escape,$(VERSION_MANUFACTURER_URL)),g' \ + -e 's,%b,$(call sed_escape,$(VERSION_BUG_URL)),g' \ + -e 's,%u,$(call sed_escape,$(VERSION_HOME_URL)),g' \ + -e 's,%s,$(call sed_escape,$(VERSION_SUPPORT_URL)),g' \ + -e 's,%P,$(call sed_escape,$(VERSION_PRODUCT)),g' \ + -e 's,%h,$(call sed_escape,$(VERSION_HWREV)),g' + diff --git a/package/Makefile b/package/Makefile new file mode 100644 index 0000000..d72ce09 --- /dev/null +++ b/package/Makefile @@ -0,0 +1,127 @@ +# +# Copyright (C) 2006-2010 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +curdir:=package + +include $(INCLUDE_DIR)/feeds.mk +include $(INCLUDE_DIR)/rootfs.mk + +-include $(TMP_DIR)/.packagedeps +package-y += kernel/linux +$(curdir)/autoremove:=1 +$(curdir)/builddirs:=$(sort $(package-) $(package-y) $(package-m)) +$(curdir)/builddirs-default:=. $(sort $(package-y) $(package-m)) +$(curdir)/builddirs-prereq:=. $(sort $(prereq-y) $(prereq-m)) +ifdef CHECK_ALL +$(curdir)/builddirs-check:=$($(curdir)/builddirs) +$(curdir)/builddirs-download:=$($(curdir)/builddirs) +endif +ifneq ($(IGNORE_ERRORS),) + package-y-filter := $(package-y) + package-m-filter := $(filter-out $(package-y),$(package-m)) + package-n-filter := $(filter-out $(package-y) $(package-m),$(package-)) + package-ignore-errors := $(filter n m y,$(IGNORE_ERRORS)) + package-ignore-errors := $(if $(package-ignore-errors),$(package-ignore-errors),n m) + package-ignore-subdirs := $(sort $(foreach m,$(package-ignore-errors),$(package-$(m)-filter))) + $(curdir)/builddirs-ignore-download := $(package-ignore-subdirs) + $(curdir)/builddirs-ignore-compile := $(package-ignore-subdirs) + $(curdir)/builddirs-ignore-host-download := $(package-ignore-subdirs) + $(curdir)/builddirs-ignore-host-compile := $(package-ignore-subdirs) +endif + +PACKAGE_INSTALL_FILES:= \ + $(foreach pkg,$(sort $(package-y)), \ + $(foreach variant, \ + $(if $(strip $(package/$(pkg)/variants)), \ + $(package/$(pkg)/variants), \ + $(if $(package/$(pkg)/default-variant), \ + $(package/$(pkg)/default-variant), \ + default \ + ) \ + ), \ + $(PKG_INFO_DIR)/$(lastword $(subst /,$(space),$(pkg))).$(variant).install \ + ) \ + ) + +$(curdir)/cleanup: $(TMP_DIR)/.build + rm -rf $(STAGING_DIR_ROOT) + +$(curdir)/merge: + rm -rf $(PACKAGE_DIR_ALL) + mkdir -p $(PACKAGE_DIR_ALL) + -$(foreach pdir,$(PACKAGE_SUBDIRS),$(if $(wildcard $(pdir)/*.ipk),ln -s $(pdir)/*.ipk $(PACKAGE_DIR_ALL);)) + +$(curdir)/merge-index: $(curdir)/merge + (cd $(PACKAGE_DIR_ALL) && $(SCRIPT_DIR)/ipkg-make-index.sh . 2>&1 > Packages; ) + +ifndef SDK + $(curdir)//compile = $(STAGING_DIR)/.prepared $(BIN_DIR) + $(curdir)/compile: $(curdir)/system/opkg/host/compile +endif + +$(curdir)/install: $(TMP_DIR)/.build $(curdir)/merge $(if $(CONFIG_TARGET_PER_DEVICE_ROOTFS),$(curdir)/merge-index) + - find $(STAGING_DIR_ROOT) -type d | $(XARGS) chmod 0755 + rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG) + mkdir -p $(TARGET_DIR)/tmp + $(file >$(TMP_DIR)/opkg_install_list,\ + $(call opkg_package_files,\ + $(foreach pkg,$(shell cat $(PACKAGE_INSTALL_FILES) 2>/dev/null),$(pkg)$(call GetABISuffix,$(pkg))))) + $(call opkg,$(TARGET_DIR)) install $$(cat $(TMP_DIR)/opkg_install_list) + @for file in $(PACKAGE_INSTALL_FILES); do \ + [ -s $$file.flags ] || continue; \ + for flag in `cat $$file.flags`; do \ + $(call opkg,$(TARGET_DIR)) flag $$flag `cat $$file`; \ + done; \ + done || true + + $(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG) + + $(call prepare_rootfs,$(TARGET_DIR),$(TOPDIR)/files) + +$(curdir)/index: FORCE + @echo Generating package index... + @for d in $(PACKAGE_SUBDIRS); do ( \ + mkdir -p $$d; \ + cd $$d || continue; \ + $(SCRIPT_DIR)/ipkg-make-index.sh . 2>&1 > Packages.manifest; \ + grep -vE '^(Maintainer|LicenseFiles|Source|SourceName|Require|SourceDateEpoch)' Packages.manifest > Packages; \ + case "$$(((64 + $$(stat -L -c%s Packages)) % 128))" in 110|111) \ + $(call ERROR_MESSAGE,WARNING: Applying padding in $$d/Packages to workaround usign SHA-512 bug!); \ + { echo ""; echo ""; } >> Packages;; \ + esac; \ + echo -n '{"architecture": "$(ARCH_PACKAGES)", "packages":{' > index.json; \ + sed -n -e 's/^Package: \(.*\)$$/"\1":/p' -e 's/^Version: \(.*\)$$/"\1",/p' Packages | tr '\n' ' ' >> index.json; \ + echo '}}' >> index.json; \ + sed -i 's/, }}/}}/' index.json; \ + gzip -9nc Packages > Packages.gz; \ + ); done +ifdef CONFIG_SIGNED_PACKAGES + @echo Signing package index... + @for d in $(PACKAGE_SUBDIRS); do ( \ + [ -d $$d ] && \ + cd $$d || continue; \ + $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY); \ + ); done +endif +ifdef CONFIG_JSON_CYCLONEDX_SBOM + @echo Creating CycloneDX package SBOMs... + @for d in $(PACKAGE_SUBDIRS); do ( \ + [ -d $$d ] && \ + cd $$d || continue; \ + $(SCRIPT_DIR)/package-metadata.pl pkgcyclonedxsbom Packages.manifest > Packages.bom.cdx.json || true; \ + ); done +endif + +$(curdir)/flags-install:= -j1 + +$(eval $(call stampfile,$(curdir),package,prereq,.config)) +$(eval $(call stampfile,$(curdir),package,cleanup,$(TMP_DIR)/.build)) +$(eval $(call stampfile,$(curdir),package,compile,$(TMP_DIR)/.build)) +$(eval $(call stampfile,$(curdir),package,install,$(TMP_DIR)/.build)) +$(eval $(call stampfile,$(curdir),package,check,$(TMP_DIR)/.build)) + +$(eval $(call subdir,$(curdir))) diff --git a/package/base-files/Makefile b/package/base-files/Makefile new file mode 100644 index 0000000..8732f82 --- /dev/null +++ b/package/base-files/Makefile @@ -0,0 +1,249 @@ +# +# Copyright (C) 2007-2021 OpenWrt.org +# Copyright (C) 2010 Vertical Communications +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk +include $(INCLUDE_DIR)/version.mk +include $(INCLUDE_DIR)/feeds.mk + +PKG_NAME:=base-files +PKG_FLAGS:=nonshared +PKG_RELEASE:=$(COMMITCOUNT) + +PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/ +PKG_BUILD_DEPENDS:=usign/host ucert/host +PKG_LICENSE:=GPL-2.0 + +# Extend depends from version.mk +PKG_CONFIG_DEPENDS += \ + CONFIG_SIGNED_PACKAGES CONFIG_TARGET_INIT_PATH CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE \ + CONFIG_NAND_SUPPORT \ + CONFIG_LEGACY_SDCARD_SUPPORT \ + CONFIG_EMMC_SUPPORT \ + CONFIG_CLEAN_IPKG \ + CONFIG_PER_FEED_REPO \ + $(foreach feed,$(FEEDS_AVAILABLE),CONFIG_FEED_$(feed)) + +include $(INCLUDE_DIR)/package.mk + +ifneq ($(DUMP),1) + STAMP_CONFIGURED:=$(strip $(STAMP_CONFIGURED))_$(shell echo $(CONFIG_TARGET_INIT_PATH) | $(MKHASH) md5) + TARGET:=-$(BOARD) +endif + +define Package/base-files + SECTION:=base + CATEGORY:=Base system + DEPENDS:=+netifd +libc +jsonfilter +SIGNED_PACKAGES:usign +SIGNED_PACKAGES:openwrt-keyring +NAND_SUPPORT:ubi-utils +fstools +fwtool + TITLE:=Base filesystem for OpenWrt + URL:=http://openwrt.org/ + VERSION:=$(PKG_RELEASE)-$(REVISION) +endef + +define Package/base-files/conffiles +/etc/config/ +/etc/config/network +/etc/config/system +/etc/dropbear/ +/etc/ethers +/etc/group +/etc/hosts +/etc/inittab +/etc/iproute2/rt_protos +/etc/iproute2/rt_tables +/etc/passwd +/etc/profile +/etc/profile.d +/etc/protocols +/etc/rc.local +/etc/services +/etc/shadow +/etc/shells +/etc/shinit +/etc/sysctl.conf +/etc/sysupgrade.conf +$(call $(TARGET)/conffiles) +endef + +define Package/base-files/description + This package contains a base filesystem and system scripts for OpenWrt. +endef + +define ImageConfigOptions + mkdir -p $(1)/lib/preinit + echo 'pi_suppress_stderr="$(CONFIG_TARGET_PREINIT_SUPPRESS_STDERR)"' >$(1)/lib/preinit/00_preinit.conf + echo 'fs_failsafe_wait_timeout=$(if $(CONFIG_TARGET_PREINIT_TIMEOUT),$(CONFIG_TARGET_PREINIT_TIMEOUT),2)' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_path="$(TARGET_INIT_PATH)"' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_env=$(if $(CONFIG_TARGET_INIT_ENV),$(CONFIG_TARGET_INIT_ENV),"")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_cmd=$(if $(CONFIG_TARGET_INIT_CMD),$(CONFIG_TARGET_INIT_CMD),"/sbin/init")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_suppress_stderr="$(CONFIG_TARGET_INIT_SUPPRESS_STDERR)"' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_ifname=$(if $(CONFIG_TARGET_PREINIT_IFNAME),$(CONFIG_TARGET_PREINIT_IFNAME),"")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_ip=$(if $(CONFIG_TARGET_PREINIT_IP),$(CONFIG_TARGET_PREINIT_IP),"192.168.1.1")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_netmask=$(if $(CONFIG_TARGET_PREINIT_NETMASK),$(CONFIG_TARGET_PREINIT_NETMASK),"255.255.255.0")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_broadcast=$(if $(CONFIG_TARGET_PREINIT_BROADCAST),$(CONFIG_TARGET_PREINIT_BROADCAST),"192.168.1.255")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_preinit_net_messages="$(CONFIG_TARGET_PREINIT_SHOW_NETMSG)"' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_preinit_no_failsafe_netmsg="$(CONFIG_TARGET_PREINIT_SUPPRESS_FAILSAFE_NETMSG)"' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_preinit_no_failsafe="$(CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE)"' >>$(1)/lib/preinit/00_preinit.conf +ifeq ($(CONFIG_TARGET_DEFAULT_LAN_IP_FROM_PREINIT),y) + mkdir -p $(1)/etc/board.d + echo '. /lib/functions/uci-defaults.sh' >$(1)/etc/board.d/99-lan-ip + echo 'logger -t 99-lan-ip "setting custom default LAN IP"' >>$(1)/etc/board.d/99-lan-ip + echo 'board_config_update' >>$(1)/etc/board.d/99-lan-ip + echo 'json_select network' >>$(1)/etc/board.d/99-lan-ip + echo 'json_select lan' >>$(1)/etc/board.d/99-lan-ip + echo 'json_add_string ipaddr $(if $(CONFIG_TARGET_PREINIT_IP),$(CONFIG_TARGET_PREINIT_IP),"192.168.1.1")' >>$(1)/etc/board.d/99-lan-ip + echo 'json_add_string netmask $(if $(CONFIG_TARGET_PREINIT_NETMASK),$(CONFIG_TARGET_PREINIT_NETMASK),"255.255.255.0")' >>$(1)/etc/board.d/99-lan-ip + echo 'json_select ..' >>$(1)/etc/board.d/99-lan-ip + echo 'json_select ..' >>$(1)/etc/board.d/99-lan-ip + echo 'board_config_flush' >>$(1)/etc/board.d/99-lan-ip +endif +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) +endef + +define Build/Compile/Default + +endef +Build/Compile = $(Build/Compile/Default) + +ifdef CONFIG_SIGNED_PACKAGES + define Build/Configure + [ -s $(BUILD_KEY) -a -s $(BUILD_KEY).pub ] || \ + $(STAGING_DIR_HOST)/bin/usign -G -s $(BUILD_KEY) -p $(BUILD_KEY).pub -c "Local build key" + + [ -s $(BUILD_KEY).ucert ] || \ + $(STAGING_DIR_HOST)/bin/ucert -I -c $(BUILD_KEY).ucert -p $(BUILD_KEY).pub -s $(BUILD_KEY) + + endef + +ifndef CONFIG_BUILDBOT + define Package/base-files/install-key + mkdir -p $(1)/etc/opkg/keys + $(CP) $(BUILD_KEY).pub $(1)/etc/opkg/keys/`$(STAGING_DIR_HOST)/bin/usign -F -p $(BUILD_KEY).pub` + + endef +endif +endif + +ifeq ($(CONFIG_NAND_SUPPORT),) + define Package/base-files/nand-support + rm -f $(1)/lib/upgrade/nand.sh + endef +endif + +ifeq ($(CONFIG_EMMC_SUPPORT),) + define Package/base-files/emmc-support + rm -f $(1)/lib/upgrade/emmc.sh + endef +endif + +ifeq ($(CONFIG_LEGACY_SDCARD_SUPPORT),) + define Package/base-files/legacy-sdcard-support + rm -f $(1)/lib/upgrade/legacy-sdcard.sh + endef +endif + + +define Package/base-files/install + $(CP) ./files/* $(1)/ + $(Package/base-files/install-key) + $(Package/base-files/nand-support) + $(Package/base-files/legacy-sdcard-support) + $(Package/base-files/emmc-support) + if [ -d $(GENERIC_PLATFORM_DIR)/base-files/. ]; then \ + $(CP) $(GENERIC_PLATFORM_DIR)/base-files/* $(1)/; \ + fi + if [ -d $(PLATFORM_DIR)/base-files/. ]; then \ + $(CP) $(PLATFORM_DIR)/base-files/* $(1)/; \ + fi + $(if $(filter-out $(PLATFORM_DIR),$(PLATFORM_SUBDIR)), \ + if [ -d $(PLATFORM_SUBDIR)/base-files/. ]; then \ + $(CP) $(PLATFORM_SUBDIR)/base-files/* $(1)/; \ + fi; \ + ) + + $(VERSION_SED_SCRIPT) \ + $(1)/etc/banner \ + $(1)/etc/device_info \ + $(1)/etc/openwrt_release \ + $(1)/etc/openwrt_version \ + $(1)/usr/lib/os-release + + + $(SED) "s#%PATH%#$(TARGET_INIT_PATH)#g" \ + $(1)/sbin/hotplug-call \ + $(1)/etc/preinit \ + $(1)/etc/profile + + mkdir -p \ + $(1)/CONTROL \ + $(1)/dev \ + $(1)/etc/config \ + $(1)/etc/crontabs \ + $(1)/etc/rc.d \ + $(1)/overlay \ + $(1)/lib/firmware \ + $(1)/mnt \ + $(1)/proc \ + $(1)/tmp \ + $(1)/usr/lib \ + $(1)/usr/bin \ + $(1)/sys \ + $(1)/www \ + $(1)/root + + $(LN) /proc/mounts $(1)/etc/mtab + $(if $(LIB_SUFFIX),-$(LN) lib $(1)/lib$(LIB_SUFFIX)) + $(if $(LIB_SUFFIX),-$(LN) lib $(1)/usr/lib$(LIB_SUFFIX)) + +ifneq ($(CONFIG_TARGET_ROOTFS_PERSIST_VAR),y) + rm -f $(1)/var + $(LN) tmp $(1)/var +else + mkdir -p $(1)/var + $(LN) /tmp/run $(1)/var/run +endif + $(LN) /tmp/resolv.conf /tmp/TZ /tmp/localtime $(1)/etc/ + + chmod 0600 $(1)/etc/shadow + chmod 1777 $(1)/tmp + + $(call ImageConfigOptions,$(1)) + $(call Package/base-files/install-target,$(1)) + for conffile in $(1)/etc/config/*; do \ + if [ -f "$$$$conffile" ]; then \ + grep "$$$${conffile##$(1)}" $(1)/CONTROL/conffiles || \ + echo "$$$${conffile##$(1)}" >> $(1)/CONTROL/conffiles; \ + fi \ + done + + $(if $(CONFIG_INCLUDE_CONFIG), \ + echo -e "# Build configuration for board $(BOARD)/$(SUBTARGET)/$(PROFILE)\n" >$(1)/etc/build.config; \ + cat $(BIN_DIR)/config.buildinfo >>$(1)/etc/build.config; \ + cat $(BIN_DIR)/feeds.buildinfo >>$(1)/etc/build.feeds; \ + cat $(BIN_DIR)/version.buildinfo >>$(1)/etc/build.version) + + $(if $(CONFIG_CLEAN_IPKG),, \ + mkdir -p $(1)/etc/opkg; \ + $(call FeedSourcesAppend,$(1)/etc/opkg/distfeeds.conf); \ + $(VERSION_SED_SCRIPT) $(1)/etc/opkg/distfeeds.conf) + $(if $(CONFIG_IPK_FILES_CHECKSUMS),, \ + rm -f $(1)/sbin/pkg_check) + + $(if $(CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE), \ + rm -f $(1)/etc/banner.failsafe,) +endef + +ifneq ($(DUMP),1) + -include $(PLATFORM_DIR)/base-files.mk + -include $(PLATFORM_SUBDIR)/base-files.mk +endif + +$(eval $(call BuildPackage,base-files)) diff --git a/package/base-files/files/bin/board_detect b/package/base-files/files/bin/board_detect new file mode 100755 index 0000000..94f45be --- /dev/null +++ b/package/base-files/files/bin/board_detect @@ -0,0 +1,14 @@ +#!/bin/sh + +CFG=$1 + +[ -n "$CFG" ] || CFG=/etc/board.json + +[ -d "/etc/board.d/" -a ! -s "$CFG" ] && { + for a in $(ls /etc/board.d/*); do + [ -s $a ] || continue; + $(. $a) + done +} + +[ -s "$CFG" ] || return 1 diff --git a/package/base-files/files/bin/config_generate b/package/base-files/files/bin/config_generate new file mode 100755 index 0000000..be21d00 --- /dev/null +++ b/package/base-files/files/bin/config_generate @@ -0,0 +1,542 @@ +#!/bin/sh + +CFG=/etc/board.json + +. /usr/share/libubox/jshn.sh + +[ -s $CFG ] || /bin/board_detect || exit 1 +[ -s /etc/config/network -a -s /etc/config/system ] && exit 0 + +generate_bridge() { + local name=$1 + local macaddr=$2 + uci -q batch <<-EOF + set network.$name=device + set network.$name.name=$name + set network.$name.type=bridge + EOF + if [ -n "$macaddr" ]; then + uci -q batch <<-EOF + set network.$name.macaddr=$macaddr + EOF + fi +} + +bridge_vlan_id=0 +generate_bridge_vlan() { + local name=$1_vlan + local device=$2 + local ports="$3" + local vlan="$4" + uci -q batch <<-EOF + set network.$name=bridge-vlan + set network.$name.device='$device' + set network.$name.vlan='$vlan' + set network.$name.ports='$ports' + EOF +} + +generate_static_network() { + uci -q batch <<-EOF + delete network.loopback + set network.loopback='interface' + set network.loopback.device='lo' + set network.loopback.proto='static' + set network.loopback.ipaddr='127.0.0.1' + set network.loopback.netmask='255.0.0.0' + EOF + [ -e /proc/sys/net/ipv6 ] && { + uci -q batch <<-EOF + delete network.globals + set network.globals='globals' + set network.globals.ula_prefix='auto' + EOF + } + + if json_is_a dsl object; then + json_select dsl + if json_is_a atmbridge object; then + json_select atmbridge + local vpi vci encaps payload nameprefix + json_get_vars vpi vci encaps payload nameprefix + uci -q batch <<-EOF + delete network.atm + set network.atm='atm-bridge' + set network.atm.vpi='$vpi' + set network.atm.vci='$vci' + set network.atm.encaps='$encaps' + set network.atm.payload='$payload' + set network.atm.nameprefix='$nameprefix' + EOF + json_select .. + fi + + if json_is_a modem object; then + json_select modem + local type annex firmware tone xfer_mode + json_get_vars type annex firmware tone xfer_mode + uci -q batch <<-EOF + delete network.dsl + set network.dsl='dsl' + set network.dsl.annex='$annex' + set network.dsl.firmware='$firmware' + set network.dsl.tone='$tone' + set network.dsl.xfer_mode='$xfer_mode' + EOF + json_select .. + fi + json_select .. + fi +} + +addr_offset=2 +generate_network() { + local ports device macaddr protocol type ipaddr netmask vlan + local bridge=$2 + + json_select network + json_select "$1" + json_get_vars device macaddr metric protocol ipaddr netmask vlan + json_get_values ports ports + json_select .. + json_select .. + + [ -n "$device" -o -n "$ports" ] || return + + # Force bridge for "lan" as it may have other devices (e.g. wireless) + # bridged + [ "$1" = "lan" -a -z "$ports" ] && { + ports="$device" + } + + [ -n "$ports" -a -z "$bridge" ] && { + uci -q batch <<-EOF + add network device + set network.@device[-1].name='br-$1' + set network.@device[-1].type='bridge' + EOF + for port in $ports; do uci add_list network.@device[-1].ports="$port"; done + [ -n "$macaddr" ] && { + for port in $ports; do + uci -q batch <<-EOF + add network device + set network.@device[-1].name='$port' + set network.@device[-1].macaddr='$macaddr' + EOF + done + } + device=br-$1 + type= + macaddr="" + } + + [ -n "$bridge" ] && { + [ -z "$ports" ] && ports="$device" + if [ -z "$vlan" ]; then + bridge_vlan_id=$((bridge_vlan_id + 1)) + vlan=$bridge_vlan_id + fi + generate_bridge_vlan $1 $bridge "$ports" $vlan + device=$bridge.$vlan + type="" + } + + if [ -n "$macaddr" ]; then + uci -q batch <<-EOF + add network device + set network.@device[-1].name='$device' + set network.@device[-1].macaddr='$macaddr' + EOF + fi + + uci -q batch <<-EOF + delete network.$1 + set network.$1='interface' + set network.$1.type='$type' + set network.$1.device='$device' + set network.$1.metric='$metric' + set network.$1.proto='none' + EOF + + case "$protocol" in + static) + local ipad + case "$1" in + lan) ipad=${ipaddr:-"192.168.1.1"} ;; + *) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;; + esac + + netm=${netmask:-"255.255.255.0"} + + uci -q batch <<-EOF + set network.$1.proto='static' + set network.$1.ipaddr='$ipad' + set network.$1.netmask='$netm' + EOF + [ -e /proc/sys/net/ipv6 ] && uci set network.$1.ip6assign='60' + ;; + + dhcp) + # fixup IPv6 slave interface if parent is a bridge + [ "$type" = "bridge" ] && device="br-$1" + + uci set network.$1.proto='dhcp' + [ -e /proc/sys/net/ipv6 ] && { + uci -q batch <<-EOF + delete network.${1}6 + set network.${1}6='interface' + set network.${1}6.device='$device' + set network.${1}6.proto='dhcpv6' + EOF + } + ;; + + pppoe) + uci -q batch <<-EOF + set network.$1.proto='pppoe' + set network.$1.username='username' + set network.$1.password='password' + EOF + [ -e /proc/sys/net/ipv6 ] && { + uci -q batch <<-EOF + set network.$1.ipv6='1' + delete network.${1}6 + set network.${1}6='interface' + set network.${1}6.device='@${1}' + set network.${1}6.proto='dhcpv6' + EOF + } + ;; + + ncm|\ + qmi|\ + mbim) + uci -q batch <<-EOF + set network.$1.proto='${protocol}' + set network.$1.pdptype='ipv4' + EOF + ;; + esac +} + +generate_switch_vlans_ports() { + local switch="$1" + local port ports role roles num attr val + + # + # autogenerate vlans + # + + if json_is_a roles array; then + json_get_keys roles roles + json_select roles + + for role in $roles; do + json_select "$role" + json_get_vars ports + json_select .. + + uci -q batch <<-EOF + add network switch_vlan + set network.@switch_vlan[-1].device='$switch' + set network.@switch_vlan[-1].vlan='$role' + set network.@switch_vlan[-1].ports='$ports' + EOF + done + + json_select .. + fi + + + # + # write port specific settings + # + + if json_is_a ports array; then + json_get_keys ports ports + json_select ports + + for port in $ports; do + json_select "$port" + json_get_vars num + + if json_is_a attr object; then + json_get_keys attr attr + json_select attr + uci -q batch <<-EOF + add network switch_port + set network.@switch_port[-1].device='$switch' + set network.@switch_port[-1].port=$num + EOF + + for attr in $attr; do + json_get_var val "$attr" + uci -q set network.@switch_port[-1].$attr="$val" + done + json_select .. + fi + json_select .. + done + + json_select .. + fi +} + +generate_switch() { + local key="$1" + local vlans + + json_select switch + json_select "$key" + json_get_vars enable reset blinkrate cpu_port \ + ar8xxx_mib_type ar8xxx_mib_poll_interval + + uci -q batch <<-EOF + add network switch + set network.@switch[-1].name='$key' + set network.@switch[-1].reset='$reset' + set network.@switch[-1].enable_vlan='$enable' + set network.@switch[-1].blinkrate='$blinkrate' + set network.@switch[-1].ar8xxx_mib_type='$ar8xxx_mib_type' + set network.@switch[-1].ar8xxx_mib_poll_interval='$ar8xxx_mib_poll_interval' + EOF + + generate_switch_vlans_ports "$1" + + json_select .. + json_select .. +} + +generate_static_system() { + uci -q batch <<-EOF + delete system.@system[0] + add system system + set system.@system[-1].hostname='OpenWrt' + set system.@system[-1].timezone='UTC' + set system.@system[-1].ttylogin='0' + set system.@system[-1].log_size='64' + set system.@system[-1].urandom_seed='0' + + delete system.ntp + set system.ntp='timeserver' + set system.ntp.enabled='1' + set system.ntp.enable_server='0' + add_list system.ntp.server='0.openwrt.pool.ntp.org' + add_list system.ntp.server='1.openwrt.pool.ntp.org' + add_list system.ntp.server='2.openwrt.pool.ntp.org' + add_list system.ntp.server='3.openwrt.pool.ntp.org' + EOF + + if json_is_a system object; then + json_select system + local hostname + if json_get_var hostname hostname; then + uci -q set "system.@system[-1].hostname=$hostname" + fi + + local compat_version + if json_get_var compat_version compat_version; then + uci -q set "system.@system[-1].compat_version=$compat_version" + else + uci -q set "system.@system[-1].compat_version=1.0" + fi + + if json_is_a ntpserver array; then + local keys key + json_get_keys keys ntpserver + json_select ntpserver + uci -q delete "system.ntp.server" + + for key in $keys; do + local server + if json_get_var server "$key"; then + uci -q add_list "system.ntp.server=$server" + fi + done + json_select .. + fi + json_select .. + fi +} + +generate_rssimon() { + local key="$1" + local cfg="rssid_$key" + local refresh threshold + + json_select rssimon + json_select "$key" + json_get_vars refresh threshold + json_select .. + json_select .. + + uci -q batch <<-EOF + delete system.$cfg + set system.$cfg='rssid' + set system.$cfg.dev='$key' + set system.$cfg.refresh='$refresh' + set system.$cfg.threshold='$threshold' + EOF +} + +generate_led() { + local key="$1" + local cfg="led_$key" + + json_select led + json_select "$key" + json_get_vars name sysfs type trigger default + + uci -q batch <<-EOF + delete system.$cfg + set system.$cfg='led' + set system.$cfg.name='$name' + set system.$cfg.sysfs='$sysfs' + set system.$cfg.trigger='$trigger' + set system.$cfg.default='$default' + EOF + + case "$type" in + gpio) + local gpio inverted + json_get_vars gpio inverted + uci -q batch <<-EOF + set system.$cfg.trigger='gpio' + set system.$cfg.gpio='$gpio' + set system.$cfg.inverted='$inverted' + EOF + ;; + + netdev) + local device mode + json_get_vars device mode + uci -q batch <<-EOF + set system.$cfg.trigger='netdev' + set system.$cfg.mode='$mode' + set system.$cfg.dev='$device' + EOF + ;; + + usb) + local device + json_get_vars device + uci -q batch <<-EOF + set system.$cfg.trigger='usbdev' + set system.$cfg.interval='50' + set system.$cfg.dev='$device' + EOF + ;; + + usbport) + local ports port + json_get_values ports ports + uci set system.$cfg.trigger='usbport' + for port in $ports; do + uci add_list system.$cfg.port=$port + done + ;; + + rssi) + local iface minq maxq offset factor + json_get_vars iface minq maxq offset factor + uci -q batch <<-EOF + set system.$cfg.trigger='rssi' + set system.$cfg.iface='rssid_$iface' + set system.$cfg.minq='$minq' + set system.$cfg.maxq='$maxq' + set system.$cfg.offset='$offset' + set system.$cfg.factor='$factor' + EOF + ;; + + switch) + local port_mask speed_mask mode + json_get_vars port_mask speed_mask mode + uci -q batch <<-EOF + set system.$cfg.port_mask='$port_mask' + set system.$cfg.speed_mask='$speed_mask' + set system.$cfg.mode='$mode' + EOF + ;; + + portstate) + local port_state + json_get_vars port_state + uci -q batch <<-EOF + set system.$cfg.port_state='$port_state' + EOF + ;; + + timer|oneshot) + local delayon delayoff + json_get_vars delayon delayoff + uci -q batch <<-EOF + set system.$cfg.trigger='$type' + set system.$cfg.delayon='$delayon' + set system.$cfg.delayoff='$delayoff' + EOF + ;; + esac + + json_select .. + json_select .. +} + +generate_gpioswitch() { + local cfg="$1" + + json_select gpioswitch + json_select "$cfg" + local name pin default + json_get_vars name pin default + uci -q batch <<-EOF + delete system.$cfg + set system.$cfg='gpio_switch' + set system.$cfg.name='$name' + set system.$cfg.gpio_pin='$pin' + set system.$cfg.value='$default' + EOF + json_select .. + json_select .. +} + +json_init +json_load "$(cat ${CFG})" + +umask 077 + +if [ ! -s /etc/config/network ]; then + bridge_name="" + touch /etc/config/network + generate_static_network + + json_get_vars bridge + [ -n "$bridge" ] && { + json_select bridge + json_get_vars name macaddr + generate_bridge "$name" "$macaddr" + json_select .. + bridge_name=$name + } + + json_get_keys keys network + for key in $keys; do generate_network $key $bridge_name; done + + json_get_keys keys switch + for key in $keys; do generate_switch $key; done +fi + +if [ ! -s /etc/config/system ]; then + touch /etc/config/system + generate_static_system + + json_get_keys keys rssimon + for key in $keys; do generate_rssimon $key; done + + json_get_keys keys gpioswitch + for key in $keys; do generate_gpioswitch $key; done + + json_get_keys keys led + for key in $keys; do generate_led $key; done +fi +uci commit diff --git a/package/base-files/files/bin/ipcalc.sh b/package/base-files/files/bin/ipcalc.sh new file mode 100755 index 0000000..6e72617 --- /dev/null +++ b/package/base-files/files/bin/ipcalc.sh @@ -0,0 +1,88 @@ +#!/usr/bin/awk -f + +function bitcount(c) { + c=and(rshift(c, 1),0x55555555)+and(c,0x55555555) + c=and(rshift(c, 2),0x33333333)+and(c,0x33333333) + c=and(rshift(c, 4),0x0f0f0f0f)+and(c,0x0f0f0f0f) + c=and(rshift(c, 8),0x00ff00ff)+and(c,0x00ff00ff) + c=and(rshift(c,16),0x0000ffff)+and(c,0x0000ffff) + return c +} + +function ip2int(ip) { + ret=0 + n=split(ip,a,"\\.") + for (x=1;x<=n;x++) + ret=or(lshift(ret,8),a[x]) + return ret +} + +function int2ip(ip,ret,x) { + ret=and(ip,255) + ip=rshift(ip,8) + for(;x<3;x++) { + ret=and(ip,255)"."ret + ip=rshift(ip,8) + } + return ret +} + +function compl32(v) { + ret=xor(v, 0xffffffff) + return ret +} + +BEGIN { + slpos=index(ARGV[1],"/") + if (slpos == 0) { + ipaddr=ip2int(ARGV[1]) + dotpos=index(ARGV[2],".") + if (dotpos == 0) + netmask=compl32(2**(32-int(ARGV[2]))-1) + else + netmask=ip2int(ARGV[2]) + } else { + ipaddr=ip2int(substr(ARGV[1],0,slpos-1)) + netmask=compl32(2**(32-int(substr(ARGV[1],slpos+1)))-1) + ARGV[4]=ARGV[3] + ARGV[3]=ARGV[2] + } + + network=and(ipaddr,netmask) + prefix=32-bitcount(compl32(netmask)) + broadcast=or(network,compl32(netmask)) + + print "IP="int2ip(ipaddr) + print "NETMASK="int2ip(netmask) + print "BROADCAST="int2ip(broadcast) + print "NETWORK="int2ip(network) + print "PREFIX="prefix + + # range calculations: + # ipcalc + + if (ARGC <= 3) + exit(0) + + start=or(network,and(ip2int(ARGV[3]),compl32(netmask))) + limit=network+1 + if (startlimit) end=limit + if (end==ipaddr) end=ipaddr-1 + + if (start>end) { + print "network ("int2ip(network)"/"prefix") too small" > "/dev/stderr" + exit(1) + } + + if (ipaddr > start && ipaddr < end) { + print "warning: ipaddr inside range - this might not be supported in future releases of Openwrt" > "/dev/stderr" + } + + print "START="int2ip(start) + print "END="int2ip(end) +} diff --git a/package/base-files/files/etc/banner b/package/base-files/files/etc/banner new file mode 100644 index 0000000..f3af3c0 --- /dev/null +++ b/package/base-files/files/etc/banner @@ -0,0 +1,8 @@ + _______ ________ __ + | |.-----.-----.-----.| | | |.----.| |_ + | - || _ | -__| || | | || _|| _| + |_______|| __|_____|__|__||________||__| |____| + |__| W I R E L E S S F R E E D O M + ----------------------------------------------------- + %D %V, %C + ----------------------------------------------------- diff --git a/package/base-files/files/etc/banner.failsafe b/package/base-files/files/etc/banner.failsafe new file mode 100644 index 0000000..49855e7 --- /dev/null +++ b/package/base-files/files/etc/banner.failsafe @@ -0,0 +1,15 @@ +================= FAILSAFE MODE active ================ +special commands: +* firstboot reset settings to factory defaults +* mount_root mount root-partition with config files + +after mount_root: +* passwd change root's password +* /etc/config directory with config files + +for more help see: +https://openwrt.org/docs/guide-user/troubleshooting/ +- failsafe_and_factory_reset +- root_password_reset +======================================================= + diff --git a/package/base-files/files/etc/board.d/99-default_network b/package/base-files/files/etc/board.d/99-default_network new file mode 100644 index 0000000..49d2a3b --- /dev/null +++ b/package/base-files/files/etc/board.d/99-default_network @@ -0,0 +1,16 @@ +# +# Copyright (C) 2013-2015 OpenWrt.org +# + +. /lib/functions/uci-defaults.sh + +board_config_update + +json_is_a network object && exit 0 + +ucidef_set_interface_lan 'eth0' +[ -d /sys/class/net/eth1 ] && ucidef_set_interface_wan 'eth1' + +board_config_flush + +exit 0 diff --git a/package/base-files/files/etc/device_info b/package/base-files/files/etc/device_info new file mode 100644 index 0000000..4045e9e --- /dev/null +++ b/package/base-files/files/etc/device_info @@ -0,0 +1,4 @@ +DEVICE_MANUFACTURER='%M' +DEVICE_MANUFACTURER_URL='%m' +DEVICE_PRODUCT='%P' +DEVICE_REVISION='%h' diff --git a/package/base-files/files/etc/diag.sh b/package/base-files/files/etc/diag.sh new file mode 100644 index 0000000..37a8ec7 --- /dev/null +++ b/package/base-files/files/etc/diag.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# Copyright (C) 2006-2019 OpenWrt.org + +. /lib/functions/leds.sh + +boot="$(get_dt_led boot)" +failsafe="$(get_dt_led failsafe)" +running="$(get_dt_led running)" +upgrade="$(get_dt_led upgrade)" + +set_led_state() { + status_led="$boot" + + case "$1" in + preinit) + status_led_blink_preinit + ;; + failsafe) + status_led_off + [ -n "$running" ] && { + status_led="$running" + status_led_off + } + status_led="$failsafe" + status_led_blink_failsafe + ;; + preinit_regular) + status_led_blink_preinit_regular + ;; + upgrade) + [ -n "$running" ] && { + status_led="$running" + status_led_off + } + status_led="$upgrade" + status_led_blink_preinit_regular + ;; + done) + status_led_off + [ "$status_led" != "$running" ] && \ + status_led_restore_trigger "boot" + [ -n "$running" ] && { + status_led="$running" + status_led_on + } + ;; + esac +} + +set_state() { + [ -n "$boot" -o -n "$failsafe" -o -n "$running" -o -n "$upgrade" ] && set_led_state "$1" +} diff --git a/package/base-files/files/etc/ethers b/package/base-files/files/etc/ethers new file mode 100644 index 0000000..b92c200 --- /dev/null +++ b/package/base-files/files/etc/ethers @@ -0,0 +1,6 @@ +# +# Lookup man 5 ethers for syntax documentation +# +# Examples : +# 02:00:11:22:33:44 OpenWrt.lan +# 02:00:11:22:33:44 192.168.1.1 diff --git a/package/base-files/files/etc/fstab b/package/base-files/files/etc/fstab new file mode 100644 index 0000000..6e9b7ba --- /dev/null +++ b/package/base-files/files/etc/fstab @@ -0,0 +1 @@ +# diff --git a/package/base-files/files/etc/group b/package/base-files/files/etc/group new file mode 100644 index 0000000..5b06dc6 --- /dev/null +++ b/package/base-files/files/etc/group @@ -0,0 +1,11 @@ +root:x:0: +daemon:x:1: +adm:x:4: +mail:x:8: +dialout:x:20: +audio:x:29: +www-data:x:33: +ftp:x:55: +users:x:100: +network:x:101: +nogroup:x:65534: diff --git a/package/base-files/files/etc/hosts b/package/base-files/files/etc/hosts new file mode 100644 index 0000000..b7713eb --- /dev/null +++ b/package/base-files/files/etc/hosts @@ -0,0 +1,5 @@ +127.0.0.1 localhost + +::1 localhost ip6-localhost ip6-loopback +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters diff --git a/package/base-files/files/etc/hotplug.d/net/00-sysctl b/package/base-files/files/etc/hotplug.d/net/00-sysctl new file mode 100644 index 0000000..8abe7f8 --- /dev/null +++ b/package/base-files/files/etc/hotplug.d/net/00-sysctl @@ -0,0 +1,9 @@ +#!/bin/sh + +if [ "$ACTION" = add ]; then + for CONF in /etc/sysctl.d/*.conf /etc/sysctl.conf; do + [ ! -f "$CONF" ] && continue; + sed -ne "/^[[:space:]]*net\..*\.$DEVICENAME\./p" "$CONF" | \ + sysctl -e -p - | logger -t sysctl + done +fi diff --git a/package/base-files/files/etc/init.d/boot b/package/base-files/files/etc/init.d/boot new file mode 100755 index 0000000..749d9e9 --- /dev/null +++ b/package/base-files/files/etc/init.d/boot @@ -0,0 +1,55 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006-2011 OpenWrt.org + +START=10 +STOP=90 + +uci_apply_defaults() { + . /lib/functions/system.sh + + cd /etc/uci-defaults || return 0 + files="$(ls)" + [ -z "$files" ] && return 0 + mkdir -p /tmp/.uci + for file in $files; do + ( . "./$(basename $file)" ) && rm -f "$file" + done + uci commit +} + +boot() { + [ -f /proc/mounts ] || /sbin/mount_root + [ -f /proc/jffs2_bbc ] && echo "S" > /proc/jffs2_bbc + + mkdir -p /var/lock + chmod 1777 /var/lock + mkdir -p /var/log + mkdir -p /var/run + mkdir -p /var/state + mkdir -p /var/tmp + mkdir -p /tmp/.uci + chmod 0700 /tmp/.uci + touch /var/log/wtmp + touch /var/log/lastlog + mkdir -p /tmp/resolv.conf.d + touch /tmp/resolv.conf.d/resolv.conf.auto + ln -sf /tmp/resolv.conf.d/resolv.conf.auto /tmp/resolv.conf + grep -q debugfs /proc/filesystems && /bin/mount -o noatime -t debugfs debugfs /sys/kernel/debug + grep -q bpf /proc/filesystems && /bin/mount -o nosuid,nodev,noexec,noatime,mode=0700 -t bpf bpffs /sys/fs/bpf + grep -q pstore /proc/filesystems && /bin/mount -o noatime -t pstore pstore /sys/fs/pstore + [ "$FAILSAFE" = "true" ] && touch /tmp/.failsafe + + /sbin/kmodloader + + [ ! -f /etc/config/wireless ] && { + # compat for bcm47xx and mvebu + sleep 1 + } + + /bin/config_generate + uci_apply_defaults + sync + + # temporary hack until configd exists + /sbin/reload_config +} diff --git a/package/base-files/files/etc/init.d/done b/package/base-files/files/etc/init.d/done new file mode 100755 index 0000000..32d6118 --- /dev/null +++ b/package/base-files/files/etc/init.d/done @@ -0,0 +1,17 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006 OpenWrt.org + +START=95 +boot() { + mount_root done + rm -f /sysupgrade.tgz && sync + + # process user commands + [ -f /etc/rc.local ] && { + sh /etc/rc.local + } + + # set leds to normal state + . /etc/diag.sh + set_state done +} diff --git a/package/base-files/files/etc/init.d/gpio_switch b/package/base-files/files/etc/init.d/gpio_switch new file mode 100755 index 0000000..24d790b --- /dev/null +++ b/package/base-files/files/etc/init.d/gpio_switch @@ -0,0 +1,66 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2015 OpenWrt.org + +START=94 +STOP=10 +USE_PROCD=1 + + +load_gpio_switch() +{ + local name + local gpio_pin + local value + + config_get gpio_pin "$1" gpio_pin + config_get name "$1" name + config_get value "$1" value 0 + + [ -z "$gpio_pin" ] && { + echo >&2 "Skipping gpio_switch '$name' due to missing gpio_pin" + return 1 + } + + local gpio_path + if [ -n "$(echo "$gpio_pin" | grep -E "^[0-9]+$")" ]; then + gpio_path="/sys/class/gpio/gpio${gpio_pin}" + + # export GPIO pin for access + [ -d "$gpio_path" ] || { + echo "$gpio_pin" >/sys/class/gpio/export + # we need to wait a bit until the GPIO appears + [ -d "$gpio_path" ] || sleep 1 + } + + # direction attribute only exists if the kernel supports changing the + # direction of a GPIO + if [ -e "${gpio_path}/direction" ]; then + # set the pin to output with high or low pin value + { [ "$value" = "0" ] && echo "low" || echo "high"; } \ + >"$gpio_path/direction" + else + { [ "$value" = "0" ] && echo "0" || echo "1"; } \ + >"$gpio_path/value" + fi + else + gpio_path="/sys/class/gpio/${gpio_pin}" + + [ -d "$gpio_path" ] && { + { [ "$value" = "0" ] && echo "0" || echo "1"; } \ + >"$gpio_path/value" + } + fi +} + +service_triggers() +{ + procd_add_reload_trigger "system" +} + +start_service() +{ + [ -e /sys/class/gpio/ ] && { + config_load system + config_foreach load_gpio_switch gpio_switch + } +} diff --git a/package/base-files/files/etc/init.d/led b/package/base-files/files/etc/init.d/led new file mode 100755 index 0000000..08a1e6d --- /dev/null +++ b/package/base-files/files/etc/init.d/led @@ -0,0 +1,145 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2008 OpenWrt.org + +START=96 + +load_led() { + local name + local sysfs + local trigger + local dev + local ports + local mode + local default + local delayon + local delayoff + local interval + + config_get sysfs $1 sysfs + config_get name $1 name "$sysfs" + config_get trigger $1 trigger "none" + config_get dev $1 dev + config_get ports $1 port + config_get mode $1 mode + config_get_bool default $1 default "0" + config_get delayon $1 delayon + config_get delayoff $1 delayoff + config_get interval $1 interval "50" + config_get port_state $1 port_state + config_get delay $1 delay "150" + config_get message $1 message "" + config_get gpio $1 gpio "0" + config_get_bool inverted $1 inverted "0" + + # execute application led trigger + [ -f "/usr/libexec/led-trigger/${trigger}" ] && { + . "/usr/libexec/led-trigger/${trigger}" + return 0 + } + + [ "$trigger" = "usbdev" ] && { + # Backward compatibility: translate to the new trigger + trigger="usbport" + # Translate port of root hub, e.g. 4-1 -> usb4-port1 + ports=$(echo "$dev" | sed -n 's/^\([0-9]*\)-\([0-9]*\)$/usb\1-port\2/p') + # Translate port of extra hub, e.g. 2-2.4 -> 2-2-port4 + [ -z "$ports" ] && ports=$(echo "$dev" | sed -n 's/\./-port/p') + } + + [ -e /sys/class/leds/${sysfs}/brightness ] && { + echo "setting up led ${name}" + + printf "%s %s %d\n" \ + "$sysfs" \ + "$(sed -ne 's/^.*\[\(.*\)\].*$/\1/p' /sys/class/leds/${sysfs}/trigger)" \ + "$(cat /sys/class/leds/${sysfs}/brightness)" \ + >> /var/run/led.state + + [ "$default" = 0 ] && + echo 0 >/sys/class/leds/${sysfs}/brightness + + echo $trigger > /sys/class/leds/${sysfs}/trigger 2> /dev/null + ret="$?" + + [ $default = 1 ] && + cat /sys/class/leds/${sysfs}/max_brightness > /sys/class/leds/${sysfs}/brightness + + [ $ret = 0 ] || { + echo >&2 "Skipping trigger '$trigger' for led '$name' due to missing kernel module" + return 1 + } + case "$trigger" in + "heartbeat") + echo "${inverted}" > "/sys/class/leds/${sysfs}/invert" + ;; + + "netdev") + [ -n "$dev" ] && { + echo $dev > /sys/class/leds/${sysfs}/device_name + for m in $mode; do + [ -e "/sys/class/leds/${sysfs}/$m" ] && \ + echo 1 > /sys/class/leds/${sysfs}/$m + done + echo $interval > /sys/class/leds/${sysfs}/interval + } + ;; + + "timer"|"oneshot") + [ -n "$delayon" ] && \ + echo $delayon > /sys/class/leds/${sysfs}/delay_on + [ -n "$delayoff" ] && \ + echo $delayoff > /sys/class/leds/${sysfs}/delay_off + ;; + + "usbport") + local p + + for p in $ports; do + echo 1 > /sys/class/leds/${sysfs}/ports/$p + done + ;; + + "port_state") + [ -n "$port_state" ] && \ + echo $port_state > /sys/class/leds/${sysfs}/port_state + ;; + + "gpio") + echo $gpio > /sys/class/leds/${sysfs}/gpio + echo $inverted > /sys/class/leds/${sysfs}/inverted + ;; + + switch[0-9]*) + local port_mask speed_mask + + config_get port_mask $1 port_mask + [ -n "$port_mask" ] && \ + echo $port_mask > /sys/class/leds/${sysfs}/port_mask + config_get speed_mask $1 speed_mask + [ -n "$speed_mask" ] && \ + echo $speed_mask > /sys/class/leds/${sysfs}/speed_mask + [ -n "$mode" ] && \ + echo "$mode" > /sys/class/leds/${sysfs}/mode + ;; + esac + } +} + +start() { + [ -e /sys/class/leds/ ] && { + [ -s /var/run/led.state ] && { + local led trigger brightness + while read led trigger brightness; do + [ -e "/sys/class/leds/$led/trigger" ] && \ + echo "$trigger" > "/sys/class/leds/$led/trigger" + + [ -e "/sys/class/leds/$led/brightness" ] && \ + echo "$brightness" > "/sys/class/leds/$led/brightness" + done < /var/run/led.state + rm /var/run/led.state + } + + config_load system + config_foreach load_led led + } +} diff --git a/package/base-files/files/etc/init.d/sysctl b/package/base-files/files/etc/init.d/sysctl new file mode 100755 index 0000000..4db5644 --- /dev/null +++ b/package/base-files/files/etc/init.d/sysctl @@ -0,0 +1,44 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006 OpenWrt.org + +START=11 + +apply_defaults() { + local mem="$(awk '/^MemTotal:/ {print $2}' /proc/meminfo)" + local min_free frag_low_thresh frag_high_thresh + + if [ "$mem" -gt 65536 ]; then # 128M + min_free=16384 + elif [ "$mem" -gt 32768 ]; then # 64M + min_free=8192 + else + min_free=1024 + frag_low_thresh=393216 + frag_high_thresh=524288 + fi + + sysctl -qw vm.min_free_kbytes="$min_free" + + [ "$frag_low_thresh" ] && sysctl -qw \ + net.ipv4.ipfrag_low_thresh="$frag_low_thresh" \ + net.ipv4.ipfrag_high_thresh="$frag_high_thresh" \ + net.ipv6.ip6frag_low_thresh="$frag_low_thresh" \ + net.ipv6.ip6frag_high_thresh="$frag_high_thresh" \ + net.netfilter.nf_conntrack_frag6_low_thresh="$frag_low_thresh" \ + net.netfilter.nf_conntrack_frag6_high_thresh="$frag_high_thresh" + + # first set default, then all interfaces to avoid races with appearing interfaces + if [ -d /proc/sys/net/ipv6/conf ]; then + echo 0 > /proc/sys/net/ipv6/conf/default/accept_ra + for iface in /proc/sys/net/ipv6/conf/*/accept_ra; do + echo 0 > "$iface" + done + fi +} + +start() { + apply_defaults + for CONF in /etc/sysctl.d/*.conf /etc/sysctl.conf; do + [ -f "$CONF" ] && sysctl -e -p "$CONF" >&- + done +} diff --git a/package/base-files/files/etc/init.d/sysfixtime b/package/base-files/files/etc/init.d/sysfixtime new file mode 100755 index 0000000..93f7922 --- /dev/null +++ b/package/base-files/files/etc/init.d/sysfixtime @@ -0,0 +1,44 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2013-2014 OpenWrt.org + +START=00 +STOP=90 + +RTC_DEV=/dev/rtc0 +HWCLOCK=/sbin/hwclock + +boot() { + hwclock_load + local maxtime="$(find_max_time)" + local curtime="$(date +%s)" + if [ $curtime -lt $maxtime ]; then + date -s @$maxtime + hwclock_save + fi +} + +start() { + hwclock_load +} + +stop() { + hwclock_save +} + +hwclock_load() { + [ -e "$RTC_DEV" ] && [ -e "$HWCLOCK" ] && $HWCLOCK -s -u -f $RTC_DEV +} + +hwclock_save(){ + [ -e "$RTC_DEV" ] && [ -e "$HWCLOCK" ] && $HWCLOCK -w -u -f $RTC_DEV && \ + logger -t sysfixtime "saved '$(date)' to $RTC_DEV" +} + +find_max_time() { + local file newest + + for file in $( find /etc -type f ) ; do + [ -z "$newest" -o "$newest" -ot "$file" ] && newest=$file + done + [ "$newest" ] && date -r "$newest" +%s +} diff --git a/package/base-files/files/etc/init.d/system b/package/base-files/files/etc/init.d/system new file mode 100755 index 0000000..dcfc261 --- /dev/null +++ b/package/base-files/files/etc/init.d/system @@ -0,0 +1,45 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2014 OpenWrt.org + +START=10 +USE_PROCD=1 + +validate_system_section() { + uci_load_validate system system "$1" "$2" \ + 'hostname:string:OpenWrt' \ + 'conloglevel:uinteger' \ + 'buffersize:uinteger' \ + 'timezone:string:UTC' \ + 'zonename:string' +} + +system_config() { + [ "$2" = 0 ] || { + echo "validation failed" + return 1 + } + + echo "$hostname" > /proc/sys/kernel/hostname + [ -z "$conloglevel" -a -z "$buffersize" ] || dmesg ${conloglevel:+-n $conloglevel} ${buffersize:+-s $buffersize} + echo "$timezone" > /tmp/TZ + [ -n "$zonename" ] && [ -f "/usr/share/zoneinfo/${zonename// /_}" ] \ + && ln -sf "/usr/share/zoneinfo/${zonename// /_}" /tmp/localtime \ + && rm -f /tmp/TZ + + # apply timezone to kernel + hwclock -u --systz +} + +reload_service() { + config_load system + config_foreach validate_system_section system system_config +} + +service_triggers() { + procd_add_reload_trigger "system" + procd_add_validation validate_system_section +} + +start_service() { + reload_service +} diff --git a/package/base-files/files/etc/init.d/umount b/package/base-files/files/etc/init.d/umount new file mode 100755 index 0000000..b764ae1 --- /dev/null +++ b/package/base-files/files/etc/init.d/umount @@ -0,0 +1,13 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006 OpenWrt.org + +STOP=90 + +restart() { + : +} + +stop() { + sync + /bin/umount -a -d -r +} diff --git a/package/base-files/files/etc/inittab b/package/base-files/files/etc/inittab new file mode 100644 index 0000000..9820e71 --- /dev/null +++ b/package/base-files/files/etc/inittab @@ -0,0 +1,3 @@ +::sysinit:/etc/init.d/rcS S boot +::shutdown:/etc/init.d/rcS K shutdown +::askconsole:/usr/libexec/login.sh diff --git a/package/base-files/files/etc/iproute2/ematch_map b/package/base-files/files/etc/iproute2/ematch_map new file mode 100644 index 0000000..4d6bb2f --- /dev/null +++ b/package/base-files/files/etc/iproute2/ematch_map @@ -0,0 +1,8 @@ +# lookup table for ematch kinds +1 cmp +2 nbyte +3 u32 +4 meta +7 canid +8 ipset +9 ipt diff --git a/package/base-files/files/etc/iproute2/rt_protos b/package/base-files/files/etc/iproute2/rt_protos new file mode 100644 index 0000000..5b61798 --- /dev/null +++ b/package/base-files/files/etc/iproute2/rt_protos @@ -0,0 +1,18 @@ +# +# Reserved protocols. +# +0 unspec +1 redirect +2 kernel +3 boot +4 static +8 gated +9 ra +10 mrt +11 zebra +12 bird +13 dnrouted +14 xorp +15 ntk +16 dhcp +42 babel diff --git a/package/base-files/files/etc/iproute2/rt_tables b/package/base-files/files/etc/iproute2/rt_tables new file mode 100644 index 0000000..5fc09b3 --- /dev/null +++ b/package/base-files/files/etc/iproute2/rt_tables @@ -0,0 +1,12 @@ +# +# reserved values +# +128 prelocal +255 local +254 main +253 default +0 unspec +# +# local +# +#1 inr.ruhep diff --git a/package/base-files/files/etc/openwrt_release b/package/base-files/files/etc/openwrt_release new file mode 100644 index 0000000..d03400c --- /dev/null +++ b/package/base-files/files/etc/openwrt_release @@ -0,0 +1,7 @@ +DISTRIB_ID='%D' +DISTRIB_RELEASE='%V' +DISTRIB_REVISION='%R' +DISTRIB_TARGET='%S' +DISTRIB_ARCH='%A' +DISTRIB_DESCRIPTION='%D %V %C' +DISTRIB_TAINTS='%t' diff --git a/package/base-files/files/etc/openwrt_version b/package/base-files/files/etc/openwrt_version new file mode 100644 index 0000000..48157ed --- /dev/null +++ b/package/base-files/files/etc/openwrt_version @@ -0,0 +1 @@ +%C diff --git a/package/base-files/files/etc/os-release b/package/base-files/files/etc/os-release new file mode 120000 index 0000000..c4c75b4 --- /dev/null +++ b/package/base-files/files/etc/os-release @@ -0,0 +1 @@ +../usr/lib/os-release \ No newline at end of file diff --git a/package/base-files/files/etc/passwd b/package/base-files/files/etc/passwd new file mode 100644 index 0000000..1d06a80 --- /dev/null +++ b/package/base-files/files/etc/passwd @@ -0,0 +1,5 @@ +root:x:0:0:root:/root:/bin/ash +daemon:*:1:1:daemon:/var:/bin/false +ftp:*:55:55:ftp:/home/ftp:/bin/false +network:*:101:101:network:/var:/bin/false +nobody:*:65534:65534:nobody:/var:/bin/false diff --git a/package/base-files/files/etc/preinit b/package/base-files/files/etc/preinit new file mode 100755 index 0000000..829574f --- /dev/null +++ b/package/base-files/files/etc/preinit @@ -0,0 +1,29 @@ +#!/bin/sh +# Copyright (C) 2006-2016 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +[ -z "$PREINIT" ] && exec /sbin/init + +export PATH="%PATH%" + +. /lib/functions.sh +. /lib/functions/preinit.sh +. /lib/functions/system.sh + +boot_hook_init preinit_essential +boot_hook_init preinit_main +boot_hook_init failsafe +boot_hook_init initramfs +boot_hook_init preinit_mount_root + +for pi_source_file in /lib/preinit/*; do + . $pi_source_file +done + +boot_run_hook preinit_essential + +pi_mount_skip_next=false +pi_jffs2_mount_success=false +pi_failsafe_net_message=false + +boot_run_hook preinit_main diff --git a/package/base-files/files/etc/profile b/package/base-files/files/etc/profile new file mode 100644 index 0000000..76b149b --- /dev/null +++ b/package/base-files/files/etc/profile @@ -0,0 +1,40 @@ +[ -e /tmp/.failsafe ] && export FAILSAFE=1 + +[ -f /etc/banner ] && cat /etc/banner +[ -n "$FAILSAFE" ] && cat /etc/banner.failsafe + +grep -Fsq '/ overlay ro,' /proc/mounts && { + echo 'Your JFFS2-partition seems full and overlayfs is mounted read-only.' + echo 'Please try to remove files from /overlay/upper/... and reboot!' +} + +export PATH="%PATH%" +export HOME=$(grep -e "^${USER:-root}:" /etc/passwd | cut -d ":" -f 6) +export HOME=${HOME:-/root} +export PS1='\u@\h:\w\$ ' +export ENV=/etc/shinit + +case "$TERM" in + xterm*|rxvt*) + export PS1='\[\e]0;\u@\h: \w\a\]'$PS1 + ;; +esac + +[ -n "$FAILSAFE" ] || { + for FILE in /etc/profile.d/*.sh; do + [ -e "$FILE" ] && . "$FILE" + done + unset FILE +} + +if ( grep -qs '^root::' /etc/shadow && \ + [ -z "$FAILSAFE" ] ) +then +cat << EOF +=== WARNING! ===================================== +There is no root password defined on this device! +Use the "passwd" command to set up a new password +in order to prevent unauthorized SSH logins. +-------------------------------------------------- +EOF +fi diff --git a/package/base-files/files/etc/protocols b/package/base-files/files/etc/protocols new file mode 100644 index 0000000..26bc775 --- /dev/null +++ b/package/base-files/files/etc/protocols @@ -0,0 +1,57 @@ +# Internet (IP) protocols +# +# Updated from http://www.iana.org/assignments/protocol-numbers and other +# sources. +# New protocols will be added on request if they have been officially +# assigned by IANA and are not historical. +# If you need a huge list of used numbers please install the nmap package. + +ip 0 IP # internet protocol, pseudo protocol number +#hopopt 0 HOPOPT # IPv6 Hop-by-Hop Option [RFC1883] +icmp 1 ICMP # internet control message protocol +igmp 2 IGMP # Internet Group Management +ggp 3 GGP # gateway-gateway protocol +ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'') +st 5 ST # ST datagram mode +tcp 6 TCP # transmission control protocol +egp 8 EGP # exterior gateway protocol +igp 9 IGP # any private interior gateway (Cisco) +pup 12 PUP # PARC universal packet protocol +udp 17 UDP # user datagram protocol +hmp 20 HMP # host monitoring protocol +xns-idp 22 XNS-IDP # Xerox NS IDP +rdp 27 RDP # "reliable datagram" protocol +iso-tp4 29 ISO-TP4 # ISO Transport Protocol class 4 [RFC905] +dccp 33 DCCP # Datagram Congestion Control Protocol [RFC4340] +xtp 36 XTP # Xpress Transfer Protocol +ddp 37 DDP # Datagram Delivery Protocol +idpr-cmtp 38 IDPR-CMTP # IDPR Control Message Transport +ipv6 41 IPv6 # Internet Protocol, version 6 +ipv6-route 43 IPv6-Route # Routing Header for IPv6 +ipv6-frag 44 IPv6-Frag # Fragment Header for IPv6 +idrp 45 IDRP # Inter-Domain Routing Protocol +rsvp 46 RSVP # Reservation Protocol +gre 47 GRE # General Routing Encapsulation +esp 50 IPSEC-ESP # Encap Security Payload [RFC2046] +ah 51 IPSEC-AH # Authentication Header [RFC2402] +skip 57 SKIP # SKIP +ipv6-icmp 58 IPv6-ICMP # ICMP for IPv6 +ipv6-nonxt 59 IPv6-NoNxt # No Next Header for IPv6 +ipv6-opts 60 IPv6-Opts # Destination Options for IPv6 +rspf 73 RSPF CPHB # Radio Shortest Path First (officially CPHB) +vmtp 81 VMTP # Versatile Message Transport +eigrp 88 EIGRP # Enhanced Interior Routing Protocol (Cisco) +ospf 89 OSPFIGP # Open Shortest Path First IGP +ax.25 93 AX.25 # AX.25 frames +ipip 94 IPIP # IP-within-IP Encapsulation Protocol +etherip 97 ETHERIP # Ethernet-within-IP Encapsulation [RFC3378] +encap 98 ENCAP # Yet Another IP encapsulation [RFC1241] +# 99 # any private encryption scheme +pim 103 PIM # Protocol Independent Multicast +ipcomp 108 IPCOMP # IP Payload Compression Protocol +vrrp 112 VRRP # Virtual Router Redundancy Protocol +l2tp 115 L2TP # Layer Two Tunneling Protocol [RFC2661] +isis 124 ISIS # IS-IS over IPv4 +sctp 132 SCTP # Stream Control Transmission Protocol +fc 133 FC # Fibre Channel + diff --git a/package/base-files/files/etc/rc.button/failsafe b/package/base-files/files/etc/rc.button/failsafe new file mode 100755 index 0000000..ba958fa --- /dev/null +++ b/package/base-files/files/etc/rc.button/failsafe @@ -0,0 +1,5 @@ +#!/bin/sh + +[ "${TYPE}" = "switch" ] || echo ${BUTTON} > /tmp/failsafe_button + +return 0 diff --git a/package/base-files/files/etc/rc.button/power b/package/base-files/files/etc/rc.button/power new file mode 100755 index 0000000..c245744 --- /dev/null +++ b/package/base-files/files/etc/rc.button/power @@ -0,0 +1,7 @@ +#!/bin/sh + +[ "${ACTION}" = "released" ] || exit 0 + +exec /sbin/poweroff + +return 0 diff --git a/package/base-files/files/etc/rc.button/reboot b/package/base-files/files/etc/rc.button/reboot new file mode 100755 index 0000000..cd547e3 --- /dev/null +++ b/package/base-files/files/etc/rc.button/reboot @@ -0,0 +1,12 @@ +#!/bin/sh + +[ "${ACTION}" = "released" ] || exit 0 + +if [ "$SEEN" -ge 5 ] +then + echo "REBOOT" > /dev/console + sync + reboot +fi + +return 0 diff --git a/package/base-files/files/etc/rc.button/reset b/package/base-files/files/etc/rc.button/reset new file mode 100755 index 0000000..2403122 --- /dev/null +++ b/package/base-files/files/etc/rc.button/reset @@ -0,0 +1,31 @@ +#!/bin/sh + +. /lib/functions.sh + +OVERLAY="$( grep ' /overlay ' /proc/mounts )" + +case "$ACTION" in +pressed) + [ -z "$OVERLAY" ] && return 0 + + return 5 +;; +timeout) + . /etc/diag.sh + set_state failsafe +;; +released) + if [ "$SEEN" -lt 1 ] + then + echo "REBOOT" > /dev/console + sync + reboot + elif [ "$SEEN" -ge 5 -a -n "$OVERLAY" ] + then + echo "FACTORY RESET" > /dev/console + jffs2reset -y && reboot & + fi +;; +esac + +return 0 diff --git a/package/base-files/files/etc/rc.button/rfkill b/package/base-files/files/etc/rc.button/rfkill new file mode 100755 index 0000000..fbdda40 --- /dev/null +++ b/package/base-files/files/etc/rc.button/rfkill @@ -0,0 +1,32 @@ +#!/bin/sh + +[ "${ACTION}" = "released" -o -n "${TYPE}" ] || exit 0 + +. /lib/functions.sh + +rfkill_state=0 + +wifi_rfkill_set() { + uci set wireless.$1.disabled=$rfkill_state +} + +wifi_rfkill_check() { + local disabled + config_get disabled $1 disabled + [ "$disabled" = "1" ] || rfkill_state=1 +} + +config_load wireless +case "${TYPE}" in +"switch") + [ "${ACTION}" = "released" ] && rfkill_state=1 + ;; +*) + config_foreach wifi_rfkill_check wifi-device + ;; +esac +config_foreach wifi_rfkill_set wifi-device +uci commit wireless +wifi up + +return 0 diff --git a/package/base-files/files/etc/rc.common b/package/base-files/files/etc/rc.common new file mode 100755 index 0000000..d747303 --- /dev/null +++ b/package/base-files/files/etc/rc.common @@ -0,0 +1,194 @@ +#!/bin/sh +# Copyright (C) 2006-2012 OpenWrt.org + +. $IPKG_INSTROOT/lib/functions.sh +. $IPKG_INSTROOT/lib/functions/service.sh + +initscript=$1 +action=${2:-help} +shift 2 + +start() { + return 0 +} + +stop() { + return 0 +} + +reload() { + restart +} + +restart() { + trap '' TERM + stop "$@" + trap - TERM + start "$@" +} + +boot() { + start "$@" +} + +shutdown() { + stop +} + +disable() { + name="$(basename "${initscript}")" + rm -f "$IPKG_INSTROOT"/etc/rc.d/S??$name + rm -f "$IPKG_INSTROOT"/etc/rc.d/K??$name +} + +enable() { + err=1 + name="$(basename "${initscript}")" + [ "$START" ] && \ + ln -sf "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" && \ + err=0 + [ "$STOP" ] && \ + ln -sf "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/K${STOP}${name##K[0-9][0-9]}" && \ + err=0 + return $err +} + +enabled() { + name="$(basename "${initscript}")" + name="${name##[SK][0-9][0-9]}" + { + [ -z "${START:-}" ] || [ -L "$IPKG_INSTROOT/etc/rc.d/S${START}$name" ] + } && { + [ -z "${STOP:-}" ] || [ -L "$IPKG_INSTROOT/etc/rc.d/K${STOP}$name" ] + } +} + +depends() { + return 0 +} + +ALL_HELP="" +ALL_COMMANDS="boot shutdown depends" +extra_command() { + local cmd="$1" + local help="$2" + + local extra="$(printf "%-16s%s" "${cmd}" "${help}")" + ALL_HELP="${ALL_HELP}\t${extra}\n" + ALL_COMMANDS="${ALL_COMMANDS} ${cmd}" +} + +help() { + cat </dev/null >/dev/null; then + service_started + fi + } + + trace() { + TRACE_SYSCALLS=1 + start "$@" + } + + info() { + json_init + json_add_string name "$(basename ${basescript:-$initscript})" + json_add_boolean verbose "1" + _procd_ubus_call list + } + + stop() { + procd_lock + stop_service "$@" + procd_kill "$(basename ${basescript:-$initscript})" "$1" + if eval "type service_stopped" 2>/dev/null >/dev/null; then + service_stopped + fi + } + + reload() { + if eval "type reload_service" 2>/dev/null >/dev/null; then + procd_lock + reload_service "$@" + else + start + fi + } + + running() { + service_running "$@" + } + + status() { + if eval "type status_service" 2>/dev/null >/dev/null; then + status_service "$@" + else + _procd_status "$(basename ${basescript:-$initscript})" "$1" + fi + } +} + +ALL_COMMANDS="${ALL_COMMANDS} ${EXTRA_COMMANDS}" +ALL_HELP="${ALL_HELP}${EXTRA_HELP}" +list_contains ALL_COMMANDS "$action" || action=help +$action "$@" diff --git a/package/base-files/files/etc/rc.local b/package/base-files/files/etc/rc.local new file mode 100644 index 0000000..5639477 --- /dev/null +++ b/package/base-files/files/etc/rc.local @@ -0,0 +1,4 @@ +# Put your custom commands here that should be executed once +# the system init finished. By default this file does nothing. + +exit 0 diff --git a/package/base-files/files/etc/services b/package/base-files/files/etc/services new file mode 100644 index 0000000..968f9e7 --- /dev/null +++ b/package/base-files/files/etc/services @@ -0,0 +1,173 @@ +echo 7/tcp +echo 7/udp +discard 9/tcp +discard 9/udp +daytime 13/tcp +daytime 13/udp +netstat 15/tcp +chargen 19/tcp +chargen 19/udp +ftp-data 20/tcp +ftp 21/tcp +ssh 22/tcp +ssh 22/udp +telnet 23/tcp +smtp 25/tcp +time 37/tcp +time 37/udp +whois 43/tcp +domain 53/tcp +domain 53/udp +bootps 67/tcp +bootps 67/udp +bootpc 68/tcp +bootpc 68/udp +tftp 69/udp +finger 79/tcp +www 80/tcp http +kerberos 88/tcp kerberos5 krb5 kerberos-sec +kerberos 88/udp kerberos5 krb5 kerberos-sec +pop3 110/tcp +pop3 110/udp +sunrpc 111/tcp rpcbind +sunrpc 111/udp rpcbind +auth 113/tcp ident +sftp 115/tcp +nntp 119/tcp +ntp 123/tcp +ntp 123/udp +netbios-ns 137/tcp +netbios-ns 137/udp +netbios-dgm 138/tcp +netbios-dgm 138/udp +netbios-ssn 139/tcp +netbios-ssn 139/udp +imap2 143/tcp imap +imap2 143/udp imap +snmp 161/tcp +snmp 161/udp +snmp-trap 162/tcp snmptrap +snmp-trap 162/udp snmptrap +xdmcp 177/tcp +xdmcp 177/udp +bgp 179/tcp +bgp 179/udp +imap3 220/tcp +imap3 220/udp +ldap 389/tcp +ldap 389/udp +https 443/tcp +https 443/udp +microsoft-ds 445/tcp +microsoft-ds 445/udp +isakmp 500/tcp +isakmp 500/udp +rtsp 554/tcp +rtsp 554/udp +ipp 631/tcp +ipp 631/udp +syslog 514/udp +printer 515/tcp spooler +dhcpv6-client 546/tcp +dhcpv6-client 546/udp +dhcpv6-server 547/tcp +dhcpv6-server 547/udp +afpovertcp 548/tcp +afpovertcp 548/udp +nntps 563/tcp snntp +nntps 563/udp snntp +submission 587/tcp +submission 587/udp +ldaps 636/tcp +ldaps 636/udp +tinc 655/tcp +tinc 655/udp +rsync 873/tcp +rsync 873/udp +ftps-data 989/tcp +ftps 990/tcp +imaps 993/tcp +imaps 993/udp +ircs 994/tcp +ircs 994/udp +pop3s 995/tcp +pop3s 995/udp +socks 1080/tcp +socks 1080/udp +openvpn 1194/tcp +openvpn 1194/udp +l2f 1701/tcp l2tp +l2f 1701/udp l2tp +radius 1812/tcp +radius 1812/udp +radius-acct 1813/tcp radacct +radius-acct 1813/udp radacct +nfs 2049/tcp +nfs 2049/udp +dict 2628/tcp +dict 2628/udp +gpsd 2947/tcp +gpsd 2947/udp +icpv2 3130/tcp icp +icpv2 3130/udp icp +mysql 3306/tcp +mysql 3306/udp +nut 3493/tcp +nut 3493/udp +distcc 3632/tcp +distcc 3632/udp +daap 3689/tcp +daap 3689/udp +svn 3690/tcp subversion +svn 3690/udp subversion +epmd 4369/tcp +epmd 4369/udp +iax 4569/tcp +iax 4569/udp +mtn 4691/tcp +mtn 4691/udp +munin 4949/tcp +sip 5060/tcp +sip 5060/udp +sip-tls 5061/tcp +sip-tls 5061/udp +xmpp-client 5222/tcp jabber-client +xmpp-client 5222/udp jabber-client +xmpp-server 5269/tcp jabber-server +xmpp-server 5269/udp jabber-server +mdns 5353/tcp +mdns 5353/udp +postgresql 5432/tcp postgres +postgresql 5432/udp postgres +x11 6000/tcp +x11 6000/udp +mysql-proxy 6446/tcp +mysql-proxy 6446/udp +bacula-dir 9101/tcp +bacula-dir 9101/udp +bacula-fd 9102/tcp +bacula-fd 9102/udp +bacula-sd 9103/tcp +bacula-sd 9103/udp +nbd 10809/tcp +zabbix-agent 10050/tcp +zabbix-agent 10050/udp +zabbix-trapper 10051/tcp +zabbix-trapper 10051/udp +hkp 11371/tcp +hkp 11371/udp +ssmtp 465/tcp smtps +spamd 783/tcp +zebrasrv 2600/tcp +zebra 2601/tcp +ripd 2602/tcp +ripngd 2603/tcp +ospfd 2604/tcp +bgpd 2605/tcp +ospf6d 2606/tcp +ospfapi 2607/tcp +isisd 2608/tcp +sane-port 6566/tcp sane saned +ircd 6667/tcp +git 9418/tcp + diff --git a/package/base-files/files/etc/shadow b/package/base-files/files/etc/shadow new file mode 100644 index 0000000..39bdb9c --- /dev/null +++ b/package/base-files/files/etc/shadow @@ -0,0 +1,5 @@ +root:::0:99999:7::: +daemon:*:0:0:99999:7::: +ftp:*:0:0:99999:7::: +network:*:0:0:99999:7::: +nobody:*:0:0:99999:7::: diff --git a/package/base-files/files/etc/shells b/package/base-files/files/etc/shells new file mode 100644 index 0000000..006aa38 --- /dev/null +++ b/package/base-files/files/etc/shells @@ -0,0 +1 @@ +/bin/ash diff --git a/package/base-files/files/etc/shinit b/package/base-files/files/etc/shinit new file mode 100644 index 0000000..8df9771 --- /dev/null +++ b/package/base-files/files/etc/shinit @@ -0,0 +1,12 @@ +[ -x /bin/more ] || [ -x /usr/bin/more ] || alias more=less +[ -x /usr/bin/vim ] && alias vi=vim || alias vim=vi + +alias ll='ls -alF --color=auto' + +[ -z "$KSH_VERSION" -o \! -s /etc/mkshrc ] || . /etc/mkshrc + +[ -x /usr/bin/arp -o -x /sbin/arp ] || arp() { cat /proc/net/arp; } +[ -x /usr/bin/ldd ] || ldd() { LD_TRACE_LOADED_OBJECTS=1 $*; } + +[ -n "$KSH_VERSION" -o \! -s "$HOME/.shinit" ] || . "$HOME/.shinit" +[ -z "$KSH_VERSION" -o \! -s "$HOME/.mkshrc" ] || . "$HOME/.mkshrc" diff --git a/package/base-files/files/etc/sysctl.conf b/package/base-files/files/etc/sysctl.conf new file mode 100644 index 0000000..ae04212 --- /dev/null +++ b/package/base-files/files/etc/sysctl.conf @@ -0,0 +1 @@ +# Defaults are configured in /etc/sysctl.d/* and can be customized in this file diff --git a/package/base-files/files/etc/sysctl.d/10-default.conf b/package/base-files/files/etc/sysctl.d/10-default.conf new file mode 100644 index 0000000..ee7df2b --- /dev/null +++ b/package/base-files/files/etc/sysctl.d/10-default.conf @@ -0,0 +1,28 @@ +# Do not edit, changes to this file will be lost on upgrades +# /etc/sysctl.conf can be used to customize sysctl settings + +kernel.panic=3 +kernel.core_pattern=/tmp/%e.%t.%p.%s.core +fs.suid_dumpable=2 + +fs.protected_hardlinks=1 +fs.protected_symlinks=1 + +net.core.bpf_jit_enable=1 +net.core.bpf_jit_kallsyms=1 + +net.ipv4.conf.default.arp_ignore=1 +net.ipv4.conf.all.arp_ignore=1 +net.ipv4.ip_forward=1 +net.ipv4.icmp_echo_ignore_broadcasts=1 +net.ipv4.icmp_ignore_bogus_error_responses=1 +net.ipv4.igmp_max_memberships=100 +net.ipv4.tcp_fin_timeout=30 +net.ipv4.tcp_keepalive_time=120 +net.ipv4.tcp_syncookies=1 +net.ipv4.tcp_timestamps=1 +net.ipv4.tcp_sack=1 +net.ipv4.tcp_dsack=1 + +net.ipv6.conf.default.forwarding=1 +net.ipv6.conf.all.forwarding=1 diff --git a/package/base-files/files/etc/sysupgrade.conf b/package/base-files/files/etc/sysupgrade.conf new file mode 100644 index 0000000..e06fd5e --- /dev/null +++ b/package/base-files/files/etc/sysupgrade.conf @@ -0,0 +1,5 @@ +## This file contains files and directories that should +## be preserved during an upgrade. + +# /etc/example.conf +# /etc/openvpn/ diff --git a/package/base-files/files/etc/uci-defaults/10_migrate-shadow b/package/base-files/files/etc/uci-defaults/10_migrate-shadow new file mode 100644 index 0000000..481444f --- /dev/null +++ b/package/base-files/files/etc/uci-defaults/10_migrate-shadow @@ -0,0 +1,10 @@ +ppwd="$(sed -ne '/^root:/s/^root:\([^:]*\):.*$/\1/p' /etc/passwd)" +spwd="$(sed -ne '/^root:/s/^root:\([^:]*\):.*$/\1/p' /etc/shadow)" + +if [ -n "${ppwd#[\!x]}" ] && [ -z "${spwd#[\!x]}" ]; then + logger -t migrate-shadow "Moving root password hash into shadow database" + sed -i -e "s:^root\:[^\:]*\::root\:x\::" /etc/passwd + sed -i -e "s:^root\:[^\:]*\::root\:$ppwd\::" /etc/shadow +fi + +exit 0 diff --git a/package/base-files/files/etc/uci-defaults/12_network-generate-ula b/package/base-files/files/etc/uci-defaults/12_network-generate-ula new file mode 100644 index 0000000..19d7ed7 --- /dev/null +++ b/package/base-files/files/etc/uci-defaults/12_network-generate-ula @@ -0,0 +1,13 @@ +[ "$(uci -q get network.globals.ula_prefix)" != "auto" ] && exit 0 + +r1=$(dd if=/dev/urandom bs=1 count=1 |hexdump -e '1/1 "%02x"') +r2=$(dd if=/dev/urandom bs=2 count=1 |hexdump -e '2/1 "%02x"') +r3=$(dd if=/dev/urandom bs=2 count=1 |hexdump -e '2/1 "%02x"') + +uci -q batch <<-EOF >/dev/null + set network.globals.ula_prefix=fd$r1:$r2:$r3::/48 + commit network +EOF + +exit 0 + diff --git a/package/base-files/files/etc/uci-defaults/13_fix-group-user b/package/base-files/files/etc/uci-defaults/13_fix-group-user new file mode 100644 index 0000000..74f501e --- /dev/null +++ b/package/base-files/files/etc/uci-defaults/13_fix-group-user @@ -0,0 +1,9 @@ +. /lib/functions.sh + +for file in $(grep -sl Require-User /usr/lib/opkg/info/*.control); do + file="${file##*/}" + file="${file%.control}" + add_group_and_user "${file}" +done + +exit 0 diff --git a/package/base-files/files/lib/functions.sh b/package/base-files/files/lib/functions.sh new file mode 100644 index 0000000..c688ac7 --- /dev/null +++ b/package/base-files/files/lib/functions.sh @@ -0,0 +1,436 @@ +# Copyright (C) 2006-2014 OpenWrt.org +# Copyright (C) 2006 Fokus Fraunhofer +# Copyright (C) 2010 Vertical Communications + + +debug () { + ${DEBUG:-:} "$@" +} + +# newline +N=" +" + +_C=0 +NO_EXPORT=1 +LOAD_STATE=1 +LIST_SEP=" " + +# xor multiple hex values of the same length +xor() { + local val + local ret="0x$1" + local retlen=${#1} + + shift + while [ -n "$1" ]; do + val="0x$1" + ret=$((ret ^ val)) + shift + done + + printf "%0${retlen}x" "$ret" +} + +append() { + local var="$1" + local value="$2" + local sep="${3:- }" + + eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\"" +} + +list_contains() { + local var="$1" + local str="$2" + local val + + eval "val=\" \${$var} \"" + [ "${val%% $str *}" != "$val" ] +} + +config_load() { + [ -n "$IPKG_INSTROOT" ] && return 0 + uci_load "$@" +} + +reset_cb() { + config_cb() { return 0; } + option_cb() { return 0; } + list_cb() { return 0; } +} +reset_cb + +package() { + return 0 +} + +config () { + local cfgtype="$1" + local name="$2" + + export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=$((CONFIG_NUM_SECTIONS + 1)) + name="${name:-cfg$CONFIG_NUM_SECTIONS}" + append CONFIG_SECTIONS "$name" + export ${NO_EXPORT:+-n} CONFIG_SECTION="$name" + config_set "$CONFIG_SECTION" "TYPE" "${cfgtype}" + [ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name" +} + +option () { + local varname="$1"; shift + local value="$*" + + config_set "$CONFIG_SECTION" "${varname}" "${value}" + [ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*" +} + +list() { + local varname="$1"; shift + local value="$*" + local len + + config_get len "$CONFIG_SECTION" "${varname}_LENGTH" 0 + [ $len = 0 ] && append CONFIG_LIST_STATE "${CONFIG_SECTION}_${varname}" + len=$((len + 1)) + config_set "$CONFIG_SECTION" "${varname}_ITEM$len" "$value" + config_set "$CONFIG_SECTION" "${varname}_LENGTH" "$len" + append "CONFIG_${CONFIG_SECTION}_${varname}" "$value" "$LIST_SEP" + [ -n "$NO_CALLBACK" ] || list_cb "$varname" "$*" +} + +config_unset() { + config_set "$1" "$2" "" +} + +# config_get