From f596dde66c8b39eac2b023e79277301e449bebfa Mon Sep 17 00:00:00 2001 From: Pierre Labastie Date: Wed, 24 Apr 2019 16:16:20 +0000 Subject: [PATCH] Get rid of the GPLv2 license: - Replace the menu system with the Kconfiglib, which has an ISC license - Remove farce and any reference to it - Rewrite the copyright notice, add the LICENSE files - Adapt Config.in and a few other programs to the new menu system --- BLFS/Makefile | 9 +- BLFS/xsl/gen_config.xsl | 6 +- Config.in | 99 +- FUNCTION_LIST | 60 - LICENSE | 353 +- Makefile | 24 +- README | 2 - common/libs/func_compare.sh | 24 - common/libs/func_install_blfs | 1 - common/libs/func_validate_configs.sh | 3 +- extras/farce | 897 ---- extras/filelist | 60 - install-blfs-tools.sh | 5 - jhalfs | 31 +- menu/BusyBox-1.1.3-menu.patch | 507 -- menu/Kconfig-language.txt | 255 - menu/LICENSE.txt | 5 + menu/Makefile | 145 - menu/README | 4 + menu/conf.c | 571 --- menu/confdata.c | 392 -- menu/expr.c | 1099 ----- menu/expr.h | 195 - menu/kconfiglib.py | 6661 ++++++++++++++++++++++++++ menu/lex.zconf.c_shipped | 3692 -------------- menu/lkc.h | 123 - menu/lkc_proto.h | 40 - menu/lxdialog/BIG.FAT.WARNING | 4 - menu/lxdialog/checklist.c | 372 -- menu/lxdialog/colors.h | 161 - menu/lxdialog/dialog.h | 203 - menu/lxdialog/inputbox.c | 240 - menu/lxdialog/menubox.c | 442 -- menu/lxdialog/msgbox.c | 85 - menu/lxdialog/textbox.c | 555 --- menu/lxdialog/util.c | 378 -- menu/lxdialog/yesno.c | 118 - menu/mconf.c | 980 ---- menu/menu.c | 390 -- menu/menuconfig.py | 3236 +++++++++++++ menu/symbol.c | 809 ---- menu/util.c | 109 - menu/zconf.l | 366 -- menu/zconf.tab.c_shipped | 2130 -------- menu/zconf.tab.h_shipped | 125 - menu/zconf.y | 690 --- 46 files changed, 9994 insertions(+), 16662 deletions(-) delete mode 100755 extras/farce delete mode 100755 extras/filelist delete mode 100644 menu/BusyBox-1.1.3-menu.patch delete mode 100644 menu/Kconfig-language.txt create mode 100644 menu/LICENSE.txt delete mode 100644 menu/Makefile create mode 100644 menu/README delete mode 100644 menu/conf.c delete mode 100644 menu/confdata.c delete mode 100644 menu/expr.c delete mode 100644 menu/expr.h create mode 100644 menu/kconfiglib.py delete mode 100644 menu/lex.zconf.c_shipped delete mode 100644 menu/lkc.h delete mode 100644 menu/lkc_proto.h delete mode 100644 menu/lxdialog/BIG.FAT.WARNING delete mode 100644 menu/lxdialog/checklist.c delete mode 100644 menu/lxdialog/colors.h delete mode 100644 menu/lxdialog/dialog.h delete mode 100644 menu/lxdialog/inputbox.c delete mode 100644 menu/lxdialog/menubox.c delete mode 100644 menu/lxdialog/msgbox.c delete mode 100644 menu/lxdialog/textbox.c delete mode 100644 menu/lxdialog/util.c delete mode 100644 menu/lxdialog/yesno.c delete mode 100644 menu/mconf.c delete mode 100644 menu/menu.c create mode 100755 menu/menuconfig.py delete mode 100644 menu/symbol.c delete mode 100644 menu/util.c delete mode 100644 menu/zconf.l delete mode 100644 menu/zconf.tab.c_shipped delete mode 100644 menu/zconf.tab.h_shipped delete mode 100644 menu/zconf.y diff --git a/BLFS/Makefile b/BLFS/Makefile index 46ec0a4..50923b4 100644 --- a/BLFS/Makefile +++ b/BLFS/Makefile @@ -100,11 +100,9 @@ endif $(BOOK_XML): $(CONFIG_OUT) $(Q)$(TOPDIR)/gen_pkg_book.sh $(TOPDIR) $(BLFS_FULL) $(LFS_FULL) -$(CONFIG_OUT): $(CONFIG_CONFIG_IN) $(MENU)/mconf - $(Q)$(MENU)/mconf $(CONFIG_CONFIG_IN) - -$(MENU)/mconf: - $(Q)$(MAKE) -C $(MENU) ncurses conf mconf +$(CONFIG_OUT): $(CONFIG_CONFIG_IN) + $(Q)CONFIG_="" KCONFIG_CONFIG=configuration \ + $(MENU)/menuconfig.py $(CONFIG_CONFIG_IN) $(CONFIG_CONFIG_IN): $(PACK_LIST) $(XSLDIR)/gen_config.xsl $(Q)xsltproc --nonet -o $@ $(XSLDIR)/gen_config.xsl $(PACK_LIST) @@ -202,7 +200,6 @@ $(BLFS_XML): clean: rm -f $(CONFIG_OUT) $(CONFIG_OUT).old $(TOPDIR)/packages.xml $(XSLDIR)/specialCases.xsl $(CONFIG_CONFIG_IN) book.xml rm -rf $(TOPDIR)/dependencies $(TOPDIR)/book-html $(TOPDIR)/scripts - - $(MAKE) -C $(MENU) clean FORCE: .PHONY: clean all update $(CONFIG_OUT) FORCE diff --git a/BLFS/xsl/gen_config.xsl b/BLFS/xsl/gen_config.xsl index 29ef95a..ac73ee0 100644 --- a/BLFS/xsl/gen_config.xsl +++ b/BLFS/xsl/gen_config.xsl @@ -112,7 +112,7 @@ default n menu " " -depends MENU_ +depends on MENU_ @@ -140,7 +140,7 @@ depends MENU_ menu " " - depends MENU_ + depends on MENU_ @@ -187,7 +187,7 @@ depends MENU_ menu " " - depends MENU_ + depends on MENU_ diff --git a/Config.in b/Config.in index 34b74c8..08964f4 100644 --- a/Config.in +++ b/Config.in @@ -41,7 +41,7 @@ menu "BOOK Settings" endchoice choice - depends BOOK_BLFS + depends on BOOK_BLFS prompt "Init system" config BLFS_SYSV @@ -107,7 +107,7 @@ menu "BOOK Settings" config BRANCH_ID string "Branch (preceded by \"branch-\"), stable Version, or tag" default "**EDIT ME**" - depends BRANCH + depends on BRANCH help A list of valid branches and stable book IDs is available at http://wiki.linuxfromscratch.org/alfs/wiki/SupportedBooks @@ -118,7 +118,7 @@ menu "BOOK Settings" config BOOK string "Loc of working copy (mandatory)" default "**EDIT ME**" - depends WORKING_COPY + depends on WORKING_COPY help The full path to a local copy of the book XML sources @@ -128,7 +128,7 @@ menu "BOOK Settings" choice prompt "Target architecture" default ARCH_X86 - depends BOOK_CLFS || BOOK_CLFS2 || BOOK_CLFS3 + depends on BOOK_CLFS || BOOK_CLFS2 || BOOK_CLFS3 help Choose the target system base architecture @@ -156,7 +156,7 @@ menu "BOOK Settings" choice prompt "Hardware Platform" - depends BOOK_CLFS3 && ARCH_MIPS + depends on BOOK_CLFS3 && ARCH_MIPS default PLATFORM_GENERIC help Choose a destination platform @@ -171,7 +171,7 @@ menu "BOOK Settings" choice prompt "Library" - depends (BOOK_CLFS && !ARCH_ALPHA) || (BOOK_CLFS3 && ARCH_MIPS) + depends on (BOOK_CLFS && !ARCH_ALPHA) || (BOOK_CLFS3 && ARCH_MIPS) default DATA_32 help Choose the target system libraries type @@ -188,7 +188,7 @@ menu "BOOK Settings" choice prompt "Processor type" - depends (BOOK_CLFS || BOOK_CLFS2 || BOOK_CLFS3) && ((ARCH_X86 && !(DATA_64 || DATA_MULTI)) || ARCH_MIPS || ARCH_HPPA || ARCH_ALPHA || (ARCH_SPARC && (DATA_64 || DATA_MULTI)) || (ARCH_ARM && BOOK_CLFS3)) + depends on (BOOK_CLFS || BOOK_CLFS2 || BOOK_CLFS3) && ((ARCH_X86 && !(DATA_64 || DATA_MULTI)) || ARCH_MIPS || ARCH_HPPA || ARCH_ALPHA || (ARCH_SPARC && (DATA_64 || DATA_MULTI)) || (ARCH_ARM && BOOK_CLFS3)) help Choose the target system processor @@ -258,7 +258,7 @@ menu "BOOK Settings" choice prompt "MIPS 64 ABI" - depends BOOK_CLFS3 && ARCH_MIPS && DATA_64 + depends on BOOK_CLFS3 && ARCH_MIPS && DATA_64 default ABI_64 help Choose the target system ABI to use @@ -322,7 +322,7 @@ menu "BOOK Settings" config TARGET32 string - depends DATA_MULTI + depends on DATA_MULTI default "i686-pc-linux-gnu" if ARCH_X86 default "mipsel-unknown-linux-gnu" if PROC_mipsel default "mips-unknown-linux-gnu" if PROC_mips @@ -368,13 +368,13 @@ menu "BOOK Settings" config MIPS_LEVEL string - depends BOOK_CLFS3 && ARCH_MIPS + depends on BOOK_CLFS3 && ARCH_MIPS default "1" if DATA_32 default "3" if DATA_64 config ABI string - depends BOOK_CLFS3 + depends on BOOK_CLFS3 default "-m32" if ARCH_X86 || ARCH_ARM # default "-m64" if NO USED YET IN THE BOOK default "-mabi=32" if ABI_32 || (ARCH_MIPS && DATA_32) @@ -383,13 +383,13 @@ menu "BOOK Settings" config ENDIAN string - depends BOOK_CLFS3 && (ARCH_MIPS || ARCH_ARM) + depends on BOOK_CLFS3 && (ARCH_MIPS || ARCH_ARM) default "little" if PROC_mipsel || PROC_ARM || PROC_ARM5L default "big" if PROC_mips || PROC_ARM5B choice prompt "Build method" - depends BOOK_CLFS + depends on BOOK_CLFS help What build method should be used: a chroot jail or minimal boot system. Review the Cross-LFS book chap6 "TO BOOT OR CHROOT" for @@ -541,7 +541,7 @@ menu "BOOK Settings" config BLFS_XML string "BLFS sources directory (internal parameter)" default "blfs-xml" - depends BLFS_TOOL || BOOK_BLFS + depends on BLFS_TOOL || BOOK_BLFS help The directory name under $BLFS_ROOT where the BLFS book sources will be copied or checked out. Do not change that @@ -550,7 +550,7 @@ menu "BOOK Settings" config LFS_XML string "LFS sources directory (internal parameter)" default "lfs-xml" - depends BLFS_TOOL || BOOK_BLFS + depends on BLFS_TOOL || BOOK_BLFS help The directory name under $BLFS_ROOT where the LFS book sources will be copied or checked out. Do not change that @@ -558,8 +558,8 @@ menu "BOOK Settings" choice prompt "LFS Release" - default LFS_SVN - depends BOOK_BLFS + default LFS_relSVN + depends on BOOK_BLFS config LFS_relSVN bool "LFS SVN" @@ -595,7 +595,7 @@ menu "BOOK Settings" #--- Custom Tools support config CUSTOM_TOOLS - depends !BOOK_BLFS + depends on !BOOK_BLFS bool "Add custom tools support" default n help @@ -630,7 +630,7 @@ menu "BOOK Settings" endmenu menu "General Settings" -depends !BOOK_BLFS +depends on !BOOK_BLFS #--- {C,H,}LFS User Account @@ -671,7 +671,7 @@ depends !BOOK_BLFS config SRC_ARCHIVE string "Package Archive Directory" default "$SRC_ARCHIVE" - depends GETPKG + depends on GETPKG help #-- A local archive for packages/files (not $BUILDDIR/sources) # Any missing file will be downloaded and archived here, @@ -680,7 +680,7 @@ depends !BOOK_BLFS config RETRYSRCDOWNLOAD bool "Retry on 'connection refused' failure" default n - depends GETPKG + depends on GETPKG help #-- Attempt to download a source package again if it fails # with a 'connection refused' error. This can happen on @@ -689,14 +689,14 @@ depends !BOOK_BLFS config RETRYDOWNLOADCNT int "Number of retry attempts on download failures" default 20 - depends GETPKG + depends on GETPKG help #-- Number of times to retry a failed download. config DOWNLOADTIMEOUT int "Download timeout (in seconds)" default 30 - depends GETPKG + depends on GETPKG help #-- Number of seconds to wait for a download to start before # timing out. @@ -704,7 +704,7 @@ depends !BOOK_BLFS config SERVER string "FTP mirror" default "http://ftp.osuosl.org" - depends GETPKG + depends on GETPKG help #-- FTP mirror to download packages and patches if not found # in $SRC_ARCHIVE @@ -729,12 +729,12 @@ depends !BOOK_BLFS endmenu menu "Build Settings" -depends !BOOK_BLFS +depends on !BOOK_BLFS #--- Test Suites config CONFIG_TESTS bool "Run testsuites" - depends !BOOK_CLFS2 && !BOOK_CLFS3 + depends on !BOOK_CLFS2 && !BOOK_CLFS3 default y help #-- Run test suites @@ -757,7 +757,7 @@ depends !BOOK_BLFS # temporary tools phase menu "Test settings" - depends CONFIG_TESTS + depends on CONFIG_TESTS choice prompt "Tests level" default TST_1 @@ -813,7 +813,7 @@ depends !BOOK_BLFS #--- Package Management config PKGMNGT bool "Package management" - depends BOOK_LFS || BOOK_LFS_SYSD + depends on BOOK_LFS || BOOK_LFS_SYSD default n help #-- Use package management @@ -838,7 +838,7 @@ depends !BOOK_BLFS # # For now, this only works with LFS choice - depends PKGMNGT + depends on PKGMNGT prompt "Package management style" default PKG_PACK @@ -878,7 +878,7 @@ depends !BOOK_BLFS # see https://blog.flameeyes.eu/tags/lafiles/ config NO_PROGRESS_BAR - bool "DO NOT use/display progress_bar " + bool "DO NOT use/display progress_bar" default n help #-- Do not use the progress bar routine. On slower machines @@ -888,7 +888,7 @@ depends !BOOK_BLFS endmenu menu "System configuration" - depends !BOOK_BLFS + depends on !BOOK_BLFS #--- FSTAB config HAVE_FSTAB @@ -1066,7 +1066,7 @@ menu "System configuration" config LOG_LEVEL string "Default log level (1-8)" default "4" - depends BOOK_LFS + depends on BOOK_LFS help This can be changed using dmesg. 1 means "no message", 8 shows every message sent by the kernel, which is very @@ -1077,26 +1077,26 @@ menu "System configuration" endmenu #--- System configuration menu "Advanced Features" -depends !BOOK_BLFS +depends on !BOOK_BLFS config REPORT bool "Create SBU and disk usage report" default y - #--- ICA/farce + #--- ICA config COMPARE bool "Run comparison analysis on final stage" - depends !BOOK_CLFS2 && !BOOK_CLFS3 + depends on !BOOK_CLFS2 && !BOOK_CLFS3 default n help #-- Should an iterative comparison analysis be performed? # - # Unless you are familiar with ICA and/or FARCE do not + # Unless you are familiar with ICA, do not # select this option # - # ICA and FARCE are analysis tools for comparing one + # ICA is an analysis tool for comparing one # build to the next. Builds mays differ from one iteration - # to another due to the build order and these tools try + # to another due to the build order and this tool try # to ferret out those differences by examining the stored # build logs and binary files. # @@ -1110,19 +1110,10 @@ depends !BOOK_BLFS default 3 config RUN_ICA - bool "ICA testing" - depends on COMPARE - default y - help - #-- Run ICA testing + bool + default y if COMPARE - config RUN_FARCE - bool "farce testing" - depends on COMPARE - default n - help - #-- Run farce testing - #--- End ICA/farce + #--- End ICA #--- Optimizations if !BOOK_CLFS2 && !BOOK_CLFS3 @@ -1148,7 +1139,7 @@ if !BOOK_CLFS2 && !BOOK_CLFS3 # Do not set for meaningful SBU calculations. choice - prompt "Optimization level " + prompt "Optimization level" default OPT_1 help #-- Optimization values are set in optimize/* files @@ -1221,10 +1212,6 @@ endif string "ICA logs directory" default "$LOGDIR/ICA" - config FARCELOGDIR - string "farce logs directory" - default "$LOGDIR/farce" - config MKFILE string "Makefile" default "$JHALFSDIR/Makefile" @@ -1244,7 +1231,7 @@ endif endmenu config REBUILD_MAKEFILE - depends !BOOK_BLFS + depends on !BOOK_BLFS bool "Rebuild the Makefile (see help)" default n help diff --git a/FUNCTION_LIST b/FUNCTION_LIST index 63f1ae6..cc961b7 100644 --- a/FUNCTION_LIST +++ b/FUNCTION_LIST @@ -182,10 +182,6 @@ wrt_do_ica_work(): From common/libs/func_compare.sh. Description: -------------------------------------------------------------------------- -wrt_do_farce_work(): -From common/libs/func_compare.sh. -Description: --------------------------------------------------------------------------- wrt_logs(): From common/libs/func_compare.sh. Description: @@ -246,62 +242,6 @@ clean_builddir(): From common/common-functions. Description: -------------------------------------------------------------------------- -function dohelp(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function emessage(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function expected(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function failure(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function fatal(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function filetype(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function message(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function onlyone(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function testar(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function testgzip(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function testso(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function tokenize(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function tokenizeanddiff(): -From extras/farce. -Description: --------------------------------------------------------------------------- -function validateargs(): -From extras/farce. -Description: --------------------------------------------------------------------------- process_toolchain(): From HLFS/master.sh. Description: embryo,cocoon and butterfly need special handling diff --git a/LICENSE b/LICENSE index 3912109..49dce49 100644 --- a/LICENSE +++ b/LICENSE @@ -1,340 +1,19 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 +Copyright (C) 2005-2019, jhalfs team - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - Preamble +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE diff --git a/Makefile b/Makefile index a928dc7..f15a68a 100644 --- a/Makefile +++ b/Makefile @@ -5,35 +5,19 @@ # Manuel Canales Esparcia # Pierre Labastie -TOPDIR=$(shell pwd) CONFIG_CONFIG_IN = Config.in CONFIG = menu all: menuconfig -# @clear @$$(grep RUN_ME configuration 2>/dev/null | sed -e 's@RUN_ME=\"@@' -e 's@\"@@') -$(CONFIG)/conf: - $(MAKE) -C $(CONFIG) conf - -$(CONFIG)/mconf: - $(MAKE) -C $(CONFIG) ncurses conf mconf - -menuconfig: $(CONFIG)/mconf - @cp -a configuration configuration.old 2>/dev/null || true - @$(CONFIG)/mconf $(CONFIG_CONFIG_IN) - -config: $(CONFIG)/conf - @$(CONFIG)/conf $(CONFIG_CONFIG_IN) +menuconfig: + @cp -a configuration .configuration.old 2>/dev/null || true + @CONFIG_="" KCONFIG_CONFIG=configuration $(CONFIG)/menuconfig.py $(CONFIG_CONFIG_IN) # Clean up clean: rm -f configuration configuration.old error - - $(MAKE) -C $(CONFIG) clean -clean-target: - rm -f error - - $(MAKE) -C $(CONFIG) clean - -.PHONY: all menuconfig config clean clean-target +.PHONY: all menuconfig clean diff --git a/README b/README index c7cb0f1..f5fccf6 100644 --- a/README +++ b/README @@ -204,8 +204,6 @@ $Id$ /extras/do_copy_files /do_ica_prep /do_ica_work - /farce - /filelist /optimize/opt_config /opt_override diff --git a/common/libs/func_compare.sh b/common/libs/func_compare.sh index 605eb6c..4f644c0 100644 --- a/common/libs/func_compare.sh +++ b/common/libs/func_compare.sh @@ -58,7 +58,6 @@ wrt_compare_work() { # local ROOT_DIR=/ local DEST_TOPDIR=/${SCRIPT_ROOT} local ICALOGDIR=/${SCRIPT_ROOT}/logs/ICA - local FARCELOGDIR=/${SCRIPT_ROOT}/logs/farce if [[ "$RUN_ICA" = "y" ]] ; then local DEST_ICA=$DEST_TOPDIR/ICA && \ @@ -73,18 +72,6 @@ EOF fi fi - if [[ "$RUN_FARCE" = "y" ]] ; then - local DEST_FARCE=$DEST_TOPDIR/farce && \ -( - cat << EOF - @extras/do_copy_files "$PRUNEPATH" $ROOT_DIR $DEST_FARCE/$ITERATION >>logs/\$@ 2>&1 && \\ - extras/filelist $DEST_FARCE/$ITERATION $DEST_FARCE/filelist-$ITERATION >>logs/\$@ 2>&1 -EOF -) >> $MKFILE.tmp - if [[ "$ITERATION" != "iteration-1" ]] ; then - wrt_do_farce_work "$PREV_IT" "$ITERATION" "$DEST_FARCE" - fi - fi } #----------------------------------# @@ -93,17 +80,6 @@ wrt_do_ica_work() { # echo -e "\t@extras/do_ica_work $1 $2 $ICALOGDIR $3 >>logs/\$@ 2>&1" >> $MKFILE.tmp } -#----------------------------------# -wrt_do_farce_work() { # -#----------------------------------# - local OUTPUT=$FARCELOGDIR/${1}_V_${2} - local PREDIR=$3/$1 - local PREFILE=$3/filelist-$1 - local ITEDIR=$3/$2 - local ITEFILE=$3/filelist-$2 - echo -e "\t@extras/farce --directory $OUTPUT $PREDIR $PREFILE $ITEDIR $ITEFILE >>logs/\$@ 2>&1" >> $MKFILE.tmp -} - #----------------------------------# wrt_logs() { # #----------------------------------# diff --git a/common/libs/func_install_blfs b/common/libs/func_install_blfs index 8666ebd..a206dad 100644 --- a/common/libs/func_install_blfs +++ b/common/libs/func_install_blfs @@ -22,7 +22,6 @@ if [ "$WRAP_INSTALL" = y ]; then fi # Clean-up -make -C ${BUILDDIR}${BLFS_ROOT}/menu clean rm -rf ${BUILDDIR}${BLFS_ROOT}/libs/.svn rm -rf ${BUILDDIR}${BLFS_ROOT}/xsl/.svn rm -rf ${BUILDDIR}${BLFS_ROOT}/menu/.svn diff --git a/common/libs/func_validate_configs.sh b/common/libs/func_validate_configs.sh index b05ad8b..50d8647 100644 --- a/common/libs/func_validate_configs.sh +++ b/common/libs/func_validate_configs.sh @@ -27,7 +27,7 @@ inline_doc RUNMAKE" local -r BUILD_chroot="TEST BOMB_TEST STRIP" local -r BUILD_common="FSTAB CONFIG TIMEZONE PAGE LANG INSTALL_LOG" - local -r ADVANCED_chroot="COMPARE RUN_ICA RUN_FARCE ITERATIONS OPTIMIZE" + local -r ADVANCED_chroot="COMPARE RUN_ICA ITERATIONS OPTIMIZE" local -r ADVANCED_common="REPORT REBUILD_MAKEFILE" # BOOK Settings by book @@ -147,7 +147,6 @@ inline_doc # Envvars that depend on other settings to be displayed COMPARE) [[ ! "$COMPARE" = "y" ]] && echo -e "`eval echo $PARAM_VALS`" ;; RUN_ICA) [[ "$COMPARE" = "y" ]] && echo -e "`eval echo $PARAM_VALS`" ;; - RUN_FARCE) [[ "$COMPARE" = "y" ]] && echo -e "`eval echo $PARAM_VALS`" ;; ITERATIONS) [[ "$COMPARE" = "y" ]] && echo -e "`eval echo $PARAM_VALS`" ;; BOMB_TEST) [[ ! "$TEST" = "0" ]] && echo -e "`eval echo $PARAM_VALS`" ;; TARGET32) [[ -n "${TARGET32}" ]] && echo -e "`eval echo $PARAM_VALS`" ;; diff --git a/extras/farce b/extras/farce deleted file mode 100755 index 0eaf90f..0000000 --- a/extras/farce +++ /dev/null @@ -1,897 +0,0 @@ -#!/bin/bash - -# $Id$ -# Acknowledgment: -# The following code is a no-modified version (except for this comment, -# the `Id' comment, and the inline_doc fragment) of an original work written by -# Ken Moffat and is included here with his permission. -# - -# FARCE: Farce Assists Rebuild Comparison Evaluation ;) -# -# to answer the question "can it rebuild itself?" -# -# We expect four arguments - first directory path, filelist -# containing the files in this directory which we wish to compare, -# second directory path, filelist for second directory. -# -# Yes, we could just compare everything in each tree, but the -# filelist script knows about files it can reasonably ignore, -# and this also allows us to build a sytem, boot it and get a -# list of files, build a full desktop environment, and only then -# build and boot the "can it build itself" test system and get -# _its_ filelist. -# -# What this script aims to do: -# ____________________________ -# -# First, report files not in both builds. -# -# Then, confirm symlinks point to same targets. -# -# After that, compare individual files - -# if different, run the file name through 'expected' -# to pick out files that are unlikely to match (logs, -# pids, fstab [assumes '/' is a different device each time], -# count these as 'expected'. -# -# For whatever is left, check the file type - ar archives -# have their members extraced and compared (every member has -# a timestamp), gzipped files are compared beyond their -# timestamp, binaries, at least those using shared libs or -# which are shared objects, are copied and subjected to -# --strip-debug. If files match at this stage, count them as -# 'accepted'. -# -# As a last step for any file that doesn't match, copy it -# through some perl regexps to "process" it (convert any -# date, time, kernel-version information from standard formats -# into tokens, then see if the tokensi match. -# -# For details of the regexps, see the tokenize function. -# Those files that match after this are also counted as -# 'accepted'. Note that I don't always start from the kernel -# version that I'm going to build, so this copes with e.g. perl -# files that hardcode the kernel version. -# -# We now have files that don't match. A few of these seem to be -# common to all builds - some (members of) c++ libraries or ar -# archives, a few programs which perhaps use some sort of c++ code). -# The file name # is passed to the 'failure' function - these -# recognized filenames are labelled as 'predictable FAIL:', -# anything else is labelled as 'unexpected FAIL:'. -# -# output: -# stderr - files only in one of the builds, failure messages, -# and totals. -# -# farce-results - more details, including which files were treated -# as expected differences, files where neither copy could be read, -# files treated as accepted, with the reason (and member for ar -# archives). This data is typically up to 100 characters wide - -# sometimes it's a bit more, but it doesn't wrap too badly in a -# 100 character xterm. -# -# farce-extras - diffs for the files, or members, that didn't -# match. This file is to establish new regexps for picking up -# date/time/kernel-version formats. -# -# farce-identical - the names of the files which are identical -# -# farce-substitutions - whenever using tokenizeanddiff results in a -# difference being accepted, for both versions diff the before and -# after versions to show what got changed. If the file is a binary, -# the output may still be hard to read. Note that I _know_ glibc -# version strings pass one of the regexps looking for a kernel version -# - since I expect you to use the same version of glibc for each -# build, this is not a problem. -# -# farce-differ - the names of the files which could not be treated -# as matching (whether or not I regard the failure as predictable) -# for possible input to ICA processing. -# -# Copyright (C) 2005, 2006 Ken Moffat -# -# All rights reserved. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or -# NON INFRINGEMENT. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# - -: <&2 - echo "$@" >&5 -} - -function expected() { - # if we expect it to differ because of its name, - # allow it and report, return true ; else return false - case $1 in - /boot/grub/menu.lst) - # just in case somebody puts this into the main filesystem - true;; - /etc/aliases.db) - # some sort of database for postfix, not parsable - true;; - /etc/blkid.tab) - # includes dev name for rootfs - true;; - /etc/fstab) - # fstab, e.g. ' / ' will differ - true;; - /etc/group*) - true;; - /etc/hosts) - # with dhcp client, I add current ip address to this in a hook - true;; - /etc/ld.so.*) - # .conf and .cache can vary, - # particularly if one system has a full build when I run this - true;; - /etc/lilo.conf|/etc/yaboot.conf) - # bootloader control, I assume grub will all be on a separate - true;; - /etc/mtab) - # at a minimum, different '/' - true;; - /etc/ntp.drift) - true;; - /etc/passwd*) - true;; - /etc/shadow*) - true;; - /etc/ssh/*key|/etc/ssh/*pub) - # openssh keys - true;; - /misc/*) - # where I put buildscripts (which mostly won't change) - # and stamps containing name/time/space which will differ in the times - true;; - /root/*) - # expect .bash_history etc to differ - if we can read them - true;; - /usr/bin/lynx) - # part of my inital builds, I guess this uses anonymous namespaces - true;; - /usr/include/c++/*/*/bits/stdc++.h.gch/*) - # precompiled headers - true;; - /usr/lib*/libstdc++.a|/usr/lib*/libstdc++.so*|/usr/lib*/libsupc++.a) - # probably, anonymous namespaces - # libstdc++.a, libstdc++.so.n.n.n, libsupc++.a - true;; - /usr/share/info/dir) - # if one system has had extra stuff built, this will likely be bigger - true;; - /usr/share/man/whatis) - # if one system has had extra stuff built, this will likely be bigger - true;; - /var/lib/locate/locatedb) - # if one system has had extra stuff built, this will likely be bigger - true;; - /var/lib/nfs/*) - # allow nfs bookkeeping - true;; - /var/log/*) - true;; - /var/run/utmp) - true;; - /var/spool/fcron*) - true;; - /var/state/*) - # allow dhcp leases - true;; - /var/tmp/random-seed) - true;; - # following start with wildcards - *Image*|*.PPCBoot*|*vmlinuz*|*lfskernel*) - # compressed kernels, sometimes just building at a different - # date/time is enough to change the length of them, because the - # long format date and time is part of the compressed data - true;; - *pid*) - # pids, including e.g. /var/spool/postfix/pid/* - true;; - *) - # nothing else is expected to be different - false;; - esac - if [ $? -eq 0 ]; then - message "expected difference in $1" - let expected=$expected+1 - case $TYPE in - AR) - let EXPAR=$EXPAR+1 - ;; - ELF) - let EXPELF=$EXPELF+1 - ;; - UNK) - let EXPUNK=$EXPUNK+1 - ;; - # so far, no other valid types, so don't accumulate them - *) - emessage "internal error, expected difference for $1 of type $TYPE not allowed" - exit 2 - ;; - esac - true - else - false - fi -} - -function failure() { - # first parm is filename or token - # second parm is the error message - # update the appropriate total - # and write to both stderr and the results - # by using emessage - - let different=$different+1 - case $TYPE in - AR) - let DIFAR=$DIFAR+1 - ;; - ELF) - let DIFELF=$DIFELF+1 - ;; - GZ) - let DIFGZ=$DIFGZ+1 - ;; - SYM) - let DIFSYM=$DIFSYM+1 - ;; - UNK) - let DIFUNK=$DIFUNK+1 - ;; - *) - emessage "internal error in failure() for TYPE $TYPE" - exit 2 - ;; - esac - test -f ${P1}$1 && echo $1 >&9 - emessage "FAIL: $2" -} - -function fatal() { - # unrecoverable error - echo $* - exit 1 -} - -function filetype() { - TYPE=`file ${P1}${FILE}` - case $TYPE in - *'current ar archive'*) - let TOTAR=$TOTAR+1 - TYPE=AR - ;; - *' ELF '*) - let TOTELF=$TOTELF+1 - TYPE=ELF - ;; - *'gzip compressed data'*) - let TOTGZ=$TOTGZ+1 - TYPE=GZ - ;; - *) - let TOTUNK=$TOTUNK+1 - TYPE=UNK - ;; - esac -} - -function message() { - # write a string to $RESULT - echo $* >&5 -} - -function onlyone() { - #report files only in one build - # text should go to both stderr and the results, - # but blank lines only go to the results - if [ $1 == '<' ]; then - emessage "File(s) only in the first build" - else - emessage "File(s) only in the second build" - fi - message "" - FILES=`cat $DIFF | grep "^$1" | cut -d ' ' -f 2` - for F in $FILES; do - emessage $F - let only=$only+1 - done - message "" -} - -# 'test' functions are called with three arguments: -# the two pathes and the filename -# - we know the file is of this type, so see if we -# can get it to match by reasonalbe means. -# if not, treat it as different. -# -# NB if pathes are absolute, we need to prefix them -# with the original $PWD to access the .a files -# -function testar() { - # ar archives include timestamps for the members, - # but diff doesn't show file timestamps unless the data differs - # put out a message to help locate which archive any messages - # about the members refer to. - - # try just stripping them U1,2 undebuggable - U1=`mktemp` || fatal "cannot create a temporary file" - U2=`mktemp` || fatal "cannot create a temporary file" - cp ${1}${3} $U1 - cp ${2}${3} $U2 - strip --strip-debug $U1 - strip --strip-debug $U2 - cmp -s $U1 $U2 - rm $U1 $U2 - if [ $? -eq 0 ]; then - let accepted=$accepted+1 - let ACCAR=$ACCAR+1 - message "archive $3 matches after strip --strip-debug" - return - fi - # rest of this function retained primarily for pathologically bad builds - # put out a message in the log to help identify which archive has issues. - message "examining ar archive $3" - D1=`mktemp -d` || fatal "cannot create a temporary directory" - D2=`mktemp -d` || fatal "cannot create a temporary directory" - cd $D1 - ar -x ${OP1}${1}${3} - cd $D2 - ar -x ${OP2}${2}${3} - cd - # diff the members - true means they match - diff -Na $D1 $D2 >/dev/null - if [ $? -eq 0 ]; then - message "accept: $3 after diffing the members" - let accepted=$accepted+1 - let ACCAR=$ACCAR+1 - else - # process individual members to eliminate date/time/kernel-version - # first, check the members are the same - M1=`mktemp` || fatal "cannot create a temporary file" - M2=`mktemp` || fatal "cannot create a temporary file" - cd $D1 - MEMBERS= - for F in *; do - MEMBERS="$MEMBERS $F" - done - cd - echo $MEMBERS | sort >$M1 - cd $D2 - MEMBERS= - for F in *; do - MEMBERS="$MEMBERS $F" - done - cd - echo $MEMBERS | sort >$M2 - cmp -s $M1 $M2 - if [ $? -ne 0 ]; then - # oh dear, different members - echo "list of members differs for archive $3" >&6 - diff $M1 $M2 >&6 - failure $3 "$3 list of members differs" - else - # members (names) are same, - # process each one - STATUS=0 - for M in $MEMBERS; do - #avoid firing up perl on matching members - cmp -s $D1/$M $D2/$M - if [ $? -ne 0 ]; then - tokenizeanddiff $D1/$M $D2/$M $FILE:$M - if [ $? -eq 0 ]; then - message "member $M matches after processing" - else - message "member $M DIFFERS after processing" - STATUS=1 - fi - fi - done - if [ $STATUS -eq 0 ]; then - let accepted=$accepted+1 - let ACCAR=$ACCAR+1 - else - let different=$different+1 - let DIFAR=$DIFAR+1 - echo $3 >&9 - emessage "FAIL: in $3" - fi - fi - rm $M1 $M2 - fi - rm -rf $D1 $D2 -} - -function testgzip() { - # bytes 4,5,6,7 are the timestamp, so ignore these - cmp -s -i 8 ${1}${3} ${2}${3} - if [ $? -eq 0 ]; then - message "accept: $3 after ignoring gzip timestamp" - let accepted=$accepted+1 - let ACCGZ=$ACCGZ+1 - else - failure $3 " $3 even after ignoring gzip timestamp" - fi -} - -function testso() { - # shared object - first try stripping it - # in fact, this now handles ALL ELF files - S1=`mktemp` || fatal "cannot create a temporary file" - S2=`mktemp` || fatal "cannot create a temporary file" - cp ${1}${3} $S1 - strip --strip-debug $S1 - cp ${2}${3} $S2 - strip --strip-debug $S2 - cmp -s $S1 $S2 - if [ $? -eq 0 ]; then - message "accept: $3 after --strip-debug" - let accepted=$accepted+1 - let ACCELF=$ACCELF+1 - else - tokenizeanddiff $S1 $S2 $3 - if [ $? -ne 0 ]; then - failure $3 " $3 differs after stripping and processing" - else - message "accept: $3 after --strip-debug and processing" - let accepted=$accepted+1 - let ACCELF=$ACCELF+1 - fi - fi - rm $S1 $S2 -} - -function tokenize() { - # use regexes to replace date/time/kernel-version text - # with tokens which may allow files to match even though - # they have hardcoded date/time/kernel-version. - # arguments are file to process, and where to put it. - # these regexes are somewhat long, and the order they - # are applied in is important (to stop short ones being - # used when a longer version would match). - # KV00 linux version date (e.g. as in the kernel itself) - # allow 2 or 3 groups of three alphas here - optional smp, with day, mon - # KV01 kernel version, including possible cpu details (that is for cdda2wav) - # KV02 just the version, in quotes e.g. "2.6.12.6" or '2.6.13', for perl stuff - # except that "|' gives me grif, so try a boundary - # also, it might need local version on the end, I really want - # quote2.\d+.\d+.{0,32}quote - it is the quotes that don't work. - # DT00 Day Mon .d+ hh:mm:ss TZN CCYY variations include non-caps and 'mon d' - # DT01 Mon .d+ CCYY hh:mm:ss - # DT02 hh:mm:ss Mon .d CCYY - # DT03 Mon .d CCYY - # DT04 Day Mon { ,d}d hh:mm:ss CCYY - for groff example postscript files - # (somewhat similar to DT00, but ' d' or ' dd' for day of month and no TZN ) - # DT05 hh:mm:ss - # DT06 ISO date using space as separator - # DT07 ISO date using dash as separator - # DT08 ISO date using slash as separator - # DT09 fullmonth (capitalised), day number, comma, 4-digit year (groff 1.18.1 ps) - # DT10 dd, fullmonth (capitalised), 4-digit year (groff 1.18.1 manpages) - # DT11 '(xample comma space digit(s) backslash ) in groff memef.ps which is - # quite clearly the day of the month when it was compiled, preceded by 'example' - # with something weird between the e and the x. - - if [ $# -ne 2 ]; then - fatal "tokenizing called with $# arguments : $*" - fi - - cat $1 | perl -p \ - -e 's/(L|l)inux.*\d\.\d\.\d+.* \#\d+( [A-Za-z][a-z]{2}){2,3} \d+ \d\d:\d\d:\d\d [A-Za-z]{3} \d{4}\b/%KV00%/g;' \ - -e 's/(L|l)inux( (\w|_)+)?(-| |_)\d\.\d(\.\d+){1,2}((-|_)?(\w|_)+)?( |\000)*/%KV01%/g;' \ - -e 's/\W2(\.\d+){2,3}(-|_)?((\w|_)+)?\s*\W/%KV02%/g;' \ - -e 's/\b([A-Za-z][a-z]{2} ){2}( |\d)?\d \d\d:\d\d:\d\d [A-Za-z]{3} \d{4}\b/%DT00%/g;' \ - -e 's/\b[A-Z][a-z]{2} ( |\d)\d \d{4} \d\d:\d\d:\d\d\b/%DT01%/g;' \ - -e 's/\b\d\d:\d\d:\d\d [A-Z][a-z]{2} ( |\d)\d \d{4}\b/%DT02%/g;' \ - -e 's/\b[A-Z][a-z]{2} ( |\d)\d \d{4}\b/%DT03%/g;' \ - -e 's/\b([A-Z][a-z]{2} ){2}( |\d)\d \d\d:\d\d:\d\d \d{4}/%DT04%/g;' \ - -e 's/\b\d\d:\d\d:\d\d\b/%DT05%/g;' \ - -e 's/\b\d{4} \d\d \d\d\b/%DT06%/g;' \ - -e 's/\b\d{4}-\d\d-\d\d\b/%DT07%/g;' \ - -e 's/\b\d{4}\/\d\d\/\d\d\b/%DT08%/g;' \ - -e 's/\b[A-Z][a-z]{2,} \d{1,2}, \d{4}/%DT09%/g;' \ - -e 's/\b\d\d [A-Z][a-z]{2,} \d{4}/%DT10%/g;' \ - -e 's/\(xample, \d{1,2}\\\)/%DT11%/g;' \ - >$2 -} - -function tokenizeanddiff() { - # Call tokenize for the inputs, then compare the results - # Input arguments are path/filename for old and new versions - # third parm is readable name (filename, or archivename:member) - # to help understand what is in the extras output. - # - sometimes called for files, but other times called for - # members of ar archives extracted into temporary directories - #message tokenizeanddiff called for $1 $2 $3 - F1=`mktemp` || fatal "cannot create a temporary file" - F2=`mktemp` || fatal "cannot create a temporary file" - tokenize $1 $F1 - tokenize $2 $F2 - - # actually, cmp is probably more efficient - # but for picking up the pieces it will be better to - # use diff to see what got through. - cmp -s $F1 $F2 - TOKENRESULT=$? - if [ $TOKENRESULT -ne 0 ]; then - echo "failure in $3..." >&6 - diff -a $F1 $F2 >&6 - rm $F1 $F2 - false - else - # show what we did - echo "substitutions for $3" >&8 - echo "build one" >&8 - diff -a $1 $F1 >&8 - echo "build two" >&8 - diff -a $2 $F2 >&8 - rm $F1 $F2 - true - fi -} - -function validateargs() { -# validate the arguments -BAD=0 -if ! [ -d $1 ]; then - echo "Error: first argument is not a directory" >&2 - let BAD=$BAD+1 -fi -NAME=`basename ${2%%-*}` -if [ $NAME != filelist ]; then - echo "Error: second argument is not a recognized filelist" >&2 - let BAD=$BAD+1 -fi -if ! [ -d $3 ]; then - echo "Error: third argument is not a directory" >&2 - let BAD=$BAD+1 -fi -NAME=`basename ${4%%-*}` -if [ $NAME != filelist ]; then - echo "Error: fourth argument is not a recognized filelist" >&2 - let BAD=$BAD+1 -fi -for I in $1 $2 $3 $4; do - if ! [ -r $I ]; then - echo "Error: cannot read $I" >&2 - let BAD=$BAD+1 - fi -done -if [ $1 == $3 ]; then - echo "Error: directory pathes are identical" >&2 - let BAD=$BAD+1 -fi -if [ $2 == $4 ]; then - echo "Error: filelist names are identical" >&2 - let BAD=$BAD+1 -fi -if [ $BAD -eq 0 ]; then - ARGS=valid -fi -} - -# Mainline -ARGS=unproven -OUTDIR= -if [ $# -eq 1 ]; then - case $1 in - -version|--version) - echo "`basename $0` version $VERSION" - exit 0 - ;; - -help|--help) - dohelp - exit 0 - ;; - esac -fi -if [ $1 = "--directory" ]; then - OUTDIR=$2 - shift 2 - grep '/$' $OUTDIR >/dev/null 2>&1 || OUTDIR=`echo $OUTDIR | sed 's%$%/%'` - echo "creating directory $OUTDIR" - mkdir -p $OUTDIR - if [ $? -ne 0 ]; then - echo "cannot mkdir $OUTDIR" - exit 1 - fi -fi -if [ $# -eq 4 ]; then - validateargs $* -fi -if ! [ $ARGS == valid ]; then - dohelp - fatal "`basename $0`: error in arguments" -fi - -# ok, we're happy, lets hit these files -exec 5>${OUTDIR}$RESULT -exec 6>${OUTDIR}$EXTRAS -exec 7>${OUTDIR}$IDENTICAL -exec 8>${OUTDIR}$SUBS -exec 9>${OUTDIR}$DIFFER - ->${OUTDIR}$RESULT -if [ $? -ne 0 ]; then - fatal "cannot write to ${OUTDIR}$RESULT" -fi - -emessage "will compare:" -emessage " first build at $1 with files listed in $2" -emessage "second build at $3 with files listed in $4" - -let accepted=0 -let different=0 -let expected=0 -let matched=0 -let only=0 -let predictable=0 -let unreadable=0 -let total=0 - -# break down the accepted -let ACCAR=0 -let ACCELF=0 -let ACCGZ=0 -let ACCUNK=0 - -# break down definitely different -let DIFAR=0 -let DIFELF=0 -let DIFGZ=0 -let DIFSYM=0 -let DIFUNK=0 - -# break down the expected differences -let EXPAR=0 -let EXPELF=0 -let EXPGZ=0 -let EXPUNK=0 - -# break down the identical files -let MATAR=0 -let MATELF=0 -let MATGZ=0 -let MATSYM=0 -let MATUNK=0 - -# break down how many of each type -let TOTAR=0 -let TOTELF=0 -let TOTGZ=0 -let TOTSYM=0 -let TOTUNK=0 - -# now identify differences between the two trees -DIFF=`mktemp` || fatal "cannot create a temporary file" -diff $2 $4 >$DIFF - -for RUN in '<' '>' ; do - grep -q "$RUN" $DIFF && onlyone "$RUN" -done - -rm $DIFF - -# and compare them -message "Results of file comparison:" -message "" - -# Strip any trailing slash from the path for tidyness, -# because the filenames all start with a slash. Unfortunately, -# unfortunately, '/' becomes empty, which breaks subroutines, -# so special case it. -# also, to process ar archives we need to extract them in temp -# directories - that means that after cd'ing we've broken any -# relative path, so save original pwd as necessary. -P1=`echo $1 | sed 's%/$%%'` -echo $1 | grep '^/' >/dev/null -if [ $? -ne 0 ]; then - # relative path - OP1=${PWD}/ - #echo "setting OP1 to $OP1" -else - OP1= - #echo "$1 is an absolute path" -fi -test -z "$P1" && P1='/' -P2=`echo $3 | sed 's%/$%%'` -echo $3 | grep '^/' >/dev/null -if [ $? -ne 0 ]; then - # relative path - OP2=${PWD}/ - #echo "setting OP2 to $OP2" -else - OP2= - #echo "$3 is an absolute path" -fi -test -z "$P2" && P2='/' - -echo "about to read $2" -while read FILE ; do -#echo "process $FILE" -#echo "test existence of ${P2}${FILE}" - # confirm it exists in second build - # we have already reported files only in one build - if [ -f ${P2}"${FILE}" ]; then - let total=$total+1 - # check we can read both of them - # or count as unreadable - I used to separate only-one-unreadable, - # but if you compre '/' and a _copy_ of /mnt/lfs that assumption - # breaks, so be less picky. - if ! [ -r "${P1}${FILE}" ] || ! [ -r "${P2}${FILE}" ]; then - message "cannot read one or both versions of $FILE" - let unreadable=$unreadable+1 - continue - fi - if [ -h "${P1}${FILE}" ]; then - # for symlink, look at what it points to - # exceptionally, do not call filetype - TYPE=SYM - let TOTSYM=$TOTSYM+1 - SL1=`ls -l "${P1}${FILE}" | awk '{ print $11 }'` - SL2=`ls -l "${P2}${FILE}" | awk '{ print $11 }'` - if [ "$SL1" = "$SL2" ]; then - echo "symlink $FILE matches for $SL1" >&5 - let matched=$matched+1 - let MATSYM=$MATSYM+1 - else - failure TARGET " symlink $FILE points to $SL1 and $SL2" - echo $FILE >&9 - fi - else - # regular file, start by typing it for accounting, - # then compare it - filetype ${P1}${FILE} - cmp -s "${P1}${FILE}" "${P2}${FILE}" - if [ $? -eq 0 ]; then - let matched=$matched+1 - case $TYPE in - AR) - let MATAR=$MATAR+1 - ;; - ELF) - let MATELF=$MATELF+1 - ;; - GZ) - let MATGZ=$MATGZ+1 - ;; - UNK) - let MATUNK=$MATUNK+1 - ;; - *) - echo "unexpected TYPE of $TYPE for $FILE" >&2 - exit 2 - ;; - esac - echo ${FILE} >&7 - else - # seems different, can we do better ? - # test if we expect it to differ - expected $FILE - if [ $? -ne 0 ]; then - case $TYPE in - GZ) - testgzip $P1 $P2 $FILE ;; - AR) - testar $P1 $P2 $FILE ;; - ELF) - testso $P1 $P2 $FILE ;; - *) - # long-stop - strip dates from text files - tokenizeanddiff "${P1}${FILE}" "${P2}${FILE}" "$FILE" - if [ $? -eq 0 ]; then - message "accepted $FILE after processing" - let accepted=$accepted+1 - let ACCUNK=$ACCUNK+1 - else - failure "$FILE" " $FILE is different" - fi - ;; - esac - fi - fi - fi - fi -done < $2 - -message "" -# write totals to stderr as well as the results file -emessage "$only files in only one of the builds" -emessage "$total files compared, of which" -emessage "$unreadable files could not be read, skipped" -emessage "$matched files are identical" -emessage "$expected files differed as expected" -emessage "$accepted files had allowable differences" -#emessage "$predictable files differed as they normally do" -emessage "$different files differed" - -# totals of different file types -emessage "" -emessage "$TOTAR ar archives" -emessage " of which $MATAR are identical" -emessage " of which $ACCAR are accepted after strip-debug or extracting, diffing, tokenizing" -emessage " of which $EXPAR differed as expected" -emessage " of which $DIFAR differed" -emessage "$TOTELF ELF executables or shared libraries" -emessage " of which $MATELF are identical" -emessage " of which $ACCELF are accepted after stripping and tokenizing" -emessage " of which $EXPELF differed as expected" -emessage " of which $DIFELF differed" -emessage "$TOTGZ gzipped files" -emessage " of which $MATGZ are identical" -emessage " of which $ACCGZ are accepted after comparing beyond timestamp" -emessage " of which $DIFGZ are different" -emessage "$TOTSYM symbolic links" -emessage " of which $MATSYM are identical" -emessage " of which $DIFSYM have different targets" -emessage "$TOTUNK other files" -emessage " of which $MATUNK are identical" -emessage " of which $ACCUNK are accepted after tokenizing" -emessage " of which $EXPUNK differed as expected" -emessage " of which $DIFUNK differed" - diff --git a/extras/filelist b/extras/filelist deleted file mode 100755 index f9b1b08..0000000 --- a/extras/filelist +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -#$Id$ - -# Acknowledgment: -# The following code is a modified version of an original work written by -# Ken Moffat for their "farce" project and is included here with his -# permission. -# - -set -e - -: <$OUTFILE -if [ $? -ne 0 ]; then - echo "error, cannot write to $OUTFILE" - exit 1 -fi - -find $LOC -xdev -xtype f | sed "s%^${LOC}%/%" | sort >$OUTFILE - -echo -e "done.\n" - -exit diff --git a/install-blfs-tools.sh b/install-blfs-tools.sh index 2457680..c276cfc 100755 --- a/install-blfs-tools.sh +++ b/install-blfs-tools.sh @@ -164,11 +164,6 @@ cp README.BLFS ${BUILDDIR}${BLFS_ROOT} # Clean-up [[ $VERBOSITY > 0 ]] && echo Cleaning the ${BUILDDIR}${BLFS_ROOT} directory -make -C ${BUILDDIR}${BLFS_ROOT}/menu clean -rm -rf ${BUILDDIR}${BLFS_ROOT}/libs/.svn -rm -rf ${BUILDDIR}${BLFS_ROOT}/xsl/.svn -rm -rf ${BUILDDIR}${BLFS_ROOT}/menu/.svn -rm -rf ${BUILDDIR}${BLFS_ROOT}/menu/lxdialog/.svn # We do not want to keep an old version of the book: rm -rf ${BUILDDIR}${BLFS_ROOT}/$BLFS_XML rm -rf ${BUILDDIR}${BLFS_ROOT}/$LFS_XML diff --git a/jhalfs b/jhalfs index b3a6154..08a3b0d 100755 --- a/jhalfs +++ b/jhalfs @@ -101,31 +101,37 @@ load_file() { version=" ${BOLD} \"jhalfs\"${OFF} builder tool (development) \$Rev$ - \$Date$ + \$Date$ - Written by George Boudreau, Manuel Canales Esparcia, Pierre Labastie, - plus several contributions. + Copyright (C) 2005-2019, the jhalfs team: + Jeremy Huntwork + George Boudreau + Manuel Canales Esparcia + Thomas Pegg + Matthew Burgess + Pierre Labastie - Based on an idea from Jeremy Huntwork + Unless specified, all the files in this directory and its sub-directories + are subjected to the ${BOLD}MIT license${OFF}. See the ${BOLD}LICENSE${OFF} file. - This set of files are published under the - ${BOLD}Gnu General Public License, Version 2.${OFF} - See the ${BOLD}LICENSE${OFF} file in this directory. + The files in the ${BOLD}menu${OFF} directory are subjected to the ${BOLD}ISC License${OFF}. + See ${BOLD}LICENSE.txt${OFF} and ${BOLD}README${OFF} in that directory. " +usage="${nl_}${tab_}${BOLD}${RED}This script cannot be called directly${OFF} +${tab_}Type ${BOLD}make${OFF} to run the tool, or +${tab_}Type ${BOLD}./jhalfs -v${OFF} to display version information." + case $1 in -v ) echo "$version" && exit ;; run ) : ;; - * ) - echo "${nl_}${tab_}${BOLD}${RED}This script cannot be called directly: EXITING ${OFF}${nl_}" - exit 1 - ;; + * ) echo "$usage" && exit 1 ;; esac # If the user has not saved his configuration file, let's ask # if he or she really wants to run this stuff time_current=$(stat -c '%Y' configuration 2>/dev/null || date +%s) -time_old=$(stat -c '%Y' configuration.old 2>/dev/null || printf '%s' "$time_current") +time_old=$(stat -c '%Y' .configuration.old 2>/dev/null || printf '%s' "$time_current") if [ "$(printf '%d' "$time_old")" -ge "$(printf '%d' "$time_current")" ] ; then printf 'Do you want to run jhalfs? yes/no (yes): ' read -r ANSWER @@ -148,7 +154,6 @@ load_file configuration "Loading config params from " RUNMAKE=${RUNMAKE:-n} GETPKG=${GETPKG:-n} COMPARE=${COMPARE:-n} -RUN_FARCE=${RUN_FARCE:-n} RUN_ICA=${RUN_ICA:-n} PKGMNGT=${PKGMNGT:-n} WRAP_INSTALL=${WRAP_INSTALL:-n} diff --git a/menu/BusyBox-1.1.3-menu.patch b/menu/BusyBox-1.1.3-menu.patch deleted file mode 100644 index 6a4be25..0000000 --- a/menu/BusyBox-1.1.3-menu.patch +++ /dev/null @@ -1,507 +0,0 @@ -diff -Npr menu-bb/conf.c menu/conf.c -*** menu-bb/conf.c 2006-03-22 16:16:18.000000000 -0500 ---- menu/conf.c 2006-07-26 17:26:45.000000000 -0400 -*************** int main(int ac, char **av) -*** 535,554 **** - conf_parse(name); - //zconfdump(stdout); - switch (input_mode) { -- case set_default: -- 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); -- exit(1); -- } -- break; - case ask_silent: - if (stat(".config", &tmpstat)) { - printf("***\n" -! "*** You have not yet configured BusyBox!\n" - "***\n" - "*** Please run some configurator (e.g. \"make oldconfig\" or\n" - "*** \"make menuconfig\" or \"make config\").\n" ---- 535,544 ---- - conf_parse(name); - //zconfdump(stdout); - switch (input_mode) { - case ask_silent: - if (stat(".config", &tmpstat)) { - printf("***\n" -! "*** You have not yet configured JHALFS!\n" - "***\n" - "*** Please run some configurator (e.g. \"make oldconfig\" or\n" - "*** \"make menuconfig\" or \"make config\").\n" -*************** int main(int ac, char **av) -*** 576,582 **** - check_conf(&rootmenu); - } while (conf_cnt); - if (conf_write(NULL)) { -! fprintf(stderr, "\n*** Error during writing of the BusyBox configuration.\n\n"); - return 1; - } - return 0; ---- 566,572 ---- - check_conf(&rootmenu); - } while (conf_cnt); - if (conf_write(NULL)) { -! fprintf(stderr, "\n*** Error during writing of the JHALFS configuration.\n\n"); - return 1; - } - return 0; -diff -Npr menu-bb/confdata.c menu/confdata.c -*** menu-bb/confdata.c 2006-03-22 16:16:18.000000000 -0500 ---- menu/confdata.c 2006-07-26 17:26:45.000000000 -0400 -*************** -*** 13,24 **** - #define LKC_DIRECT_LINK - #include "lkc.h" - -! const char conf_def_filename[] = ".config"; - - const char conf_defname[] = "defconfig"; - - const char *conf_confnames[] = { -! ".config", - conf_defname, - NULL, - }; ---- 13,24 ---- - #define LKC_DIRECT_LINK - #include "lkc.h" - -! const char conf_def_filename[] = "configuration"; - - const char conf_defname[] = "defconfig"; - - const char *conf_confnames[] = { -! "configuration", - conf_defname, - NULL, - }; -*************** static char *conf_expand_value(const cha -*** 49,70 **** - return res_value; - } - -- char *conf_get_default_confname(void) -- { -- struct stat buf; -- static char fullname[PATH_MAX+1]; -- char *env, *name; -- -- name = conf_expand_value(conf_defname); -- env = getenv(SRCTREE); -- if (env) { -- sprintf(fullname, "%s/%s", env, name); -- if (!stat(fullname, &buf)) -- return fullname; -- } -- return name; -- } -- - int conf_read(const char *name) - { - FILE *in = NULL; ---- 49,54 ---- -*************** struct menu *next_menu(struct menu *menu -*** 271,277 **** - - int conf_write(const char *name) - { -! FILE *out, *out_h; - struct symbol *sym; - struct menu *menu; - const char *basename; ---- 255,261 ---- - - int conf_write(const char *name) - { -! FILE *out; - struct symbol *sym; - struct menu *menu; - const char *basename; -*************** int conf_write(const char *name) -*** 279,288 **** - int type, l; - const char *str; - -- /* busybox`s code */ -- const char *opt_name; -- int use_flg; -- - dirname[0] = 0; - if (name && name[0]) { - struct stat st; ---- 263,268 ---- -*************** int conf_write(const char *name) -*** 309,342 **** - out = fopen(newname, "w"); - if (!out) - return 1; -- out_h = NULL; -- if (!name) { -- out_h = fopen(".tmpconfig.h", "w"); -- if (!out_h) -- return 1; -- } - fprintf(out, "#\n" -! "# Automatically generated make config: don't edit\n" - "#\n"); - -- /* busybox`s code */ -- if (out_h) { -- fprintf(out_h, "#ifndef BB_CONFIG_H\n#define BB_CONFIG_H\n"); -- fprintf(out_h, "/*\n" -- " * Automatically generated header file: don't edit\n" -- " */\n\n" -- "/* Version Number */\n" -- "#define BB_VER \"%s\"\n" -- "#define BB_BT \"%s\"\n", -- getenv("VERSION"), -- getenv("BUILDTIME")); -- if (getenv("EXTRA_VERSION")) -- fprintf(out_h, "#define BB_EXTRA_VERSION \"%s\"\n", -- getenv("EXTRA_VERSION")); -- fprintf(out_h, "\n"); -- } -- /* end busybox`s code */ -- - if (!sym_change_count) - sym_clear_all_valid(); - ---- 289,299 ---- - out = fopen(newname, "w"); - if (!out) - return 1; - fprintf(out, "#\n" -! "# Automatically generated configuration: don't edit\n" -! "# use make menuconfig or make config to make changes\n" - "#\n"); - - if (!sym_change_count) - sym_clear_all_valid(); - -*************** int conf_write(const char *name) -*** 357,367 **** - "#\n" - "# %s\n" - "#\n", str); -- if (out_h) -- fprintf(out_h, "\n" -- "/*\n" -- " * %s\n" -- " */\n", str); - } else if (!(sym->flags & SYMBOL_CHOICE)) { - sym_calc_value(sym); - if (!(sym->flags & SYMBOL_FORCEWRITE)) ---- 314,319 ---- -*************** int conf_write(const char *name) -*** 375,388 **** - type = S_BOOLEAN; - } - -- /* busybox`s code */ -- opt_name = strchr(sym->name, '_'); -- if(opt_name == NULL) -- opt_name = sym->name; -- else -- opt_name++; -- use_flg = 1; -- /* end busybox`s code */ - - switch (type) { - case S_BOOLEAN: ---- 327,332 ---- -*************** int conf_write(const char *name) -*** 390,410 **** - switch (sym_get_tristate_value(sym)) { - case no: - fprintf(out, "# %s is not set\n", sym->name); -- if (out_h) -- fprintf(out_h, "#undef %s\n", sym->name); -- use_flg = 0; /* busybox`s code */ - break; - case mod: -- #if 0 /* busybox`s code */ - fprintf(out, "%s=m\n", sym->name); -- if (out_h) -- fprintf(out_h, "#define %s_MODULE 1\n", sym->name); -- #endif /* busybox`s code */ - break; - case yes: - fprintf(out, "%s=y\n", sym->name); -- if (out_h) -- fprintf(out_h, "#define %s 1\n", sym->name); - break; - } - break; ---- 334,345 ---- -*************** int conf_write(const char *name) -*** 412,473 **** - // fix me - str = sym_get_string_value(sym); - fprintf(out, "%s=\"", sym->name); -- if (out_h) -- fprintf(out_h, "#define %s \"", sym->name); - do { - l = strcspn(str, "\"\\"); - if (l) { - fwrite(str, l, 1, out); -- if (out_h) -- fwrite(str, l, 1, out_h); - } - str += l; - while (*str == '\\' || *str == '"') { - fprintf(out, "\\%c", *str); -- if (out_h) -- fprintf(out_h, "\\%c", *str); - str++; - } - } while (*str); - fputs("\"\n", out); -- if (out_h) -- fputs("\"\n", out_h); - break; - case S_HEX: - str = sym_get_string_value(sym); - if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { - fprintf(out, "%s=%s\n", sym->name, *str ? str : "0"); -- if (out_h) -- fprintf(out_h, "#define %s 0x%s\n", sym->name, str); - break; - } - case S_INT: - str = sym_get_string_value(sym); - fprintf(out, "%s=%s\n", sym->name, *str ? str : "0"); -- if (out_h) -- fprintf(out_h, "#define %s %s\n", sym->name, str); - break; - } -- /* busybox`s code */ -- if (out_h) { -- fprintf(out_h, "#define ENABLE_%s %d\n", opt_name, use_flg); -- fprintf(out_h, "#define USE_%s(...)%s\n", opt_name, -- (use_flg ? " __VA_ARGS__" : "")); -- fprintf(out_h, "#define SKIP_%s(...)%s\n\n", opt_name, -- (use_flg ? "" : " __VA_ARGS__")); -- } -- /* end busybox`s code */ - } - next: - menu = next_menu(menu); - } - fclose(out); -- if (out_h) { -- fprintf(out_h, "#endif /* BB_CONFIG_H */\n"); /* busybox`s code */ -- fclose(out_h); -- rename(".tmpconfig.h", "include/bb_config.h"); /* busybox`s config name */ -- file_write_dep(NULL); -- } - if (!name || basename != conf_def_filename) { - if (!name) - name = conf_def_filename; ---- 347,381 ---- -diff -Npr menu-bb/Makefile menu/Makefile -*** menu-bb/Makefile 2006-03-22 16:16:18.000000000 -0500 ---- menu/Makefile 2006-07-26 18:06:25.000000000 -0400 -*************** -*** 1,11 **** - # Makefile for BusyBox - # - # Copyright (C) 2002 Erik Andersen - -- top_srcdir=../.. -- top_builddir=../.. -- srcdir=$(top_srcdir)/scripts/config -- include $(top_srcdir)/Rules.mak - - all: ncurses conf mconf - ---- 1,30 ---- - # Makefile for BusyBox - # - # Copyright (C) 2002 Erik Andersen -+ # Modified by George Boudreau georgeb@LinuxFromScratch.org -+ -+ top_srcdir=. -+ top_builddir=. -+ srcdir=$(top_srcdir) -+ -+ # Select the compiler needed to build binaries for your development system -+ HOSTCC = gcc -+ HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -+ -+ # Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc. -+ LC_ALL:= C -+ -+ SED ?= sed -+ SECHO := @-false -+ DISP := pur -+ Q := @ -+ -+ show_objs = $(subst $(top_builddir)/,,$(subst ../,,$@)) -+ pur_disp_compile.h = echo " "HOSTCC $(show_objs) -+ disp_compile.h = $($(DISP)_disp_compile.h) -+ cmd_compile.h = $(HOSTCC) $(HOSTCFLAGS) -c -o $@ $< -+ compile.h = @$(disp_compile.h) ; $(cmd_compile.h) - - - all: ncurses conf mconf - -diff -Npr menu-bb/mconf.c menu/mconf.c -*** menu-bb/mconf.c 2006-03-22 16:16:18.000000000 -0500 ---- menu/mconf.c 2006-07-26 17:26:45.000000000 -0400 -*************** static char menu_backtitle[128]; -*** 32,38 **** - static const char mconf_readme[] = - "Overview\n" - "--------\n" -! "Some features may be built directly into BusyBox. Some features\n" - "may be completely removed altogether. There are also certain\n" - "parameters which are not really features, but must be\n" - "entered in as decimal or hexadecimal numbers or possibly text.\n" ---- 32,38 ---- - static const char mconf_readme[] = - "Overview\n" - "--------\n" -! "Some features may be built directly into JHALFS. Some features\n" - "may be completely removed altogether. There are also certain\n" - "parameters which are not really features, but must be\n" - "entered in as decimal or hexadecimal numbers or possibly text.\n" -*************** load_config_text[] = -*** 194,204 **** - "last retrieved. Leave blank to abort.", - load_config_help[] = - "\n" -! "For various reasons, one may wish to keep several different BusyBox\n" - "configurations available on a single machine.\n" - "\n" - "If you have saved a previous configuration in a file other than the\n" -! "BusyBox's default, entering the name of the file here will allow you\n" - "to modify that configuration.\n" - "\n" - "If you are uncertain, then you have probably never used alternate\n" ---- 194,204 ---- - "last retrieved. Leave blank to abort.", - load_config_help[] = - "\n" -! "For various reasons, one may wish to keep several different JHALFS\n" - "configurations available on a single machine.\n" - "\n" - "If you have saved a previous configuration in a file other than the\n" -! "JHALFS's default, entering the name of the file here will allow you\n" - "to modify that configuration.\n" - "\n" - "If you are uncertain, then you have probably never used alternate\n" -*************** save_config_text[] = -*** 208,214 **** - "as an alternate. Leave blank to abort.", - save_config_help[] = - "\n" -! "For various reasons, one may wish to keep different BusyBox\n" - "configurations available on a single machine.\n" - "\n" - "Entering a file name here will allow you to later retrieve, modify\n" ---- 208,214 ---- - "as an alternate. Leave blank to abort.", - save_config_help[] = - "\n" -! "For various reasons, one may wish to keep different JHALFS\n" - "configurations available on a single machine.\n" - "\n" - "Entering a file name here will allow you to later retrieve, modify\n" -*************** int main(int ac, char **av) -*** 940,946 **** - - sym = sym_lookup("VERSION", 0); - sym_calc_value(sym); -! snprintf(menu_backtitle, 128, "BusyBox v%s Configuration", - sym_get_string_value(sym)); - - mode = getenv("MENUCONFIG_MODE"); ---- 940,946 ---- - - sym = sym_lookup("VERSION", 0); - sym_calc_value(sym); -! snprintf(menu_backtitle, 128, "JHALFS v%s Configuration", - sym_get_string_value(sym)); - - mode = getenv("MENUCONFIG_MODE"); -*************** int main(int ac, char **av) -*** 961,976 **** - init_dialog(); - do { - stat = dialog_yesno(NULL, -! "Do you wish to save your new BusyBox configuration?", 5, 60); - } while (stat < 0); - end_dialog(); - - if (stat == 0) { - conf_write(NULL); - printf("\n" -! "*** End of BusyBox configuration.\n"); - } else -! printf("\n\nYour BusyBox configuration changes were NOT saved.\n\n"); - - return 0; - } ---- 961,976 ---- - init_dialog(); - do { - stat = dialog_yesno(NULL, -! "Do you wish to save your new JHALFS configuration?", 5, 60); - } while (stat < 0); - end_dialog(); - - if (stat == 0) { - conf_write(NULL); - printf("\n" -! "*** End of JHALFS configuration.\n"); - } else -! printf("\n\nYour JHALFS configuration changes were NOT saved.\n\n"); - - return 0; - } -diff -Npr menu-bb/zconf.tab.c_shipped menu/zconf.tab.c_shipped -*** menu-bb/zconf.tab.c_shipped 2006-03-22 16:16:18.000000000 -0500 ---- menu/zconf.tab.c_shipped 2006-07-26 17:26:45.000000000 -0400 -*************** void conf_parse(const char *name) -*** 1925,1931 **** - sym_init(); - menu_init(); - modules_sym = sym_lookup("MODULES", 0); -! rootmenu.prompt = menu_add_prop(P_MENU, "BusyBox Configuration", NULL, NULL); - - //zconfdebug = 1; - zconfparse(); ---- 1925,1931 ---- - sym_init(); - menu_init(); - modules_sym = sym_lookup("MODULES", 0); -! rootmenu.prompt = menu_add_prop(P_MENU, "JHALFS Configuration", NULL, NULL); - - //zconfdebug = 1; - zconfparse(); -diff -Npr menu-bb/zconf.y menu/zconf.y -*** menu-bb/zconf.y 2006-03-22 16:16:18.000000000 -0500 ---- menu/zconf.y 2006-07-26 17:26:45.000000000 -0400 -*************** void conf_parse(const char *name) -*** 487,493 **** - sym_init(); - menu_init(); - modules_sym = sym_lookup("MODULES", 0); -! rootmenu.prompt = menu_add_prop(P_MENU, "BusyBox Configuration", NULL, NULL); - - //zconfdebug = 1; - zconfparse(); ---- 487,493 ---- - sym_init(); - menu_init(); - modules_sym = sym_lookup("MODULES", 0); -! rootmenu.prompt = menu_add_prop(P_MENU, "JHALFS Configuration", NULL, NULL); - - //zconfdebug = 1; - zconfparse(); diff --git a/menu/Kconfig-language.txt b/menu/Kconfig-language.txt deleted file mode 100644 index 493749b..0000000 --- a/menu/Kconfig-language.txt +++ /dev/null @@ -1,255 +0,0 @@ -Introduction ------------- - -The configuration database is collection of configuration options -organized in a tree structure: - - +- Code maturity level options - | +- Prompt for development and/or incomplete code/drivers - +- General setup - | +- Networking support - | +- System V IPC - | +- BSD Process Accounting - | +- Sysctl support - +- Loadable module support - | +- Enable loadable module support - | +- Set version information on all module symbols - | +- Kernel module loader - +- ... - -Every entry has its own dependencies. These dependencies are used -to determine the visible of an entry. Any child entry is only -visible if its parent entry is also visible. - -Menu entries ------------- - -Most entries define a config option, all other entries help to organize -them. A single configuration option is defined like this: - -config MODVERSIONS - bool "Set version information on all module symbols" - depends MODULES - help - Usually, modules have to be recompiled whenever you switch to a new - kernel. ... - -Every line starts with a key word and can be followed by multiple -arguments. "config" starts a new config entry. The following lines -define attributes for this config option. Attributes can be the type of -the config option, input prompt, dependencies, help text and default -values. A config option can be defined multiple times with the same -name, but every definition can have only a single input prompt and the -type must not conflict. - -Menu attributes ---------------- - -A menu entry can have a number of attributes. Not all of them are -applicable everywhere (see syntax). - -- type definition: "bool"/"tristate"/"string"/"hex"/"integer" - Every config option must have a type. There are only two basic types: - tristate and string, the other types base on these two. The type - definition optionally accepts an input prompt, so these two examples - are equivalent: - - bool "Networking support" - and - bool - prompt "Networking support" - -- input prompt: "prompt" ["if" ] - Every menu entry can have at most one prompt, which is used to display - to the user. Optionally dependencies only for this prompt can be added - with "if". - -- default value: "default" ["if" ] - A config option can have any number of default values. If multiple - default values are visible, only the first defined one is active. - Default values are not limited to the menu entry, where they are - defined, this means the default can be defined somewhere else or be - overriden by an earlier definition. - The default value is only assigned to the config symbol if no other - value was set by the user (via the input prompt above). If an input - prompt is visible the default value is presented to the user and can - be overridden by him. - Optionally dependencies only for this default value can be added with - "if". - -- dependencies: "depends on"/"requires" - This defines a dependency for this menu entry. If multiple - dependencies are defined they are connected with '&&'. Dependencies - are applied to all other options within this menu entry (which also - accept "if" expression), so these two examples are equivalent: - - bool "foo" if BAR - default y if BAR - and - depends on BAR - bool "foo" - default y - -- help text: "help" - This defines a help text. The end of the help text is determined by - the level indentation, this means it ends at the first line which has - a smaller indentation than the first line of the help text. - - -Menu dependencies ------------------ - -Dependencies define the visibility of a menu entry and can also reduce -the input range of tristate symbols. The tristate logic used in the -expressions uses one more state than normal boolean logic to express the -module state. Dependency expressions have the following syntax: - - ::= (1) - '=' (2) - '!=' (3) - '(' ')' (4) - '!' (5) - '||' (6) - '&&' (7) - -Expressions are listed in decreasing order of precedence. - -(1) Convert the symbol into an expression. Boolean and tristate symbols - are simply converted into the respective expression values. All - other symbol types result in 'n'. -(2) If the values of both symbols are equal, it returns 'y', - otherwise 'n'. -(3) If the values of both symbols are equal, it returns 'n', - otherwise 'y'. -(4) Returns the value of the expression. Used to override precedence. -(5) Returns the result of (2-/expr/). -(6) Returns the result of min(/expr/, /expr/). -(7) Returns the result of max(/expr/, /expr/). - -An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2 -respectively for calculations). A menu entry becomes visible when it's -expression evaluates to 'm' or 'y'. - -There are two type of symbols: constant and nonconstant symbols. -Nonconstant symbols are the most common ones and are defined with the -'config' statement. Nonconstant symbols consist entirely of alphanumeric -characters or underscores. -Constant symbols are only part of expressions. Constant symbols are -always surrounded by single or double quotes. Within the quote any -other character is allowed and the quotes can be escaped using '\'. - -Menu structure --------------- - -The position of a menu entry in the tree is determined in two ways. First -it can be specified explicitely: - -menu "Network device support" - depends NET - -config NETDEVICES - ... - -endmenu - -All entries within the "menu" ... "endmenu" block become a submenu of -"Network device support". All subentries inherit the dependencies from -the menu entry, e.g. this means the dependency "NET" is added to the -dependency list of the config option NETDEVICES. - -The other way to generate the menu structure is done by analyzing the -dependencies. If a menu entry somehow depends on the previous entry, it -can be made a submenu of it. First the the previous (parent) symbol must -be part of the dependency list and then one of these two condititions -must be true: -- the child entry must become invisible, if the parent is set to 'n' -- the child entry must only be visible, if the parent is visible - -config MODULES - bool "Enable loadable module support" - -config MODVERSIONS - bool "Set version information on all module symbols" - depends MODULES - -comment "module support disabled" - depends !MODULES - -MODVERSIONS directly depends on MODULES, this means it's only visible if -MODULES is different from 'n'. The comment on the other hand is always -visible when MODULES it's visible (the (empty) dependency of MODULES is -also part of the comment dependencies). - - -Kconfig syntax --------------- - -The configuration file describes a series of menu entries, where every -line starts with a keyword (except help texts). The following keywords -end a menu entry: -- config -- choice/endchoice -- comment -- menu/endmenu -- if/endif -- source -The first four also start the definition of a menu entry. - -config: - - "config" - - -This defines a config symbol and accepts any of above -attributes as options. - -choices: - - "choice" - - - "endchoice" - -This defines a choice group and accepts any of above attributes as -options. A choice can only be of type bool or tristate, while a boolean -choice only allows a single config entry to be selected, a tristate -choice also allows any number of config entries to be set to 'm'. This -can be used if multiple drivers for a single hardware exists and only a -single driver can be compiled/loaded into the kernel, but all drivers -can be compiled as modules. -A choice accepts another option "optional", which allows to set the -choice to 'n' and no entry needs to be selected. - -comment: - - "comment" - - -This defines a comment which is displayed to the user during the -configuration process and is also echoed to the output files. The only -possible options are dependencies. - -menu: - - "menu" - - - "endmenu" - -This defines a menu block, see "Menu structure" above for more -information. The only possible options are dependencies. - -if: - - "if" - - "endif" - -This defines an if block. The dependency expression is appended -to all enclosed menu entries. - -source: - - "source" - -This reads the specified configuration file. This file is always parsed. diff --git a/menu/LICENSE.txt b/menu/LICENSE.txt new file mode 100644 index 0000000..8b31efc --- /dev/null +++ b/menu/LICENSE.txt @@ -0,0 +1,5 @@ +Copyright (c) 2011-2019, Ulf Magnusson + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/menu/Makefile b/menu/Makefile deleted file mode 100644 index 8a40c98..0000000 --- a/menu/Makefile +++ /dev/null @@ -1,145 +0,0 @@ -# Makefile for BusyBox -# -# Copyright (C) 2002 Erik Andersen -# Modified by George Boudreau georgeb@LinuxFromScratch.org - -top_srcdir=. -top_builddir=. -srcdir=$(top_srcdir) - -# Select the compiler needed to build binaries for your development system -HOSTCC = gcc -HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer - -# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc. -LC_ALL:= C - -SED ?= sed -SECHO := @-false -DISP := pur -Q := @ - -show_objs = $(subst $(top_builddir)/,,$(subst ../,,$@)) -pur_disp_compile.h = echo " "HOSTCC $(show_objs) -disp_compile.h = $($(DISP)_disp_compile.h) -cmd_compile.h = $(HOSTCC) $(HOSTCFLAGS) -c -o $@ $< -compile.h = @$(disp_compile.h) ; $(cmd_compile.h) - - -all: ncurses conf mconf - -ifeq ($(shell uname),SunOS) -LIBS = -lcurses -else -LIBS = -lncurses -endif -ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h)) - HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="" -else -ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h)) - HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="" -else -ifeq (/usr/local/include/ncurses/ncurses.h, $(wildcard /usr/local/include/ncurses/ncurses.h)) - HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="" -else -ifeq (/usr/local/include/ncurses/curses.h, $(wildcard /usr/local/include/ncurses/curses.h)) - HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="" -else -ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h)) - HOSTNCURSES += -DCURSES_LOC="" -else - HOSTNCURSES += -DCURSES_LOC="" -endif -endif -endif -endif -endif - -ifeq (/usr/include/locale.h, $(wildcard /usr/include/locale.h)) - HOSTNCURSES += -DLOCALE=1 -endif - -CONF_SRC = conf.c -MCONF_SRC = mconf.c -LXD_SRC = lxdialog/checklist.c lxdialog/menubox.c lxdialog/textbox.c \ - lxdialog/yesno.c lxdialog/inputbox.c lxdialog/util.c \ - lxdialog/msgbox.c - -SHARED_SRC = zconf.tab.c -SHARED_DEPS := $(srcdir)/lkc.h $(srcdir)/lkc_proto.h \ - lkc_defs.h $(srcdir)/expr.h zconf.tab.h -CONF_OBJS = $(patsubst %.c,%.o, $(CONF_SRC)) -MCONF_OBJS = $(patsubst %.c,%.o, $(MCONF_SRC) $(LXD_SRC)) -SHARED_OBJS = $(patsubst %.c,%.o, $(SHARED_SRC)) - -conf: $(CONF_OBJS) $(SHARED_OBJS) - $(SECHO) " "HOSTCC $@ ; true - $(Q)$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ - -mconf: $(MCONF_OBJS) $(SHARED_OBJS) - $(SECHO) " "HOSTCC $@ ; true - $(Q)$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ $(LIBS) - -$(CONF_OBJS): %.o : $(srcdir)/%.c $(SHARED_DEPS) - $(compile.h) -I. - -$(MCONF_OBJS): %.o : $(srcdir)/%.c $(SHARED_DEPS) - @[ -d $(@D) ] || mkdir $(@D) - $(compile.h) $(HOSTNCURSES) -I. - -lkc_defs.h: $(srcdir)/lkc_proto.h - @$(SED) < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/' - -### -# The following requires flex/bison -# By default we use the _shipped versions, uncomment the -# following line if you are modifying the flex/bison src. -#LKC_GENPARSER := 1 - -ifdef LKC_GENPARSER - -%.tab.c %.tab.h: $(srcdir)/%.y - bison -t -d -v -b $* -p $(notdir $*) $< - -lex.%.c: $(srcdir)/%.l - flex -P$(notdir $*) -o$@ $< -else - -lex.zconf.o: lex.zconf.c $(SHARED_DEPS) - $(compile.h) -I$(srcdir) - -lex.zconf.c: $(srcdir)/lex.zconf.c_shipped - $(Q)cp $< $@ - -zconf.tab.c: $(srcdir)/zconf.tab.c_shipped - $(Q)cp $< $@ - -zconf.tab.h: $(srcdir)/zconf.tab.h_shipped - $(Q)cp $< $@ -endif - -zconf.tab.o: zconf.tab.c lex.zconf.c $(srcdir)/confdata.c $(srcdir)/expr.c \ - $(srcdir)/symbol.c $(srcdir)/menu.c $(SHARED_DEPS) - $(compile.h) -I$(srcdir) -I. - -.PHONY: ncurses - -ncurses: - @echo "int main() {}" > lxtemp.c - @if $(HOSTCC) lxtemp.c $(LIBS) ; then \ - rm -f lxtemp.c a.out; \ - else \ - rm -f lxtemp.c; \ - echo -e "\007" ;\ - echo ">> Unable to find the Ncurses libraries." ;\ - echo ">>" ;\ - echo ">> You must have Ncurses installed in order" ;\ - echo ">> to use 'make menuconfig'" ;\ - echo ;\ - exit 1 ;\ - fi - -clean: - rm -f *.o *~ core $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS) \ - conf mconf zconf.tab.c zconf.tab.h lex.zconf.c lkc_defs.h - diff --git a/menu/README b/menu/README new file mode 100644 index 0000000..aa17bf9 --- /dev/null +++ b/menu/README @@ -0,0 +1,4 @@ +The files in this directory come from +https://github.com/ulfalizer/Kconfiglib.git +They are subjected to the ISC license. +See the file LICENSE.txt diff --git a/menu/conf.c b/menu/conf.c deleted file mode 100644 index 9dd5b28..0000000 --- a/menu/conf.c +++ /dev/null @@ -1,571 +0,0 @@ -/* - * Copyright (C) 2002 Roman Zippel - * Released under the terms of the GNU GPL v2.0. - */ - -#include -#include -#include -#include -#include -#include - -#define LKC_DIRECT_LINK -#include "lkc.h" - -static void conf(struct menu *menu); -static void check_conf(struct menu *menu); - -enum { - ask_all, - ask_new, - ask_silent, - set_default, - set_yes, - set_mod, - set_no, - set_random -} input_mode = ask_all; -char *defconfig_file; - -static int indent = 1; -static int valid_stdin = 1; -static int conf_cnt; -static char line[128]; -static struct menu *rootEntry; - -static char nohelp_text[] = "Sorry, no help available for this option yet.\n"; - -static void strip(char *str) -{ - char *p = str; - int l; - - while ((isspace(*p))) - p++; - l = strlen(p); - if (p != str) - memmove(str, p, l + 1); - if (!l) - return; - p = str + l - 1; - while ((isspace(*p))) - *p-- = 0; -} - -static void check_stdin(void) -{ - if (!valid_stdin && input_mode == ask_silent) { - printf("aborted!\n\n"); - printf("Console input/output is redirected. "); - printf("Run 'make oldconfig' to update configuration.\n\n"); - exit(1); - } -} - -static void conf_askvalue(struct symbol *sym, const char *def) -{ - enum symbol_type type = sym_get_type(sym); - tristate val; - - if (!sym_has_value(sym)) - printf("(NEW) "); - - line[0] = '\n'; - line[1] = 0; - - if (!sym_is_changable(sym)) { - printf("%s\n", def); - line[0] = '\n'; - line[1] = 0; - return; - } - - switch (input_mode) { - case ask_new: - case ask_silent: - if (sym_has_value(sym)) { - printf("%s\n", def); - return; - } - check_stdin(); - case ask_all: - fflush(stdout); - fgets(line, 128, stdin); - return; - case set_default: - printf("%s\n", def); - return; - default: - break; - } - - switch (type) { - case S_INT: - case S_HEX: - case S_STRING: - printf("%s\n", def); - return; - default: - ; - } - switch (input_mode) { - case set_yes: - if (sym_tristate_within_range(sym, yes)) { - line[0] = 'y'; - line[1] = '\n'; - line[2] = 0; - break; - } - case set_mod: - if (type == S_TRISTATE) { - if (sym_tristate_within_range(sym, mod)) { - line[0] = 'm'; - line[1] = '\n'; - line[2] = 0; - break; - } - } else { - if (sym_tristate_within_range(sym, yes)) { - line[0] = 'y'; - line[1] = '\n'; - line[2] = 0; - break; - } - } - case set_no: - if (sym_tristate_within_range(sym, no)) { - line[0] = 'n'; - line[1] = '\n'; - line[2] = 0; - break; - } - case set_random: - do { - val = (tristate)(random() % 3); - } while (!sym_tristate_within_range(sym, val)); - switch (val) { - case no: line[0] = 'n'; break; - case mod: line[0] = 'm'; break; - case yes: line[0] = 'y'; break; - } - line[1] = '\n'; - line[2] = 0; - break; - default: - break; - } - printf("%s", line); -} - -int conf_string(struct menu *menu) -{ - struct symbol *sym = menu->sym; - const char *def, *help; - - while (1) { - printf("%*s%s ", indent - 1, "", menu->prompt->text); - printf("(%s) ", sym->name); - def = sym_get_string_value(sym); - if (sym_get_string_value(sym)) - printf("[%s] ", def); - conf_askvalue(sym, def); - switch (line[0]) { - case '\n': - break; - case '?': - /* print help */ - if (line[1] == '\n') { - help = nohelp_text; - if (menu->sym->help) - help = menu->sym->help; - printf("\n%s\n", help); - def = NULL; - break; - } - default: - line[strlen(line)-1] = 0; - def = line; - } - if (def && sym_set_string_value(sym, def)) - return 0; - } -} - -static int conf_sym(struct menu *menu) -{ - struct symbol *sym = menu->sym; - tristate oldval, newval; - const char *help; - - while (1) { - printf("%*s%s ", indent - 1, "", menu->prompt->text); - if (sym->name) - printf("(%s) ", sym->name); - (void)sym_get_type(sym); - putchar('['); - oldval = sym_get_tristate_value(sym); - switch (oldval) { - case no: - putchar('N'); - break; - case mod: - putchar('M'); - break; - case yes: - putchar('Y'); - break; - } - if (oldval != no && sym_tristate_within_range(sym, no)) - printf("/n"); - if (oldval != mod && sym_tristate_within_range(sym, mod)) - printf("/m"); - if (oldval != yes && sym_tristate_within_range(sym, yes)) - printf("/y"); - if (sym->help) - printf("/?"); - printf("] "); - conf_askvalue(sym, sym_get_string_value(sym)); - strip(line); - - switch (line[0]) { - case 'n': - case 'N': - newval = no; - if (!line[1] || !strcmp(&line[1], "o")) - break; - continue; - case 'm': - case 'M': - newval = mod; - if (!line[1]) - break; - continue; - case 'y': - case 'Y': - newval = yes; - if (!line[1] || !strcmp(&line[1], "es")) - break; - continue; - case 0: - newval = oldval; - break; - case '?': - goto help; - default: - continue; - } - if (sym_set_tristate_value(sym, newval)) - return 0; -help: - help = nohelp_text; - if (sym->help) - help = sym->help; - printf("\n%s\n", help); - } -} - -static int conf_choice(struct menu *menu) -{ - struct symbol *sym, *def_sym; - struct menu *child; - bool is_new; - - sym = menu->sym; - (void)sym_get_type(sym); - is_new = !sym_has_value(sym); - if (sym_is_changable(sym)) { - conf_sym(menu); - sym_calc_value(sym); - switch (sym_get_tristate_value(sym)) { - case no: - return 1; - case mod: - return 0; - case yes: - break; - } - } else { - switch (sym_get_tristate_value(sym)) { - case no: - return 1; - case mod: - printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); - return 0; - case yes: - break; - } - } - - while (1) { - int cnt, def; - - printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); - def_sym = sym_get_choice_value(sym); - cnt = def = 0; - line[0] = '0'; - line[1] = 0; - for (child = menu->list; child; child = child->next) { - if (!menu_is_visible(child)) - continue; - if (!child->sym) { - printf("%*c %s\n", indent, '*', menu_get_prompt(child)); - continue; - } - cnt++; - if (child->sym == def_sym) { - def = cnt; - printf("%*c", indent, '>'); - } else - printf("%*c", indent, ' '); - printf(" %d. %s", cnt, menu_get_prompt(child)); - if (child->sym->name) - printf(" (%s)", child->sym->name); - if (!sym_has_value(child->sym)) - printf(" (NEW)"); - printf("\n"); - } - printf("%*schoice", indent - 1, ""); - if (cnt == 1) { - printf("[1]: 1\n"); - goto conf_childs; - } - printf("[1-%d", cnt); - if (sym->help) - printf("?"); - printf("]: "); - switch (input_mode) { - case ask_new: - case ask_silent: - if (!is_new) { - cnt = def; - printf("%d\n", cnt); - break; - } - check_stdin(); - case ask_all: - fflush(stdout); - fgets(line, 128, stdin); - strip(line); - if (line[0] == '?') { - printf("\n%s\n", menu->sym->help ? - menu->sym->help : nohelp_text); - continue; - } - if (!line[0]) - cnt = def; - else if (isdigit(line[0])) - cnt = atoi(line); - else - continue; - break; - case set_random: - def = (random() % cnt) + 1; - case set_default: - case set_yes: - case set_mod: - case set_no: - cnt = def; - printf("%d\n", cnt); - break; - } - - conf_childs: - for (child = menu->list; child; child = child->next) { - if (!child->sym || !menu_is_visible(child)) - continue; - if (!--cnt) - break; - } - if (!child) - continue; - if (line[strlen(line) - 1] == '?') { - printf("\n%s\n", child->sym->help ? - child->sym->help : nohelp_text); - continue; - } - sym_set_choice_value(sym, child->sym); - if (child->list) { - indent += 2; - conf(child->list); - indent -= 2; - } - return 1; - } -} - -static void conf(struct menu *menu) -{ - struct symbol *sym; - struct property *prop; - struct menu *child; - - if (!menu_is_visible(menu)) - return; - - sym = menu->sym; - prop = menu->prompt; - if (prop) { - const char *prompt; - - switch (prop->type) { - case P_MENU: - if (input_mode == ask_silent && rootEntry != menu) { - check_conf(menu); - return; - } - case P_COMMENT: - prompt = menu_get_prompt(menu); - if (prompt) - printf("%*c\n%*c %s\n%*c\n", - indent, '*', - indent, '*', prompt, - indent, '*'); - default: - ; - } - } - - if (!sym) - goto conf_childs; - - if (sym_is_choice(sym)) { - conf_choice(menu); - if (sym->curr.tri != mod) - return; - goto conf_childs; - } - - switch (sym->type) { - case S_INT: - case S_HEX: - case S_STRING: - conf_string(menu); - break; - default: - conf_sym(menu); - break; - } - -conf_childs: - if (sym) - indent += 2; - for (child = menu->list; child; child = child->next) - conf(child); - if (sym) - indent -= 2; -} - -static void check_conf(struct menu *menu) -{ - struct symbol *sym; - struct menu *child; - - if (!menu_is_visible(menu)) - return; - - sym = menu->sym; - if (sym) { - if (sym_is_changable(sym) && !sym_has_value(sym)) { - if (!conf_cnt++) - printf("*\n* Restart config...\n*\n"); - rootEntry = menu_get_parent_menu(menu); - conf(rootEntry); - } - if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod) - return; - } - - for (child = menu->list; child; child = child->next) - check_conf(child); -} - -int main(int ac, char **av) -{ - int i = 1; - const char *name; - struct stat tmpstat; - - if (ac > i && av[i][0] == '-') { - switch (av[i++][1]) { - case 'o': - input_mode = ask_new; - break; - case 's': - input_mode = ask_silent; - valid_stdin = isatty(0) && isatty(1) && isatty(2); - break; - case 'd': - input_mode = set_default; - break; - case 'D': - input_mode = set_default; - defconfig_file = av[i++]; - if (!defconfig_file) { - printf("%s: No default config file specified\n", - av[0]); - exit(1); - } - break; - case 'n': - input_mode = set_no; - break; - case 'm': - input_mode = set_mod; - break; - case 'y': - input_mode = set_yes; - break; - case 'r': - input_mode = set_random; - srandom(time(NULL)); - break; - case 'h': - case '?': - printf("%s [-o|-s] config\n", av[0]); - exit(0); - } - } - name = av[i]; - if (!name) { - printf("%s: configuration file missing\n", av[0]); - } - conf_parse(name); - //zconfdump(stdout); - switch (input_mode) { - case ask_silent: - if (stat(".config", &tmpstat)) { - printf("***\n" - "*** You have not yet configured JHALFS!\n" - "***\n" - "*** Please run some configurator (e.g. \"make oldconfig\" or\n" - "*** \"make menuconfig\" or \"make config\").\n" - "***\n"); - exit(1); - } - case ask_all: - case ask_new: - conf_read(NULL); - break; - default: - break; - } - - if (input_mode != ask_silent) { - rootEntry = &rootmenu; - conf(&rootmenu); - if (input_mode == ask_all) { - input_mode = ask_silent; - valid_stdin = 1; - } - } - do { - conf_cnt = 0; - check_conf(&rootmenu); - } while (conf_cnt); - if (conf_write(NULL)) { - fprintf(stderr, "\n*** Error during writing of the JHALFS configuration.\n\n"); - return 1; - } - return 0; -} diff --git a/menu/confdata.c b/menu/confdata.c deleted file mode 100644 index 55cb512..0000000 --- a/menu/confdata.c +++ /dev/null @@ -1,392 +0,0 @@ -/* - * Copyright (C) 2002 Roman Zippel - * Released under the terms of the GNU GPL v2.0. - */ - -#include -#include -#include -#include -#include -#include - -#define LKC_DIRECT_LINK -#include "lkc.h" - -const char conf_def_filename[] = "configuration"; - -const char conf_defname[] = "defconfig"; - -const char *conf_confnames[] = { - "configuration", - conf_defname, - NULL, -}; - -static char *conf_expand_value(const char *in) -{ - struct symbol *sym; - const char *src; - static char res_value[SYMBOL_MAXLENGTH]; - char *dst, name[SYMBOL_MAXLENGTH]; - - res_value[0] = 0; - dst = name; - while ((src = strchr(in, '$'))) { - strncat(res_value, in, src - in); - src++; - dst = name; - while (isalnum(*src) || *src == '_') - *dst++ = *src++; - *dst = 0; - sym = sym_lookup(name, 0); - sym_calc_value(sym); - strcat(res_value, sym_get_string_value(sym)); - in = src; - } - strcat(res_value, in); - - return res_value; -} - -int conf_read(const char *name) -{ - FILE *in = NULL; - char line[1024]; - char *p, *p2; - int lineno = 0; - struct symbol *sym; - struct property *prop; - struct expr *e; - int i; - - if (name) { - in = zconf_fopen(name); - } else { - const char **names = conf_confnames; - while ((name = *names++)) { - name = conf_expand_value(name); - in = zconf_fopen(name); - if (in) { - printf("#\n" - "# using defaults found in %s\n" - "#\n", name); - break; - } - } - } - - if (!in) - return 1; - - for_all_symbols(i, sym) { - sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED; - sym->flags &= ~SYMBOL_VALID; - switch (sym->type) { - case S_INT: - case S_HEX: - case S_STRING: - free(sym->user.val); - default: - sym->user.val = NULL; - sym->user.tri = no; - } - } - - while (fgets(line, sizeof(line), in)) { - lineno++; - sym = NULL; - switch (line[0]) { - case '#': - if (line[1]!=' ') - continue; - p = strchr(line + 2, ' '); - if (!p) - continue; - *p++ = 0; - if (strncmp(p, "is not set", 10)) - continue; - sym = sym_find(line + 2); - if (!sym) { - fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 2); - break; - } - switch (sym->type) { - case S_BOOLEAN: - case S_TRISTATE: - sym->user.tri = no; - sym->flags &= ~SYMBOL_NEW; - break; - default: - ; - } - break; - - case 'A' ... 'Z': - p = strchr(line, '='); - if (!p) - continue; - *p++ = 0; - p2 = strchr(p, '\n'); - if (p2) - *p2 = 0; - sym = sym_find(line); - if (!sym) { - fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line); - break; - } - switch (sym->type) { - case S_TRISTATE: - if (p[0] == 'm') { - sym->user.tri = mod; - sym->flags &= ~SYMBOL_NEW; - break; - } - case S_BOOLEAN: - if (p[0] == 'y') { - sym->user.tri = yes; - sym->flags &= ~SYMBOL_NEW; - break; - } - if (p[0] == 'n') { - sym->user.tri = no; - sym->flags &= ~SYMBOL_NEW; - break; - } - break; - case S_STRING: - if (*p++ != '"') - break; - for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { - if (*p2 == '"') { - *p2 = 0; - break; - } - memmove(p2, p2 + 1, strlen(p2)); - } - if (!p2) { - fprintf(stderr, "%s:%d: invalid string found\n", name, lineno); - exit(1); - } - case S_INT: - case S_HEX: - if (sym_string_valid(sym, p)) { - sym->user.val = strdup(p); - sym->flags &= ~SYMBOL_NEW; - } else { - fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name); - exit(1); - } - break; - default: - ; - } - break; - case '\n': - break; - default: - continue; - } - if (sym && sym_is_choice_value(sym)) { - struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); - switch (sym->user.tri) { - case no: - break; - case mod: - if (cs->user.tri == yes) - /* warn? */; - break; - case yes: - if (cs->user.tri != no) - /* warn? */; - cs->user.val = sym; - break; - } - cs->user.tri = E_OR(cs->user.tri, sym->user.tri); - cs->flags &= ~SYMBOL_NEW; - } - } - fclose(in); - - if (modules_sym) - sym_calc_value(modules_sym); - for_all_symbols(i, sym) { - sym_calc_value(sym); - if (sym_has_value(sym) && !sym_is_choice_value(sym)) { - if (sym->visible == no) - sym->flags |= SYMBOL_NEW; - switch (sym->type) { - case S_STRING: - case S_INT: - case S_HEX: - if (!sym_string_within_range(sym, sym->user.val)) - sym->flags |= SYMBOL_NEW; - default: - break; - } - } - if (!sym_is_choice(sym)) - continue; - prop = sym_get_choice_prop(sym); - for (e = prop->expr; e; e = e->left.expr) - if (e->right.sym->visible != no) - sym->flags |= e->right.sym->flags & SYMBOL_NEW; - } - - sym_change_count = 1; - - return 0; -} - -struct menu *next_menu(struct menu *menu) -{ - if (menu->list) return menu->list; - do { - if (menu->next) { - menu = menu->next; - break; - } - } while ((menu = menu->parent)); - - return menu; -} - -#define SYMBOL_FORCEWRITE (1<<31) - -int conf_write(const char *name) -{ - FILE *out; - struct symbol *sym; - struct menu *menu; - const char *basename; - char dirname[128], tmpname[128], newname[128]; - int type, l; - const char *str; - - dirname[0] = 0; - if (name && name[0]) { - struct stat st; - char *slash; - - if (!stat(name, &st) && S_ISDIR(st.st_mode)) { - strcpy(dirname, name); - strcat(dirname, "/"); - basename = conf_def_filename; - } else if ((slash = strrchr(name, '/'))) { - int size = slash - name + 1; - memcpy(dirname, name, size); - dirname[size] = 0; - if (slash[1]) - basename = slash + 1; - else - basename = conf_def_filename; - } else - basename = name; - } else - basename = conf_def_filename; - - sprintf(newname, "%s.tmpconfig.%d", dirname, (int)getpid()); - out = fopen(newname, "w"); - if (!out) - return 1; - fprintf(out, "#\n" - "# Automatically generated configuration: don't edit\n" - "# use make menuconfig or make config to make changes\n" - "#\n"); - - if (!sym_change_count) - sym_clear_all_valid(); - - /* Force write of all non-duplicate symbols. */ - - /* Write out everything by default. */ - for(menu = rootmenu.list; menu; menu = next_menu(menu)) - if (menu->sym) menu->sym->flags |= SYMBOL_FORCEWRITE; - - menu = rootmenu.list; - while (menu) { - sym = menu->sym; - if (!sym) { - if (!menu_is_visible(menu)) - goto next; - str = menu_get_prompt(menu); - fprintf(out, "\n" - "#\n" - "# %s\n" - "#\n", str); - } else if (!(sym->flags & SYMBOL_CHOICE)) { - sym_calc_value(sym); - if (!(sym->flags & SYMBOL_FORCEWRITE)) - goto next; - - sym->flags &= ~SYMBOL_FORCEWRITE; - type = sym->type; - if (type == S_TRISTATE) { - sym_calc_value(modules_sym); - if (modules_sym->curr.tri == no) - type = S_BOOLEAN; - } - - - switch (type) { - case S_BOOLEAN: - case S_TRISTATE: - switch (sym_get_tristate_value(sym)) { - case no: - fprintf(out, "# %s is not set\n", sym->name); - break; - case mod: - fprintf(out, "%s=m\n", sym->name); - break; - case yes: - fprintf(out, "%s=y\n", sym->name); - break; - } - break; - case S_STRING: - // fix me - str = sym_get_string_value(sym); - fprintf(out, "%s=\"", sym->name); - do { - l = strcspn(str, "\"\\"); - if (l) { - fwrite(str, l, 1, out); - } - str += l; - while (*str == '\\' || *str == '"') { - fprintf(out, "\\%c", *str); - str++; - } - } while (*str); - fputs("\"\n", out); - break; - case S_HEX: - str = sym_get_string_value(sym); - if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { - fprintf(out, "%s=%s\n", sym->name, *str ? str : "0"); - break; - } - case S_INT: - str = sym_get_string_value(sym); - fprintf(out, "%s=%s\n", sym->name, *str ? str : "0"); - break; - } - } -next: - menu = next_menu(menu); - } - fclose(out); - if (!name || basename != conf_def_filename) { - if (!name) - name = conf_def_filename; - sprintf(tmpname, "%s.old", name); - rename(name, tmpname); - } - sprintf(tmpname, "%s%s", dirname, basename); - if (rename(newname, tmpname)) - return 1; - - sym_change_count = 0; - - return 0; -} diff --git a/menu/expr.c b/menu/expr.c deleted file mode 100644 index 6f39e7a..0000000 --- a/menu/expr.c +++ /dev/null @@ -1,1099 +0,0 @@ -/* - * Copyright (C) 2002 Roman Zippel - * Released under the terms of the GNU GPL v2.0. - */ - -#include -#include -#include - -#define LKC_DIRECT_LINK -#include "lkc.h" - -#define DEBUG_EXPR 0 - -struct expr *expr_alloc_symbol(struct symbol *sym) -{ - struct expr *e = malloc(sizeof(*e)); - memset(e, 0, sizeof(*e)); - e->type = E_SYMBOL; - e->left.sym = sym; - return e; -} - -struct expr *expr_alloc_one(enum expr_type type, struct expr *ce) -{ - struct expr *e = malloc(sizeof(*e)); - memset(e, 0, sizeof(*e)); - e->type = type; - e->left.expr = ce; - return e; -} - -struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2) -{ - struct expr *e = malloc(sizeof(*e)); - memset(e, 0, sizeof(*e)); - e->type = type; - e->left.expr = e1; - e->right.expr = e2; - return e; -} - -struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2) -{ - struct expr *e = malloc(sizeof(*e)); - memset(e, 0, sizeof(*e)); - e->type = type; - e->left.sym = s1; - e->right.sym = s2; - return e; -} - -struct expr *expr_alloc_and(struct expr *e1, struct expr *e2) -{ - if (!e1) - return e2; - return e2 ? expr_alloc_two(E_AND, e1, e2) : e1; -} - -struct expr *expr_alloc_or(struct expr *e1, struct expr *e2) -{ - if (!e1) - return e2; - return e2 ? expr_alloc_two(E_OR, e1, e2) : e1; -} - -struct expr *expr_copy(struct expr *org) -{ - struct expr *e; - - if (!org) - return NULL; - - e = malloc(sizeof(*org)); - memcpy(e, org, sizeof(*org)); - switch (org->type) { - case E_SYMBOL: - e->left = org->left; - break; - case E_NOT: - e->left.expr = expr_copy(org->left.expr); - break; - case E_EQUAL: - case E_UNEQUAL: - e->left.sym = org->left.sym; - e->right.sym = org->right.sym; - break; - case E_AND: - case E_OR: - case E_CHOICE: - e->left.expr = expr_copy(org->left.expr); - e->right.expr = expr_copy(org->right.expr); - break; - default: - printf("can't copy type %d\n", e->type); - free(e); - e = NULL; - break; - } - - return e; -} - -void expr_free(struct expr *e) -{ - if (!e) - return; - - switch (e->type) { - case E_SYMBOL: - break; - case E_NOT: - expr_free(e->left.expr); - return; - case E_EQUAL: - case E_UNEQUAL: - break; - case E_OR: - case E_AND: - expr_free(e->left.expr); - expr_free(e->right.expr); - break; - default: - printf("how to free type %d?\n", e->type); - break; - } - free(e); -} - -static int trans_count; - -#define e1 (*ep1) -#define e2 (*ep2) - -static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2) -{ - if (e1->type == type) { - __expr_eliminate_eq(type, &e1->left.expr, &e2); - __expr_eliminate_eq(type, &e1->right.expr, &e2); - return; - } - if (e2->type == type) { - __expr_eliminate_eq(type, &e1, &e2->left.expr); - __expr_eliminate_eq(type, &e1, &e2->right.expr); - return; - } - if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && - e1->left.sym == e2->left.sym && (e1->left.sym->flags & (SYMBOL_YES|SYMBOL_NO))) - return; - if (!expr_eq(e1, e2)) - return; - trans_count++; - expr_free(e1); expr_free(e2); - switch (type) { - case E_OR: - e1 = expr_alloc_symbol(&symbol_no); - e2 = expr_alloc_symbol(&symbol_no); - break; - case E_AND: - e1 = expr_alloc_symbol(&symbol_yes); - e2 = expr_alloc_symbol(&symbol_yes); - break; - default: - ; - } -} - -void expr_eliminate_eq(struct expr **ep1, struct expr **ep2) -{ - if (!e1 || !e2) - return; - switch (e1->type) { - case E_OR: - case E_AND: - __expr_eliminate_eq(e1->type, ep1, ep2); - default: - ; - } - if (e1->type != e2->type) switch (e2->type) { - case E_OR: - case E_AND: - __expr_eliminate_eq(e2->type, ep1, ep2); - default: - ; - } - e1 = expr_eliminate_yn(e1); - e2 = expr_eliminate_yn(e2); -} - -#undef e1 -#undef e2 - -int expr_eq(struct expr *e1, struct expr *e2) -{ - int res, old_count; - - if (e1->type != e2->type) - return 0; - switch (e1->type) { - case E_EQUAL: - case E_UNEQUAL: - return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym; - case E_SYMBOL: - return e1->left.sym == e2->left.sym; - case E_NOT: - return expr_eq(e1->left.expr, e2->left.expr); - case E_AND: - case E_OR: - e1 = expr_copy(e1); - e2 = expr_copy(e2); - old_count = trans_count; - expr_eliminate_eq(&e1, &e2); - res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL && - e1->left.sym == e2->left.sym); - expr_free(e1); - expr_free(e2); - trans_count = old_count; - return res; - case E_CHOICE: - case E_RANGE: - case E_NONE: - /* panic */; - } - - if (DEBUG_EXPR) { - expr_fprint(e1, stdout); - printf(" = "); - expr_fprint(e2, stdout); - printf(" ?\n"); - } - - return 0; -} - -struct expr *expr_eliminate_yn(struct expr *e) -{ - struct expr *tmp; - - if (e) switch (e->type) { - case E_AND: - e->left.expr = expr_eliminate_yn(e->left.expr); - e->right.expr = expr_eliminate_yn(e->right.expr); - if (e->left.expr->type == E_SYMBOL) { - if (e->left.expr->left.sym == &symbol_no) { - expr_free(e->left.expr); - expr_free(e->right.expr); - e->type = E_SYMBOL; - e->left.sym = &symbol_no; - e->right.expr = NULL; - return e; - } else if (e->left.expr->left.sym == &symbol_yes) { - free(e->left.expr); - tmp = e->right.expr; - *e = *(e->right.expr); - free(tmp); - return e; - } - } - if (e->right.expr->type == E_SYMBOL) { - if (e->right.expr->left.sym == &symbol_no) { - expr_free(e->left.expr); - expr_free(e->right.expr); - e->type = E_SYMBOL; - e->left.sym = &symbol_no; - e->right.expr = NULL; - return e; - } else if (e->right.expr->left.sym == &symbol_yes) { - free(e->right.expr); - tmp = e->left.expr; - *e = *(e->left.expr); - free(tmp); - return e; - } - } - break; - case E_OR: - e->left.expr = expr_eliminate_yn(e->left.expr); - e->right.expr = expr_eliminate_yn(e->right.expr); - if (e->left.expr->type == E_SYMBOL) { - if (e->left.expr->left.sym == &symbol_no) { - free(e->left.expr); - tmp = e->right.expr; - *e = *(e->right.expr); - free(tmp); - return e; - } else if (e->left.expr->left.sym == &symbol_yes) { - expr_free(e->left.expr); - expr_free(e->right.expr); - e->type = E_SYMBOL; - e->left.sym = &symbol_yes; - e->right.expr = NULL; - return e; - } - } - if (e->right.expr->type == E_SYMBOL) { - if (e->right.expr->left.sym == &symbol_no) { - free(e->right.expr); - tmp = e->left.expr; - *e = *(e->left.expr); - free(tmp); - return e; - } else if (e->right.expr->left.sym == &symbol_yes) { - expr_free(e->left.expr); - expr_free(e->right.expr); - e->type = E_SYMBOL; - e->left.sym = &symbol_yes; - e->right.expr = NULL; - return e; - } - } - break; - default: - ; - } - return e; -} - -/* - * bool FOO!=n => FOO - */ -struct expr *expr_trans_bool(struct expr *e) -{ - if (!e) - return NULL; - switch (e->type) { - case E_AND: - case E_OR: - case E_NOT: - e->left.expr = expr_trans_bool(e->left.expr); - e->right.expr = expr_trans_bool(e->right.expr); - break; - case E_UNEQUAL: - // FOO!=n -> FOO - if (e->left.sym->type == S_TRISTATE) { - if (e->right.sym == &symbol_no) { - e->type = E_SYMBOL; - e->right.sym = NULL; - } - } - break; - default: - ; - } - return e; -} - -/* - * e1 || e2 -> ? - */ -struct expr *expr_join_or(struct expr *e1, struct expr *e2) -{ - struct expr *tmp; - struct symbol *sym1, *sym2; - - if (expr_eq(e1, e2)) - return expr_copy(e1); - if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) - return NULL; - if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) - return NULL; - if (e1->type == E_NOT) { - tmp = e1->left.expr; - if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) - return NULL; - sym1 = tmp->left.sym; - } else - sym1 = e1->left.sym; - if (e2->type == E_NOT) { - if (e2->left.expr->type != E_SYMBOL) - return NULL; - sym2 = e2->left.expr->left.sym; - } else - sym2 = e2->left.sym; - if (sym1 != sym2) - return NULL; - if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) - return NULL; - if (sym1->type == S_TRISTATE) { - if (e1->type == E_EQUAL && e2->type == E_EQUAL && - ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || - (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) { - // (a='y') || (a='m') -> (a!='n') - return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no); - } - if (e1->type == E_EQUAL && e2->type == E_EQUAL && - ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || - (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) { - // (a='y') || (a='n') -> (a!='m') - return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod); - } - if (e1->type == E_EQUAL && e2->type == E_EQUAL && - ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || - (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) { - // (a='m') || (a='n') -> (a!='y') - return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes); - } - } - if (sym1->type == S_BOOLEAN && sym1 == sym2) { - if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) || - (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL)) - return expr_alloc_symbol(&symbol_yes); - } - - if (DEBUG_EXPR) { - printf("optimize ("); - expr_fprint(e1, stdout); - printf(") || ("); - expr_fprint(e2, stdout); - printf(")?\n"); - } - return NULL; -} - -struct expr *expr_join_and(struct expr *e1, struct expr *e2) -{ - struct expr *tmp; - struct symbol *sym1, *sym2; - - if (expr_eq(e1, e2)) - return expr_copy(e1); - if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) - return NULL; - if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) - return NULL; - if (e1->type == E_NOT) { - tmp = e1->left.expr; - if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) - return NULL; - sym1 = tmp->left.sym; - } else - sym1 = e1->left.sym; - if (e2->type == E_NOT) { - if (e2->left.expr->type != E_SYMBOL) - return NULL; - sym2 = e2->left.expr->left.sym; - } else - sym2 = e2->left.sym; - if (sym1 != sym2) - return NULL; - if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) - return NULL; - - if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) || - (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes)) - // (a) && (a='y') -> (a='y') - return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); - - if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) || - (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no)) - // (a) && (a!='n') -> (a) - return expr_alloc_symbol(sym1); - - if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) || - (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod)) - // (a) && (a!='m') -> (a='y') - return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); - - if (sym1->type == S_TRISTATE) { - if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) { - // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' - sym2 = e1->right.sym; - if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) - return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) - : expr_alloc_symbol(&symbol_no); - } - if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) { - // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' - sym2 = e2->right.sym; - if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) - return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) - : expr_alloc_symbol(&symbol_no); - } - if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && - ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || - (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) - // (a!='y') && (a!='n') -> (a='m') - return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod); - - if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && - ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || - (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) - // (a!='y') && (a!='m') -> (a='n') - return expr_alloc_comp(E_EQUAL, sym1, &symbol_no); - - if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && - ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || - (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) - // (a!='m') && (a!='n') -> (a='m') - return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); - - if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) || - (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) || - (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) || - (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes)) - return NULL; - } - - if (DEBUG_EXPR) { - printf("optimize ("); - expr_fprint(e1, stdout); - printf(") && ("); - expr_fprint(e2, stdout); - printf(")?\n"); - } - return NULL; -} - -static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2) -{ -#define e1 (*ep1) -#define e2 (*ep2) - struct expr *tmp; - - if (e1->type == type) { - expr_eliminate_dups1(type, &e1->left.expr, &e2); - expr_eliminate_dups1(type, &e1->right.expr, &e2); - return; - } - if (e2->type == type) { - expr_eliminate_dups1(type, &e1, &e2->left.expr); - expr_eliminate_dups1(type, &e1, &e2->right.expr); - return; - } - if (e1 == e2) - return; - - switch (e1->type) { - case E_OR: case E_AND: - expr_eliminate_dups1(e1->type, &e1, &e1); - default: - ; - } - - switch (type) { - case E_OR: - tmp = expr_join_or(e1, e2); - if (tmp) { - expr_free(e1); expr_free(e2); - e1 = expr_alloc_symbol(&symbol_no); - e2 = tmp; - trans_count++; - } - break; - case E_AND: - tmp = expr_join_and(e1, e2); - if (tmp) { - expr_free(e1); expr_free(e2); - e1 = expr_alloc_symbol(&symbol_yes); - e2 = tmp; - trans_count++; - } - break; - default: - ; - } -#undef e1 -#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 -} - -struct expr *expr_eliminate_dups(struct expr *e) -{ - int oldcount; - if (!e) - return e; - - oldcount = trans_count; - while (1) { - trans_count = 0; - 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) - break; - e = expr_eliminate_yn(e); - } - trans_count = oldcount; - return e; -} - -struct expr *expr_transform(struct expr *e) -{ - struct expr *tmp; - - if (!e) - return NULL; - switch (e->type) { - case E_EQUAL: - case E_UNEQUAL: - case E_SYMBOL: - case E_CHOICE: - break; - default: - e->left.expr = expr_transform(e->left.expr); - e->right.expr = expr_transform(e->right.expr); - } - - switch (e->type) { - case E_EQUAL: - if (e->left.sym->type != S_BOOLEAN) - break; - if (e->right.sym == &symbol_no) { - e->type = E_NOT; - e->left.expr = expr_alloc_symbol(e->left.sym); - e->right.sym = NULL; - break; - } - if (e->right.sym == &symbol_mod) { - printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name); - e->type = E_SYMBOL; - e->left.sym = &symbol_no; - e->right.sym = NULL; - break; - } - if (e->right.sym == &symbol_yes) { - e->type = E_SYMBOL; - e->right.sym = NULL; - break; - } - break; - case E_UNEQUAL: - if (e->left.sym->type != S_BOOLEAN) - break; - if (e->right.sym == &symbol_no) { - e->type = E_SYMBOL; - e->right.sym = NULL; - break; - } - if (e->right.sym == &symbol_mod) { - printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name); - e->type = E_SYMBOL; - e->left.sym = &symbol_yes; - e->right.sym = NULL; - break; - } - if (e->right.sym == &symbol_yes) { - e->type = E_NOT; - e->left.expr = expr_alloc_symbol(e->left.sym); - e->right.sym = NULL; - break; - } - break; - case E_NOT: - switch (e->left.expr->type) { - case E_NOT: - // !!a -> a - tmp = e->left.expr->left.expr; - free(e->left.expr); - free(e); - e = tmp; - e = expr_transform(e); - break; - case E_EQUAL: - case E_UNEQUAL: - // !a='x' -> a!='x' - tmp = e->left.expr; - free(e); - e = tmp; - e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL; - break; - case E_OR: - // !(a || b) -> !a && !b - tmp = e->left.expr; - e->type = E_AND; - e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); - tmp->type = E_NOT; - tmp->right.expr = NULL; - e = expr_transform(e); - break; - case E_AND: - // !(a && b) -> !a || !b - tmp = e->left.expr; - e->type = E_OR; - e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); - tmp->type = E_NOT; - tmp->right.expr = NULL; - e = expr_transform(e); - break; - case E_SYMBOL: - if (e->left.expr->left.sym == &symbol_yes) { - // !'y' -> 'n' - tmp = e->left.expr; - free(e); - e = tmp; - e->type = E_SYMBOL; - e->left.sym = &symbol_no; - break; - } - if (e->left.expr->left.sym == &symbol_mod) { - // !'m' -> 'm' - tmp = e->left.expr; - free(e); - e = tmp; - e->type = E_SYMBOL; - e->left.sym = &symbol_mod; - break; - } - if (e->left.expr->left.sym == &symbol_no) { - // !'n' -> 'y' - tmp = e->left.expr; - free(e); - e = tmp; - e->type = E_SYMBOL; - e->left.sym = &symbol_yes; - break; - } - break; - default: - ; - } - break; - default: - ; - } - return e; -} - -int expr_contains_symbol(struct expr *dep, struct symbol *sym) -{ - if (!dep) - return 0; - - switch (dep->type) { - case E_AND: - case E_OR: - return expr_contains_symbol(dep->left.expr, sym) || - expr_contains_symbol(dep->right.expr, sym); - case E_SYMBOL: - return dep->left.sym == sym; - case E_EQUAL: - case E_UNEQUAL: - return dep->left.sym == sym || - dep->right.sym == sym; - case E_NOT: - return expr_contains_symbol(dep->left.expr, sym); - default: - ; - } - return 0; -} - -bool expr_depends_symbol(struct expr *dep, struct symbol *sym) -{ - if (!dep) - return false; - - switch (dep->type) { - case E_AND: - return expr_depends_symbol(dep->left.expr, sym) || - expr_depends_symbol(dep->right.expr, sym); - case E_SYMBOL: - return dep->left.sym == sym; - case E_EQUAL: - if (dep->left.sym == sym) { - if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod) - return true; - } - break; - case E_UNEQUAL: - if (dep->left.sym == sym) { - if (dep->right.sym == &symbol_no) - return true; - } - break; - default: - ; - } - 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 -} - -struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym) -{ - struct expr *e1, *e2; - - if (!e) { - e = expr_alloc_symbol(sym); - if (type == E_UNEQUAL) - e = expr_alloc_one(E_NOT, e); - return e; - } - switch (e->type) { - case E_AND: - e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); - e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); - if (sym == &symbol_yes) - e = expr_alloc_two(E_AND, e1, e2); - if (sym == &symbol_no) - e = expr_alloc_two(E_OR, e1, e2); - if (type == E_UNEQUAL) - e = expr_alloc_one(E_NOT, e); - return e; - case E_OR: - e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); - e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); - if (sym == &symbol_yes) - e = expr_alloc_two(E_OR, e1, e2); - if (sym == &symbol_no) - e = expr_alloc_two(E_AND, e1, e2); - if (type == E_UNEQUAL) - e = expr_alloc_one(E_NOT, e); - return e; - case E_NOT: - return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym); - case E_UNEQUAL: - case E_EQUAL: - if (type == E_EQUAL) { - if (sym == &symbol_yes) - return expr_copy(e); - if (sym == &symbol_mod) - return expr_alloc_symbol(&symbol_no); - if (sym == &symbol_no) - return expr_alloc_one(E_NOT, expr_copy(e)); - } else { - if (sym == &symbol_yes) - return expr_alloc_one(E_NOT, expr_copy(e)); - if (sym == &symbol_mod) - return expr_alloc_symbol(&symbol_yes); - if (sym == &symbol_no) - return expr_copy(e); - } - break; - case E_SYMBOL: - return expr_alloc_comp(type, e->left.sym, sym); - case E_CHOICE: - case E_RANGE: - case E_NONE: - /* panic */; - } - return NULL; -} - -tristate expr_calc_value(struct expr *e) -{ - tristate val1, val2; - const char *str1, *str2; - - if (!e) - return yes; - - switch (e->type) { - case E_SYMBOL: - sym_calc_value(e->left.sym); - return e->left.sym->curr.tri; - case E_AND: - val1 = expr_calc_value(e->left.expr); - val2 = expr_calc_value(e->right.expr); - return E_AND(val1, val2); - case E_OR: - val1 = expr_calc_value(e->left.expr); - val2 = expr_calc_value(e->right.expr); - return E_OR(val1, val2); - case E_NOT: - val1 = expr_calc_value(e->left.expr); - return E_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_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; - default: - printf("expr_calc_value: %d?\n", e->type); - return no; - } -} - -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_EQUAL: - case E_UNEQUAL: - if (t2 == E_NOT) - return 1; - case E_NOT: - if (t2 == E_AND) - return 1; - case E_AND: - if (t2 == E_OR) - return 1; - case E_OR: - if (t2 == E_CHOICE) - return 1; - case E_CHOICE: - if (t2 == 0) - return 1; - default: - return -1; - } - printf("[%dgt%d?]", t1, t2); - return 0; -#endif -} - -void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken) -{ - if (!e) { - fn(data, "y"); - return; - } - - if (expr_compare_type(prevtoken, e->type) > 0) - fn(data, "("); - switch (e->type) { - case E_SYMBOL: - if (e->left.sym->name) - fn(data, e->left.sym->name); - else - fn(data, ""); - break; - case E_NOT: - fn(data, "!"); - expr_print(e->left.expr, fn, data, E_NOT); - break; - case E_EQUAL: - fn(data, e->left.sym->name); - fn(data, "="); - fn(data, e->right.sym->name); - break; - case E_UNEQUAL: - fn(data, e->left.sym->name); - fn(data, "!="); - fn(data, e->right.sym->name); - break; - case E_OR: - expr_print(e->left.expr, fn, data, E_OR); - fn(data, " || "); - expr_print(e->right.expr, fn, data, E_OR); - break; - case E_AND: - expr_print(e->left.expr, fn, data, E_AND); - fn(data, " && "); - expr_print(e->right.expr, fn, data, E_AND); - break; - case E_CHOICE: - fn(data, e->right.sym->name); - if (e->left.expr) { - fn(data, " ^ "); - expr_print(e->left.expr, fn, data, E_CHOICE); - } - break; - case E_RANGE: - fn(data, "["); - fn(data, e->left.sym->name); - fn(data, " "); - fn(data, e->right.sym->name); - fn(data, "]"); - break; - default: - { - char buf[32]; - sprintf(buf, "", e->type); - fn(data, buf); - break; - } - } - if (expr_compare_type(prevtoken, e->type) > 0) - fn(data, ")"); -} - -static void expr_print_file_helper(void *data, const char *str) -{ - fwrite(str, strlen(str), 1, data); -} - -void expr_fprint(struct expr *e, FILE *out) -{ - expr_print(e, expr_print_file_helper, out, E_NONE); -} - -static void expr_print_gstr_helper(void *data, const char *str) -{ - str_append((struct gstr*)data, str); -} - -void expr_gstr_print(struct expr *e, struct gstr *gs) -{ - expr_print(e, expr_print_gstr_helper, gs, E_NONE); -} diff --git a/menu/expr.h b/menu/expr.h deleted file mode 100644 index 7d39ff4..0000000 --- a/menu/expr.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (C) 2002 Roman Zippel - * Released under the terms of the GNU GPL v2.0. - */ - -#ifndef EXPR_H -#define EXPR_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#ifndef __cplusplus -#include -#endif - -struct file { - struct file *next; - struct file *parent; - char *name; - int lineno; - int flags; -}; - -#define FILE_BUSY 0x0001 -#define FILE_SCANNED 0x0002 -#define FILE_PRINTED 0x0004 - -typedef enum tristate { - no, mod, yes -} tristate; - -enum expr_type { - E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE -}; - -union expr_data { - struct expr *expr; - struct symbol *sym; -}; - -struct expr { - enum expr_type type; - union expr_data left, right; -}; - -#define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2)) -#define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2)) -#define E_NOT(dep) (2-(dep)) - -struct expr_value { - struct expr *expr; - tristate tri; -}; - -struct symbol_value { - void *val; - tristate tri; -}; - -enum symbol_type { - S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER -}; - -struct symbol { - struct symbol *next; - char *name; - char *help; - enum symbol_type type; - struct symbol_value curr, user; - tristate visible; - int flags; - struct property *prop; - struct expr *dep, *dep2; - struct expr_value rev_dep; -}; - -#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) - -#define SYMBOL_YES 0x0001 -#define SYMBOL_MOD 0x0002 -#define SYMBOL_NO 0x0004 -#define SYMBOL_CONST 0x0007 -#define SYMBOL_CHECK 0x0008 -#define SYMBOL_CHOICE 0x0010 -#define SYMBOL_CHOICEVAL 0x0020 -#define SYMBOL_PRINTED 0x0040 -#define SYMBOL_VALID 0x0080 -#define SYMBOL_OPTIONAL 0x0100 -#define SYMBOL_WRITE 0x0200 -#define SYMBOL_CHANGED 0x0400 -#define SYMBOL_NEW 0x0800 -#define SYMBOL_AUTO 0x1000 -#define SYMBOL_CHECKED 0x2000 -#define SYMBOL_CHECK_DONE 0x4000 -#define SYMBOL_WARNED 0x8000 - -#define SYMBOL_MAXLENGTH 256 -#define SYMBOL_HASHSIZE 257 -#define SYMBOL_HASHMASK 0xff - -enum prop_type { - P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE -}; - -struct property { - struct property *next; - struct symbol *sym; - enum prop_type type; - const char *text; - struct expr_value visible; - struct expr *expr; - struct menu *menu; - struct file *file; - int lineno; -}; - -#define for_all_properties(sym, st, tok) \ - for (st = sym->prop; st; st = st->next) \ - if (st->type == (tok)) -#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT) -#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE) -#define for_all_prompts(sym, st) \ - for (st = sym->prop; st; st = st->next) \ - if (st->text) - -struct menu { - struct menu *next; - struct menu *parent; - struct menu *list; - struct symbol *sym; - struct property *prompt; - struct expr *dep; - unsigned int flags; - //char *help; - struct file *file; - int lineno; - void *data; -}; - -#define MENU_CHANGED 0x0001 -#define MENU_ROOT 0x0002 - -#ifndef SWIG - -extern struct file *file_list; -extern struct file *current_file; -struct file *lookup_file(const char *name); - -extern struct symbol symbol_yes, symbol_no, symbol_mod; -extern struct symbol *modules_sym; -extern int cdebug; -struct expr *expr_alloc_symbol(struct symbol *sym); -struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); -struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2); -struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2); -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(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); - -void expr_fprint(struct expr *e, FILE *out); -struct gstr; /* forward */ -void expr_gstr_print(struct expr *e, struct gstr *gs); - -static inline int expr_is_yes(struct expr *e) -{ - return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes); -} - -static inline int expr_is_no(struct expr *e) -{ - return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no); -} -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* EXPR_H */ diff --git a/menu/kconfiglib.py b/menu/kconfiglib.py new file mode 100644 index 0000000..30b68f0 --- /dev/null +++ b/menu/kconfiglib.py @@ -0,0 +1,6661 @@ +# Copyright (c) 2011-2019, Ulf Magnusson +# SPDX-License-Identifier: ISC + +""" +Overview +======== + +Kconfiglib is a Python 2/3 library for scripting and extracting information +from Kconfig (https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt) +configuration systems. + +See the homepage at https://github.com/ulfalizer/Kconfiglib for a longer +overview. + +Using Kconfiglib on the Linux kernel with the Makefile targets +============================================================== + +For the Linux kernel, a handy interface is provided by the +scripts/kconfig/Makefile patch, which can be applied with either 'git am' or +the 'patch' utility: + + $ wget -qO- https://raw.githubusercontent.com/ulfalizer/Kconfiglib/master/makefile.patch | git am + $ wget -qO- https://raw.githubusercontent.com/ulfalizer/Kconfiglib/master/makefile.patch | patch -p1 + +Warning: Not passing -p1 to patch will cause the wrong file to be patched. + +Please tell me if the patch does not apply. It should be trivial to apply +manually, as it's just a block of text that needs to be inserted near the other +*conf: targets in scripts/kconfig/Makefile. + +Look further down for a motivation for the Makefile patch and for instructions +on how you can use Kconfiglib without it. + +If you do not wish to install Kconfiglib via pip, the Makefile patch is set up +so that you can also just clone Kconfiglib into the kernel root: + + $ git clone git://github.com/ulfalizer/Kconfiglib.git + $ git am Kconfiglib/makefile.patch (or 'patch -p1 < Kconfiglib/makefile.patch') + +Warning: The directory name Kconfiglib/ is significant in this case, because +it's added to PYTHONPATH by the new targets in makefile.patch. + +The targets added by the Makefile patch are described in the following +sections. + + +make kmenuconfig +---------------- + +This target runs the curses menuconfig interface with Python 3 (Python 2 is +currently not supported for the menuconfig). + + +make [ARCH=] iscriptconfig +-------------------------------- + +This target gives an interactive Python prompt where a Kconfig instance has +been preloaded and is available in 'kconf'. To change the Python interpreter +used, pass PYTHONCMD= to make. The default is "python". + +To get a feel for the API, try evaluating and printing the symbols in +kconf.defined_syms, and explore the MenuNode menu tree starting at +kconf.top_node by following 'next' and 'list' pointers. + +The item contained in a menu node is found in MenuNode.item (note that this can +be one of the constants kconfiglib.MENU and kconfiglib.COMMENT), and all +symbols and choices have a 'nodes' attribute containing their menu nodes +(usually only one). Printing a menu node will print its item, in Kconfig +format. + +If you want to look up a symbol by name, use the kconf.syms dictionary. + + +make scriptconfig SCRIPT=