Bump buildroot to 2019.02
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
BR2_aarch64=y
|
||||
BR2_cortex_a72=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_ARM_AARCH64=y
|
||||
@@ -1,10 +0,0 @@
|
||||
BR2_arm=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/armv5-ctng-linux-gnueabi.tar.xz"
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="armv5-ctng-linux-gnueabi"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_4_8=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_12=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
@@ -1,13 +0,0 @@
|
||||
BR2_arm=y
|
||||
BR2_cortex_a9=y
|
||||
BR2_ARM_ENABLE_NEON=y
|
||||
BR2_ARM_ENABLE_VFP=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/armv7-ctng-linux-gnueabihf.tar.xz"
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="armv7-ctng-linux-gnueabihf"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_4_8=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_12=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
@@ -2,8 +2,8 @@ BR2_aarch64=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-aarch64-glibc-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-aarch64-glibc-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_4=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -3,9 +3,9 @@ BR2_archs38=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arcle-hs38-full-2017.11-rc2-15-g9d544fe.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_1=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arcle-hs38-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_8=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -2,7 +2,7 @@ BR2_arm=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-basic-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-basic-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
|
||||
@@ -4,8 +4,8 @@ BR2_ARM_ENABLE_VFP=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-glibc-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-glibc-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_8=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_20=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -4,8 +4,8 @@ BR2_ARM_ENABLE_VFP=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-musl-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-musl-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -3,9 +3,9 @@ BR2_cortex_m4=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-m4-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-m4-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_NPTL is not set
|
||||
|
||||
@@ -3,9 +3,9 @@ BR2_arm1176jzf_s=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm11-full-nothread-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm11-full-nothread-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -3,9 +3,9 @@ BR2_STATIC_LIBS=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-full-static-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_10=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-full-static-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_4=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -2,9 +2,9 @@ BR2_arm=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_4_9=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_10=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_14=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
BR2_bfin=y
|
||||
BR2_bf512=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-bfin-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_NPTL is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
@@ -2,9 +2,9 @@ BR2_x86_pentium_mmx=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-i386-pentium-mmx-musl-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_12=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-i386-pentium-mmx-musl-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_SSP is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -2,9 +2,9 @@ BR2_x86_pentium4=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-i386-pentium4-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_2=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-i386-pentium4-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_4=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -2,9 +2,9 @@ BR2_m68k=y
|
||||
BR2_m68k_cf5208=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-m68k-5208-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-m68k-5208-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_NPTL is not set
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BR2_m68k=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-m68k-68040-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-m68k-68040-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_NPTL is not set
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
BR2_microblazeel=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-microblaze-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_1=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-microblaze-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_NPTL is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -4,8 +4,8 @@ BR2_mips_32r6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-mips32r6-el-hf-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-mips32r6-el-hf-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -3,8 +3,8 @@ BR2_MIPS_NABI64=y
|
||||
# BR2_MIPS_SOFT_FLOAT is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-mips64-n64-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-mips64-n64-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_5=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -5,8 +5,8 @@ BR2_MIPS_NABI64=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-mips64r6-n64-el-hf-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-mips64r6-n64-el-hf-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -2,9 +2,9 @@ BR2_mipsel=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-mipsel-o32-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-mipsel-o32-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -2,9 +2,9 @@ BR2_nios2=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-nios2-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-nios2-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_SSP is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
BR2_or1k=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-openrisc-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-openrisc-full-2018.02-925-gd4158df.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_5=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_16=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_NPTL is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -3,8 +3,8 @@ BR2_powerpc_603e=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-powerpc-603e-basic-cpp-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-powerpc-603e-basic-cpp-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -3,9 +3,9 @@ BR2_powerpc_e500mc=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-powerpc-e500mc-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-powerpc-e500mc-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -2,8 +2,8 @@ BR2_powerpc64=y
|
||||
BR2_powerpc_power7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-powerpc64-power7-glibc-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-powerpc64-power7-glibc-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -2,8 +2,8 @@ BR2_powerpc64le=y
|
||||
BR2_powerpc_power8=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-powerpc64le-power8-glibc-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-powerpc64le-power8-glibc-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
BR2_riscv=y
|
||||
BR2_RISCV_32=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-riscv32-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
@@ -0,0 +1,7 @@
|
||||
BR2_riscv=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/br-riscv64-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
@@ -2,9 +2,9 @@ BR2_sh=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-sh4-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-sh4-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BR2_sparc=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-sparc-uclibc-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_1=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-sparc-uclibc-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
BR2_sparc64=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-sparc64-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_1=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-sparc64-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_14=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -3,9 +3,9 @@ BR2_x86_core2=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-x86-64-core2-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_4=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-x86-64-core2-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -3,8 +3,8 @@ BR2_x86_atom=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-x86-64-musl-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-x86-64-musl-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
BR2_xtensa=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-xtensa-full-2017.11-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_13=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-xtensa-full-2019.02-rc1.tar.bz2"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_19=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
||||
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
BR2_x86_i686=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/i686-ctng-linux-gnu.tar.xz"
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="i686-ctng-linux-gnu"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_4_8=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_9=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
@@ -0,0 +1,3 @@
|
||||
BR2_aarch64_be=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_LINARO_AARCH64_BE=y
|
||||
@@ -1,9 +0,0 @@
|
||||
BR2_mips64el=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/mips64el-ctng_n32-linux-gnu.tar.xz"
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="mips64el-ctng_n32-linux-gnu"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_4_8=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_9=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
@@ -1,11 +0,0 @@
|
||||
BR2_mips64el=y
|
||||
BR2_MIPS_NABI64=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/mips64el-ctng_n64-linux-gnu.tar.xz"
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="mips64el-ctng_n64-linux-gnu"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_4_8=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_9=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
@@ -1,11 +0,0 @@
|
||||
BR2_powerpc=y
|
||||
BR2_powerpc_8548=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/powerpc-ctng_e500v2-linux-gnuspe.tar.xz"
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="powerpc-ctng_e500v2-linux-gnuspe"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_4_7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_12=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
@@ -1,20 +1,38 @@
|
||||
support/config-fragments/autobuild/armv5-ctng-linux-gnueabi.config,x86
|
||||
support/config-fragments/autobuild/armv7-ctng-linux-gnueabihf.config,x86
|
||||
# This file is sorted by "importance" of toolchains, so that by
|
||||
# default test-pkg tests a useful subset of toolchains
|
||||
|
||||
# Toolchains used by default by test-pkg:
|
||||
|
||||
# Test a regular uClibc toolchain
|
||||
support/config-fragments/autobuild/br-arm-full.config,x86_64
|
||||
|
||||
# Test a toolchain with glibc and a very recent gcc version
|
||||
support/config-fragments/autobuild/br-arm-cortex-a9-glibc.config,x86_64
|
||||
|
||||
# Test a noMMU toolchain with no dynamic library support
|
||||
support/config-fragments/autobuild/br-arm-cortex-m4-full.config,x86_64
|
||||
|
||||
# Test a musl toolchain
|
||||
support/config-fragments/autobuild/br-x86-64-musl.config,x86_64
|
||||
|
||||
# Test a MMU toolchain without dynamic library support
|
||||
support/config-fragments/autobuild/br-arm-full-static.config,x86_64
|
||||
|
||||
# Test a toolchain with an old gcc version (gcc 4.8)
|
||||
support/config-fragments/autobuild/sourcery-arm.config,x86
|
||||
|
||||
# Toolchains used by test-pkg only when the '-a' option is passed:
|
||||
support/config-fragments/autobuild/arm-aarch64.config,x86_64
|
||||
support/config-fragments/autobuild/br-aarch64-glibc.config,x86_64
|
||||
support/config-fragments/autobuild/br-arc-full-internal.config,any
|
||||
support/config-fragments/autobuild/br-arc-internal-glibc.config,any
|
||||
support/config-fragments/autobuild/br-arcle-hs38.config,x86_64
|
||||
support/config-fragments/autobuild/br-arm-basic.config,x86_64
|
||||
support/config-fragments/autobuild/br-arm-cortex-a9-glibc.config,x86_64
|
||||
support/config-fragments/autobuild/br-arm-cortex-a9-musl.config,x86_64
|
||||
support/config-fragments/autobuild/br-arm-cortex-m4-full.config,x86_64
|
||||
support/config-fragments/autobuild/br-arm-full.config,x86_64
|
||||
support/config-fragments/autobuild/br-arm-full-nothread.config,x86_64
|
||||
support/config-fragments/autobuild/br-arm-full-static.config,x86_64
|
||||
support/config-fragments/autobuild/br-arm-internal-full.config,any
|
||||
support/config-fragments/autobuild/br-arm-internal-glibc.config,any
|
||||
support/config-fragments/autobuild/br-arm-internal-musl.config,any
|
||||
support/config-fragments/autobuild/br-bfin-full.config,x86_64
|
||||
support/config-fragments/autobuild/br-i386-pentium4-full.config,x86_64
|
||||
support/config-fragments/autobuild/br-i386-pentium-mmx-musl.config,x86_64
|
||||
support/config-fragments/autobuild/br-m68k-5208-full.config,x86_64
|
||||
@@ -32,24 +50,20 @@ support/config-fragments/autobuild/br-powerpc64le-power8-glibc.config,x86_64
|
||||
support/config-fragments/autobuild/br-powerpc64-power7-glibc.config,x86_64
|
||||
support/config-fragments/autobuild/br-powerpc-e500mc-full.config,x86_64
|
||||
support/config-fragments/autobuild/br-powerpc-internal-full.config,any
|
||||
support/config-fragments/autobuild/br-riscv32.config,x86_64
|
||||
support/config-fragments/autobuild/br-riscv64.config,x86_64
|
||||
support/config-fragments/autobuild/br-sh4-full.config,x86_64
|
||||
support/config-fragments/autobuild/br-sparc-uclibc.config,x86_64
|
||||
support/config-fragments/autobuild/br-sparc64-glibc.config,x86_64
|
||||
support/config-fragments/autobuild/br-x86-64-core2-full.config,x86_64
|
||||
support/config-fragments/autobuild/br-x86-64-musl.config,x86_64
|
||||
support/config-fragments/autobuild/br-xtensa-full.config,x86_64
|
||||
support/config-fragments/autobuild/br-xtensa-full-internal.config,any
|
||||
support/config-fragments/autobuild/i686-ctng-linux-gnu.config,x86
|
||||
support/config-fragments/autobuild/linaro-aarch64.config,x86
|
||||
support/config-fragments/autobuild/linaro-aarch64-be.config,x86
|
||||
support/config-fragments/autobuild/linaro-arm.config,x86
|
||||
support/config-fragments/autobuild/mips64el-ctng_n32-linux-gnu.config,x86
|
||||
support/config-fragments/autobuild/mips64el-ctng_n64-linux-gnu.config,x86
|
||||
support/config-fragments/autobuild/powerpc-ctng_e500v2-linux-gnuspe.config,x86
|
||||
support/config-fragments/autobuild/sourcery-arm-armv4t.config,x86
|
||||
support/config-fragments/autobuild/sourcery-arm.config,x86
|
||||
support/config-fragments/autobuild/sourcery-arm-thumb2.config,x86
|
||||
support/config-fragments/autobuild/sourcery-mips64.config,x86
|
||||
support/config-fragments/autobuild/sourcery-mips.config,x86
|
||||
support/config-fragments/autobuild/sourcery-nios2.config,x86
|
||||
support/config-fragments/autobuild/sourcery-x86-64.config,x86
|
||||
support/config-fragments/autobuild/x86_64-ctng_locales-linux-gnu.config,x86
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 1 and column 26.
|
@@ -1,11 +0,0 @@
|
||||
BR2_x86_64=y
|
||||
BR2_x86_corei7=y
|
||||
BR2_TOOLCHAIN_EXTERNAL=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/x86_64-ctng_locales-linux-gnu.tar.xz"
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="x86_64-ctng_locales-linux-gnu"
|
||||
BR2_TOOLCHAIN_EXTERNAL_GCC_4_8=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_9=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
|
||||
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
||||
10
bsp/buildroot/support/dependencies/check-host-bison-flex.mk
Normal file
10
bsp/buildroot/support/dependencies/check-host-bison-flex.mk
Normal file
@@ -0,0 +1,10 @@
|
||||
# If the system lacks bison or flex, add
|
||||
# dependencies to suitable host packages
|
||||
|
||||
ifeq ($(shell which bison 2>/dev/null),)
|
||||
BR2_BISON_HOST_DEPENDENCY = host-bison
|
||||
endif
|
||||
|
||||
ifeq ($(shell which flex 2>/dev/null),)
|
||||
BR2_FLEX_HOST_DEPENDENCY = host-flex
|
||||
endif
|
||||
@@ -1,14 +1,9 @@
|
||||
# Versions before 3.0 are affected by the bug described in
|
||||
# https://git.busybox.net/buildroot/commit/?id=ef2c1970e4bff3be3992014070392b0e6bc28bd2
|
||||
# and fixed in upstream CMake in version 3.0:
|
||||
# https://cmake.org/gitweb?p=cmake.git;h=e8b8b37ef6fef094940d3384df5a1d421b9fa568
|
||||
#
|
||||
# Set this to either 3.0 or higher, depending on the highest minimum
|
||||
# Set this to either 3.8 or higher, depending on the highest minimum
|
||||
# version required by any of the packages bundled in Buildroot. If a
|
||||
# package is bumped or a new one added, and it requires a higher
|
||||
# version, our cmake infra will catch it and whine.
|
||||
# version, our cmake infra will catch it and build its own.
|
||||
#
|
||||
BR2_CMAKE_VERSION_MIN = 3.1
|
||||
BR2_CMAKE_VERSION_MIN = 3.8
|
||||
|
||||
BR2_CMAKE_CANDIDATES ?= cmake cmake3
|
||||
BR2_CMAKE ?= $(call suitable-host-package,cmake,\
|
||||
|
||||
3
bsp/buildroot/support/dependencies/check-host-gzip.mk
Normal file
3
bsp/buildroot/support/dependencies/check-host-gzip.mk
Normal file
@@ -0,0 +1,3 @@
|
||||
ifeq (,$(call suitable-host-package,gzip))
|
||||
BR2_GZIP_HOST_DEPENDENCY = host-gzip
|
||||
endif
|
||||
21
bsp/buildroot/support/dependencies/check-host-gzip.sh
Executable file
21
bsp/buildroot/support/dependencies/check-host-gzip.sh
Executable file
@@ -0,0 +1,21 @@
|
||||
#!/bin/sh
|
||||
|
||||
candidate="$1" # ignored
|
||||
|
||||
gzip="$(which gzip)"
|
||||
if [ ! -x "${gzip}" ]; then
|
||||
# echo nothing: no suitable gzip found
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# gzip displays its version string on stdout
|
||||
# pigz displays its version string on stderr
|
||||
version="$("${gzip}" --version 2>&1)"
|
||||
case "${version}" in
|
||||
(*pigz*)
|
||||
# echo nothing: no suitable gzip found
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
printf "%s" "${gzip}"
|
||||
@@ -1,5 +1,5 @@
|
||||
ifeq (,$(call suitable-host-package,lzip,$(LZCAT)))
|
||||
DEPENDENCIES_HOST_PREREQ += host-lzip
|
||||
BR2_LZIP_HOST_DEPENDENCY = host-lzip
|
||||
EXTRACTOR_DEPENDENCY_PRECHECKED_EXTENSIONS += .lz
|
||||
LZCAT = $(HOST_DIR)/bin/lzip -d -c
|
||||
endif
|
||||
|
||||
21
bsp/buildroot/support/dependencies/check-host-make.mk
Normal file
21
bsp/buildroot/support/dependencies/check-host-make.mk
Normal file
@@ -0,0 +1,21 @@
|
||||
# Since version 2.28, glibc requires GNU Make >= 4.0
|
||||
# https://www.sourceware.org/ml/libc-alpha/2018-08/msg00003.html
|
||||
#
|
||||
# Set this to either 4.0 or higher, depending on the highest minimum
|
||||
# version required by any of the packages bundled in Buildroot. If a
|
||||
# package is bumped or a new one added, and it requires a higher
|
||||
# version, our package infra will catch it and whine.
|
||||
#
|
||||
BR2_MAKE_VERSION_MIN = 4.0
|
||||
|
||||
BR2_MAKE ?= $(call suitable-host-package,make,\
|
||||
$(BR2_MAKE_VERSION_MIN) $(MAKE))
|
||||
|
||||
ifeq ($(BR2_MAKE),)
|
||||
BR2_MAKE = $(HOST_DIR)/bin/host-make -j$(PARALLEL_JOBS)
|
||||
BR2_MAKE1 = $(HOST_DIR)/bin/host-make -j1
|
||||
BR2_MAKE_HOST_DEPENDENCY = host-make
|
||||
else
|
||||
BR2_MAKE = $(MAKE)
|
||||
BR2_MAKE1 = $(MAKE1)
|
||||
endif
|
||||
37
bsp/buildroot/support/dependencies/check-host-make.sh
Executable file
37
bsp/buildroot/support/dependencies/check-host-make.sh
Executable file
@@ -0,0 +1,37 @@
|
||||
#!/bin/sh
|
||||
|
||||
# prevent shift error
|
||||
[ $# -lt 2 ] && exit 1
|
||||
|
||||
major_min="${1%.*}"
|
||||
minor_min="${1#*.}"
|
||||
|
||||
shift
|
||||
|
||||
# The host make program is already checked by dependencies.sh but we
|
||||
# want to check the version number even if Buildroot is able to use
|
||||
# GNU make >= 3.81 but some packages may require a more recent version.
|
||||
make="$1"
|
||||
|
||||
# Output of 'make --version' examples:
|
||||
# GNU Make 4.2.1
|
||||
# GNU Make 4.0
|
||||
# GNU Make 3.81
|
||||
version=`$make --version 2>&1 | sed -e 's/^.* \([0-9\.]\)/\1/g' -e 's/[-\
|
||||
].*//g' -e '1q'`
|
||||
|
||||
major=`echo "$version" | cut -d. -f1`
|
||||
minor=`echo "$version" | cut -d. -f2`
|
||||
|
||||
if [ $major -lt $major_min ]; then
|
||||
# echo nothing: no suitable make found
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ $major -eq $major_min -a $minor -lt $minor_min ]; then
|
||||
# echo nothing: no suitable make found
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# valid
|
||||
echo $make
|
||||
@@ -1,6 +1,6 @@
|
||||
TAR ?= tar
|
||||
|
||||
ifeq (,$(call suitable-host-package,tar,$(TAR)))
|
||||
DEPENDENCIES_HOST_PREREQ += host-tar
|
||||
TAR = $(HOST_DIR)/bin/tar
|
||||
BR2_TAR_HOST_DEPENDENCY = host-tar
|
||||
endif
|
||||
|
||||
@@ -20,10 +20,11 @@ major=`echo "$version" | cut -d. -f1`
|
||||
minor=`echo "$version" | cut -d. -f2`
|
||||
bugfix=`echo "$version" | cut -d. -f3`
|
||||
version_bsd=`$tar --version | grep 'bsdtar'`
|
||||
if [ ! -z "${version_bsd}" ] ; then
|
||||
# mark as invalid version - not all command line options are available
|
||||
major=0
|
||||
minor=0
|
||||
|
||||
# BSD tar does not have all the command-line options
|
||||
if [ -n "${version_bsd}" ] ; then
|
||||
# echo nothing: no suitable tar found
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Minimal version = 1.27 (previous versions do not correctly unpack archives
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# If it is not present, build our own host-xzcat
|
||||
|
||||
ifeq (,$(call suitable-host-package,xzcat,$(XZCAT)))
|
||||
DEPENDENCIES_HOST_PREREQ += host-xz
|
||||
BR2_XZCAT_HOST_DEPENDENCY = host-xz
|
||||
EXTRACTOR_DEPENDENCY_PRECHECKED_EXTENSIONS += .xz .lzma
|
||||
XZCAT = $(HOST_DIR)/bin/xzcat
|
||||
endif
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
#
|
||||
################################################################################
|
||||
|
||||
ifeq ($(BR2_FORCE_HOST_BUILD),y)
|
||||
# ignore all available host packages
|
||||
define suitable-host-package
|
||||
endef
|
||||
else
|
||||
# suitable-host-pkg: calls check-host-$(1).sh shell script. Parameter (2)
|
||||
# can be the candidate to be checked. If not present, the check-host-$(1).sh
|
||||
# script should use 'which' to find a candidate. The script should return
|
||||
@@ -12,28 +17,19 @@
|
||||
define suitable-host-package
|
||||
$(shell support/dependencies/check-host-$(1).sh $(2))
|
||||
endef
|
||||
endif
|
||||
# host utilities needs host-tar to extract the source code tarballs, so
|
||||
# ensure check-host-tar.mk is included before the rest
|
||||
include support/dependencies/check-host-tar.mk
|
||||
-include $(sort $(filter-out %-tar.mk,$(wildcard support/dependencies/check-host-*.mk)))
|
||||
|
||||
ifeq ($(BR2_CCACHE),y)
|
||||
DEPENDENCIES_HOST_PREREQ += host-ccache
|
||||
endif
|
||||
|
||||
core-dependencies:
|
||||
dependencies:
|
||||
@MAKE="$(MAKE)" DL_TOOLS="$(sort $(DL_TOOLS_DEPENDENCIES))" \
|
||||
$(TOPDIR)/support/dependencies/dependencies.sh
|
||||
|
||||
$(DEPENDENCIES_HOST_PREREQ): HOSTCC=$(HOSTCC_NOCCACHE)
|
||||
$(DEPENDENCIES_HOST_PREREQ): HOSTCXX=$(HOSTCXX_NOCCACHE)
|
||||
$(DEPENDENCIES_HOST_PREREQ): core-dependencies
|
||||
|
||||
dependencies: core-dependencies $(DEPENDENCIES_HOST_PREREQ)
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Toplevel Makefile options
|
||||
#
|
||||
################################################################################
|
||||
.PHONY: dependencies core-dependencies
|
||||
.PHONY: dependencies
|
||||
|
||||
@@ -181,6 +181,14 @@ if test "${missing_progs}" = "yes" ; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check that the python version is at least 2.7
|
||||
PYTHON_VERSION=$(python -V 2>&1 |awk '{ split($2, v, "."); print v[1] v[2] }')
|
||||
if [ $PYTHON_VERSION -lt 27 ]; then
|
||||
echo
|
||||
echo "You have '$(python -V 2>&1)' installed. Python >= 2.7 is required"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
if grep ^BR2_NEEDS_HOST_UTF8_LOCALE=y $BR2_CONFIG > /dev/null; then
|
||||
if ! which locale > /dev/null ; then
|
||||
echo
|
||||
@@ -258,6 +266,10 @@ if grep -q ^BR2_PACKAGE_MPV=y $BR2_CONFIG ; then
|
||||
required_perl_modules="$required_perl_modules Math::BigRat"
|
||||
fi
|
||||
|
||||
if grep -q ^BR2_PACKAGE_WHOIS=y $BR2_CONFIG ; then
|
||||
required_perl_modules="$required_perl_modules autodie"
|
||||
fi
|
||||
|
||||
# This variable will keep the modules that are missing in your system.
|
||||
missing_perl_modules=""
|
||||
|
||||
|
||||
@@ -20,14 +20,32 @@ COPY apt-sources.list /etc/apt/sources.list
|
||||
|
||||
# The container has no package lists, so need to update first
|
||||
RUN dpkg --add-architecture i386 && \
|
||||
apt-get update -y && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
build-essential cmake libc6:i386 g++-multilib \
|
||||
bc ca-certificates file locales rsync \
|
||||
cvs bzr git mercurial subversion wget \
|
||||
cpio unzip \
|
||||
apt-get update -y
|
||||
RUN apt-get install -y --no-install-recommends \
|
||||
bc \
|
||||
build-essential \
|
||||
bzr \
|
||||
ca-certificates \
|
||||
cmake \
|
||||
cpio \
|
||||
cvs \
|
||||
file \
|
||||
g++-multilib \
|
||||
git \
|
||||
libc6:i386 \
|
||||
libncurses5-dev \
|
||||
python-nose2 python-pexpect qemu-system-arm qemu-system-x86 && \
|
||||
locales \
|
||||
mercurial \
|
||||
python-flake8 \
|
||||
python-nose2 \
|
||||
python-pexpect \
|
||||
qemu-system-arm \
|
||||
qemu-system-x86 \
|
||||
rsync \
|
||||
subversion \
|
||||
unzip \
|
||||
wget \
|
||||
&& \
|
||||
apt-get -y autoremove && \
|
||||
apt-get -y clean
|
||||
|
||||
|
||||
@@ -5,28 +5,31 @@ set -e
|
||||
|
||||
# Download helper for bzr, to be called from the download wrapper script
|
||||
#
|
||||
# Call it as:
|
||||
# .../bzr [-q] OUT_FILE REPO_URL REV BASENAME
|
||||
# Options:
|
||||
# -q Be quiet
|
||||
# -o FILE Generate archive in FILE.
|
||||
# -u URI Clone from repository at URI.
|
||||
# -c CSET Use changeset (or revision) CSET.
|
||||
# -n NAME Use basename NAME.
|
||||
#
|
||||
# Environment:
|
||||
# BZR : the bzr command to call
|
||||
|
||||
|
||||
verbose=
|
||||
while getopts :q OPT; do
|
||||
while getopts "${BR_BACKEND_DL_GETOPTS}" OPT; do
|
||||
case "${OPT}" in
|
||||
q) verbose=-q;;
|
||||
o) output="${OPTARG}";;
|
||||
u) uri="${OPTARG}";;
|
||||
c) cset="${OPTARG}";;
|
||||
n) basename="${OPTARG}";;
|
||||
:) printf "option '%s' expects a mandatory argument\n" "${OPTARG}"; exit 1;;
|
||||
\?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
output="${1}"
|
||||
repo="${2}"
|
||||
rev="${3}"
|
||||
basename="${4}"
|
||||
|
||||
shift 4 # Get rid of our options
|
||||
shift $((OPTIND-1)) # Get rid of our options
|
||||
|
||||
# Caller needs to single-quote its arguments to prevent them from
|
||||
# being expanded a second time (in case there are spaces in them)
|
||||
@@ -51,5 +54,5 @@ if [ ${bzr_version} -ge ${bzr_min_version} ]; then
|
||||
fi
|
||||
|
||||
_bzr export ${verbose} --root="'${basename}/'" --format=tgz \
|
||||
${timestamp_opt} - "${@}" "'${repo}'" -r "'${rev}'" \
|
||||
${timestamp_opt} - "${@}" "'${uri}'" -r "'${cset}'" \
|
||||
>"${output}"
|
||||
|
||||
@@ -5,33 +5,41 @@ set -e
|
||||
|
||||
# Download helper for cvs, to be called from the download wrapper script
|
||||
#
|
||||
# Call it as:
|
||||
# .../cvs [-q] OUT_FILE CVS_URL REV PKG_NAME BASENAME
|
||||
# Options:
|
||||
# -q Be quiet
|
||||
# -o FILE Generate archive in FILE.
|
||||
# -u URI Checkout from repository at URI.
|
||||
# -c REV Use revision REV.
|
||||
# -N RAWNAME Use rawname (aka module name) RAWNAME.
|
||||
# -n NAME Use basename NAME.
|
||||
#
|
||||
# Environment:
|
||||
# CVS : the cvs command to call
|
||||
|
||||
verbose=
|
||||
while getopts :q OPT; do
|
||||
while getopts "${BR_BACKEND_DL_GETOPTS}" OPT; do
|
||||
case "${OPT}" in
|
||||
q) verbose=-Q;;
|
||||
o) output="${OPTARG}";;
|
||||
u) uri="${OPTARG#*://}";;
|
||||
c) rev="${OPTARG}";;
|
||||
N) rawname="${OPTARG}";;
|
||||
n) basename="${OPTARG}";;
|
||||
:) printf "option '%s' expects a mandatory argument\n" "${OPTARG}"; exit 1;;
|
||||
\?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
output="${1}"
|
||||
repo="${2}"
|
||||
rev="${3}"
|
||||
rawname="${4}"
|
||||
basename="${5}"
|
||||
|
||||
shift 5 # Get rid of our options
|
||||
shift $((OPTIND-1)) # Get rid of our options
|
||||
|
||||
# Caller needs to single-quote its arguments to prevent them from
|
||||
# being expanded a second time (in case there are spaces in them)
|
||||
# being expanded a second time (in case there are spaces in them).
|
||||
# If the CVS server is deadlocked, the client will never return (cfr.
|
||||
# http://autobuild.buildroot.net/results/23d/23d1034b33d0354de15de2ec4a8ccd0603e8db78/build-end.log
|
||||
# ). Since nobody sane will put large code bases in CVS, a timeout of
|
||||
# 10 minutes should do the trick.
|
||||
_cvs() {
|
||||
eval ${CVS} "${@}"
|
||||
eval timeout 10m ${CVS} "${@}"
|
||||
}
|
||||
|
||||
if [[ ${rev} =~ ^[0-9] ]]; then
|
||||
@@ -42,14 +50,14 @@ else
|
||||
select="-r"
|
||||
fi
|
||||
|
||||
# The absence of an initial : on ${repo} means access method undefined
|
||||
if [[ ! "${repo}" =~ ^: ]]; then
|
||||
# The absence of an initial : on ${uri} means access method undefined
|
||||
if [[ ! "${uri}" =~ ^: ]]; then
|
||||
# defaults to anonymous pserver
|
||||
repo=":pserver:anonymous@${repo}"
|
||||
uri=":pserver:anonymous@${uri}"
|
||||
fi
|
||||
|
||||
export TZ=UTC
|
||||
_cvs ${verbose} -z3 -d"'${repo}'" \
|
||||
_cvs ${verbose} -z3 -d"'${uri}'" \
|
||||
co "${@}" -d "'${basename}'" ${select} "'${rev}'" -P "'${rawname}'"
|
||||
|
||||
tar czf "${output}" "${basename}"
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
# Its role is to ensure atomicity when saving downloaded files
|
||||
# back to BR2_DL_DIR, and not clutter BR2_DL_DIR with partial,
|
||||
# failed downloads.
|
||||
#
|
||||
# Call it with -h to see some help.
|
||||
|
||||
# To avoid cluttering BR2_DL_DIR, we download to a trashable
|
||||
# location, namely in $(BUILD_DIR).
|
||||
@@ -19,33 +17,51 @@
|
||||
# We want to catch any unexpected failure, and exit immediately.
|
||||
set -e
|
||||
|
||||
export BR_BACKEND_DL_GETOPTS=":hc:d:o:n:N:H:ru:qf:e"
|
||||
|
||||
main() {
|
||||
local OPT OPTARG
|
||||
local backend output hfile recurse quiet
|
||||
local backend output hfile recurse quiet rc
|
||||
local -a uris
|
||||
|
||||
# Parse our options; anything after '--' is for the backend
|
||||
while getopts :hb:o:H:rq OPT; do
|
||||
while getopts ":c:d:D:o:n:N:H:rf:u:q" OPT; do
|
||||
case "${OPT}" in
|
||||
h) help; exit 0;;
|
||||
b) backend="${OPTARG}";;
|
||||
c) cset="${OPTARG}";;
|
||||
d) dl_dir="${OPTARG}";;
|
||||
D) old_dl_dir="${OPTARG}";;
|
||||
o) output="${OPTARG}";;
|
||||
n) raw_base_name="${OPTARG}";;
|
||||
N) base_name="${OPTARG}";;
|
||||
H) hfile="${OPTARG}";;
|
||||
r) recurse="-r";;
|
||||
f) filename="${OPTARG}";;
|
||||
u) uris+=( "${OPTARG}" );;
|
||||
q) quiet="-q";;
|
||||
:) error "option '%s' expects a mandatory argument\n" "${OPTARG}";;
|
||||
\?) error "unknown option '%s'\n" "${OPTARG}";;
|
||||
esac
|
||||
done
|
||||
|
||||
# Forget our options, and keep only those for the backend
|
||||
shift $((OPTIND-1))
|
||||
|
||||
if [ -z "${backend}" ]; then
|
||||
error "no backend specified, use -b\n"
|
||||
fi
|
||||
if [ -z "${output}" ]; then
|
||||
error "no output specified, use -o\n"
|
||||
fi
|
||||
|
||||
# Legacy handling: check if the file already exists in the global
|
||||
# download directory. If it does, hard-link it. If it turns out it
|
||||
# was an incorrect download, we'd still check it below anyway.
|
||||
# If we can neither link nor copy, fallback to doing a download.
|
||||
# NOTE! This is not atomic, is subject to TOCTTOU, but the whole
|
||||
# dl-wrapper runs under an flock, so we're safe.
|
||||
if [ ! -e "${output}" -a -e "${old_dl_dir}/${filename}" ]; then
|
||||
ln "${old_dl_dir}/${filename}" "${output}" || \
|
||||
cp "${old_dl_dir}/${filename}" "${output}" || \
|
||||
true
|
||||
fi
|
||||
|
||||
# If the output file already exists and:
|
||||
# - there's no .hash file: do not download it again and exit promptly
|
||||
# - matches all its hashes: do not download it again and exit promptly
|
||||
@@ -64,36 +80,85 @@ main() {
|
||||
warn "Re-downloading '%s'...\n" "${output##*/}"
|
||||
fi
|
||||
|
||||
# tmpd is a temporary directory in which backends may store intermediate
|
||||
# by-products of the download.
|
||||
# tmpf is the file in which the backends should put the downloaded content.
|
||||
# tmpd is located in $(BUILD_DIR), so as not to clutter the (precious)
|
||||
# $(BR2_DL_DIR)
|
||||
# We let the backends create tmpf, so they are able to set whatever
|
||||
# permission bits they want (although we're only really interested in
|
||||
# the executable bit.)
|
||||
tmpd="$(mktemp -d "${BUILD_DIR}/.${output##*/}.XXXXXX")"
|
||||
tmpf="${tmpd}/output"
|
||||
# Look through all the uris that we were given to download the package
|
||||
# source
|
||||
download_and_check=0
|
||||
rc=1
|
||||
for uri in "${uris[@]}"; do
|
||||
backend_urlencode="${uri%%+*}"
|
||||
backend="${backend_urlencode%|*}"
|
||||
case "${backend}" in
|
||||
git|svn|cvs|bzr|file|scp|hg) ;;
|
||||
*) backend="wget" ;;
|
||||
esac
|
||||
uri=${uri#*+}
|
||||
|
||||
# Helpers expect to run in a directory that is *really* trashable, so
|
||||
# they are free to create whatever files and/or sub-dirs they might need.
|
||||
# Doing the 'cd' here rather than in all backends is easier.
|
||||
cd "${tmpd}"
|
||||
urlencode=${backend_urlencode#*|}
|
||||
# urlencode must be "urlencode"
|
||||
[ "${urlencode}" != "urlencode" ] && urlencode=""
|
||||
|
||||
# If the backend fails, we can just remove the temporary directory to
|
||||
# remove all the cruft it may have left behind. Then we just exit in
|
||||
# error too.
|
||||
if ! "${OLDPWD}/support/download/${backend}" ${quiet} ${recurse} "${tmpf}" "${@}"; then
|
||||
rm -rf "${tmpd}"
|
||||
exit 1
|
||||
fi
|
||||
# tmpd is a temporary directory in which backends may store
|
||||
# intermediate by-products of the download.
|
||||
# tmpf is the file in which the backends should put the downloaded
|
||||
# content.
|
||||
# tmpd is located in $(BUILD_DIR), so as not to clutter the (precious)
|
||||
# $(BR2_DL_DIR)
|
||||
# We let the backends create tmpf, so they are able to set whatever
|
||||
# permission bits they want (although we're only really interested in
|
||||
# the executable bit.)
|
||||
tmpd="$(mktemp -d "${BUILD_DIR}/.${output##*/}.XXXXXX")"
|
||||
tmpf="${tmpd}/output"
|
||||
|
||||
# cd back to free the temp-dir, so we can remove it later
|
||||
cd "${OLDPWD}"
|
||||
# Helpers expect to run in a directory that is *really* trashable, so
|
||||
# they are free to create whatever files and/or sub-dirs they might need.
|
||||
# Doing the 'cd' here rather than in all backends is easier.
|
||||
cd "${tmpd}"
|
||||
|
||||
# Check if the downloaded file is sane, and matches the stored hashes
|
||||
# for that file
|
||||
if ! support/download/check-hash ${quiet} "${hfile}" "${tmpf}" "${output##*/}"; then
|
||||
# If the backend fails, we can just remove the content of the temporary
|
||||
# directory to remove all the cruft it may have left behind, and try
|
||||
# the next URI until it succeeds. Once out of URI to try, we need to
|
||||
# cleanup and exit.
|
||||
if ! "${OLDPWD}/support/download/${backend}" \
|
||||
$([ -n "${urlencode}" ] && printf %s '-e') \
|
||||
-c "${cset}" \
|
||||
-d "${dl_dir}" \
|
||||
-n "${raw_base_name}" \
|
||||
-N "${base_name}" \
|
||||
-f "${filename}" \
|
||||
-u "${uri}" \
|
||||
-o "${tmpf}" \
|
||||
${quiet} ${recurse} -- "${@}"
|
||||
then
|
||||
# cd back to keep path coherence
|
||||
cd "${OLDPWD}"
|
||||
rm -rf "${tmpd}"
|
||||
continue
|
||||
fi
|
||||
|
||||
# cd back to free the temp-dir, so we can remove it later
|
||||
cd "${OLDPWD}"
|
||||
|
||||
# Check if the downloaded file is sane, and matches the stored hashes
|
||||
# for that file
|
||||
if support/download/check-hash ${quiet} "${hfile}" "${tmpf}" "${output##*/}"; then
|
||||
rc=0
|
||||
else
|
||||
if [ ${?} -ne 3 ]; then
|
||||
rm -rf "${tmpd}"
|
||||
continue
|
||||
fi
|
||||
|
||||
# the hash file exists and there was no hash to check the file
|
||||
# against
|
||||
rc=1
|
||||
fi
|
||||
download_and_check=1
|
||||
break
|
||||
done
|
||||
|
||||
# We tried every URI possible, none seems to work or to check against the
|
||||
# available hash. *ABORT MISSION*
|
||||
if [ "${download_and_check}" -eq 0 ]; then
|
||||
rm -rf "${tmpd}"
|
||||
exit 1
|
||||
fi
|
||||
@@ -141,51 +206,8 @@ main() {
|
||||
rm -f "${tmp_output}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
help() {
|
||||
cat <<_EOF_
|
||||
NAME
|
||||
${my_name} - download wrapper for Buildroot
|
||||
|
||||
SYNOPSIS
|
||||
${my_name} [OPTION]... -- [BACKEND OPTION]...
|
||||
|
||||
DESCRIPTION
|
||||
Wrapper script around different download mechanisms. Ensures that
|
||||
concurrent downloads do not conflict, that partial downloads are
|
||||
properly evicted without leaving temporary files, and that access
|
||||
rights are maintained.
|
||||
|
||||
-h This help text.
|
||||
|
||||
-b BACKEND
|
||||
Wrap the specified BACKEND. Known backends are:
|
||||
bzr Bazaar
|
||||
cp Local files
|
||||
cvs Concurrent Versions System
|
||||
git Git
|
||||
hg Mercurial
|
||||
scp Secure copy
|
||||
svn Subversion
|
||||
wget HTTP download
|
||||
|
||||
-o FILE
|
||||
Store the downloaded archive in FILE.
|
||||
|
||||
-H FILE
|
||||
Use FILE to read hashes from, and check them against the downloaded
|
||||
archive.
|
||||
|
||||
Exit status:
|
||||
0 if OK
|
||||
!0 in case of error
|
||||
|
||||
ENVIRONMENT
|
||||
|
||||
BUILD_DIR
|
||||
The path to Buildroot's build dir
|
||||
_EOF_
|
||||
return ${rc}
|
||||
}
|
||||
|
||||
trace() { local msg="${1}"; shift; printf "%s: ${msg}" "${my_name}" "${@}"; }
|
||||
|
||||
@@ -5,8 +5,11 @@ set -e
|
||||
|
||||
# Download helper for cp, to be called from the download wrapper script
|
||||
#
|
||||
# Call it as:
|
||||
# .../cp [-q] OUT_FILE SRC_FILE
|
||||
# Options:
|
||||
# -q Be quiet.
|
||||
# -o FILE Copy to file FILE.
|
||||
# -f FILE Copy from basename file FILE.
|
||||
# -u DIR Copy from FILE in DIR.
|
||||
#
|
||||
# Environment:
|
||||
# LOCALFILES: the cp command to call
|
||||
@@ -17,18 +20,18 @@ set -e
|
||||
# Make 'cp' verbose by default, so it behaves a bit like the others.
|
||||
verbose=-v
|
||||
|
||||
while getopts :q OPT; do
|
||||
while getopts "${BR_BACKEND_DL_GETOPTS}" OPT; do
|
||||
case "${OPT}" in
|
||||
q) verbose=;;
|
||||
o) output="${OPTARG}";;
|
||||
f) file="${OPTARG}";;
|
||||
u) dir="${OPTARG}";;
|
||||
:) printf "option '%s' expects a mandatory argument\n" "${OPTARG}"; exit 1;;
|
||||
\?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
output="${1}"
|
||||
source="${2}"
|
||||
|
||||
shift 2 # Get rid of our options
|
||||
shift $((OPTIND-1)) # Get rid of our options
|
||||
|
||||
# Caller needs to single-quote its arguments to prevent them from
|
||||
# being expanded a second time (in case there are spaces in them)
|
||||
@@ -36,4 +39,4 @@ _localfiles() {
|
||||
eval ${LOCALFILES} "${@}"
|
||||
}
|
||||
|
||||
_localfiles ${verbose} "${@}""'${source}'" "'${output}'"
|
||||
_localfiles ${verbose} "'${dir##file://}/${file}'" "'${output}'"
|
||||
@@ -1,65 +1,119 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# We want to catch any unexpected failure, and exit immediately
|
||||
set -e
|
||||
set -E
|
||||
|
||||
# Download helper for git, to be called from the download wrapper script
|
||||
#
|
||||
# Call it as:
|
||||
# .../git [-q] [-r] OUT_FILE REPO_URL CSET BASENAME
|
||||
#
|
||||
# -q Be quiet.
|
||||
# -r Clone and archive sub-modules.
|
||||
# Options:
|
||||
# -q Be quiet.
|
||||
# -r Clone and archive sub-modules.
|
||||
# -o FILE Generate archive in FILE.
|
||||
# -u URI Clone from repository at URI.
|
||||
# -c CSET Use changeset CSET.
|
||||
# -n NAME Use basename NAME.
|
||||
#
|
||||
# Environment:
|
||||
# GIT : the git command to call
|
||||
|
||||
# Save our path and options in case we need to call ourselves again
|
||||
myname="${0}"
|
||||
declare -a OPTS=("${@}")
|
||||
|
||||
# This function is called when an error occurs. Its job is to attempt a
|
||||
# clone from scratch (only once!) in case the git tree is borked, or in
|
||||
# case an unexpected and unsupported situation arises with submodules
|
||||
# or uncommitted stuff (e.g. if the user manually mucked around in the
|
||||
# git cache).
|
||||
_on_error() {
|
||||
local ret=${?}
|
||||
|
||||
printf "Detected a corrupted git cache.\n" >&2
|
||||
if ${BR_GIT_BACKEND_FIRST_FAULT:-false}; then
|
||||
printf "This is the second time in a row; bailing out\n" >&2
|
||||
exit ${ret}
|
||||
fi
|
||||
export BR_GIT_BACKEND_FIRST_FAULT=true
|
||||
|
||||
printf "Removing it and starting afresh.\n" >&2
|
||||
|
||||
popd >/dev/null
|
||||
rm -rf "${git_cache}"
|
||||
|
||||
exec "${myname}" "${OPTS[@]}" || exit ${ret}
|
||||
}
|
||||
|
||||
verbose=
|
||||
recurse=0
|
||||
while getopts :qr OPT; do
|
||||
while getopts "${BR_BACKEND_DL_GETOPTS}" OPT; do
|
||||
case "${OPT}" in
|
||||
q) verbose=-q; exec >/dev/null;;
|
||||
r) recurse=1;;
|
||||
o) output="${OPTARG}";;
|
||||
u) uri="${OPTARG}";;
|
||||
c) cset="${OPTARG}";;
|
||||
d) dl_dir="${OPTARG}";;
|
||||
n) basename="${OPTARG}";;
|
||||
:) printf "option '%s' expects a mandatory argument\n" "${OPTARG}"; exit 1;;
|
||||
\?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
output="${1}"
|
||||
repo="${2}"
|
||||
cset="${3}"
|
||||
basename="${4}"
|
||||
shift $((OPTIND-1)) # Get rid of our options
|
||||
|
||||
shift 4 # Get rid of our options
|
||||
# Create and cd into the directory that will contain the local git cache
|
||||
git_cache="${dl_dir}/git"
|
||||
mkdir -p "${git_cache}"
|
||||
pushd "${git_cache}" >/dev/null
|
||||
|
||||
# Any error now should try to recover
|
||||
trap _on_error ERR
|
||||
|
||||
# Caller needs to single-quote its arguments to prevent them from
|
||||
# being expanded a second time (in case there are spaces in them)
|
||||
_git() {
|
||||
eval ${GIT} "${@}"
|
||||
eval GIT_DIR="${git_cache}/.git" ${GIT} "${@}"
|
||||
}
|
||||
|
||||
# Try a shallow clone, since it is faster than a full clone - but that only
|
||||
# works if the version is a ref (tag or branch). Before trying to do a shallow
|
||||
# clone we check if ${cset} is in the list provided by git ls-remote. If not
|
||||
# we fall back on a full clone.
|
||||
# Create a warning file, that the user should not use the git cache.
|
||||
# It's ours. Our precious.
|
||||
cat <<-_EOF_ >"${dl_dir}/git.readme"
|
||||
IMPORTANT NOTE!
|
||||
|
||||
The git tree located in this directory is for the exclusive use
|
||||
by Buildroot, which uses it as a local cache to reduce bandwidth
|
||||
usage.
|
||||
|
||||
Buildroot *will* trash any changes in that tree whenever it needs
|
||||
to use it. Buildroot may even remove it in case it detects the
|
||||
repository may have been damaged or corrupted.
|
||||
|
||||
Do *not* work in that directory; your changes will eventually get
|
||||
lost. Do *not* even use it as a remote, or as the source for new
|
||||
worktrees; your commits will eventually get lost.
|
||||
_EOF_
|
||||
|
||||
# Initialise a repository in the git cache. If the repository already
|
||||
# existed, this is a noop, unless the repository was broken, in which
|
||||
# case this magically restores it to working conditions. In the latter
|
||||
# case, we might be missing blobs, but that's not a problem: we'll
|
||||
# fetch what we need later anyway.
|
||||
#
|
||||
# Messages for the type of clone used are provided to ease debugging in case of
|
||||
# problems
|
||||
git_done=0
|
||||
if [ -n "$(_git ls-remote "'${repo}'" "'${cset}'" 2>&1)" ]; then
|
||||
printf "Doing shallow clone\n"
|
||||
if _git clone ${verbose} "${@}" --depth 1 -b "'${cset}'" "'${repo}'" "'${basename}'"; then
|
||||
git_done=1
|
||||
else
|
||||
printf "Shallow clone failed, falling back to doing a full clone\n"
|
||||
fi
|
||||
fi
|
||||
if [ ${git_done} -eq 0 ]; then
|
||||
printf "Doing full clone\n"
|
||||
_git clone ${verbose} "${@}" "'${repo}'" "'${basename}'"
|
||||
# We can still go through the wrapper, because 'init' does not use the
|
||||
# path pointed to by GIT_DIR, but really uses the directory passed as
|
||||
# argument.
|
||||
_git init .
|
||||
|
||||
# Ensure the repo has an origin (in case a previous run was killed).
|
||||
if ! _git remote |grep -q -E '^origin$'; then
|
||||
_git remote add origin "'${uri}'"
|
||||
fi
|
||||
|
||||
pushd "${basename}" >/dev/null
|
||||
_git remote set-url origin "'${uri}'"
|
||||
|
||||
printf "Fetching all references\n"
|
||||
_git fetch origin
|
||||
_git fetch origin -t
|
||||
|
||||
# Try to get the special refs exposed by some forges (pull-requests for
|
||||
# github, changes for gerrit...). There is no easy way to know whether
|
||||
@@ -72,9 +126,48 @@ if ! _git fetch origin "'${cset}:${cset}'" >/dev/null 2>&1; then
|
||||
printf "Could not fetch special ref '%s'; assuming it is not special.\n" "${cset}"
|
||||
fi
|
||||
|
||||
# Check that the changeset does exist. If it does not, re-cloning from
|
||||
# scratch won't help, so we don't want to trash the repository for a
|
||||
# missing commit. We just exit without going through the ERR trap.
|
||||
if ! _git rev-parse --quiet --verify "'${cset}^{commit}'" >/dev/null 2>&1; then
|
||||
printf "Commit '%s' does not exist in this repository\n." "${cset}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# The new cset we want to checkout might have different submodules, or
|
||||
# have sub-dirs converted to/from a submodule. So we would need to
|
||||
# deregister _current_ submodules before we checkout.
|
||||
#
|
||||
# Using "git submodule deinit --all" would remove all the files for
|
||||
# all submodules, including the corresponding .git files or directories.
|
||||
# However, it was only introduced with git-1.8.3, which is too recent
|
||||
# for some enterprise-grade distros.
|
||||
#
|
||||
# So, we fall-back to just removing all submodules directories. We do
|
||||
# not need to be recursive, as removing a submodule will de-facto remove
|
||||
# its own submodules.
|
||||
#
|
||||
# For recent git versions, the repository for submodules is stored
|
||||
# inside the repository of the super repository, so the following will
|
||||
# only remove the working copies of submodules, effectively caching the
|
||||
# submodules.
|
||||
#
|
||||
# For older versions however, the repository is stored in the .git/ of
|
||||
# the submodule directory, so the following will effectively remove the
|
||||
# the working copy as well as the repository, which means submodules
|
||||
# will not be cached for older versions.
|
||||
#
|
||||
cmd='printf "Deregistering submodule \"%s\"\n" "${path}" && cd .. && rm -rf "${path##*/}"'
|
||||
_git submodule --quiet foreach "'${cmd}'"
|
||||
|
||||
# Checkout the required changeset, so that we can update the required
|
||||
# submodules.
|
||||
_git checkout -q "'${cset}'"
|
||||
_git checkout -f -q "'${cset}'"
|
||||
|
||||
# Get rid of now-untracked directories (in case a git operation was
|
||||
# interrupted in a previous run, or to get rid of empty directories
|
||||
# that were parents of submodules removed above).
|
||||
_git clean -ffdx
|
||||
|
||||
# Get date of commit to generate a reproducible archive.
|
||||
# %cD is RFC2822, so it's fully qualified, with TZ and all.
|
||||
@@ -85,20 +178,24 @@ if [ ${recurse} -eq 1 ]; then
|
||||
_git submodule update --init --recursive
|
||||
fi
|
||||
|
||||
# We do not want the .git dir; we keep other .git files, in case they
|
||||
# are the only files in their directory.
|
||||
# Generate the archive, sort with the C locale so that it is reproducible.
|
||||
# We do not want the .git dir; we keep other .git files, in case they are the
|
||||
# only files in their directory.
|
||||
# The .git dir would generate non reproducible tarballs as it depends on
|
||||
# the state of the remote server. It also would generate large tarballs
|
||||
# (gigabytes for some linux trees) when a full clone took place.
|
||||
rm -rf .git
|
||||
find . -not -type d \
|
||||
-and -not -path "./.git/*" >"${output}.list"
|
||||
LC_ALL=C sort <"${output}.list" >"${output}.list.sorted"
|
||||
|
||||
popd >/dev/null
|
||||
|
||||
# Generate the archive, sort with the C locale so that it is reproducible
|
||||
find "${basename}" -not -type d >"${basename}.list"
|
||||
LC_ALL=C sort <"${basename}.list" >"${basename}.list.sorted"
|
||||
# Create GNU-format tarballs, since that's the format of the tarballs on
|
||||
# sources.buildroot.org and used in the *.hash files
|
||||
tar cf - --numeric-owner --owner=0 --group=0 --mtime="${date}" --format=gnu \
|
||||
-T "${basename}.list.sorted" >"${output}.tar"
|
||||
tar cf - --transform="s#^\./#${basename}/#" \
|
||||
--numeric-owner --owner=0 --group=0 --mtime="${date}" --format=gnu \
|
||||
-T "${output}.list.sorted" >"${output}.tar"
|
||||
gzip -6 -n <"${output}.tar" >"${output}"
|
||||
|
||||
rm -f "${output}.list"
|
||||
rm -f "${output}.list.sorted"
|
||||
|
||||
popd >/dev/null
|
||||
|
||||
@@ -5,27 +5,30 @@ set -e
|
||||
|
||||
# Download helper for hg, to be called from the download wrapper script
|
||||
#
|
||||
# Call it as:
|
||||
# .../hg [-q] OUT_FILE REPO_URL CSET BASENAME
|
||||
# Options:
|
||||
# -q Be quiet.
|
||||
# -o FILE Generate archive in FILE.
|
||||
# -u URI Clone from repository at URI.
|
||||
# -c CSET Use changeset (or revision) CSET.
|
||||
# -n NAME Use basename NAME.
|
||||
#
|
||||
# Environment:
|
||||
# HG : the hg command to call
|
||||
|
||||
verbose=
|
||||
while getopts :q OPT; do
|
||||
while getopts "${BR_BACKEND_DL_GETOPTS}" OPT; do
|
||||
case "${OPT}" in
|
||||
q) verbose=-q;;
|
||||
o) output="${OPTARG}";;
|
||||
u) uri="${OPTARG}";;
|
||||
c) cset="${OPTARG}";;
|
||||
n) basename="${OPTARG}";;
|
||||
:) printf "option '%s' expects a mandatory argument\n" "${OPTARG}"; exit 1;;
|
||||
\?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
output="${1}"
|
||||
repo="${2}"
|
||||
cset="${3}"
|
||||
basename="${4}"
|
||||
|
||||
shift 4 # Get rid of our options
|
||||
shift $((OPTIND-1)) # Get rid of our options
|
||||
|
||||
# Caller needs to single-quote its arguments to prevent them from
|
||||
# being expanded a second time (in case there are spaces in them)
|
||||
@@ -33,7 +36,7 @@ _hg() {
|
||||
eval ${HG} "${@}"
|
||||
}
|
||||
|
||||
_hg clone ${verbose} "${@}" --noupdate "'${repo}'" "'${basename}'"
|
||||
_hg clone ${verbose} "${@}" --noupdate "'${uri}'" "'${basename}'"
|
||||
|
||||
_hg archive ${verbose} --repository "'${basename}'" --type tgz \
|
||||
--prefix "'${basename}'" --rev "'${cset}'" \
|
||||
|
||||
@@ -5,25 +5,28 @@ set -e
|
||||
|
||||
# Download helper for scp, to be called from the download wrapper script
|
||||
#
|
||||
# Call it as:
|
||||
# .../scp [-q] OUT_FILE SRC_URL
|
||||
# Options:
|
||||
# -q Be quiet.
|
||||
# -o FILE Copy to local file FILE.
|
||||
# -f FILE Copy from remote file FILE.
|
||||
# -u URI Download file at URI.
|
||||
#
|
||||
# Environment:
|
||||
# SCP : the scp command to call
|
||||
|
||||
verbose=
|
||||
while getopts :q OPT; do
|
||||
while getopts "${BR_BACKEND_DL_GETOPTS}" OPT; do
|
||||
case "${OPT}" in
|
||||
q) verbose=-q;;
|
||||
o) output="${OPTARG}";;
|
||||
f) filename="${OPTARG}";;
|
||||
u) uri="${OPTARG}";;
|
||||
:) printf "option '%s' expects a mandatory argument\n" "${OPTARG}"; exit 1;;
|
||||
\?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
output="${1}"
|
||||
url="${2}"
|
||||
|
||||
shift 2 # Get rid of our options
|
||||
shift $((OPTIND-1)) # Get rid of our options
|
||||
|
||||
# Caller needs to single-quote its arguments to prevent them from
|
||||
# being expanded a second time (in case there are spaces in them)
|
||||
@@ -31,4 +34,7 @@ _scp() {
|
||||
eval ${SCP} "${@}"
|
||||
}
|
||||
|
||||
_scp ${verbose} "${@}" "'${url}'" "'${output}'"
|
||||
# Remove any scheme prefix
|
||||
uri="${uri##scp://}"
|
||||
|
||||
_scp ${verbose} "${@}" "'${uri}/${filename}'" "'${output}'"
|
||||
|
||||
@@ -5,27 +5,30 @@ set -e
|
||||
|
||||
# Download helper for svn, to be called from the download wrapper script
|
||||
#
|
||||
# Call it as:
|
||||
# .../svn [-q] OUT_FILE REPO_URL REV BASNAME
|
||||
# Options:
|
||||
# -q Be quiet.
|
||||
# -o FILE Generate archive in FILE.
|
||||
# -u URI Checkout from repository at URI.
|
||||
# -c REV Use revision REV.
|
||||
# -n NAME Use basename NAME.
|
||||
#
|
||||
# Environment:
|
||||
# SVN : the svn command to call
|
||||
|
||||
verbose=
|
||||
while getopts :q OPT; do
|
||||
while getopts "${BR_BACKEND_DL_GETOPTS}" OPT; do
|
||||
case "${OPT}" in
|
||||
q) verbose=-q;;
|
||||
o) output="${OPTARG}";;
|
||||
u) uri="${OPTARG}";;
|
||||
c) rev="${OPTARG}";;
|
||||
n) basename="${OPTARG}";;
|
||||
:) printf "option '%s' expects a mandatory argument\n" "${OPTARG}"; exit 1;;
|
||||
\?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
output="${1}"
|
||||
repo="${2}"
|
||||
rev="${3}"
|
||||
basename="${4}"
|
||||
|
||||
shift 4 # Get rid of our options
|
||||
shift $((OPTIND-1)) # Get rid of our options
|
||||
|
||||
# Caller needs to single-quote its arguments to prevent them from
|
||||
# being expanded a second time (in case there are spaces in them)
|
||||
@@ -33,6 +36,6 @@ _svn() {
|
||||
eval ${SVN} "${@}"
|
||||
}
|
||||
|
||||
_svn export ${verbose} "${@}" "'${repo}@${rev}'" "'${basename}'"
|
||||
_svn export ${verbose} "${@}" "'${uri}@${rev}'" "'${basename}'"
|
||||
|
||||
tar czf "${output}" "${basename}"
|
||||
|
||||
@@ -5,25 +5,30 @@ set -e
|
||||
|
||||
# Download helper for wget, to be called from the download wrapper script
|
||||
#
|
||||
# Call it as:
|
||||
# .../wget [-q] OUT_FILE URL
|
||||
# Options:
|
||||
# -q Be quiet.
|
||||
# -o FILE Save into file FILE.
|
||||
# -f FILENAME The filename of the tarball to get at URL
|
||||
# -u URL Download file at URL.
|
||||
# -e ENCODE Tell wget to urlencode the filename passed to it
|
||||
#
|
||||
# Environment:
|
||||
# WGET : the wget command to call
|
||||
|
||||
verbose=
|
||||
while getopts :q OPT; do
|
||||
while getopts "${BR_BACKEND_DL_GETOPTS}" OPT; do
|
||||
case "${OPT}" in
|
||||
q) verbose=-q;;
|
||||
o) output="${OPTARG}";;
|
||||
f) filename="${OPTARG}";;
|
||||
u) url="${OPTARG}";;
|
||||
e) encode="-e";;
|
||||
:) printf "option '%s' expects a mandatory argument\n" "${OPTARG}"; exit 1;;
|
||||
\?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
output="${1}"
|
||||
url="${2}"
|
||||
|
||||
shift 2 # Get rid of our options
|
||||
shift $((OPTIND-1)) # Get rid of our options
|
||||
|
||||
# Caller needs to single-quote its arguments to prevent them from
|
||||
# being expanded a second time (in case there are spaces in them)
|
||||
@@ -31,4 +36,8 @@ _wget() {
|
||||
eval ${WGET} "${@}"
|
||||
}
|
||||
|
||||
_wget ${verbose} "${@}" -O "'${output}'" "'${url}'"
|
||||
# Replace every '?' with '%3F' in the filename; only for the PRIMARY and BACKUP
|
||||
# mirror
|
||||
[ -n "${encode}" ] && filename=${filename//\?/%3F}
|
||||
|
||||
_wget ${verbose} "${@}" -O "'${output}'" "'${url}/${filename}'"
|
||||
|
||||
@@ -1,60 +1,70 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# ===========================================================================
|
||||
# Kernel configuration targets
|
||||
# These targets are used from top-level makefile
|
||||
|
||||
PHONY += oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config \
|
||||
PHONY += xconfig gconfig menuconfig config syncconfig update-po-config \
|
||||
localmodconfig localyesconfig
|
||||
|
||||
# Easy method for doing a status message
|
||||
kecho := :
|
||||
quiet_kecho := echo
|
||||
silent_kecho := :
|
||||
kecho := $($(quiet)kecho)
|
||||
|
||||
ifdef KBUILD_KCONFIG
|
||||
Kconfig := $(KBUILD_KCONFIG)
|
||||
else
|
||||
Kconfig := Kconfig
|
||||
endif
|
||||
|
||||
ifeq ($(quiet),silent_)
|
||||
silent := -s
|
||||
endif
|
||||
|
||||
# We need this, in case the user has it in its environment
|
||||
unexport CONFIG_
|
||||
|
||||
xconfig: $(obj)/qconf
|
||||
$< $(Kconfig)
|
||||
$< $(silent) $(Kconfig)
|
||||
|
||||
gconfig: $(obj)/gconf
|
||||
$< $(Kconfig)
|
||||
$< $(silent) $(Kconfig)
|
||||
|
||||
menuconfig: $(obj)/mconf
|
||||
$< $(Kconfig)
|
||||
$< $(silent) $(Kconfig)
|
||||
|
||||
config: $(obj)/conf
|
||||
$< --oldaskconfig $(Kconfig)
|
||||
$< $(silent) --oldaskconfig $(Kconfig)
|
||||
|
||||
nconfig: $(obj)/nconf
|
||||
$< $(Kconfig)
|
||||
$< $(silent) $(Kconfig)
|
||||
|
||||
oldconfig: $(obj)/conf
|
||||
$< --$@ $(Kconfig)
|
||||
# This has become an internal implementation detail and is now deprecated
|
||||
# for external use.
|
||||
syncconfig: $(obj)/conf
|
||||
$(Q)mkdir -p include/config include/generated
|
||||
$< $(silent) --$@ $(Kconfig)
|
||||
|
||||
silentoldconfig: $(obj)/conf
|
||||
$(Q)mkdir -p include/generated
|
||||
$< --$@ $(Kconfig)
|
||||
|
||||
localyesconfig localmodconfig: $(obj)/streamline_config.pl $(obj)/conf
|
||||
$(Q)mkdir -p include/generated
|
||||
$(Q)perl $< --$@ $(srctree) $(Kconfig) > .tmp.config
|
||||
localyesconfig localmodconfig: $(obj)/conf
|
||||
$(Q)mkdir -p include/config include/generated
|
||||
$(Q)perl $(srctree)/$(src)/streamline_config.pl --$@ $(srctree) $(Kconfig) > .tmp.config
|
||||
$(Q)if [ -f .config ]; then \
|
||||
cmp -s .tmp.config .config || \
|
||||
(mv -f .config .config.old.1; \
|
||||
mv -f .tmp.config .config; \
|
||||
$(obj)/conf --silentoldconfig $(Kconfig); \
|
||||
$< $(silent) --oldconfig $(Kconfig); \
|
||||
mv -f .config.old.1 .config.old) \
|
||||
else \
|
||||
mv -f .tmp.config .config; \
|
||||
$(obj)/conf --silentoldconfig $(Kconfig); \
|
||||
$< $(silent) --oldconfig $(Kconfig); \
|
||||
fi
|
||||
$(Q)rm -f .tmp.config
|
||||
|
||||
# Create new linux.pot file
|
||||
# Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
|
||||
update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h
|
||||
$(Q)echo " GEN config.pot"
|
||||
$(Q)$(kecho) " GEN config.pot"
|
||||
$(Q)xgettext --default-domain=linux \
|
||||
--add-comments --keyword=_ --keyword=N_ \
|
||||
--from-code=UTF-8 \
|
||||
@@ -65,56 +75,96 @@ update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h
|
||||
$(Q)(for i in `ls $(srctree)/arch/*/Kconfig \
|
||||
$(srctree)/arch/*/um/Kconfig`; \
|
||||
do \
|
||||
echo " GEN $$i"; \
|
||||
$(kecho) " GEN $$i"; \
|
||||
$(obj)/kxgettext $$i \
|
||||
>> $(obj)/config.pot; \
|
||||
done )
|
||||
$(Q)echo " GEN linux.pot"
|
||||
$(Q)$(kecho) " GEN linux.pot"
|
||||
$(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \
|
||||
--output $(obj)/linux.pot
|
||||
$(Q)rm -f $(obj)/config.pot
|
||||
|
||||
PHONY += allnoconfig allyesconfig allmodconfig alldefconfig randconfig
|
||||
# These targets map 1:1 to the commandline options of 'conf'
|
||||
simple-targets := oldconfig allnoconfig allyesconfig allmodconfig \
|
||||
alldefconfig randconfig listnewconfig olddefconfig
|
||||
PHONY += $(simple-targets)
|
||||
|
||||
allnoconfig allyesconfig allmodconfig alldefconfig randconfig: $(obj)/conf
|
||||
$< --$@ $(Kconfig)
|
||||
$(simple-targets): $(obj)/conf
|
||||
$< $(silent) --$@ $(Kconfig)
|
||||
|
||||
PHONY += listnewconfig olddefconfig oldnoconfig savedefconfig defconfig
|
||||
|
||||
listnewconfig olddefconfig: $(obj)/conf
|
||||
$< --$@ $(Kconfig)
|
||||
PHONY += oldnoconfig silentoldconfig savedefconfig defconfig
|
||||
|
||||
# oldnoconfig is an alias of olddefconfig, because people already are dependent
|
||||
# on its behavior(sets new symbols to their default value but not 'n') with the
|
||||
# on its behavior (sets new symbols to their default value but not 'n') with the
|
||||
# counter-intuitive name.
|
||||
oldnoconfig: $(obj)/conf
|
||||
$< --olddefconfig $(Kconfig)
|
||||
oldnoconfig: olddefconfig
|
||||
@echo " WARNING: \"oldnoconfig\" target will be removed after Linux 4.19"
|
||||
@echo " Please use \"olddefconfig\" instead, which is an alias."
|
||||
|
||||
# We do not expect manual invokcation of "silentoldcofig" (or "syncconfig").
|
||||
silentoldconfig: syncconfig
|
||||
@echo " WARNING: \"silentoldconfig\" has been renamed to \"syncconfig\""
|
||||
@echo " and is now an internal implementation detail."
|
||||
@echo " What you want is probably \"oldconfig\"."
|
||||
@echo " \"silentoldconfig\" will be removed after Linux 4.19"
|
||||
|
||||
savedefconfig: $(obj)/conf
|
||||
$< --$@=defconfig $(Kconfig)
|
||||
$< $(silent) --$@=defconfig $(Kconfig)
|
||||
|
||||
defconfig: $(obj)/conf
|
||||
ifeq ($(KBUILD_DEFCONFIG),)
|
||||
$< --defconfig $(Kconfig)
|
||||
$< $(silent) --defconfig $(Kconfig)
|
||||
else
|
||||
@echo "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"
|
||||
$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
|
||||
ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),)
|
||||
@$(kecho) "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"
|
||||
$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
|
||||
else
|
||||
@$(kecho) "*** Default configuration is based on target '$(KBUILD_DEFCONFIG)'"
|
||||
$(Q)$(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG)
|
||||
endif
|
||||
endif
|
||||
|
||||
%_defconfig: $(obj)/conf
|
||||
$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
|
||||
$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
|
||||
|
||||
configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/configs/$@)
|
||||
|
||||
%.config: $(obj)/conf
|
||||
$(if $(call configfiles),, $(error No configuration exists for this target on this architecture))
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles)
|
||||
+$(Q)yes "" | $(MAKE) -f $(srctree)/Makefile oldconfig
|
||||
|
||||
PHONY += kvmconfig
|
||||
kvmconfig: kvm_guest.config
|
||||
@:
|
||||
|
||||
PHONY += xenconfig
|
||||
xenconfig: xen.config
|
||||
@:
|
||||
|
||||
PHONY += tinyconfig
|
||||
tinyconfig:
|
||||
$(Q)$(MAKE) -f $(srctree)/Makefile allnoconfig tiny.config
|
||||
|
||||
# CHECK: -o cache_dir=<path> working?
|
||||
PHONY += testconfig
|
||||
testconfig: $(obj)/conf
|
||||
$(PYTHON3) -B -m pytest $(srctree)/$(src)/tests \
|
||||
-o cache_dir=$(abspath $(obj)/tests/.cache) \
|
||||
$(if $(findstring 1,$(KBUILD_VERBOSE)),--capture=no)
|
||||
clean-dirs += tests/.cache
|
||||
|
||||
# Help text used by make help
|
||||
help:
|
||||
@echo ' config - Update current config utilising a line-oriented program'
|
||||
@echo ' nconfig - Update current config utilising a ncurses menu based program'
|
||||
@echo ' nconfig - Update current config utilising a ncurses menu based'
|
||||
@echo ' program'
|
||||
@echo ' menuconfig - Update current config utilising a menu based program'
|
||||
@echo ' xconfig - Update current config utilising a QT based front-end'
|
||||
@echo ' gconfig - Update current config utilising a GTK based front-end'
|
||||
@echo ' xconfig - Update current config utilising a Qt based front-end'
|
||||
@echo ' gconfig - Update current config utilising a GTK+ based front-end'
|
||||
@echo ' oldconfig - Update current config utilising a provided .config as base'
|
||||
@echo ' localmodconfig - Update current config disabling modules not loaded'
|
||||
@echo ' localyesconfig - Update current config converting local mods to core'
|
||||
@echo ' silentoldconfig - Same as oldconfig, but quietly, additionally update deps'
|
||||
@echo ' defconfig - New config with default from ARCH supplied defconfig'
|
||||
@echo ' savedefconfig - Save current config as ./defconfig (minimal config)'
|
||||
@echo ' allnoconfig - New config where all options are answered with no'
|
||||
@@ -123,7 +173,11 @@ help:
|
||||
@echo ' alldefconfig - New config with all symbols set to default'
|
||||
@echo ' randconfig - New config with random answer to all options'
|
||||
@echo ' listnewconfig - List new options'
|
||||
@echo ' olddefconfig - Same as silentoldconfig but sets new symbols to their default value'
|
||||
@echo ' olddefconfig - Same as oldconfig but sets new symbols to their'
|
||||
@echo ' default value without prompting'
|
||||
@echo ' kvmconfig - Enable additional options for kvm guest kernel support'
|
||||
@echo ' xenconfig - Enable additional options for xen dom0 and guest kernel support'
|
||||
@echo ' tinyconfig - Configure the tiniest possible kernel'
|
||||
|
||||
# lxdialog stuff
|
||||
check-lxdialog := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
|
||||
@@ -141,9 +195,9 @@ HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags) \
|
||||
# mconf: Used for the menuconfig target
|
||||
# Utilizes the lxdialog package
|
||||
# qconf: Used for the xconfig target
|
||||
# Based on QT which needs to be installed to compile it
|
||||
# Based on Qt which needs to be installed to compile it
|
||||
# gconf: Used for the gconfig target
|
||||
# Based on GTK which needs to be installed to compile it
|
||||
# Based on GTK+ which needs to be installed to compile it
|
||||
# object files used by all kconfig flavours
|
||||
|
||||
lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
|
||||
@@ -174,11 +228,11 @@ endif
|
||||
ifeq ($(MAKECMDGOALS),qconf)
|
||||
qconf-target := 1
|
||||
endif
|
||||
|
||||
ifeq ($(MAKECMDGOALS),gconf)
|
||||
gconf-target := 1
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(qconf-target),1)
|
||||
hostprogs-y += qconf
|
||||
endif
|
||||
@@ -187,14 +241,14 @@ ifeq ($(gconf-target),1)
|
||||
hostprogs-y += gconf
|
||||
endif
|
||||
|
||||
targets += zconf.lex.c
|
||||
clean-files := qconf.moc .tmp_qtcheck .tmp_gtkcheck
|
||||
clean-files += zconf.tab.c zconf.lex.c zconf.hash.c gconf.glade.h
|
||||
clean-files += mconf qconf gconf nconf
|
||||
clean-files += gconf.glade.h
|
||||
clean-files += config.pot linux.pot
|
||||
|
||||
# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
|
||||
PHONY += $(obj)/dochecklxdialog
|
||||
$(addprefix $(obj)/,$(lxdialog)): $(obj)/dochecklxdialog
|
||||
$(addprefix $(obj)/, mconf.o $(lxdialog)): $(obj)/dochecklxdialog
|
||||
$(obj)/dochecklxdialog:
|
||||
$(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTLOADLIBES_mconf)
|
||||
|
||||
@@ -202,14 +256,12 @@ always := dochecklxdialog
|
||||
|
||||
# Add environment specific flags
|
||||
HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) $(HOSTCFLAGS))
|
||||
HOST_EXTRACXXFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCXX) $(HOSTCXXFLAGS))
|
||||
|
||||
# generated files seem to need this to find local include files
|
||||
HOSTCFLAGS_zconf.lex.o := -I$(src)
|
||||
HOSTCFLAGS_zconf.tab.o := -I$(src)
|
||||
|
||||
LEX_PREFIX_zconf := zconf
|
||||
YACC_PREFIX_zconf := zconf
|
||||
|
||||
HOSTLOADLIBES_qconf = $(KC_QT_LIBS)
|
||||
HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS)
|
||||
|
||||
@@ -225,67 +277,38 @@ HOSTLOADLIBES_nconf = $(shell \
|
||||
|| echo "-lmenu -lpanel -lncurses" )
|
||||
$(obj)/qconf.o: $(obj)/.tmp_qtcheck
|
||||
|
||||
ifeq ($(qconf-target),1)
|
||||
ifeq ($(MAKECMDGOALS),qconf)
|
||||
$(obj)/.tmp_qtcheck: $(src)/Makefile
|
||||
-include $(obj)/.tmp_qtcheck
|
||||
|
||||
# QT needs some extra effort...
|
||||
# Qt needs some extra effort...
|
||||
$(obj)/.tmp_qtcheck:
|
||||
@set -e; echo " CHECK qt"; dir=""; pkg=""; \
|
||||
if ! pkg-config --exists QtCore 2> /dev/null; then \
|
||||
echo "* Unable to find the QT4 tool qmake. Trying to use QT3"; \
|
||||
pkg-config --exists qt 2> /dev/null && pkg=qt; \
|
||||
pkg-config --exists qt-mt 2> /dev/null && pkg=qt-mt; \
|
||||
if [ -n "$$pkg" ]; then \
|
||||
cflags="\$$(shell pkg-config $$pkg --cflags)"; \
|
||||
libs="\$$(shell pkg-config $$pkg --libs)"; \
|
||||
moc="\$$(shell pkg-config $$pkg --variable=prefix)/bin/moc"; \
|
||||
dir="$$(pkg-config $$pkg --variable=prefix)"; \
|
||||
else \
|
||||
for d in $$QTDIR /usr/share/qt* /usr/lib/qt*; do \
|
||||
if [ -f $$d/include/qconfig.h ]; then dir=$$d; break; fi; \
|
||||
done; \
|
||||
if [ -z "$$dir" ]; then \
|
||||
echo >&2 "*"; \
|
||||
echo >&2 "* Unable to find any QT installation. Please make sure that"; \
|
||||
echo >&2 "* the QT4 or QT3 development package is correctly installed and"; \
|
||||
echo >&2 "* either qmake can be found or install pkg-config or set"; \
|
||||
echo >&2 "* the QTDIR environment variable to the correct location."; \
|
||||
echo >&2 "*"; \
|
||||
false; \
|
||||
fi; \
|
||||
libpath=$$dir/lib; lib=qt; osdir=""; \
|
||||
$(HOSTCXX) -print-multi-os-directory > /dev/null 2>&1 && \
|
||||
osdir=x$$($(HOSTCXX) -print-multi-os-directory); \
|
||||
test -d $$libpath/$$osdir && libpath=$$libpath/$$osdir; \
|
||||
test -f $$libpath/libqt-mt.so && lib=qt-mt; \
|
||||
cflags="-I$$dir/include"; \
|
||||
libs="-L$$libpath -Wl,-rpath,$$libpath -l$$lib"; \
|
||||
moc="$$dir/bin/moc"; \
|
||||
fi; \
|
||||
if [ ! -x $$dir/bin/moc -a -x /usr/bin/moc ]; then \
|
||||
echo "*"; \
|
||||
echo "* Unable to find $$dir/bin/moc, using /usr/bin/moc instead."; \
|
||||
echo "*"; \
|
||||
moc="/usr/bin/moc"; \
|
||||
fi; \
|
||||
@set -e; $(kecho) " CHECK qt"; \
|
||||
if pkg-config --exists Qt5Core; then \
|
||||
cflags="-std=c++11 -fPIC `pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets`"; \
|
||||
libs=`pkg-config --libs Qt5Core Qt5Gui Qt5Widgets`; \
|
||||
moc=`pkg-config --variable=host_bins Qt5Core`/moc; \
|
||||
elif pkg-config --exists QtCore; then \
|
||||
cflags=`pkg-config --cflags QtCore QtGui`; \
|
||||
libs=`pkg-config --libs QtCore QtGui`; \
|
||||
moc=`pkg-config --variable=moc_location QtCore`; \
|
||||
else \
|
||||
cflags="\$$(shell pkg-config QtCore QtGui Qt3Support --cflags)"; \
|
||||
libs="\$$(shell pkg-config QtCore QtGui Qt3Support --libs)"; \
|
||||
moc="\$$(shell pkg-config QtCore --variable=moc_location)"; \
|
||||
[ -n "$$moc" ] || moc="\$$(shell pkg-config QtCore --variable=prefix)/bin/moc"; \
|
||||
echo >&2 "*"; \
|
||||
echo >&2 "* Could not find Qt via pkg-config."; \
|
||||
echo >&2 "* Please install either Qt 4.8 or 5.x. and make sure it's in PKG_CONFIG_PATH"; \
|
||||
echo >&2 "*"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo "KC_QT_CFLAGS=$$cflags" > $@; \
|
||||
echo "KC_QT_LIBS=$$libs" >> $@; \
|
||||
echo "KC_QT_MOC=$$moc" >> $@
|
||||
endif
|
||||
|
||||
ifeq ($(MAKECMDGOALS),gconf)
|
||||
$(obj)/gconf.o: $(obj)/.tmp_gtkcheck
|
||||
|
||||
ifeq ($(gconf-target),1)
|
||||
-include $(obj)/.tmp_gtkcheck
|
||||
|
||||
# GTK needs some extra effort, too...
|
||||
# GTK+ needs some extra effort, too...
|
||||
$(obj)/.tmp_gtkcheck:
|
||||
@if `pkg-config --exists gtk+-2.0 gmodule-2.0 libglade-2.0`; then \
|
||||
if `pkg-config --atleast-version=2.0.0 gtk+-2.0`; then \
|
||||
@@ -306,15 +329,14 @@ $(obj)/.tmp_gtkcheck:
|
||||
fi
|
||||
endif
|
||||
|
||||
$(obj)/zconf.tab.o: $(obj)/zconf.lex.c $(obj)/zconf.hash.c
|
||||
$(obj)/zconf.tab.o: $(obj)/zconf.lex.c
|
||||
|
||||
$(obj)/qconf.o: $(obj)/qconf.moc
|
||||
|
||||
$(obj)/%.moc: $(src)/%.h $(obj)/.tmp_qtcheck
|
||||
$(KC_QT_MOC) -i $< -o $@
|
||||
|
||||
# Extract gconf menu items for I18N support
|
||||
# Extract gconf menu items for i18n support
|
||||
$(obj)/gconf.glade.h: $(obj)/gconf.glade
|
||||
$(Q)intltool-extract --type=gettext/glade --srcdir=$(srctree) \
|
||||
$(obj)/gconf.glade
|
||||
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
This is a copy of the kconfig code in the kernel (currently 3.13-rc5) tweaked
|
||||
This is a copy of the kconfig code in the kernel (currently 4.17-rc2) tweaked
|
||||
to suit Buildroot.
|
||||
|
||||
To update:
|
||||
cp -r /usr/src/linux/scripts/kconfig support/kconfig.new
|
||||
cd support/kconfig.new
|
||||
# zconf.lex.c and zconf.tab.c needs to be generated by 'make menuconfig'
|
||||
mv zconf.lex.c zconf.lex.c_shipped
|
||||
mv zconf.tab.c zconf.tab.c_shipped
|
||||
rm -rf tests/
|
||||
cp -a ../kconfig/patches ../kconfig/README.buildroot ../kconfig/.gitignore .
|
||||
quilt push -a
|
||||
# Fix any conflict
|
||||
@@ -15,6 +19,7 @@ Then verify the toplevel targets work:
|
||||
config
|
||||
defconfig
|
||||
menuconfig
|
||||
nconfig
|
||||
xconfig
|
||||
gconfig
|
||||
oldconfig
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Needed for systems without gettext
|
||||
$* -x c -o /dev/null - > /dev/null 2>&1 << EOF
|
||||
#include <libintl.h>
|
||||
@@ -11,4 +12,3 @@ EOF
|
||||
if [ ! "$?" -eq "0" ]; then
|
||||
echo -DKBUILD_NO_NLS;
|
||||
fi
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include <locale.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -19,11 +20,10 @@
|
||||
|
||||
static void conf(struct menu *menu);
|
||||
static void check_conf(struct menu *menu);
|
||||
static void xfgets(char *str, int size, FILE *in);
|
||||
|
||||
enum input_mode {
|
||||
oldaskconfig,
|
||||
silentoldconfig,
|
||||
syncconfig,
|
||||
oldconfig,
|
||||
allnoconfig,
|
||||
allyesconfig,
|
||||
@@ -34,14 +34,14 @@ enum input_mode {
|
||||
savedefconfig,
|
||||
listnewconfig,
|
||||
olddefconfig,
|
||||
} input_mode = oldaskconfig;
|
||||
};
|
||||
static enum input_mode input_mode = oldaskconfig;
|
||||
|
||||
static int indent = 1;
|
||||
static int tty_stdio;
|
||||
static int valid_stdin = 1;
|
||||
static int sync_kconfig;
|
||||
static int conf_cnt;
|
||||
static char line[128];
|
||||
static char line[PATH_MAX];
|
||||
static struct menu *rootEntry;
|
||||
|
||||
static void print_help(struct menu *menu)
|
||||
@@ -71,14 +71,14 @@ static void strip(char *str)
|
||||
*p-- = 0;
|
||||
}
|
||||
|
||||
static void check_stdin(void)
|
||||
/* Helper function to facilitate fgets() by Jean Sacren. */
|
||||
static void xfgets(char *str, int size, FILE *in)
|
||||
{
|
||||
if (!valid_stdin) {
|
||||
printf(_("aborted!\n\n"));
|
||||
printf(_("Console input/output is redirected. "));
|
||||
printf(_("Run 'make oldconfig' to update configuration.\n\n"));
|
||||
exit(1);
|
||||
}
|
||||
if (!fgets(str, size, in))
|
||||
fprintf(stderr, "\nError in reading or end of file.\n");
|
||||
|
||||
if (!tty_stdio)
|
||||
printf("%s", str);
|
||||
}
|
||||
|
||||
static int conf_askvalue(struct symbol *sym, const char *def)
|
||||
@@ -100,18 +100,15 @@ static int conf_askvalue(struct symbol *sym, const char *def)
|
||||
|
||||
switch (input_mode) {
|
||||
case oldconfig:
|
||||
case silentoldconfig:
|
||||
case syncconfig:
|
||||
if (sym_has_value(sym)) {
|
||||
printf("%s\n", def);
|
||||
return 0;
|
||||
}
|
||||
check_stdin();
|
||||
/* fall through */
|
||||
case oldaskconfig:
|
||||
fflush(stdout);
|
||||
xfgets(line, 128, stdin);
|
||||
if (!tty_stdio)
|
||||
printf("\n");
|
||||
xfgets(line, sizeof(line), stdin);
|
||||
return 1;
|
||||
default:
|
||||
break;
|
||||
@@ -191,9 +188,7 @@ static int conf_sym(struct menu *menu)
|
||||
printf("/m");
|
||||
if (oldval != yes && sym_tristate_within_range(sym, yes))
|
||||
printf("/y");
|
||||
if (menu_has_help(menu))
|
||||
printf("/?");
|
||||
printf("] ");
|
||||
printf("/?] ");
|
||||
if (!conf_askvalue(sym, sym_get_string_value(sym)))
|
||||
return 0;
|
||||
strip(line);
|
||||
@@ -295,23 +290,19 @@ static int conf_choice(struct menu *menu)
|
||||
printf("[1]: 1\n");
|
||||
goto conf_childs;
|
||||
}
|
||||
printf("[1-%d", cnt);
|
||||
if (menu_has_help(menu))
|
||||
printf("?");
|
||||
printf("]: ");
|
||||
printf("[1-%d?]: ", cnt);
|
||||
switch (input_mode) {
|
||||
case oldconfig:
|
||||
case silentoldconfig:
|
||||
case syncconfig:
|
||||
if (!is_new) {
|
||||
cnt = def;
|
||||
printf("%d\n", cnt);
|
||||
break;
|
||||
}
|
||||
check_stdin();
|
||||
/* fall through */
|
||||
case oldaskconfig:
|
||||
fflush(stdout);
|
||||
xfgets(line, 128, stdin);
|
||||
xfgets(line, sizeof(line), stdin);
|
||||
strip(line);
|
||||
if (line[0] == '?') {
|
||||
print_help(menu);
|
||||
@@ -367,10 +358,11 @@ static void conf(struct menu *menu)
|
||||
|
||||
switch (prop->type) {
|
||||
case P_MENU:
|
||||
if ((input_mode == silentoldconfig ||
|
||||
input_mode == listnewconfig ||
|
||||
input_mode == olddefconfig) &&
|
||||
rootEntry != menu) {
|
||||
/*
|
||||
* Except in oldaskconfig mode, we show only menus that
|
||||
* contain new symbols.
|
||||
*/
|
||||
if (input_mode != oldaskconfig && rootEntry != menu) {
|
||||
check_conf(menu);
|
||||
return;
|
||||
}
|
||||
@@ -430,10 +422,20 @@ static void check_conf(struct menu *menu)
|
||||
if (sym_is_changable(sym) ||
|
||||
(sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
|
||||
if (input_mode == listnewconfig) {
|
||||
if (sym->name && !sym_is_choice_value(sym)) {
|
||||
printf("%s%s\n", CONFIG_, sym->name);
|
||||
if (sym->name) {
|
||||
const char *str;
|
||||
|
||||
if (sym->type == S_STRING) {
|
||||
str = sym_get_string_value(sym);
|
||||
str = sym_escape_string_value(str);
|
||||
printf("%s%s=%s\n", CONFIG_, sym->name, str);
|
||||
free((void *)str);
|
||||
} else {
|
||||
str = sym_get_string_value(sym);
|
||||
printf("%s%s=%s\n", CONFIG_, sym->name, str);
|
||||
}
|
||||
}
|
||||
} else if (input_mode != olddefconfig) {
|
||||
} else {
|
||||
if (!conf_cnt++)
|
||||
printf(_("*\n* Restart config...\n*\n"));
|
||||
rootEntry = menu_get_parent_menu(menu);
|
||||
@@ -449,7 +451,7 @@ static void check_conf(struct menu *menu)
|
||||
static struct option long_opts[] = {
|
||||
{"oldaskconfig", no_argument, NULL, oldaskconfig},
|
||||
{"oldconfig", no_argument, NULL, oldconfig},
|
||||
{"silentoldconfig", no_argument, NULL, silentoldconfig},
|
||||
{"syncconfig", no_argument, NULL, syncconfig},
|
||||
{"defconfig", optional_argument, NULL, defconfig},
|
||||
{"savedefconfig", required_argument, NULL, savedefconfig},
|
||||
{"allnoconfig", no_argument, NULL, allnoconfig},
|
||||
@@ -471,13 +473,14 @@ static struct option long_opts[] = {
|
||||
static void conf_usage(const char *progname)
|
||||
{
|
||||
|
||||
printf("Usage: %s [option] <kconfig-file>\n", progname);
|
||||
printf("Usage: %s [-s] [option] <kconfig-file>\n", progname);
|
||||
printf("[option] is _one_ of the following:\n");
|
||||
printf(" --listnewconfig List new options\n");
|
||||
printf(" --oldaskconfig Start a new configuration using a line-oriented program\n");
|
||||
printf(" --oldconfig Update a configuration using a provided .config as base\n");
|
||||
printf(" --silentoldconfig Same as oldconfig, but quietly, additionally update deps\n");
|
||||
printf(" --olddefconfig Same as silentoldconfig but sets new symbols to their default value\n");
|
||||
printf(" --syncconfig Similar to oldconfig but generates configuration in\n"
|
||||
" include/{generated/,config/}\n");
|
||||
printf(" --olddefconfig Same as oldconfig but sets new symbols to their default value\n");
|
||||
printf(" --oldnoconfig An alias of olddefconfig\n");
|
||||
printf(" --defconfig <file> New config with default defined in <file>\n");
|
||||
printf(" --savedefconfig <file> Save the minimal current configuration to <file>\n");
|
||||
@@ -499,12 +502,16 @@ int main(int ac, char **av)
|
||||
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||
textdomain(PACKAGE);
|
||||
|
||||
tty_stdio = isatty(0) && isatty(1) && isatty(2);
|
||||
tty_stdio = isatty(0) && isatty(1);
|
||||
|
||||
while ((opt = getopt_long(ac, av, "", long_opts, NULL)) != -1) {
|
||||
while ((opt = getopt_long(ac, av, "s", long_opts, NULL)) != -1) {
|
||||
if (opt == 's') {
|
||||
conf_set_message_callback(NULL);
|
||||
continue;
|
||||
}
|
||||
input_mode = (enum input_mode)opt;
|
||||
switch (opt) {
|
||||
case silentoldconfig:
|
||||
case syncconfig:
|
||||
sync_kconfig = 1;
|
||||
break;
|
||||
case defconfig:
|
||||
@@ -552,7 +559,7 @@ int main(int ac, char **av)
|
||||
}
|
||||
}
|
||||
if (ac == optind) {
|
||||
printf(_("%s: Kconfig file missing\n"), av[0]);
|
||||
fprintf(stderr, _("%s: Kconfig file missing\n"), av[0]);
|
||||
conf_usage(progname);
|
||||
exit(1);
|
||||
}
|
||||
@@ -576,14 +583,16 @@ int main(int ac, char **av)
|
||||
if (!defconfig_file)
|
||||
defconfig_file = conf_get_default_confname();
|
||||
if (conf_read(defconfig_file)) {
|
||||
printf(_("***\n"
|
||||
"*** Can't find default configuration \"%s\"!\n"
|
||||
"***\n"), defconfig_file);
|
||||
fprintf(stderr,
|
||||
_("***\n"
|
||||
"*** Can't find default configuration \"%s\"!\n"
|
||||
"***\n"),
|
||||
defconfig_file);
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
case savedefconfig:
|
||||
case silentoldconfig:
|
||||
case syncconfig:
|
||||
case oldaskconfig:
|
||||
case oldconfig:
|
||||
case listnewconfig:
|
||||
@@ -636,7 +645,6 @@ int main(int ac, char **av)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
valid_stdin = tty_stdio;
|
||||
}
|
||||
|
||||
switch (input_mode) {
|
||||
@@ -664,24 +672,24 @@ int main(int ac, char **av)
|
||||
case oldaskconfig:
|
||||
rootEntry = &rootmenu;
|
||||
conf(&rootmenu);
|
||||
input_mode = silentoldconfig;
|
||||
input_mode = oldconfig;
|
||||
/* fall through */
|
||||
case oldconfig:
|
||||
case listnewconfig:
|
||||
case olddefconfig:
|
||||
case silentoldconfig:
|
||||
case syncconfig:
|
||||
/* Update until a loop caused no more changes */
|
||||
do {
|
||||
conf_cnt = 0;
|
||||
check_conf(&rootmenu);
|
||||
} while (conf_cnt &&
|
||||
(input_mode != listnewconfig &&
|
||||
input_mode != olddefconfig));
|
||||
} while (conf_cnt);
|
||||
break;
|
||||
case olddefconfig:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (sync_kconfig) {
|
||||
/* silentoldconfig is used during the build so we shall update autoconf.
|
||||
/* syncconfig is used during the build so we shall update autoconf.
|
||||
* All other commands are only used to generate a config.
|
||||
*/
|
||||
if (conf_get_changed() && conf_write(NULL)) {
|
||||
@@ -695,7 +703,7 @@ int main(int ac, char **av)
|
||||
} else if (input_mode == savedefconfig) {
|
||||
if (conf_write_defconfig(defconfig_file)) {
|
||||
fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"),
|
||||
defconfig_file);
|
||||
defconfig_file);
|
||||
return 1;
|
||||
}
|
||||
} else if (input_mode != listnewconfig) {
|
||||
@@ -706,12 +714,3 @@ int main(int ac, char **av)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function to facilitate fgets() by Jean Sacren.
|
||||
*/
|
||||
void xfgets(char *str, int size, FILE *in)
|
||||
{
|
||||
if (fgets(str, size, in) == NULL)
|
||||
fprintf(stderr, "\nError in reading or end of file.\n");
|
||||
}
|
||||
|
||||
@@ -17,6 +17,11 @@
|
||||
|
||||
#include "lkc.h"
|
||||
|
||||
struct conf_printer {
|
||||
void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
|
||||
void (*print_comment)(FILE *, const char *, void *);
|
||||
};
|
||||
|
||||
static void conf_warning(const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 1, 2)));
|
||||
|
||||
@@ -24,7 +29,7 @@ static void conf_message(const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 1, 2)));
|
||||
|
||||
static const char *conf_filename;
|
||||
static int conf_lineno, conf_warnings, conf_unsaved;
|
||||
static int conf_lineno, conf_warnings;
|
||||
|
||||
const char conf_defname[] = ".defconfig";
|
||||
|
||||
@@ -60,6 +65,7 @@ static void conf_message(const char *fmt, ...)
|
||||
va_start(ap, fmt);
|
||||
if (conf_message_callback)
|
||||
conf_message_callback(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
const char *conf_get_configname(void)
|
||||
@@ -171,7 +177,7 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
|
||||
case S_HEX:
|
||||
done:
|
||||
if (sym_string_valid(sym, p)) {
|
||||
sym->def[def].val = strdup(p);
|
||||
sym->def[def].val = xstrdup(p);
|
||||
sym->flags |= def_flags;
|
||||
} else {
|
||||
if (def != S_DEF_AUTO)
|
||||
@@ -194,7 +200,7 @@ static int add_byte(int c, char **lineptr, size_t slen, size_t *n)
|
||||
if (new_size > *n) {
|
||||
new_size += LINE_GROWTH - 1;
|
||||
new_size *= 2;
|
||||
nline = realloc(*lineptr, new_size);
|
||||
nline = xrealloc(*lineptr, new_size);
|
||||
if (!nline)
|
||||
return -1;
|
||||
|
||||
@@ -260,11 +266,8 @@ int conf_read_simple(const char *name, int def)
|
||||
if (in)
|
||||
goto load;
|
||||
sym_add_change_count(1);
|
||||
if (!sym_defconfig_list) {
|
||||
if (modules_sym)
|
||||
sym_calc_value(modules_sym);
|
||||
if (!sym_defconfig_list)
|
||||
return 1;
|
||||
}
|
||||
|
||||
for_all_defaults(sym_defconfig_list, prop) {
|
||||
if (expr_calc_value(prop->visible.expr) == no ||
|
||||
@@ -286,7 +289,6 @@ load:
|
||||
conf_filename = name;
|
||||
conf_lineno = 0;
|
||||
conf_warnings = 0;
|
||||
conf_unsaved = 0;
|
||||
|
||||
def_flags = SYMBOL_DEF << def;
|
||||
for_all_symbols(i, sym) {
|
||||
@@ -371,7 +373,9 @@ load:
|
||||
continue;
|
||||
} else {
|
||||
if (line[0] != '\r' && line[0] != '\n')
|
||||
conf_warning("unexpected data");
|
||||
conf_warning("unexpected data: %.*s",
|
||||
(int)strcspn(line, "\r\n"), line);
|
||||
|
||||
continue;
|
||||
}
|
||||
setsym:
|
||||
@@ -397,21 +401,23 @@ setsym:
|
||||
}
|
||||
free(line);
|
||||
fclose(in);
|
||||
|
||||
if (modules_sym)
|
||||
sym_calc_value(modules_sym);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int conf_read(const char *name)
|
||||
{
|
||||
struct symbol *sym;
|
||||
int conf_unsaved = 0;
|
||||
int i;
|
||||
|
||||
sym_set_change_count(0);
|
||||
|
||||
if (conf_read_simple(name, S_DEF_USER))
|
||||
if (conf_read_simple(name, S_DEF_USER)) {
|
||||
sym_calc_value(modules_sym);
|
||||
return 1;
|
||||
}
|
||||
|
||||
sym_calc_value(modules_sym);
|
||||
|
||||
for_all_symbols(i, sym) {
|
||||
sym_calc_value(sym);
|
||||
@@ -846,6 +852,7 @@ static int conf_split_config(void)
|
||||
|
||||
name = conf_get_autoconfig_name();
|
||||
conf_read_simple(name, S_DEF_AUTO);
|
||||
sym_calc_value(modules_sym);
|
||||
|
||||
opwd = malloc(256);
|
||||
_name = strdup(name);
|
||||
@@ -1149,7 +1156,7 @@ void set_all_choice_values(struct symbol *csym)
|
||||
bool conf_set_all_new_symbols(enum conf_def_mode mode)
|
||||
{
|
||||
struct symbol *sym, *csym;
|
||||
int i, cnt, pby, pty, ptm; /* pby: probability of boolean = y
|
||||
int i, cnt, pby, pty, ptm; /* pby: probability of bool = y
|
||||
* pty: probability of tristate = y
|
||||
* ptm: probability of tristate = m
|
||||
*/
|
||||
@@ -1211,7 +1218,10 @@ bool conf_set_all_new_symbols(enum conf_def_mode mode)
|
||||
sym->def[S_DEF_USER].tri = mod;
|
||||
break;
|
||||
case def_no:
|
||||
sym->def[S_DEF_USER].tri = no;
|
||||
if (sym->flags & SYMBOL_ALLNOCONFIG_Y)
|
||||
sym->def[S_DEF_USER].tri = yes;
|
||||
else
|
||||
sym->def[S_DEF_USER].tri = no;
|
||||
break;
|
||||
case def_random:
|
||||
sym->def[S_DEF_USER].tri = no;
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
|
||||
#define DEBUG_EXPR 0
|
||||
|
||||
static int expr_eq(struct expr *e1, struct expr *e2);
|
||||
static struct expr *expr_eliminate_yn(struct expr *e);
|
||||
|
||||
struct expr *expr_alloc_symbol(struct symbol *sym)
|
||||
{
|
||||
struct expr *e = xcalloc(1, sizeof(*e));
|
||||
@@ -76,6 +79,10 @@ struct expr *expr_copy(const struct expr *org)
|
||||
e->left.expr = expr_copy(org->left.expr);
|
||||
break;
|
||||
case E_EQUAL:
|
||||
case E_GEQ:
|
||||
case E_GTH:
|
||||
case E_LEQ:
|
||||
case E_LTH:
|
||||
case E_UNEQUAL:
|
||||
e->left.sym = org->left.sym;
|
||||
e->right.sym = org->right.sym;
|
||||
@@ -87,7 +94,7 @@ struct expr *expr_copy(const struct expr *org)
|
||||
e->right.expr = expr_copy(org->right.expr);
|
||||
break;
|
||||
default:
|
||||
printf("can't copy type %d\n", e->type);
|
||||
fprintf(stderr, "can't copy type %d\n", e->type);
|
||||
free(e);
|
||||
e = NULL;
|
||||
break;
|
||||
@@ -106,8 +113,12 @@ void expr_free(struct expr *e)
|
||||
break;
|
||||
case E_NOT:
|
||||
expr_free(e->left.expr);
|
||||
return;
|
||||
break;
|
||||
case E_EQUAL:
|
||||
case E_GEQ:
|
||||
case E_GTH:
|
||||
case E_LEQ:
|
||||
case E_LTH:
|
||||
case E_UNEQUAL:
|
||||
break;
|
||||
case E_OR:
|
||||
@@ -116,7 +127,7 @@ void expr_free(struct expr *e)
|
||||
expr_free(e->right.expr);
|
||||
break;
|
||||
default:
|
||||
printf("how to free type %d?\n", e->type);
|
||||
fprintf(stderr, "how to free type %d?\n", e->type);
|
||||
break;
|
||||
}
|
||||
free(e);
|
||||
@@ -127,8 +138,18 @@ static int trans_count;
|
||||
#define e1 (*ep1)
|
||||
#define e2 (*ep2)
|
||||
|
||||
/*
|
||||
* expr_eliminate_eq() helper.
|
||||
*
|
||||
* Walks the two expression trees given in 'ep1' and 'ep2'. Any node that does
|
||||
* not have type 'type' (E_OR/E_AND) is considered a leaf, and is compared
|
||||
* against all other leaves. Two equal leaves are both replaced with either 'y'
|
||||
* or 'n' as appropriate for 'type', to be eliminated later.
|
||||
*/
|
||||
static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2)
|
||||
{
|
||||
/* Recurse down to leaves */
|
||||
|
||||
if (e1->type == type) {
|
||||
__expr_eliminate_eq(type, &e1->left.expr, &e2);
|
||||
__expr_eliminate_eq(type, &e1->right.expr, &e2);
|
||||
@@ -139,12 +160,18 @@ static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct e
|
||||
__expr_eliminate_eq(type, &e1, &e2->right.expr);
|
||||
return;
|
||||
}
|
||||
|
||||
/* e1 and e2 are leaves. Compare them. */
|
||||
|
||||
if (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
|
||||
e1->left.sym == e2->left.sym &&
|
||||
(e1->left.sym == &symbol_yes || e1->left.sym == &symbol_no))
|
||||
return;
|
||||
if (!expr_eq(e1, e2))
|
||||
return;
|
||||
|
||||
/* e1 and e2 are equal leaves. Prepare them for elimination. */
|
||||
|
||||
trans_count++;
|
||||
expr_free(e1); expr_free(e2);
|
||||
switch (type) {
|
||||
@@ -161,6 +188,35 @@ static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct e
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Rewrites the expressions 'ep1' and 'ep2' to remove operands common to both.
|
||||
* Example reductions:
|
||||
*
|
||||
* ep1: A && B -> ep1: y
|
||||
* ep2: A && B && C -> ep2: C
|
||||
*
|
||||
* ep1: A || B -> ep1: n
|
||||
* ep2: A || B || C -> ep2: C
|
||||
*
|
||||
* ep1: A && (B && FOO) -> ep1: FOO
|
||||
* ep2: (BAR && B) && A -> ep2: BAR
|
||||
*
|
||||
* ep1: A && (B || C) -> ep1: y
|
||||
* ep2: (C || B) && A -> ep2: y
|
||||
*
|
||||
* Comparisons are done between all operands at the same "level" of && or ||.
|
||||
* For example, in the expression 'e1 && (e2 || e3) && (e4 || e5)', the
|
||||
* following operands will be compared:
|
||||
*
|
||||
* - 'e1', 'e2 || e3', and 'e4 || e5', against each other
|
||||
* - e2 against e3
|
||||
* - e4 against e5
|
||||
*
|
||||
* Parentheses are irrelevant within a single level. 'e1 && (e2 && e3)' and
|
||||
* '(e1 && e2) && e3' are both a single level.
|
||||
*
|
||||
* See __expr_eliminate_eq() as well.
|
||||
*/
|
||||
void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
|
||||
{
|
||||
if (!e1 || !e2)
|
||||
@@ -186,7 +242,13 @@ void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
|
||||
#undef e1
|
||||
#undef e2
|
||||
|
||||
int expr_eq(struct expr *e1, struct expr *e2)
|
||||
/*
|
||||
* Returns true if 'e1' and 'e2' are equal, after minor simplification. Two
|
||||
* &&/|| expressions are considered equal if every operand in one expression
|
||||
* equals some operand in the other (operands do not need to appear in the same
|
||||
* order), recursively.
|
||||
*/
|
||||
static int expr_eq(struct expr *e1, struct expr *e2)
|
||||
{
|
||||
int res, old_count;
|
||||
|
||||
@@ -194,6 +256,10 @@ int expr_eq(struct expr *e1, struct expr *e2)
|
||||
return 0;
|
||||
switch (e1->type) {
|
||||
case E_EQUAL:
|
||||
case E_GEQ:
|
||||
case E_GTH:
|
||||
case E_LEQ:
|
||||
case E_LTH:
|
||||
case E_UNEQUAL:
|
||||
return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym;
|
||||
case E_SYMBOL:
|
||||
@@ -228,7 +294,18 @@ int expr_eq(struct expr *e1, struct expr *e2)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct expr *expr_eliminate_yn(struct expr *e)
|
||||
/*
|
||||
* Recursively performs the following simplifications in-place (as well as the
|
||||
* corresponding simplifications with swapped operands):
|
||||
*
|
||||
* expr && n -> n
|
||||
* expr && y -> expr
|
||||
* expr || n -> expr
|
||||
* expr || y -> y
|
||||
*
|
||||
* Returns the optimized expression.
|
||||
*/
|
||||
static struct expr *expr_eliminate_yn(struct expr *e)
|
||||
{
|
||||
struct expr *tmp;
|
||||
|
||||
@@ -501,12 +578,21 @@ static struct expr *expr_join_and(struct expr *e1, struct expr *e2)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* expr_eliminate_dups() helper.
|
||||
*
|
||||
* Walks the two expression trees given in 'ep1' and 'ep2'. Any node that does
|
||||
* not have type 'type' (E_OR/E_AND) is considered a leaf, and is compared
|
||||
* against all other leaves to look for simplifications.
|
||||
*/
|
||||
static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2)
|
||||
{
|
||||
#define e1 (*ep1)
|
||||
#define e2 (*ep2)
|
||||
struct expr *tmp;
|
||||
|
||||
/* Recurse down to leaves */
|
||||
|
||||
if (e1->type == type) {
|
||||
expr_eliminate_dups1(type, &e1->left.expr, &e2);
|
||||
expr_eliminate_dups1(type, &e1->right.expr, &e2);
|
||||
@@ -517,6 +603,9 @@ static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct
|
||||
expr_eliminate_dups1(type, &e1, &e2->right.expr);
|
||||
return;
|
||||
}
|
||||
|
||||
/* e1 and e2 are leaves. Compare and process them. */
|
||||
|
||||
if (e1 == e2)
|
||||
return;
|
||||
|
||||
@@ -553,62 +642,17 @@ static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct
|
||||
#undef e2
|
||||
}
|
||||
|
||||
static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2)
|
||||
{
|
||||
#define e1 (*ep1)
|
||||
#define e2 (*ep2)
|
||||
struct expr *tmp, *tmp1, *tmp2;
|
||||
|
||||
if (e1->type == type) {
|
||||
expr_eliminate_dups2(type, &e1->left.expr, &e2);
|
||||
expr_eliminate_dups2(type, &e1->right.expr, &e2);
|
||||
return;
|
||||
}
|
||||
if (e2->type == type) {
|
||||
expr_eliminate_dups2(type, &e1, &e2->left.expr);
|
||||
expr_eliminate_dups2(type, &e1, &e2->right.expr);
|
||||
}
|
||||
if (e1 == e2)
|
||||
return;
|
||||
|
||||
switch (e1->type) {
|
||||
case E_OR:
|
||||
expr_eliminate_dups2(e1->type, &e1, &e1);
|
||||
// (FOO || BAR) && (!FOO && !BAR) -> n
|
||||
tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
|
||||
tmp2 = expr_copy(e2);
|
||||
tmp = expr_extract_eq_and(&tmp1, &tmp2);
|
||||
if (expr_is_yes(tmp1)) {
|
||||
expr_free(e1);
|
||||
e1 = expr_alloc_symbol(&symbol_no);
|
||||
trans_count++;
|
||||
}
|
||||
expr_free(tmp2);
|
||||
expr_free(tmp1);
|
||||
expr_free(tmp);
|
||||
break;
|
||||
case E_AND:
|
||||
expr_eliminate_dups2(e1->type, &e1, &e1);
|
||||
// (FOO && BAR) || (!FOO || !BAR) -> y
|
||||
tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
|
||||
tmp2 = expr_copy(e2);
|
||||
tmp = expr_extract_eq_or(&tmp1, &tmp2);
|
||||
if (expr_is_no(tmp1)) {
|
||||
expr_free(e1);
|
||||
e1 = expr_alloc_symbol(&symbol_yes);
|
||||
trans_count++;
|
||||
}
|
||||
expr_free(tmp2);
|
||||
expr_free(tmp1);
|
||||
expr_free(tmp);
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
#undef e1
|
||||
#undef e2
|
||||
}
|
||||
|
||||
/*
|
||||
* Rewrites 'e' in-place to remove ("join") duplicate and other redundant
|
||||
* operands.
|
||||
*
|
||||
* Example simplifications:
|
||||
*
|
||||
* A || B || A -> A || B
|
||||
* A && B && A=y -> A=y && B
|
||||
*
|
||||
* Returns the deduplicated expression.
|
||||
*/
|
||||
struct expr *expr_eliminate_dups(struct expr *e)
|
||||
{
|
||||
int oldcount;
|
||||
@@ -621,11 +665,11 @@ struct expr *expr_eliminate_dups(struct expr *e)
|
||||
switch (e->type) {
|
||||
case E_OR: case E_AND:
|
||||
expr_eliminate_dups1(e->type, &e, &e);
|
||||
expr_eliminate_dups2(e->type, &e, &e);
|
||||
default:
|
||||
;
|
||||
}
|
||||
if (!trans_count)
|
||||
/* No simplifications done in this pass. We're done */
|
||||
break;
|
||||
e = expr_eliminate_yn(e);
|
||||
}
|
||||
@@ -633,6 +677,12 @@ struct expr *expr_eliminate_dups(struct expr *e)
|
||||
return e;
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs various simplifications involving logical operators and
|
||||
* comparisons.
|
||||
*
|
||||
* Allocates and returns a new expression.
|
||||
*/
|
||||
struct expr *expr_transform(struct expr *e)
|
||||
{
|
||||
struct expr *tmp;
|
||||
@@ -641,6 +691,10 @@ struct expr *expr_transform(struct expr *e)
|
||||
return NULL;
|
||||
switch (e->type) {
|
||||
case E_EQUAL:
|
||||
case E_GEQ:
|
||||
case E_GTH:
|
||||
case E_LEQ:
|
||||
case E_LTH:
|
||||
case E_UNEQUAL:
|
||||
case E_SYMBOL:
|
||||
case E_LIST:
|
||||
@@ -713,6 +767,22 @@ struct expr *expr_transform(struct expr *e)
|
||||
e = tmp;
|
||||
e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL;
|
||||
break;
|
||||
case E_LEQ:
|
||||
case E_GEQ:
|
||||
// !a<='x' -> a>'x'
|
||||
tmp = e->left.expr;
|
||||
free(e);
|
||||
e = tmp;
|
||||
e->type = e->type == E_LEQ ? E_GTH : E_LTH;
|
||||
break;
|
||||
case E_LTH:
|
||||
case E_GTH:
|
||||
// !a<'x' -> a>='x'
|
||||
tmp = e->left.expr;
|
||||
free(e);
|
||||
e = tmp;
|
||||
e->type = e->type == E_LTH ? E_GEQ : E_LEQ;
|
||||
break;
|
||||
case E_OR:
|
||||
// !(a || b) -> !a && !b
|
||||
tmp = e->left.expr;
|
||||
@@ -783,6 +853,10 @@ int expr_contains_symbol(struct expr *dep, struct symbol *sym)
|
||||
case E_SYMBOL:
|
||||
return dep->left.sym == sym;
|
||||
case E_EQUAL:
|
||||
case E_GEQ:
|
||||
case E_GTH:
|
||||
case E_LEQ:
|
||||
case E_LTH:
|
||||
case E_UNEQUAL:
|
||||
return dep->left.sym == sym ||
|
||||
dep->right.sym == sym;
|
||||
@@ -823,57 +897,20 @@ bool expr_depends_symbol(struct expr *dep, struct symbol *sym)
|
||||
return false;
|
||||
}
|
||||
|
||||
struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2)
|
||||
{
|
||||
struct expr *tmp = NULL;
|
||||
expr_extract_eq(E_AND, &tmp, ep1, ep2);
|
||||
if (tmp) {
|
||||
*ep1 = expr_eliminate_yn(*ep1);
|
||||
*ep2 = expr_eliminate_yn(*ep2);
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2)
|
||||
{
|
||||
struct expr *tmp = NULL;
|
||||
expr_extract_eq(E_OR, &tmp, ep1, ep2);
|
||||
if (tmp) {
|
||||
*ep1 = expr_eliminate_yn(*ep1);
|
||||
*ep2 = expr_eliminate_yn(*ep2);
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2)
|
||||
{
|
||||
#define e1 (*ep1)
|
||||
#define e2 (*ep2)
|
||||
if (e1->type == type) {
|
||||
expr_extract_eq(type, ep, &e1->left.expr, &e2);
|
||||
expr_extract_eq(type, ep, &e1->right.expr, &e2);
|
||||
return;
|
||||
}
|
||||
if (e2->type == type) {
|
||||
expr_extract_eq(type, ep, ep1, &e2->left.expr);
|
||||
expr_extract_eq(type, ep, ep1, &e2->right.expr);
|
||||
return;
|
||||
}
|
||||
if (expr_eq(e1, e2)) {
|
||||
*ep = *ep ? expr_alloc_two(type, *ep, e1) : e1;
|
||||
expr_free(e2);
|
||||
if (type == E_AND) {
|
||||
e1 = expr_alloc_symbol(&symbol_yes);
|
||||
e2 = expr_alloc_symbol(&symbol_yes);
|
||||
} else if (type == E_OR) {
|
||||
e1 = expr_alloc_symbol(&symbol_no);
|
||||
e2 = expr_alloc_symbol(&symbol_no);
|
||||
}
|
||||
}
|
||||
#undef e1
|
||||
#undef e2
|
||||
}
|
||||
|
||||
/*
|
||||
* Inserts explicit comparisons of type 'type' to symbol 'sym' into the
|
||||
* expression 'e'.
|
||||
*
|
||||
* Examples transformations for type == E_UNEQUAL, sym == &symbol_no:
|
||||
*
|
||||
* A -> A!=n
|
||||
* !A -> A=n
|
||||
* A && B -> !(A=n || B=n)
|
||||
* A || B -> !(A=n && B=n)
|
||||
* A && (B || C) -> !(A=n || (B=n && C=n))
|
||||
*
|
||||
* Allocates and returns a new expression.
|
||||
*/
|
||||
struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym)
|
||||
{
|
||||
struct expr *e1, *e2;
|
||||
@@ -908,6 +945,10 @@ struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symb
|
||||
case E_NOT:
|
||||
return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym);
|
||||
case E_UNEQUAL:
|
||||
case E_LTH:
|
||||
case E_LEQ:
|
||||
case E_GTH:
|
||||
case E_GEQ:
|
||||
case E_EQUAL:
|
||||
if (type == E_EQUAL) {
|
||||
if (sym == &symbol_yes)
|
||||
@@ -935,10 +976,60 @@ struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symb
|
||||
return NULL;
|
||||
}
|
||||
|
||||
enum string_value_kind {
|
||||
k_string,
|
||||
k_signed,
|
||||
k_unsigned,
|
||||
k_invalid
|
||||
};
|
||||
|
||||
union string_value {
|
||||
unsigned long long u;
|
||||
signed long long s;
|
||||
};
|
||||
|
||||
static enum string_value_kind expr_parse_string(const char *str,
|
||||
enum symbol_type type,
|
||||
union string_value *val)
|
||||
{
|
||||
char *tail;
|
||||
enum string_value_kind kind;
|
||||
|
||||
errno = 0;
|
||||
switch (type) {
|
||||
case S_BOOLEAN:
|
||||
case S_TRISTATE:
|
||||
val->s = !strcmp(str, "n") ? 0 :
|
||||
!strcmp(str, "m") ? 1 :
|
||||
!strcmp(str, "y") ? 2 : -1;
|
||||
return k_signed;
|
||||
case S_INT:
|
||||
val->s = strtoll(str, &tail, 10);
|
||||
kind = k_signed;
|
||||
break;
|
||||
case S_HEX:
|
||||
val->u = strtoull(str, &tail, 16);
|
||||
kind = k_unsigned;
|
||||
break;
|
||||
case S_STRING:
|
||||
case S_UNKNOWN:
|
||||
val->s = strtoll(str, &tail, 0);
|
||||
kind = k_signed;
|
||||
break;
|
||||
default:
|
||||
return k_invalid;
|
||||
}
|
||||
return !errno && !*tail && tail > str && isxdigit(tail[-1])
|
||||
? kind : k_string;
|
||||
}
|
||||
|
||||
tristate expr_calc_value(struct expr *e)
|
||||
{
|
||||
tristate val1, val2;
|
||||
const char *str1, *str2;
|
||||
enum string_value_kind k1 = k_string, k2 = k_string;
|
||||
union string_value lval = {}, rval = {};
|
||||
int res;
|
||||
|
||||
if (!e)
|
||||
return yes;
|
||||
@@ -959,31 +1050,70 @@ tristate expr_calc_value(struct expr *e)
|
||||
val1 = expr_calc_value(e->left.expr);
|
||||
return EXPR_NOT(val1);
|
||||
case E_EQUAL:
|
||||
sym_calc_value(e->left.sym);
|
||||
sym_calc_value(e->right.sym);
|
||||
str1 = sym_get_string_value(e->left.sym);
|
||||
str2 = sym_get_string_value(e->right.sym);
|
||||
return !strcmp(str1, str2) ? yes : no;
|
||||
case E_GEQ:
|
||||
case E_GTH:
|
||||
case E_LEQ:
|
||||
case E_LTH:
|
||||
case E_UNEQUAL:
|
||||
sym_calc_value(e->left.sym);
|
||||
sym_calc_value(e->right.sym);
|
||||
str1 = sym_get_string_value(e->left.sym);
|
||||
str2 = sym_get_string_value(e->right.sym);
|
||||
return !strcmp(str1, str2) ? no : yes;
|
||||
break;
|
||||
default:
|
||||
printf("expr_calc_value: %d?\n", e->type);
|
||||
return no;
|
||||
}
|
||||
|
||||
sym_calc_value(e->left.sym);
|
||||
sym_calc_value(e->right.sym);
|
||||
str1 = sym_get_string_value(e->left.sym);
|
||||
str2 = sym_get_string_value(e->right.sym);
|
||||
|
||||
if (e->left.sym->type != S_STRING || e->right.sym->type != S_STRING) {
|
||||
k1 = expr_parse_string(str1, e->left.sym->type, &lval);
|
||||
k2 = expr_parse_string(str2, e->right.sym->type, &rval);
|
||||
}
|
||||
|
||||
if (k1 == k_string || k2 == k_string)
|
||||
res = strcmp(str1, str2);
|
||||
else if (k1 == k_invalid || k2 == k_invalid) {
|
||||
if (e->type != E_EQUAL && e->type != E_UNEQUAL) {
|
||||
printf("Cannot compare \"%s\" and \"%s\"\n", str1, str2);
|
||||
return no;
|
||||
}
|
||||
res = strcmp(str1, str2);
|
||||
} else if (k1 == k_unsigned || k2 == k_unsigned)
|
||||
res = (lval.u > rval.u) - (lval.u < rval.u);
|
||||
else /* if (k1 == k_signed && k2 == k_signed) */
|
||||
res = (lval.s > rval.s) - (lval.s < rval.s);
|
||||
|
||||
switch(e->type) {
|
||||
case E_EQUAL:
|
||||
return res ? no : yes;
|
||||
case E_GEQ:
|
||||
return res >= 0 ? yes : no;
|
||||
case E_GTH:
|
||||
return res > 0 ? yes : no;
|
||||
case E_LEQ:
|
||||
return res <= 0 ? yes : no;
|
||||
case E_LTH:
|
||||
return res < 0 ? yes : no;
|
||||
case E_UNEQUAL:
|
||||
return res ? yes : no;
|
||||
default:
|
||||
printf("expr_calc_value: relation %d?\n", e->type);
|
||||
return no;
|
||||
}
|
||||
}
|
||||
|
||||
int expr_compare_type(enum expr_type t1, enum expr_type t2)
|
||||
static int expr_compare_type(enum expr_type t1, enum expr_type t2)
|
||||
{
|
||||
#if 0
|
||||
return 1;
|
||||
#else
|
||||
if (t1 == t2)
|
||||
return 0;
|
||||
switch (t1) {
|
||||
case E_LEQ:
|
||||
case E_LTH:
|
||||
case E_GEQ:
|
||||
case E_GTH:
|
||||
if (t2 == E_EQUAL || t2 == E_UNEQUAL)
|
||||
return 1;
|
||||
case E_EQUAL:
|
||||
case E_UNEQUAL:
|
||||
if (t2 == E_NOT)
|
||||
@@ -1005,52 +1135,11 @@ int expr_compare_type(enum expr_type t1, enum expr_type t2)
|
||||
}
|
||||
printf("[%dgt%d?]", t1, t2);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline struct expr *
|
||||
expr_get_leftmost_symbol(const struct expr *e)
|
||||
{
|
||||
|
||||
if (e == NULL)
|
||||
return NULL;
|
||||
|
||||
while (e->type != E_SYMBOL)
|
||||
e = e->left.expr;
|
||||
|
||||
return expr_copy(e);
|
||||
}
|
||||
|
||||
/*
|
||||
* Given expression `e1' and `e2', returns the leaf of the longest
|
||||
* sub-expression of `e1' not containing 'e2.
|
||||
*/
|
||||
struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2)
|
||||
{
|
||||
struct expr *ret;
|
||||
|
||||
switch (e1->type) {
|
||||
case E_OR:
|
||||
return expr_alloc_and(
|
||||
expr_simplify_unmet_dep(e1->left.expr, e2),
|
||||
expr_simplify_unmet_dep(e1->right.expr, e2));
|
||||
case E_AND: {
|
||||
struct expr *e;
|
||||
e = expr_alloc_and(expr_copy(e1), expr_copy(e2));
|
||||
e = expr_eliminate_dups(e);
|
||||
ret = (!expr_eq(e, e1)) ? e1 : NULL;
|
||||
expr_free(e);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ret = e1;
|
||||
break;
|
||||
}
|
||||
|
||||
return expr_get_leftmost_symbol(ret);
|
||||
}
|
||||
|
||||
void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)
|
||||
void expr_print(struct expr *e,
|
||||
void (*fn)(void *, struct symbol *, const char *),
|
||||
void *data, int prevtoken)
|
||||
{
|
||||
if (!e) {
|
||||
fn(data, NULL, "y");
|
||||
@@ -1078,6 +1167,24 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
|
||||
fn(data, NULL, "=");
|
||||
fn(data, e->right.sym, e->right.sym->name);
|
||||
break;
|
||||
case E_LEQ:
|
||||
case E_LTH:
|
||||
if (e->left.sym->name)
|
||||
fn(data, e->left.sym, e->left.sym->name);
|
||||
else
|
||||
fn(data, NULL, "<choice>");
|
||||
fn(data, NULL, e->type == E_LEQ ? "<=" : "<");
|
||||
fn(data, e->right.sym, e->right.sym->name);
|
||||
break;
|
||||
case E_GEQ:
|
||||
case E_GTH:
|
||||
if (e->left.sym->name)
|
||||
fn(data, e->left.sym, e->left.sym->name);
|
||||
else
|
||||
fn(data, NULL, "<choice>");
|
||||
fn(data, NULL, e->type == E_GEQ ? ">=" : ">");
|
||||
fn(data, e->right.sym, e->right.sym->name);
|
||||
break;
|
||||
case E_UNEQUAL:
|
||||
if (e->left.sym->name)
|
||||
fn(data, e->left.sym, e->left.sym->name);
|
||||
@@ -1166,3 +1273,33 @@ void expr_gstr_print(struct expr *e, struct gstr *gs)
|
||||
{
|
||||
expr_print(e, expr_print_gstr_helper, gs, E_NONE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Transform the top level "||" tokens into newlines and prepend each
|
||||
* line with a minus. This makes expressions much easier to read.
|
||||
* Suitable for reverse dependency expressions.
|
||||
*/
|
||||
static void expr_print_revdep(struct expr *e,
|
||||
void (*fn)(void *, struct symbol *, const char *),
|
||||
void *data, tristate pr_type, const char **title)
|
||||
{
|
||||
if (e->type == E_OR) {
|
||||
expr_print_revdep(e->left.expr, fn, data, pr_type, title);
|
||||
expr_print_revdep(e->right.expr, fn, data, pr_type, title);
|
||||
} else if (expr_calc_value(e) == pr_type) {
|
||||
if (*title) {
|
||||
fn(data, NULL, *title);
|
||||
*title = NULL;
|
||||
}
|
||||
|
||||
fn(data, NULL, " - ");
|
||||
expr_print(e, fn, data, E_NONE);
|
||||
fn(data, NULL, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
void expr_gstr_print_revdep(struct expr *e, struct gstr *gs,
|
||||
tristate pr_type, const char *title)
|
||||
{
|
||||
expr_print_revdep(e, expr_print_gstr_helper, gs, pr_type, &title);
|
||||
}
|
||||
|
||||
@@ -29,7 +29,9 @@ typedef enum tristate {
|
||||
} tristate;
|
||||
|
||||
enum expr_type {
|
||||
E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_LIST, E_SYMBOL, E_RANGE
|
||||
E_NONE, E_OR, E_AND, E_NOT,
|
||||
E_EQUAL, E_UNEQUAL, E_LTH, E_LEQ, E_GTH, E_GEQ,
|
||||
E_LIST, E_SYMBOL, E_RANGE
|
||||
};
|
||||
|
||||
union expr_data {
|
||||
@@ -72,17 +74,61 @@ enum {
|
||||
S_DEF_COUNT
|
||||
};
|
||||
|
||||
/*
|
||||
* Represents a configuration symbol.
|
||||
*
|
||||
* Choices are represented as a special kind of symbol and have the
|
||||
* SYMBOL_CHOICE bit set in 'flags'.
|
||||
*/
|
||||
struct symbol {
|
||||
/* The next symbol in the same bucket in the symbol hash table */
|
||||
struct symbol *next;
|
||||
|
||||
/* The name of the symbol, e.g. "FOO" for 'config FOO' */
|
||||
char *name;
|
||||
|
||||
/* S_BOOLEAN, S_TRISTATE, ... */
|
||||
enum symbol_type type;
|
||||
|
||||
/*
|
||||
* The calculated value of the symbol. The SYMBOL_VALID bit is set in
|
||||
* 'flags' when this is up to date. Note that this value might differ
|
||||
* from the user value set in e.g. a .config file, due to visibility.
|
||||
*/
|
||||
struct symbol_value curr;
|
||||
|
||||
/*
|
||||
* Values for the symbol provided from outside. def[S_DEF_USER] holds
|
||||
* the .config value.
|
||||
*/
|
||||
struct symbol_value def[S_DEF_COUNT];
|
||||
|
||||
/*
|
||||
* An upper bound on the tristate value the user can set for the symbol
|
||||
* if it is a boolean or tristate. Calculated from prompt dependencies,
|
||||
* which also inherit dependencies from enclosing menus, choices, and
|
||||
* ifs. If 'n', the user value will be ignored.
|
||||
*
|
||||
* Symbols lacking prompts always have visibility 'n'.
|
||||
*/
|
||||
tristate visible;
|
||||
|
||||
/* SYMBOL_* flags */
|
||||
int flags;
|
||||
|
||||
/* List of properties. See prop_type. */
|
||||
struct property *prop;
|
||||
|
||||
/* Dependencies from enclosing menus, choices, and ifs */
|
||||
struct expr_value dir_dep;
|
||||
|
||||
/* Reverse dependencies through being selected by other symbols */
|
||||
struct expr_value rev_dep;
|
||||
|
||||
/*
|
||||
* "Weak" reverse dependencies through being implied by other symbols
|
||||
*/
|
||||
struct expr_value implied;
|
||||
};
|
||||
|
||||
#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
|
||||
@@ -109,6 +155,9 @@ struct symbol {
|
||||
/* choice values need to be set before calculating this symbol value */
|
||||
#define SYMBOL_NEED_SET_CHOICE_VALUES 0x100000
|
||||
|
||||
/* Set symbol to y if allnoconfig; used for symbols that hide others */
|
||||
#define SYMBOL_ALLNOCONFIG_Y 0x200000
|
||||
|
||||
#define SYMBOL_MAXLENGTH 256
|
||||
#define SYMBOL_HASHSIZE 9973
|
||||
|
||||
@@ -127,10 +176,11 @@ enum prop_type {
|
||||
P_UNKNOWN,
|
||||
P_PROMPT, /* prompt "foo prompt" or "BAZ Value" */
|
||||
P_COMMENT, /* text associated with a comment */
|
||||
P_MENU, /* prompt associated with a menuconfig option */
|
||||
P_MENU, /* prompt associated with a menu or menuconfig symbol */
|
||||
P_DEFAULT, /* default y */
|
||||
P_CHOICE, /* choice value */
|
||||
P_SELECT, /* select BAR */
|
||||
P_IMPLY, /* imply BAR */
|
||||
P_RANGE, /* range 7..100 (for a symbol) */
|
||||
P_ENV, /* value from environment variable */
|
||||
P_SYMBOL, /* where a symbol is defined */
|
||||
@@ -159,22 +209,67 @@ struct property {
|
||||
for (st = sym->prop; st; st = st->next) \
|
||||
if (st->text)
|
||||
|
||||
/*
|
||||
* Represents a node in the menu tree, as seen in e.g. menuconfig (though used
|
||||
* for all front ends). Each symbol, menu, etc. defined in the Kconfig files
|
||||
* gets a node. A symbol defined in multiple locations gets one node at each
|
||||
* location.
|
||||
*/
|
||||
struct menu {
|
||||
/* The next menu node at the same level */
|
||||
struct menu *next;
|
||||
|
||||
/* The parent menu node, corresponding to e.g. a menu or choice */
|
||||
struct menu *parent;
|
||||
|
||||
/* The first child menu node, for e.g. menus and choices */
|
||||
struct menu *list;
|
||||
|
||||
/*
|
||||
* The symbol associated with the menu node. Choices are implemented as
|
||||
* a special kind of symbol. NULL for menus, comments, and ifs.
|
||||
*/
|
||||
struct symbol *sym;
|
||||
|
||||
/*
|
||||
* The prompt associated with the node. This holds the prompt for a
|
||||
* symbol as well as the text for a menu or comment, along with the
|
||||
* type (P_PROMPT, P_MENU, etc.)
|
||||
*/
|
||||
struct property *prompt;
|
||||
|
||||
/*
|
||||
* 'visible if' dependencies. If more than one is given, they will be
|
||||
* ANDed together.
|
||||
*/
|
||||
struct expr *visibility;
|
||||
|
||||
/*
|
||||
* Ordinary dependencies from e.g. 'depends on' and 'if', ANDed
|
||||
* together
|
||||
*/
|
||||
struct expr *dep;
|
||||
|
||||
/* MENU_* flags */
|
||||
unsigned int flags;
|
||||
|
||||
/* Any help text associated with the node */
|
||||
char *help;
|
||||
|
||||
/* The location where the menu node appears in the Kconfig files */
|
||||
struct file *file;
|
||||
int lineno;
|
||||
|
||||
/* For use by front ends that need to store auxiliary data */
|
||||
void *data;
|
||||
};
|
||||
|
||||
/*
|
||||
* Set on a menu node when the corresponding symbol changes state in some way.
|
||||
* Can be checked by front ends.
|
||||
*/
|
||||
#define MENU_CHANGED 0x0001
|
||||
|
||||
#define MENU_ROOT 0x0002
|
||||
|
||||
struct jump_key {
|
||||
@@ -202,24 +297,20 @@ struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
|
||||
struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
|
||||
struct expr *expr_copy(const struct expr *org);
|
||||
void expr_free(struct expr *e);
|
||||
int expr_eq(struct expr *e1, struct expr *e2);
|
||||
void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
|
||||
tristate expr_calc_value(struct expr *e);
|
||||
struct expr *expr_eliminate_yn(struct expr *e);
|
||||
struct expr *expr_trans_bool(struct expr *e);
|
||||
struct expr *expr_eliminate_dups(struct expr *e);
|
||||
struct expr *expr_transform(struct expr *e);
|
||||
int expr_contains_symbol(struct expr *dep, struct symbol *sym);
|
||||
bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
|
||||
struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
|
||||
struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
|
||||
void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
|
||||
struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
|
||||
struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2);
|
||||
|
||||
void expr_fprint(struct expr *e, FILE *out);
|
||||
struct gstr; /* forward */
|
||||
void expr_gstr_print(struct expr *e, struct gstr *gs);
|
||||
void expr_gstr_print_revdep(struct expr *e, struct gstr *gs,
|
||||
tristate pr_type, const char *title);
|
||||
|
||||
static inline int expr_is_yes(struct expr *e)
|
||||
{
|
||||
|
||||
@@ -169,14 +169,6 @@ void init_main_window(const gchar * glade_file)
|
||||
style = gtk_widget_get_style(main_wnd);
|
||||
widget = glade_xml_get_widget(xml, "toolbar1");
|
||||
|
||||
#if 0 /* Use stock Gtk icons instead */
|
||||
replace_button_icon(xml, main_wnd->window, style,
|
||||
"button1", (gchar **) xpm_back);
|
||||
replace_button_icon(xml, main_wnd->window, style,
|
||||
"button2", (gchar **) xpm_load);
|
||||
replace_button_icon(xml, main_wnd->window, style,
|
||||
"button3", (gchar **) xpm_save);
|
||||
#endif
|
||||
replace_button_icon(xml, main_wnd->window, style,
|
||||
"button4", (gchar **) xpm_single_view);
|
||||
replace_button_icon(xml, main_wnd->window, style,
|
||||
@@ -184,22 +176,6 @@ void init_main_window(const gchar * glade_file)
|
||||
replace_button_icon(xml, main_wnd->window, style,
|
||||
"button6", (gchar **) xpm_tree_view);
|
||||
|
||||
#if 0
|
||||
switch (view_mode) {
|
||||
case SINGLE_VIEW:
|
||||
widget = glade_xml_get_widget(xml, "button4");
|
||||
g_signal_emit_by_name(widget, "clicked");
|
||||
break;
|
||||
case SPLIT_VIEW:
|
||||
widget = glade_xml_get_widget(xml, "button5");
|
||||
g_signal_emit_by_name(widget, "clicked");
|
||||
break;
|
||||
case FULL_VIEW:
|
||||
widget = glade_xml_get_widget(xml, "button6");
|
||||
g_signal_emit_by_name(widget, "clicked");
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
txtbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
|
||||
tag1 = gtk_text_buffer_create_tag(txtbuf, "mytag1",
|
||||
"foreground", "red",
|
||||
@@ -938,7 +914,7 @@ on_treeview2_button_press_event(GtkWidget * widget,
|
||||
current = menu;
|
||||
display_tree_part();
|
||||
gtk_widget_set_sensitive(back_btn, TRUE);
|
||||
} else if ((col == COL_OPTION)) {
|
||||
} else if (col == COL_OPTION) {
|
||||
toggle_sym_value(menu);
|
||||
gtk_tree_view_expand_row(view, path, TRUE);
|
||||
}
|
||||
@@ -1404,7 +1380,7 @@ static void display_tree(struct menu *menu)
|
||||
&& (tree == tree2))
|
||||
continue;
|
||||
/*
|
||||
if (((menu != &rootmenu) && !(menu->flags & MENU_ROOT))
|
||||
if (((menu != &rootmenu) && !(menu->flags & MENU_ROOT))
|
||||
|| (view_mode == FULL_VIEW)
|
||||
|| (view_mode == SPLIT_VIEW))*/
|
||||
|
||||
@@ -1498,9 +1474,12 @@ int main(int ac, char *av[])
|
||||
case 'a':
|
||||
//showAll = 1;
|
||||
break;
|
||||
case 's':
|
||||
conf_set_message_callback(NULL);
|
||||
break;
|
||||
case 'h':
|
||||
case '?':
|
||||
printf("%s <config>\n", av[0]);
|
||||
printf("%s [-s] <config>\n", av[0]);
|
||||
exit(0);
|
||||
}
|
||||
name = av[2];
|
||||
|
||||
53
bsp/buildroot/support/kconfig/kconf_id.c
Normal file
53
bsp/buildroot/support/kconfig/kconf_id.c
Normal file
@@ -0,0 +1,53 @@
|
||||
|
||||
static struct kconf_id kconf_id_array[] = {
|
||||
{ "mainmenu", T_MAINMENU, TF_COMMAND },
|
||||
{ "menu", T_MENU, TF_COMMAND },
|
||||
{ "endmenu", T_ENDMENU, TF_COMMAND },
|
||||
{ "source", T_SOURCE, TF_COMMAND },
|
||||
{ "choice", T_CHOICE, TF_COMMAND },
|
||||
{ "endchoice", T_ENDCHOICE, TF_COMMAND },
|
||||
{ "comment", T_COMMENT, TF_COMMAND },
|
||||
{ "config", T_CONFIG, TF_COMMAND },
|
||||
{ "menuconfig", T_MENUCONFIG, TF_COMMAND },
|
||||
{ "help", T_HELP, TF_COMMAND },
|
||||
{ "---help---", T_HELP, TF_COMMAND },
|
||||
{ "if", T_IF, TF_COMMAND|TF_PARAM },
|
||||
{ "endif", T_ENDIF, TF_COMMAND },
|
||||
{ "depends", T_DEPENDS, TF_COMMAND },
|
||||
{ "optional", T_OPTIONAL, TF_COMMAND },
|
||||
{ "default", T_DEFAULT, TF_COMMAND, S_UNKNOWN },
|
||||
{ "prompt", T_PROMPT, TF_COMMAND },
|
||||
{ "tristate", T_TYPE, TF_COMMAND, S_TRISTATE },
|
||||
{ "def_tristate", T_DEFAULT, TF_COMMAND, S_TRISTATE },
|
||||
{ "bool", T_TYPE, TF_COMMAND, S_BOOLEAN },
|
||||
{ "def_bool", T_DEFAULT, TF_COMMAND, S_BOOLEAN },
|
||||
{ "int", T_TYPE, TF_COMMAND, S_INT },
|
||||
{ "hex", T_TYPE, TF_COMMAND, S_HEX },
|
||||
{ "string", T_TYPE, TF_COMMAND, S_STRING },
|
||||
{ "select", T_SELECT, TF_COMMAND },
|
||||
{ "imply", T_IMPLY, TF_COMMAND },
|
||||
{ "range", T_RANGE, TF_COMMAND },
|
||||
{ "visible", T_VISIBLE, TF_COMMAND },
|
||||
{ "option", T_OPTION, TF_COMMAND },
|
||||
{ "on", T_ON, TF_PARAM },
|
||||
{ "modules", T_OPT_MODULES, TF_OPTION },
|
||||
{ "defconfig_list", T_OPT_DEFCONFIG_LIST, TF_OPTION },
|
||||
{ "env", T_OPT_ENV, TF_OPTION },
|
||||
{ "allnoconfig_y", T_OPT_ALLNOCONFIG_Y, TF_OPTION },
|
||||
};
|
||||
|
||||
#define KCONF_ID_ARRAY_SIZE (sizeof(kconf_id_array)/sizeof(struct kconf_id))
|
||||
|
||||
static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < KCONF_ID_ARRAY_SIZE; i++) {
|
||||
struct kconf_id *id = kconf_id_array+i;
|
||||
int l = strlen(id->name);
|
||||
|
||||
if (len == l && !memcmp(str, id->name, len))
|
||||
return id;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -101,7 +101,7 @@ static struct message *message__new(const char *msg, char *option,
|
||||
if (self->files == NULL)
|
||||
goto out_fail;
|
||||
|
||||
self->msg = strdup(msg);
|
||||
self->msg = xstrdup(msg);
|
||||
if (self->msg == NULL)
|
||||
goto out_fail_msg;
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef LIST_H
|
||||
#define LIST_H
|
||||
|
||||
@@ -34,7 +35,7 @@ struct list_head {
|
||||
* list_entry - get the struct for this entry
|
||||
* @ptr: the &struct list_head pointer.
|
||||
* @type: the type of the struct this is embedded in.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
* @member: the name of the list_head within the struct.
|
||||
*/
|
||||
#define list_entry(ptr, type, member) \
|
||||
container_of(ptr, type, member)
|
||||
@@ -43,7 +44,7 @@ struct list_head {
|
||||
* list_for_each_entry - iterate over list of given type
|
||||
* @pos: the type * to use as a loop cursor.
|
||||
* @head: the head for your list.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
* @member: the name of the list_head within the struct.
|
||||
*/
|
||||
#define list_for_each_entry(pos, head, member) \
|
||||
for (pos = list_entry((head)->next, typeof(*pos), member); \
|
||||
@@ -55,7 +56,7 @@ struct list_head {
|
||||
* @pos: the type * to use as a loop cursor.
|
||||
* @n: another type * to use as temporary storage
|
||||
* @head: the head for your list.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
* @member: the name of the list_head within the struct.
|
||||
*/
|
||||
#define list_for_each_entry_safe(pos, n, head, member) \
|
||||
for (pos = list_entry((head)->next, typeof(*pos), member), \
|
||||
|
||||
@@ -21,9 +21,7 @@ static inline char *bind_textdomain_codeset(const char *dn, char *c) { return c;
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define P(name,type,arg) extern type name arg
|
||||
#include "lkc_proto.h"
|
||||
#undef P
|
||||
|
||||
#define SRCTREE "srctree"
|
||||
|
||||
@@ -61,17 +59,16 @@ enum conf_def_mode {
|
||||
#define T_OPT_MODULES 1
|
||||
#define T_OPT_DEFCONFIG_LIST 2
|
||||
#define T_OPT_ENV 3
|
||||
#define T_OPT_ALLNOCONFIG_Y 4
|
||||
|
||||
struct kconf_id {
|
||||
int name;
|
||||
const char *name;
|
||||
int token;
|
||||
unsigned int flags;
|
||||
enum symbol_type stype;
|
||||
};
|
||||
|
||||
extern int zconfdebug;
|
||||
|
||||
int zconfparse(void);
|
||||
extern int yylineno;
|
||||
void zconfdump(FILE *out);
|
||||
void zconf_starthelp(void);
|
||||
FILE *zconf_fopen(const char *name);
|
||||
@@ -89,11 +86,6 @@ void sym_add_change_count(int count);
|
||||
bool conf_set_all_new_symbols(enum conf_def_mode mode);
|
||||
void set_all_choice_values(struct symbol *csym);
|
||||
|
||||
struct conf_printer {
|
||||
void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
|
||||
void (*print_comment)(FILE *, const char *, void *);
|
||||
};
|
||||
|
||||
/* confdata.c and expr.c */
|
||||
static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out)
|
||||
{
|
||||
@@ -109,10 +101,8 @@ void menu_warn(struct menu *menu, const char *fmt, ...);
|
||||
struct menu *menu_add_menu(void);
|
||||
void menu_end_menu(void);
|
||||
void menu_add_entry(struct symbol *sym);
|
||||
void menu_end_entry(void);
|
||||
void menu_add_dep(struct expr *dep);
|
||||
void menu_add_visibility(struct expr *dep);
|
||||
struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep);
|
||||
struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
|
||||
void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
|
||||
void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
|
||||
@@ -125,6 +115,8 @@ struct file *file_lookup(const char *name);
|
||||
int file_write_dep(const char *name);
|
||||
void *xmalloc(size_t size);
|
||||
void *xcalloc(size_t nmemb, size_t size);
|
||||
void *xrealloc(void *p, size_t size);
|
||||
char *xstrdup(const char *s);
|
||||
|
||||
struct gstr {
|
||||
size_t len;
|
||||
@@ -136,7 +128,6 @@ struct gstr {
|
||||
int max_width;
|
||||
};
|
||||
struct gstr str_new(void);
|
||||
struct gstr str_assign(const char *s);
|
||||
void str_free(struct gstr *gs);
|
||||
void str_append(struct gstr *gs, const char *s);
|
||||
void str_printf(struct gstr *gs, const char *fmt, ...);
|
||||
@@ -147,8 +138,6 @@ extern struct expr *sym_env_list;
|
||||
|
||||
void sym_init(void);
|
||||
void sym_clear_all_valid(void);
|
||||
void sym_set_all_changed(void);
|
||||
void sym_set_changed(struct symbol *sym);
|
||||
struct symbol *sym_choice_default(struct symbol *sym);
|
||||
const char *sym_get_string_default(struct symbol *sym);
|
||||
struct symbol *sym_check_deps(struct symbol *sym);
|
||||
|
||||
@@ -1,57 +1,53 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#include <stdarg.h>
|
||||
|
||||
/* confdata.c */
|
||||
P(conf_parse,void,(const char *name));
|
||||
P(conf_read,int,(const char *name));
|
||||
P(conf_read_simple,int,(const char *name, int));
|
||||
P(conf_write_defconfig,int,(const char *name));
|
||||
P(conf_write,int,(const char *name));
|
||||
P(conf_write_autoconf,int,(void));
|
||||
P(conf_get_changed,bool,(void));
|
||||
P(conf_set_changed_callback, void,(void (*fn)(void)));
|
||||
P(conf_set_message_callback, void,(void (*fn)(const char *fmt, va_list ap)));
|
||||
void conf_parse(const char *name);
|
||||
int conf_read(const char *name);
|
||||
int conf_read_simple(const char *name, int);
|
||||
int conf_write_defconfig(const char *name);
|
||||
int conf_write(const char *name);
|
||||
int conf_write_autoconf(void);
|
||||
bool conf_get_changed(void);
|
||||
void conf_set_changed_callback(void (*fn)(void));
|
||||
void conf_set_message_callback(void (*fn)(const char *fmt, va_list ap));
|
||||
|
||||
/* menu.c */
|
||||
P(rootmenu,struct menu,);
|
||||
extern struct menu rootmenu;
|
||||
|
||||
P(menu_is_empty, bool, (struct menu *menu));
|
||||
P(menu_is_visible, bool, (struct menu *menu));
|
||||
P(menu_has_prompt, bool, (struct menu *menu));
|
||||
P(menu_get_prompt,const char *,(struct menu *menu));
|
||||
P(menu_get_root_menu,struct menu *,(struct menu *menu));
|
||||
P(menu_get_parent_menu,struct menu *,(struct menu *menu));
|
||||
P(menu_has_help,bool,(struct menu *menu));
|
||||
P(menu_get_help,const char *,(struct menu *menu));
|
||||
P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct list_head
|
||||
*head));
|
||||
P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct list_head
|
||||
*head));
|
||||
P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help));
|
||||
bool menu_is_empty(struct menu *menu);
|
||||
bool menu_is_visible(struct menu *menu);
|
||||
bool menu_has_prompt(struct menu *menu);
|
||||
const char * menu_get_prompt(struct menu *menu);
|
||||
struct menu * menu_get_root_menu(struct menu *menu);
|
||||
struct menu * menu_get_parent_menu(struct menu *menu);
|
||||
bool menu_has_help(struct menu *menu);
|
||||
const char * menu_get_help(struct menu *menu);
|
||||
struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head);
|
||||
void menu_get_ext_help(struct menu *menu, struct gstr *help);
|
||||
|
||||
/* symbol.c */
|
||||
P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
|
||||
extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];
|
||||
|
||||
P(sym_lookup,struct symbol *,(const char *name, int flags));
|
||||
P(sym_find,struct symbol *,(const char *name));
|
||||
P(sym_expand_string_value,const char *,(const char *in));
|
||||
P(sym_escape_string_value, const char *,(const char *in));
|
||||
P(sym_re_search,struct symbol **,(const char *pattern));
|
||||
P(sym_type_name,const char *,(enum symbol_type type));
|
||||
P(sym_calc_value,void,(struct symbol *sym));
|
||||
P(sym_get_type,enum symbol_type,(struct symbol *sym));
|
||||
P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri));
|
||||
P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri));
|
||||
P(sym_toggle_tristate_value,tristate,(struct symbol *sym));
|
||||
P(sym_string_valid,bool,(struct symbol *sym, const char *newval));
|
||||
P(sym_string_within_range,bool,(struct symbol *sym, const char *str));
|
||||
P(sym_set_string_value,bool,(struct symbol *sym, const char *newval));
|
||||
P(sym_is_changable,bool,(struct symbol *sym));
|
||||
P(sym_get_choice_prop,struct property *,(struct symbol *sym));
|
||||
P(sym_get_default_prop,struct property *,(struct symbol *sym));
|
||||
P(sym_get_string_value,const char *,(struct symbol *sym));
|
||||
struct symbol * sym_lookup(const char *name, int flags);
|
||||
struct symbol * sym_find(const char *name);
|
||||
char *sym_expand_string_value(const char *in);
|
||||
const char * sym_escape_string_value(const char *in);
|
||||
struct symbol ** sym_re_search(const char *pattern);
|
||||
const char * sym_type_name(enum symbol_type type);
|
||||
void sym_calc_value(struct symbol *sym);
|
||||
enum symbol_type sym_get_type(struct symbol *sym);
|
||||
bool sym_tristate_within_range(struct symbol *sym,tristate tri);
|
||||
bool sym_set_tristate_value(struct symbol *sym,tristate tri);
|
||||
tristate sym_toggle_tristate_value(struct symbol *sym);
|
||||
bool sym_string_valid(struct symbol *sym, const char *newval);
|
||||
bool sym_string_within_range(struct symbol *sym, const char *str);
|
||||
bool sym_set_string_value(struct symbol *sym, const char *newval);
|
||||
bool sym_is_changable(struct symbol *sym);
|
||||
struct property * sym_get_choice_prop(struct symbol *sym);
|
||||
const char * sym_get_string_value(struct symbol *sym);
|
||||
|
||||
P(prop_get_type_name,const char *,(enum prop_type type));
|
||||
const char * prop_get_type_name(enum prop_type type);
|
||||
|
||||
/* expr.c */
|
||||
P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2));
|
||||
P(expr_print,void,(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken));
|
||||
void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Check ncurses compatibility
|
||||
|
||||
# What library to link
|
||||
@@ -54,7 +55,8 @@ EOF
|
||||
echo " *** required header files." 1>&2
|
||||
echo " *** 'make menuconfig' requires the ncurses libraries." 1>&2
|
||||
echo " *** " 1>&2
|
||||
echo " *** Install ncurses (ncurses-devel) and try again." 1>&2
|
||||
echo " *** Install ncurses (ncurses-devel or libncurses-dev " 1>&2
|
||||
echo " *** depending on your distribution) and try again." 1>&2
|
||||
echo " *** " 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -168,13 +168,13 @@ do_resize:
|
||||
|
||||
/* create new window for the list */
|
||||
list = subwin(dialog, list_height, list_width, y + box_y + 1,
|
||||
x + box_x + 1);
|
||||
x + box_x + 1);
|
||||
|
||||
keypad(list, TRUE);
|
||||
|
||||
/* draw a box around the list items */
|
||||
draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2,
|
||||
dlg.menubox_border.atr, dlg.menubox.atr);
|
||||
dlg.menubox_border.atr, dlg.menubox.atr);
|
||||
|
||||
/* Find length of longest item in order to center checklist */
|
||||
check_x = 0;
|
||||
|
||||
@@ -170,7 +170,7 @@ char item_tag(void);
|
||||
/* item list manipulation for lxdialog use */
|
||||
#define MAXITEMSTR 200
|
||||
struct dialog_item {
|
||||
char str[MAXITEMSTR]; /* promtp displayed */
|
||||
char str[MAXITEMSTR]; /* prompt displayed */
|
||||
char tag;
|
||||
void *data; /* pointer to menu item - used by menubox+checklist */
|
||||
int selected; /* Set to 1 by dialog_*() function if selected. */
|
||||
|
||||
@@ -42,7 +42,7 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected)
|
||||
* Display a dialog box for inputing a string
|
||||
*/
|
||||
int dialog_inputbox(const char *title, const char *prompt, int height, int width,
|
||||
const char *init)
|
||||
const char *init)
|
||||
{
|
||||
int i, x, y, box_y, box_x, box_width;
|
||||
int input_x = 0, key = 0, button = -1;
|
||||
|
||||
@@ -64,7 +64,7 @@ static int menu_width, item_x;
|
||||
* Print menu item
|
||||
*/
|
||||
static void do_print_item(WINDOW * win, const char *item, int line_y,
|
||||
int selected, int hotkey)
|
||||
int selected, int hotkey)
|
||||
{
|
||||
int j;
|
||||
char *menu_item = malloc(menu_width + 1);
|
||||
@@ -182,7 +182,7 @@ static void do_scroll(WINDOW *win, int *scroll, int n)
|
||||
* Display a menu for choosing among a number of options
|
||||
*/
|
||||
int dialog_menu(const char *title, const char *prompt,
|
||||
const void *selected, int *s_scroll)
|
||||
const void *selected, int *s_scroll)
|
||||
{
|
||||
int i, j, x, y, box_x, box_y;
|
||||
int height, width, menu_height;
|
||||
|
||||
@@ -623,7 +623,7 @@ void item_make(const char *fmt, ...)
|
||||
void item_add_str(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
size_t avail;
|
||||
size_t avail;
|
||||
|
||||
avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str);
|
||||
|
||||
|
||||
@@ -246,7 +246,7 @@ search_help[] = N_(
|
||||
" Selected by: BAR [=n]\n"
|
||||
"-----------------------------------------------------------------\n"
|
||||
"o The line 'Type:' shows the type of the configuration option for\n"
|
||||
" this symbol (boolean, tristate, string, ...)\n"
|
||||
" this symbol (bool, tristate, string, ...)\n"
|
||||
"o The line 'Prompt:' shows the text used in the menu structure for\n"
|
||||
" this symbol\n"
|
||||
"o The 'Defined at' line tells at what file / line number the symbol\n"
|
||||
@@ -279,6 +279,7 @@ static int child_count;
|
||||
static int single_menu_mode;
|
||||
static int show_all_options;
|
||||
static int save_and_exit;
|
||||
static int silent;
|
||||
|
||||
static void conf(struct menu *menu, struct menu *active_menu);
|
||||
static void conf_choice(struct menu *menu);
|
||||
@@ -299,7 +300,7 @@ static void set_config_filename(const char *config_filename)
|
||||
int size;
|
||||
|
||||
size = snprintf(menu_backtitle, sizeof(menu_backtitle),
|
||||
"%s - %s", config_filename, rootmenu.prompt->text);
|
||||
"%s - %s", config_filename, rootmenu.prompt->text);
|
||||
if (size >= sizeof(menu_backtitle))
|
||||
menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
|
||||
set_dialog_backtitle(menu_backtitle);
|
||||
@@ -330,10 +331,10 @@ static void set_subtitle(void)
|
||||
list_for_each_entry(sp, &trail, entries) {
|
||||
if (sp->text) {
|
||||
if (pos) {
|
||||
pos->next = xcalloc(sizeof(*pos), 1);
|
||||
pos->next = xcalloc(1, sizeof(*pos));
|
||||
pos = pos->next;
|
||||
} else {
|
||||
subtitles = pos = xcalloc(sizeof(*pos), 1);
|
||||
subtitles = pos = xcalloc(1, sizeof(*pos));
|
||||
}
|
||||
pos->text = sp->text;
|
||||
}
|
||||
@@ -777,10 +778,12 @@ static void conf_message_callback(const char *fmt, va_list ap)
|
||||
char buf[PATH_MAX+1];
|
||||
|
||||
vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||
if (save_and_exit)
|
||||
printf("%s", buf);
|
||||
else
|
||||
if (save_and_exit) {
|
||||
if (!silent)
|
||||
printf("%s", buf);
|
||||
} else {
|
||||
show_textbox(NULL, buf, 6, 60);
|
||||
}
|
||||
}
|
||||
|
||||
static void show_help(struct menu *menu)
|
||||
@@ -977,16 +980,18 @@ static int handle_exit(void)
|
||||
}
|
||||
/* fall through */
|
||||
case -1:
|
||||
printf(_("\n\n"
|
||||
"*** End of the configuration.\n"
|
||||
"*** Execute 'make' to start the build or try 'make help'."
|
||||
"\n\n"));
|
||||
if (!silent)
|
||||
printf(_("\n\n"
|
||||
"*** End of the configuration.\n"
|
||||
"*** Execute 'make' to start the build or try 'make help'."
|
||||
"\n\n"));
|
||||
res = 0;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, _("\n\n"
|
||||
"Your configuration changes were NOT saved."
|
||||
"\n\n"));
|
||||
if (!silent)
|
||||
fprintf(stderr, _("\n\n"
|
||||
"Your configuration changes were NOT saved."
|
||||
"\n\n"));
|
||||
if (res != KEY_ESC)
|
||||
res = 0;
|
||||
}
|
||||
@@ -1010,6 +1015,12 @@ int main(int ac, char **av)
|
||||
|
||||
signal(SIGINT, sig_handler);
|
||||
|
||||
if (ac > 1 && strcmp(av[1], "-s") == 0) {
|
||||
silent = 1;
|
||||
/* Silence conf_read() until the real callback is set up */
|
||||
conf_set_message_callback(NULL);
|
||||
av++;
|
||||
}
|
||||
conf_parse(av[1]);
|
||||
conf_read(NULL);
|
||||
|
||||
@@ -1034,4 +1045,3 @@ int main(int ac, char **av)
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
@@ -62,13 +62,8 @@ void menu_add_entry(struct symbol *sym)
|
||||
menu_add_symbol(P_SYMBOL, sym, NULL);
|
||||
}
|
||||
|
||||
void menu_end_entry(void)
|
||||
{
|
||||
}
|
||||
|
||||
struct menu *menu_add_menu(void)
|
||||
{
|
||||
menu_end_entry();
|
||||
last_entry_ptr = ¤t_entry->list;
|
||||
return current_menu = current_entry;
|
||||
}
|
||||
@@ -79,19 +74,23 @@ void menu_end_menu(void)
|
||||
current_menu = current_menu->parent;
|
||||
}
|
||||
|
||||
static struct expr *menu_check_dep(struct expr *e)
|
||||
/*
|
||||
* Rewrites 'm' to 'm' && MODULES, so that it evaluates to 'n' when running
|
||||
* without modules
|
||||
*/
|
||||
static struct expr *rewrite_m(struct expr *e)
|
||||
{
|
||||
if (!e)
|
||||
return e;
|
||||
|
||||
switch (e->type) {
|
||||
case E_NOT:
|
||||
e->left.expr = menu_check_dep(e->left.expr);
|
||||
e->left.expr = rewrite_m(e->left.expr);
|
||||
break;
|
||||
case E_OR:
|
||||
case E_AND:
|
||||
e->left.expr = menu_check_dep(e->left.expr);
|
||||
e->right.expr = menu_check_dep(e->right.expr);
|
||||
e->left.expr = rewrite_m(e->left.expr);
|
||||
e->right.expr = rewrite_m(e->right.expr);
|
||||
break;
|
||||
case E_SYMBOL:
|
||||
/* change 'm' into 'm' && MODULES */
|
||||
@@ -106,7 +105,7 @@ static struct expr *menu_check_dep(struct expr *e)
|
||||
|
||||
void menu_add_dep(struct expr *dep)
|
||||
{
|
||||
current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
|
||||
current_entry->dep = expr_alloc_and(current_entry->dep, dep);
|
||||
}
|
||||
|
||||
void menu_set_type(int type)
|
||||
@@ -125,13 +124,13 @@ void menu_set_type(int type)
|
||||
sym_type_name(sym->type), sym_type_name(type));
|
||||
}
|
||||
|
||||
struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
|
||||
static struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
|
||||
{
|
||||
struct property *prop = prop_alloc(type, current_entry->sym);
|
||||
|
||||
prop->menu = current_entry;
|
||||
prop->expr = expr;
|
||||
prop->visible.expr = menu_check_dep(dep);
|
||||
prop->visible.expr = dep;
|
||||
|
||||
if (prompt) {
|
||||
if (isspace(*prompt)) {
|
||||
@@ -213,10 +212,14 @@ void menu_add_option(int token, char *arg)
|
||||
sym_defconfig_list = current_entry->sym;
|
||||
else if (sym_defconfig_list != current_entry->sym)
|
||||
zconf_error("trying to redefine defconfig symbol");
|
||||
sym_defconfig_list->flags |= SYMBOL_AUTO;
|
||||
break;
|
||||
case T_OPT_ENV:
|
||||
prop_add_env(arg);
|
||||
break;
|
||||
case T_OPT_ALLNOCONFIG_Y:
|
||||
current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -230,6 +233,8 @@ static void sym_check_prop(struct symbol *sym)
|
||||
{
|
||||
struct property *prop;
|
||||
struct symbol *sym2;
|
||||
char *use;
|
||||
|
||||
for (prop = sym->prop; prop; prop = prop->next) {
|
||||
switch (prop->type) {
|
||||
case P_DEFAULT:
|
||||
@@ -247,25 +252,37 @@ static void sym_check_prop(struct symbol *sym)
|
||||
"'%s': number is invalid",
|
||||
sym->name);
|
||||
}
|
||||
if (sym_is_choice(sym)) {
|
||||
struct property *choice_prop =
|
||||
sym_get_choice_prop(sym2);
|
||||
|
||||
if (!choice_prop ||
|
||||
prop_get_symbol(choice_prop) != sym)
|
||||
prop_warn(prop,
|
||||
"choice default symbol '%s' is not contained in the choice",
|
||||
sym2->name);
|
||||
}
|
||||
break;
|
||||
case P_SELECT:
|
||||
case P_IMPLY:
|
||||
use = prop->type == P_SELECT ? "select" : "imply";
|
||||
sym2 = prop_get_symbol(prop);
|
||||
if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE)
|
||||
prop_warn(prop,
|
||||
"config symbol '%s' uses select, but is "
|
||||
"not boolean or tristate", sym->name);
|
||||
"config symbol '%s' uses %s, but is "
|
||||
"not bool or tristate", sym->name, use);
|
||||
else if (sym2->type != S_UNKNOWN &&
|
||||
sym2->type != S_BOOLEAN &&
|
||||
sym2->type != S_TRISTATE)
|
||||
sym2->type != S_BOOLEAN &&
|
||||
sym2->type != S_TRISTATE)
|
||||
prop_warn(prop,
|
||||
"'%s' has wrong type. 'select' only "
|
||||
"accept arguments of boolean and "
|
||||
"tristate type", sym2->name);
|
||||
"'%s' has wrong type. '%s' only "
|
||||
"accept arguments of bool and "
|
||||
"tristate type", sym2->name, use);
|
||||
break;
|
||||
case P_RANGE:
|
||||
if (sym->type != S_INT && sym->type != S_HEX)
|
||||
prop_warn(prop, "range is only allowed "
|
||||
"for int or hex symbols");
|
||||
"for int or hex symbols");
|
||||
if (!menu_validate_number(sym, prop->expr->left.sym) ||
|
||||
!menu_validate_number(sym, prop->expr->right.sym))
|
||||
prop_warn(prop, "range is invalid");
|
||||
@@ -285,6 +302,11 @@ void menu_finalize(struct menu *parent)
|
||||
|
||||
sym = parent->sym;
|
||||
if (parent->list) {
|
||||
/*
|
||||
* This menu node has children. We (recursively) process them
|
||||
* and propagate parent dependencies before moving on.
|
||||
*/
|
||||
|
||||
if (sym && sym_is_choice(sym)) {
|
||||
if (sym->type == S_UNKNOWN) {
|
||||
/* find the first choice value to find out choice type */
|
||||
@@ -302,65 +324,169 @@ void menu_finalize(struct menu *parent)
|
||||
if (menu->sym && menu->sym->type == S_UNKNOWN)
|
||||
menu_set_type(sym->type);
|
||||
}
|
||||
|
||||
/*
|
||||
* Use the choice itself as the parent dependency of
|
||||
* the contained items. This turns the mode of the
|
||||
* choice into an upper bound on the visibility of the
|
||||
* choice value symbols.
|
||||
*/
|
||||
parentdep = expr_alloc_symbol(sym);
|
||||
} else if (parent->prompt)
|
||||
/* Menu node for 'menu' */
|
||||
parentdep = parent->prompt->visible.expr;
|
||||
else
|
||||
/* Menu node for 'if' */
|
||||
parentdep = parent->dep;
|
||||
|
||||
/* For each child menu node... */
|
||||
for (menu = parent->list; menu; menu = menu->next) {
|
||||
basedep = expr_transform(menu->dep);
|
||||
/*
|
||||
* Propagate parent dependencies to the child menu
|
||||
* node, also rewriting and simplifying expressions
|
||||
*/
|
||||
basedep = rewrite_m(menu->dep);
|
||||
basedep = expr_transform(basedep);
|
||||
basedep = expr_alloc_and(expr_copy(parentdep), basedep);
|
||||
basedep = expr_eliminate_dups(basedep);
|
||||
menu->dep = basedep;
|
||||
|
||||
if (menu->sym)
|
||||
/*
|
||||
* Note: For symbols, all prompts are included
|
||||
* too in the symbol's own property list
|
||||
*/
|
||||
prop = menu->sym->prop;
|
||||
else
|
||||
/*
|
||||
* For non-symbol menu nodes, we just need to
|
||||
* handle the prompt
|
||||
*/
|
||||
prop = menu->prompt;
|
||||
|
||||
/* For each property... */
|
||||
for (; prop; prop = prop->next) {
|
||||
if (prop->menu != menu)
|
||||
/*
|
||||
* Two possibilities:
|
||||
*
|
||||
* 1. The property lacks dependencies
|
||||
* and so isn't location-specific,
|
||||
* e.g. an 'option'
|
||||
*
|
||||
* 2. The property belongs to a symbol
|
||||
* defined in multiple locations and
|
||||
* is from some other location. It
|
||||
* will be handled there in that
|
||||
* case.
|
||||
*
|
||||
* Skip the property.
|
||||
*/
|
||||
continue;
|
||||
dep = expr_transform(prop->visible.expr);
|
||||
|
||||
/*
|
||||
* Propagate parent dependencies to the
|
||||
* property's condition, rewriting and
|
||||
* simplifying expressions at the same time
|
||||
*/
|
||||
dep = rewrite_m(prop->visible.expr);
|
||||
dep = expr_transform(dep);
|
||||
dep = expr_alloc_and(expr_copy(basedep), dep);
|
||||
dep = expr_eliminate_dups(dep);
|
||||
if (menu->sym && menu->sym->type != S_TRISTATE)
|
||||
dep = expr_trans_bool(dep);
|
||||
prop->visible.expr = dep;
|
||||
|
||||
/*
|
||||
* Handle selects and implies, which modify the
|
||||
* dependencies of the selected/implied symbol
|
||||
*/
|
||||
if (prop->type == P_SELECT) {
|
||||
struct symbol *es = prop_get_symbol(prop);
|
||||
es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
|
||||
expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
|
||||
} else if (prop->type == P_IMPLY) {
|
||||
struct symbol *es = prop_get_symbol(prop);
|
||||
es->implied.expr = expr_alloc_or(es->implied.expr,
|
||||
expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sym && sym_is_choice(sym))
|
||||
expr_free(parentdep);
|
||||
|
||||
/*
|
||||
* Recursively process children in the same fashion before
|
||||
* moving on
|
||||
*/
|
||||
for (menu = parent->list; menu; menu = menu->next)
|
||||
menu_finalize(menu);
|
||||
} else if (sym) {
|
||||
/*
|
||||
* Automatic submenu creation. If sym is a symbol and A, B, C,
|
||||
* ... are consecutive items (symbols, menus, ifs, etc.) that
|
||||
* all depend on sym, then the following menu structure is
|
||||
* created:
|
||||
*
|
||||
* sym
|
||||
* +-A
|
||||
* +-B
|
||||
* +-C
|
||||
* ...
|
||||
*
|
||||
* This also works recursively, giving the following structure
|
||||
* if A is a symbol and B depends on A:
|
||||
*
|
||||
* sym
|
||||
* +-A
|
||||
* | +-B
|
||||
* +-C
|
||||
* ...
|
||||
*/
|
||||
|
||||
basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
|
||||
basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
|
||||
basedep = expr_eliminate_dups(expr_transform(basedep));
|
||||
|
||||
/* Examine consecutive elements after sym */
|
||||
last_menu = NULL;
|
||||
for (menu = parent->next; menu; menu = menu->next) {
|
||||
dep = menu->prompt ? menu->prompt->visible.expr : menu->dep;
|
||||
if (!expr_contains_symbol(dep, sym))
|
||||
/* No dependency, quit */
|
||||
break;
|
||||
if (expr_depends_symbol(dep, sym))
|
||||
/* Absolute dependency, put in submenu */
|
||||
goto next;
|
||||
|
||||
/*
|
||||
* Also consider it a dependency on sym if our
|
||||
* dependencies contain sym and are a "superset" of
|
||||
* sym's dependencies, e.g. '(sym || Q) && R' when sym
|
||||
* depends on R.
|
||||
*
|
||||
* Note that 'R' might be from an enclosing menu or if,
|
||||
* making this a more common case than it might seem.
|
||||
*/
|
||||
dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no);
|
||||
dep = expr_eliminate_dups(expr_transform(dep));
|
||||
dep2 = expr_copy(basedep);
|
||||
expr_eliminate_eq(&dep, &dep2);
|
||||
expr_free(dep);
|
||||
if (!expr_is_yes(dep2)) {
|
||||
/* Not superset, quit */
|
||||
expr_free(dep2);
|
||||
break;
|
||||
}
|
||||
/* Superset, put in submenu */
|
||||
expr_free(dep2);
|
||||
next:
|
||||
menu_finalize(menu);
|
||||
menu->parent = parent;
|
||||
last_menu = menu;
|
||||
}
|
||||
expr_free(basedep);
|
||||
if (last_menu) {
|
||||
parent->list = parent->next;
|
||||
parent->next = last_menu->next;
|
||||
@@ -409,6 +535,35 @@ void menu_finalize(struct menu *parent)
|
||||
*ep = expr_alloc_one(E_LIST, NULL);
|
||||
(*ep)->right.sym = menu->sym;
|
||||
}
|
||||
|
||||
/*
|
||||
* This code serves two purposes:
|
||||
*
|
||||
* (1) Flattening 'if' blocks, which do not specify a submenu
|
||||
* and only add dependencies.
|
||||
*
|
||||
* (Automatic submenu creation might still create a submenu
|
||||
* from an 'if' before this code runs.)
|
||||
*
|
||||
* (2) "Undoing" any automatic submenus created earlier below
|
||||
* promptless symbols.
|
||||
*
|
||||
* Before:
|
||||
*
|
||||
* A
|
||||
* if ... (or promptless symbol)
|
||||
* +-B
|
||||
* +-C
|
||||
* D
|
||||
*
|
||||
* After:
|
||||
*
|
||||
* A
|
||||
* if ... (or promptless symbol)
|
||||
* B
|
||||
* C
|
||||
* D
|
||||
*/
|
||||
if (menu->list && (!menu->prompt || !menu->prompt->text)) {
|
||||
for (last_menu = menu->list; ; last_menu = last_menu->next) {
|
||||
last_menu->parent = parent;
|
||||
@@ -433,6 +588,15 @@ void menu_finalize(struct menu *parent)
|
||||
sym->flags |= SYMBOL_WARNED;
|
||||
}
|
||||
|
||||
/*
|
||||
* For non-optional choices, add a reverse dependency (corresponding to
|
||||
* a select) of '<visibility> && m'. This prevents the user from
|
||||
* setting the choice mode to 'n' when the choice is visible.
|
||||
*
|
||||
* This would also work for non-choice symbols, but only non-optional
|
||||
* choices clear SYMBOL_OPTIONAL as of writing. Choices are implemented
|
||||
* as a type of symbol.
|
||||
*/
|
||||
if (sym && !sym_is_optional(sym) && parent->prompt) {
|
||||
sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
|
||||
expr_alloc_and(parent->prompt->visible.expr,
|
||||
@@ -474,7 +638,7 @@ bool menu_is_visible(struct menu *menu)
|
||||
|
||||
if (menu->visibility) {
|
||||
if (expr_calc_value(menu->visibility) == no)
|
||||
return no;
|
||||
return false;
|
||||
}
|
||||
|
||||
sym = menu->sym;
|
||||
@@ -545,7 +709,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
|
||||
{
|
||||
int i, j;
|
||||
struct menu *submenu[8], *menu, *location = NULL;
|
||||
struct jump_key *jump;
|
||||
struct jump_key *jump = NULL;
|
||||
|
||||
str_printf(r, _("Prompt: %s\n"), _(prop->text));
|
||||
menu = prop->menu->parent;
|
||||
@@ -583,7 +747,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
|
||||
str_printf(r, _(" Location:\n"));
|
||||
for (j = 4; --i >= 0; j += 2) {
|
||||
menu = submenu[i];
|
||||
if (head && location && menu == location)
|
||||
if (jump && menu == location)
|
||||
jump->offset = strlen(r->s);
|
||||
str_printf(r, "%*c-> %s", j, ' ',
|
||||
_(menu_get_prompt(menu)));
|
||||
@@ -609,13 +773,30 @@ static struct property *get_symbol_prop(struct symbol *sym)
|
||||
return prop;
|
||||
}
|
||||
|
||||
static void get_symbol_props_str(struct gstr *r, struct symbol *sym,
|
||||
enum prop_type tok, const char *prefix)
|
||||
{
|
||||
bool hit = false;
|
||||
struct property *prop;
|
||||
|
||||
for_all_properties(sym, prop, tok) {
|
||||
if (!hit) {
|
||||
str_append(r, prefix);
|
||||
hit = true;
|
||||
} else
|
||||
str_printf(r, " && ");
|
||||
expr_gstr_print(prop->expr, r);
|
||||
}
|
||||
if (hit)
|
||||
str_append(r, "\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* head is optional and may be NULL
|
||||
*/
|
||||
void get_symbol_str(struct gstr *r, struct symbol *sym,
|
||||
static void get_symbol_str(struct gstr *r, struct symbol *sym,
|
||||
struct list_head *head)
|
||||
{
|
||||
bool hit;
|
||||
struct property *prop;
|
||||
|
||||
if (sym && sym->name) {
|
||||
@@ -645,22 +826,20 @@ void get_symbol_str(struct gstr *r, struct symbol *sym,
|
||||
}
|
||||
}
|
||||
|
||||
hit = false;
|
||||
for_all_properties(sym, prop, P_SELECT) {
|
||||
if (!hit) {
|
||||
str_append(r, " Selects: ");
|
||||
hit = true;
|
||||
} else
|
||||
str_printf(r, " && ");
|
||||
expr_gstr_print(prop->expr, r);
|
||||
}
|
||||
if (hit)
|
||||
str_append(r, "\n");
|
||||
get_symbol_props_str(r, sym, P_SELECT, _(" Selects: "));
|
||||
if (sym->rev_dep.expr) {
|
||||
str_append(r, _(" Selected by: "));
|
||||
expr_gstr_print(sym->rev_dep.expr, r);
|
||||
str_append(r, "\n");
|
||||
expr_gstr_print_revdep(sym->rev_dep.expr, r, yes, " Selected by [y]:\n");
|
||||
expr_gstr_print_revdep(sym->rev_dep.expr, r, mod, " Selected by [m]:\n");
|
||||
expr_gstr_print_revdep(sym->rev_dep.expr, r, no, " Selected by [n]:\n");
|
||||
}
|
||||
|
||||
get_symbol_props_str(r, sym, P_IMPLY, _(" Implies: "));
|
||||
if (sym->implied.expr) {
|
||||
expr_gstr_print_revdep(sym->implied.expr, r, yes, " Implied by [y]:\n");
|
||||
expr_gstr_print_revdep(sym->implied.expr, r, mod, " Implied by [m]:\n");
|
||||
expr_gstr_print_revdep(sym->implied.expr, r, no, " Implied by [n]:\n");
|
||||
}
|
||||
|
||||
str_append(r, "\n\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -32,14 +32,18 @@ usage() {
|
||||
echo " -m only merge the fragments, do not execute the make command"
|
||||
echo " -n use allnoconfig instead of alldefconfig"
|
||||
echo " -r list redundant entries when merging fragments"
|
||||
echo " -O dir to put generated output files"
|
||||
echo " -O dir to put generated output files. Consider setting \$KCONFIG_CONFIG instead."
|
||||
echo " -e colon-separated list of br2-external trees to use (optional)"
|
||||
echo
|
||||
echo "Used prefix: '$CONFIG_PREFIX'. You can redefine it with \$CONFIG_
|
||||
environment variable."
|
||||
}
|
||||
|
||||
MAKE=true
|
||||
RUNMAKE=true
|
||||
ALLTARGET=alldefconfig
|
||||
WARNREDUN=false
|
||||
OUTPUT=.
|
||||
CONFIG_PREFIX=${CONFIG_-CONFIG_}
|
||||
|
||||
while true; do
|
||||
case $1 in
|
||||
@@ -49,7 +53,7 @@ while true; do
|
||||
continue
|
||||
;;
|
||||
"-m")
|
||||
MAKE=false
|
||||
RUNMAKE=false
|
||||
shift
|
||||
continue
|
||||
;;
|
||||
@@ -83,44 +87,66 @@ while true; do
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "$#" -lt 1 ] ; then
|
||||
usage
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ -z "$KCONFIG_CONFIG" ]; then
|
||||
if [ "$OUTPUT" != . ]; then
|
||||
KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
|
||||
else
|
||||
KCONFIG_CONFIG=.config
|
||||
fi
|
||||
fi
|
||||
|
||||
INITFILE=$1
|
||||
shift;
|
||||
|
||||
if [ ! -r "$INITFILE" ]; then
|
||||
echo "The base file '$INITFILE' does not exist. Exit." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
MERGE_LIST=$*
|
||||
SED_CONFIG_EXP="s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p"
|
||||
SED_CONFIG_EXP1="s/^\(${CONFIG_PREFIX}[a-zA-Z0-9_]*\)=.*/\1/p"
|
||||
SED_CONFIG_EXP2="s/^# \(${CONFIG_PREFIX}[a-zA-Z0-9_]*\) is not set$/\1/p"
|
||||
|
||||
TMP_FILE=$(mktemp -t .tmp.config.XXXXXXXXXX)
|
||||
|
||||
echo "Using $INITFILE as base"
|
||||
cat $INITFILE > $TMP_FILE
|
||||
|
||||
# Merge files, printing warnings on overrided values
|
||||
# Merge files, printing warnings on overridden values
|
||||
for MERGE_FILE in $MERGE_LIST ; do
|
||||
echo "Merging $MERGE_FILE"
|
||||
CFG_LIST=$(sed -n "$SED_CONFIG_EXP" $MERGE_FILE)
|
||||
if [ ! -r "$MERGE_FILE" ]; then
|
||||
echo "The merge file '$MERGE_FILE' does not exist. Exit." >&2
|
||||
exit 1
|
||||
fi
|
||||
CFG_LIST=$(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $MERGE_FILE)
|
||||
|
||||
for CFG in $CFG_LIST ; do
|
||||
grep -q -w $CFG $TMP_FILE
|
||||
if [ $? -eq 0 ] ; then
|
||||
PREV_VAL=$(grep -w $CFG $TMP_FILE)
|
||||
NEW_VAL=$(grep -w $CFG $MERGE_FILE)
|
||||
if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
|
||||
grep -q -w $CFG $TMP_FILE || continue
|
||||
PREV_VAL=$(grep -w $CFG $TMP_FILE)
|
||||
NEW_VAL=$(grep -w $CFG $MERGE_FILE)
|
||||
if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
|
||||
echo Value of $CFG is redefined by fragment $MERGE_FILE:
|
||||
echo Previous value: $PREV_VAL
|
||||
echo New value: $NEW_VAL
|
||||
echo
|
||||
elif [ "$WARNREDUN" = "true" ]; then
|
||||
elif [ "$WARNREDUN" = "true" ]; then
|
||||
echo Value of $CFG is redundant by fragment $MERGE_FILE:
|
||||
fi
|
||||
sed -i "/$CFG[ =]/d" $TMP_FILE
|
||||
fi
|
||||
sed -i "/$CFG[ =]/d" $TMP_FILE
|
||||
done
|
||||
cat $MERGE_FILE >> $TMP_FILE
|
||||
done
|
||||
|
||||
if [ "$MAKE" = "false" ]; then
|
||||
cp $TMP_FILE $OUTPUT/.config
|
||||
if [ "$RUNMAKE" = "false" ]; then
|
||||
cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG"
|
||||
echo "#"
|
||||
echo "# merged configuration written to $OUTPUT/.config (needs make)"
|
||||
echo "# merged configuration written to $KCONFIG_CONFIG (needs make)"
|
||||
echo "#"
|
||||
clean_up
|
||||
exit
|
||||
@@ -141,10 +167,10 @@ make KCONFIG_ALLCONFIG=$TMP_FILE $EXTERNAL_ARG $OUTPUT_ARG $ALLTARGET
|
||||
|
||||
|
||||
# Check all specified config values took (might have missed-dependency issues)
|
||||
for CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do
|
||||
for CFG in $(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $TMP_FILE); do
|
||||
|
||||
REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE)
|
||||
ACTUAL_VAL=$(grep -w -e "$CFG" $OUTPUT/.config)
|
||||
ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG")
|
||||
if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then
|
||||
echo "Value requested for $CFG not in final .config"
|
||||
echo "Requested value: $REQUESTED_VAL"
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
* Derived from menuconfig.
|
||||
*
|
||||
*/
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -269,7 +271,7 @@ static struct mitem k_menu_items[MAX_MENU_ITEMS];
|
||||
static int items_num;
|
||||
static int global_exit;
|
||||
/* the currently selected button */
|
||||
const char *current_instructions = menu_instructions;
|
||||
static const char *current_instructions = menu_instructions;
|
||||
|
||||
static char *dialog_input_result;
|
||||
static int dialog_input_result_len;
|
||||
@@ -303,7 +305,7 @@ struct function_keys {
|
||||
};
|
||||
|
||||
static const int function_keys_num = 9;
|
||||
struct function_keys function_keys[] = {
|
||||
static struct function_keys function_keys[] = {
|
||||
{
|
||||
.key_str = "F1",
|
||||
.func = "Help",
|
||||
@@ -506,7 +508,7 @@ static int get_mext_match(const char *match_str, match_f flag)
|
||||
index = (index + items_num) % items_num;
|
||||
while (true) {
|
||||
char *str = k_menu_items[index].str;
|
||||
if (strcasestr(str, match_str) != 0)
|
||||
if (strcasestr(str, match_str) != NULL)
|
||||
return index;
|
||||
if (flag == FIND_NEXT_MATCH_UP ||
|
||||
flag == MATCH_TINKER_PATTERN_UP)
|
||||
@@ -1065,7 +1067,7 @@ static int do_match(int key, struct match_state *state, int *ans)
|
||||
|
||||
static void conf(struct menu *menu)
|
||||
{
|
||||
struct menu *submenu = 0;
|
||||
struct menu *submenu = NULL;
|
||||
const char *prompt = menu_get_prompt(menu);
|
||||
struct symbol *sym;
|
||||
int res;
|
||||
@@ -1232,7 +1234,7 @@ static void show_help(struct menu *menu)
|
||||
static void conf_choice(struct menu *menu)
|
||||
{
|
||||
const char *prompt = _(menu_get_prompt(menu));
|
||||
struct menu *child = 0;
|
||||
struct menu *child = NULL;
|
||||
struct symbol *active;
|
||||
int selected_index = 0;
|
||||
int last_top_row = 0;
|
||||
@@ -1454,7 +1456,7 @@ static void conf_save(void)
|
||||
}
|
||||
}
|
||||
|
||||
void setup_windows(void)
|
||||
static void setup_windows(void)
|
||||
{
|
||||
int lines, columns;
|
||||
|
||||
@@ -1482,6 +1484,11 @@ int main(int ac, char **av)
|
||||
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||
textdomain(PACKAGE);
|
||||
|
||||
if (ac > 1 && strcmp(av[1], "-s") == 0) {
|
||||
/* Silence conf_read() until the real callback is set up */
|
||||
conf_set_message_callback(NULL);
|
||||
av++;
|
||||
}
|
||||
conf_parse(av[1]);
|
||||
conf_read(NULL);
|
||||
|
||||
@@ -1554,4 +1561,3 @@ int main(int ac, char **av)
|
||||
endwin();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
*
|
||||
*/
|
||||
#include "nconf.h"
|
||||
#include "lkc.h"
|
||||
|
||||
/* a list of all the different widgets we use */
|
||||
attributes_t attributes[ATTR_MAX+1] = {0};
|
||||
@@ -129,7 +130,7 @@ static void no_colors_theme(void)
|
||||
mkattrn(FUNCTION_TEXT, A_REVERSE);
|
||||
}
|
||||
|
||||
void set_colors()
|
||||
void set_colors(void)
|
||||
{
|
||||
start_color();
|
||||
use_default_colors();
|
||||
@@ -192,7 +193,7 @@ const char *get_line(const char *text, int line_no)
|
||||
int lines = 0;
|
||||
|
||||
if (!text)
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
for (i = 0; text[i] != '\0' && lines < line_no; i++)
|
||||
if (text[i] == '\n')
|
||||
@@ -364,15 +365,17 @@ int dialog_inputbox(WINDOW *main_window,
|
||||
WINDOW *prompt_win;
|
||||
WINDOW *form_win;
|
||||
PANEL *panel;
|
||||
int i, x, y;
|
||||
int i, x, y, lines, columns, win_lines, win_cols;
|
||||
int res = -1;
|
||||
int cursor_position = strlen(init);
|
||||
int cursor_form_win;
|
||||
char *result = *resultp;
|
||||
|
||||
getmaxyx(stdscr, lines, columns);
|
||||
|
||||
if (strlen(init)+1 > *result_len) {
|
||||
*result_len = strlen(init)+1;
|
||||
*resultp = result = realloc(result, *result_len);
|
||||
*resultp = result = xrealloc(result, *result_len);
|
||||
}
|
||||
|
||||
/* find the widest line of msg: */
|
||||
@@ -386,14 +389,19 @@ int dialog_inputbox(WINDOW *main_window,
|
||||
if (title)
|
||||
prompt_width = max(prompt_width, strlen(title));
|
||||
|
||||
win_lines = min(prompt_lines+6, lines-2);
|
||||
win_cols = min(prompt_width+7, columns-2);
|
||||
prompt_lines = max(win_lines-6, 0);
|
||||
prompt_width = max(win_cols-7, 0);
|
||||
|
||||
/* place dialog in middle of screen */
|
||||
y = (getmaxy(stdscr)-(prompt_lines+4))/2;
|
||||
x = (getmaxx(stdscr)-(prompt_width+4))/2;
|
||||
y = (lines-win_lines)/2;
|
||||
x = (columns-win_cols)/2;
|
||||
|
||||
strncpy(result, init, *result_len);
|
||||
|
||||
/* create the windows */
|
||||
win = newwin(prompt_lines+6, prompt_width+7, y, x);
|
||||
win = newwin(win_lines, win_cols, y, x);
|
||||
prompt_win = derwin(win, prompt_lines+1, prompt_width, 2, 2);
|
||||
form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2);
|
||||
keypad(form_win, TRUE);
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <locale.h>
|
||||
#include <curses.h>
|
||||
#include <ncurses.h>
|
||||
#include <menu.h>
|
||||
#include <panel.h>
|
||||
#include <form.h>
|
||||
@@ -24,8 +24,6 @@
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "ncurses.h"
|
||||
|
||||
#define max(a, b) ({\
|
||||
typeof(a) _a = a;\
|
||||
typeof(b) _b = b;\
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
|
||||
Index: kconfig/gconf.glade
|
||||
===================================================================
|
||||
--- kconfig.orig/gconf.glade 2013-12-27 22:14:32.395629843 +0100
|
||||
+++ kconfig/gconf.glade 2013-12-27 22:14:32.387630158 +0100
|
||||
--- kconfig.orig/gconf.glade
|
||||
+++ kconfig/gconf.glade
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
<widget class="GtkWindow" id="window1">
|
||||
@@ -21,9 +21,9 @@ Index: kconfig/gconf.glade
|
||||
<property name="modal">False</property>
|
||||
Index: kconfig/mconf.c
|
||||
===================================================================
|
||||
--- kconfig.orig/mconf.c 2013-12-27 22:14:32.395629843 +0100
|
||||
+++ kconfig/mconf.c 2013-12-27 22:14:42.179244153 +0100
|
||||
@@ -176,9 +176,9 @@
|
||||
--- kconfig.orig/mconf.c
|
||||
+++ kconfig/mconf.c
|
||||
@@ -176,9 +176,9 @@ menu_instructions[] = N_(
|
||||
"Arrow keys navigate the menu. "
|
||||
"<Enter> selects submenus ---> (or empty submenus ----). "
|
||||
"Highlighted letters are hotkeys. "
|
||||
@@ -35,7 +35,7 @@ Index: kconfig/mconf.c
|
||||
radiolist_instructions[] = N_(
|
||||
"Use the arrow keys to navigate this window or "
|
||||
"press the hotkey of the item you wish to select "
|
||||
@@ -959,7 +959,7 @@
|
||||
@@ -962,7 +962,7 @@ static int handle_exit(void)
|
||||
if (conf_get_changed())
|
||||
res = dialog_yesno(NULL,
|
||||
_("Do you wish to save your new configuration?\n"
|
||||
@@ -46,44 +46,44 @@ Index: kconfig/mconf.c
|
||||
res = -1;
|
||||
Index: kconfig/zconf.tab.c_shipped
|
||||
===================================================================
|
||||
--- kconfig.orig/zconf.tab.c_shipped 2013-12-27 22:14:32.395629843 +0100
|
||||
+++ kconfig/zconf.tab.c_shipped 2013-12-27 22:14:32.391630000 +0100
|
||||
@@ -2297,7 +2297,7 @@
|
||||
--- kconfig.orig/zconf.tab.c_shipped
|
||||
+++ kconfig/zconf.tab.c_shipped
|
||||
@@ -1515,7 +1515,7 @@ yyreduce:
|
||||
* later regardless of whether it comes from the 'prompt' in
|
||||
* mainmenu_stmt or here
|
||||
*/
|
||||
- menu_add_prompt(P_MENU, xstrdup("Linux Kernel Configuration"), NULL);
|
||||
+ menu_add_prompt(P_MENU, xstrdup("Buildroot Configuration"), NULL);
|
||||
}
|
||||
|
||||
sym_init();
|
||||
_menu_init();
|
||||
- rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
|
||||
+ rootmenu.prompt = menu_add_prompt(P_MENU, "Buildroot Configuration", NULL);
|
||||
|
||||
if (getenv("ZCONF_DEBUG"))
|
||||
zconfdebug = 1;
|
||||
break;
|
||||
Index: kconfig/zconf.y
|
||||
===================================================================
|
||||
--- kconfig.orig/zconf.y 2013-12-27 22:14:32.395629843 +0100
|
||||
+++ kconfig/zconf.y 2013-12-27 22:14:32.391630000 +0100
|
||||
@@ -493,7 +493,7 @@
|
||||
--- kconfig.orig/zconf.y
|
||||
+++ kconfig/zconf.y
|
||||
@@ -127,7 +127,7 @@ no_mainmenu_stmt: /* empty */
|
||||
* later regardless of whether it comes from the 'prompt' in
|
||||
* mainmenu_stmt or here
|
||||
*/
|
||||
- menu_add_prompt(P_MENU, xstrdup("Linux Kernel Configuration"), NULL);
|
||||
+ menu_add_prompt(P_MENU, xstrdup("Buildroot Configuration"), NULL);
|
||||
};
|
||||
|
||||
sym_init();
|
||||
_menu_init();
|
||||
- rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
|
||||
+ rootmenu.prompt = menu_add_prompt(P_MENU, "Buildroot Configuration", NULL);
|
||||
|
||||
if (getenv("ZCONF_DEBUG"))
|
||||
zconfdebug = 1;
|
||||
Index: kconfig/confdata.c
|
||||
===================================================================
|
||||
--- kconfig.orig/confdata.c 2013-12-27 22:14:32.395629843 +0100
|
||||
+++ kconfig/confdata.c 2013-12-27 22:14:32.391630000 +0100
|
||||
@@ -25,7 +25,7 @@
|
||||
--- kconfig.orig/confdata.c
|
||||
+++ kconfig/confdata.c
|
||||
@@ -30,7 +30,7 @@ static void conf_message(const char *fmt
|
||||
static const char *conf_filename;
|
||||
static int conf_lineno, conf_warnings, conf_unsaved;
|
||||
static int conf_lineno, conf_warnings;
|
||||
|
||||
-const char conf_defname[] = "arch/$ARCH/defconfig";
|
||||
+const char conf_defname[] = ".defconfig";
|
||||
|
||||
static void conf_warning(const char *fmt, ...)
|
||||
{
|
||||
@@ -63,7 +63,7 @@
|
||||
@@ -69,7 +69,7 @@ static void conf_message(const char *fmt
|
||||
|
||||
const char *conf_get_configname(void)
|
||||
{
|
||||
@@ -94,9 +94,9 @@ Index: kconfig/confdata.c
|
||||
}
|
||||
Index: kconfig/qconf.cc
|
||||
===================================================================
|
||||
--- kconfig.orig/qconf.cc 2013-12-27 22:12:15.825013567 +0100
|
||||
+++ kconfig/qconf.cc 2013-12-27 22:14:57.826627300 +0100
|
||||
@@ -70,7 +70,7 @@
|
||||
--- kconfig.orig/qconf.cc
|
||||
+++ kconfig/qconf.cc
|
||||
@@ -55,7 +55,7 @@ static inline QString qgettext(const QSt
|
||||
}
|
||||
|
||||
ConfigSettings::ConfigSettings()
|
||||
|
||||
@@ -1,35 +1,74 @@
|
||||
---
|
||||
Makefile | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
Index: b/Makefile
|
||||
Index: kconfig/Makefile
|
||||
===================================================================
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -159,11 +159,11 @@
|
||||
--- kconfig.orig/Makefile
|
||||
+++ kconfig/Makefile
|
||||
@@ -205,7 +205,35 @@ qconf-cxxobjs := qconf.o
|
||||
qconf-objs := zconf.tab.o
|
||||
gconf-objs := gconf.o zconf.tab.o
|
||||
|
||||
hostprogs-y := conf
|
||||
|
||||
-ifeq ($(MAKECMDGOALS),nconfig)
|
||||
-hostprogs-y := conf nconf mconf kxgettext qconf gconf
|
||||
+hostprogs-y := conf
|
||||
+
|
||||
+ifeq ($(MAKECMDGOALS),nconf)
|
||||
hostprogs-y += nconf
|
||||
endif
|
||||
|
||||
-ifeq ($(MAKECMDGOALS),menuconfig)
|
||||
+ hostprogs-y += nconf
|
||||
+endif
|
||||
+
|
||||
+ifeq ($(MAKECMDGOALS),mconf)
|
||||
hostprogs-y += mconf
|
||||
endif
|
||||
+ hostprogs-y += mconf
|
||||
+endif
|
||||
+
|
||||
+ifeq ($(MAKECMDGOALS),update-po-config)
|
||||
+ hostprogs-y += kxgettext
|
||||
+endif
|
||||
+
|
||||
+ifeq ($(MAKECMDGOALS),qconf)
|
||||
+ qconf-target := 1
|
||||
+endif
|
||||
+
|
||||
+ifeq ($(MAKECMDGOALS),gconf)
|
||||
+ gconf-target := 1
|
||||
+endif
|
||||
+
|
||||
+ifeq ($(qconf-target),1)
|
||||
+ hostprogs-y += qconf
|
||||
+endif
|
||||
+
|
||||
+ifeq ($(gconf-target),1)
|
||||
+ hostprogs-y += gconf
|
||||
+endif
|
||||
|
||||
@@ -171,10 +171,10 @@
|
||||
hostprogs-y += kxgettext
|
||||
endif
|
||||
targets += zconf.lex.c
|
||||
clean-files := qconf.moc .tmp_qtcheck .tmp_gtkcheck
|
||||
@@ -243,7 +271,7 @@ HOSTLOADLIBES_nconf = $(shell \
|
||||
|| echo "-lmenu -lpanel -lncurses" )
|
||||
$(obj)/qconf.o: $(obj)/.tmp_qtcheck
|
||||
|
||||
-ifeq ($(MAKECMDGOALS),xconfig)
|
||||
+ifeq ($(MAKECMDGOALS),qconf)
|
||||
qconf-target := 1
|
||||
endif
|
||||
-ifeq ($(MAKECMDGOALS),gconfig)
|
||||
+ifeq ($(MAKECMDGOALS),gconf)
|
||||
gconf-target := 1
|
||||
$(obj)/.tmp_qtcheck: $(src)/Makefile
|
||||
-include $(obj)/.tmp_qtcheck
|
||||
|
||||
@@ -270,9 +298,8 @@ $(obj)/.tmp_qtcheck:
|
||||
echo "KC_QT_MOC=$$moc" >> $@
|
||||
endif
|
||||
|
||||
+ifeq ($(MAKECMDGOALS),gconf)
|
||||
$(obj)/gconf.o: $(obj)/.tmp_gtkcheck
|
||||
-
|
||||
-ifeq ($(MAKECMDGOALS),gconfig)
|
||||
-include $(obj)/.tmp_gtkcheck
|
||||
|
||||
# GTK+ needs some extra effort, too...
|
||||
@@ -300,11 +327,8 @@ $(obj)/zconf.tab.o: $(obj)/zconf.lex.c
|
||||
|
||||
$(obj)/qconf.o: $(obj)/qconf.moc
|
||||
|
||||
-quiet_cmd_moc = MOC $@
|
||||
- cmd_moc = $(KC_QT_MOC) -i $< -o $@
|
||||
-
|
||||
$(obj)/%.moc: $(src)/%.h $(obj)/.tmp_qtcheck
|
||||
- $(call cmd,moc)
|
||||
+ $(KC_QT_MOC) -i $< -o $@
|
||||
|
||||
# Extract gconf menu items for i18n support
|
||||
$(obj)/gconf.glade.h: $(obj)/gconf.glade
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
foo.h | 12 ++++++++++++
|
||||
2 files changed, 65 insertions(+)
|
||||
|
||||
Index: b/Makefile.br
|
||||
Index: kconfig/Makefile.br
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ b/Makefile.br
|
||||
+++ kconfig/Makefile.br
|
||||
@@ -0,0 +1,53 @@
|
||||
+src := .
|
||||
+top_srcdir=../../
|
||||
@@ -61,10 +61,10 @@ Index: b/Makefile.br
|
||||
+
|
||||
+FORCE:
|
||||
+.PHONY: FORCE clean distclean
|
||||
Index: b/foo.h
|
||||
Index: kconfig/foo.h
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ b/foo.h
|
||||
+++ kconfig/foo.h
|
||||
@@ -0,0 +1,12 @@
|
||||
+#ifndef __KCONFIG_FOO_H
|
||||
+#define __KCONFIG_FOO_H
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
lxdialog/check-lxdialog.sh | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
Index: b/lxdialog/check-lxdialog.sh
|
||||
Index: kconfig/lxdialog/check-lxdialog.sh
|
||||
===================================================================
|
||||
--- a/lxdialog/check-lxdialog.sh
|
||||
+++ b/lxdialog/check-lxdialog.sh
|
||||
@@ -36,7 +36,7 @@
|
||||
--- kconfig.orig/lxdialog/check-lxdialog.sh
|
||||
+++ kconfig/lxdialog/check-lxdialog.sh
|
||||
@@ -41,7 +41,7 @@ ccflags()
|
||||
}
|
||||
|
||||
# Temp file, try to clean up after us
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
gconf.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
Index: b/gconf.c
|
||||
Index: kconfig/gconf.c
|
||||
===================================================================
|
||||
--- a/gconf.c
|
||||
+++ b/gconf.c
|
||||
@@ -1486,7 +1486,7 @@
|
||||
--- kconfig.orig/gconf.c
|
||||
+++ kconfig/gconf.c
|
||||
@@ -1462,7 +1462,7 @@ int main(int ac, char *av[])
|
||||
/* Determine GUI path */
|
||||
env = getenv(SRCTREE);
|
||||
if (env)
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
util.c | 16 +++++++++++++--
|
||||
3 files changed, 61 insertions(+), 18 deletions(-)
|
||||
|
||||
Index: b/conf.c
|
||||
Index: kconfig/conf.c
|
||||
===================================================================
|
||||
--- a/conf.c
|
||||
+++ b/conf.c
|
||||
@@ -558,7 +558,6 @@
|
||||
--- kconfig.orig/conf.c
|
||||
+++ kconfig/conf.c
|
||||
@@ -565,7 +565,6 @@ int main(int ac, char **av)
|
||||
}
|
||||
name = av[optind];
|
||||
conf_parse(name);
|
||||
@@ -16,10 +16,10 @@ Index: b/conf.c
|
||||
if (sync_kconfig) {
|
||||
name = conf_get_configname();
|
||||
if (stat(name, &tmpstat)) {
|
||||
Index: b/confdata.c
|
||||
Index: kconfig/confdata.c
|
||||
===================================================================
|
||||
--- a/confdata.c
|
||||
+++ b/confdata.c
|
||||
--- kconfig.orig/confdata.c
|
||||
+++ kconfig/confdata.c
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
@@ -28,7 +28,7 @@ Index: b/confdata.c
|
||||
|
||||
#include "lkc.h"
|
||||
|
||||
@@ -70,9 +71,7 @@
|
||||
@@ -76,9 +77,7 @@ const char *conf_get_configname(void)
|
||||
|
||||
const char *conf_get_autoconfig_name(void)
|
||||
{
|
||||
@@ -39,7 +39,7 @@ Index: b/confdata.c
|
||||
}
|
||||
|
||||
static char *conf_expand_value(const char *in)
|
||||
@@ -742,6 +741,9 @@
|
||||
@@ -748,6 +747,9 @@ int conf_write(const char *name)
|
||||
char dirname[PATH_MAX+1], tmpname[PATH_MAX+1], newname[PATH_MAX+1];
|
||||
char *env;
|
||||
|
||||
@@ -49,7 +49,7 @@ Index: b/confdata.c
|
||||
dirname[0] = 0;
|
||||
if (name && name[0]) {
|
||||
struct stat st;
|
||||
@@ -836,6 +838,7 @@
|
||||
@@ -842,6 +844,7 @@ static int conf_split_config(void)
|
||||
{
|
||||
const char *name;
|
||||
char path[PATH_MAX+1];
|
||||
@@ -57,9 +57,9 @@ Index: b/confdata.c
|
||||
char *s, *d, c;
|
||||
struct symbol *sym;
|
||||
struct stat sb;
|
||||
@@ -844,8 +847,20 @@
|
||||
name = conf_get_autoconfig_name();
|
||||
@@ -851,8 +854,20 @@ static int conf_split_config(void)
|
||||
conf_read_simple(name, S_DEF_AUTO);
|
||||
sym_calc_value(modules_sym);
|
||||
|
||||
- if (chdir("include/config"))
|
||||
- return 1;
|
||||
@@ -80,7 +80,7 @@ Index: b/confdata.c
|
||||
|
||||
res = 0;
|
||||
for_all_symbols(i, sym) {
|
||||
@@ -938,9 +953,11 @@
|
||||
@@ -945,9 +960,11 @@ static int conf_split_config(void)
|
||||
close(fd);
|
||||
}
|
||||
out:
|
||||
@@ -95,7 +95,7 @@ Index: b/confdata.c
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -950,25 +967,38 @@
|
||||
@@ -957,25 +974,38 @@ int conf_write_autoconf(void)
|
||||
const char *name;
|
||||
FILE *out, *tristate, *out_h;
|
||||
int i;
|
||||
@@ -138,7 +138,7 @@ Index: b/confdata.c
|
||||
if (!out_h) {
|
||||
fclose(out);
|
||||
fclose(tristate);
|
||||
@@ -1000,19 +1030,22 @@
|
||||
@@ -1007,19 +1037,22 @@ int conf_write_autoconf(void)
|
||||
name = getenv("KCONFIG_AUTOHEADER");
|
||||
if (!name)
|
||||
name = "include/generated/autoconf.h";
|
||||
@@ -164,11 +164,11 @@ Index: b/confdata.c
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
Index: b/util.c
|
||||
Index: kconfig/util.c
|
||||
===================================================================
|
||||
--- a/util.c
|
||||
+++ b/util.c
|
||||
@@ -34,6 +34,8 @@
|
||||
--- kconfig.orig/util.c
|
||||
+++ kconfig/util.c
|
||||
@@ -34,6 +34,8 @@ struct file *file_lookup(const char *nam
|
||||
/* write a dependency file as used by kbuild to track dependencies */
|
||||
int file_write_dep(const char *name)
|
||||
{
|
||||
@@ -177,7 +177,7 @@ Index: b/util.c
|
||||
struct symbol *sym, *env_sym;
|
||||
struct expr *e;
|
||||
struct file *file;
|
||||
@@ -41,7 +43,16 @@
|
||||
@@ -41,7 +43,16 @@ int file_write_dep(const char *name)
|
||||
|
||||
if (!name)
|
||||
name = ".kconfig.d";
|
||||
@@ -195,7 +195,7 @@ Index: b/util.c
|
||||
if (!out)
|
||||
return 1;
|
||||
fprintf(out, "deps_config := \\\n");
|
||||
@@ -72,7 +83,8 @@
|
||||
@@ -72,7 +83,8 @@ int file_write_dep(const char *name)
|
||||
|
||||
fprintf(out, "\n$(deps_config): ;\n");
|
||||
fclose(out);
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
Fix the rule that generates the .moc file
|
||||
|
||||
The Linux kernel has a "cmd" make function, but we don't have it in
|
||||
Buildroot, so we need to adjust this rule.
|
||||
|
||||
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
|
||||
Index: b/Makefile
|
||||
===================================================================
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -309,11 +309,8 @@
|
||||
|
||||
$(obj)/qconf.o: $(obj)/qconf.moc
|
||||
|
||||
-quiet_cmd_moc = MOC $@
|
||||
- cmd_moc = $(KC_QT_MOC) -i $< -o $@
|
||||
-
|
||||
$(obj)/%.moc: $(src)/%.h $(obj)/.tmp_qtcheck
|
||||
- $(call cmd,moc)
|
||||
+ $(KC_QT_MOC) -i $< -o $@
|
||||
|
||||
# Extract gconf menu items for I18N support
|
||||
$(obj)/gconf.glade.h: $(obj)/gconf.glade
|
||||
@@ -26,10 +26,10 @@ Date: Wed Nov 13 22:45:02 2013 +0100
|
||||
---
|
||||
Note: I'll be running this upstream soonish.
|
||||
|
||||
diff --git a/support/kconfig/lxdialog/menubox.c b/support/kconfig/lxdialog/menubox.c
|
||||
index 48d382e..6fc7e78 100644
|
||||
--- a/lxdialog/menubox.c
|
||||
+++ b/lxdialog/menubox.c
|
||||
Index: kconfig/lxdialog/menubox.c
|
||||
===================================================================
|
||||
--- kconfig.orig/lxdialog/menubox.c
|
||||
+++ kconfig/lxdialog/menubox.c
|
||||
@@ -285,7 +285,7 @@ do_resize:
|
||||
if (key < 256 && isalpha(key))
|
||||
key = tolower(key);
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
This commit added kecho to scripts/Kbuild.include (and doc).
|
||||
Backported just Kbuild.include part to Makefile
|
||||
|
||||
commit 5410ecc0def8955ab99810c5626cc7e156991896
|
||||
Author: Mike Frysinger <vapier@gentoo.org>
|
||||
Date: Thu Nov 6 03:31:34 2008 -0500
|
||||
|
||||
kbuild: introduce $(kecho) convenience echo
|
||||
|
||||
Index: kconfig/Makefile
|
||||
===================================================================
|
||||
--- kconfig.orig/Makefile
|
||||
+++ kconfig/Makefile
|
||||
@@ -6,6 +6,12 @@
|
||||
PHONY += xconfig gconfig menuconfig config syncconfig update-po-config \
|
||||
localmodconfig localyesconfig
|
||||
|
||||
+# Easy method for doing a status message
|
||||
+ kecho := :
|
||||
+ quiet_kecho := echo
|
||||
+silent_kecho := :
|
||||
+kecho := $($(quiet)kecho)
|
||||
+
|
||||
ifdef KBUILD_KCONFIG
|
||||
Kconfig := $(KBUILD_KCONFIG)
|
||||
else
|
||||
@@ -1,50 +0,0 @@
|
||||
From be8af2d54a66911693eddc556e4f7a866670082b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Bj=C3=B8rn=20Forsman?= <bjorn.forsman@gmail.com>
|
||||
Date: Sun, 14 Sep 2014 12:57:50 +0200
|
||||
Subject: [PATCH] kconfig/lxdialog: get ncurses CFLAGS with pkg-config
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This makes "make menuconfig" also work on systems where ncurses is not
|
||||
installed in a standard location (such as on NixOS).
|
||||
|
||||
This patch changes ccflags() so that it tries pkg-config first, and only
|
||||
if pkg-config fails does it go back to the fallback/manual checks. This
|
||||
is the same algorithm that ldflags() already uses.
|
||||
|
||||
Signed-off-by: Bjørn Forsman <bjorn.forsman@gmail.com>
|
||||
Signed-off-by: Michal Marek <mmarek@suse.cz>
|
||||
---
|
||||
[This patch is already applied upstream (is part of linux v3.18):
|
||||
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=be8af2d54a66911693eddc556e4f7a866670082b
|
||||
|
||||
I'm adding this instead of doing a full upstream kconfig sync because
|
||||
there was a conflict in one of the Buildroot kconfig patches (against
|
||||
linux 3.18-rc1), which I was unable to resolve. Just drop this patch next time
|
||||
Buildroot kconfig is synced against upstream.
|
||||
]
|
||||
|
||||
scripts/kconfig/lxdialog/check-lxdialog.sh | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/scripts/kconfig/lxdialog/check-lxdialog.sh b/scripts/kconfig/lxdialog/check-lxdialog.sh
|
||||
index 9d2a4c5..5075ebf 100755
|
||||
--- a/lxdialog/check-lxdialog.sh
|
||||
+++ b/lxdialog/check-lxdialog.sh
|
||||
@@ -21,7 +21,11 @@ ldflags()
|
||||
# Where is ncurses.h?
|
||||
ccflags()
|
||||
{
|
||||
- if [ -f /usr/include/ncursesw/curses.h ]; then
|
||||
+ if pkg-config --cflags ncursesw 2>/dev/null; then
|
||||
+ echo '-DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1'
|
||||
+ elif pkg-config --cflags ncurses 2>/dev/null; then
|
||||
+ echo '-DCURSES_LOC="<ncurses.h>"'
|
||||
+ elif [ -f /usr/include/ncursesw/curses.h ]; then
|
||||
echo '-I/usr/include/ncursesw -DCURSES_LOC="<curses.h>"'
|
||||
echo ' -DNCURSES_WIDECHAR=1'
|
||||
elif [ -f /usr/include/ncurses/ncurses.h ]; then
|
||||
--
|
||||
2.1.3
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user