Tagged 2.3 release.
This commit is contained in:
parent
99d04a0e97
commit
fd48886416
116 changed files with 29649 additions and 0 deletions
38
2.3/BLFS/Makefile
Normal file
38
2.3/BLFS/Makefile
Normal file
|
@ -0,0 +1,38 @@
|
|||
# From the Build Scripts Written By: Jim Gifford <lfs@jg555.com>
|
||||
# Modified By: Joe Ciccone <jciccone@linuxfromscratch.org
|
||||
# Additional changes: George Boudreau <georgeb@linuxfromscratch.org>
|
||||
|
||||
# $Id$
|
||||
|
||||
TOPDIR=$(shell pwd)
|
||||
CONFIG_CONFIG_IN = Config.in
|
||||
CONFIG = menu
|
||||
|
||||
all: menuconfig
|
||||
|
||||
$(CONFIG)/conf:
|
||||
$(MAKE) -B -C $(CONFIG) conf
|
||||
|
||||
$(CONFIG)/mconf:
|
||||
$(MAKE) -B -C $(CONFIG) ncurses conf mconf
|
||||
|
||||
menuconfig: $(CONFIG)/mconf
|
||||
@./update_book.sh none
|
||||
@./gen_config.sh
|
||||
@$(CONFIG)/mconf $(CONFIG_CONFIG_IN)
|
||||
@./gen_pkg_book.sh
|
||||
|
||||
config: $(CONFIG)/conf
|
||||
@$(CONFIG)/conf $(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 $(CONFIG)/conf $(CONFIG)/mconf
|
20
2.3/BLFS/TODO
Normal file
20
2.3/BLFS/TODO
Normal file
|
@ -0,0 +1,20 @@
|
|||
#####
|
||||
#
|
||||
# Project TODO list
|
||||
#
|
||||
# $Id$
|
||||
#####
|
||||
|
||||
|
||||
-- Review generated scripts for bugs trying to figure out if are due fails
|
||||
in the BLFS book XML tagging (that will implied that the book need be
|
||||
fixed) or are required variations due book layout. If the latter, try
|
||||
to fix it via XSL, documenting in README.BLFS that issues that can't be
|
||||
fixed.
|
||||
|
||||
This is an on-going and never-end task due that, ideally, each commit to
|
||||
the BLFS book should be revised and validated, but our time is limited.
|
||||
|
||||
-- Bugs hunting.
|
||||
|
||||
-- Find a better way to define circular dependencies.
|
91
2.3/BLFS/envars.conf
Normal file
91
2.3/BLFS/envars.conf
Normal file
|
@ -0,0 +1,91 @@
|
|||
#####
|
||||
#
|
||||
# Configuration file for the BLFS module
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Set default envars used in the build scripts
|
||||
#
|
||||
#####
|
||||
|
||||
#======== Common envars ==========
|
||||
|
||||
#--- Set a well-known working locale when building software
|
||||
export LC_ALL=C
|
||||
|
||||
#--- The local repository for packages/file
|
||||
# Any missing file will be downloaded and archived here,
|
||||
# if the user has the right priviledges.
|
||||
export SRC_ARCHIVE=$SRC_ARCHIVE
|
||||
|
||||
#--- Server used if the file isn't found in SRC_ARCHIVE.
|
||||
# As a last resort, the file will dowloaded from upstream, if possible.
|
||||
#
|
||||
# The server path MUST be set as listed in
|
||||
# http://www.linuxfromscratch.org/blfs/download.html
|
||||
export FTP_SERVER=ftp://anduin.linuxfromscratch.org/BLFS/
|
||||
|
||||
|
||||
#--- The sources directory.
|
||||
# Full path to the top level directory where packages will be stored,
|
||||
# unpacked, and compiled.
|
||||
export SRC_DIR=$HOME/sources
|
||||
|
||||
|
||||
#======== Xorg7 envars ===========
|
||||
|
||||
#--- Installation prefix
|
||||
export XORG_PREFIX=/usr
|
||||
|
||||
#--- Configure switches
|
||||
export XORG_CONFIG="--prefix=$XORG_PREFIX --sysconfdir=/etc --mandir=$XORG_PREFIX/share/man --localstatedir=/var"
|
||||
|
||||
#======== GNOME envars ===========
|
||||
|
||||
#--- Installation prefix
|
||||
export GNOME_PREFIX=/usr
|
||||
|
||||
#--- If you want to install GNOME on a non standart prefix, uncomment
|
||||
# the next export lines and edit it if needed.
|
||||
# See also the GNOME Pre-installation Configuration HTML page for
|
||||
# aditional required commands.
|
||||
#export PATH=$PATH:$GNOME_PREFIX/bin
|
||||
#export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$GNOME_PREFIX/lib/pkgconfig
|
||||
#export GNOME_LIBCONFIG_PATH=/usr/lib:$GNOME_PREFIX/lib
|
||||
|
||||
#======== KDE envars =============
|
||||
|
||||
#--- Installation prefix
|
||||
export KDE_PREFIX=/usr
|
||||
|
||||
#--- If you want to install KDE on a non standart prefix, uncomment
|
||||
# the next export lines and edit it if needed.
|
||||
# See also the KDE Pre-installation Configuration HTML page for
|
||||
# aditional required commands.
|
||||
#export PATH=$PATH:$KDE_PREFIX/bin
|
||||
#export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$KDE_PREFIX/lib/pkgconfig
|
||||
|
||||
|
||||
|
||||
#======== Optimizations =============
|
||||
|
||||
# Global optimization settings can be placed here. This settings can be
|
||||
# overrided by settings in the packages build scripts.
|
||||
|
||||
# WARNING: The use of build optimizations may be dangerous.
|
||||
# You should know what you are doing and be sure that the
|
||||
# optimization settings placed below are what you want.
|
||||
# It there are build issues or the system doesn't work as
|
||||
# expected, please rebuild without optimizations before
|
||||
# asking for support.
|
||||
|
||||
#export MAKEFLAGS="-j3"
|
||||
|
||||
#export CFLAGS="-O3 -pipe"
|
||||
#export CXXFLAGS=$CFLAGS
|
||||
#export LDFLAGS="-s"
|
||||
|
||||
#export OTHER_CFLAGS=$CFLAGS
|
||||
#export OTHER_CXXFLAGS=$CXXFLAGS
|
||||
#export OTHER_LDFLAGS=$LDFLAGS
|
||||
|
264
2.3/BLFS/gen-makefile.sh
Executable file
264
2.3/BLFS/gen-makefile.sh
Executable file
|
@ -0,0 +1,264 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
set -e
|
||||
|
||||
# TEMPORARY VARIABLES.. development use only
|
||||
declare MKFILE=Makefile
|
||||
declare PREV_PACKAGE=""
|
||||
declare BUILD_SCRIPTS=scripts
|
||||
declare TRACKING_DIR=tracking-dir
|
||||
|
||||
HEADER="# This file is automatically generated by gen-makefile.sh
|
||||
# YOU MAY NEED TO EDIT THIS FILE MANUALLY
|
||||
#
|
||||
# Generated on `date \"+%F %X %Z\"`"
|
||||
|
||||
|
||||
#----------------------------------#
|
||||
__wrt_target() { # Create target and initialize log file
|
||||
#----------------------------------#
|
||||
local i=$1
|
||||
local PREV=$2
|
||||
(
|
||||
cat << EOF
|
||||
|
||||
$i: $PREV
|
||||
@\$(call echo_message, Building)
|
||||
@/bin/bash progress_bar.sh \$@ \$\$PPID &
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
|
||||
|
||||
#----------------------------------#
|
||||
__write_build_cmd() { #
|
||||
#----------------------------------#
|
||||
(
|
||||
cat << EOF
|
||||
@source ../envars.conf && ${BUILD_SCRIPTS}/\$@ >logs/\$@ 2>&1
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
__wrt_touch() { #
|
||||
#----------------------------------#
|
||||
local pkg_name=$1
|
||||
local pkg_ver=$2
|
||||
local alsa_ver=$(grep "^alsa[[:space:]]" ../packages | cut -f3)
|
||||
local kde_core_ver=$(grep "^kde-core[[:space:]]" ../packages | cut -f3)
|
||||
local xorg7_ver=$(grep "^xorg7[[:space:]]" ../packages | cut -f3)
|
||||
|
||||
if [[ -n "$pkg_ver" ]] ; then
|
||||
(
|
||||
cat << EOF
|
||||
@rm -f \$(TRACKING_DIR)/${pkg_name#*-?-}-{0..9}* && \\
|
||||
touch \$(TRACKING_DIR)/${pkg_name#*-?-}-${pkg_ver}
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
fi
|
||||
|
||||
case $pkg_name in
|
||||
*-alsa-lib ) #this the unique mandatory package for ALSA support.
|
||||
(
|
||||
cat << EOF
|
||||
@rm -f \$(TRACKING_DIR)/alsa-{0..9}* && \\
|
||||
touch \$(TRACKING_DIR)/alsa-${alsa_ver}
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
;;
|
||||
*-kdebase )
|
||||
(
|
||||
cat << EOF
|
||||
@rm -f \$(TRACKING_DIR)/kde-core-{0..9}* && \\
|
||||
touch \$(TRACKING_DIR)/kde-core-${kde_core_ver}
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
;;
|
||||
*-xorg7-driver ) # xtrerm2 and rman are optional
|
||||
(
|
||||
cat << EOF
|
||||
@rm -f \$(TRACKING_DIR)/xorg7-{0..9}* && \\
|
||||
touch \$(TRACKING_DIR)/xorg7-${xorg7_ver}
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
;;
|
||||
esac
|
||||
|
||||
(
|
||||
cat << EOF
|
||||
@touch \$@ && \\
|
||||
sleep .25 && \\
|
||||
echo -e "\n\n "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
|
||||
echo --------------------------------------------------------------------------------\$(WHITE)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
|
||||
#----------------------------#
|
||||
__write_entry() { #
|
||||
#----------------------------#
|
||||
local script_name=$1
|
||||
local pkg_ver=$2
|
||||
|
||||
echo -n "${tab_}${tab_} entry for <$script_name>"
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
__wrt_target "${script_name}" "$PREV_PACKAGE"
|
||||
__write_build_cmd
|
||||
|
||||
# Include a touch of the target name so make can check
|
||||
# if it's already been made.
|
||||
__wrt_touch "${script_name}" "${pkg_ver}"
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
echo " .. OK"
|
||||
}
|
||||
|
||||
#----------------------------#
|
||||
__write_meta_pkg_touch() { #
|
||||
#----------------------------#
|
||||
local meta_pkg=$1
|
||||
local pkg_ver=$(grep "^${meta_pkg}[[:space:]]" ../packages | cut -f3)
|
||||
local gnome_core_ver=$(grep "^gnome-core[[:space:]]" ../packages | cut -f3)
|
||||
local kde_full_ver=$(grep "^kde-full[[:space:]]" ../packages | cut -f3)
|
||||
|
||||
(
|
||||
cat << EOF
|
||||
|
||||
999-z-$meta_pkg: $PREV_PACKAGE
|
||||
@rm -f \$(TRACKING_DIR)/${meta_pkg}-{0..9}* && \\
|
||||
touch \$(TRACKING_DIR)/${meta_pkg}-${pkg_ver}
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
|
||||
case $meta_pkg in
|
||||
gnome-full )
|
||||
(
|
||||
cat << EOF
|
||||
@rm -f \$(TRACKING_DIR)/gnome-core-{0..9}* && \\
|
||||
touch \$(TRACKING_DIR)/gnome-core-${gnome_core_ver}
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
;;
|
||||
kde-koffice )
|
||||
(
|
||||
cat << EOF
|
||||
@rm -f \$(TRACKING_DIR)/kde-full-{0..9}* && \\
|
||||
touch \$(TRACKING_DIR)/kde-full-${kde_full_ver}
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
;;
|
||||
esac
|
||||
|
||||
(
|
||||
cat << EOF
|
||||
@touch \$@
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
|
||||
}
|
||||
|
||||
#----------------------------#
|
||||
generate_Makefile () { #
|
||||
#----------------------------#
|
||||
|
||||
|
||||
echo "${tab_}Creating Makefile... ${BOLD}START${OFF}"
|
||||
|
||||
# Start with a clean files
|
||||
>$MKFILE
|
||||
>$MKFILE.tmp
|
||||
|
||||
|
||||
for package_script in scripts/* ; do
|
||||
this_script=`basename $package_script`
|
||||
pkg_ver=$(grep "^${this_script#*-?-}[[:space:]]" ../packages | cut -f3)
|
||||
pkg_list="$pkg_list ${this_script}"
|
||||
__write_entry "${this_script}" "${pkg_ver}"
|
||||
PREV_PACKAGE=${this_script}
|
||||
done
|
||||
|
||||
PACKAGE=$(basename $PWD)
|
||||
|
||||
# alsa, kde-core and xorg7 are also available dependencies, thus handled
|
||||
# in another way.
|
||||
case $PACKAGE in
|
||||
gnome-core | \
|
||||
gnome-full | \
|
||||
kde-full | \
|
||||
kde-koffice ) pkg_list="$pkg_list 999-z-${PACKAGE}"
|
||||
__write_meta_pkg_touch "${PACKAGE}"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
# Add a header, some variables and include the function file
|
||||
# to the top of the real Makefile.
|
||||
(
|
||||
cat << EOF
|
||||
$HEADER
|
||||
|
||||
PACKAGE= $PACKAGE
|
||||
TRACKING_DIR= $TRACKING_DIR
|
||||
|
||||
BOLD= "[0;1m"
|
||||
RED= "[1;31m"
|
||||
GREEN= "[0;32m"
|
||||
ORANGE= "[0;33m"
|
||||
BLUE= "[1;34m"
|
||||
WHITE= "[00m"
|
||||
|
||||
define echo_message
|
||||
@echo \$(BOLD)
|
||||
@echo --------------------------------------------------------------------------------
|
||||
@echo \$(BOLD)\$(1) target \$(BLUE)\$@\$(BOLD)
|
||||
@echo \$(WHITE)
|
||||
endef
|
||||
|
||||
|
||||
define fin_message
|
||||
@echo \$(BOLD)
|
||||
@echo --------------------------------------------------------------------------------
|
||||
@echo \$(BOLD) Build complete for the package \$(BLUE)\$(PACKAGE)\$(BOLD) and its dependencies
|
||||
@echo \$(WHITE)
|
||||
endef
|
||||
|
||||
all : $pkg_list
|
||||
@\$(call fin_message )
|
||||
EOF
|
||||
) > $MKFILE
|
||||
|
||||
cat $MKFILE.tmp >> $MKFILE
|
||||
echo "${tab_}Creating Makefile... ${BOLD}DONE${OFF}"
|
||||
|
||||
rm $MKFILE.tmp
|
||||
|
||||
}
|
||||
|
||||
if [[ -e Config.in ]] ; then
|
||||
echo -e "\n\tThis script must be run from inside a target package directory.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -d scripts ]] ; then
|
||||
echo -e "\n\tNo ./scripts/ directory has been found.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
generate_Makefile
|
||||
|
||||
cp ../progress_bar.sh .
|
||||
|
||||
mkdir -p logs
|
276
2.3/BLFS/gen_config.sh
Executable file
276
2.3/BLFS/gen_config.sh
Executable file
|
@ -0,0 +1,276 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
export outFile=Config.in # file for reading and writing to.
|
||||
export inFile=packages # file for reading and writing to.
|
||||
|
||||
declare PKG_NAME
|
||||
declare PKG_XML_FILE
|
||||
declare PKG_DIR
|
||||
declare PKG_VER
|
||||
declare INST_VER
|
||||
declare INST_STRING
|
||||
declare SAVE_IFS=${IFS}
|
||||
declare -a DIR_TREE
|
||||
declare PREV_DIR1="none"
|
||||
declare PREV_DIR2="none"
|
||||
declare MENU_SET1="n"
|
||||
declare MENU_SET2="n"
|
||||
|
||||
> $outFile
|
||||
|
||||
#---------------------#
|
||||
# MAIN #
|
||||
#---------------------#
|
||||
: <<enddoc
|
||||
This script will create a Config.in file from the contents
|
||||
of the file <packages>.
|
||||
Packages previously installed will not be included.
|
||||
enddoc
|
||||
|
||||
echo -en "\tGenerating Config.in from package data ..."
|
||||
while [ 0 ]
|
||||
do
|
||||
|
||||
# read -r || break 1
|
||||
read || break 1
|
||||
|
||||
set -- $REPLY
|
||||
PKG_NAME=$1
|
||||
PKG_XML_FILE=$(basename $2)
|
||||
PKG_DIR=$(dirname $2)
|
||||
PKG_VER=$3
|
||||
INST_VER=$4
|
||||
# These are the META packages.
|
||||
if [ $PKG_DIR = "." ]; then
|
||||
SET_COMMENT=y
|
||||
# Do not include previously installed packages
|
||||
if [ -n "${PKG_VER}" ] && [ "x${PKG_VER}" = "x${INST_VER}" ]; then
|
||||
continue
|
||||
fi
|
||||
# Set installed version for updated meta-packages
|
||||
[ -n "${INST_VER}" ] && INST_STRING="[installed ${INST_VER}]"
|
||||
|
||||
META_PKG=$(echo ${PKG_NAME} | tr [a-z] [A-Z])
|
||||
(
|
||||
cat << EOF
|
||||
config CONFIG_$META_PKG
|
||||
bool "$META_PKG $PKG_VER $INST_STRING"
|
||||
default n
|
||||
|
||||
menu "$(echo ${PKG_NAME} | tr [a-z] [A-Z]) components"
|
||||
depends CONFIG_$META_PKG
|
||||
|
||||
EOF
|
||||
) >> $outFile
|
||||
|
||||
unset INST_STRING
|
||||
|
||||
# Include the dependency data for this meta package
|
||||
while [ 0 ]; do
|
||||
read || break 1
|
||||
PKG_NAME=${REPLY}
|
||||
PKG_VER=$(grep "^${PKG_NAME}[[:space:]]" $inFile | cut -f3)
|
||||
INST_VER=$(grep "^${PKG_NAME}[[:space:]]" $inFile | cut -f4)
|
||||
# Skip installed meta-package components
|
||||
if [ -n "${PKG_VER}" ] && [ "x${PKG_VER}" = "x${INST_VER}" ]; then
|
||||
continue
|
||||
fi
|
||||
# Set installed version for updated meta-packages components
|
||||
[ -n "${INST_VER}" ] && INST_STRING="[installed ${INST_VER}]"
|
||||
(
|
||||
cat << EOF
|
||||
config DEP_${META_PKG}_${PKG_NAME}
|
||||
bool "$PKG_NAME ${PKG_VER} ${INST_STRING}"
|
||||
default y
|
||||
|
||||
EOF
|
||||
) >> $outFile
|
||||
unset INST_STRING
|
||||
done <./libs/${PKG_NAME}.dep
|
||||
echo -e "endmenu" >> $outFile
|
||||
continue
|
||||
fi
|
||||
[[ "${SET_COMMENT}" = "y" ]] && echo "comment \"\"" >>$outFile; unset SET_COMMENT
|
||||
|
||||
# Deal with targets that are part of a meta-package but that are in the same
|
||||
# directory that non meta-package targets
|
||||
case ${PKG_NAME} in
|
||||
alsa-* | \
|
||||
xorg7-* | \
|
||||
x-config | \
|
||||
x-setup | \
|
||||
libXau | \
|
||||
libxcb | \
|
||||
libXdmcp | \
|
||||
luit | \
|
||||
xbitmaps | \
|
||||
xcb-proto | \
|
||||
xkeyboard-config | \
|
||||
mesalib | \
|
||||
libdrm ) continue ;;
|
||||
esac
|
||||
|
||||
# Skip installed packages
|
||||
if [ -n "${PKG_VER}" ] && [ "x${PKG_VER}" = "x${INST_VER}" ]; then
|
||||
continue
|
||||
fi
|
||||
# Set installed version for updated packages
|
||||
[ -n "${INST_VER}" ] && INST_STRING="[installed ${INST_VER}]"
|
||||
|
||||
IFS="/"
|
||||
DIR_TREE=(${PKG_DIR})
|
||||
IFS="$SAVE_IFS"
|
||||
|
||||
# Define a top level menu
|
||||
if [ "$PREV_DIR1" != "${DIR_TREE[1]}" ]; then
|
||||
[[ "${DIR_TREE[1]}" = "kde" ]] && continue
|
||||
[[ "${DIR_TREE[1]}" = "gnome" ]] && continue
|
||||
|
||||
if [ $MENU_SET1 = "y" ]; then
|
||||
# Close out any open secondary menu
|
||||
if [ $MENU_SET2 = "y" ]; then
|
||||
echo -e "\tendmenu" >> $outFile
|
||||
# Reset 'menu open' flag
|
||||
MENU_SET2="n"
|
||||
fi
|
||||
# Close the current top level menu
|
||||
echo -e "endmenu\n" >> $outFile
|
||||
fi
|
||||
# Open a new top level menu
|
||||
echo -e "menu "$(echo ${DIR_TREE[1]:0:1} | tr [a-z] [A-Z])${DIR_TREE[1]:1}"" >> $outFile
|
||||
MENU_SET1="y"
|
||||
fi
|
||||
|
||||
# Define a secondary menu
|
||||
if [ "$PREV_DIR2" != "${DIR_TREE[2]}" ]; then
|
||||
# Close out the previous open menu structure
|
||||
if [ $MENU_SET2 = "y" ]; then
|
||||
echo -e "\tendmenu\n" >> $outFile
|
||||
fi
|
||||
# Initialize a new 2nd level menu structure.
|
||||
echo -e "\tmenu "$(echo ${DIR_TREE[2]:0:1} | tr [a-z] [A-Z])${DIR_TREE[2]:1}"" >> $outFile
|
||||
MENU_SET2="y"
|
||||
fi
|
||||
(
|
||||
cat << EOF
|
||||
config CONFIG_$PKG_NAME
|
||||
bool "$PKG_NAME ${PKG_VER} ${INST_STRING}"
|
||||
default n
|
||||
EOF
|
||||
) >> $outFile
|
||||
|
||||
unset INST_STRING
|
||||
|
||||
PREV_DIR1=${DIR_TREE[1]}
|
||||
PREV_DIR2=${DIR_TREE[2]}
|
||||
done <"$inFile"
|
||||
|
||||
if [ $MENU_SET2 = "y" ]; then echo -e "\tendmenu" >> $outFile; fi
|
||||
if [ $MENU_SET1 = "y" ]; then echo "endmenu" >> $outFile; fi
|
||||
|
||||
(
|
||||
cat << EOF
|
||||
|
||||
comment ""
|
||||
|
||||
menu "Default packages for resolving dependencies"
|
||||
|
||||
choice
|
||||
prompt "Default print server"
|
||||
config PS_cups
|
||||
bool "cups"
|
||||
config PS_LPRng
|
||||
bool "LPRng"
|
||||
endchoice
|
||||
config PRINT_SERVER
|
||||
string
|
||||
default cups if PS_cups
|
||||
default LPRng if PS_LPRng
|
||||
|
||||
choice
|
||||
prompt "Mail server"
|
||||
config MS_sendmail
|
||||
bool "sendmail"
|
||||
config MS_postfix
|
||||
bool "postfix"
|
||||
config MS_exim
|
||||
bool "exim"
|
||||
endchoice
|
||||
config MAIL_SERVER
|
||||
string
|
||||
default sendmail if MS_sendmail
|
||||
default postfix if MS_postfix
|
||||
default exim if MS_exim
|
||||
|
||||
choice
|
||||
prompt "Postscript package"
|
||||
config GS_espgs
|
||||
bool "espgs"
|
||||
config GS_ghostscript
|
||||
bool "ghostscript"
|
||||
endchoice
|
||||
config GHOSTSCRIPT
|
||||
string
|
||||
default espgs if GS_espgs
|
||||
default ghostscript if GS_ghostscript
|
||||
|
||||
choice
|
||||
prompt "Kerberos 5"
|
||||
config KER_mitkrb
|
||||
bool "mitkrb"
|
||||
config KER_heimdal
|
||||
bool "heimdal"
|
||||
endchoice
|
||||
config KBR5
|
||||
string
|
||||
default heimdal if KER_heimdal
|
||||
default mitkrb if KER_mitkrb
|
||||
|
||||
choice
|
||||
prompt "Window package"
|
||||
config WIN_xorg7
|
||||
bool "Xorg7"
|
||||
config WIN_xfree86
|
||||
bool "xfree86"
|
||||
endchoice
|
||||
config X11
|
||||
string
|
||||
default xorg7 if WIN_xorg7
|
||||
default xfree86 if WIN_xfree86
|
||||
endmenu
|
||||
|
||||
choice
|
||||
prompt "Dependency level"
|
||||
default DEPLVL_2
|
||||
|
||||
config DEPLVL_1
|
||||
bool "Required dependencies only"
|
||||
|
||||
config DEPLVL_2
|
||||
bool "Required and recommended dependencies"
|
||||
|
||||
config DEPLVL_3
|
||||
bool "Required, recommended and optional dependencies"
|
||||
|
||||
endchoice
|
||||
config optDependency
|
||||
int
|
||||
default 1 if DEPLVL_1
|
||||
default 2 if DEPLVL_2
|
||||
default 3 if DEPLVL_3
|
||||
|
||||
|
||||
config SUDO
|
||||
bool "Build as User"
|
||||
default y
|
||||
help
|
||||
Select if sudo will be used (you want build as a normal user)
|
||||
otherwise sudo is not needed (you want build as root)
|
||||
EOF
|
||||
) >> $outFile
|
||||
echo "done"
|
||||
|
||||
|
178
2.3/BLFS/gen_pkg_book.sh
Executable file
178
2.3/BLFS/gen_pkg_book.sh
Executable file
|
@ -0,0 +1,178 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Read and parse the configuration parameters..
|
||||
#
|
||||
set -e
|
||||
|
||||
declare -r ConfigFile="configuration"
|
||||
declare TARGET
|
||||
declare DEP_LEVEL
|
||||
declare SUDO
|
||||
declare PKGXML
|
||||
declare BLFS_XML
|
||||
declare VERBOSITY=1
|
||||
|
||||
#--------------------------#
|
||||
parse_configuration() { #
|
||||
#--------------------------#
|
||||
local cntr
|
||||
local optTARGET
|
||||
|
||||
while [ 0 ]; do
|
||||
read || break 1
|
||||
|
||||
# Garbage collection
|
||||
case ${REPLY} in
|
||||
\#* | '') continue ;;
|
||||
esac
|
||||
|
||||
case "${REPLY}" in
|
||||
CONFIG_ALSA=* | \
|
||||
CONFIG_GNOME-CORE=* | \
|
||||
CONFIG_GNOME-FULL=* | \
|
||||
CONFIG_KDE-CORE=* | \
|
||||
CONFIG_KDE-FULL=* | \
|
||||
CONFIG_KDE-KOFFICE=* | \
|
||||
CONFIG_XORG7=* ) REPLY=${REPLY%=*} # Strip the trailing '=y' test.. unecessary
|
||||
echo -n "${REPLY}"
|
||||
if [[ $((++cntr)) > 1 ]]; then
|
||||
echo " <<-- ERROR:: SELECT ONLY 1 PACKAGE AT A TIME, META-PACKAGE NOT SELECTED"
|
||||
else
|
||||
echo ""
|
||||
optTARGET=$(echo $REPLY | cut -d "_" -f2 | tr [A-Z] [a-z])
|
||||
fi
|
||||
continue ;;
|
||||
|
||||
# Create global variables for these parameters.
|
||||
optDependency=* | \
|
||||
PRINT_SERVER=* | \
|
||||
MAIL_SERVER=* | \
|
||||
GHOSTSCRIPT=* | \
|
||||
KBR5=* | \
|
||||
X11=* | \
|
||||
SUDO=* ) eval ${REPLY} # Define/set a global variable..
|
||||
continue ;;
|
||||
esac
|
||||
|
||||
if [[ "${REPLY}" =~ ^CONFIG_ ]]; then
|
||||
echo -n "$REPLY"
|
||||
if [[ $((++cntr)) > 1 ]]; then
|
||||
echo " <<-- ERROR SELECT ONLY 1 PACKAGE AT A TIME, WILL NOT BUILD"
|
||||
else
|
||||
echo ""
|
||||
optTARGET=$( echo $REPLY | sed -e 's@CONFIG_@@' -e 's@=y@@' )
|
||||
fi
|
||||
fi
|
||||
done <$ConfigFile
|
||||
|
||||
if [[ $optTARGET = "" ]]; then
|
||||
echo -e "\n>>> NO TARGET SELECTED.. applicaton terminated"
|
||||
echo -e " Run <make> again and select a package to build\n"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
TARGET=$optTARGET
|
||||
DEP_LEVEL=$optDependency
|
||||
SUDO=${SUDO:-n}
|
||||
}
|
||||
|
||||
#--------------------------#
|
||||
validate_configuration() { #
|
||||
#--------------------------#
|
||||
local -r dotSTR=".................."
|
||||
local -r PARAM_LIST="TARGET DEP_LEVEL SUDO PRINT_SERVER MAIL_SERVER GHOSTSCRIPT KBR5 X11"
|
||||
local -r PARAM_VALS='${config_param}${dotSTR:${#config_param}} ${L_arrow}${BOLD}${!config_param}${OFF}${R_arrow}'
|
||||
local config_param
|
||||
|
||||
for config_param in ${PARAM_LIST}; do
|
||||
echo -e "`eval echo $PARAM_VALS`"
|
||||
done
|
||||
}
|
||||
|
||||
#
|
||||
# Regenerate the META-package dependencies from the configuration file
|
||||
#
|
||||
#--------------------------#
|
||||
regenerate_deps() { #
|
||||
#--------------------------#
|
||||
|
||||
rm -f libs/*.dep-MOD
|
||||
while [ 0 ]; do
|
||||
read || break 1
|
||||
case ${REPLY} in
|
||||
\#* | '') continue ;;
|
||||
esac
|
||||
|
||||
# Drop the "=y"
|
||||
REPLY=${REPLY%=*}
|
||||
if [[ "${REPLY}" =~ ^DEP_ ]]; then
|
||||
META_PACKAGE=$(echo $REPLY | cut -d "_" -f2 | tr [A-Z] [a-z])
|
||||
DEP_FNAME=$(echo $REPLY | cut -d "_" -f3)
|
||||
echo "${DEP_FNAME}" >>libs/${META_PACKAGE}.dep-MOD
|
||||
fi
|
||||
|
||||
done <$ConfigFile
|
||||
#
|
||||
# Replace to 'old' dependency file with a new one.
|
||||
#
|
||||
for dst in `ls ./libs/*.dep-MOD 2>/dev/null`; do
|
||||
cp -vf $dst ${dst%-MOD}
|
||||
done
|
||||
}
|
||||
|
||||
#
|
||||
# Clean configuration file keeping only global default settings.
|
||||
# That prevent "trying to assign nonexistent symbol" messages
|
||||
# and assures that there is no TARGET selected from a previous run
|
||||
#
|
||||
#--------------------------#
|
||||
clean_configuration() { #
|
||||
#--------------------------#
|
||||
|
||||
tail -n 29 configuration > configuration.tmp
|
||||
mv configuration.tmp configuration
|
||||
|
||||
}
|
||||
|
||||
#---------------------
|
||||
# Constants
|
||||
source libs/constants.inc
|
||||
[[ $? > 0 ]] && echo -e "\n\tERROR: constants.inc did not load..\n" && exit
|
||||
|
||||
#---------------------
|
||||
# Dependencies module
|
||||
source libs/func_dependencies
|
||||
[[ $? > 0 ]] && echo -e "\n\tERROR: func_dependencies did not load..\n" && exit
|
||||
|
||||
#---------------------
|
||||
# parser module
|
||||
source libs/func_parser
|
||||
[[ $? > 0 ]] && echo -e "\n\tERROR: func_parser did not load..\n" && exit
|
||||
|
||||
|
||||
#------- MAIN --------
|
||||
if [[ ! -f packages ]] ; then
|
||||
echo -e "\tNo packages file has been found.\n"
|
||||
echo -e "\tExecution aborted.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
parse_configuration
|
||||
validate_configuration
|
||||
echo "${SD_BORDER}${nl_}"
|
||||
echo -n "Are you happy with these settings? yes/no (no): "
|
||||
read ANSWER
|
||||
if [ x$ANSWER != "xyes" ] ; then
|
||||
echo "${nl_}Rerun make and fix your settings.${nl_}"
|
||||
exit 1
|
||||
fi
|
||||
echo "${nl_}${SD_BORDER}${nl_}"
|
||||
regenerate_deps
|
||||
generate_dependency_tree
|
||||
generate_TARGET_xml
|
||||
generate_target_book
|
||||
create_build_scripts "${SUDO}"
|
||||
clean_configuration
|
105
2.3/BLFS/libs/book.xsl
Normal file
105
2.3/BLFS/libs/book.xsl
Normal file
|
@ -0,0 +1,105 @@
|
|||
<?xml version='1.0' encoding='ISO-8859-1'?>
|
||||
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns="http://www.w3.org/1999/xhtml"
|
||||
version="1.0">
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<!-- NOTE: the base dir (blfs-xml) is set to the proper dir
|
||||
via a sed in ./blfs -->
|
||||
<xsl:import href="../blfs-xml/stylesheets/blfs-chunked.xsl"/>
|
||||
|
||||
<xsl:param name="mail_server" select="sendmail"/>
|
||||
|
||||
<xsl:param name="xwindow" select="xorg7"/>
|
||||
|
||||
<!-- Template from BLFS_XML/stylesheets/xhtml/lfs-xref.xsl.-->
|
||||
<xsl:template match="xref" name="xref">
|
||||
|
||||
<!-- IDs that need be remaped to the proper file -->
|
||||
<xsl:variable name="linkend">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@linkend = 'alsa'">
|
||||
<xsl:text>alsa-lib</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="@linkend = 'arts'">
|
||||
<xsl:text>aRts</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="@linkend = 'kde'">
|
||||
<xsl:text>kdelibs</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="@linkend = 'server-mail'">
|
||||
<xsl:value-of select="$mail_server"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="@linkend = 'x-window-system'">
|
||||
<xsl:value-of select="$xwindow"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="@linkend"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:variable name="targets" select="key('id',$linkend)"/>
|
||||
<!-- -->
|
||||
|
||||
<xsl:variable name="target" select="$targets[1]"/>
|
||||
<xsl:variable name="refelem" select="local-name($target)"/>
|
||||
<xsl:variable name="role" select="@role"/>
|
||||
<xsl:call-template name="check.id.unique">
|
||||
<xsl:with-param name="linkend" select="$linkend"/>
|
||||
</xsl:call-template>
|
||||
<xsl:call-template name="anchor"/>
|
||||
<xsl:choose>
|
||||
|
||||
<!-- Dead links -->
|
||||
<xsl:when test="count($target) = 0">
|
||||
<b>
|
||||
<xsl:value-of select="@linkend"/>
|
||||
</b>
|
||||
<tt>
|
||||
<xsl:text> (in the full book)</xsl:text>
|
||||
</tt>
|
||||
</xsl:when>
|
||||
<!-- -->
|
||||
|
||||
<xsl:when test="$target/@xreflabel">
|
||||
<a>
|
||||
<xsl:attribute name="href">
|
||||
<xsl:call-template name="href.target">
|
||||
<xsl:with-param name="object" select="$target"/>
|
||||
</xsl:call-template>
|
||||
</xsl:attribute>
|
||||
<xsl:call-template name="xref.xreflabel">
|
||||
<xsl:with-param name="target" select="$target"/>
|
||||
</xsl:call-template>
|
||||
</a>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:variable name="href">
|
||||
<xsl:call-template name="href.target">
|
||||
<xsl:with-param name="object" select="$target"/>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
<xsl:apply-templates select="$target" mode="xref-to-prefix"/>
|
||||
<a href="{$href}">
|
||||
<xsl:if test="$target/title or $target/*/title">
|
||||
<xsl:attribute name="title">
|
||||
<xsl:apply-templates select="$target" mode="xref-title"/>
|
||||
</xsl:attribute>
|
||||
</xsl:if>
|
||||
<xsl:apply-templates select="$target" mode="xref-to">
|
||||
<xsl:with-param name="referrer" select="."/>
|
||||
<xsl:with-param name="role" select="$role"/>
|
||||
<xsl:with-param name="xrefstyle">
|
||||
<xsl:value-of select="@xrefstyle"/>
|
||||
</xsl:with-param>
|
||||
</xsl:apply-templates>
|
||||
</a>
|
||||
<xsl:apply-templates select="$target" mode="xref-to-suffix"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
35
2.3/BLFS/libs/constants.inc
Normal file
35
2.3/BLFS/libs/constants.inc
Normal file
|
@ -0,0 +1,35 @@
|
|||
#####
|
||||
#
|
||||
# common constants
|
||||
#
|
||||
# $Id$
|
||||
#####
|
||||
|
||||
|
||||
# VT100 colors
|
||||
declare -r BLACK=$'\e[1;30m'
|
||||
declare -r DK_GRAY=$'\e[0;30m'
|
||||
|
||||
declare -r RED=$'\e[31m'
|
||||
declare -r GREEN=$'\e[32m'
|
||||
declare -r YELLOW=$'\e[33m'
|
||||
declare -r BLUE=$'\e[34m'
|
||||
declare -r MAGENTA=$'\e[35m'
|
||||
declare -r CYAN=$'\e[36m'
|
||||
declare -r WHITE=$'\e[37m'
|
||||
|
||||
declare -r OFF=$'\e[0m'
|
||||
declare -r BOLD=$'\e[1m'
|
||||
declare -r REVERSE=$'\e[7m'
|
||||
declare -r HIDDEN=$'\e[8m'
|
||||
|
||||
declare -r tab_=$'\t'
|
||||
declare -r nl_=$'\n'
|
||||
|
||||
declare -r DD_BORDER="${BOLD}==============================================================================${OFF}"
|
||||
declare -r SD_BORDER="${BOLD}------------------------------------------------------------------------------${OFF}"
|
||||
declare -r STAR_BORDER="${BOLD}******************************************************************************${OFF}"
|
||||
|
||||
# bold yellow > < pair
|
||||
declare -r R_arrow=$'\e[1;33m>\e[0m'
|
||||
declare -r L_arrow=$'\e[1;33m<\e[0m'
|
47
2.3/BLFS/libs/dependencies.xsl
Normal file
47
2.3/BLFS/libs/dependencies.xsl
Normal file
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
version="1.0">
|
||||
|
||||
<xsl:output method="text"/>
|
||||
|
||||
<xsl:param name="dependencies" select="2"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:apply-templates select="//para[@role='optional']"/>
|
||||
<xsl:apply-templates select="//para[@role='recommended']"/>
|
||||
<xsl:apply-templates select="//para[@role='required']"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="//text()"/>
|
||||
|
||||
<xsl:template match="para[@role='required']">
|
||||
<xsl:apply-templates select="xref">
|
||||
<xsl:sort select="position()" data-type="number" order="descending"/>
|
||||
</xsl:apply-templates>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="para[@role='recommended']">
|
||||
<xsl:if test="$dependencies != '1'">
|
||||
<xsl:apply-templates select="xref">
|
||||
<xsl:sort select="position()" data-type="number" order="descending"/>
|
||||
</xsl:apply-templates>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="para[@role='optional']">
|
||||
<xsl:if test="$dependencies = '3'">
|
||||
<xsl:apply-templates select="xref">
|
||||
<xsl:sort select="position()" data-type="number" order="descending"/>
|
||||
</xsl:apply-templates>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="xref">
|
||||
<xsl:value-of select="@linkend"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
421
2.3/BLFS/libs/func_dependencies
Normal file
421
2.3/BLFS/libs/func_dependencies
Normal file
|
@ -0,0 +1,421 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
set -e
|
||||
|
||||
declare -i cntr=0
|
||||
declare -a spaceSTR=" "
|
||||
|
||||
#----------------------------#
|
||||
generate_dependency_tree() { #
|
||||
#----------------------------#
|
||||
: <<inline_doc
|
||||
function: Create a dependency tree for the TARGET
|
||||
input vars: none
|
||||
externals: vars: TARGET
|
||||
PKGXML
|
||||
DEP_LEVEL
|
||||
func: do_dependencies
|
||||
modifies: vars: PKGXML
|
||||
BLFS_XML
|
||||
returns: nothing
|
||||
output: files: $TARGET.dep
|
||||
$TARGET-index.xml.tmp
|
||||
depure.txt
|
||||
on error: nothing
|
||||
on success: nothing
|
||||
inline_doc
|
||||
|
||||
local ENTRY_START
|
||||
local ENTRY_END
|
||||
|
||||
#---------------------
|
||||
# Create the working directory and cd into it
|
||||
if [[ -d $TARGET ]] ; then
|
||||
echo -e "\tERROR: Looks like $TARGET has been already processed."
|
||||
echo -e "\tPlease delete or rename the $TARGET directory.\n"
|
||||
exit 1
|
||||
else
|
||||
mkdir $TARGET && cd $TARGET
|
||||
fi
|
||||
|
||||
#---------------------
|
||||
# XML file of the target package
|
||||
PKGXML=`grep "^$TARGET[[:space:]]" ../packages | cut -f2`
|
||||
|
||||
#---------------------
|
||||
# The BLFS sources directory.
|
||||
BLFS_XML=`echo $PKGXML | sed -e 's,/.*,,'`
|
||||
|
||||
if [[ ! -d ../$BLFS_XML ]] ; then
|
||||
echo -e "\tThe BLFS book sources directory is missing.\n"
|
||||
echo -e "\tExecution aborted.\n"
|
||||
cd .. && rmdir $TARGET
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#---------------------
|
||||
# XInclude stuff
|
||||
ENTRY_START="<xi:include xmlns:xi=\"http://www.w3.org/2003/XInclude\" href=\"../"
|
||||
ENTRY_END="\"/>"
|
||||
|
||||
echo -e "\tGenerating $TARGET dependencies tree ..."
|
||||
|
||||
mkdir dependencies
|
||||
|
||||
#---------------------
|
||||
# Create target package dependencies list
|
||||
case $TARGET in
|
||||
# Skip the creation when all dependencies are circular.
|
||||
alsa-lib | cracklib | libexif | unixodbc ) ;;
|
||||
|
||||
# Meta-packages at target level
|
||||
alsa )
|
||||
cp ../libs/alsa.dep dependencies/
|
||||
;;
|
||||
gnome-core )
|
||||
cp ../libs/gnome-core.dep dependencies/
|
||||
;;
|
||||
gnome-full )
|
||||
cp ../libs/gnome-{core,full}.dep dependencies/
|
||||
;;
|
||||
kde-core )
|
||||
cp ../libs/kde-core.dep dependencies/
|
||||
;;
|
||||
kde-full )
|
||||
cp ../libs/kde-{core,full}.dep dependencies/
|
||||
;;
|
||||
kde-koffice )
|
||||
cp ../libs/kde-{core,full,koffice}.dep dependencies/
|
||||
;;
|
||||
xorg7 )
|
||||
cp ../libs/xorg7.dep dependencies/
|
||||
;;
|
||||
* ) # Default
|
||||
xsltproc --stringparam dependencies $DEP_LEVEL \
|
||||
-o dependencies/$TARGET.dep \
|
||||
../libs/dependencies.xsl ../$PKGXML
|
||||
;;
|
||||
esac
|
||||
|
||||
#---------------------
|
||||
# Start with a clean $TARGET-index.xml.tmp file
|
||||
> $TARGET-index.xml.tmp
|
||||
|
||||
#---------------------
|
||||
# Write the XInclude
|
||||
case $TARGET in
|
||||
# If there is no usefull XML page, skip it.
|
||||
alsa | gnome-core | gnome-full | kde-core | kde-full | kde-koffice | xorg7) ;;
|
||||
* )
|
||||
echo -e " $ENTRY_START$PKGXML$ENTRY_END" >> $TARGET-index.xml.tmp
|
||||
;;
|
||||
esac
|
||||
|
||||
#---------------------
|
||||
# If have dependencies, write its XInclude and find sub-dependencies
|
||||
if [[ -f dependencies/$TARGET.dep ]]; then
|
||||
mkdir xincludes && do_dependencies $TARGET
|
||||
fi
|
||||
|
||||
echo -e "\n\t... done"
|
||||
}
|
||||
|
||||
|
||||
|
||||
#-----------------------#
|
||||
do_dependencies() { # Loop to find sub-dependencies :::WARNING::: THIS IS A RECURVISE FUNCTION
|
||||
#-----------------------#
|
||||
: <<inline_doc
|
||||
function: Loop through all the packages and create a sub-dependency tree
|
||||
input vars: $1, package name
|
||||
externals: vars: $DEP_LEVEL
|
||||
$TARGET
|
||||
$PRINT_SERVER
|
||||
$KBR5
|
||||
$GHOSTSCRIPT
|
||||
$MAILSERVER
|
||||
file: depure.txt
|
||||
$TARGET-index.xml.tmp
|
||||
$PKG.dep
|
||||
$PKG.inc
|
||||
modifies: files
|
||||
returns: nothing
|
||||
output: file: $PKG-xinc.tmp
|
||||
depure.txt
|
||||
$TARGET-index.xml.tmp
|
||||
on error: exit
|
||||
on success:
|
||||
inline_doc
|
||||
|
||||
set -e
|
||||
local PKG=$1
|
||||
local saveIFS=$IFS
|
||||
local DEP_LV=$DEP_LEVEL
|
||||
local line line2 DEP pkg_ver inst_ver
|
||||
|
||||
#------------------
|
||||
# If a premade xinclude file exists, use it. If not, create one
|
||||
if [[ -f xincludes/$PKG.xinc ]] ; then
|
||||
IFS=$'\x0A'
|
||||
for line in `cat xincludes/$PKG.xinc` ; do
|
||||
IFS=$saveIFS
|
||||
# Remove the Xinclude entry if found. We want the most newer one.
|
||||
# Using double quotes to let bash expand variables.
|
||||
# Remove also the empty line created. Can not be done in one step
|
||||
# due that d requires the pattner between /, but we have a lot of /
|
||||
# inside the pattner.
|
||||
sed -e "s,^[[:space:]]*$line,," -e '/./!d' -i $TARGET-index.xml.tmp
|
||||
# Write the XInclude
|
||||
echo -e "$line" >> $TARGET-index.xml.tmp
|
||||
done
|
||||
return
|
||||
fi
|
||||
|
||||
#------------------
|
||||
# Start with a clean $PKG.xinc.tmp file
|
||||
> xincludes/$PKG.xinc.tmp
|
||||
for DEP in `cat dependencies/$PKG.dep`; do
|
||||
|
||||
# Special packages that need be remaped
|
||||
case $DEP in
|
||||
|
||||
db ) continue ;; # The proper version of DB is installed in LFS
|
||||
|
||||
# Don't have their own XML file
|
||||
hal-requirements | hal-runtime-dependencies ) continue ;;
|
||||
perl-* | tk-perl ) DEP=perl-modules ;;
|
||||
dbus-* ) DEP=dbus-bindings ;;
|
||||
|
||||
# Orphan links (proper link must be created when generating the book)
|
||||
arts ) DEP=aRts ;;
|
||||
kde ) DEP=kde-core ;;
|
||||
|
||||
# Set values for alternative packages
|
||||
LPRng | cups ) DEP=$PRINT_SERVER ;;
|
||||
mitkrb | heimdal ) DEP=$KBR5 ;;
|
||||
gs | espgs ) DEP=$GHOSTSCRIPT ;;
|
||||
server-mail ) DEP=$MAIL_SERVER ;;
|
||||
x-window-system )
|
||||
case $X11 in
|
||||
xorg7 ) DEP=xorg7 ;;
|
||||
* )
|
||||
pkg_ver=$(grep "^${X11}[[:space:]]" ../packages | cut -f3)
|
||||
inst_ver=$(grep "^${X11}[[:space:]]" ../packages | cut -f4)
|
||||
[ -n "${pkg_ver}" ] && [ "x${pkg_ver}" = "x${inst_ver}" ] && continue
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
# If DEP has been previouly installed, skip it
|
||||
pkg_ver=$(grep "^${DEP}[[:space:]]" ../packages | cut -f3)
|
||||
inst_ver=$(grep "^${DEP}[[:space:]]" ../packages | cut -f4)
|
||||
[ -n "${pkg_ver}" ] && [ "x${pkg_ver}" = "x${inst_ver}" ] && continue
|
||||
|
||||
#------------------
|
||||
# Prevent circular dependencies
|
||||
# If all dependencies are circular, the creation of the *.dep file
|
||||
# must be skipped, not placed here, to avoid that the script will bomb
|
||||
# due empty *.xinc files
|
||||
case $DEP in
|
||||
akode )
|
||||
# Both are in the same page
|
||||
[[ "$PKG" = "kdemultimedia" ]] && continue
|
||||
;;
|
||||
aRts )
|
||||
# esound-->aRts-->esound
|
||||
[[ "$PKG" = "esound" ]] && continue
|
||||
;;
|
||||
dbus-bindings )
|
||||
# True circular dependecy
|
||||
[[ "$PKG" = "dbus-bindings" ]] && continue
|
||||
;;
|
||||
DocBook )
|
||||
# Used to rebuild the documentation
|
||||
[[ "$PKG" = "linux-pam" ]] && continue
|
||||
;;
|
||||
docbook-xsl )
|
||||
# Used to rebuild the documentation
|
||||
[[ "$PKG" = "linux-pam" ]] && continue
|
||||
;;
|
||||
doxygen )
|
||||
# Used to rebuild the documentation
|
||||
[[ "$PKG" = "dbus" ]] && continue
|
||||
[[ "$PKG" = "libdvdcss" ]] && continue
|
||||
[[ "$PKG" = "libusb" ]] && continue
|
||||
[[ "$PKG" = "libxcb" ]] && continue
|
||||
;;
|
||||
espgs )
|
||||
# Used to rebuild the documentation
|
||||
[[ "$PKG" = "$MAIL_SERVER" ]] && continue
|
||||
;;
|
||||
ffmpeg )
|
||||
# alsa-plugins-->ffmpeg-->several-->alsa-plugins
|
||||
[[ "$PKG" = "alsa-plugins" ]] && continue
|
||||
;;
|
||||
fop )
|
||||
# Used to rebuild the documentation
|
||||
[[ "$PKG" = "linux-pam" ]] && continue
|
||||
;;
|
||||
graphviz )
|
||||
# Used to build the API documentation
|
||||
[[ "$PKG" = "libusb" ]] && continue
|
||||
;;
|
||||
GTK )
|
||||
# deprecated GTK version
|
||||
[[ "$PKG" = "alsa-tools" ]] && continue
|
||||
;;
|
||||
gtk2 )
|
||||
# Testsuite only
|
||||
[[ "$PKG" = "cairo" ]] && continue
|
||||
;;
|
||||
jadetex )
|
||||
# Runtime only
|
||||
[[ "$PKG" = "docbook-utils" ]] && continue
|
||||
;;
|
||||
$KBR5 )
|
||||
# cyrus-sasl-->postgresql-->$KBR5-->openldap-->cyrus-sasl
|
||||
[[ "$PKG" = "cyrus-sasl" ]] && continue
|
||||
;;
|
||||
librsvg )
|
||||
# Testsuite only
|
||||
[[ "$PKG" = "cairo" ]] && continue
|
||||
;;
|
||||
libxslt )
|
||||
# libxml2-->libxslt-->libxml2
|
||||
[[ "$PKG" = "libxml2" ]] && continue
|
||||
;;
|
||||
Links )
|
||||
# Runtime only
|
||||
[[ "$PKG" = "docbook-utils" ]] && continue
|
||||
;;
|
||||
lynx )
|
||||
# Runtime only
|
||||
[[ "$PKG" = "docbook-utils" ]] && continue
|
||||
;;
|
||||
openldap )
|
||||
# cyrus-sasl-->postgresql-->$KBR5-->openldap-->cyrus-sasl
|
||||
[[ "$PKG" = "cyrus-sasl" ]] && continue
|
||||
;;
|
||||
poppler )
|
||||
# Testsuite only
|
||||
[[ "$PKG" = "cairo" ]] && continue
|
||||
;;
|
||||
postgresql )
|
||||
# cyrus-sasl-->postgresql-->$KBR5-->openldap-->cyrus-sasl
|
||||
[[ "$PKG" = "cyrus-sasl" ]] && continue
|
||||
;;
|
||||
tk )
|
||||
# python-->tk-->xorg7-->several combinations-->libxslt-->python
|
||||
[[ "$PKG" = "python" ]] && continue
|
||||
;;
|
||||
w3m )
|
||||
# Runtime only
|
||||
[[ "$PKG" = "docbook-utils" ]] && continue
|
||||
# Used to rebuild the documentation
|
||||
[[ "$PKG" = "linux-pam" ]] && continue
|
||||
;;
|
||||
esac
|
||||
|
||||
#------------------
|
||||
# XML file of dependency package
|
||||
DEP_XML=`grep "^$DEP[[:space:]]" ../packages | cut -f2`
|
||||
case $DEP in
|
||||
x-window-system | alsa ) ;; # No page for that (proper link must be created when generating the book)
|
||||
xorg7 ) ;; # This page will be dump in the xorg7.xinc file
|
||||
gnome-core | kde-core | kde-full ) ;; # Invented packages
|
||||
* )
|
||||
# Remove the Xinclude entry if found
|
||||
sed -e "s,^[[:space:]]*$ENTRY_START$DEP_XML$ENTRY_END,," \
|
||||
-e '/./!d' -i xincludes/$PKG.xinc.tmp
|
||||
# Write the XInclude
|
||||
echo -e " $ENTRY_START$DEP_XML$ENTRY_END" >> xincludes/$PKG.xinc.tmp
|
||||
;;
|
||||
esac
|
||||
|
||||
#------------------
|
||||
# If not already created, create its dependencies list
|
||||
if [[ ! -f dependencies/$DEP.dep ]] ; then
|
||||
case $DEP in
|
||||
# Skip the creation when all dependencies are circular.
|
||||
alsa-lib | cracklib | libexif | unixodbc ) ;;
|
||||
# Meta-packages at dependency level
|
||||
alsa )
|
||||
cp ../libs/alsa.dep dependencies/
|
||||
;;
|
||||
kde-core )
|
||||
cp ../libs/kde-core.dep dependencies/
|
||||
;;
|
||||
x-window-system ) # When X11 is not Xorg7
|
||||
echo -e "x-config\nx-setup\n$X11" > dependencies/x-window-system.dep
|
||||
;;
|
||||
xorg7 )
|
||||
cp ../libs/xorg7.dep dependencies/
|
||||
;;
|
||||
* ) xsltproc --stringparam dependencies $DEP_LV \
|
||||
-o dependencies/$DEP.dep ../libs/dependencies.xsl ../$DEP_XML
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
#------------------
|
||||
# If needed, process its dependencies
|
||||
if [[ -f dependencies/$DEP.dep ]] ; then
|
||||
# If a premade xinclude file esist, include it
|
||||
if [[ -f xincludes/$DEP.xinc ]] ; then
|
||||
IFS=$'\x0A'
|
||||
for line2 in `cat xincludes/$DEP.xinc` ; do
|
||||
IFS=$saveIFS
|
||||
# Remove the Xinclude entry if found
|
||||
sed -e "s,^[[:space:]]*$line2,," -e '/./!d' -i xincludes/$PKG.xinc.tmp
|
||||
# Write the XInclude
|
||||
echo -e "$line2" >> xincludes/$PKG.xinc.tmp
|
||||
done
|
||||
#------------------
|
||||
# Create the xinclude file
|
||||
else
|
||||
#
|
||||
# >>>>>> THIS IS A RECURSIVE FUNCTION CALL.. BEWARE OF GREMLINS. <<<<<<
|
||||
#
|
||||
# If the recursion depth is not too great this is an acceptable methodology for a script language
|
||||
# However, uncontrolled recursion will cause a seg-fault due to stack issues with local variables.
|
||||
#
|
||||
set +e
|
||||
[[ "${VERBOSITY}" > 0 ]] && echo -ne "\ncall: $((++cntr))${spaceSTR:0:$cntr}${RED}$DEP${OFF}"
|
||||
do_dependencies $DEP
|
||||
[[ "${VERBOSITY}" > 0 ]] && echo -ne "\n ret: $cntr${spaceSTR:0:$((cntr--))}${GREEN}$DEP${OFF} Using $DEP Xinc to solve $PKG"
|
||||
set -e
|
||||
|
||||
# Include it when done
|
||||
IFS=$'\x0A'
|
||||
for line2 in `cat xincludes/$DEP.xinc` ; do
|
||||
IFS=$saveIFS
|
||||
# Remove the Xinclude entry if found
|
||||
sed -e "s,^[[:space:]]*$line2,," -e '/./!d' -i xincludes/$PKG.xinc.tmp
|
||||
# Write the XInclude
|
||||
echo -e "$line2" >> xincludes/$PKG.xinc.tmp
|
||||
done
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
#------------------
|
||||
if [[ "$PKG" = "xorg7" ]] ; then
|
||||
# Add their XInclude
|
||||
PKG_XML=${BLFS_XML}/x/installing/xorg7.xml
|
||||
echo -e " $ENTRY_START$PKG_XML$ENTRY_END" >> xincludes/$PKG.xinc.tmp
|
||||
fi
|
||||
|
||||
#------------------
|
||||
mv xincludes/$PKG.xinc.tmp xincludes/$PKG.xinc
|
||||
IFS=$'\x0A'
|
||||
for line in `cat xincludes/$PKG.xinc` ; do
|
||||
IFS=$saveIFS
|
||||
# Remove the Xinclude entry if found.
|
||||
sed -e "s,^[[:space:]]*$line,," -e '/./!d' -i $TARGET-index.xml.tmp
|
||||
# Write the XInclude
|
||||
echo -e "$line" >> $TARGET-index.xml.tmp
|
||||
done
|
||||
}
|
210
2.3/BLFS/libs/func_packages
Normal file
210
2.3/BLFS/libs/func_packages
Normal file
|
@ -0,0 +1,210 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
set -e
|
||||
|
||||
#-----------------------#
|
||||
get_pkg_ver() { # Find package version for a given package ID
|
||||
#-----------------------#
|
||||
local pkg_id=$1
|
||||
|
||||
case ${pkg_id} in
|
||||
# ALSA packages version
|
||||
alsa* ) pkg_id=alsa ;;
|
||||
|
||||
# KDE packages version
|
||||
kdevelop ) : ;;
|
||||
kde*config ) : ;;
|
||||
kde* ) pkg_id=kde ;;
|
||||
|
||||
# Xorg7 packages version
|
||||
xorg7-server ) pkg_id=xorg-server ;;
|
||||
xterm2 ) pkg_id=xterm ;;
|
||||
xorg7* ) pkg_id=xorg7 ;;
|
||||
|
||||
# Others (ID value don't match entity name)
|
||||
wireless_tools ) pkg_id=wireless-tools ;;
|
||||
bind-utils ) pkg_id=bind ;;
|
||||
html-tidy ) pkg_id=tidy ;;
|
||||
jdk ) pkg_id=jdk-src ;;
|
||||
reiserfs ) pkg_id=reiser ;;
|
||||
xfs ) pkg_id=xfsprogs ;;
|
||||
esac
|
||||
|
||||
xmllint --noent ./${BLFS_XML}/book/bookinfo.xml 2>/dev/null | \
|
||||
grep -i " ${pkg_id}-version " | cut -d "\"" -f2
|
||||
|
||||
}
|
||||
|
||||
#-----------------------#
|
||||
get_installed_ver() { # Find installed package version for a given package ID
|
||||
#-----------------------#
|
||||
local pkg_id=$1
|
||||
|
||||
find $TRACKING_DIR -name "${pkg_id}-[[:digit:]]*" | sed "s/.*${pkg_id}-//"
|
||||
|
||||
}
|
||||
|
||||
#-----------------------#
|
||||
generate_packages() { # Master packages file
|
||||
#-----------------------#
|
||||
local pkg_id file pkg_ver
|
||||
local ALSA_VER GNOME_VER GNOME_MINOR_VER KDE_VER KDE_KOFFICE_VER XORG7_VER
|
||||
|
||||
> packages.tmp
|
||||
|
||||
# Extract Id and path for sect1 files
|
||||
for file in `find $BLFS_XML -name "*.xml"` ; do
|
||||
pkg_id=$(grep "sect1 id" $file | sed -e 's/<sect1 id="//;s/".*//')
|
||||
pkg_ver=$(get_pkg_ver $pkg_id)
|
||||
installed_ver=$(get_installed_ver $pkg_id)
|
||||
[[ ! -z "$pkg_id" ]] && echo -e "$pkg_id\t$file\t$pkg_ver\t$installed_ver" >> packages.tmp
|
||||
done
|
||||
|
||||
# IDs clean-up (unuseful pages or commented-out packages, could be more)
|
||||
sed -i '/template/d;/ntroduction/d;/preface/d;/alsa.xml/d;/xorg.xml/d' packages.tmp
|
||||
sed -i '/obsolete/d;/postlfs-/d;/-client.xml/d;/xorg7.xml/d' packages.tmp
|
||||
sed -i '/courier.xml/d;/-other\t/d;/others-/d;/other-/d;/^ash\t/d' packages.tmp
|
||||
sed -i '/fw-firewall\t/d;/gcc2\t/d;/cvsserver\t/d;/svnserver\t/d' packages.tmp
|
||||
sed -i '/fam\t/d;/libungif\t/d;/ncpfs\t/d;/slrn\t/d;/konq\t/d' packages.tmp
|
||||
sed -i '/gst-plugins\t/d;/openquicktime\t/d;/compressdoc\t/d' packages.tmp
|
||||
sed -i '/errata\t/d;/foreword\t/d;/organization\t/d;/whoread\t/d' packages.tmp
|
||||
|
||||
# Meta-packages version
|
||||
ALSA_VER=$(get_pkg_ver alsa)
|
||||
GNOME_VER=$(get_pkg_ver gnome)
|
||||
GNOME_MINOR_VER=$(get_pkg_ver gnome-minor)
|
||||
KDE_VER=$(get_pkg_ver kde)
|
||||
KDE_INST_VER=$(get_installed_ver kde)
|
||||
KDE_KOFFICE_VER=$(get_pkg_ver koffice)
|
||||
XORG7_VER=$(get_pkg_ver xorg7)
|
||||
|
||||
# Meta-packages installed version
|
||||
ALSA_INST_VER=$(get_installed_ver alsa)
|
||||
GNOME_CORE_INST_VER=$(get_installed_ver gnome-core)
|
||||
GNOME_FULL_INST_VER=$(get_installed_ver gnome-full)
|
||||
KDE_CORE_INST_VER=$(get_installed_ver kde-core)
|
||||
KDE_FULL_INST_VER=$(get_installed_ver kde-full)
|
||||
KDE_KOFFICE_INST_VER=$(get_installed_ver kde-koffice)
|
||||
XORG7_INST_VER=$(get_installed_ver xorg7)
|
||||
|
||||
# Add header with meta-packages pseudo Id
|
||||
{
|
||||
cat << EOF
|
||||
alsa $BLFS_XML $ALSA_VER $ALSA_INST_VER
|
||||
gnome-core $BLFS_XML $GNOME_VER$GNOME_MINOR_VER $GNOME_CORE_INST_VER
|
||||
gnome-full $BLFS_XML $GNOME_VER$GNOME_MINOR_VER $GNOME_FULL_INST_VER
|
||||
kde-core $BLFS_XML $KDE_VER $KDE_CORE_INST_VER
|
||||
kde-full $BLFS_XML $KDE_VER $KDE_FULL_INST_VER
|
||||
kde-koffice $BLFS_XML $KDE_KOFFICE_VER $KDE_KOFFICE_INST_VER
|
||||
xorg7 $BLFS_XML $XORG7_VER $XORG7_INST_VER
|
||||
EOF
|
||||
} >> packages.tmp
|
||||
|
||||
# Dump packages list
|
||||
sort packages.tmp -b --key=2 --field-separator=/ --output=packages
|
||||
|
||||
# Clean up
|
||||
rm packages.tmp
|
||||
}
|
||||
|
||||
# Pre-made *.dep files for meta-packages
|
||||
|
||||
#--------------------------#
|
||||
generate_gnome_core() { # GNOME core
|
||||
#--------------------------#
|
||||
local line base_xml package
|
||||
|
||||
> gnome-core.dep.tmp
|
||||
|
||||
for line in `grep "xi:include" $BLFS_XML/gnome/core/core.xml` ; do
|
||||
base_xml=`echo $line | sed 's/^.*href="//;s/".*//'`
|
||||
package=`grep "gnome/core/$base_xml" packages | cut -f1`
|
||||
[[ -n "$package" ]] && echo $package >> gnome-core.dep.tmp
|
||||
done
|
||||
|
||||
# Replace dummy packages with the proper ones
|
||||
sed -i 's/GNOME-//g' gnome-core.dep.tmp
|
||||
|
||||
tac gnome-core.dep.tmp > libs/gnome-core.dep
|
||||
rm gnome-core.dep.tmp
|
||||
}
|
||||
|
||||
#--------------------------#
|
||||
generate_gnome_full() { # GNOME full
|
||||
#--------------------------#
|
||||
local line base_xml package
|
||||
|
||||
echo "gnome-core" > gnome-full.dep.tmp
|
||||
|
||||
for line in `grep "xi:include" $BLFS_XML/gnome/add/add.xml` ; do
|
||||
base_xml=`echo $line | sed 's/^.*href="//;s/".*//'`
|
||||
package=`grep "gnome/add/$base_xml" packages | cut -f1`
|
||||
[[ -n "$package" ]] && echo $package >> gnome-full.dep.tmp
|
||||
done
|
||||
|
||||
tac gnome-full.dep.tmp > libs/gnome-full.dep
|
||||
rm gnome-full.dep.tmp
|
||||
}
|
||||
|
||||
#--------------------------#
|
||||
generate_kde_core() { # KDE core
|
||||
#--------------------------#
|
||||
local line base_xml package
|
||||
|
||||
> kde-core.dep.tmp
|
||||
|
||||
for line in `grep "xi:include" $BLFS_XML/kde/core/core.xml` ; do
|
||||
base_xml=`echo $line | sed 's/^.*href="//;s/".*//'`
|
||||
package=`grep "kde/core/$base_xml" packages | cut -f1`
|
||||
[[ -n "$package" ]] && echo $package >> kde-core.dep.tmp
|
||||
done
|
||||
|
||||
tac kde-core.dep.tmp > libs/kde-core.dep
|
||||
rm kde-core.dep.tmp
|
||||
}
|
||||
|
||||
#--------------------------#
|
||||
generate_kde_full() { # KDE full
|
||||
#--------------------------#
|
||||
local line base_xml package
|
||||
|
||||
echo "kde-core" > kde-full.dep.tmp
|
||||
|
||||
for line in `grep "xi:include" $BLFS_XML/kde/add/add.xml` ; do
|
||||
base_xml=`echo $line | sed 's/^.*href="//;s/".*//'`
|
||||
package=`grep "kde/add/$base_xml" packages | cut -f1`
|
||||
[[ -n "$package" ]] && echo $package >> kde-full.dep.tmp
|
||||
done
|
||||
|
||||
for line in `grep "xi:include" $BLFS_XML/kde/devel/devel.xml` ; do
|
||||
base_xml=`echo $line | sed 's/^.*href="//;s/".*//'`
|
||||
package=`grep "kde/devel/$base_xml" packages | cut -f1`
|
||||
[[ -n "$package" ]] && echo $package >> kde-full.dep.tmp
|
||||
done
|
||||
|
||||
tac kde-full.dep.tmp > libs/kde-full.dep
|
||||
rm kde-full.dep.tmp
|
||||
}
|
||||
|
||||
#--------------------------#
|
||||
generate_kde_koffice() { # KDE full + Koffice
|
||||
#--------------------------#
|
||||
echo -e "koffice\nkde-full\nkde-core" > libs/kde-koffice.dep
|
||||
}
|
||||
|
||||
#--------------------------#
|
||||
generate_alsa() { # ALSA packages
|
||||
#--------------------------#
|
||||
echo -e "alsa-oss\nalsa-firmware\nalsa-tools\nalsa-utils\n\
|
||||
alsa-plugins\nalsa-lib" > libs/alsa.dep
|
||||
}
|
||||
|
||||
#--------------------------#
|
||||
generate_xorg7() { # Xorg7 packages
|
||||
#--------------------------#
|
||||
echo -e "x-config\nx-setup\nrman\nxterm2\nxorg7-driver\nxorg7-server\nluit\n\
|
||||
xkeyboard-config\nxorg7-font\nxorg7-data\nxorg7-app\nmesalib\nlibdrm\nxbitmaps\n\
|
||||
xorg7-lib\nlibxcb\nxcb-proto\nlibXdmcp\nlibXau\nxorg7-util\nxorg7-proto" > libs/xorg7.dep
|
||||
}
|
151
2.3/BLFS/libs/func_parser
Normal file
151
2.3/BLFS/libs/func_parser
Normal file
|
@ -0,0 +1,151 @@
|
|||
#!/bin/bash
|
||||
#####
|
||||
#
|
||||
# Parse the XML documents to create a 'package' book
|
||||
#
|
||||
# $Id$
|
||||
#####
|
||||
|
||||
|
||||
#----------------------------#
|
||||
generate_TARGET_xml() { #
|
||||
#----------------------------#
|
||||
: <<inline_doc
|
||||
function: Generate the XML document for the TARGET package
|
||||
input vars: nothing
|
||||
externals: vars: TARGET
|
||||
modifies: nothing
|
||||
returns: nothing
|
||||
output: file: $TARGET-index.xml
|
||||
on error: nothing
|
||||
on success: nothing
|
||||
inline_doc
|
||||
|
||||
local
|
||||
echo -en "\n\tGenerating $TARGET-index.xml ..."
|
||||
|
||||
#---------------------
|
||||
# Header to $TARGET-index.xml
|
||||
{
|
||||
cat << EOF
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" >
|
||||
|
||||
<book>
|
||||
|
||||
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="../$BLFS_XML/book/bookinfo.xml"/>
|
||||
|
||||
<preface>
|
||||
<?dbhtml filename="preface.html" dir="preface"?>
|
||||
|
||||
<title>Preface</title>
|
||||
|
||||
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="../$BLFS_XML/introduction/important/locale-issues.xml"/>
|
||||
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="../$BLFS_XML/introduction/important/bootscripts.xml"/>
|
||||
|
||||
</preface>
|
||||
|
||||
<chapter>
|
||||
<?dbhtml filename="chapter.html" dir="installing"?>
|
||||
|
||||
<title>Installing $TARGET in Dependencies Build Order</title>
|
||||
|
||||
EOF
|
||||
} > $TARGET-index.xml
|
||||
|
||||
#---------------------
|
||||
# Dump $TARGET-index.xml.tmp in reverse order.
|
||||
tac $TARGET-index.xml.tmp >> $TARGET-index.xml
|
||||
rm $TARGET-index.xml.tmp
|
||||
|
||||
#---------------------
|
||||
# Footer of $TARGET-index.xml
|
||||
{
|
||||
cat << EOF
|
||||
|
||||
</chapter>
|
||||
|
||||
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="../$BLFS_XML/appendices/creat-comm.xml"/>
|
||||
<xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="../$BLFS_XML/appendices/ac-free-lic.xml"/>
|
||||
|
||||
<index/>
|
||||
|
||||
</book>
|
||||
|
||||
EOF
|
||||
} >> $TARGET-index.xml
|
||||
|
||||
echo "done"
|
||||
}
|
||||
|
||||
|
||||
#-------------------------#
|
||||
generate_target_book() { #
|
||||
#-------------------------#
|
||||
: <<inline_doc
|
||||
function: Create an HTML document of the requested TARGET.
|
||||
input vars: nothing
|
||||
externals: vars: TARGET
|
||||
BLFS_XML
|
||||
MAIL_SERVER
|
||||
X11
|
||||
modifies: nothing
|
||||
returns: nothing
|
||||
output: file: NUMEROUS FILES
|
||||
on error: nothing
|
||||
on success: nothing
|
||||
inline_doc
|
||||
|
||||
local filename # output filename
|
||||
echo -en "\n\tGenerating <$TARGET> HTML book from <$BLFS_XML> xml files ..."
|
||||
xsltproc --xinclude --nonet \
|
||||
--stringparam mail_server $MAIL_SERVER \
|
||||
--stringparam xwindow $X11 \
|
||||
--stringparam base.dir HTML/ \
|
||||
../libs/book.xsl \
|
||||
$TARGET-index.xml > xsltproc.log 2>&1
|
||||
mkdir HTML/{stylesheets,images}
|
||||
cp ../$BLFS_XML/stylesheets/lfs-xsl/*.css HTML/stylesheets
|
||||
cp ../$BLFS_XML/images/*.png HTML/images
|
||||
cd HTML
|
||||
sed -i -e "s@../stylesheets@stylesheets@g" *.html
|
||||
sed -i -e "s@../images@images@g" *.html
|
||||
for filename in `find . -name "*.html"` ; do
|
||||
tidy -config ../../$BLFS_XML/tidy.conf $filename || true
|
||||
sh ../../$BLFS_XML/obfuscate.sh $filename
|
||||
sed -i -e "s@text/html@application/xhtml+xml@g" $filename
|
||||
done
|
||||
cd ..
|
||||
echo "done"
|
||||
}
|
||||
|
||||
|
||||
#-------------------------#
|
||||
create_build_scripts() { #
|
||||
#-------------------------#
|
||||
: <<inline_doc
|
||||
function: Create shell scripts of the requested TARGET.
|
||||
input vars: $1 use sudo n/y
|
||||
externals: TARGET
|
||||
modifies: nothing
|
||||
returns: nothing
|
||||
output: file: NUMEROUS FILES
|
||||
on error: nothing
|
||||
on success: nothing
|
||||
inline_doc
|
||||
|
||||
# Log separator
|
||||
echo -e "\n\tScripts generation depuration and errors:\n" >> xsltproc.log
|
||||
|
||||
echo -en "\n\tGenerating the build scripts ..."
|
||||
xsltproc --xinclude --nonet \
|
||||
--stringparam sudo $SUDO \
|
||||
-o ./scripts/ ../libs/scripts.xsl \
|
||||
$TARGET-index.xml >> xsltproc.log 2>&1
|
||||
# Make the scripts executable.
|
||||
chmod -R +x scripts
|
||||
cd ..
|
||||
echo -e "done\n"
|
||||
|
||||
}
|
496
2.3/BLFS/libs/scripts.xsl
Normal file
496
2.3/BLFS/libs/scripts.xsl
Normal file
|
@ -0,0 +1,496 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:exsl="http://exslt.org/common"
|
||||
extension-element-prefixes="exsl"
|
||||
version="1.0">
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<!-- XSLT stylesheet to create shell scripts from "linear build" BLFS books. -->
|
||||
|
||||
<!-- Build as user (y) or as root (n)? -->
|
||||
<xsl:param name="sudo" select="y"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:apply-templates select="//sect1"/>
|
||||
</xsl:template>
|
||||
|
||||
<!--=================== Master chunks code ======================-->
|
||||
|
||||
<xsl:template match="sect1">
|
||||
<xsl:if test="(count(descendant::screen/userinput) > 0 and
|
||||
count(descendant::screen/userinput) >
|
||||
count(descendant::screen[@role='nodump'])) and
|
||||
@id != 'locale-issues' and @id != 'xorg7' and
|
||||
@id != 'x-setup'">
|
||||
|
||||
<!-- The file names -->
|
||||
<xsl:variable name="filename" select="@id"/>
|
||||
|
||||
<!-- Package name (use "Download FTP" by default. If empty, use "Download HTTP" -->
|
||||
<xsl:variable name="package">
|
||||
<xsl:choose>
|
||||
<xsl:when
|
||||
test="string-length(sect2[@role='package']/itemizedlist/listitem[2]/para/ulink/@url)
|
||||
> '10'">
|
||||
<xsl:call-template name="package_name">
|
||||
<xsl:with-param name="url"
|
||||
select="sect2[@role='package']/itemizedlist/listitem[2]/para/ulink/@url"/>
|
||||
</xsl:call-template>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:call-template name="package_name">
|
||||
<xsl:with-param name="url"
|
||||
select="sect2[@role='package']/itemizedlist/listitem[1]/para/ulink/@url"/>
|
||||
</xsl:call-template>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
|
||||
<!-- FTP dir name -->
|
||||
<xsl:variable name="ftpdir">
|
||||
<xsl:call-template name="ftp_dir">
|
||||
<xsl:with-param name="package" select="$package"/>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
|
||||
<!-- The build order -->
|
||||
<xsl:variable name="position" select="position()"/>
|
||||
<xsl:variable name="order">
|
||||
<xsl:choose>
|
||||
<xsl:when test="string-length($position) = 1">
|
||||
<xsl:text>00</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="string-length($position) = 2">
|
||||
<xsl:text>0</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
|
||||
<!-- Depuration code -->
|
||||
<xsl:message>
|
||||
<xsl:text>SCRIPT is </xsl:text>
|
||||
<xsl:value-of select="concat($order,'-',$filename)"/>
|
||||
<xsl:text>
 PACKAGE is </xsl:text>
|
||||
<xsl:value-of select="$package"/>
|
||||
<xsl:text>
 FTPDIR is </xsl:text>
|
||||
<xsl:value-of select="$ftpdir"/>
|
||||
<xsl:text>

</xsl:text>
|
||||
</xsl:message>
|
||||
|
||||
<!-- Creating the scripts -->
|
||||
<exsl:document href="{$order}-z-{$filename}" method="text">
|
||||
<xsl:text>#!/bin/bash
set -e

</xsl:text>
|
||||
<xsl:choose>
|
||||
<!-- Package page -->
|
||||
<xsl:when test="sect2[@role='package'] and not(@id = 'xorg7-app' or
|
||||
@id = 'xorg7-data' or @id = 'xorg7-driver' or
|
||||
@id = 'xorg7-font' or @id = 'xorg7-lib' or
|
||||
@id = 'xorg7-proto' or @id = 'xorg7-util')">
|
||||
<!-- Variables -->
|
||||
<xsl:text>SRC_ARCHIVE=$SRC_ARCHIVE
</xsl:text>
|
||||
<xsl:text>FTP_SERVER=$FTP_SERVER

PACKAGE=</xsl:text>
|
||||
<xsl:value-of select="$package"/>
|
||||
<xsl:text>
PKG_DIR=</xsl:text>
|
||||
<xsl:value-of select="$ftpdir"/>
|
||||
<xsl:text>
SRC_DIR=$SRC_DIR

</xsl:text>
|
||||
<!-- Download code and build commands -->
|
||||
<xsl:apply-templates select="sect2">
|
||||
<xsl:with-param name="package" select="$package"/>
|
||||
<xsl:with-param name="ftpdir" select="$ftpdir"/>
|
||||
</xsl:apply-templates>
|
||||
<!-- Clean-up -->
|
||||
<xsl:if test="not(@id='mesalib')">
|
||||
<xsl:text>cd $SRC_DIR/$PKG_DIR
</xsl:text>
|
||||
<xsl:text>rm -rf $UNPACKDIR unpacked

</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="@id='xorg7-server'">
|
||||
<xsl:text>cd $SRC_DIR/MesaLib
|
||||
UNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
|
||||
rm -rf $UNPACKDIR unpacked

</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:when>
|
||||
<!-- Xorg7 pseudo-packages -->
|
||||
<xsl:when test="contains(@id,'xorg7') and not(@id = 'xorg7-server')">
|
||||
<xsl:text>SRC_DIR=$SRC_DIR
|
||||
|
||||
cd $SRC_DIR
|
||||
mkdir -p xc
|
||||
cd xc
</xsl:text>
|
||||
<xsl:apply-templates select="sect2" mode="xorg7"/>
|
||||
</xsl:when>
|
||||
<!-- Non-package page -->
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates select=".//screen"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:text>exit</xsl:text>
|
||||
</exsl:document>
|
||||
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<!--======================= Sub-sections code =======================-->
|
||||
|
||||
<xsl:template match="sect2">
|
||||
<xsl:param name="package" select="foo"/>
|
||||
<xsl:param name="ftpdir" select="foo"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="@role = 'package'">
|
||||
<xsl:text>mkdir -p $SRC_DIR/$PKG_DIR
</xsl:text>
|
||||
<xsl:text>cd $SRC_DIR/$PKG_DIR
</xsl:text>
|
||||
<xsl:apply-templates select="itemizedlist/listitem/para">
|
||||
<xsl:with-param name="package" select="$package"/>
|
||||
<xsl:with-param name="ftpdir" select="$ftpdir"/>
|
||||
</xsl:apply-templates>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="@role = 'installation'">
|
||||
<xsl:text>
|
||||
if [[ -e unpacked ]] ; then
|
||||
UNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
|
||||
rm -rf $UNPACKDIR
|
||||
fi
|
||||
tar -xvf $PACKAGE > unpacked
|
||||
UNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
|
||||
cd $UNPACKDIR
</xsl:text>
|
||||
<xsl:apply-templates select=".//screen | .//para/command"/>
|
||||
<xsl:if test="$sudo = 'y'">
|
||||
<xsl:text>sudo /sbin/</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>ldconfig

</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="@role = 'configuration'">
|
||||
<xsl:apply-templates select=".//screen"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="sect2" mode="xorg7">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@role = 'package'">
|
||||
<xsl:apply-templates select="itemizedlist/listitem/para" mode="xorg7"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="not(@role)">
|
||||
<xsl:text>SRC_ARCHIVE=$SRC_ARCHIVE
|
||||
FTP_SERVER=$FTP_SERVER
</xsl:text>
|
||||
<xsl:apply-templates select=".//screen" mode="sect-ver"/>
|
||||
<xsl:text>mkdir -p ${section}
cd ${section}
</xsl:text>
|
||||
<xsl:apply-templates select="../sect2[@role='package']/itemizedlist/listitem/para" mode="xorg7-patch"/>
|
||||
<xsl:text>for line in $(grep -v '^#' ../${sect-ver}.wget) ; do
|
||||
if [[ ! -f ${line} ]] ; then
|
||||
if [[ -f $SRC_ARCHIVE/Xorg/${section}/${line} ]] ; then
|
||||
cp $SRC_ARCHIVE/Xorg/${section}/${line} ${line}
|
||||
elif [[ -f $SRC_ARCHIVE/Xorg/${line} ]] ; then
|
||||
cp $SRC_ARCHIVE/Xorg/${line} ${line}
|
||||
elif [[ -f $SRC_ARCHIVE/${section}/${line} ]] ; then
|
||||
cp $SRC_ARCHIVE/${section}/${line} ${line}
|
||||
elif [[ -f $SRC_ARCHIVE/${line} ]] ; then
|
||||
cp $SRC_ARCHIVE/${line} ${line}
|
||||
else
|
||||
wget ${FTP_SERVER}conglomeration/Xorg/${line} || \
|
||||
wget http://xorg.freedesktop.org/releases/individual/${section}/${line}
|
||||
fi
|
||||
fi
|
||||
done
|
||||
md5sum -c ../${sect-ver}.md5
|
||||
cp ../${sect-ver}.wget ../${sect-ver}.wget.orig
|
||||
cp ../${sect-ver}.md5 ../${sect-ver}.md5.orig
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="@role = 'installation'">
|
||||
<xsl:text>for package in $(grep -v '^#' ../${sect-ver}.wget) ; do
|
||||
packagedir=$(echo $package | sed 's/.tar.bz2//')
|
||||
tar -xf ${package}
|
||||
cd ${packagedir}
</xsl:text>
|
||||
<xsl:apply-templates select=".//screen | .//para/command"/>
|
||||
<xsl:text> cd ..
|
||||
rm -rf ${packagedir}
|
||||
sed -i "/${package}/d" ../${sect-ver}.wget
|
||||
sed -i "/${package}/d" ../${sect-ver}.md5
|
||||
done
|
||||
mv ../${sect-ver}.wget.orig ../${sect-ver}.wget
|
||||
mv ../${sect-ver}.md5.orig ../${sect-ver}.md5
</xsl:text>
|
||||
<xsl:if test="$sudo = 'y'">
|
||||
<xsl:text>sudo /sbin/</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>ldconfig

</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="@role = 'configuration'">
|
||||
<xsl:apply-templates select=".//screen"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<!--==================== Download code =======================-->
|
||||
|
||||
<xsl:template name="package_name">
|
||||
<xsl:param name="url" select="foo"/>
|
||||
<xsl:param name="sub-url" select="substring-after($url,'/')"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains($sub-url,'/')">
|
||||
<xsl:call-template name="package_name">
|
||||
<xsl:with-param name="url" select="$sub-url"/>
|
||||
</xsl:call-template>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains($sub-url,'?')">
|
||||
<xsl:value-of select="substring-before($sub-url,'?')"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains($sub-url,'.patch')"/>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$sub-url"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="ftp_dir">
|
||||
<xsl:param name="package" select="foo"/>
|
||||
<!-- A lot of hardcoded dir names. Not full revised yet. -->
|
||||
<xsl:choose>
|
||||
<!-- cdparanoia -->
|
||||
<xsl:when test="contains($package, '-III')">
|
||||
<xsl:text>cdparanoia</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- DobBook 3.1 -->
|
||||
<xsl:when test="contains($package, 'docbk31')">
|
||||
<xsl:text>docbk</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- gc -->
|
||||
<xsl:when test="contains($package, 'gc6')">
|
||||
<xsl:text>gc</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- ISO-codes -->
|
||||
<xsl:when test="contains($package, 'iso-codes')">
|
||||
<xsl:text>iso-codes</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- JPEG -->
|
||||
<xsl:when test="contains($package, 'jpegsrc')">
|
||||
<xsl:text>jpeg</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- lynx -->
|
||||
<xsl:when test="contains($package, 'lynx')">
|
||||
<xsl:text>lynx</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- ntp -->
|
||||
<xsl:when test="contains($package, 'ntp')">
|
||||
<xsl:text>ntp</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- OpenLDAP -->
|
||||
<xsl:when test="contains($package, 'openldap')">
|
||||
<xsl:text>openldap</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Open Office -->
|
||||
<xsl:when test="contains($package, 'OOo')">
|
||||
<xsl:text>OOo</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- pine -->
|
||||
<xsl:when test="contains($package, 'pine')">
|
||||
<xsl:text>pine</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- portmap -->
|
||||
<xsl:when test="contains($package, 'portmap')">
|
||||
<xsl:text>portmap</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- psutils -->
|
||||
<xsl:when test="contains($package, 'psutils')">
|
||||
<xsl:text>psutils</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- qpopper -->
|
||||
<xsl:when test="contains($package, 'qpopper')">
|
||||
<xsl:text>qpopper</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- QT -->
|
||||
<xsl:when test="contains($package, 'qt-x')">
|
||||
<xsl:text>qt-x11-free</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- sendmail -->
|
||||
<xsl:when test="contains($package, 'sendmail')">
|
||||
<xsl:text>sendmail</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Slib -->
|
||||
<xsl:when test="contains($package, 'slib')">
|
||||
<xsl:text>slib</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- TCL -->
|
||||
<xsl:when test="contains($package, 'tcl')">
|
||||
<xsl:text>tcl</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- tcpwrappers -->
|
||||
<xsl:when test="contains($package, 'tcp_wrappers')">
|
||||
<xsl:text>tcp_wrappers</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- TeTeX -->
|
||||
<xsl:when test="contains($package, 'tetex')">
|
||||
<xsl:text>tetex</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Tidy -->
|
||||
<xsl:when test="contains($package, 'tidy')">
|
||||
<xsl:text>tidy</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Tk -->
|
||||
<xsl:when test="contains($package, 'tk8')">
|
||||
<xsl:text>tk</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- unzip -->
|
||||
<xsl:when test="contains($package, 'unzip')">
|
||||
<xsl:text>unzip</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- wireless_tools -->
|
||||
<xsl:when test="contains($package, 'wireless_tools')">
|
||||
<xsl:text>wireless_tools</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- whois -->
|
||||
<xsl:when test="contains($package, 'whois')">
|
||||
<xsl:text>whois</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- XOrg -->
|
||||
<xsl:when test="contains($package, 'X11R6')">
|
||||
<xsl:text>Xorg</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- zip -->
|
||||
<xsl:when test="contains($package, 'zip2')">
|
||||
<xsl:text>zip</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- General rule -->
|
||||
<xsl:otherwise>
|
||||
<xsl:variable name="cut"
|
||||
select="translate(substring-after($package, '-'), '0123456789', '0000000000')"/>
|
||||
<xsl:variable name="package2">
|
||||
<xsl:value-of select="substring-before($package, '-')"/>
|
||||
<xsl:text>-</xsl:text>
|
||||
<xsl:value-of select="$cut"/>
|
||||
</xsl:variable>
|
||||
<xsl:value-of select="substring-before($package2, '-0')"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="itemizedlist/listitem/para">
|
||||
<xsl:param name="package" select="foo"/>
|
||||
<xsl:param name="ftpdir" select="foo"/>
|
||||
<xsl:choose>
|
||||
<!-- This depend on all package pages having both "Download HTTP" and "Download FTP" lines -->
|
||||
<xsl:when test="contains(string(),'HTTP')">
|
||||
<xsl:text>if [[ ! -f $PACKAGE ]] ; then
</xsl:text>
|
||||
<!-- SRC_ARCHIVE may have subdirectories or not -->
|
||||
<xsl:text> if [[ -f $SRC_ARCHIVE/$PKG_DIR/$PACKAGE ]] ; then
</xsl:text>
|
||||
<xsl:text> cp $SRC_ARCHIVE/$PKG_DIR/$PACKAGE $PACKAGE
</xsl:text>
|
||||
<xsl:text> elif [[ -f $SRC_ARCHIVE/$PACKAGE ]] ; then
</xsl:text>
|
||||
<xsl:text> cp $SRC_ARCHIVE/$PACKAGE $PACKAGE
 else
</xsl:text>
|
||||
<!-- The FTP_SERVER mirror -->
|
||||
<xsl:text> wget ${FTP_SERVER}conglomeration/$PKG_DIR/$PACKAGE</xsl:text>
|
||||
<!-- Upstream HTTP URL -->
|
||||
<xsl:if test="string-length(ulink/@url) > '10'">
|
||||
<xsl:text> || \
 wget </xsl:text>
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains(ulink/@url,'?')">
|
||||
<xsl:value-of select="substring-before(ulink/@url,'?')"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="ulink/@url"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:if>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains(string(),'FTP')">
|
||||
<!-- Upstream FTP URL -->
|
||||
<xsl:if test="string-length(ulink/@url) > '10'">
|
||||
<xsl:text> || \
 wget </xsl:text>
|
||||
<xsl:value-of select="ulink/@url"/>
|
||||
</xsl:if>
|
||||
<xsl:text>
 fi
fi
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains(string(),'MD5')">
|
||||
<xsl:text>echo "</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'sum: ')"/>
|
||||
<xsl:text>  $PACKAGE" | md5sum -c -
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Patches -->
|
||||
<xsl:when test="contains(string(ulink/@url),'.patch')">
|
||||
<xsl:text>wget </xsl:text>
|
||||
<xsl:value-of select="ulink/@url"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="itemizedlist/listitem/para" mode="xorg7">
|
||||
<xsl:if test="contains(string(ulink/@url),'.md5') or
|
||||
contains(string(ulink/@url),'.wget')">
|
||||
<xsl:text>wget </xsl:text>
|
||||
<xsl:value-of select="ulink/@url"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="itemizedlist/listitem/para" mode="xorg7-patch">
|
||||
<xsl:if test="contains(string(ulink/@url),'.patch')">
|
||||
<xsl:text>wget </xsl:text>
|
||||
<xsl:value-of select="ulink/@url"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<!--======================== Commands code ==========================-->
|
||||
|
||||
<xsl:template match="screen">
|
||||
<xsl:if test="child::* = userinput and not(@role = 'nodump')">
|
||||
<xsl:if test="@role = 'root' and $sudo = 'y'">
|
||||
<xsl:text>sudo sh -c "</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:apply-templates select="userinput"/>
|
||||
<xsl:if test="@role = 'root' and $sudo = 'y'">
|
||||
<xsl:text>"</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="screen" mode="sect-ver">
|
||||
<xsl:text>section=</xsl:text>
|
||||
<xsl:value-of select="substring-before(substring-after(string(),'mkdir '),' &')"/>
|
||||
<xsl:text>
sect-ver=</xsl:text>
|
||||
<xsl:value-of select="substring-before(substring-after(string(),'-c ../'),'.md5')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="para/command">
|
||||
<xsl:if test="(contains(string(),'test') or
|
||||
contains(string(),'check'))">
|
||||
<xsl:text>#</xsl:text>
|
||||
<xsl:value-of select="substring-before(string(),'make')"/>
|
||||
<xsl:text>make -k</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'make')"/>
|
||||
<xsl:text> || true
</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="userinput">
|
||||
<xsl:apply-templates/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="replaceable">
|
||||
<xsl:choose>
|
||||
<xsl:when test="ancestor::sect1[@id='xorg7-server']">
|
||||
<xsl:text>$SRC_DIR/MesaLib</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>**EDITME</xsl:text>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>EDITME**</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
108
2.3/BLFS/update_book.sh
Executable file
108
2.3/BLFS/update_book.sh
Executable file
|
@ -0,0 +1,108 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
set -e
|
||||
|
||||
declare -r SVN="svn://svn.linuxfromscratch.org"
|
||||
|
||||
DOC_MODE=$1 # Action to take, update, get or none
|
||||
BLFS_XML=$2 # Book directory
|
||||
TREE=$3 # SVN tree for the BLFS book version
|
||||
|
||||
[[ -z $BLFS_XML ]] && BLFS_XML=blfs-xml
|
||||
[[ -z $DOC_MODE ]] && DOC_MODE=update
|
||||
[[ -z $TREE ]] && TREE=trunk/BOOK
|
||||
|
||||
TRACKING_DIR=tracking-dir
|
||||
|
||||
#---------------------
|
||||
# packages module
|
||||
source libs/func_packages
|
||||
[[ $? > 0 ]] && echo -e "\n\tERROR: func_packages did not load..\n" && exit
|
||||
|
||||
#----------------------------#
|
||||
BOOK_Source() { #
|
||||
#----------------------------#
|
||||
: <<inline_doc
|
||||
function: Retrieve or upate a copy of the BLFS book
|
||||
input vars: $1 BLFS_XML book sources directory
|
||||
$2 DOC_MODE action get/update
|
||||
$3 TREE SVN tree when $2=get
|
||||
externals: none
|
||||
modifies: $BLFS_XML directory tree
|
||||
returns: nothing
|
||||
output:
|
||||
on error: exit
|
||||
on success: text messages
|
||||
inline_doc
|
||||
|
||||
case $DOC_MODE in
|
||||
update )
|
||||
if [[ ! -d $BLFS_XML ]] ; then
|
||||
echo -e "\n\t$BLFS_XML is not a directory\n"
|
||||
exit 1
|
||||
fi
|
||||
if [[ ! -f $BLFS_XML/x/x.xml ]] ; then
|
||||
echo -e "\n\tLooks like $BLFS_XML is not a BLFS book sources directory\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -d $BLFS_XML/.svn ]] ; then
|
||||
echo -e "\n\tUpdating the $BLFS_XML book sources ...\n"
|
||||
pushd $BLFS_XML 1> /dev/null
|
||||
svn up
|
||||
popd 1> /dev/null
|
||||
echo -e "\n\tBook sources updated."
|
||||
else
|
||||
echo -e "\n\tLooks like $BLFS_XML is not a svn working copy."
|
||||
echo -e "\tSkipping BLFS sources update.\n"
|
||||
fi
|
||||
;;
|
||||
|
||||
get )
|
||||
[[ ! -d $BLFS_XML ]] && mkdir -pv $BLFS_XML
|
||||
svn co $SVN/BLFS/$TREE $BLFS_XML 2>&1
|
||||
;;
|
||||
* )
|
||||
echo -e "\n\tUnknown option ${DOC_MODE} ignored.\n"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
[ "${DOC_MODE}" != "none" ] && BOOK_Source
|
||||
|
||||
if [ "${DOC_MODE}" = "none" ] ; then
|
||||
echo -en "\n\tGenerating packages database file ..."
|
||||
LC_ALL=C && generate_packages
|
||||
echo "done."
|
||||
|
||||
echo -en "\tGenerating alsa dependencies list ..."
|
||||
generate_alsa
|
||||
echo "done."
|
||||
|
||||
echo -en "\tGenerating gnome-core dependencies list ..."
|
||||
generate_gnome_core
|
||||
echo "done."
|
||||
|
||||
echo -en "\tGenerating gnome-full dependencies list ..."
|
||||
generate_gnome_full
|
||||
echo "done."
|
||||
|
||||
echo -en "\tGenerating kde-core dependencies list ..."
|
||||
generate_kde_core
|
||||
echo "done."
|
||||
|
||||
echo -en "\tGenerating kde-full dependencies list ..."
|
||||
generate_kde_full
|
||||
echo -e "done."
|
||||
|
||||
echo -en "\tGenerating kde-koffice dependencies list ..."
|
||||
generate_kde_koffice
|
||||
echo -e "done."
|
||||
|
||||
echo -en "\tGenerating xorg7 dependencies list ..."
|
||||
generate_xorg7
|
||||
echo "done."
|
||||
fi
|
||||
|
328
2.3/CLFS/clfs.xsl
Normal file
328
2.3/CLFS/clfs.xsl
Normal file
|
@ -0,0 +1,328 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE xsl:stylesheet [
|
||||
<!ENTITY % general-entities SYSTEM "FAKEDIR/general.ent">
|
||||
%general-entities;
|
||||
]>
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:exsl="http://exslt.org/common"
|
||||
extension-element-prefixes="exsl"
|
||||
version="1.0">
|
||||
|
||||
<!-- XSLT stylesheet to create shell scripts from CLFS books. -->
|
||||
|
||||
<!-- Build method used -->
|
||||
<xsl:param name="method" select="chroot"/>
|
||||
|
||||
<!-- Run test suites?
|
||||
0 = none
|
||||
1 = only Glibc, GCC and Binutils testsuites
|
||||
2 = all testsuites
|
||||
3 = alias to 2
|
||||
-->
|
||||
<xsl:param name="testsuite" select="1"/>
|
||||
|
||||
<!-- Bomb on test suites failures?
|
||||
n = no, I want to build the full system and review the logs
|
||||
y = yes, bomb at the first test suite failure to can review the build dir
|
||||
-->
|
||||
<xsl:param name="bomb-testsuite" select="n"/>
|
||||
|
||||
<!-- Install vim-lang package? -->
|
||||
<xsl:param name="vim-lang" select="y"/>
|
||||
|
||||
<!-- Time zone -->
|
||||
<xsl:param name="timezone" select="GMT"/>
|
||||
|
||||
<!-- Page size -->
|
||||
<xsl:param name="page" select="letter"/>
|
||||
|
||||
<!-- Locale settings -->
|
||||
<xsl:param name="lang" select="C"/>
|
||||
|
||||
<!-- Sparc64 processor type -->
|
||||
<xsl:param name="sparc" select="none"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:apply-templates select="//sect1"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="sect1">
|
||||
<xsl:choose>
|
||||
<xsl:when test="../@id='chapter-partitioning' or
|
||||
../@id='chapter-getting-materials' or
|
||||
../@id='chapter-final-preps'"/>
|
||||
<xsl:when test="../@id='chapter-testsuite-tools' and $testsuite='0'"/>
|
||||
<xsl:when test="../@id='chapter-boot' and $method='chroot'"/>
|
||||
<xsl:when test="../@id='chapter-chroot' and $method='boot'"/>
|
||||
<xsl:otherwise>
|
||||
<xsl:if test="count(descendant::screen/userinput) > 0 and
|
||||
count(descendant::screen/userinput) >
|
||||
count(descendant::screen[@role='nodump'])">
|
||||
<!-- The dirs names -->
|
||||
<xsl:variable name="pi-dir" select="../processing-instruction('dbhtml')"/>
|
||||
<xsl:variable name="pi-dir-value" select="substring-after($pi-dir,'dir=')"/>
|
||||
<xsl:variable name="quote-dir" select="substring($pi-dir-value,1,1)"/>
|
||||
<xsl:variable name="dirname" select="substring-before(substring($pi-dir-value,2),$quote-dir)"/>
|
||||
<!-- The file names -->
|
||||
<xsl:variable name="pi-file" select="processing-instruction('dbhtml')"/>
|
||||
<xsl:variable name="pi-file-value" select="substring-after($pi-file,'filename=')"/>
|
||||
<xsl:variable name="filename" select="substring-before(substring($pi-file-value,2),'.html')"/>
|
||||
<!-- The build order -->
|
||||
<xsl:variable name="position" select="position()"/>
|
||||
<xsl:variable name="order">
|
||||
<xsl:choose>
|
||||
<xsl:when test="string-length($position) = 1">
|
||||
<xsl:text>00</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="string-length($position) = 2">
|
||||
<xsl:text>0</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<!-- Creating dirs and files -->
|
||||
<exsl:document href="{$dirname}/{$order}-{$filename}" method="text">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@id='ch-chroot-changingowner' or
|
||||
@id='ch-chroot-creatingdirs' or
|
||||
@id='ch-chroot-createfiles' or
|
||||
@id='ch-system-stripping'">
|
||||
<xsl:text>#!/tools/bin/bash
set +h
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>#!/bin/bash
set +h
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:if test="not(@id='ch-system-stripping')">
|
||||
<xsl:text>set -e</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
<xsl:if test="sect2[@role='installation'] and
|
||||
not(@id='ch-system-multiarch-wrapper')">
|
||||
<xsl:text>cd $PKGDIR
</xsl:text>
|
||||
<xsl:if test="@id='ch-system-vim' and $vim-lang = 'y'">
|
||||
<xsl:text>tar -xvf ../vim-&vim-version;-lang.* --strip-components=1
</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:if>
|
||||
<xsl:apply-templates select=".//para/userinput | .//screen"/>
|
||||
<xsl:text>exit</xsl:text>
|
||||
</exsl:document>
|
||||
</xsl:if>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="screen">
|
||||
<xsl:if test="child::* = userinput and not(@role = 'nodump')">
|
||||
<xsl:apply-templates select="userinput" mode="screen"/>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="para/userinput">
|
||||
<xsl:if test="(contains(string(),'test') or
|
||||
contains(string(),'check')) and
|
||||
($testsuite = '2' or $testsuite = '3')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$bomb-testsuite = 'n'">
|
||||
<xsl:value-of select="substring-before(string(),'make')"/>
|
||||
<xsl:text>make -k</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'make')"/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1</xsl:text>
|
||||
<xsl:if test="contains(string(),' -k ')">
|
||||
<xsl:text> || true</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="userinput" mode="screen">
|
||||
<xsl:choose>
|
||||
<!-- Estandarized package formats -->
|
||||
<xsl:when test="contains(string(),'tar.gz')">
|
||||
<xsl:value-of select="substring-before(string(),'tar.gz')"/>
|
||||
<xsl:text>tar.*</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'tar.gz')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Setting $LANG for /etc/profile -->
|
||||
<xsl:when test="ancestor::sect1[@id='ch-scripts-profile'] and
|
||||
contains(string(),'export LANG=')">
|
||||
<xsl:value-of select="substring-before(string(),'export LANG=')"/>
|
||||
<xsl:text>export LANG=</xsl:text>
|
||||
<xsl:value-of select="$lang"/>
|
||||
<xsl:value-of select="substring-after(string(),'charmap]')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Compile the keymap into the kernel has been disabled for 1.0 -->
|
||||
<xsl:when test="contains(string(),'defkeymap')"/>
|
||||
<!-- Copying the kernel config file -->
|
||||
<xsl:when test="string() = 'make mrproper'">
|
||||
<xsl:text>make mrproper
</xsl:text>
|
||||
<xsl:if test="ancestor::sect1[@id='ch-boot-kernel']">
|
||||
<xsl:text>cp -v ../bootkernel-config .config
</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="ancestor::sect1[@id='ch-bootable-kernel']">
|
||||
<xsl:text>cp -v ../kernel-config .config
</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:when>
|
||||
<!-- No interactive commands are needed if the .config file is the proper one -->
|
||||
<xsl:when test="contains(string(),'menuconfig')"/>
|
||||
<!-- The Coreutils and Module-Init-Tools test suites are optional -->
|
||||
<xsl:when test="(ancestor::sect1[@id='ch-system-coreutils'] or
|
||||
ancestor::sect1[@id='ch-system-module-init-tools']) and
|
||||
(contains(string(),'check') or
|
||||
contains(string(),'dummy'))">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$testsuite = '0' or $testsuite = '1'"/>
|
||||
<xsl:otherwise>
|
||||
<xsl:if test="not(contains(string(),'check'))">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="contains(string(),'check')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$bomb-testsuite = 'n'">
|
||||
<xsl:value-of select="substring-before(string(),'check')"/>
|
||||
<xsl:text>-k check</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'check')"/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1</xsl:text>
|
||||
<xsl:if test="contains(string(),' -k ')">
|
||||
<xsl:text> || true</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:if>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<!-- Fixing toolchain test suites run -->
|
||||
<xsl:when test="string() = 'make check' or
|
||||
string() = 'make -k check'">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$testsuite != '0'">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$bomb-testsuite = 'n'">
|
||||
<xsl:text>make -k check >> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1</xsl:text>
|
||||
<xsl:if test="contains(string(),' -k ')">
|
||||
<xsl:text> || true</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains(string(),'glibc-check-log')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$testsuite != '0'">
|
||||
<xsl:value-of select="substring-before(string(),'>g')"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$bomb-testsuite = 'n'">
|
||||
<xsl:text>>> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>>> $TEST_LOG 2>&1</xsl:text>
|
||||
<xsl:if test="contains(string(),' -k ')">
|
||||
<xsl:text> || true</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains(string(),'test_summary') or
|
||||
contains(string(),'expect -c')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$testsuite != '0'">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG
</xsl:text>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<!-- Don't stop on strip run -->
|
||||
<xsl:when test="contains(string(),'strip ')">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- The rest of commands -->
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="replaceable">
|
||||
<xsl:choose>
|
||||
<xsl:when test="ancestor::sect1[@id='ch-system-glibc']">
|
||||
<xsl:value-of select="$timezone"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="ancestor::sect1[@id='ch-system-groff']">
|
||||
<xsl:value-of select="$page"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="ancestor::sect1[@id='ch-cross-tools-flags']">
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains(string(),'BUILD32')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$sparc = '1' or $sparc = '2'">
|
||||
<xsl:text>-m32 -mcpu=ultrasparc -mtune=ultrasparc</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="$sparc = '3'">
|
||||
<xsl:text>-m32 -mcpu=ultrasparc3 -mtune=ultrasparc3</xsl:text>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains(string(),'BUILD64')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$sparc = '1' or $sparc = '2'">
|
||||
<xsl:text>-m64 -mcpu=ultrasparc -mtune=ultrasparc</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="$sparc = '3'">
|
||||
<xsl:text>-m64 -mcpu=ultrasparc3 -mtune=ultrasparc3</xsl:text>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains(string(),'GCCTARGET')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$sparc = '1' or $sparc = '2'">
|
||||
<xsl:text>-mcpu=ultrasparc -mtune=ultrasparc</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="$sparc = '3'">
|
||||
<xsl:text>-mcpu=ultrasparc3 -mtune=ultrasparc3</xsl:text>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>**EDITME</xsl:text>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>EDITME**</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
1002
2.3/CLFS/master.sh
Normal file
1002
2.3/CLFS/master.sh
Normal file
File diff suppressed because it is too large
Load diff
153
2.3/CLFS2/clfs2.xsl
Normal file
153
2.3/CLFS2/clfs2.xsl
Normal file
|
@ -0,0 +1,153 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE xsl:stylesheet [
|
||||
<!ENTITY % general-entities SYSTEM "FAKEDIR/general.ent">
|
||||
%general-entities;
|
||||
]>
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:exsl="http://exslt.org/common"
|
||||
extension-element-prefixes="exsl"
|
||||
version="1.0">
|
||||
|
||||
<!-- XSLT stylesheet to create shell scripts from CLFS2 books. -->
|
||||
|
||||
<!-- Install vim-lang package? -->
|
||||
<xsl:param name="vim-lang" select="y"/>
|
||||
|
||||
<!-- Time zone -->
|
||||
<xsl:param name="timezone" select="GMT"/>
|
||||
|
||||
<!-- Page size -->
|
||||
<xsl:param name="page" select="letter"/>
|
||||
|
||||
<!-- Locale settings -->
|
||||
<xsl:param name="lang" select="C"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:apply-templates select="//sect1"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="sect1">
|
||||
<xsl:choose>
|
||||
<xsl:when test="../@id='chapter-partitioning' or
|
||||
../@id='chapter-getting-materials' or
|
||||
../@id='chapter-final-preps'"/>
|
||||
<xsl:otherwise>
|
||||
<xsl:if test="count(descendant::screen/userinput) > 0 and
|
||||
count(descendant::screen/userinput) >
|
||||
count(descendant::screen[@role='nodump'])">
|
||||
<!-- The dirs names -->
|
||||
<xsl:variable name="pi-dir" select="../processing-instruction('dbhtml')"/>
|
||||
<xsl:variable name="pi-dir-value" select="substring-after($pi-dir,'dir=')"/>
|
||||
<xsl:variable name="quote-dir" select="substring($pi-dir-value,1,1)"/>
|
||||
<xsl:variable name="dirname" select="substring-before(substring($pi-dir-value,2),$quote-dir)"/>
|
||||
<!-- The file names -->
|
||||
<xsl:variable name="pi-file" select="processing-instruction('dbhtml')"/>
|
||||
<xsl:variable name="pi-file-value" select="substring-after($pi-file,'filename=')"/>
|
||||
<xsl:variable name="filename" select="substring-before(substring($pi-file-value,2),'.html')"/>
|
||||
<!-- The build order -->
|
||||
<xsl:variable name="position" select="position()"/>
|
||||
<xsl:variable name="order">
|
||||
<xsl:choose>
|
||||
<xsl:when test="string-length($position) = 1">
|
||||
<xsl:text>00</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="string-length($position) = 2">
|
||||
<xsl:text>0</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<!-- Creating dirs and files -->
|
||||
<exsl:document href="{$dirname}/{$order}-{$filename}" method="text">
|
||||
<xsl:text>#!/bin/bash
set +h
</xsl:text>
|
||||
<xsl:if test="not(@id='ch-system-stripping')">
|
||||
<xsl:text>set -e
</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
<xsl:if test="sect2[@role='installation']">
|
||||
<xsl:text>cd $PKGDIR
</xsl:text>
|
||||
<xsl:if test="@id='ch-system-vim' and $vim-lang = 'y'">
|
||||
<xsl:text>tar -xvf ../vim-&vim-version;-lang.* --strip-components=1
</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:if>
|
||||
<xsl:apply-templates select=".//para/userinput | .//screen"/>
|
||||
<xsl:text>exit</xsl:text>
|
||||
</exsl:document>
|
||||
</xsl:if>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="screen">
|
||||
<xsl:if test="child::* = userinput and not(@role = 'nodump')">
|
||||
<xsl:apply-templates select="userinput" mode="screen"/>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="para/userinput"/>
|
||||
|
||||
<xsl:template match="userinput" mode="screen">
|
||||
<xsl:choose>
|
||||
<!-- Estandarized package formats -->
|
||||
<xsl:when test="contains(string(),'tar.gz')">
|
||||
<xsl:value-of select="substring-before(string(),'tar.gz')"/>
|
||||
<xsl:text>tar.*</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'tar.gz')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Setting $LANG for /etc/profile -->
|
||||
<xsl:when test="ancestor::sect1[@id='ch-scripts-profile'] and
|
||||
contains(string(),'export LANG=')">
|
||||
<xsl:value-of select="substring-before(string(),'export LANG=')"/>
|
||||
<xsl:text>export LANG=</xsl:text>
|
||||
<xsl:value-of select="$lang"/>
|
||||
<xsl:value-of select="substring-after(string(),'charmap]')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Compile the keymap into the kernel has been disabled -->
|
||||
<xsl:when test="contains(string(),'defkeymap')"/>
|
||||
<!-- Copying the kernel config file -->
|
||||
<xsl:when test="string() = 'make mrproper'">
|
||||
<xsl:text>make mrproper
</xsl:text>
|
||||
<xsl:text>cp -v ../kernel-config .config
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- No interactive commands are needed if the .config file is the proper one -->
|
||||
<xsl:when test="contains(string(),'menuconfig')"/>
|
||||
<!-- Don't stop on strip run -->
|
||||
<xsl:when test="contains(string(),'strip ')">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- The rest of commands -->
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="replaceable">
|
||||
<xsl:choose>
|
||||
<xsl:when test="ancestor::sect1[@id='ch-cross-tools-glibc']">
|
||||
<xsl:value-of select="$timezone"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="ancestor::sect1[@id='ch-cross-tools-groff'] or
|
||||
ancestor::sect1[@id='ch-system-groff']">
|
||||
<xsl:value-of select="$page"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>**EDITME</xsl:text>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>EDITME**</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
536
2.3/CLFS2/master.sh
Normal file
536
2.3/CLFS2/master.sh
Normal file
|
@ -0,0 +1,536 @@
|
|||
#!/bin/bash
|
||||
# $Id$
|
||||
|
||||
###################################
|
||||
### FUNCTIONS ###
|
||||
###################################
|
||||
|
||||
|
||||
#----------------------------#
|
||||
host_prep_Makefiles() { # Initialization of the system
|
||||
#----------------------------#
|
||||
local CLFS_HOST
|
||||
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}host prep files ( SETUP ) ${R_arrow}"
|
||||
|
||||
# defined here, only for ease of reading
|
||||
CLFS_HOST="$(echo $MACHTYPE | sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")"
|
||||
(
|
||||
cat << EOF
|
||||
|
||||
025-addinguser:
|
||||
@\$(call echo_message, Building)
|
||||
@if [ ! -d \$(LUSER_HOME) ]; then \\
|
||||
groupadd \$(LGROUP); \\
|
||||
useradd -s /bin/bash -g \$(LGROUP) -m -k /dev/null \$(LUSER); \\
|
||||
else \\
|
||||
touch luser-exist; \\
|
||||
fi;
|
||||
@\$(call housekeeping)
|
||||
|
||||
026-settingenvironment: 025-addinguser
|
||||
@\$(call echo_message, Building)
|
||||
@if [ -f \$(LUSER_HOME)/.bashrc -a ! -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bashrc \$(LUSER_HOME)/.bashrc.XXX; \\
|
||||
fi;
|
||||
@if [ -f \$(LUSER_HOME)/.bash_profile -a ! -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bash_profile \$(LUSER_HOME)/.bash_profile.XXX; \\
|
||||
fi;
|
||||
@echo "set +h" > \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "umask 022" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "CLFS=\$(MOUNT_PT)" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "LC_ALL=POSIX" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "PATH=\$(MOUNT_PT)/cross-tools/bin:/bin:/usr/bin" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "export CLFS LC_ALL PATH" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "unset CFLAGS" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "unset CXXFLAGS" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "export CLFS_HOST=\"${CLFS_HOST}\"" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "export CLFS_TARGET=\"${TARGET}\"" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "source $JHALFSDIR/envars" >> \$(LUSER_HOME)/.bashrc
|
||||
@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bashrc && \\
|
||||
touch envars && \\
|
||||
chown \$(LUSER):\$(LGROUP) envars
|
||||
@\$(call housekeeping)
|
||||
|
||||
027-create-directories: 026-settingenvironment
|
||||
@\$(call echo_message, Building)
|
||||
|
||||
@mkdir -p \$(MOUNT_PT)/{bin,boot,dev,{etc/,}opt,home,lib,mnt}
|
||||
@mkdir -p \$(MOUNT_PT)/{proc,media/{floppy,cdrom},sbin,srv,sys}
|
||||
@mkdir -p \$(MOUNT_PT)/var/{lock,log,mail,run,spool}
|
||||
@mkdir -p \$(MOUNT_PT)/var/{opt,cache,lib/{misc,locate},local}
|
||||
@install -d -m 0750 \$(MOUNT_PT)/root
|
||||
@install -d -m 1777 \$(MOUNT_PT){/var,}/tmp
|
||||
@mkdir -p \$(MOUNT_PT)/usr/{,local/}{bin,include,lib,sbin,src}
|
||||
@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/{doc,info,locale,man}
|
||||
@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/{misc,terminfo,zoneinfo}
|
||||
@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/man/man{1,2,3,4,5,6,7,8}
|
||||
@for dir in \$(MOUNT_PT)/usr{,/local}; do \\
|
||||
ln -s share/{man,doc,info} \$\$dir ; \\
|
||||
done
|
||||
@\$(call housekeeping)
|
||||
|
||||
028-creating-sysfile: 027-create-directories
|
||||
@\$(call echo_message, Building)
|
||||
|
||||
@touch \$(MOUNT_PT)/etc/mtab
|
||||
@echo "root::0:0:root:/root:/bin/bash" >> \$(MOUNT_PT)/etc/passwd
|
||||
@echo "root:x:0:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "bin:x:1:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "sys:x:2:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "kmem:x:3" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "tty:x:4:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "tape:x:5:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "daemon:x:6:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "floppy:x:7:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "disk:x:8:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "lp:x:9:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "dialout:x:10:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "audio:x:11:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "video:x:12:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "utmp:x:13:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "usb:x:14:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "cdrom:x:15:" >> \$(MOUNT_PT)/etc/group
|
||||
|
||||
@touch \$(MOUNT_PT)/var/run/utmp \$(MOUNT_PT)/var/log/{btmp,lastlog,wtmp}
|
||||
@chmod 664 \$(MOUNT_PT)/var/run/utmp \$(MOUNT_PT)/var/log/lastlog
|
||||
@chown -R \$(LUSER) \$(MOUNT_PT) && \\
|
||||
chmod -R a+w \$(MOUNT_PT)/\$(SCRIPT_ROOT) && \\
|
||||
chmod -R a+w \$(SRCSDIR)
|
||||
@\$(call housekeeping)
|
||||
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
|
||||
host_prep=" 025-addinguser 026-settingenvironment 027-create-directories 028-creating-sysfile"
|
||||
}
|
||||
|
||||
|
||||
#-----------------------------#
|
||||
cross_tools_Makefiles() { #
|
||||
#-----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}cross tools ( LUSER ) ${R_arrow}"
|
||||
|
||||
for file in cross-tools/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
#
|
||||
# Skip this script...
|
||||
case $this_script in
|
||||
*cflags* | *variables* ) # work done in host_prep_Makefiles
|
||||
continue ;;
|
||||
*) ;;
|
||||
esac
|
||||
|
||||
#
|
||||
# Set the dependency for the first target.
|
||||
if [ -z $PREV ] ; then PREV=028-creating-sysfile ; fi
|
||||
|
||||
# First append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
cross_tools="$cross_tools $this_script"
|
||||
|
||||
# Grab the name of the target (minus the -headers or -cross in the case of gcc
|
||||
# and binutils in chapter 5)
|
||||
name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' \
|
||||
-e 's@-static@@' \
|
||||
-e 's@-final@@' \
|
||||
-e 's@-64@@' \
|
||||
-e 's@-n32@@'`
|
||||
case $name in
|
||||
glibc-headers) name="glibc" ;;
|
||||
esac
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
#
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_wrt_unpack "$pkg_tarball"
|
||||
# If using optimizations, write the instructions
|
||||
[[ "$OPTIMIZE" != "0" ]] && wrt_optimize "$name" && wrt_makeflags "$name"
|
||||
fi
|
||||
#
|
||||
LUSER_wrt_RunAsUser "${file}"
|
||||
#
|
||||
[[ "$pkg_tarball" != "" ]] && LUSER_RemoveBuildDirs "${name}"
|
||||
#
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=$this_script
|
||||
|
||||
done # for file in ....
|
||||
}
|
||||
|
||||
|
||||
|
||||
#-----------------------------#
|
||||
final_system_Makefiles() { #
|
||||
#-----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}final system ( LUSER ) ${R_arrow}"
|
||||
|
||||
for file in final-system/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
# Test if the stripping phase must be skipped.
|
||||
# Skip alsp temp-perl for iterative runs
|
||||
case $this_script in
|
||||
*stripping*) [[ "$STRIP" = "n" ]] && continue ;;
|
||||
esac
|
||||
|
||||
# Grab the name of the target, strip id number, XXX-script
|
||||
name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' \
|
||||
-e 's@temp-@@' \
|
||||
-e 's@-64bit@@' \
|
||||
-e 's@-64@@' \
|
||||
-e 's@64@@' \
|
||||
-e 's@n32@@'`
|
||||
|
||||
# Find the version of the command files, if it corresponds with the building of
|
||||
# a specific package.
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
|
||||
# Append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
basicsystem="$basicsystem ${this_script}"
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
#
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
# Touch timestamp file if installed files logs will be created.
|
||||
# But only for the firt build when running iterative builds.
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_TouchTimestamp
|
||||
fi
|
||||
LUSER_wrt_unpack "$pkg_tarball"
|
||||
# If using optimizations, write the instructions
|
||||
[[ "$OPTIMIZE" != "0" ]] && wrt_optimize "$name" && wrt_makeflags "$name"
|
||||
fi
|
||||
#
|
||||
LUSER_wrt_RunAsUser "${file}"
|
||||
#
|
||||
# Write installed files log and remove the build directory(ies)
|
||||
# except if the package build fails.
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_RemoveBuildDirs "${name}"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_LogNewFiles "$name"
|
||||
fi
|
||||
fi
|
||||
#
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=${this_script}
|
||||
done # for file in final-system/* ...
|
||||
}
|
||||
|
||||
|
||||
|
||||
#-----------------------------#
|
||||
bootscripts_Makefiles() { #
|
||||
#-----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}bootscripts ( LUSER ) ${R_arrow}"
|
||||
|
||||
for file in bootscripts/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
case $this_script in
|
||||
*udev) continue ;; # This is not a script but a commentary, we want udev-rules
|
||||
*console*) continue ;; # Use the files that came with the bootscripts
|
||||
*network*) continue ;; # Manually create these files
|
||||
*) ;;
|
||||
esac
|
||||
|
||||
# First append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
bootscripttools="$bootscripttools $this_script"
|
||||
|
||||
# Grab the name of the target, strip id number, XXX-script
|
||||
name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@'\
|
||||
-e 's@-64bit@@' \
|
||||
-e 's@-64@@' \
|
||||
-e 's@64@@' \
|
||||
-e 's@n32@@'`
|
||||
case $name in
|
||||
*bootscripts*) name=bootscripts-cross-lfs ;;
|
||||
*udev-rules) name=udev-cross-lfs ;;
|
||||
esac
|
||||
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
#
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_wrt_unpack "$pkg_tarball"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_TouchTimestamp
|
||||
fi
|
||||
fi
|
||||
#
|
||||
LUSER_wrt_RunAsUser "${file}"
|
||||
#
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_RemoveBuildDirs "${name}"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_LogNewFiles "$name"
|
||||
fi
|
||||
fi
|
||||
#
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=$this_script
|
||||
|
||||
done # for file in bootscripts/* ...
|
||||
|
||||
}
|
||||
|
||||
|
||||
#-----------------------------#
|
||||
bootable_Makefiles() { #
|
||||
#-----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}make bootable ( LUSER ) ${R_arrow}"
|
||||
|
||||
for file in bootable/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
# A little housekeeping on the scripts
|
||||
case $this_script in
|
||||
*grub | *aboot | *colo | *silo | *arcload | *lilo | *reboot* ) continue ;;
|
||||
*fstab) [[ ! -z ${FSTAB} ]] && cp ${FSTAB} $BUILDDIR/sources/fstab ;;
|
||||
*kernel) # if there is no kernel config file do not build the kernel
|
||||
[[ -z $CONFIG ]] && continue
|
||||
# Copy the config file to /sources with a standardized name
|
||||
cp $CONFIG $BUILDDIR/sources/kernel-config
|
||||
;;
|
||||
esac
|
||||
#
|
||||
# First append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
# NOTE: new makfile format forces the last script, *chowning, into a separate
|
||||
# phase.
|
||||
case ${this_script} in
|
||||
*chowning) chowning=" ${this_script}" ;;
|
||||
*) bootable="$bootable $this_script" ;;
|
||||
esac
|
||||
#
|
||||
# Grab the name of the target, strip id number and misc words.
|
||||
name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' -e 's@-build@@' `
|
||||
case $this_script in
|
||||
*kernel*) name=linux
|
||||
;;
|
||||
esac
|
||||
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
#
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_wrt_unpack "$pkg_tarball"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_TouchTimestamp
|
||||
fi
|
||||
fi
|
||||
#
|
||||
# Select a script execution method
|
||||
case $this_script in
|
||||
*fstab*) if [[ -n "$FSTAB" ]]; then
|
||||
LUSER_wrt_CopyFstab
|
||||
else
|
||||
LUSER_wrt_RunAsUser "${file}"
|
||||
fi
|
||||
;;
|
||||
*chowning) wrt_RunAsRoot "${file}"
|
||||
;;
|
||||
*) LUSER_wrt_RunAsUser "${file}"
|
||||
;;
|
||||
esac
|
||||
#
|
||||
# Housekeeping...remove any build directory(ies) except if the package build fails.
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_RemoveBuildDirs "${name}"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_LogNewFiles "$name"
|
||||
fi
|
||||
fi
|
||||
#
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=$this_script
|
||||
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
|
||||
#-----------------------------#
|
||||
build_Makefile() { # Construct a Makefile from the book scripts
|
||||
#-----------------------------#
|
||||
echo "Creating Makefile... ${BOLD}START${OFF}"
|
||||
|
||||
cd $JHALFSDIR/${PROGNAME}-commands
|
||||
# Start with a clean Makefile.tmp file
|
||||
>$MKFILE.tmp
|
||||
|
||||
host_prep_Makefiles
|
||||
cross_tools_Makefiles # $cross_tools
|
||||
final_system_Makefiles # $basicsystem
|
||||
bootscripts_Makefiles # $bootscripttools
|
||||
bootable_Makefiles # $bootable
|
||||
# Add the CUSTOM_TOOLS targets, if needed
|
||||
[[ "$CUSTOM_TOOLS" = "y" ]] && wrt_CustomTools_target
|
||||
# Add the BLFS_TOOL targets, if needed.
|
||||
[[ "$BLFS_TOOL" = "y" ]] && wrt_blfs_tool_targets
|
||||
|
||||
# Add a header, some variables and include the function file
|
||||
# to the top of the real Makefile.
|
||||
wrt_Makefile_header
|
||||
|
||||
# Drop in the main target 'all:' and the chapter targets with each sub-target
|
||||
# as a dependency.
|
||||
(
|
||||
cat << EOF
|
||||
|
||||
all: ck_UID mk_SETUP mk_LUSER create-sbu_du-report mk_CUSTOM_TOOLS mk_BLFS_TOOL mk_ROOT
|
||||
@sudo make restore-luser-env
|
||||
@sudo make do-housekeeping
|
||||
@\$(call echo_finished,$VERSION)
|
||||
|
||||
ck_UID:
|
||||
@if [ \`id -u\` = "0" ]; then \\
|
||||
echo "--------------------------------------------------"; \\
|
||||
echo "You cannot run this makefile from the root account"; \\
|
||||
echo "--------------------------------------------------"; \\
|
||||
exit 1; \\
|
||||
fi
|
||||
|
||||
mk_SETUP:
|
||||
@\$(call echo_SU_request)
|
||||
@sudo make BREAKPOINT=\$(BREAKPOINT) SETUP
|
||||
@touch \$@
|
||||
|
||||
mk_LUSER: mk_SETUP
|
||||
@\$(call echo_SULUSER_request)
|
||||
@(sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) LUSER" )
|
||||
@touch \$@
|
||||
|
||||
mk_CUSTOM_TOOLS: create-sbu_du-report
|
||||
@if [ "\$(ADD_CUSTOM_TOOLS)" = "y" ]; then \\
|
||||
\$(call sh_echo_PHASE,Building CUSTOM_TOOLS); \\
|
||||
(sudo \$(SU_LUSER) "mkdir -p $BUILDDIR$TRACKING_DIR"); \\
|
||||
(sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CUSTOM_TOOLS"); \\
|
||||
fi;
|
||||
@touch \$@
|
||||
|
||||
mk_BLFS_TOOL: mk_CUSTOM_TOOLS
|
||||
@if [ "\$(ADD_BLFS_TOOLS)" = "y" ]; then \\
|
||||
\$(call sh_echo_PHASE,Building BLFS_TOOL); \\
|
||||
(sudo \$(SU_LUSER) "mkdir -p $BUILDDIR$TRACKING_DIR"); \\
|
||||
(sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) BLFS_TOOL"); \\
|
||||
fi;
|
||||
@touch \$@
|
||||
|
||||
mk_ROOT: create-sbu_du-report
|
||||
@\$(call echo_SU_request)
|
||||
@echo "$VERSION-sysroot - jhalfs build" > clfs-release && \\
|
||||
sudo mv clfs-release \$(MOUNT_PT)/etc
|
||||
@sudo make BREAKPOINT=\$(BREAKPOINT) ROOT
|
||||
@touch \$@
|
||||
|
||||
SETUP: $host_prep
|
||||
LUSER: $cross_tools $basicsystem $bootscripttools $bootable
|
||||
CUSTOM_TOOLS: $custom_list
|
||||
BLFS_TOOL: $blfs_tool
|
||||
ROOT: $chowning
|
||||
|
||||
|
||||
create-sbu_du-report: mk_LUSER
|
||||
@\$(call echo_message, Building)
|
||||
@if [ "\$(ADD_REPORT)" = "y" ]; then \\
|
||||
./create-sbu_du-report.sh logs $VERSION; \\
|
||||
\$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report); \\
|
||||
fi;
|
||||
@touch \$@
|
||||
|
||||
restore-luser-env:
|
||||
@\$(call echo_message, Building)
|
||||
@if [ -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
|
||||
mv -f \$(LUSER_HOME)/.bashrc.XXX \$(LUSER_HOME)/.bashrc; \\
|
||||
fi;
|
||||
@if [ -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bash_profile.XXX \$(LUSER_HOME)/.bash_profile; \\
|
||||
fi;
|
||||
@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bash* && \\
|
||||
touch \$@ && \\
|
||||
echo " "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
|
||||
echo --------------------------------------------------------------------------------\$(WHITE)
|
||||
|
||||
do-housekeeping:
|
||||
@-if [ ! -f luser-exist ]; then \\
|
||||
userdel \$(LUSER); \\
|
||||
rm -rf \$(LUSER_HOME); \\
|
||||
fi;
|
||||
|
||||
EOF
|
||||
) >> $MKFILE
|
||||
|
||||
# Bring over the items from the Makefile.tmp
|
||||
cat $MKFILE.tmp >> $MKFILE
|
||||
rm $MKFILE.tmp
|
||||
echo "Creating Makefile... ${BOLD}DONE${OFF}"
|
||||
|
||||
}
|
154
2.3/CLFS3/clfs3.xsl
Normal file
154
2.3/CLFS3/clfs3.xsl
Normal file
|
@ -0,0 +1,154 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE xsl:stylesheet [
|
||||
<!ENTITY % general-entities SYSTEM "FAKEDIR/general.ent">
|
||||
%general-entities;
|
||||
]>
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:exsl="http://exslt.org/common"
|
||||
extension-element-prefixes="exsl"
|
||||
version="1.0">
|
||||
|
||||
<!-- XSLT stylesheet to create shell scripts from CLFS2 books. -->
|
||||
|
||||
<!-- Endian level -->
|
||||
<xsl:param name="endian" select="xbig"/>
|
||||
|
||||
<!-- Time zone -->
|
||||
<xsl:param name="timezone" select="GMT"/>
|
||||
|
||||
<!-- Page size -->
|
||||
<xsl:param name="page" select="letter"/>
|
||||
|
||||
<!-- Locale settings -->
|
||||
<xsl:param name="lang" select="C"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:apply-templates select="//sect1"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="sect1">
|
||||
<xsl:choose>
|
||||
<xsl:when test="../@id='chapter-partitioning' or
|
||||
../@id='chapter-getting-materials' or
|
||||
../@id='chapter-final-preps'"/>
|
||||
<xsl:otherwise>
|
||||
<xsl:if test="count(descendant::screen/userinput) > 0 and
|
||||
count(descendant::screen/userinput) >
|
||||
count(descendant::screen[@role='nodump'])">
|
||||
<!-- The dirs names -->
|
||||
<xsl:variable name="pi-dir" select="../processing-instruction('dbhtml')"/>
|
||||
<xsl:variable name="pi-dir-value" select="substring-after($pi-dir,'dir=')"/>
|
||||
<xsl:variable name="quote-dir" select="substring($pi-dir-value,1,1)"/>
|
||||
<xsl:variable name="dirname" select="substring-before(substring($pi-dir-value,2),$quote-dir)"/>
|
||||
<!-- The file names -->
|
||||
<xsl:variable name="pi-file" select="processing-instruction('dbhtml')"/>
|
||||
<xsl:variable name="pi-file-value" select="substring-after($pi-file,'filename=')"/>
|
||||
<xsl:variable name="filename" select="substring-before(substring($pi-file-value,2),'.html')"/>
|
||||
<!-- The build order -->
|
||||
<xsl:variable name="position" select="position()"/>
|
||||
<xsl:variable name="order">
|
||||
<xsl:choose>
|
||||
<xsl:when test="string-length($position) = 1">
|
||||
<xsl:text>00</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="string-length($position) = 2">
|
||||
<xsl:text>0</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<!-- Creating dirs and files -->
|
||||
<exsl:document href="{$dirname}/{$order}-{$filename}" method="text">
|
||||
<xsl:text>#!/bin/bash
set +h
set -e

</xsl:text>
|
||||
<!-- Set envars needed by uClibc -->
|
||||
<xsl:if test="@id='ch-cross-tools-uclibc'">
|
||||
<xsl:copy-of select="//sect1[@id='ch-cross-tools-toolchain']/screen"/>
|
||||
<xsl:text>

</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="sect2[@role='installation']">
|
||||
<xsl:text>cd $PKGDIR
</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:apply-templates select=".//para/userinput | .//screen"/>
|
||||
<xsl:text>exit</xsl:text>
|
||||
</exsl:document>
|
||||
</xsl:if>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="screen">
|
||||
<xsl:if test="child::* = userinput and not(@role = 'nodump')">
|
||||
<xsl:apply-templates select="userinput" mode="screen"/>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="para/userinput"/>
|
||||
|
||||
<xsl:template match="userinput" mode="screen">
|
||||
<xsl:choose>
|
||||
<!-- Estandarized package formats -->
|
||||
<xsl:when test="contains(string(),'tar.gz')">
|
||||
<xsl:value-of select="substring-before(string(),'tar.gz')"/>
|
||||
<xsl:text>tar.*</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'tar.gz')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Select Endian level for uClibc -->
|
||||
<xsl:when test="$endian='xbig' and contains(string(),'LITTLE_ENDIAN')"/>
|
||||
<xsl:when test="$endian='xlittle' and contains(string(),'BIG_ENDIAN')"/>
|
||||
<!-- Setting $LANG for /etc/profile -->
|
||||
<xsl:when test="ancestor::sect1[@id='ch-scripts-profile'] and
|
||||
contains(string(),'export LANG=')">
|
||||
<xsl:value-of select="substring-before(string(),'export LANG=')"/>
|
||||
<xsl:text>export LANG=</xsl:text>
|
||||
<xsl:value-of select="$lang"/>
|
||||
<xsl:value-of select="substring-after(string(),'charmap]')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Compile the keymap into the kernel has been disabled -->
|
||||
<xsl:when test="contains(string(),'defkeymap')"/>
|
||||
<!-- Copying the kernel config file -->
|
||||
<xsl:when test="string() = 'make mrproper'">
|
||||
<xsl:text>make mrproper
</xsl:text>
|
||||
<xsl:text>cp -v ../kernel-config .config
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- No interactive commands are needed if the .config file is the proper one -->
|
||||
<xsl:when test="contains(string(),'menuconfig')"/>
|
||||
<!-- Don't stop on strip run -->
|
||||
<xsl:when test="contains(string(),'strip ')">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- The rest of commands -->
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="replaceable">
|
||||
<xsl:choose>
|
||||
<xsl:when test="ancestor::sect1[@id='ch-cross-tools-glibc']">
|
||||
<xsl:value-of select="$timezone"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="ancestor::sect1[@id='ch-cross-tools-groff'] or
|
||||
ancestor::sect1[@id='ch-system-groff']">
|
||||
<xsl:value-of select="$page"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>**EDITME</xsl:text>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>EDITME**</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
586
2.3/CLFS3/master.sh
Normal file
586
2.3/CLFS3/master.sh
Normal file
|
@ -0,0 +1,586 @@
|
|||
#!/bin/bash
|
||||
# $Id$
|
||||
|
||||
###################################
|
||||
### FUNCTIONS ###
|
||||
###################################
|
||||
|
||||
|
||||
#----------------------------#
|
||||
host_prep_Makefiles() { # Initialization of the system
|
||||
#----------------------------#
|
||||
local CLFS_HOST
|
||||
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}host prep files ( SETUP ) ${R_arrow}"
|
||||
|
||||
# defined here, only for ease of reading
|
||||
CLFS_HOST="$(echo $MACHTYPE | sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")"
|
||||
(
|
||||
cat << EOF
|
||||
|
||||
025-addinguser:
|
||||
@\$(call echo_message, Building)
|
||||
@if [ ! -d \$(LUSER_HOME) ]; then \\
|
||||
groupadd \$(LGROUP); \\
|
||||
useradd -s /bin/bash -g \$(LGROUP) -m -k /dev/null \$(LUSER); \\
|
||||
else \\
|
||||
touch luser-exist; \\
|
||||
fi;
|
||||
@\$(call housekeeping)
|
||||
|
||||
026-settingenvironment: 025-addinguser
|
||||
@\$(call echo_message, Building)
|
||||
@if [ -f \$(LUSER_HOME)/.bashrc -a ! -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bashrc \$(LUSER_HOME)/.bashrc.XXX; \\
|
||||
fi;
|
||||
@if [ -f \$(LUSER_HOME)/.bash_profile -a ! -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bash_profile \$(LUSER_HOME)/.bash_profile.XXX; \\
|
||||
fi;
|
||||
@echo "set +h" > \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "umask 022" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "CLFS=\$(MOUNT_PT)" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "LC_ALL=POSIX" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "PATH=\$(MOUNT_PT)/cross-tools/bin:/bin:/usr/bin" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "export CLFS LC_ALL PATH" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "unset CFLAGS" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "unset CXXFLAGS" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "export CLFS_HOST=\"${CLFS_HOST}\"" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "export CLFS_TARGET=\"${TARGET}\"" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "export CLFS_MIPS_LEVEL=\"${MIPS_LEVEL}\"" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "export BUILD=\"${ABI}\"" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "source $JHALFSDIR/envars" >> \$(LUSER_HOME)/.bashrc
|
||||
@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bashrc && \\
|
||||
touch envars && \\
|
||||
chown \$(LUSER):\$(LGROUP) envars
|
||||
@\$(call housekeeping)
|
||||
|
||||
027-create-directories: 026-settingenvironment
|
||||
@\$(call echo_message, Building)
|
||||
|
||||
@mkdir -p \$(MOUNT_PT)/{bin,boot,dev,{etc/,}opt,home,lib,mnt}
|
||||
@mkdir -p \$(MOUNT_PT)/{proc,media/{floppy,cdrom},sbin,srv,sys}
|
||||
@mkdir -p \$(MOUNT_PT)/var/{lock,log,mail,run,spool}
|
||||
@mkdir -p \$(MOUNT_PT)/var/{opt,cache,lib/{misc,locate},local}
|
||||
@install -d -m 0750 \$(MOUNT_PT)/root
|
||||
@install -d -m 1777 \$(MOUNT_PT){/var,}/tmp
|
||||
@mkdir -p \$(MOUNT_PT)/usr/{,local/}{bin,include,lib,sbin,src}
|
||||
@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/{doc,info,locale,man}
|
||||
@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/{misc,terminfo,zoneinfo}
|
||||
@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/man/man{1,2,3,4,5,6,7,8}
|
||||
@for dir in \$(MOUNT_PT)/usr{,/local}; do \\
|
||||
ln -s share/{man,doc,info} \$\$dir ; \\
|
||||
done
|
||||
@\$(call housekeeping)
|
||||
|
||||
028-creating-sysfile: 027-create-directories
|
||||
@\$(call echo_message, Building)
|
||||
|
||||
@touch \$(MOUNT_PT)/etc/mtab
|
||||
@echo "root::0:0:root:/root:/bin/ash" >> \$(MOUNT_PT)/etc/passwd
|
||||
@echo "root:x:0:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "bin:x:1:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "sys:x:2:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "kmem:x:3" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "tty:x:4:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "tape:x:5:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "daemon:x:6:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "floppy:x:7:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "disk:x:8:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "lp:x:9:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "dialout:x:10:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "audio:x:11:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "video:x:12:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "utmp:x:13:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "usb:x:14:" >> \$(MOUNT_PT)/etc/group
|
||||
@echo "cdrom:x:15:" >> \$(MOUNT_PT)/etc/group
|
||||
|
||||
@touch \$(MOUNT_PT)/var/run/utmp \$(MOUNT_PT)/var/log/{btmp,lastlog,wtmp}
|
||||
@chmod 664 \$(MOUNT_PT)/var/run/utmp \$(MOUNT_PT)/var/log/lastlog
|
||||
@chown -R \$(LUSER) \$(MOUNT_PT) && \\
|
||||
chmod -R a+w \$(MOUNT_PT)/\$(SCRIPT_ROOT) && \\
|
||||
chmod -R a+w \$(SRCSDIR)
|
||||
@\$(call housekeeping)
|
||||
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
|
||||
host_prep=" 025-addinguser 026-settingenvironment 027-create-directories 028-creating-sysfile"
|
||||
}
|
||||
|
||||
#-----------------------------#
|
||||
systemprep_Makefiles() { #
|
||||
#-----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}system prep tools ( LUSER ) ${R_arrow}"
|
||||
|
||||
for file in systemprep/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
# Set the dependency for the first target.
|
||||
if [ -z $PREV ] ; then PREV=028-creating-sysfile ; fi
|
||||
|
||||
# First append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile)
|
||||
cross_tools="$cross_tools $this_script"
|
||||
|
||||
# Grab the name of the target (minus the -headers or -cross in the case of gcc
|
||||
# and binutils in chapter 5)
|
||||
name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@'`
|
||||
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
#
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_wrt_unpack "$pkg_tarball"
|
||||
fi
|
||||
#
|
||||
LUSER_wrt_RunAsUser "${file}"
|
||||
#
|
||||
[[ "$pkg_tarball" != "" ]] && LUSER_RemoveBuildDirs "${name}"
|
||||
#
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=$this_script
|
||||
|
||||
done # for file in ....
|
||||
}
|
||||
|
||||
|
||||
#-----------------------------#
|
||||
cross_tools_Makefiles() { #
|
||||
#-----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}cross tools ( LUSER ) ${R_arrow}"
|
||||
|
||||
for file in cross-tools/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
#
|
||||
# Skip this script...
|
||||
# NOTE.. the book indicated you only needed to install groff or file if the host
|
||||
# had older versions. The packages would be installed in the target directory
|
||||
# and not the host.
|
||||
case $this_script in
|
||||
*cflags* | *variables* | *abi | *toolchain*) # work done in host_prep_Makefiles
|
||||
continue ;;
|
||||
*) ;;
|
||||
esac
|
||||
|
||||
#
|
||||
# Set the dependency for the first target.
|
||||
if [ -z $PREV ] ; then PREV=028-creating-sysfile ; fi
|
||||
|
||||
# First append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile)
|
||||
cross_tools="$cross_tools $this_script"
|
||||
|
||||
# Grab the name of the target (minus the -headers or -cross in the case of gcc
|
||||
# and binutils in chapter 5)
|
||||
name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' \
|
||||
-e 's@-static@@' \
|
||||
-e 's@-final@@' \
|
||||
-e 's@-64@@' \
|
||||
-e 's@-n32@@'`
|
||||
case $name in
|
||||
uclibc*) name="uClibc" ;;
|
||||
esac
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
#
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_wrt_unpack "$pkg_tarball"
|
||||
# Touch timestamp file if installed files logs will be created.
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_TouchTimestamp
|
||||
fi
|
||||
# If using optimizations, write the instructions
|
||||
[[ "$OPTIMIZE" != "0" ]] && wrt_optimize "$name" && wrt_makeflags "$name"
|
||||
fi
|
||||
#
|
||||
LUSER_wrt_RunAsUser "${file}"
|
||||
#
|
||||
# Write installed files log and remove the build directory(ies)
|
||||
# except if the package build fails.
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_RemoveBuildDirs "${name}"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_LogNewFiles "$name"
|
||||
fi
|
||||
fi
|
||||
#
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=$this_script
|
||||
|
||||
done # for file in ....
|
||||
}
|
||||
|
||||
|
||||
|
||||
#-----------------------------#
|
||||
final_system_Makefiles() { #
|
||||
#-----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}final system ( LUSER ) ${R_arrow}"
|
||||
|
||||
for file in final-system/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
# Grab the name of the target, strip id number, XXX-script
|
||||
name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' \
|
||||
-e 's@temp-@@' \
|
||||
-e 's@-64bit@@' \
|
||||
-e 's@-64@@' \
|
||||
-e 's@64@@' \
|
||||
-e 's@n32@@'`
|
||||
|
||||
# Find the version of the command files, if it corresponds with the building of
|
||||
# a specific package.
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
|
||||
# Append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
basicsystem="$basicsystem ${this_script}"
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
#
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
# Touch timestamp file if installed files logs will be created.
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_TouchTimestamp
|
||||
fi
|
||||
LUSER_wrt_unpack "$pkg_tarball"
|
||||
# If using optimizations, write the instructions
|
||||
[[ "$OPTIMIZE" != "0" ]] && wrt_optimize "$name" && wrt_makeflags "$name"
|
||||
fi
|
||||
#
|
||||
LUSER_wrt_RunAsUser "${file}"
|
||||
#
|
||||
# Write installed files log and remove the build directory(ies)
|
||||
# except if the package build fails.
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_RemoveBuildDirs "${name}"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_LogNewFiles "$name"
|
||||
fi
|
||||
fi
|
||||
#
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=${this_script}
|
||||
done # for file in final-system/* ...
|
||||
}
|
||||
|
||||
|
||||
|
||||
#-----------------------------#
|
||||
bootscripts_Makefiles() { #
|
||||
#-----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}bootscripts ( LUSER ) ${R_arrow}"
|
||||
|
||||
for file in bootscripts/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
case $this_script in
|
||||
*console*) continue ;; # Use the files that came with the bootscripts
|
||||
*network*) continue ;; # Manually create these files
|
||||
*) ;;
|
||||
esac
|
||||
|
||||
# First append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
bootscripttools="$bootscripttools $this_script"
|
||||
|
||||
# Grab the name of the target, strip id number, XXX-script
|
||||
name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@'\
|
||||
-e 's@-64bit@@' \
|
||||
-e 's@-64@@' \
|
||||
-e 's@64@@' \
|
||||
-e 's@n32@@'`
|
||||
case $name in
|
||||
*bootscripts*) name=clfs-embedded-bootscripts ;;
|
||||
esac
|
||||
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
#
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_wrt_unpack "$pkg_tarball"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_TouchTimestamp
|
||||
fi
|
||||
fi
|
||||
#
|
||||
LUSER_wrt_RunAsUser "${file}"
|
||||
#
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_RemoveBuildDirs "${name}"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_LogNewFiles "$name"
|
||||
fi
|
||||
fi
|
||||
#
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=$this_script
|
||||
|
||||
done # for file in bootscripts/* ...
|
||||
|
||||
}
|
||||
|
||||
|
||||
#-----------------------------#
|
||||
bootable_Makefiles() { #
|
||||
#-----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}make bootable ( LUSER ) ${R_arrow}"
|
||||
|
||||
for file in bootable/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
# A little housekeeping on the scripts
|
||||
case $this_script in
|
||||
*grub | *aboot | *colo | *silo | *arcload | *lilo | *reboot* ) continue ;;
|
||||
*fstab) [[ ! -z ${FSTAB} ]] && cp ${FSTAB} $BUILDDIR/sources/fstab ;;
|
||||
*kernel) # if there is no kernel config file do not build the kernel
|
||||
[[ -z $CONFIG ]] && continue
|
||||
# Copy the config file to /sources with a standardized name
|
||||
cp $CONFIG $BUILDDIR/sources/kernel-config
|
||||
;;
|
||||
esac
|
||||
#
|
||||
# First append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
# NOTE: new makfile format forces the last script, *chowning, into a separate
|
||||
# phase.
|
||||
case ${this_script} in
|
||||
*chowning) chowning=${this_script} ;;
|
||||
*) bootable="$bootable $this_script" ;;
|
||||
esac
|
||||
#
|
||||
# Grab the name of the target, strip id number and misc words.
|
||||
name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' -e 's@-build@@' `
|
||||
case $this_script in
|
||||
*kernel*) name=linux
|
||||
;;
|
||||
esac
|
||||
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
#
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_wrt_unpack "$pkg_tarball"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_TouchTimestamp
|
||||
fi
|
||||
fi
|
||||
#
|
||||
# Select a script execution method
|
||||
case $this_script in
|
||||
*fstab*) if [[ -n "$FSTAB" ]]; then
|
||||
LUSER_wrt_CopyFstab
|
||||
else
|
||||
LUSER_wrt_RunAsUser "${file}"
|
||||
fi
|
||||
;;
|
||||
*chowning) wrt_RunAsRoot "${file}"
|
||||
;;
|
||||
*) LUSER_wrt_RunAsUser "${file}"
|
||||
;;
|
||||
esac
|
||||
#
|
||||
# Housekeeping...remove any build directory(ies) except if the package build fails.
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_RemoveBuildDirs "${name}"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
LUSER_wrt_LogNewFiles "$name"
|
||||
fi
|
||||
fi
|
||||
#
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=$this_script
|
||||
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
|
||||
#-----------------------------#
|
||||
build_Makefile() { # Construct a Makefile from the book scripts
|
||||
#-----------------------------#
|
||||
echo "Creating Makefile... ${BOLD}START${OFF}"
|
||||
|
||||
cd $JHALFSDIR/${PROGNAME}-commands
|
||||
# Start with a clean Makefile.tmp file
|
||||
>$MKFILE.tmp
|
||||
|
||||
host_prep_Makefiles
|
||||
[[ "${PLATFORM% -*}" = "WRT" ]] && systemprep_Makefiles # $cross_tools
|
||||
cross_tools_Makefiles # $cross_tools
|
||||
final_system_Makefiles # $basicsystem
|
||||
bootscripts_Makefiles # $bootscripttools
|
||||
bootable_Makefiles # $bootable
|
||||
# Add the CUSTOM_TOOLS targets, if needed
|
||||
[[ "$CUSTOM_TOOLS" = "y" ]] && wrt_CustomTools_target
|
||||
|
||||
# Add a header, some variables and include the function file
|
||||
# to the top of the real Makefile.
|
||||
wrt_Makefile_header
|
||||
|
||||
# Drop in the main target 'all:' and the chapter targets with each sub-target
|
||||
# as a dependency.
|
||||
(
|
||||
cat << EOF
|
||||
|
||||
all: ck_UID mk_SETUP mk_LUSER create-sbu_du-report mk_CUSTOM_TOOLS mk_ROOT
|
||||
@sudo make restore-luser-env
|
||||
@sudo make do-housekeeping
|
||||
@\$(call echo_finished,$VERSION)
|
||||
|
||||
ck_UID:
|
||||
@if [ \`id -u\` = "0" ]; then \\
|
||||
echo "--------------------------------------------------"; \\
|
||||
echo "You cannot run this makefile from the root account"; \\
|
||||
echo "--------------------------------------------------"; \\
|
||||
exit 1; \\
|
||||
fi
|
||||
|
||||
mk_SETUP:
|
||||
@\$(call echo_SU_request)
|
||||
@sudo make BREAKPOINT=\$(BREAKPOINT) SETUP
|
||||
@touch \$@
|
||||
|
||||
mk_LUSER: mk_SETUP
|
||||
@\$(call echo_SULUSER_request)
|
||||
@(sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) LUSER" )
|
||||
@touch \$@
|
||||
|
||||
mk_CUSTOM_TOOLS: create-sbu_du-report
|
||||
@if [ "\$(ADD_CUSTOM_TOOLS)" = "y" ]; then \\
|
||||
\$(call sh_echo_PHASE,Building CUSTOM_TOOLS); \\
|
||||
(sudo \$(SU_LUSER) "mkdir -p $BUILDDIR$TRACKING_DIR"); \\
|
||||
(sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CUSTOM_TOOLS"); \\
|
||||
fi;
|
||||
@touch \$@
|
||||
|
||||
mk_ROOT:
|
||||
@\$(call echo_SU_request)
|
||||
@echo "$VERSION-embedded - jhalfs build" > clfs-release && \\
|
||||
sudo mv clfs-release \$(MOUNT_PT)/etc
|
||||
@sudo make BREAKPOINT=\$(BREAKPOINT) ROOT
|
||||
@touch \$@
|
||||
|
||||
|
||||
SETUP: $host_prep
|
||||
LUSER: $cross_tools $basicsystem $bootscripttools $bootable
|
||||
CUSTOM_TOOLS: $custom_list
|
||||
ROOT: $chowning
|
||||
|
||||
|
||||
create-sbu_du-report: mk_LUSER
|
||||
@\$(call echo_message, Building)
|
||||
@if [ "\$(ADD_REPORT)" = "y" ]; then \\
|
||||
./create-sbu_du-report.sh logs $VERSION; \\
|
||||
\$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report); \\
|
||||
fi;
|
||||
@touch \$@
|
||||
|
||||
restore-luser-env:
|
||||
@\$(call echo_message, Building)
|
||||
@if [ -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
|
||||
mv -f \$(LUSER_HOME)/.bashrc.XXX \$(LUSER_HOME)/.bashrc; \\
|
||||
fi;
|
||||
@if [ -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bash_profile.XXX \$(LUSER_HOME)/.bash_profile; \\
|
||||
fi;
|
||||
@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bash* && \\
|
||||
touch \$@ && \\
|
||||
echo " "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
|
||||
echo --------------------------------------------------------------------------------\$(WHITE)
|
||||
|
||||
do-housekeeping:
|
||||
@-if [ ! -f luser-exist ]; then \\
|
||||
userdel \$(LUSER); \\
|
||||
rm -rf \$(LUSER_HOME); \\
|
||||
fi;
|
||||
|
||||
EOF
|
||||
) >> $MKFILE
|
||||
|
||||
# Bring over the items from the Makefile.tmp
|
||||
cat $MKFILE.tmp >> $MKFILE
|
||||
rm $MKFILE.tmp
|
||||
echo "Creating Makefile... ${BOLD}DONE${OFF}"
|
||||
|
||||
}
|
||||
|
1108
2.3/Config.in
Normal file
1108
2.3/Config.in
Normal file
File diff suppressed because it is too large
Load diff
326
2.3/HLFS/hlfs.xsl
Normal file
326
2.3/HLFS/hlfs.xsl
Normal file
|
@ -0,0 +1,326 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE xsl:stylesheet [
|
||||
<!ENTITY % general-entities SYSTEM "FAKEDIR/general.ent">
|
||||
%general-entities;
|
||||
]>
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:exsl="http://exslt.org/common"
|
||||
extension-element-prefixes="exsl"
|
||||
version="1.0">
|
||||
|
||||
<!-- XSLT stylesheet to create shell scripts from HLFS books. -->
|
||||
|
||||
<!-- What libc implentation must be used? -->
|
||||
<xsl:param name="model" select="glibc"/>
|
||||
|
||||
<!-- What kernel serie must be used? -->
|
||||
<xsl:param name="kernel" select="2.6"/>
|
||||
|
||||
<!-- Is the host kernel using grsecurity? -->
|
||||
<xsl:param name="grsecurity_host" select="n"/>
|
||||
|
||||
<!-- Run test suites?
|
||||
0 = none
|
||||
1 = only chapter06 Glibc, GCC and Binutils testsuites
|
||||
2 = all chapter06 testsuites
|
||||
3 = alias to 2
|
||||
-->
|
||||
<xsl:param name="testsuite" select="1"/>
|
||||
|
||||
<!-- Bomb on test suites failures?
|
||||
n = no, I want to build the full system and review the logs
|
||||
y = yes, bomb at the first test suite failure to can review the build dir
|
||||
-->
|
||||
<xsl:param name="bomb-testsuite" select="n"/>
|
||||
|
||||
<!-- Additional features -->
|
||||
<xsl:param name="features">,ssp,aslr,pax,hardened_tmp,warnings,misc,blowfish,</xsl:param>
|
||||
|
||||
<!-- Time zone -->
|
||||
<xsl:param name="timezone" select="GMT"/>
|
||||
|
||||
<!-- Page size -->
|
||||
<xsl:param name="page" select="letter"/>
|
||||
|
||||
<!-- Locale settings -->
|
||||
<xsl:param name="lang" select="C"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:apply-templates select="//sect1"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="sect1">
|
||||
<xsl:if test="(../@id='chapter-temporary-tools' or
|
||||
../@id='chapter-building-system' or
|
||||
../@id='chapter-bootable') and
|
||||
(count(descendant::screen/userinput) > 0 and
|
||||
count(descendant::screen/userinput) >
|
||||
count(descendant::screen[@role='nodump'])) and
|
||||
((@condition=$model or not(@condition)) and
|
||||
(@vendor=$kernel or not(@vendor)))">
|
||||
<!-- The dirs names -->
|
||||
<xsl:variable name="pi-dir" select="../processing-instruction('dbhtml')"/>
|
||||
<xsl:variable name="pi-dir-value" select="substring-after($pi-dir,'dir=')"/>
|
||||
<xsl:variable name="quote-dir" select="substring($pi-dir-value,1,1)"/>
|
||||
<xsl:variable name="dirname" select="substring-before(substring($pi-dir-value,2),$quote-dir)"/>
|
||||
<!-- The file names -->
|
||||
<xsl:variable name="pi-file" select="processing-instruction('dbhtml')"/>
|
||||
<xsl:variable name="pi-file-value" select="substring-after($pi-file,'filename=')"/>
|
||||
<xsl:variable name="filename" select="substring-before(substring($pi-file-value,2),'.html')"/>
|
||||
<!-- The build order -->
|
||||
<xsl:variable name="position" select="position()"/>
|
||||
<xsl:variable name="order">
|
||||
<xsl:choose>
|
||||
<xsl:when test="string-length($position) = 1">
|
||||
<xsl:text>00</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="string-length($position) = 2">
|
||||
<xsl:text>0</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<!-- Creating dirs and files -->
|
||||
<exsl:document href="{$dirname}/{$order}-{$filename}" method="text">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@id='ch-system-creatingdirs' or
|
||||
@id='ch-system-createfiles' or
|
||||
@id='ch-system-changingowner' or
|
||||
@id='ch-system-strippingagain'">
|
||||
<xsl:text>#!/tools/bin/bash
set +h
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>#!/bin/bash
set +h
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:if test="not(@id='ch-tools-stripping') and
|
||||
not(@id='ch-system-strippingagain')">
|
||||
<xsl:text>set -e
</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
<xsl:if test="(sect2[@role='installation'])">
|
||||
<xsl:text>cd $PKGDIR
</xsl:text>
|
||||
<xsl:if test="@id='ch-system-uclibc'">
|
||||
<xsl:text>pushd ../; tar -xvf gettext-&gettext-version;.*; popd; 
</xsl:text>
|
||||
</xsl:if>
|
||||
<!-- SVN toolchain format, from inside ./sources dir unpack binutils and gcc -->
|
||||
<xsl:if test="@id='ch-tools-embryo-toolchain' or
|
||||
@id='ch-tools-cocoon-toolchain' or
|
||||
@id='ch-system-butterfly-toolchain'">
|
||||
<xsl:text>tar -xvf gcc-core-&gcc-version;.*; 
</xsl:text>
|
||||
<xsl:text>tar -xvf binutils-&binutils-version;.*; 
</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="@id='ch-tools-cocoon-toolchain' or
|
||||
@id='ch-system-butterfly-toolchain'">
|
||||
<xsl:text>tar -xvf gcc-g++-&gcc-version;.*; 
</xsl:text>
|
||||
</xsl:if>
|
||||
<!-- ONLY butterfly has a testsuite -->
|
||||
<xsl:if test="@id='ch-system-butterfly-toolchain' and $testsuite != '0'">
|
||||
<xsl:text>tar -xvf gcc-testsuite-&gcc-version;.*; 
</xsl:text>
|
||||
</xsl:if>
|
||||
<!-- END SVN toolchain format -->
|
||||
</xsl:if>
|
||||
<xsl:apply-templates select=".//para/userinput | .//screen"/>
|
||||
<xsl:text>exit</xsl:text>
|
||||
</exsl:document>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="screen">
|
||||
<xsl:if test="(@condition=$model or not(@condition)) and
|
||||
(@vendor=$kernel or not(@vendor)) and
|
||||
child::* = userinput and (not(@role) or
|
||||
(@role and contains($features,concat(',',@role,','))))">
|
||||
<xsl:apply-templates select="userinput" mode="screen"/>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="para/userinput">
|
||||
<xsl:if test="(contains(string(),'test') or
|
||||
contains(string(),'check')) and
|
||||
($testsuite = '2' or $testsuite = '3')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$bomb-testsuite = 'n'">
|
||||
<xsl:value-of select="substring-before(string(),'make')"/>
|
||||
<xsl:text>make -k</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'make')"/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1</xsl:text>
|
||||
<xsl:if test="contains(string(),' -k ')">
|
||||
<xsl:text> || true</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="userinput" mode="screen">
|
||||
<xsl:choose>
|
||||
<!-- grsecurity kernel in the host? -->
|
||||
<xsl:when test="ancestor::sect1[@id='ch-system-kernfs'] and
|
||||
contains(string(),'sysctl')
|
||||
and $grsecurity_host ='n'"/>
|
||||
<!-- Setting $LANG for /etc/profile -->
|
||||
<xsl:when test="ancestor::sect1[@id='bootable-profile'] and
|
||||
contains(string(),'export LANG=')">
|
||||
<xsl:value-of select="substring-before(string(),'export LANG=')"/>
|
||||
<xsl:text>export LANG=</xsl:text>
|
||||
<xsl:value-of select="$lang"/>
|
||||
<xsl:value-of select="substring-after(string(),'CC]')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Copying the kernel config file -->
|
||||
<xsl:when test="string() = 'make mrproper'">
|
||||
<xsl:text>make mrproper
</xsl:text>
|
||||
<xsl:text>cp -v /sources/kernel-config .config
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- No interactive commands are needed if the .config file is the proper one -->
|
||||
<xsl:when test="string() = 'make menuconfig'"/>
|
||||
<!-- For uClibc we need to set CONFIG_SITE -->
|
||||
<xsl:when test="contains(string(),'CONFIG_SITE')">
|
||||
<xsl:value-of select="substring-before(string(),'export')"/>
|
||||
<xsl:text>echo "export</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'export')"/>
|
||||
<xsl:text>" >> ~/.bashrc
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- For uClibc we need to cd to the Gettext package -->
|
||||
<xsl:when test="contains(string(),'cd gettext-runtime/')">
|
||||
<xsl:text>cd ../gettext-*/gettext-runtime</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'gettext-runtime')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- The Coreutils and Module-Init-Tools test suites are optional -->
|
||||
<xsl:when test="(ancestor::sect1[@id='ch-system-coreutils'] or
|
||||
ancestor::sect1[@id='ch-system-module-init-tools']) and
|
||||
(contains(string(),'check') or
|
||||
contains(string(),'distclean') or
|
||||
contains(string(),'dummy'))">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$testsuite = '0' or $testsuite = '1'"/>
|
||||
<xsl:otherwise>
|
||||
<xsl:if test="not(contains(string(),'check'))">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="contains(string(),'check')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$bomb-testsuite = 'n'">
|
||||
<xsl:value-of select="substring-before(string(),'check')"/>
|
||||
<xsl:text>-k check</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'check')"/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1</xsl:text>
|
||||
<xsl:if test="contains(string(),' -k ')">
|
||||
<xsl:text> || true</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:if>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<!-- Fixing butterfly toolchain test suite run -->
|
||||
<xsl:when test="ancestor::sect1[@id='ch-system-butterfly-toolchain']
|
||||
and string() = 'make -k check'">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$testsuite != '0'">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$bomb-testsuite = 'n'">
|
||||
<xsl:text>make -k check >> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1</xsl:text>
|
||||
<xsl:if test="contains(string(),' -k ')">
|
||||
<xsl:text> || true</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<!-- Fixing Glbc test suite -->
|
||||
<xsl:when test="contains(string(),'rm -v configparms') and
|
||||
contains(string(),'-fno-stack-protector')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$testsuite != '0'">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains(string(),'glibc-check-log')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$testsuite != '0'">
|
||||
<xsl:value-of select="substring-before(string(),'2>&1')"/>
|
||||
<xsl:text>>> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<!-- Fixing Cocoon sanity checks -->
|
||||
<xsl:when test="contains(string(),'./strcat-overflow')">
|
||||
<xsl:text>set +e
</xsl:text>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
set -e
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Fixing Butterfly sanity checks -->
|
||||
<xsl:when test="contains(string(),'./fortify-test')
|
||||
or contains(string(),'./ssp-test')">
|
||||
<xsl:text>! </xsl:text>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Don't stop on strip run -->
|
||||
<xsl:when test="contains(string(),'strip ')">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- The rest of commands -->
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="literal">
|
||||
<xsl:if test="(@condition=$model or not(@condition)) and
|
||||
(@vendor=$kernel or not(@vendor))">
|
||||
<xsl:apply-templates/>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="replaceable">
|
||||
<xsl:choose>
|
||||
<xsl:when test="ancestor::sect1[@id='ch-system-glibc'] or
|
||||
ancestor::sect1[@id='ch-system-uclibc']">
|
||||
<xsl:value-of select="$timezone"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="ancestor::sect1[@id='ch-system-groff']">
|
||||
<xsl:value-of select="$page"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>**EDITME</xsl:text>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>EDITME**</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
659
2.3/HLFS/master.sh
Normal file
659
2.3/HLFS/master.sh
Normal file
|
@ -0,0 +1,659 @@
|
|||
#!/bin/bash
|
||||
set -e # Enable error trapping
|
||||
|
||||
# $Id$
|
||||
|
||||
###################################
|
||||
### FUNCTIONS ###
|
||||
###################################
|
||||
|
||||
|
||||
#----------------------------#
|
||||
process_toolchain() { # embryo,cocoon and butterfly need special handling
|
||||
#----------------------------#
|
||||
local toolchain=$1
|
||||
local this_file=$2
|
||||
local tc_phase
|
||||
local binutil_tarball
|
||||
local gcc_core_tarball
|
||||
local TC_MountPT
|
||||
local remove_existing
|
||||
|
||||
tc_phase=`echo $toolchain | sed -e 's@[0-9]\{3\}-@@' -e 's@-toolchain@@' -e 's,'$N',,'`
|
||||
case $tc_phase in
|
||||
embryo | \
|
||||
cocoon) # Vars for LUSER phase
|
||||
remove_existing="remove_existing_dirs"
|
||||
TC_MountPT="\$(MOUNT_PT)\$(SRC)"
|
||||
;;
|
||||
butterfly) # Vars for CHROOT phase
|
||||
remove_existing="remove_existing_dirs2"
|
||||
TC_MountPT="\$(SRC)"
|
||||
;;
|
||||
esac
|
||||
|
||||
#
|
||||
# Safe method to remove existing toolchain dirs
|
||||
binutil_tarball=$(get_package_tarball_name "binutils")
|
||||
gcc_core_tarball=$(get_package_tarball_name "gcc-core")
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call ${remove_existing},$binutil_tarball)
|
||||
@\$(call ${remove_existing},$gcc_core_tarball)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
|
||||
#
|
||||
# Manually remove the toolchain directories..
|
||||
(
|
||||
cat << EOF
|
||||
@rm -rf ${TC_MountPT}/${tc_phase}-toolchain && \\
|
||||
rm -rf ${TC_MountPT}/${tc_phase}-build
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
|
||||
|
||||
(
|
||||
cat << EOF
|
||||
@echo "export PKGDIR=${TC_MountPT}" > envars
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
|
||||
case ${tc_phase} in
|
||||
butterfly)
|
||||
[[ "$TEST" != "0" ]] && CHROOT_wrt_test_log "${toolchain}"
|
||||
CHROOT_wrt_RunAsRoot "$this_file"
|
||||
;;
|
||||
*) LUSER_wrt_RunAsUser "$this_file"
|
||||
;;
|
||||
esac
|
||||
#
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call ${remove_existing},$binutil_tarball)
|
||||
@\$(call ${remove_existing},$gcc_core_tarball)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
|
||||
#
|
||||
# Manually remove the toolchain directories..
|
||||
(
|
||||
cat << EOF
|
||||
@rm -rf ${TC_MountPT}/${tc_phase}-toolchain && \\
|
||||
rm -rf ${TC_MountPT}/${tc_phase}-build
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
|
||||
}
|
||||
|
||||
|
||||
#----------------------------#
|
||||
chapter3_Makefiles() { # Initialization of the system
|
||||
#----------------------------#
|
||||
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter3 ( SETUP ) ${R_arrow}"
|
||||
|
||||
# If $LUSER_HOME is already present in the host, we asume that the
|
||||
# hlfs user and group are also presents in the host, and a backup
|
||||
# of their bash init files is made.
|
||||
(
|
||||
cat << EOF
|
||||
020-creatingtoolsdir:
|
||||
@\$(call echo_message, Building)
|
||||
@mkdir \$(MOUNT_PT)/tools && \\
|
||||
rm -f /tools && \\
|
||||
ln -s \$(MOUNT_PT)/tools /
|
||||
@\$(call housekeeping)
|
||||
|
||||
021-addinguser: 020-creatingtoolsdir
|
||||
@\$(call echo_message, Building)
|
||||
@if [ ! -d \$(LUSER_HOME) ]; then \\
|
||||
groupadd \$(LGROUP); \\
|
||||
useradd -s /bin/bash -g \$(LGROUP) -m -k /dev/null \$(LUSER); \\
|
||||
else \\
|
||||
touch luser-exist; \\
|
||||
fi;
|
||||
@chown \$(LUSER) \$(MOUNT_PT)/tools && \\
|
||||
chmod -R a+wt \$(MOUNT_PT)/\$(SCRIPT_ROOT) && \\
|
||||
chmod a+wt \$(SRCSDIR)
|
||||
@\$(call housekeeping)
|
||||
|
||||
022-settingenvironment: 021-addinguser
|
||||
@\$(call echo_message, Building)
|
||||
@if [ -f \$(LUSER_HOME)/.bashrc -a ! -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bashrc \$(LUSER_HOME)/.bashrc.XXX; \\
|
||||
fi;
|
||||
@if [ -f \$(LUSER_HOME)/.bash_profile -a ! -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bash_profile \$(LUSER_HOME)/.bash_profile.XXX; \\
|
||||
fi;
|
||||
@echo "set +h" > \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "umask 022" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "HLFS=\$(MOUNT_PT)" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "LC_ALL=POSIX" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "PATH=/tools/bin:/bin:/usr/bin" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "export HLFS LC_ALL PATH" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "source $JHALFSDIR/envars" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bashrc && \\
|
||||
chmod -R a+wt \$(MOUNT_PT) && \\
|
||||
touch envars && \\
|
||||
chown \$(LUSER) envars
|
||||
@\$(call housekeeping)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
chapter3=" 020-creatingtoolsdir 021-addinguser 022-settingenvironment"
|
||||
}
|
||||
|
||||
#----------------------------#
|
||||
chapter5_Makefiles() { # Bootstrap or temptools phase
|
||||
#----------------------------#
|
||||
local file
|
||||
local this_script
|
||||
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter5 ( LUSER ) ${R_arrow}"
|
||||
|
||||
for file in chapter05/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
# Skip this script depending on jhalfs.conf flags set.
|
||||
case $this_script in
|
||||
# If no testsuites will be run, then TCL, Expect and DejaGNU aren't needed
|
||||
*tcl* ) [[ "$TEST" = "0" ]] && continue; ;;
|
||||
*expect* ) [[ "$TEST" = "0" ]] && continue; ;;
|
||||
*dejagnu* ) [[ "$TEST" = "0" ]] && continue; ;;
|
||||
# Test if the stripping phase must be skipped
|
||||
*stripping* ) [[ "$STRIP" = "n" ]] && continue ;;
|
||||
*) ;;
|
||||
esac
|
||||
|
||||
# First append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
chapter5="$chapter5 $this_script"
|
||||
|
||||
# Grab the name of the target
|
||||
name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' -e 's@-pass[0-9]\{1\}@@'`
|
||||
|
||||
# Adjust 'name'
|
||||
case $name in
|
||||
uclibc) name="uClibc" ;;
|
||||
esac
|
||||
|
||||
# Set the dependency for the first target.
|
||||
if [ -z $PREV ] ; then PREV=022-settingenvironment ; fi
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
|
||||
# This is a very special script and requires manual processing
|
||||
# NO Optimization allowed
|
||||
if [[ ${name} = "embryo-toolchain" ]] || \
|
||||
[[ ${name} = "cocoon-toolchain" ]]; then
|
||||
LUSER_wrt_target "$this_script" "$PREV"
|
||||
process_toolchain "${this_script}" "${file}"
|
||||
wrt_touch
|
||||
PREV=$this_script
|
||||
continue
|
||||
fi
|
||||
#
|
||||
LUSER_wrt_target "$this_script" "$PREV"
|
||||
# Find the version of the command files, if it corresponds with the building of
|
||||
# a specific package. Fix GCC tarball name for 2.4-branch.
|
||||
case $name in
|
||||
gcc ) pkg_tarball=$(get_package_tarball_name gcc-core) ;;
|
||||
* ) pkg_tarball=$(get_package_tarball_name $name) ;;
|
||||
esac
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
# Insert instructions for unpacking the package and to set the PKGDIR variable.
|
||||
LUSER_wrt_unpack "$pkg_tarball"
|
||||
# If using optimizations, write the instructions
|
||||
[[ "$OPTIMIZE" = "2" ]] && wrt_optimize "$name" && wrt_makeflags "$name"
|
||||
fi
|
||||
# Insert date and disk usage at the top of the log file, the script run
|
||||
# and date and disk usage again at the bottom of the log file.
|
||||
LUSER_wrt_RunAsUser "${file}"
|
||||
|
||||
# Remove the build directory(ies) except if the package build fails
|
||||
# (so we can review config.cache, config.log, etc.)
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_RemoveBuildDirs "$name"
|
||||
fi
|
||||
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=$this_script
|
||||
done # end for file in chapter05/*
|
||||
}
|
||||
|
||||
|
||||
#----------------------------#
|
||||
chapter6_Makefiles() { # sysroot or chroot build phase
|
||||
#----------------------------#
|
||||
local file
|
||||
local this_script
|
||||
# Set envars and scripts for iteration targets
|
||||
if [[ -z "$1" ]] ; then
|
||||
local N=""
|
||||
else
|
||||
local N=-build_$1
|
||||
local chapter6=""
|
||||
mkdir chapter06$N
|
||||
cp chapter06/* chapter06$N
|
||||
for script in chapter06$N/* ; do
|
||||
# Overwrite existing symlinks, files, and dirs
|
||||
sed -e 's/ln -s /ln -sf /g' \
|
||||
-e 's/^mv /&-f /g' \
|
||||
-e 's/mkdir -v/&p/g' -i ${script}
|
||||
# Rename the scripts
|
||||
mv ${script} ${script}$N
|
||||
done
|
||||
# Remove Bzip2 binaries before make install
|
||||
sed -e 's@make install@rm -vf /usr/bin/bz*\n&@' -i chapter06$N/*-bzip2$N
|
||||
# Fix how Module-Init-Tools do the install target
|
||||
sed -e 's@make install@make INSTALL=install install@' -i chapter06$N/*-module-init-tools$N
|
||||
# Don't readd already existing groups
|
||||
sed -e '/groupadd/d' -i chapter06$N/*-udev$N
|
||||
fi
|
||||
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter6$N ( CHROOT ) ${R_arrow}"
|
||||
|
||||
for file in chapter06$N/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
# Skip this script depending on jhalfs.conf flags set.
|
||||
case $this_script in
|
||||
# We'll run the chroot commands differently than the others, so skip them in the
|
||||
# dependencies and target creation.
|
||||
*chroot* ) continue ;;
|
||||
# Test if the stripping phase must be skipped
|
||||
*-stripping* ) [[ "$STRIP" = "n" ]] && continue ;;
|
||||
# Skip linux-headers in iterative builds
|
||||
*linux-headers*) [[ -n "$N" ]] && continue ;;
|
||||
esac
|
||||
|
||||
# Grab the name of the target
|
||||
name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' -e 's,'$N',,'`
|
||||
|
||||
case $name in
|
||||
uclibc) name="uClibc" ;;
|
||||
esac
|
||||
|
||||
# Find the version of the command files, if it corresponds with the building of
|
||||
# a specific package. Fix GCC tarball name for 2.4-branch.
|
||||
case $name in
|
||||
gcc ) pkg_tarball=$(get_package_tarball_name gcc-core) ;;
|
||||
* ) pkg_tarball=$(get_package_tarball_name $name) ;;
|
||||
esac
|
||||
|
||||
if [[ "$pkg_tarball" = "" ]] && [[ -n "$N" ]] ; then
|
||||
case "${this_script}" in
|
||||
*stripping*) ;;
|
||||
*) continue ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
case "${this_script}" in
|
||||
*kernfs* ) runasroot=" ${this_script}" ;;
|
||||
* ) chapter6="$chapter6 ${this_script}" ;;
|
||||
esac
|
||||
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
if [[ ${name} = "butterfly-toolchain" ]]; then
|
||||
CHROOT_wrt_target "${this_script}" "$PREV"
|
||||
# Touch timestamp file if installed files logs will be created.
|
||||
# But only for the firt build when running iterative builds.
|
||||
if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
|
||||
CHROOT_wrt_TouchTimestamp
|
||||
fi
|
||||
process_toolchain "${this_script}" "${file}"
|
||||
if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
|
||||
CHROOT_wrt_LogNewFiles "$name"
|
||||
fi
|
||||
wrt_touch
|
||||
PREV=$this_script
|
||||
continue
|
||||
fi
|
||||
# kernfs is run in SUDO target
|
||||
case "${this_script}" in
|
||||
*kernfs* ) LUSER_wrt_target "${this_script}" "$PREV" ;;
|
||||
* ) CHROOT_wrt_target "${this_script}" "$PREV" ;;
|
||||
esac
|
||||
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
# Insert instructions for unpacking the package and changing directories
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
# Touch timestamp file if installed files logs will be created.
|
||||
# But only for the firt build when running iterative builds.
|
||||
if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
|
||||
CHROOT_wrt_TouchTimestamp
|
||||
fi
|
||||
CHROOT_Unpack "$pkg_tarball"
|
||||
# If the testsuites must be run, initialize the log file
|
||||
# butterfly-toolchain tests are enabled in 'process_tookchain' function
|
||||
# 2.4-branch toolchain is ernabled here.
|
||||
case $name in
|
||||
glibc | gcc | binutils)
|
||||
[[ "$TEST" != "0" ]] && CHROOT_wrt_test_log "${this_script}" ;;
|
||||
* ) [[ "$TEST" > "1" ]] && CHROOT_wrt_test_log "${this_script}" ;;
|
||||
esac
|
||||
# If using optimizations, write the instructions
|
||||
[[ "$OPTIMIZE" != "0" ]] && wrt_optimize "$name" && wrt_makeflags "$name"
|
||||
fi
|
||||
|
||||
# In kernfs we need to set HLFS and not to use chroot.
|
||||
case "${this_script}" in
|
||||
*kernfs* ) wrt_RunAsRoot "${file}" ;;
|
||||
* ) CHROOT_wrt_RunAsRoot "${file}" ;;
|
||||
esac
|
||||
#
|
||||
# Write installed files log and remove the build directory(ies)
|
||||
# except if the package build fails.
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
CHROOT_wrt_RemoveBuildDirs "$name"
|
||||
if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
|
||||
CHROOT_wrt_LogNewFiles "$name"
|
||||
fi
|
||||
fi
|
||||
#
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=${this_script}
|
||||
# Set system_build envar for iteration targets
|
||||
system_build=$chapter6
|
||||
done # end for file in chapter06/*
|
||||
|
||||
}
|
||||
|
||||
#----------------------------#
|
||||
chapter7_Makefiles() { # Create a bootable system.. kernel, bootscripts..etc
|
||||
#----------------------------#
|
||||
local file
|
||||
local this_script
|
||||
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter7 ( BOOT ) ${R_arrow}"
|
||||
for file in chapter07/*; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
case $this_script in
|
||||
*grub) continue ;; # Grub must be configured manually.
|
||||
*console) continue ;; # Use the file generated by lfs-bootscripts
|
||||
*fstab) [[ ! -z ${FSTAB} ]] && cp ${FSTAB} $BUILDDIR/sources/fstab
|
||||
;;
|
||||
*kernel) # If no .config file is supplied, the kernel build is skipped
|
||||
[[ -z $CONFIG ]] && continue
|
||||
cp $CONFIG $BUILDDIR/sources/kernel-config
|
||||
;;
|
||||
esac
|
||||
|
||||
# First append then name of the script file to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
chapter7="$chapter7 $this_script"
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
CHROOT_wrt_target "$this_script" "$PREV"
|
||||
|
||||
case "${this_script}" in
|
||||
*bootscripts*)
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
CHROOT_wrt_TouchTimestamp
|
||||
fi
|
||||
CHROOT_Unpack $(get_package_tarball_name "lfs-bootscripts")
|
||||
blfs_bootscripts=$(get_package_tarball_name "blfs-bootscripts" | sed -e 's/.tar.*//' )
|
||||
echo -e "\t@echo \"\$(MOUNT_PT)\$(SRC)/$blfs_bootscripts\" >> sources-dir" >> $MKFILE.tmp
|
||||
;;
|
||||
*kernel)
|
||||
name="linux"
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
CHROOT_wrt_TouchTimestamp
|
||||
fi
|
||||
CHROOT_Unpack "$pkg_tarball"
|
||||
;;
|
||||
esac
|
||||
|
||||
case "${this_script}" in
|
||||
*fstab*) # Check if we have a real /etc/fstab file
|
||||
if [[ -n "$FSTAB" ]] ; then
|
||||
CHROOT_wrt_CopyFstab
|
||||
else
|
||||
CHROOT_wrt_RunAsRoot "$file"
|
||||
fi
|
||||
;;
|
||||
*) # All other scripts
|
||||
CHROOT_wrt_RunAsRoot "${file}"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Remove the build directory except if the package build fails.
|
||||
case "${this_script}" in
|
||||
*bootscripts*)
|
||||
(
|
||||
cat << EOF
|
||||
@ROOT=\`head -n1 \$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
|
||||
rm -r \$(SRC)/\$\$ROOT
|
||||
@rm -rf \`cat sources-dir\` && \\
|
||||
rm sources-dir
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
CHROOT_wrt_LogNewFiles "$name"
|
||||
fi
|
||||
;;
|
||||
*kernel) CHROOT_wrt_RemoveBuildDirs "dummy"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
CHROOT_wrt_LogNewFiles "$name"
|
||||
fi ;;
|
||||
esac
|
||||
|
||||
# Include a touch of the target name so make can check if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=$this_script
|
||||
done # for file in chapter07/*
|
||||
}
|
||||
|
||||
|
||||
#----------------------------#
|
||||
build_Makefile() { # Construct a Makefile from the book scripts
|
||||
#----------------------------#
|
||||
echo "Creating Makefile... ${BOLD}START${OFF}"
|
||||
|
||||
cd $JHALFSDIR/${PROGNAME}-commands
|
||||
# Start with a clean Makefile.tmp file
|
||||
>$MKFILE.tmp
|
||||
|
||||
chapter3_Makefiles
|
||||
chapter5_Makefiles
|
||||
chapter6_Makefiles
|
||||
# Add the iterations targets, if needed
|
||||
[[ "$COMPARE" = "y" ]] && wrt_compare_targets
|
||||
chapter7_Makefiles
|
||||
# Add the CUSTOM_TOOLS targets, if needed
|
||||
[[ "$CUSTOM_TOOLS" = "y" ]] && wrt_CustomTools_target
|
||||
# Add the BLFS_TOOL targets, if needed
|
||||
[[ "$BLFS_TOOL" = "y" ]] && wrt_blfs_tool_targets
|
||||
|
||||
# Add a header, some variables and include the function file
|
||||
# to the top of the real Makefile.
|
||||
wrt_Makefile_header
|
||||
|
||||
# Add chroot commands
|
||||
CHROOT_LOC="`whereis -b chroot | cut -d " " -f2`"
|
||||
i=1
|
||||
for file in chapter06/*chroot* ; do
|
||||
chroot=`cat $file | \
|
||||
sed -e "s@chroot@$CHROOT_LOC@" \
|
||||
-e '/#!\/bin\/bash/d' \
|
||||
-e '/^export/d' \
|
||||
-e '/^logout/d' \
|
||||
-e 's@ \\\@ @g' | \
|
||||
tr -d '\n' | \
|
||||
sed -e 's/ */ /g' \
|
||||
-e 's|\\$|&&|g' \
|
||||
-e 's|exit||g' \
|
||||
-e 's|$| -c|' \
|
||||
-e 's|"$$HLFS"|$(MOUNT_PT)|'\
|
||||
-e 's|set -e||' \
|
||||
-e 's|set +h||'`
|
||||
echo -e "CHROOT$i= $chroot\n" >> $MKFILE
|
||||
i=`expr $i + 1`
|
||||
done
|
||||
|
||||
# Drop in the main target 'all:' and the chapter targets with each sub-target
|
||||
# as a dependency.
|
||||
(
|
||||
cat << EOF
|
||||
|
||||
all: ck_UID mk_SETUP mk_LUSER mk_SUDO mk_CHROOT mk_BOOT create-sbu_du-report mk_CUSTOM_TOOLS mk_BLFS_TOOL
|
||||
@sudo make do-housekeeping
|
||||
@echo "$VERSION - jhalfs build" > hlfs-release && \\
|
||||
sudo install -m444 hlfs-release \$(MOUNT_PT)/etc/hlfs-release
|
||||
@\$(call echo_finished,$VERSION)
|
||||
|
||||
ck_UID:
|
||||
@if [ \`id -u\` = "0" ]; then \\
|
||||
echo "--------------------------------------------------"; \\
|
||||
echo "You cannot run this makefile from the root account"; \\
|
||||
echo "--------------------------------------------------"; \\
|
||||
exit 1; \\
|
||||
fi
|
||||
|
||||
mk_SETUP:
|
||||
@\$(call echo_SU_request)
|
||||
@sudo make BREAKPOINT=\$(BREAKPOINT) SETUP
|
||||
@touch \$@
|
||||
|
||||
mk_LUSER: mk_SETUP
|
||||
@\$(call echo_SULUSER_request)
|
||||
@(sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) LUSER" )
|
||||
@sudo make restore-luser-env
|
||||
@touch \$@
|
||||
|
||||
mk_SUDO: mk_LUSER
|
||||
@sudo make SUDO
|
||||
@touch \$@
|
||||
|
||||
mk_CHROOT: mk_SUDO
|
||||
@if [ ! -e \$(MOUNT_PT)/dev ]; then \\
|
||||
mkdir \$(MOUNT_PT)/dev && \\
|
||||
sudo mknod -m 666 \$(MOUNT_PT)/dev/null c 1 3 && \\
|
||||
sudo mknod -m 600 \$(MOUNT_PT)/dev/console c 5 1 && \\
|
||||
sudo chown -R 0:0 \$(MOUNT_PT)/dev; \\
|
||||
fi;
|
||||
@\$(call echo_CHROOT_request)
|
||||
@( sudo \$(CHROOT1) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CHROOT")
|
||||
@touch \$@
|
||||
|
||||
mk_BOOT: mk_CHROOT
|
||||
@\$(call echo_CHROOT_request)
|
||||
@( sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) BOOT")
|
||||
@touch \$@
|
||||
|
||||
mk_CUSTOM_TOOLS: create-sbu_du-report
|
||||
@if [ "\$(ADD_CUSTOM_TOOLS)" = "y" ]; then \\
|
||||
\$(call sh_echo_PHASE,Building CUSTOM_TOOLS); \\
|
||||
sudo mkdir -p ${BUILDDIR}${TRACKING_DIR}; \\
|
||||
(sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CUSTOM_TOOLS"); \\
|
||||
fi;
|
||||
@touch \$@
|
||||
|
||||
mk_BLFS_TOOL: mk_CUSTOM_TOOLS
|
||||
@if [ "\$(ADD_BLFS_TOOLS)" = "y" ]; then \\
|
||||
\$(call sh_echo_PHASE,Building BLFS_TOOL); \\
|
||||
sudo mkdir -p $BUILDDIR$TRACKING_DIR; \\
|
||||
(sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) BLFS_TOOL"); \\
|
||||
fi;
|
||||
@touch \$@
|
||||
|
||||
|
||||
SETUP: $chapter3
|
||||
LUSER: $chapter5
|
||||
SUDO: $runasroot
|
||||
CHROOT: SHELL=/tools/bin/bash
|
||||
CHROOT: $chapter6
|
||||
BOOT: $chapter7
|
||||
CUSTOM_TOOLS: $custom_list
|
||||
BLFS_TOOL: $blfs_tool
|
||||
|
||||
|
||||
create-sbu_du-report: mk_BOOT
|
||||
@\$(call echo_message, Building)
|
||||
@if [ "\$(ADD_REPORT)" = "y" ]; then \\
|
||||
./create-sbu_du-report.sh logs $VERSION; \\
|
||||
\$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report); \\
|
||||
fi;
|
||||
@touch \$@
|
||||
|
||||
restore-luser-env:
|
||||
@\$(call echo_message, Building)
|
||||
@if [ -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
|
||||
mv -f \$(LUSER_HOME)/.bashrc.XXX \$(LUSER_HOME)/.bashrc; \\
|
||||
fi;
|
||||
@if [ -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bash_profile.XXX \$(LUSER_HOME)/.bash_profile; \\
|
||||
fi;
|
||||
@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bash* && \\
|
||||
touch \$@ && \\
|
||||
echo " "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
|
||||
echo --------------------------------------------------------------------------------\$(WHITE)
|
||||
|
||||
do-housekeeping:
|
||||
@-umount \$(MOUNT_PT)/dev/pts
|
||||
@-umount \$(MOUNT_PT)/dev/shm
|
||||
@-umount \$(MOUNT_PT)/dev
|
||||
@-umount \$(MOUNT_PT)/sys
|
||||
@-umount \$(MOUNT_PT)/proc
|
||||
@-rm /tools
|
||||
@-if [ ! -f luser-exist ]; then \\
|
||||
userdel \$(LUSER); \\
|
||||
rm -rf \$(LUSER_HOME); \\
|
||||
fi;
|
||||
|
||||
|
||||
|
||||
EOF
|
||||
) >> $MKFILE
|
||||
|
||||
# Bring over the items from the Makefile.tmp
|
||||
cat $MKFILE.tmp >> $MKFILE
|
||||
rm $MKFILE.tmp
|
||||
echo "Creating Makefile... ${BOLD}DONE${OFF}"
|
||||
|
||||
}
|
306
2.3/LFS/lfs.xsl
Normal file
306
2.3/LFS/lfs.xsl
Normal file
|
@ -0,0 +1,306 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE xsl:stylesheet [
|
||||
<!ENTITY % general-entities SYSTEM "FAKEDIR/general.ent">
|
||||
%general-entities;
|
||||
]>
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:exsl="http://exslt.org/common"
|
||||
extension-element-prefixes="exsl"
|
||||
version="1.0">
|
||||
|
||||
<!-- XSLT stylesheet to create shell scripts from LFS books. -->
|
||||
|
||||
<!-- Run test suites?
|
||||
0 = none
|
||||
1 = only chapter06 Glibc, GCC and Binutils testsuites
|
||||
2 = all chapter06 testsuites
|
||||
3 = all chapter05 and chapter06 testsuites
|
||||
-->
|
||||
<xsl:param name="testsuite" select="1"/>
|
||||
|
||||
<!-- Bomb on test suites failures?
|
||||
n = no, I want to build the full system and review the logs
|
||||
y = yes, bomb at the first test suite failure to can review the build dir
|
||||
-->
|
||||
<xsl:param name="bomb-testsuite" select="n"/>
|
||||
|
||||
<!-- Install vim-lang package? -->
|
||||
<xsl:param name="vim-lang" select="y"/>
|
||||
|
||||
<!-- Time zone -->
|
||||
<xsl:param name="timezone" select="GMT"/>
|
||||
|
||||
<!-- Page size -->
|
||||
<xsl:param name="page" select="letter"/>
|
||||
|
||||
<!-- Locale settings -->
|
||||
<xsl:param name="lang" select="C"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:apply-templates select="//sect1"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="sect1">
|
||||
<xsl:if test="(../@id='chapter-temporary-tools' or
|
||||
../@id='chapter-building-system' or
|
||||
../@id='chapter-bootscripts' or
|
||||
../@id='chapter-bootable') and
|
||||
count(descendant::screen/userinput) > 0 and
|
||||
count(descendant::screen/userinput) >
|
||||
count(descendant::screen[@role='nodump'])">
|
||||
<!-- The dirs names -->
|
||||
<xsl:variable name="pi-dir" select="../processing-instruction('dbhtml')"/>
|
||||
<xsl:variable name="pi-dir-value" select="substring-after($pi-dir,'dir=')"/>
|
||||
<xsl:variable name="quote-dir" select="substring($pi-dir-value,1,1)"/>
|
||||
<xsl:variable name="dirname" select="substring-before(substring($pi-dir-value,2),$quote-dir)"/>
|
||||
<!-- The file names -->
|
||||
<xsl:variable name="pi-file" select="processing-instruction('dbhtml')"/>
|
||||
<xsl:variable name="pi-file-value" select="substring-after($pi-file,'filename=')"/>
|
||||
<xsl:variable name="filename" select="substring-before(substring($pi-file-value,2),'.html')"/>
|
||||
<!-- The build order -->
|
||||
<xsl:variable name="position" select="position()"/>
|
||||
<xsl:variable name="order">
|
||||
<xsl:choose>
|
||||
<xsl:when test="string-length($position) = 1">
|
||||
<xsl:text>00</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="string-length($position) = 2">
|
||||
<xsl:text>0</xsl:text>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$position"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<!-- Creating dirs and files -->
|
||||
<exsl:document href="{$dirname}/{$order}-{$filename}" method="text">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@id='ch-system-creatingdirs' or
|
||||
@id='ch-system-createfiles' or
|
||||
@id='ch-system-strippingagain'">
|
||||
<xsl:text>#!/tools/bin/bash
set +h
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>#!/bin/bash
set +h
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:if test="not(@id='ch-tools-stripping') and
|
||||
not(@id='ch-system-strippingagain')">
|
||||
<xsl:text>set -e
</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
<xsl:if test="sect2[@role='installation']">
|
||||
<xsl:text>cd $PKGDIR
</xsl:text>
|
||||
<xsl:if test="@id='ch-system-vim' and $vim-lang = 'y'">
|
||||
<xsl:text>tar -xvf ../vim-&vim-version;-lang.* --strip-components=1
</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:if>
|
||||
<xsl:apply-templates select=".//para/userinput | .//screen"/>
|
||||
<xsl:if test="$testsuite='3' and @id='ch-tools-glibc'">
|
||||
<xsl:copy-of select="//sect1[@id='ch-system-glibc']/sect2[2]/screen[@role='nodump']"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>exit</xsl:text>
|
||||
</exsl:document>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="screen">
|
||||
<xsl:if test="child::* = userinput and not(@role = 'nodump')">
|
||||
<xsl:apply-templates select="userinput" mode="screen"/>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="para/userinput">
|
||||
<xsl:if test="(contains(string(),'test') or
|
||||
contains(string(),'check')) and
|
||||
(($testsuite = '2' and
|
||||
ancestor::chapter[@id='chapter-building-system']) or
|
||||
$testsuite = '3')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$bomb-testsuite = 'n'">
|
||||
<xsl:value-of select="substring-before(string(),'make')"/>
|
||||
<xsl:text>make -k</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'make')"/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1</xsl:text>
|
||||
<xsl:if test="contains(string(),' -k ')">
|
||||
<xsl:text> || true</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="userinput" mode="screen">
|
||||
<xsl:choose>
|
||||
<!-- Estandarized package formats -->
|
||||
<xsl:when test="contains(string(),'tar.gz')">
|
||||
<xsl:value-of select="substring-before(string(),'tar.gz')"/>
|
||||
<xsl:text>tar.*</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'tar.gz')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Avoiding a race condition in a patch -->
|
||||
<xsl:when test="contains(string(),'debian_fixes')">
|
||||
<xsl:value-of select="substring-before(string(),'patch')"/>
|
||||
<xsl:text>patch -Z</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'patch')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Fix Udev reinstallation after a build failure -->
|
||||
<xsl:when test="contains(string(),'firmware,udev')">
|
||||
<xsl:text>if [[ ! -d /lib/udev/devices ]] ; then
</xsl:text>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
fi
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Setting $LANG for /etc/profile -->
|
||||
<xsl:when test="ancestor::sect1[@id='ch-scripts-profile'] and
|
||||
contains(string(),'export LANG=')">
|
||||
<xsl:value-of select="substring-before(string(),'export LANG=')"/>
|
||||
<xsl:text>export LANG=</xsl:text>
|
||||
<xsl:value-of select="$lang"/>
|
||||
<xsl:value-of select="substring-after(string(),'modifiers>')"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- Copying the kernel config file -->
|
||||
<xsl:when test="string() = 'make mrproper'">
|
||||
<xsl:text>make mrproper
</xsl:text>
|
||||
<xsl:text>cp -v ../kernel-config .config
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- The Bash, Coreutils, and Module-Init-Tools test suites are optional -->
|
||||
<xsl:when test="(ancestor::sect1[@id='ch-system-coreutils'] or
|
||||
ancestor::sect1[@id='ch-system-bash'] or
|
||||
ancestor::sect1[@id='ch-system-module-init-tools']) and
|
||||
(contains(string(),'check') or contains(string(),'nobody')
|
||||
or contains(string(),'dummy'))">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$testsuite = '0' or $testsuite = '1'"/>
|
||||
<xsl:otherwise>
|
||||
<xsl:if test="not(contains(string(),'check')) and
|
||||
not(contains(string(),'tests'))">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:if>
|
||||
<!-- Coreutils and Module-Init-Tools -->
|
||||
<xsl:if test="contains(string(),'check')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$bomb-testsuite = 'n'">
|
||||
<xsl:value-of select="substring-before(string(),'check')"/>
|
||||
<xsl:text>-k check</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'check')"/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1</xsl:text>
|
||||
<xsl:if test="contains(string(),' -k ')">
|
||||
<xsl:text> || true</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:if>
|
||||
<!-- Bash -->
|
||||
<xsl:if test="contains(string(),'tests')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$bomb-testsuite = 'n'">
|
||||
<xsl:value-of select="substring-before(string(),'tests')"/>
|
||||
<xsl:text>-k tests</xsl:text>
|
||||
<xsl:value-of select="substring-after(string(),'tests')"/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1</xsl:text>
|
||||
<xsl:if test="contains(string(),' -k ')">
|
||||
<xsl:text> || true</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:if>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<!-- Fixing toolchain test suites run -->
|
||||
<xsl:when test="string() = 'make check' or
|
||||
string() = 'make -k check'">
|
||||
<xsl:choose>
|
||||
<xsl:when test="(($testsuite = '1' or $testsuite = '2') and
|
||||
ancestor::chapter[@id='chapter-building-system']) or
|
||||
$testsuite = '3'">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$bomb-testsuite = 'n'">
|
||||
<xsl:text>make -k check >> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG 2>&1</xsl:text>
|
||||
<xsl:if test="contains(string(),' -k ')">
|
||||
<xsl:text> || true</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains(string(),'glibc-check-log')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$testsuite != '0'">
|
||||
<xsl:value-of select="substring-before(string(),'2>&1')"/>
|
||||
<xsl:text>>> $TEST_LOG 2>&1 || true
</xsl:text>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains(string(),'test_summary') or
|
||||
contains(string(),'expect -c')">
|
||||
<xsl:choose>
|
||||
<xsl:when test="(($testsuite = '1' or $testsuite = '2') and
|
||||
ancestor::chapter[@id='chapter-building-system']) or
|
||||
$testsuite = '3'">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> >> $TEST_LOG
</xsl:text>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<!-- Don't stop on strip run -->
|
||||
<xsl:when test="contains(string(),'strip ')">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> || true
</xsl:text>
|
||||
</xsl:when>
|
||||
<!-- The rest of commands -->
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="replaceable">
|
||||
<xsl:choose>
|
||||
<xsl:when test="ancestor::sect1[@id='ch-system-glibc']">
|
||||
<xsl:value-of select="$timezone"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="ancestor::sect1[@id='ch-system-groff']">
|
||||
<xsl:value-of select="$page"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text>**EDITME</xsl:text>
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text>EDITME**</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
531
2.3/LFS/master.sh
Normal file
531
2.3/LFS/master.sh
Normal file
|
@ -0,0 +1,531 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
###################################
|
||||
### FUNCTIONS ###
|
||||
###################################
|
||||
|
||||
|
||||
#############################################################
|
||||
|
||||
|
||||
#----------------------------#
|
||||
chapter4_Makefiles() { #
|
||||
#----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter4 ( SETUP ) ${R_arrow}"
|
||||
|
||||
# If $LUSER_HOME is already present in the host, we asume that the
|
||||
# lfs user and group are also presents in the host, and a backup
|
||||
# of their bash init files is made.
|
||||
(
|
||||
cat << EOF
|
||||
020-creatingtoolsdir:
|
||||
@\$(call echo_message, Building)
|
||||
@mkdir \$(MOUNT_PT)/tools && \\
|
||||
rm -f /tools && \\
|
||||
ln -s \$(MOUNT_PT)/tools /
|
||||
@\$(call housekeeping)
|
||||
|
||||
021-addinguser: 020-creatingtoolsdir
|
||||
@\$(call echo_message, Building)
|
||||
@if [ ! -d \$(LUSER_HOME) ]; then \\
|
||||
groupadd \$(LGROUP); \\
|
||||
useradd -s /bin/bash -g \$(LGROUP) -m -k /dev/null \$(LUSER); \\
|
||||
else \\
|
||||
touch luser-exist; \\
|
||||
fi;
|
||||
@chown \$(LUSER) \$(MOUNT_PT)/tools && \\
|
||||
chmod -R a+wt \$(MOUNT_PT)/\$(SCRIPT_ROOT) && \\
|
||||
chmod a+wt \$(SRCSDIR)
|
||||
@\$(call housekeeping)
|
||||
|
||||
022-settingenvironment: 021-addinguser
|
||||
@\$(call echo_message, Building)
|
||||
@if [ -f \$(LUSER_HOME)/.bashrc -a ! -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bashrc \$(LUSER_HOME)/.bashrc.XXX; \\
|
||||
fi;
|
||||
@if [ -f \$(LUSER_HOME)/.bash_profile -a ! -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bash_profile \$(LUSER_HOME)/.bash_profile.XXX; \\
|
||||
fi;
|
||||
@echo "set +h" > \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "umask 022" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "LFS=\$(MOUNT_PT)" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "LC_ALL=POSIX" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "PATH=/tools/bin:/bin:/usr/bin" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "export LFS LC_ALL PATH" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
echo "source $JHALFSDIR/envars" >> \$(LUSER_HOME)/.bashrc && \\
|
||||
chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bashrc && \\
|
||||
touch envars && \\
|
||||
chown \$(LUSER) envars
|
||||
@\$(call housekeeping)
|
||||
EOF
|
||||
) > $MKFILE.tmp
|
||||
|
||||
chapter4=" 020-creatingtoolsdir 021-addinguser 022-settingenvironment"
|
||||
}
|
||||
|
||||
|
||||
|
||||
#----------------------------#
|
||||
chapter5_Makefiles() {
|
||||
#----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter5 ( LUSER ) ${R_arrow}"
|
||||
|
||||
for file in chapter05/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
# If no testsuites will be run, then TCL, Expect and DejaGNU aren't needed
|
||||
# Fix also locales creation when running chapter05 testsuites (ugly)
|
||||
case "${this_script}" in
|
||||
*tcl) [[ "${TEST}" = "0" ]] && continue ;;
|
||||
*expect) [[ "${TEST}" = "0" ]] && continue ;;
|
||||
*dejagnu) [[ "${TEST}" = "0" ]] && continue ;;
|
||||
*stripping) [[ "${STRIP}" = "n" ]] && continue ;;
|
||||
*glibc) [[ "${TEST}" = "3" ]] && \
|
||||
sed -i 's@/usr/lib/locale@/tools/lib/locale@' $file ;;
|
||||
esac
|
||||
|
||||
# First append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
# DO NOT append the changingowner script, it need be run as root.
|
||||
# A hack is necessary: create script in chap5 BUT run as a dependency for
|
||||
# SUDO target
|
||||
case "${this_script}" in
|
||||
*changingowner) runasroot="$runasroot ${this_script}" ;;
|
||||
*) chapter5="$chapter5 ${this_script}" ;;
|
||||
esac
|
||||
|
||||
# Grab the name of the target (minus the -pass1 or -pass2 in the case of gcc
|
||||
# and binutils in chapter 5)
|
||||
name=`echo ${this_script} | sed -e 's@[0-9]\{3\}-@@' -e 's@-pass[0-9]\{1\}@@'`
|
||||
|
||||
# Set the dependency for the first target.
|
||||
if [ -z $PREV ] ; then PREV=022-settingenvironment ; fi
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
|
||||
# Find the version of the command files, if it corresponds with the building of
|
||||
# a specific package
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
# Insert instructions for unpacking the package and to set the PKGDIR variable.
|
||||
LUSER_wrt_unpack "$pkg_tarball"
|
||||
# If the testsuites must be run, initialize the log file
|
||||
[[ "$TEST" = "3" ]] && LUSER_wrt_test_log "${this_script}"
|
||||
# If using optimizations, write the instructions
|
||||
[[ "$OPTIMIZE" = "2" ]] && wrt_optimize "$name" && wrt_makeflags "$name"
|
||||
fi
|
||||
|
||||
# Insert date and disk usage at the top of the log file, the script run
|
||||
# and date and disk usage again at the bottom of the log file.
|
||||
# The changingowner script must be run as root.
|
||||
case "${this_script}" in
|
||||
*changingowner) wrt_RunAsRoot "$file" ;;
|
||||
*) LUSER_wrt_RunAsUser "$file" ;;
|
||||
esac
|
||||
|
||||
# Remove the build directory(ies) except if the package build fails
|
||||
# (so we can review config.cache, config.log, etc.)
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
LUSER_RemoveBuildDirs "$name"
|
||||
fi
|
||||
|
||||
# Include a touch of the target name so make can check
|
||||
# if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=${this_script}
|
||||
done # end for file in chapter05/*
|
||||
}
|
||||
|
||||
|
||||
#----------------------------#
|
||||
chapter6_Makefiles() {
|
||||
#----------------------------#
|
||||
|
||||
# Set envars and scripts for iteration targets
|
||||
if [[ -z "$1" ]] ; then
|
||||
local N=""
|
||||
else
|
||||
local N=-build_$1
|
||||
local chapter6=""
|
||||
mkdir chapter06$N
|
||||
cp chapter06/* chapter06$N
|
||||
for script in chapter06$N/* ; do
|
||||
# Overwrite existing symlinks, files, and dirs
|
||||
sed -e 's/ln -sv/&f/g' \
|
||||
-e 's/mv -v/&f/g' \
|
||||
-e 's/mkdir -v/&p/g' -i ${script}
|
||||
# Rename the scripts
|
||||
mv ${script} ${script}$N
|
||||
done
|
||||
# Remove Bzip2 binaries before make install (LFS-6.2 compatibility)
|
||||
sed -e 's@make install@rm -vf /usr/bin/bz*\n&@' -i chapter06$N/*-bzip2$N
|
||||
fi
|
||||
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter6$N ( CHROOT ) ${R_arrow}"
|
||||
|
||||
for file in chapter06$N/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
# We'll run the chroot commands differently than the others, so skip them in the
|
||||
# dependencies and target creation.
|
||||
# Skip also linux-headers in iterative builds.
|
||||
case "${this_script}" in
|
||||
*chroot) continue ;;
|
||||
*stripping*) [[ "${STRIP}" = "n" ]] && continue ;;
|
||||
*linux-headers*) [[ -n "$N" ]] && continue ;;
|
||||
esac
|
||||
|
||||
# Grab the name of the target.
|
||||
name=`echo ${this_script} | sed -e 's@[0-9]\{3\}-@@' -e 's,'$N',,'`
|
||||
|
||||
# Find the version of the command files, if it corresponds with the building of
|
||||
# a specific package. We need this here to can skip scripts not needed for
|
||||
# iterations rebuilds
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
|
||||
if [[ "$pkg_tarball" = "" ]] && [[ -n "$N" ]] ; then
|
||||
case "${this_script}" in
|
||||
*stripping*) ;;
|
||||
*) continue ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile)
|
||||
# The kernfs script must be run as part of SUDO target.
|
||||
case "${this_script}" in
|
||||
*kernfs) runasroot="$runasroot ${this_script}" ;;
|
||||
*) chapter6="$chapter6 ${this_script}" ;;
|
||||
esac
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
# In the mount of kernel filesystems we need to set LFS
|
||||
# and not to use chroot.
|
||||
case "${this_script}" in
|
||||
*kernfs) LUSER_wrt_target "${this_script}" "$PREV" ;;
|
||||
*) CHROOT_wrt_target "${this_script}" "$PREV" ;;
|
||||
esac
|
||||
|
||||
# If $pkg_tarball isn't empty, we've got a package...
|
||||
# Insert instructions for unpacking the package and changing directories
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
# Touch timestamp file if installed files logs will be created.
|
||||
# But only for the firt build when running iterative builds.
|
||||
if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
|
||||
CHROOT_wrt_TouchTimestamp
|
||||
fi
|
||||
CHROOT_Unpack "$pkg_tarball"
|
||||
# If the testsuites must be run, initialize the log file
|
||||
case $name in
|
||||
binutils | gcc | glibc )
|
||||
[[ "$TEST" != "0" ]] && CHROOT_wrt_test_log "${this_script}"
|
||||
;;
|
||||
* )
|
||||
[[ "$TEST" = "2" ]] || [[ "$TEST" = "3" ]] && CHROOT_wrt_test_log "${this_script}"
|
||||
;;
|
||||
esac
|
||||
# If using optimizations, write the instructions
|
||||
[[ "$OPTIMIZE" != "0" ]] && wrt_optimize "$name" && wrt_makeflags "$name"
|
||||
fi
|
||||
|
||||
# In the mount of kernel filesystems we need to set LFS
|
||||
# and not to use chroot.
|
||||
case "${this_script}" in
|
||||
*kernfs) wrt_RunAsRoot "$file" ;;
|
||||
*) CHROOT_wrt_RunAsRoot "$file" ;;
|
||||
esac
|
||||
|
||||
# Write installed files log and remove the build directory(ies)
|
||||
# except if the package build fails.
|
||||
if [ "$pkg_tarball" != "" ] ; then
|
||||
CHROOT_wrt_RemoveBuildDirs "$name"
|
||||
if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
|
||||
CHROOT_wrt_LogNewFiles "$name"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Include a touch of the target name so make can check
|
||||
# if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=${this_script}
|
||||
# Set system_build envar for iteration targets
|
||||
system_build=$chapter6
|
||||
done # end for file in chapter06/*
|
||||
}
|
||||
|
||||
#----------------------------#
|
||||
chapter78_Makefiles() {
|
||||
#----------------------------#
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter7/8 ( BOOT ) ${R_arrow}"
|
||||
|
||||
for file in chapter0{7,8}/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
# Grub must be configured manually.
|
||||
# Handle fstab creation.
|
||||
# If no .config file is supplied, the kernel build is skipped
|
||||
case ${this_script} in
|
||||
*grub) continue ;;
|
||||
*fstab) [[ ! -z ${FSTAB} ]] && cp ${FSTAB} $BUILDDIR/sources/fstab ;;
|
||||
*kernel) [[ -z ${CONFIG} ]] && continue
|
||||
cp ${CONFIG} $BUILDDIR/sources/kernel-config ;;
|
||||
esac
|
||||
|
||||
# First append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile
|
||||
chapter78="$chapter78 ${this_script}"
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
CHROOT_wrt_target "${this_script}" "$PREV"
|
||||
|
||||
# Find the bootscripts and kernel package names
|
||||
case "${this_script}" in
|
||||
*bootscripts)
|
||||
name="lfs-bootscripts"
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
CHROOT_wrt_TouchTimestamp
|
||||
fi
|
||||
CHROOT_Unpack "$pkg_tarball"
|
||||
;;
|
||||
*kernel)
|
||||
name="linux"
|
||||
pkg_tarball=$(get_package_tarball_name $name)
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
CHROOT_wrt_TouchTimestamp
|
||||
fi
|
||||
CHROOT_Unpack "$pkg_tarball"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Check if we have a real /etc/fstab file
|
||||
case "${this_script}" in
|
||||
*fstab) if [[ -n $FSTAB ]]; then
|
||||
CHROOT_wrt_CopyFstab
|
||||
else
|
||||
CHROOT_wrt_RunAsRoot "$file"
|
||||
fi
|
||||
;;
|
||||
*) CHROOT_wrt_RunAsRoot "$file"
|
||||
;;
|
||||
esac
|
||||
|
||||
case "${this_script}" in
|
||||
*bootscripts) CHROOT_wrt_RemoveBuildDirs "dummy"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
CHROOT_wrt_LogNewFiles "$name"
|
||||
fi ;;
|
||||
*kernel) CHROOT_wrt_RemoveBuildDirs "dummy"
|
||||
if [ "${INSTALL_LOG}" = "y" ] ; then
|
||||
CHROOT_wrt_LogNewFiles "$name"
|
||||
fi ;;
|
||||
esac
|
||||
|
||||
# Include a touch of the target name so make can check
|
||||
# if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=${this_script}
|
||||
done # for file in chapter0{7,8}/*
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#----------------------------#
|
||||
build_Makefile() { #
|
||||
#----------------------------#
|
||||
|
||||
echo "Creating Makefile... ${BOLD}START${OFF}"
|
||||
|
||||
cd $JHALFSDIR/${PROGNAME}-commands
|
||||
|
||||
# Start with a clean Makefile.tmp file
|
||||
>$MKFILE
|
||||
|
||||
chapter4_Makefiles
|
||||
chapter5_Makefiles
|
||||
chapter6_Makefiles
|
||||
# Add the iterations targets, if needed
|
||||
[[ "$COMPARE" = "y" ]] && wrt_compare_targets
|
||||
chapter78_Makefiles
|
||||
# Add the CUSTOM_TOOLS targets, if needed
|
||||
[[ "$CUSTOM_TOOLS" = "y" ]] && wrt_CustomTools_target
|
||||
# Add the BLFS_TOOL targets, if needed
|
||||
[[ "$BLFS_TOOL" = "y" ]] && wrt_blfs_tool_targets
|
||||
|
||||
# Add a header, some variables and include the function file
|
||||
# to the top of the real Makefile.
|
||||
wrt_Makefile_header
|
||||
|
||||
# Add chroot commands
|
||||
CHROOT_LOC="`whereis -b chroot | cut -d " " -f2`"
|
||||
i=1
|
||||
for file in chapter06/*chroot* ; do
|
||||
chroot=`cat $file | \
|
||||
sed -e "s@chroot@$CHROOT_LOC@" \
|
||||
-e '/#!\/bin\/bash/d' \
|
||||
-e 's@ \\\@ @g' | \
|
||||
tr -d '\n' | \
|
||||
sed -e 's/ */ /g' \
|
||||
-e 's|\\$|&&|g' \
|
||||
-e 's|exit||g' \
|
||||
-e 's|$| -c|' \
|
||||
-e 's|"$$LFS"|$(MOUNT_PT)|' \
|
||||
-e 's|set -e||' \
|
||||
-e 's|set +h||'`
|
||||
echo -e "CHROOT$i= $chroot\n" >> $MKFILE
|
||||
i=`expr $i + 1`
|
||||
done
|
||||
|
||||
# Drop in the main target 'all:' and the chapter targets with each sub-target
|
||||
# as a dependency.
|
||||
(
|
||||
cat << EOF
|
||||
|
||||
all: ck_UID mk_SETUP mk_LUSER mk_SUDO mk_CHROOT mk_BOOT create-sbu_du-report mk_CUSTOM_TOOLS mk_BLFS_TOOL
|
||||
@sudo make do_housekeeping
|
||||
@echo "$VERSION - jhalfs build" > lfs-release && \\
|
||||
sudo mv lfs-release \$(MOUNT_PT)/etc
|
||||
@\$(call echo_finished,$VERSION)
|
||||
|
||||
ck_UID:
|
||||
@if [ \`id -u\` = "0" ]; then \\
|
||||
echo "--------------------------------------------------"; \\
|
||||
echo "You cannot run this makefile from the root account"; \\
|
||||
echo "--------------------------------------------------"; \\
|
||||
exit 1; \\
|
||||
fi
|
||||
|
||||
mk_SETUP:
|
||||
@\$(call echo_SU_request)
|
||||
@sudo make BREAKPOINT=\$(BREAKPOINT) SETUP
|
||||
@touch \$@
|
||||
|
||||
mk_LUSER: mk_SETUP
|
||||
@\$(call echo_SULUSER_request)
|
||||
@( sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) LUSER" )
|
||||
@sudo make restore-luser-env
|
||||
@touch \$@
|
||||
|
||||
mk_SUDO: mk_LUSER
|
||||
@sudo make BREAKPOINT=\$(BREAKPOINT) SUDO
|
||||
@touch \$@
|
||||
|
||||
mk_CHROOT: mk_SUDO
|
||||
@\$(call echo_CHROOT_request)
|
||||
@( sudo \$(CHROOT1) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CHROOT")
|
||||
@touch \$@
|
||||
|
||||
mk_BOOT: mk_CHROOT
|
||||
@\$(call echo_CHROOT_request)
|
||||
@( sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) BOOT")
|
||||
@touch \$@
|
||||
|
||||
mk_CUSTOM_TOOLS: create-sbu_du-report
|
||||
@if [ "\$(ADD_CUSTOM_TOOLS)" = "y" ]; then \\
|
||||
\$(call sh_echo_PHASE,Building CUSTOM_TOOLS); \\
|
||||
sudo mkdir -p ${BUILDDIR}${TRACKING_DIR}; \\
|
||||
(sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CUSTOM_TOOLS"); \\
|
||||
fi;
|
||||
@touch \$@
|
||||
|
||||
mk_BLFS_TOOL: mk_CUSTOM_TOOLS
|
||||
@if [ "\$(ADD_BLFS_TOOLS)" = "y" ]; then \\
|
||||
\$(call sh_echo_PHASE,Building BLFS_TOOL); \\
|
||||
sudo mkdir -p $BUILDDIR$TRACKING_DIR; \\
|
||||
(sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) BLFS_TOOL"); \\
|
||||
fi;
|
||||
@touch \$@
|
||||
|
||||
|
||||
SETUP: $chapter4
|
||||
LUSER: $chapter5
|
||||
SUDO: $runasroot
|
||||
CHROOT: SHELL=/tools/bin/bash
|
||||
CHROOT: $chapter6
|
||||
BOOT: $chapter78
|
||||
CUSTOM_TOOLS: $custom_list
|
||||
BLFS_TOOL: $blfs_tool
|
||||
|
||||
|
||||
create-sbu_du-report: mk_BOOT
|
||||
@\$(call echo_message, Building)
|
||||
@if [ "\$(ADD_REPORT)" = "y" ]; then \\
|
||||
./create-sbu_du-report.sh logs $VERSION; \\
|
||||
\$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report); \\
|
||||
fi;
|
||||
@touch \$@
|
||||
|
||||
restore-luser-env:
|
||||
@\$(call echo_message, Building)
|
||||
@if [ -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
|
||||
mv -f \$(LUSER_HOME)/.bashrc.XXX \$(LUSER_HOME)/.bashrc; \\
|
||||
fi;
|
||||
@if [ -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
|
||||
mv \$(LUSER_HOME)/.bash_profile.XXX \$(LUSER_HOME)/.bash_profile; \\
|
||||
fi;
|
||||
@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bash*
|
||||
@\$(call housekeeping)
|
||||
|
||||
do_housekeeping:
|
||||
@-umount \$(MOUNT_PT)/sys
|
||||
@-umount \$(MOUNT_PT)/proc
|
||||
@-umount \$(MOUNT_PT)/dev/shm
|
||||
@-umount \$(MOUNT_PT)/dev/pts
|
||||
@-umount \$(MOUNT_PT)/dev
|
||||
@-rm /tools
|
||||
@-if [ ! -f luser-exist ]; then \\
|
||||
userdel \$(LUSER); \\
|
||||
rm -rf \$(LUSER_HOME); \\
|
||||
fi;
|
||||
|
||||
|
||||
EOF
|
||||
) >> $MKFILE
|
||||
|
||||
# Bring over the items from the Makefile.tmp
|
||||
cat $MKFILE.tmp >> $MKFILE
|
||||
rm $MKFILE.tmp
|
||||
echo "Creating Makefile... ${BOLD}DONE${OFF}"
|
||||
}
|
340
2.3/LICENSE
Normal file
340
2.3/LICENSE
Normal file
|
@ -0,0 +1,340 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.
|
||||
|
||||
<signature of Ty Coon>, 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.
|
35
2.3/Makefile
Normal file
35
2.3/Makefile
Normal file
|
@ -0,0 +1,35 @@
|
|||
# From the Build Scripts Written By: Jim Gifford <lfs@jg555.com>
|
||||
# Modified By: Joe Ciccone <jciccone@linuxfromscratch.org
|
||||
# Additional changes: George Boudreau <georgeb@linuxfromscratch.org>
|
||||
|
||||
TOPDIR=$(shell pwd)
|
||||
CONFIG_CONFIG_IN = Config.in
|
||||
CONFIG = menu
|
||||
|
||||
all: menuconfig
|
||||
# @clear
|
||||
@`grep RUN_ME configuration | sed -e 's@RUN_ME=\"@@' -e 's@\"@@' `
|
||||
|
||||
$(CONFIG)/conf:
|
||||
$(MAKE) -C $(CONFIG) conf
|
||||
|
||||
$(CONFIG)/mconf:
|
||||
$(MAKE) -C $(CONFIG) ncurses conf mconf
|
||||
|
||||
menuconfig: $(CONFIG)/mconf
|
||||
@$(CONFIG)/mconf $(CONFIG_CONFIG_IN)
|
||||
|
||||
config: $(CONFIG)/conf
|
||||
@$(CONFIG)/conf $(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
|
276
2.3/README
Normal file
276
2.3/README
Normal file
|
@ -0,0 +1,276 @@
|
|||
$Id$
|
||||
|
||||
1. INTRODUCTION::
|
||||
|
||||
This collection of scripts, known as jhalfs, strives to create
|
||||
accurate makefiles from the Linux From Scratch book series XML files.
|
||||
This software is an evolution of the original "jhalfs-0.2" code developed
|
||||
by Jeremy Huntwork.
|
||||
|
||||
The usage of this script assumes you have read and are familiar with
|
||||
the book(s) and, therefore, the configuration variables found in menuconfig
|
||||
interface will have meaning to you.
|
||||
|
||||
The list of supported books can be found at
|
||||
http://wiki.linuxfromscratch.org/alfs/wiki/SupportedBooks
|
||||
|
||||
NOTES::
|
||||
*. The resulting Makefile takes considerable time to run to completion.
|
||||
Lay in a supply of caffeine beverages.
|
||||
|
||||
*. It is recommended that you temporarily unpack your linux kernel,
|
||||
run <make menuconfig>, configure the kernel as per the book and save
|
||||
the resulting .config file. This suggestion also applies to the
|
||||
configuration of the uClibc package when building a HLFS system using
|
||||
uClibc rather than glibc.
|
||||
|
||||
*. Read carefully this file and the other README.* files before start
|
||||
using the tool.
|
||||
|
||||
2. PREREQUISITES::
|
||||
|
||||
To use this tool you MUST:
|
||||
|
||||
- have experience building {c,h,b}LFS packages
|
||||
- know how to edit and write shell scripts
|
||||
- know how a Makefile works
|
||||
- be able to trace build failures and to find what is causing it
|
||||
(user error, package bug, {c,h,b}LFS command bug, or jhalfs code bug)
|
||||
|
||||
If you do not have the above skills, please don't use this tool.
|
||||
|
||||
|
||||
3. INSTALLATION::
|
||||
|
||||
No installation is required. System-wide installation is not allowed.
|
||||
|
||||
4. CONFIGURATION::
|
||||
|
||||
We have installed the familiar menu based configuration tool driven by
|
||||
GNU make. see the section RUNNING, for details
|
||||
|
||||
5. RUNNING::
|
||||
|
||||
The command <make> will launch a menu based configuration program. You will
|
||||
recognize the layout from building the kernel or uClibc/BusyBox. The
|
||||
underlying menu code was borrowed from BusyBox and slightly modified for
|
||||
our use.
|
||||
|
||||
Help on parameter function is available from the on-line help. Please
|
||||
make use of that feature for additional information not in this file.
|
||||
|
||||
Once you have set the parameters you wish and have saved your work the
|
||||
jhalfs script is launch. The script verify first that the host can run
|
||||
it and build the xLFS system, then validate the configuration and present
|
||||
you with your selections which you may accept or reject.
|
||||
|
||||
If you accepted the displayed settings jhalfs will proceed to create the
|
||||
Makefile, optionally download packages.
|
||||
|
||||
::NEWS::
|
||||
You must be logged as a normal user with sudo privileges to run
|
||||
the Makefile.
|
||||
|
||||
NOTE::
|
||||
If you run the jhalfs script directly the only function you can select
|
||||
is to display the version number running <./jhalfs -v>
|
||||
|
||||
6. BLFS_TOOL SUPPORT::
|
||||
|
||||
For books that support it, there is an option to install blfs-tool and its
|
||||
dependencies on the final system. The pre-made build dependencies
|
||||
scripts has been written based on a LFS build. For CLFS and HLFS
|
||||
builds you may need to adjust that scripts, that are found into the
|
||||
common/blfs-tool-deps directory in the jhalfs sources tree.
|
||||
|
||||
WARNING:: If you add blfs-tool support on a CLFS Sysroot build
|
||||
you MUST to edit the dependencies scripts to fix the
|
||||
installation paths.
|
||||
Be careful when you modify the scripts as you can
|
||||
easily disable the host system.
|
||||
|
||||
After booting the new xLFS system some steps are needed to finish
|
||||
blfs-tool installation:
|
||||
|
||||
- A user account must be created. You must be logged on that user
|
||||
account to use blfs-tool.
|
||||
|
||||
- Move /blfs-root to that user's home and change ownership of the
|
||||
directory and files to the user.
|
||||
|
||||
- Give the user read and write privileges over the $TRACKING_DIR
|
||||
directory and the files that it contains.
|
||||
|
||||
- If you think that you may need the libxml2/libxslt Python modules,
|
||||
remove the libxml2 and libxslt trackin files found in $TRACKING_DIR.
|
||||
|
||||
- Configure sudo, adding the needed privileges for the user.
|
||||
|
||||
We assume that blfs-tool will be used on a running fresh xLFS system.
|
||||
To use it to build BLFS packages from the chroot jail is also possible,
|
||||
but is for you to figure out how to do that.
|
||||
|
||||
To know how to blfs-tool works, see README.BLFS.
|
||||
|
||||
7. LAYOUT::
|
||||
|
||||
/BLFS (see README.BLFS)
|
||||
|
||||
/CLFS/master.sh
|
||||
/clfs.xsl
|
||||
|
||||
/CLFS2/master.sh
|
||||
/clfs2.xsl
|
||||
|
||||
/CLFS3/master.sh
|
||||
/clfs3.xsl
|
||||
|
||||
/HLFS/master.sh
|
||||
/hlfs.xsl
|
||||
|
||||
/LFS/master.sh
|
||||
/lfs.xsl
|
||||
|
||||
/common/common_functions
|
||||
/makefile_functions
|
||||
/packages.xsl
|
||||
/urls.xsl
|
||||
/create-sbu_du-report.sh
|
||||
/progress_bar.sh
|
||||
/blfs-tool-deps/9xx-*
|
||||
/libs/func_*
|
||||
|
||||
/custom/template
|
||||
/config/
|
||||
/examples/*
|
||||
/examples_CLFS-E/*
|
||||
|
||||
/extras/do_copy_files
|
||||
/do_ica_prep
|
||||
/do_ica_work
|
||||
/farce
|
||||
/filelist
|
||||
|
||||
/optimize/opt_config
|
||||
/opt_override
|
||||
/optimize_functions
|
||||
/opt_config.d/noOpt
|
||||
/noSymbols
|
||||
/O3pipe
|
||||
/O3pipe_march
|
||||
/defOpt_fPIC
|
||||
|
||||
/menu/*
|
||||
|
||||
README
|
||||
README.BLFS
|
||||
README.CLFS
|
||||
README.HLFS
|
||||
README.CUSTOM
|
||||
TODO
|
||||
LICENSE
|
||||
|
||||
Config.in
|
||||
Makefile
|
||||
jhalfs
|
||||
blfs-tool
|
||||
|
||||
8. FAQ::
|
||||
Q. "This 'help' file is very sparse"
|
||||
A. Yes, it is. This tool, jhalfs, is for those who understand the LFS books
|
||||
and wish to automate the build. 99% of any problems that arise can be
|
||||
solved by reading the book(s).
|
||||
|
||||
Q. "It doesn't work!"
|
||||
A. Yes it does, try >> make
|
||||
Remember you must have 'sudo' privileges.
|
||||
|
||||
Q. "It still doesn't work"
|
||||
A. jhalfs was designed to work against the development versions of the LFS
|
||||
series of books. Consequently changes in a book(s) sometimes breaks older
|
||||
versions of jhalfs. Before you start pulling out your hair download the
|
||||
latest version of jhalfs to see if that solves your problem.
|
||||
|
||||
Q. "How do I specify the build location?"
|
||||
A. The original LFS document worked against the well known location /mnt/lfs.
|
||||
This script automates the build of all of the LFS series of books and uses
|
||||
a generic location $BUILDDIR with a default value of /mnt/build_dir.
|
||||
You may change this value to suit your needs.
|
||||
|
||||
The layout below $BUILDDIR is as follows.
|
||||
$BUILDDIR/
|
||||
jhalfs (Makefile, cmd scripts, logs, etc..)
|
||||
sources (where packages reside)
|
||||
tools (temporary bootstrap system)
|
||||
cross-tools (temporary CLFS only)
|
||||
...
|
||||
FHS dir structure
|
||||
...
|
||||
blfs_root (files to use blfs-tool if selected to install it)
|
||||
|
||||
Q. "What is the function of the SRC_ARCHIVE variable?"
|
||||
A. When jhalfs runs and packages download was selected, it creates a local
|
||||
copy of the necessary packages in BUILDDIR/sources by downloading the
|
||||
files. If the variable SRC_ARCHIVE is defined the software will first
|
||||
look in this location for the file and, if found, will copy it to
|
||||
BUILDDIR/sources.
|
||||
If the files are not found in SRC_ARCHIVE _and_ you have write priv to
|
||||
the directory any downloaded files will be mirrored there.
|
||||
|
||||
Q. "How do I set the SRC_ARCHIVE location?"
|
||||
A. The best way to set the value of SRC_ARCHIVE is
|
||||
|
||||
export SRC_ARCHIVE=/wherever/you/store/downloaded/packages
|
||||
|
||||
or you can set the full path in the proper menu entry.
|
||||
|
||||
Q. "Why have 2 copies of the files?"
|
||||
A. The package files must be visible during the chroot phase and this is a
|
||||
simple and reliable method of doing so. This method also handles the CLFS
|
||||
boot build method where the final build may be done on a separate machine.
|
||||
|
||||
Q. "What is the function of "User account" and "Group account" menu settings?"
|
||||
A. If you are running jhalfs from a low or non-privileged account you may not
|
||||
have the priv to create/delete the user needed to build temporary tools.
|
||||
These settings allow you to use your own user and group name to do that
|
||||
build steps.
|
||||
|
||||
These variables are adjustable also when invoking make:
|
||||
|
||||
$BUILDDIR make LUSER=myaccount LGROUP=mygroup
|
||||
|
||||
The only changes to your account will be the creation of a NEW .bashrc
|
||||
after saving your original to .bashrc.XXX
|
||||
|
||||
Q. "When I try to build CLFS the Makefile fails at the mid-point"
|
||||
A. There could be numerous reasons for the failure but the most likely reason
|
||||
is you are doing a cross-build using the 'chroot' method and the target is
|
||||
not compatible with the host. If you choose to build using the chroot
|
||||
method a test is performed at the end of the temptools phase. If the test
|
||||
succeeds the build continues inside a chroot jail. However if the test fails
|
||||
it means the host and target are not compatible an you should use the
|
||||
'boot' method to create your target code.
|
||||
As an extreme example: You can build a sparc target on a x86 platform but
|
||||
only the temptools phase. You must select the 'boot' method and not the
|
||||
'chroot.' You must transfer the toolchain to a sparc platform, reboot the
|
||||
sparc box and continue the build.
|
||||
Of all the LFS series of books Cross-LFS requires the greatest
|
||||
understanding of host/target hardware combination. Please read the book
|
||||
carefully and don't skip the easy parts (there are none..)
|
||||
|
||||
Q. "How could I stop the build at a predefined chosen point?"
|
||||
A. Launch the Makefile manually passing the last numbered target to be build
|
||||
as the break point. For example:
|
||||
|
||||
make BREAKPOINT=84-bash
|
||||
|
||||
The build can be stopped also at the end of a top-level build phase by
|
||||
calling directly the appropriate mk_* target. For example:
|
||||
|
||||
make mk_LUSER
|
||||
|
||||
See the Makefile to know the proper target names for that book build.
|
||||
|
||||
Authors:
|
||||
George Boudreau
|
||||
Manuel Canales Esparcia
|
233
2.3/README.BLFS
Normal file
233
2.3/README.BLFS
Normal file
|
@ -0,0 +1,233 @@
|
|||
$Id$
|
||||
|
||||
1. INTRODUCTION::
|
||||
|
||||
If you want to add blfs-tool support into a xLFS base system build,
|
||||
read the "BLFS_TOOL SUPPORT" section found in the README and be sure
|
||||
to follow the after-booting installation intructions.
|
||||
|
||||
To automate package builds from the BLFS book instructions is a huge
|
||||
task. Some of the issues are: the BLFS book isn't linear; some package
|
||||
pages use a custom layout; there are circular dependencies; several
|
||||
packages can be installed on a non-default prefix; build commands can
|
||||
change based on what dependencies will be used, etc.
|
||||
|
||||
That being said, the goal of the blfs-tool is to help you solve package
|
||||
dependencies, create build scripts and a Makefile. Few of the auto-generated
|
||||
build scripts and Makefile will work "as is", thus, as a general rule,
|
||||
you will need to review and edit the scripts while reading the book.
|
||||
|
||||
|
||||
2. PREREQUISITES::
|
||||
|
||||
To use this tool you MUST:
|
||||
|
||||
- have experience building BLFS packages
|
||||
- know how to edit and write shell scripts
|
||||
- know how a Makefile works
|
||||
- be able to trace build failures and to find what is causing it
|
||||
(user error, package bug, BLFS command bug, or jhalfs code bug)
|
||||
|
||||
If you do not have the above skills, please don't use this tool.
|
||||
|
||||
|
||||
3. USAGE::
|
||||
|
||||
Due the complexity of the BLFS book, the scripts and Makefile generation
|
||||
is done in several steps:
|
||||
|
||||
3.1 INSTALLED PACKAGES TRACKING SYSTEM
|
||||
|
||||
This tool includes a very simple tracking system to log which packages
|
||||
have been installed using the tool. It is used to skip installed packages
|
||||
from target selection menu and to test if an installed package has been
|
||||
updated in the BLFS book. Do not rely on this feature as a package
|
||||
management tool.
|
||||
|
||||
The directory where tracking files will be stored needs to be created
|
||||
before installing blfs-tool. You can place this directory anywhere, taking
|
||||
care that the user must have read and write privileges on that directory
|
||||
and on all files it contains.
|
||||
|
||||
To use the default path set in the installation menu, run as root:
|
||||
|
||||
install -d -m1777 /var/lib/jhalfs/BLFS
|
||||
|
||||
3.2 BLFS_TOOL INSTALLATION::
|
||||
|
||||
Run "make" to launch the jhalfs menuconfig interface. Select the BLFS
|
||||
book and version. Then set the installation directory (default
|
||||
$HOME/blfs_root), the BLFS sources directory (default blfs-xml), and
|
||||
the installed packages tracking directory (default /var/lib/jhalfs/BLFS).
|
||||
|
||||
All required files will be placed in the installation directory and
|
||||
BLFS XML sources will be installed in the named sub-directory.
|
||||
|
||||
Installed files:
|
||||
|
||||
blfs-xml/* SVN tree of the selected BLFS book version
|
||||
lib/* functions libraries, xsl stylesheets, and auto-generated
|
||||
meta-packages dependencies tree files
|
||||
menu/* lxdialog and menuconfig source code
|
||||
README.BLFS this file
|
||||
TODO developers notes
|
||||
update_book.sh update the XML book sources and regenerates packages
|
||||
database and meta-packages dependencies tree
|
||||
gen_config.sh regenerates Config.in
|
||||
gen_pkg_book.sh resolves dependencies and generates linear BLFS books
|
||||
and build scripts
|
||||
gen-makefile.sh generates the target Makefile
|
||||
progress_bar.sh the target Makefile progress bar
|
||||
Makefile run gen_config.sh to update Config.in,
|
||||
then launch the menuconfig interface, and lastly run
|
||||
gen_pkg_book.sh based on configuration settings
|
||||
Config.in menuconfig interface input file
|
||||
packages auto-generated packages database
|
||||
envars.conf envars needed when running the target build scripts
|
||||
|
||||
From now on, all the work must be done from inside the installation
|
||||
root directory.
|
||||
|
||||
When finished the installation, the configuration and target selection
|
||||
menu is launch.
|
||||
|
||||
3.3 UPDATING BOOK SOURCES::
|
||||
|
||||
If you are using the development book version and you want to update
|
||||
installed packages to the latest version found in that book, you need to
|
||||
update the XML sources and packages database.
|
||||
|
||||
To do that run "./update_book.sh"
|
||||
|
||||
On the next configuration run, packages already installed but listed
|
||||
with a new version in the book will be available for target selection
|
||||
and used to solve dependencies.
|
||||
|
||||
3.4 CONFIGURING AND PARSING THE BOOK::
|
||||
|
||||
The next step is to create a book and build scripts in dependency
|
||||
build order for a target package. A target can be a package or a
|
||||
meta-package.
|
||||
|
||||
WARNING:
|
||||
Only one target (meta-package or individual package) must be
|
||||
selected on each configuration run.
|
||||
There is no way to solve dependencies properly when more
|
||||
than one target are selected.
|
||||
|
||||
Run <make> to launch the configuration interface. The main menu contains
|
||||
three blocks: meta-package selection, individual package selection, and
|
||||
build options.
|
||||
|
||||
When a meta-package is selected, it is possible to unselect unwanted
|
||||
components. The unselected components will be skipped if no other components
|
||||
depends on them.
|
||||
|
||||
In the build options section, the dependencies level and default packages
|
||||
used to solve alternatives are set. You can also select whether the build will
|
||||
be made as a normal user or as root. That settings are saved to be reused in
|
||||
future configuration runs.
|
||||
|
||||
If, for example, your target selection is Xsoft-->Graphweb-->galeon, a
|
||||
directory named "galeon" will be created. Inside that directory you will
|
||||
find a directory named "HTML" that contains a galeon-based HTML book with
|
||||
its dependencies in build order, and a "scripts" directory with build
|
||||
scripts for that packages.
|
||||
|
||||
There are also two other directories ("dependencies" and "xincludes")
|
||||
that contain files generated while resolving dependencies trees.
|
||||
|
||||
3.5 EDITING BUILD SCRIPTS
|
||||
|
||||
Now it is time to review the generated book and scripts, making any changes
|
||||
to the scripts necessary to fix generation bugs or to suit your needs.
|
||||
|
||||
Scripts for additional packages (i.e., for non-BLFS packages) can be
|
||||
easily inserted. For example, if you want to install the external dependency
|
||||
"bar" before "foo" package and the "foo" script is named "064-z-foo", you
|
||||
need to create a "064-y-bar" build script.
|
||||
|
||||
Remember, the package tracking system isn't a package management tool
|
||||
and knows nothing about packages not in the BLFS book.
|
||||
|
||||
Also, review and edit envars.conf. This file is used to set global envars
|
||||
needed by the build scripts.
|
||||
|
||||
3.6 CREATING THE MAKEFILE
|
||||
|
||||
When the build scripts are ready to be run, the Makefile can be
|
||||
created. Be sure that you cd into the "package" directory and run
|
||||
../gen-makefile.sh
|
||||
|
||||
Review the Makefile, and, if all looks sane, start the build.
|
||||
|
||||
4. GENERATED BUILD SCRIPTS ISSUES::
|
||||
|
||||
In this section, known issues with the generated build scripts are
|
||||
discussed. They are due to build procedures and/or BLFS layout particularities
|
||||
that we can't handle. In several cases, editing the build scripts is mandatory.
|
||||
You may also need to insert some build scripts created by you to resolve
|
||||
unhandled dependencies and/or to remove some script installing the affected
|
||||
package by hand.
|
||||
|
||||
4.1 BLFS BOOTSCRIPTS
|
||||
|
||||
For now, bootscripts installation will fail. You will need to edit
|
||||
the scripts for packages that install bootscripts and fix their
|
||||
installation command. That could be fixed in the future.
|
||||
|
||||
4.2 PACKAGE CONFIGURATION
|
||||
|
||||
For those packages that have a "Configuration" section, you should
|
||||
edit the build script to fit the needs of your system.
|
||||
|
||||
4.4 PDL, Perl modules, and Glib-Bindings.
|
||||
|
||||
The generated scripts for these packages are broken and can not
|
||||
be fixed. You must replace them with your own scripts or install the
|
||||
packages by hand.
|
||||
|
||||
4.4 GCC, JDK, Sane, and KDE-multimedia
|
||||
|
||||
On the pages for these packages, the BLFS book actually has instructions
|
||||
to install two packages. You must edit the scripts to fix this.
|
||||
|
||||
We will try to fix some of them, but this may not be possible.
|
||||
|
||||
4.5 XORG7
|
||||
|
||||
The generated scripts for Xorg7 pseudo-packages have $SRC_ARCHIVE
|
||||
support for individual packages, but not for patches nor *.wget and *.md5
|
||||
files.
|
||||
|
||||
If you have previously downloaded the patches, you must edit
|
||||
the scripts to use your local packages.
|
||||
|
||||
The *.wget and *.md5 files should be downladed always from inside
|
||||
the scripts to be sure that the most current individual packages are
|
||||
used. Thus don't reuse previouly existing ones.
|
||||
|
||||
4.6 PATCHES
|
||||
|
||||
By default, all required patches will be downloaded from the NET.
|
||||
|
||||
If you have previously downloaded the patches, you must edit the
|
||||
scripts to use your local patches.
|
||||
|
||||
Also, be sure that all scripts have the commands to download/apply the
|
||||
required patches. Due to book layout issues, some patches may be missing.
|
||||
|
||||
4.7 ROOT COMMANDS
|
||||
|
||||
If building as a normal user (the default setting), be sure that all
|
||||
commands that require root privileges are run using sudo. Also make sure
|
||||
necessary root privilege commands are visible in your PATH.
|
||||
|
||||
Due to book layout issues, some sudo commands may be missing.
|
||||
|
||||
4.8 OTHERS
|
||||
|
||||
There may be other issues that we are not aware of. If you find
|
||||
any, please report it to <alfs-discuss@linuxfromscratch.org>.
|
||||
|
||||
|
44
2.3/README.CLFS
Normal file
44
2.3/README.CLFS
Normal file
|
@ -0,0 +1,44 @@
|
|||
# $Id$
|
||||
|
||||
CLFS-1.x NOTES
|
||||
|
||||
None for now.
|
||||
|
||||
|
||||
|
||||
CLFS SYSROOT METHOD NOTES
|
||||
|
||||
.- If you want to install additional custom packages via "Add custom tools
|
||||
support" and/or select "Add blfs-tool support", be sure to review and edit
|
||||
their packages build scripts to follow the sysroot build method or you will
|
||||
end messing your host system. Be very careful with this.
|
||||
|
||||
.- If you install additional packages not using the "Add custom tools support"
|
||||
feature (i,e, you will install it manually after finished the Makefile run)
|
||||
you will need to run manually the "Changing the Ownership Of The CLFS System"
|
||||
phase commands found in the book.
|
||||
|
||||
|
||||
|
||||
CLFS EMBEDDED SYSTEMS NOTES
|
||||
|
||||
.- Mips, WRT and ARM builds are broken due a book bug on the uClibc
|
||||
*ENDIAN* configuration settings.
|
||||
|
||||
.- To install CBLFS packages you must to use the "Add custom tools support"
|
||||
feature. To learn how it works and how to use it, see the section titled
|
||||
"Adding Post-System Build Configuration Files and Extra Packages"
|
||||
found in README.CUSTOM. That is also applicable to bootloaders installation.
|
||||
|
||||
.- If you install additional packages not using the "Add custom tools support"
|
||||
feature (i,e, you will install it manually after finished the Makefile run)
|
||||
you will need to run manually the "Changing the Ownership Of The CLFS System"
|
||||
phase commands found in the book.
|
||||
|
||||
.- If your target is a MIPS wireless router, you must to select "mips" as
|
||||
your target architecture and "WRT - MIPS based wireless route" as your
|
||||
hardware platform.
|
||||
|
||||
.- The backup & clean-up phases aren't run. This is to allow users to
|
||||
review the installed files and do a more in-deeper clean-up before creating
|
||||
the system tarball.
|
268
2.3/README.CUSTOM
Normal file
268
2.3/README.CUSTOM
Normal file
|
@ -0,0 +1,268 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
HOW TO ADD CUSTOM SCRIPTS TO THE JHALFS MAKEFILE
|
||||
|
||||
|
||||
Normally JHALFS creates a Makefile containing only those scripts found in
|
||||
the {B,C,H}LFS books. An automated construction tool cannot predict the
|
||||
needs of every individual and requests are made "Can you add xxxx package".
|
||||
Rather than adding numerous package scripts and switches for each request it
|
||||
was easier to add a tool for the user(s) to code their own package needs.
|
||||
|
||||
There is two areas that can be customized: how the base system is build
|
||||
and what additional configurations and packages requires your hardware to can
|
||||
boot and work with. Each one of this areas is handled in a different way.
|
||||
|
||||
|
||||
|
||||
|
||||
BASE SYSTEM CUSTOMIZATION
|
||||
|
||||
There is two ways to alter how the base system will be built:
|
||||
|
||||
- Using a working copy of the book sources and editing the XML files.
|
||||
This is the way used by book editors to test packages upgrades,
|
||||
command changes, build order changes. etc.
|
||||
|
||||
This method requires you know very well the book sources and what
|
||||
files need be edited. It will not be discussed here.
|
||||
|
||||
- Editing the generated build scripts to make any change you would.
|
||||
This is the method discussed below.
|
||||
|
||||
|
||||
EDITING THE BASE SCRIPTS
|
||||
|
||||
First step is to generate the build scripts with book defaults. To do that,
|
||||
configure jhalfs activating any option you want included, but do not select
|
||||
"Run the Makefile" option.
|
||||
|
||||
Under the ${BUILD_DIR}/${SCRIPT_ROOT}/${PROGNAME}-commands directory
|
||||
(using the defaults values to do an LFS build, that directory name is
|
||||
/mnt/build_dir/jhalfs/lfs-commands) you will find the default build scripts.
|
||||
|
||||
If all you want is modify, add, or remove some command from a package
|
||||
installation, for example to change it ./configure line, just edit the related
|
||||
script. If changing or adding a patch, be sure to copy the new patch to the
|
||||
${BUILD_DIR}/sources directory. When done, run 'make' from inside the
|
||||
${BUILD_DIR}/${SCRIPT_ROOT} directory.
|
||||
|
||||
|
||||
REPLACING OR INSERTING PACKAGES AND CHANGING BUILD ORDER
|
||||
|
||||
To remove a package from the system, just remove its script(s).
|
||||
|
||||
To change the version of some package to build a newest or oldest one than the
|
||||
one found in the book, edit ${BUILD_DIR}/${SCRIPT_ROOT}/pkg_tarball_list to
|
||||
change it tarball name and place the new tarball in the ${BUILD_DIR}/sources
|
||||
directory,
|
||||
|
||||
To replace a package by an equivalent one, rename the replaced package script
|
||||
to reflect the new package name (for example, 102-man-db -> 102-man), edit the
|
||||
script to made the required commands changes, place the new tarball in the
|
||||
${BUILD_DIR}/sources directory, and edit ${BUILD_DIR}/${SCRIPT_ROOT}/pkg_tarball_list
|
||||
file to replace the removed package tarball name by the new package tarball name.
|
||||
|
||||
To change the build order, rename the scripts changing the first 3-digits
|
||||
string until have it ordered in the way you want.
|
||||
|
||||
To insert a new package, for example to build Cracklib to can build Shadow
|
||||
with Cracklib support, first you should decide before what default package it
|
||||
need be installed, in this example before 107-shadow. Then create a new script
|
||||
containing the needed commands, using an existing one as template, and name it with
|
||||
the same 3-digits string used for that mentioned default package, but adding
|
||||
another 1-digit string. In our example, the new script to build Cracklib just
|
||||
before Shadow will be named 107-1-cracklib. This naming schema allow to insert
|
||||
up to 10 scripts before each one of the default scripts. Place the tarball for
|
||||
the new package and required patches, if any, if ${BUILD_DIR}/sources and edit
|
||||
${BUILD_DIR}/${SCRIPT_ROOT}/pkg_tarball_list to add the tarball name for that
|
||||
package.
|
||||
|
||||
When ready, launch again the jhalfs configuration interface. Be sure that
|
||||
are selected exactly the same options than when generating the default build
|
||||
scripts. Be sure that "Rebuild files" is unselected and select "Run the Makefile"
|
||||
if you want. Then select "Rebuild the Makefile". This will create a new Makefile
|
||||
based on the changes you made to the build scripts.
|
||||
|
||||
|
||||
|
||||
|
||||
ADDING POST-SYSTEM BUILD CONFIGURATION FILES AND EXTRA PACKAGES
|
||||
|
||||
The installation of BLFS packages is handled via blfs-tool and activated
|
||||
when you select the appropriate menu option. See README and README.BLFS for
|
||||
more info.
|
||||
|
||||
The feature described below was added so users could install remaining
|
||||
configuration files, build the packages necessary to access the Internet
|
||||
or to support specific hardware, or to install basic utilities that need
|
||||
have available from the beginning, and was not intended to replace the BLFS
|
||||
install system.
|
||||
|
||||
:::NOTICE:::
|
||||
The following examples are for use with LFS and are not applicable to any
|
||||
of the CLFS-sysroot or CLFS-Embedded books. The directory examples_CLFS-E
|
||||
contains code extracted from Beyond CLFS-embedded. Any packages you chose to
|
||||
add should honour the DESTDIR=${CLFS} switch or equivalent.
|
||||
|
||||
|
||||
LAYOUT
|
||||
A new directory has been added to JHALFS tree which will contain the
|
||||
configuration scripts and a few examples. A switch has been added to the
|
||||
configuration file which enables/disables the inclusion of personal scripts.
|
||||
|
||||
custom
|
||||
/config <-- where to put your scripts.
|
||||
/examples <-- a few example scripts
|
||||
/examples_CLFS-E <-- example scripts for CLFS-Embedded
|
||||
template <-- ALL scripts MUST look like this
|
||||
|
||||
|
||||
|
||||
NOTE::: You are responsible for including all dependencies and ensuring they
|
||||
are built in the proper order.
|
||||
|
||||
1. To add a package to the final JHALFS Makefile you must first create a file
|
||||
in the custom/config directory.
|
||||
**All config files MUST follow the naming convention, xxx-PKG, where xxx
|
||||
is the order number and PKG is the name of the package. The file naming
|
||||
format is important as it defines the build order. The example shown
|
||||
below has an order number 950 and log files will list in alphabetical
|
||||
order in the /logs directory after blfs-tools scripts.
|
||||
The simplest method is to copy the template file into the config directory
|
||||
and rename it.
|
||||
|
||||
2. Populate the variables with the necessary values.
|
||||
Variable function is self explanatory except for the inclusion of the
|
||||
build cmds. If the package you want to include is found in the BLFS
|
||||
book then you only need to copy/paste the cmd strings between the xEOFx
|
||||
pairs, otherwise you will need to define the build cmds yourself.
|
||||
NOTE::: This script you just created is not usable directly but contains
|
||||
all the information necessary for jhalfs to create a build script
|
||||
and an entry in the jhalfs Makefile.
|
||||
|
||||
3. As mentioned previously the build order is dictated by the 3 digit number
|
||||
in the file name. If a package has dependencies it must be numerically
|
||||
larger than the dependency files.
|
||||
i.e. The package mc has glib as a dependency and build order is
|
||||
950-glib
|
||||
951-mc
|
||||
|
||||
4. A config file for BLFS-bootscripts is already created as 999-blfs_bootscripts.
|
||||
If a package requires a bootscript to be installed add the cmd to this
|
||||
file and NOT in the package script. The gpm script is included as an
|
||||
example of multiple patch files and the need for a blfs bootscript.
|
||||
|
||||
|
||||
#--------- GLIB example -----------
|
||||
|
||||
#
|
||||
# Filename syntax xxx-PKG ie. 950-glibc
|
||||
# Create a file in the custom/config directory
|
||||
# Populate the file using the following script as an example
|
||||
#
|
||||
|
||||
PKG="glib"
|
||||
PKG_VERSION="1.2.10"
|
||||
PKG_FILE="glib-1.2.10.tar.gz"
|
||||
URL="http://gd.tuwien.ac.at/graphics/gimp/gtk/v1.2/${PKG_FILE}"
|
||||
MD5="6fe30dad87c77b91b632def29dd69ef9"
|
||||
|
||||
# The following code removes previously defined PATCHx variables
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
# Patches are named PATCH[1..10]
|
||||
# This information is used to download the patch only
|
||||
# If you do not have the MD5SUM the download will proceed with a warning.
|
||||
PATCH1="http://www.linuxfromscratch.org/patches/blfs/svn/glib-1.2.10-gcc34-1.patch 0077a1cce5e8a2231ac5a9b08c6263ba"
|
||||
|
||||
|
||||
# NOTE::
|
||||
# The convoluted scheme used to write out a temporary file is
|
||||
# a work-around for embedded single and double quotes.
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
patch -Np1 -i ../glib-1.2.10-gcc34-1.patch &&
|
||||
./configure --prefix=/usr &&
|
||||
make
|
||||
make install &&
|
||||
chmod -v 755 /usr/lib/libgmodule-1.2.so.0.0.10
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
||||
|
||||
|
||||
#--------- GPM example -----------
|
||||
|
||||
|
||||
PKG="gpm"
|
||||
PKG_VERSION="1.20.1"
|
||||
PKG_FILE="gmp-1.20.1.tar.bz2"
|
||||
URL="ftp://arcana.linux.it/pub/gpm/gpm-1.20.1.tar.bz2"
|
||||
MD5="2c63e827d755527950d9d13fe3d87692"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
# MD5SUM is not absolutely necessary but JHALFS whines and complains
|
||||
# Add the MD5SUM if you can
|
||||
PATCH1=" http://www.linuxfromscratch.org/patches/blfs/svn/gpm-1.20.1-segfault-1.patch"
|
||||
PATCH2=" http://www.linuxfromscratch.org/patches/blfs/svn/gpm-1.20.1-silent-1.patch"
|
||||
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
patch -Np1 -i ../gpm-1.20.1-segfault-1.patch &&
|
||||
patch -Np1 -i ../gpm-1.20.1-silent-1.patch &&
|
||||
./configure --prefix=/usr --sysconfdir=/etc &&
|
||||
LDFLAGS="-lm" make
|
||||
|
||||
make install &&
|
||||
cp -v conf/gpm-root.conf /etc &&
|
||||
ldconfig
|
||||
|
||||
# The normal cmd to install the boot script for gpm
|
||||
# --- PUT THIS CMD INSIDE 999-blfs_bootscripts
|
||||
#make install-gpm
|
||||
|
||||
cat > /etc/sysconfig/mouse << "EOF"
|
||||
# Begin /etc/sysconfig/mouse
|
||||
|
||||
MDEVICE="/dev/psaux"
|
||||
PROTOCOL="imps2"
|
||||
GPMOPTS=""
|
||||
|
||||
# End /etc/sysconfig/mouse
|
||||
EOF
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
||||
|
||||
|
||||
#--------- CMDS ONLY example -----------
|
||||
# This is an example of a self contained cmd script
|
||||
# There are no referenced to a package or package dir.
|
||||
# This method is useful for creating user files/profiles/etc
|
||||
# at build time.
|
||||
|
||||
|
||||
PKG=""
|
||||
PKG_VERSION=""
|
||||
PKG_FILE=""
|
||||
URL=""
|
||||
MD5=""
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
PATCH1=""
|
||||
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
echo "JUST A USELESS TRACE"
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
||||
|
11
2.3/README.HLFS
Normal file
11
2.3/README.HLFS
Normal file
|
@ -0,0 +1,11 @@
|
|||
$Id$
|
||||
|
||||
|
||||
::::NOTICE::::
|
||||
|
||||
Hardened Linux From Scratch is a highly volatile project. Extreme design
|
||||
changes can occur and the build could be broken for extended periods of
|
||||
time.
|
||||
|
||||
As of July 26.2007, the Glibc-based systems builds should work.
|
||||
uClibc-based system still fail due book issues.
|
25
2.3/TODO
Normal file
25
2.3/TODO
Normal file
|
@ -0,0 +1,25 @@
|
|||
jhalfs TODO
|
||||
---------------
|
||||
|
||||
|
||||
MASTER SCRIPT
|
||||
-------------
|
||||
|
||||
- Nothing for now.
|
||||
|
||||
|
||||
xLFS MODULES
|
||||
------------
|
||||
|
||||
- To develop a new "restart" Makefile target code to can resume an stopped build
|
||||
after a host reboot, if possible.
|
||||
|
||||
|
||||
BLFS MODULE (See BLFS/TODO)
|
||||
-----------
|
||||
|
||||
|
||||
OTHERS
|
||||
------
|
||||
|
||||
- Bugs haunting and code clean-up.
|
182
2.3/blfs-tool
Executable file
182
2.3/blfs-tool
Executable file
|
@ -0,0 +1,182 @@
|
|||
#!/bin/bash
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
|
||||
# From common/common-functions
|
||||
# VT100 colors
|
||||
declare -r BLACK=$'\e[1;30m'
|
||||
declare -r DK_GRAY=$'\e[0;30m'
|
||||
|
||||
declare -r RED=$'\e[31m'
|
||||
declare -r GREEN=$'\e[32m'
|
||||
declare -r YELLOW=$'\e[33m'
|
||||
declare -r BLUE=$'\e[34m'
|
||||
declare -r MAGENTA=$'\e[35m'
|
||||
declare -r CYAN=$'\e[36m'
|
||||
declare -r WHITE=$'\e[37m'
|
||||
|
||||
declare -r OFF=$'\e[0m'
|
||||
declare -r BOLD=$'\e[1m'
|
||||
declare -r REVERSE=$'\e[7m'
|
||||
declare -r HIDDEN=$'\e[8m'
|
||||
|
||||
declare -r tab_=$'\t'
|
||||
declare -r nl_=$'\n'
|
||||
|
||||
declare -r DD_BORDER="${BOLD}==============================================================================${OFF}"
|
||||
declare -r SD_BORDER="${BOLD}------------------------------------------------------------------------------${OFF}"
|
||||
declare -r STAR_BORDER="${BOLD}******************************************************************************${OFF}"
|
||||
|
||||
# bold yellow > < pair
|
||||
declare -r R_arrow=$'\e[1;33m>\e[0m'
|
||||
declare -r L_arrow=$'\e[1;33m<\e[0m'
|
||||
|
||||
|
||||
#>>>>>>>>>>>>>>>ERROR TRAPPING >>>>>>>>>>>>>>>>>>>>
|
||||
#-----------------------#
|
||||
simple_error() { # Basic error trap.... JUST DIE
|
||||
#-----------------------#
|
||||
# If +e then disable text output
|
||||
if [[ "$-" =~ e ]]; then
|
||||
echo -e "\n${RED}ERROR:${GREEN} basic error trapped!${OFF}\n" >&2
|
||||
fi
|
||||
}
|
||||
|
||||
see_ya() {
|
||||
echo -e "\n${L_arrow}${BOLD}jhalfs 2.3${R_arrow} exit${OFF}\n"
|
||||
}
|
||||
##### Simple error TRAPS
|
||||
# ctrl-c SIGINT
|
||||
# ctrl-y
|
||||
# ctrl-z SIGTSTP
|
||||
# SIGHUP 1 HANGUP
|
||||
# SIGINT 2 INTRERRUPT FROM KEYBOARD Ctrl-C
|
||||
# SIGQUIT 3
|
||||
# SIGKILL 9 KILL
|
||||
# SIGTERM 15 TERMINATION
|
||||
# SIGSTOP 17,18,23 STOP THE PROCESS
|
||||
#####
|
||||
set -e
|
||||
trap see_ya 0
|
||||
trap simple_error ERR
|
||||
trap 'echo -e "\n\n${RED}INTERRUPT${OFF} trapped\n" && exit 2' 1 2 3 15 17 18 23
|
||||
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
|
||||
# envars not sourced from configuration file
|
||||
COMMON_DIR="common"
|
||||
VERBOSITY=1
|
||||
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading config params from <configuration>..."
|
||||
source configuration
|
||||
[[ $? > 0 ]] && echo "file:configuration did not load.." && exit 1
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading function <func_check_version.sh>..."
|
||||
source $COMMON_DIR/libs/func_check_version.sh
|
||||
[[ $? > 0 ]] && echo " function module did not load.." && exit 2
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading function <func_validate_configs.sh>..."
|
||||
source $COMMON_DIR/libs/func_validate_configs.sh
|
||||
[[ $? > 0 ]] && echo " function module did not load.." && exit 2
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
[[ $VERBOSITY > 0 ]] && echo "${SD_BORDER}${nl_}"
|
||||
|
||||
# Be sure that we have a configuration file
|
||||
[[ -z $BOOK_BLFS ]] && echo -e "\nNo BLFS configuration found. Please configure it." && exit 1
|
||||
|
||||
# Set default book version
|
||||
BRANCH_ID=${BRANCH_ID:=development}
|
||||
|
||||
# Set the SVN tree
|
||||
case $BRANCH_ID in
|
||||
development ) TREE=trunk/BOOK ;;
|
||||
*EDIT* ) echo " You forgot to set the branch or stable book version."
|
||||
echo " Please rerun make and fix the configuration."
|
||||
exit 2 ;;
|
||||
branch-* ) TREE=branches/${BRANCH_ID#branch-} ;;
|
||||
* ) TREE=tags/${BRANCH_ID} ;;
|
||||
esac
|
||||
|
||||
# Check for minimun dependencies versions
|
||||
xsltprocVer=`xsltproc -V | head -n1 `
|
||||
libxmlVer=$(echo $xsltprocVer | cut -d " " -f3)
|
||||
libxsltVer=$(echo $xsltprocVer | cut -d " " -f5)
|
||||
tidyVer=`tidy -V | cut -d " " -f9`
|
||||
|
||||
# Version numbers are packed strings not xx.yy.zz format.
|
||||
check_version "2.06.20" "${libxmlVer:0:1}.${libxmlVer:1:2}.${libxmlVer:3:2}" "LIBXML2"
|
||||
check_version "1.01.14" "${libxsltVer:0:1}.${libxsltVer:1:2}.${libxsltVer:3:2}" "LIBXSLT"
|
||||
check_version "2004" "${tidyVer}" "TIDY"
|
||||
|
||||
XML_FILE="<?xml version='1.0' encoding='ISO-8859-1'?>
|
||||
<?xml-stylesheet type='text/xsl' href='http://docbook.sourceforge.net/release/xsl/1.69.1/xhtml/docbook.xsl'?>
|
||||
<!DOCTYPE article PUBLIC '-//OASIS//DTD DocBook XML V4.5//EN'
|
||||
'http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd'>
|
||||
<article>
|
||||
<title>Test file</title>
|
||||
<sect1>
|
||||
<title>Some title</title>
|
||||
<para>Some text</para>
|
||||
</sect1>
|
||||
</article>"
|
||||
|
||||
if `echo $XML_FILE | xmllint -noout -postvalid - 2>/dev/null` ; then
|
||||
check_version "4.5" "4.5" "DocBook XML DTD"
|
||||
else
|
||||
echo "Warning: not found a working DocBook XML DTD 4.5 installation"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# if `echo $XML_FILE | xsltproc --noout - 2>/dev/null` ; then
|
||||
# check_version "1.69.1" "1.69.1" "DocBook XSL"
|
||||
# else
|
||||
# echo "Warning: not found a working DocBook XSL 1.69.1 installation"
|
||||
# exit 2
|
||||
# fi
|
||||
|
||||
echo "${SD_BORDER}${nl_}"
|
||||
|
||||
# For consistency with other books
|
||||
validate_config
|
||||
echo "${SD_BORDER}${nl_}"
|
||||
echo -n "Are you happy with these settings? yes/no (no): "
|
||||
read ANSWER
|
||||
if [ x$ANSWER != "xyes" ] ; then
|
||||
echo "${nl_}Rerun make to fix the configuration options.${nl_}"
|
||||
exit 1
|
||||
fi
|
||||
echo "${nl_}${SD_BORDER}${nl_}"
|
||||
|
||||
# Install the files
|
||||
[[ ! -d $BLFS_ROOT ]] && mkdir -p $BLFS_ROOT
|
||||
|
||||
cp -r BLFS/* $BLFS_ROOT
|
||||
cp -r menu $BLFS_ROOT
|
||||
cp $COMMON_DIR/progress_bar.sh $BLFS_ROOT
|
||||
cp README.BLFS $BLFS_ROOT
|
||||
|
||||
# Start the work
|
||||
cd $BLFS_ROOT
|
||||
|
||||
# Clean-up
|
||||
rm -rf libs/.svn
|
||||
rm -rf menu/.svn
|
||||
rm -rf menu/lxdialog/.svn
|
||||
|
||||
|
||||
# Set some harcoded envars to their proper values
|
||||
sed -i 's,blfs-xml,'$BLFS_XML',' update_book.sh libs/book.xsl
|
||||
sed -i 's,tracking-dir,'$TRACKING_DIR',' update_book.sh gen-makefile.sh
|
||||
|
||||
# Fetch book sources and create packages and meta-packages dependencies files
|
||||
if [[ -d $BLFS_XML ]] ; then
|
||||
./update_book.sh
|
||||
else
|
||||
./update_book.sh get $BLFS_XML $TREE
|
||||
fi
|
||||
|
||||
# Run the menuconfig interface
|
||||
make -B
|
||||
|
11
2.3/common/blfs-tool-deps/901-libxml2
Normal file
11
2.3/common/blfs-tool-deps/901-libxml2
Normal file
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
cd $PKGDIR
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
make install
|
||||
|
||||
exit
|
11
2.3/common/blfs-tool-deps/902-libxslt
Normal file
11
2.3/common/blfs-tool-deps/902-libxslt
Normal file
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
cd $PKGDIR
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
make install
|
||||
|
||||
exit
|
13
2.3/common/blfs-tool-deps/903-tidy
Normal file
13
2.3/common/blfs-tool-deps/903-tidy
Normal file
|
@ -0,0 +1,13 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
cd $PKGDIR
|
||||
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
make install
|
||||
make -C htmldoc install_apidocs
|
||||
|
||||
exit
|
12
2.3/common/blfs-tool-deps/904-unzip
Normal file
12
2.3/common/blfs-tool-deps/904-unzip
Normal file
|
@ -0,0 +1,12 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
cd $PKGDIR
|
||||
|
||||
patch -Np1 -i ../unzip-5.52-security_fix-1.patch
|
||||
make -f unix/Makefile LOCAL_UNZIP=-D_FILE_OFFSET_BITS=64 linux
|
||||
make prefix=/usr install
|
||||
|
||||
exit
|
108
2.3/common/blfs-tool-deps/905-docbook-xml
Normal file
108
2.3/common/blfs-tool-deps/905-docbook-xml
Normal file
|
@ -0,0 +1,108 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
|
||||
cd /sources
|
||||
mkdir docbook-xml
|
||||
cd docbook-xml
|
||||
unzip ../docbook-xml-4.5.zip
|
||||
install -v -d -m755 /usr/share/xml/docbook/xml-dtd-4.5
|
||||
install -v -d -m755 /etc/xml
|
||||
chown -R root:root .
|
||||
cp -v -af docbook.cat *.dtd ent/ *.mod \
|
||||
/usr/share/xml/docbook/xml-dtd-4.5
|
||||
if [ ! -e /etc/xml/docbook ]; then
|
||||
xmlcatalog --noout --create /etc/xml/docbook
|
||||
fi
|
||||
xmlcatalog --noout --add "public" \
|
||||
"-//OASIS//DTD DocBook XML V4.5//EN" \
|
||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "public" \
|
||||
"-//OASIS//DTD DocBook XML CALS Table Model V4.5//EN" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5/calstblx.dtd" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "public" \
|
||||
"-//OASIS//DTD XML Exchange Table Model 19990315//EN" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5/soextblx.dtd" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "public" \
|
||||
"-//OASIS//ELEMENTS DocBook XML Information Pool V4.5//EN" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5/dbpoolx.mod" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "public" \
|
||||
"-//OASIS//ELEMENTS DocBook XML Document Hierarchy V4.5//EN" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5/dbhierx.mod" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "public" \
|
||||
"-//OASIS//ELEMENTS DocBook XML HTML Tables V4.5//EN" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5/htmltblx.mod" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "public" \
|
||||
"-//OASIS//ENTITIES DocBook XML Notations V4.5//EN" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5/dbnotnx.mod" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "public" \
|
||||
"-//OASIS//ENTITIES DocBook XML Character Entities V4.5//EN" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5/dbcentx.mod" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "public" \
|
||||
"-//OASIS//ENTITIES DocBook XML Additional General Entities V4.5//EN" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5/dbgenent.mod" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "rewriteSystem" \
|
||||
"http://www.oasis-open.org/docbook/xml/4.5" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "rewriteURI" \
|
||||
"http://www.oasis-open.org/docbook/xml/4.5" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5" \
|
||||
/etc/xml/docbook
|
||||
if [ ! -e /etc/xml/catalog ]; then
|
||||
xmlcatalog --noout --create /etc/xml/catalog
|
||||
fi
|
||||
xmlcatalog --noout --add "delegatePublic" \
|
||||
"-//OASIS//ENTITIES DocBook XML" \
|
||||
"file:///etc/xml/docbook" \
|
||||
/etc/xml/catalog
|
||||
xmlcatalog --noout --add "delegatePublic" \
|
||||
"-//OASIS//DTD DocBook XML" \
|
||||
"file:///etc/xml/docbook" \
|
||||
/etc/xml/catalog
|
||||
xmlcatalog --noout --add "delegateSystem" \
|
||||
"http://www.oasis-open.org/docbook/" \
|
||||
"file:///etc/xml/docbook" \
|
||||
/etc/xml/catalog
|
||||
xmlcatalog --noout --add "delegateURI" \
|
||||
"http://www.oasis-open.org/docbook/" \
|
||||
"file:///etc/xml/docbook" \
|
||||
/etc/xml/catalog
|
||||
for DTDVERSION in 4.1.2 4.2 4.3 4.4
|
||||
do
|
||||
xmlcatalog --noout --add "public" \
|
||||
"-//OASIS//DTD DocBook XML V$DTDVERSION//EN" \
|
||||
"http://www.oasis-open.org/docbook/xml/$DTDVERSION/docbookx.dtd" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "rewriteSystem" \
|
||||
"http://www.oasis-open.org/docbook/xml/$DTDVERSION" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "rewriteURI" \
|
||||
"http://www.oasis-open.org/docbook/xml/$DTDVERSION" \
|
||||
"file:///usr/share/xml/docbook/xml-dtd-4.5" \
|
||||
/etc/xml/docbook
|
||||
xmlcatalog --noout --add "delegateSystem" \
|
||||
"http://www.oasis-open.org/docbook/xml/$DTDVERSION/" \
|
||||
"file:///etc/xml/docbook" \
|
||||
/etc/xml/catalog
|
||||
xmlcatalog --noout --add "delegateURI" \
|
||||
"http://www.oasis-open.org/docbook/xml/$DTDVERSION/" \
|
||||
"file:///etc/xml/docbook" \
|
||||
/etc/xml/catalog
|
||||
done
|
||||
cd ..
|
||||
rm -rf docbook-xml
|
||||
|
||||
exit
|
39
2.3/common/blfs-tool-deps/906-docbook-xsl
Normal file
39
2.3/common/blfs-tool-deps/906-docbook-xsl
Normal file
|
@ -0,0 +1,39 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
cd $PKGDIR
|
||||
|
||||
install -v -m755 -d /usr/share/xml/docbook/xsl-stylesheets-1.69.1
|
||||
cp -v -R VERSION common eclipse extensions fo html \
|
||||
htmlhelp images javahelp lib manpages params \
|
||||
profiling slides template website xhtml \
|
||||
/usr/share/xml/docbook/xsl-stylesheets-1.69.1
|
||||
|
||||
if [ ! -d /etc/xml ]; then install -v -m755 -d /etc/xml; fi
|
||||
if [ ! -f /etc/xml/catalog ]; then
|
||||
xmlcatalog --noout --create /etc/xml/catalog
|
||||
fi
|
||||
|
||||
xmlcatalog --noout --add "rewriteSystem" \
|
||||
"http://docbook.sourceforge.net/release/xsl/1.69.1" \
|
||||
"/usr/share/xml/docbook/xsl-stylesheets-1.69.1" \
|
||||
/etc/xml/catalog
|
||||
|
||||
xmlcatalog --noout --add "rewriteURI" \
|
||||
"http://docbook.sourceforge.net/release/xsl/1.69.1" \
|
||||
"/usr/share/xml/docbook/xsl-stylesheets-1.69.1" \
|
||||
/etc/xml/catalog
|
||||
|
||||
xmlcatalog --noout --add "rewriteSystem" \
|
||||
"http://docbook.sourceforge.net/release/xsl/current" \
|
||||
"/usr/share/xml/docbook/xsl-stylesheets-1.69.1" \
|
||||
/etc/xml/catalog
|
||||
|
||||
xmlcatalog --noout --add "rewriteURI" \
|
||||
"http://docbook.sourceforge.net/release/xsl/current" \
|
||||
"/usr/share/xml/docbook/xsl-stylesheets-1.69.1" \
|
||||
/etc/xml/catalog
|
||||
|
||||
exit
|
16
2.3/common/blfs-tool-deps/907-gpm
Normal file
16
2.3/common/blfs-tool-deps/907-gpm
Normal file
|
@ -0,0 +1,16 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
cd $PKGDIR
|
||||
|
||||
patch -Np1 -i ../gpm-1.20.1-segfault-1.patch
|
||||
patch -Np1 -i ../gpm-1.20.1-silent-1.patch
|
||||
./configure --prefix=/usr --sysconfdir=/etc
|
||||
LDFLAGS="$LDFLAGS -lm" make
|
||||
make install
|
||||
cp -v conf/gpm-root.conf /etc
|
||||
ldconfig
|
||||
|
||||
exit
|
15
2.3/common/blfs-tool-deps/908-links
Normal file
15
2.3/common/blfs-tool-deps/908-links
Normal file
|
@ -0,0 +1,15 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
cd $PKGDIR
|
||||
|
||||
./configure --prefix=/usr
|
||||
make CFLAGS="-O2 -Wno-sign-compare -Wno-pointer-sign"
|
||||
make install
|
||||
install -v -d -m755 /usr/share/doc/links-2.1pre23
|
||||
install -v -m644 doc/links_cal/* KEYS BRAILLE_HOWTO \
|
||||
/usr/share/doc/links-2.1pre23
|
||||
|
||||
exit
|
15
2.3/common/blfs-tool-deps/909-sudo
Normal file
15
2.3/common/blfs-tool-deps/909-sudo
Normal file
|
@ -0,0 +1,15 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
cd $PKGDIR
|
||||
|
||||
patch -Np1 -i ../sudo-1.6.8p12-envvar_fix-1.patch
|
||||
./configure --prefix=/usr --libexecdir=/usr/lib \
|
||||
--enable-noargs-shell --with-ignore-dot --with-all-insults \
|
||||
--enable-shell-sets-home
|
||||
make
|
||||
make install
|
||||
|
||||
exit
|
12
2.3/common/blfs-tool-deps/910-wget
Normal file
12
2.3/common/blfs-tool-deps/910-wget
Normal file
|
@ -0,0 +1,12 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
cd $PKGDIR
|
||||
|
||||
./configure --prefix=/usr --sysconfdir=/etc
|
||||
make
|
||||
make install
|
||||
|
||||
exit
|
19
2.3/common/blfs-tool-deps/911-subversion
Normal file
19
2.3/common/blfs-tool-deps/911-subversion
Normal file
|
@ -0,0 +1,19 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
cd $PKGDIR
|
||||
|
||||
./configure --prefix=/usr \
|
||||
--without-berkeley-db \
|
||||
--with-installbuilddir=/usr/lib/apr-0
|
||||
make
|
||||
make install
|
||||
rm doc/{Makefile,doxygen.conf}
|
||||
find doc -type d -exec chmod 755 {} \;
|
||||
find doc -type f -exec chmod 644 {} \;
|
||||
install -v -m755 -d /usr/share/doc/subversion-1.3.1
|
||||
cp -v -R doc/* /usr/share/doc/subversion-1.3.1
|
||||
|
||||
exit
|
109
2.3/common/common-functions
Normal file
109
2.3/common/common-functions
Normal file
|
@ -0,0 +1,109 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
|
||||
|
||||
no_empty_builddir() {
|
||||
'clear'
|
||||
cat <<- -EOF-
|
||||
${DD_BORDER}
|
||||
|
||||
${tab_}${tab_}${BOLD}${RED}W A R N I N G${OFF}
|
||||
Looks like the \$BUILDDIR directory contains subdirectories
|
||||
from a previous build.
|
||||
|
||||
Please format the partition mounted on \$BUILDDIR or set
|
||||
a different build directory before running jhalfs.
|
||||
${OFF}
|
||||
${DD_BORDER}
|
||||
-EOF-
|
||||
exit
|
||||
}
|
||||
|
||||
|
||||
#----------------------------#
|
||||
run_make() { #
|
||||
#----------------------------#
|
||||
# Test if make must be run.
|
||||
if [ "$RUNMAKE" = "y" ] ; then
|
||||
# Test to make sure we're not running the build as root
|
||||
if [ "$UID" = "0" ] ; then
|
||||
echo "You must not be logged in as root to build the system."
|
||||
exit 1
|
||||
fi
|
||||
# Build the system
|
||||
if [ -e $MKFILE ] ; then
|
||||
echo -ne "Building the system...\n"
|
||||
cd $JHALFSDIR && make
|
||||
echo -ne "done\n"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
#----------------------------#
|
||||
clean_builddir() { #
|
||||
#----------------------------#
|
||||
# Test if the clean must be done.
|
||||
if [ "${CLEAN}" = "y" ]; then
|
||||
# Test to make sure that the build directory was populated by jhalfs
|
||||
if [ ! -d $JHALFSDIR ] || [ ! -d $BUILDDIR/sources ] ; then
|
||||
echo "Looks like $BUILDDIR was not populated by a previous jhalfs run."
|
||||
exit 1
|
||||
# Test that dev filesystems are not mounted in $BUILDDIR
|
||||
elif mount | grep $BUILDDIR/dev > /dev/null ; then
|
||||
echo "Looks like kernel fylesystems are yet mounted on $BUILDDIR."
|
||||
exit 1
|
||||
else
|
||||
# Clean the build directory
|
||||
echo -n "Cleaning $BUILDDIR ..."
|
||||
# First delete proc and sys directories, if exist.
|
||||
# Both should be empty, if not be sure to exit.
|
||||
if [ -d $BUILDDIR/proc ] ; then
|
||||
sudo rmdir $BUILDDIR/proc || exit 1
|
||||
fi
|
||||
if [ -d $BUILDDIR/sys ] ; then
|
||||
sudo rmdir $BUILDDIR/sys || exit 1
|
||||
fi
|
||||
sudo rm -rf $BUILDDIR/{bin,boot,dev,etc,home,lib,media,mnt,opt,root,sbin,srv,tmp,tools,cross-tools,usr,var}
|
||||
echo "done"
|
||||
echo -n "Cleaning $JHALFSDIR ..."
|
||||
sudo rm -rf $JHALFSDIR
|
||||
echo "done"
|
||||
echo -n "Cleaning remainig extracted sources in $BUILDDIR/sources ..."
|
||||
sudo rm -rf `find $BUILDDIR/sources/* -maxdepth 0 -type d`
|
||||
echo "done"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
VERBOSITY2=$VERBOSITY
|
||||
|
||||
[[ $VERBOSITY2 > 0 ]] && echo ""
|
||||
|
||||
[[ $VERBOSITY2 > 0 ]] && echo -n "Loading <func_book_parser>..."
|
||||
source $COMMON_DIR/libs/func_book_parser
|
||||
[[ $? > 0 ]] && echo "file libs/func_book_parser did not load.." && exit 1
|
||||
[[ $VERBOSITY2 > 0 ]] && echo "OK"
|
||||
|
||||
|
||||
[[ $VERBOSITY2 > 0 ]] && echo -n "Loading <func_download_pkgs>..."
|
||||
source $COMMON_DIR/libs/func_download_pkgs
|
||||
[[ $? > 0 ]] && echo "file libs/func_download_pkgs did not load.." && exit 1
|
||||
[[ $VERBOSITY2 > 0 ]] && echo "OK"
|
||||
|
||||
|
||||
[[ $VERBOSITY2 > 0 ]] && echo -n "Loading <func_wrt_Makefile>..."
|
||||
source $COMMON_DIR/libs/func_wrt_Makefile
|
||||
[[ $? > 0 ]] && echo "file libs/func_wrt_Makefile did not load.." && exit 1
|
||||
[[ $VERBOSITY2 > 0 ]] && echo "OK"
|
||||
|
||||
|
||||
[[ $VERBOSITY2 > 0 ]] && echo -n "Loading <func_blfs_deps>..."
|
||||
source $COMMON_DIR/libs/func_blfs_deps
|
||||
[[ $? > 0 ]] && echo "file libs/func_blfs_deps did not load.." && exit 1
|
||||
[[ $VERBOSITY2 > 0 ]] && echo "OK"
|
||||
|
||||
[[ $VERBOSITY2 > 0 ]] && echo -n " ..."
|
121
2.3/common/create-sbu_du-report.sh
Executable file
121
2.3/common/create-sbu_du-report.sh
Executable file
|
@ -0,0 +1,121 @@
|
|||
#!/bin/bash
|
||||
#$Id$
|
||||
|
||||
set -e
|
||||
|
||||
LOGSDIR=$1
|
||||
VERSION=$2
|
||||
|
||||
LINE="================================================================================"
|
||||
|
||||
# Make sure that we have a directory as first argument
|
||||
[[ ! -d "$LOGSDIR" ]] && \
|
||||
echo -e "\nUSAGE: create-sbu_du-report.sh logs_directory [book_version]\n" && exit
|
||||
|
||||
# Make sure that the first argument is a jhalfs logs directory
|
||||
[[ ! -f "$LOGSDIR"/000-masterscript.log ]] && \
|
||||
echo -e "\nLooks like $LOGSDIR isn't a jhalfs logs directory.\n" && exit
|
||||
|
||||
# If this script is run manually, the book version may be unknown
|
||||
[[ -z "$VERSION" ]] && VERSION=unknown
|
||||
|
||||
# If there is iteration logs directories, copy the logs inside iteration-1
|
||||
# to the top level dir
|
||||
[[ -d "$LOGSDIR"/build_1 ]] && \
|
||||
cp $LOGSDIR/build_1/* $LOGSDIR
|
||||
|
||||
# Set the report file
|
||||
REPORT="$VERSION"-SBU_DU-$(date --iso-8601).report
|
||||
|
||||
[ -f $REPORT ] && : >$REPORT
|
||||
|
||||
# Dump generation time stamp and book version
|
||||
echo -e "\n`date`\n" > "$REPORT"
|
||||
echo -e "Book version is:\t$VERSION\n" >> "$REPORT"
|
||||
|
||||
# If found, dump jhalfs.config file in a readable format
|
||||
if [[ -f jhalfs.config ]] ; then
|
||||
echo -e "\n\tjhalfs configuration settings:\n" >> "$REPORT"
|
||||
cat jhalfs.config | sed -e '/parameters/d;s/.\[[013;]*m//g;s/</\t</;s/^\w\{1,6\}:/&\t/' >> "$REPORT"
|
||||
else
|
||||
echo -e "\nNOTE: the jhalfs configuration settings are unknown" >> "$REPORT"
|
||||
fi
|
||||
|
||||
# Dump CPU and memory info
|
||||
echo -e "\n\n\t\tCPU type:\n" >> "$REPORT"
|
||||
cat /proc/cpuinfo >> "$REPORT"
|
||||
echo -e "\n\t\tMemory info:\n" >> "$REPORT"
|
||||
free >> "$REPORT"
|
||||
|
||||
# Parse only that logs that have time data
|
||||
BUILDLOGS="`grep -l "^Totalseconds:" ${LOGSDIR}/*`"
|
||||
|
||||
# Match the first timed log to extract the SBU unit value from it
|
||||
BASELOG=`grep -l "^Totalseconds:" $LOGSDIR/* | head -n1`
|
||||
echo -e "\nUsing ${BASELOG#*[[:digit:]]-} to obtain the SBU unit value."
|
||||
SBU_UNIT=`sed -n 's/^Totalseconds:\s\([[:digit:]]*.[[:digit:]]*\)$/\1/p' $BASELOG`
|
||||
echo -e "\nThe SBU unit value is equal to $SBU_UNIT seconds.\n"
|
||||
echo -e "\n\n$LINE\n\nThe SBU unit value is equal to $SBU_UNIT seconds.\n" >> "$REPORT"
|
||||
|
||||
# Set the first value to 0 for grand totals calculation
|
||||
SBU2=0
|
||||
INSTALL2=0
|
||||
INSTALLMB2=0
|
||||
|
||||
# Start the loop
|
||||
for log in $BUILDLOGS ; do
|
||||
|
||||
# Strip the filename
|
||||
PACKAGE="${log#*[[:digit:]]*-}"
|
||||
|
||||
# Start SBU calculation
|
||||
# Build time
|
||||
TIME=`sed -n 's/^Totalseconds:\s\([[:digit:]]*.[[:digit:]]*\)$/\1/p' $log`
|
||||
SECS=`perl -e 'print ('$TIME' % '60')';`
|
||||
MINUTES=`perl -e 'printf "%.0f" , (('$TIME' - '$SECS') / '60')';`
|
||||
SBU=`perl -e 'printf "%.3f" , ('$TIME' / '$SBU_UNIT')';`
|
||||
|
||||
# Append SBU value to SBU2 for grand total
|
||||
SBU2=`perl -e 'printf "%.3f" , ('$SBU2' + '$SBU')';`
|
||||
|
||||
# Start disk usage calculation
|
||||
# Disk usage before unpacking the package
|
||||
DU1=`grep "^KB: " $log | head -n1 | cut -f1 | sed -e 's/KB: //'`
|
||||
DU1MB=`perl -e 'printf "%.3f" , ('$DU1' / '1024')';`
|
||||
# Disk usage before deleting the source and build dirs
|
||||
DU2=`grep "^KB: " $log | tail -n1 | cut -f1 | sed -e 's/KB: //'`
|
||||
DU2MB=`perl -e 'printf "%.3f" , ('$DU2' / '1024')';`
|
||||
# Calculate disk space required to do the build
|
||||
REQUIRED1=`perl -e 'print ('$DU2' - '$DU1')';`
|
||||
REQUIRED2=`perl -e 'printf "%.3f" , ('$DU2MB' - '$DU1MB')';`
|
||||
|
||||
# Append installed files disk usage to the previous entry,
|
||||
# except for the first parsed log
|
||||
if [ "$log" != "$BASELOG" ] ; then
|
||||
INSTALL=`perl -e 'print ('$DU1' - '$DU1PREV')';`
|
||||
INSTALLMB=`perl -e 'printf "%.3f" , ('$DU1MB' - '$DU1MBPREV')';`
|
||||
echo -e "Installed files disk usage:\t\t\t\t$INSTALL KB or $INSTALLMB MB\n" >> $REPORT
|
||||
# Append install values for grand total
|
||||
INSTALL2=`perl -e 'printf "%.3f" , ('$INSTALL2' + '$INSTALL')';`
|
||||
INSTALLMB2=`perl -e 'printf "%.3f" , ('$INSTALLMB2' + '$INSTALLMB')';`
|
||||
fi
|
||||
|
||||
# Set variables to calculate installed files disk usage
|
||||
DU1PREV=$DU1
|
||||
DU1MBPREV=$DU1MB
|
||||
|
||||
# Dump time and disk usage values
|
||||
echo -e "$LINE\n\t\t\t\t[$PACKAGE]\n" >> $REPORT
|
||||
echo -e "Build time is:\t\t\t\t\t\t$MINUTES minutes and $SECS seconds" >> $REPORT
|
||||
echo -e "Build time in seconds is:\t\t\t\t$TIME" >> $REPORT
|
||||
echo -e "Approximate SBU time is:\t\t\t\t$SBU" >> $REPORT
|
||||
echo -e "Disk usage before unpacking the package:\t\t$DU1 KB or $DU1MB MB" >> $REPORT
|
||||
echo -e "Disk usage before deleting the source and build dirs:\t$DU2 KB or $DU2MB MB" >> $REPORT
|
||||
echo -e "Required space to build the package:\t\t\t$REQUIRED1 KB or $REQUIRED2 MB" >> $REPORT
|
||||
|
||||
done
|
||||
|
||||
# Dump grand totals
|
||||
echo -e "\n$LINE\n\nTotal time required to build the systen:\t\t$SBU2 SBU" >> $REPORT
|
||||
# Total disk usage: including /tools but not /sources.
|
||||
echo -e "Total Installed files disk usage:\t\t\t$INSTALL2 KB or $INSTALLMB2 MB" >> $REPORT
|
198
2.3/common/libs/func_blfs_deps
Normal file
198
2.3/common/libs/func_blfs_deps
Normal file
|
@ -0,0 +1,198 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
#----------------------------# Hardcoded URLs and MD5.
|
||||
add_blfs_deps_urls() { # No easy way to extract it.
|
||||
#----------------------------# Some FTP mirrors may not work
|
||||
|
||||
local BLFS_SERVER="${SERVER}/pub/blfs/conglomeration/"
|
||||
|
||||
if [[ "${DEP_LIBXML}" = "y" ]] ; then
|
||||
echo "${LIBXML_URL} ${BLFS_SERVER}libxml2/${LIBXML_PKG} ${LIBXML_MD5}" >> urls.lst
|
||||
fi
|
||||
|
||||
if [[ "${DEP_LIBXSLT}" = "y" ]] ; then
|
||||
echo "${LIBXSLT_URL} ${BLFS_SERVER}libxslt/${LIBXSLT_PKG} ${LIBXSLT_MD5}" >> urls.lst
|
||||
fi
|
||||
|
||||
if [[ "${DEP_TIDY}" = "y" ]] ; then
|
||||
echo "${TIDY_URL} ${BLFS_SERVER}tidy/${TIDY_PKG} ${TIDY_MD5}" >> urls.lst
|
||||
fi
|
||||
|
||||
if [[ "${DEP_UNZIP}" = "y" ]] ; then
|
||||
echo "${UNZIP_URL} ${BLFS_SERVER}unzip/${UNZIP_PKG} ${UNZIP_MD5}" >> urls.lst
|
||||
echo "${UNZIP_PATCH_URL} ${BLFS_SERVER}unzip/${UNZIP_PATCH} ${UNZIP_PATCH_MD5}" >> urls.lst
|
||||
fi
|
||||
|
||||
if [[ "${DEP_DBXML}" = "y" ]] ; then
|
||||
echo "${DBXML_URL} ${BLFS_SERVER}docbook-xml/${DBXML_PKG} ${DBXML_MD5}" >> urls.lst
|
||||
fi
|
||||
|
||||
# if [[ "${DEP_DBXSL}" = "y" ]] ; then
|
||||
# echo "${DBXSL_URL} ${BLFS_SERVER}docbook-xsl/${DBXSL_PKG} ${DBXSL_MD5}" >> urls.lst
|
||||
# fi
|
||||
|
||||
if [[ "${DEP_LINKS}" = "y" ]] ; then
|
||||
echo "${LINKS_URL} ${BLFS_SERVER}links/${LINKS_PKG} ${LINKS_MD5}" >> urls.lst
|
||||
fi
|
||||
|
||||
if [[ "${DEP_SUDO}" = "y" ]] ; then
|
||||
echo "${SUDO_URL} ${BLFS_SERVER}sudo/${SUDO_PKG} ${SUDO_MD5}" >> urls.lst
|
||||
echo "${SUDO_PATCH_URL} ${BLFS_SERVER}sudo/${SUDO_PATCH} ${SUDO_PATCH_MD5}" >> urls.lst
|
||||
fi
|
||||
|
||||
if [[ "${DEP_WGET}" = "y" ]] ; then
|
||||
echo "${WGET_URL} ${BLFS_SERVER}wget/${WGET_PKG} ${WGET_MD5}" >> urls.lst
|
||||
fi
|
||||
|
||||
if [[ "${DEP_SVN}" = "y" ]] ; then
|
||||
echo "${SVN_URL} ${BLFS_SERVER}subversion/${SVN_PKG} ${SVN_MD5}" >> urls.lst
|
||||
fi
|
||||
|
||||
if [[ "${DEP_GPM}" = "y" ]] ; then
|
||||
echo "${GPM_URL} ${BLFS_SERVER}gpm/${GPM_PKG} ${GPM_MD5}" >> urls.lst
|
||||
echo "${GPM_PATCH_1_URL} ${BLFS_SERVER}gpm/${GPM_PATCH_1} ${GPM_PATCH_1_MD5}" >> urls.lst
|
||||
echo "${GPM_PATCH_2_URL} ${BLFS_SERVER}gpm/${GPM_PATCH_2} ${GPM_PATCH_2_MD5}" >> urls.lst
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
#----------------------------# Maybe there is a better way to do this, but this
|
||||
copy_blfs_deps_scripts() { # method avoid to place the test on all
|
||||
#----------------------------# $PROGNAME/master.sh scripts.
|
||||
|
||||
mkdir -p ${PROGNAME}-commands/blfs-tool-deps
|
||||
|
||||
if [[ "${DEP_LIBXML}" = "y" ]] ; then
|
||||
mv blfs-tool-deps/901-libxml2 ${PROGNAME}-commands/blfs-tool-deps
|
||||
fi
|
||||
|
||||
if [[ "${DEP_LIBXSLT}" = "y" ]] ; then
|
||||
mv blfs-tool-deps/902-libxslt ${PROGNAME}-commands/blfs-tool-deps
|
||||
fi
|
||||
|
||||
if [[ "${DEP_TIDY}" = "y" ]] ; then
|
||||
mv blfs-tool-deps/903-tidy ${PROGNAME}-commands/blfs-tool-deps
|
||||
fi
|
||||
|
||||
if [[ "${DEP_UNZIP}" = "y" ]] ; then
|
||||
mv blfs-tool-deps/904-unzip ${PROGNAME}-commands/blfs-tool-deps
|
||||
fi
|
||||
|
||||
if [[ "${DEP_DBXML}" = "y" ]] ; then
|
||||
mv blfs-tool-deps/905-docbook-xml ${PROGNAME}-commands/blfs-tool-deps
|
||||
fi
|
||||
|
||||
# if [[ "${DEP_DBXSL}" = "y" ]] ; then
|
||||
# mv blfs-tool-deps/906-docbook-xsl ${PROGNAME}-commands/blfs-tool-deps
|
||||
# fi
|
||||
|
||||
if [[ "${DEP_LINKS}" = "y" ]] ; then
|
||||
mv blfs-tool-deps/908-links ${PROGNAME}-commands/blfs-tool-deps
|
||||
fi
|
||||
|
||||
if [[ "${DEP_SUDO}" = "y" ]] ; then
|
||||
mv blfs-tool-deps/909-sudo ${PROGNAME}-commands/blfs-tool-deps
|
||||
fi
|
||||
|
||||
if [[ "${DEP_WGET}" = "y" ]] ; then
|
||||
mv blfs-tool-deps/910-wget ${PROGNAME}-commands/blfs-tool-deps
|
||||
fi
|
||||
|
||||
if [[ "${DEP_SVN}" = "y" ]] ; then
|
||||
mv blfs-tool-deps/911-subversion ${PROGNAME}-commands/blfs-tool-deps
|
||||
fi
|
||||
|
||||
if [[ "${DEP_GPM}" = "y" ]] ; then
|
||||
mv blfs-tool-deps/907-gpm ${PROGNAME}-commands/blfs-tool-deps
|
||||
fi
|
||||
|
||||
rm -rf blfs-tool-deps
|
||||
|
||||
}
|
||||
|
||||
|
||||
#----------------------------------#
|
||||
wrt_blfs_tool_targets() { #
|
||||
#----------------------------------#
|
||||
PREV=""
|
||||
|
||||
echo "${tab_}${GREEN}Processing... ${L_arrow}BLFS_TOOL ${R_arrow}"
|
||||
|
||||
for file in blfs-tool-deps/* ; do
|
||||
# Keep the script file name
|
||||
this_script=`basename $file`
|
||||
|
||||
# Grab the name of the target
|
||||
name=`echo ${this_script} | sed -e 's@[0-9]\{3\}-@@'`
|
||||
|
||||
# Find the package.
|
||||
case $name in
|
||||
tidy ) pkg_tarball=${TIDY_PKG} ;;
|
||||
unzip ) pkg_tarball=${UNZIP_PKG} ;;
|
||||
* ) pkg_tarball=$(get_package_tarball_name $name) ;;
|
||||
esac
|
||||
|
||||
# Append each name of the script files to a list (this will become
|
||||
# the names of the targets in the Makefile)
|
||||
blfs_tool="$blfs_tool ${this_script}"
|
||||
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
#
|
||||
# Drop in the name of the target on a new line, and the previous target
|
||||
# as a dependency. Also call the echo_message function.
|
||||
if [ "$PROGNAME" = "clfs2" ]; then
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
else
|
||||
CHROOT_wrt_target "${this_script}" "$PREV"
|
||||
fi
|
||||
|
||||
# Insert instructions for unpacking the package and changing directories
|
||||
# DocBook-XML is a zip, the build script will handle that.
|
||||
if [ "$PROGNAME" = "clfs2" ]; then
|
||||
[[ ! "$name" = "docbook-xml" ]] && LUSER_wrt_unpack "$pkg_tarball"
|
||||
else
|
||||
[[ ! "$name" = "docbook-xml" ]] && CHROOT_Unpack "$pkg_tarball"
|
||||
fi
|
||||
|
||||
# Run the script.
|
||||
if [ "$PROGNAME" = "clfs2" ]; then
|
||||
LUSER_wrt_RunAsUser "${file}"
|
||||
else
|
||||
CHROOT_wrt_RunAsRoot "$file"
|
||||
fi
|
||||
|
||||
# Remove the build directory(ies) except if the package build fails.
|
||||
if [ "$PROGNAME" = "clfs2" ]; then
|
||||
[[ ! "$name" = "docbook-xml" ]] && LUSER_RemoveBuildDirs "$name"
|
||||
else
|
||||
[[ ! "$name" = "docbook-xml" ]] && CHROOT_wrt_RemoveBuildDirs "$name"
|
||||
fi
|
||||
|
||||
# Touch the tracking file.
|
||||
case $name in
|
||||
tidy ) pkg_ver=html-tidy-cvs_20070326 ;;
|
||||
unzip ) pkg_ver=unzip-5.52 ;;
|
||||
* ) pkg_ver=$(echo $pkg_tarball | sed -e 's/.tar.*//;s/.tgz//;s/.zip//') ;;
|
||||
esac
|
||||
if [ "$PROGNAME" = "clfs2" ]; then
|
||||
echo -e "\t@touch \$(MOUNT_PT)$TRACKING_DIR/$pkg_ver" >> $MKFILE.tmp
|
||||
else
|
||||
echo -e "\t@touch $TRACKING_DIR/$pkg_ver" >> $MKFILE.tmp
|
||||
fi
|
||||
|
||||
# Include a touch of the target name so make can check
|
||||
# if it's already been made.
|
||||
wrt_touch
|
||||
#
|
||||
#--------------------------------------------------------------------#
|
||||
# >>>>>>>> END OF Makefile ENTRY <<<<<<<< #
|
||||
#--------------------------------------------------------------------#
|
||||
|
||||
# Keep the script file name for Makefile dependencies.
|
||||
PREV=${this_script}
|
||||
done
|
||||
}
|
216
2.3/common/libs/func_book_parser
Normal file
216
2.3/common/libs/func_book_parser
Normal file
|
@ -0,0 +1,216 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
#----------------------------#
|
||||
get_book() { #
|
||||
#----------------------------#
|
||||
cd $JHALFSDIR
|
||||
|
||||
if [ -z $WORKING_COPY ] ; then
|
||||
# Check for Subversion instead of just letting the script hit 'svn' and fail.
|
||||
test `type -p svn` || eval "echo \"This feature requires Subversion.\"
|
||||
exit 1"
|
||||
echo -n "Downloading the $PROGNAME document, $LFSVRS version... "
|
||||
|
||||
case $PROGNAME in
|
||||
lfs) svn_root="LFS" ;;
|
||||
hlfs) svn_root="HLFS" ;;
|
||||
clfs) svn_root="cross-lfs" ;;
|
||||
clfs2) svn_root="cross-lfs" ;;
|
||||
clfs3) svn_root="cross-lfs" ;;
|
||||
*) echo "BOOK not defined in function <get_book>"
|
||||
exit 1 ;;
|
||||
esac
|
||||
# Grab a fresh book if it's missing, otherwise, update it from the
|
||||
# repo. If we've already extracted the commands, move on to getting the
|
||||
# sources.
|
||||
if [ -d ${PROGNAME}-$LFSVRS ] ; then
|
||||
cd ${PROGNAME}-$LFSVRS
|
||||
if LC_ALL=C svn up | grep -q At && \
|
||||
test -d $JHALFSDIR/${PROGNAME}-commands && \
|
||||
test -f $JHALFSDIR/pkg_tarball_list ; then
|
||||
# Set the canonical book version
|
||||
echo -ne "done\n"
|
||||
cd $JHALFSDIR
|
||||
case $PROGNAME in
|
||||
clfs | clfs2 | clfs3 )
|
||||
VERSION=$(xmllint --noent $BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
|
||||
*)
|
||||
VERSION=$(xmllint --noent $BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
|
||||
esac
|
||||
get_sources
|
||||
else
|
||||
echo -ne "done\n"
|
||||
extract_commands
|
||||
fi
|
||||
else
|
||||
svn co $SVN/${svn_root}/${TREE} ${PROGNAME}-$LFSVRS >>$LOGDIR/$LOG 2>&1
|
||||
echo -ne "done\n"
|
||||
extract_commands
|
||||
fi
|
||||
|
||||
else
|
||||
echo -ne "Using $BOOK as book's sources ...\n"
|
||||
extract_commands
|
||||
fi
|
||||
echo -ne " Document version ${L_arrow}${BOLD}${VERSION}${R_arrow}\n"
|
||||
}
|
||||
|
||||
#----------------------------#
|
||||
extract_commands() { #
|
||||
#----------------------------#
|
||||
|
||||
# Check for libxslt instead of just letting the script hit 'xsltproc' and fail.
|
||||
test `type -p xsltproc` || eval "echo \"This feature requires libxslt.\"
|
||||
exit 1"
|
||||
|
||||
cd $JHALFSDIR
|
||||
case $PROGNAME in
|
||||
clfs | clfs2 | clfs3 )
|
||||
VERSION=$(xmllint --noent $BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
|
||||
*)
|
||||
VERSION=$(xmllint --noent $BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
|
||||
esac
|
||||
|
||||
# Start clean
|
||||
if [ -d ${PROGNAME}-commands ]; then
|
||||
rm -rf ${PROGNAME}-commands
|
||||
mkdir -v ${PROGNAME}-commands
|
||||
fi
|
||||
echo -n "Extracting commands for"
|
||||
|
||||
# Dump the commands in shell script form from the HLFS book.
|
||||
case ${PROGNAME} in
|
||||
clfs)
|
||||
echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture... "
|
||||
xsltproc --nonet \
|
||||
--xinclude \
|
||||
--stringparam method $METHOD \
|
||||
--stringparam testsuite $TEST \
|
||||
--stringparam bomb-testsuite $BOMB_TEST \
|
||||
--stringparam vim-lang $VIMLANG \
|
||||
--stringparam timezone $TIMEZONE \
|
||||
--stringparam page $PAGE \
|
||||
--stringparam lang $LANG \
|
||||
--stringparam sparc $SPARC64_PROC \
|
||||
-o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
|
||||
;;
|
||||
|
||||
clfs2)
|
||||
echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture... "
|
||||
xsltproc --nonet \
|
||||
--xinclude \
|
||||
--stringparam vim-lang $VIMLANG \
|
||||
--stringparam timezone $TIMEZONE \
|
||||
--stringparam page $PAGE \
|
||||
--stringparam lang $LANG \
|
||||
-o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
|
||||
;;
|
||||
|
||||
clfs3)
|
||||
echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture... "
|
||||
xsltproc --nonet \
|
||||
--xinclude \
|
||||
--stringparam endian x$ENDIAN \
|
||||
--stringparam timezone $TIMEZONE \
|
||||
--stringparam page $PAGE \
|
||||
--stringparam lang $LANG \
|
||||
-o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
|
||||
;;
|
||||
|
||||
hlfs)
|
||||
echo -n " ${L_arrow}${BOLD}$MODEL + $KERNEL${R_arrow} HLFS flavour... "
|
||||
xsltproc --nonet \
|
||||
--xinclude \
|
||||
--stringparam model $MODEL \
|
||||
--stringparam kernel $KERNEL \
|
||||
--stringparam testsuite $TEST \
|
||||
--stringparam bomb-testsuite $BOMB_TEST \
|
||||
--stringparam features x$SSP$ASLR$PAX$HARDENED_TMP$WARNINGS$MISC$BLOWFISH \
|
||||
--stringparam timezone $TIMEZONE \
|
||||
--stringparam page $PAGE \
|
||||
--stringparam lang $LANG \
|
||||
--stringparam grsecurity_host $GRSECURITY_HOST \
|
||||
-o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
|
||||
;;
|
||||
lfs)
|
||||
echo -n " ${L_arrow}${BOLD}LFS${R_arrow} build... "
|
||||
xsltproc --nonet \
|
||||
--xinclude \
|
||||
--stringparam testsuite $TEST \
|
||||
--stringparam bomb-testsuite $BOMB_TEST \
|
||||
--stringparam vim-lang $VIMLANG \
|
||||
--stringparam timezone $TIMEZONE \
|
||||
--stringparam page $PAGE \
|
||||
--stringparam lang $LANG \
|
||||
-o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
|
||||
;;
|
||||
*) echo -n " ${L_arrow}${BOLD}${PROGNAME}${R_arrow} book invalid, terminate build... "
|
||||
exit 1 ;;
|
||||
esac
|
||||
|
||||
[[ "${BLFS_TOOL}" = "y" ]] && copy_blfs_deps_scripts
|
||||
|
||||
echo "done"
|
||||
|
||||
# Make the scripts executable.
|
||||
chmod -R +x $JHALFSDIR/${PROGNAME}-commands
|
||||
|
||||
# Create the packages file. We need it for proper Makefile creation
|
||||
create_package_list
|
||||
|
||||
# Done. Moving on...
|
||||
get_sources
|
||||
|
||||
}
|
||||
|
||||
#----------------------------#
|
||||
create_package_list() { #
|
||||
#----------------------------#
|
||||
|
||||
# Create the packages file. We need it for proper Makefile creation
|
||||
rm -f pkg_tarball_list
|
||||
echo -n "Creating <${PROGNAME}> list of tarball names for $BOOK"
|
||||
if [ ! -z $ARCH ] ; then echo -n " $ARCH" ; fi
|
||||
echo -n "... "
|
||||
case ${PROGNAME} in
|
||||
clfs | clfs2 | clfs3 )
|
||||
xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
|
||||
$BOOK/materials/${ARCH}-chapter.xml >>$LOGDIR/$LOG 2>&1
|
||||
;;
|
||||
hlfs)
|
||||
xsltproc --nonet --xinclude \
|
||||
--stringparam model $MODEL \
|
||||
--stringparam kernel $KERNEL \
|
||||
-o pkg_tarball_list packages.xsl \
|
||||
$BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
|
||||
;;
|
||||
lfs)
|
||||
xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
|
||||
$BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ "${BLFS_TOOL}" = "y" ]] ; then
|
||||
(
|
||||
cat << EOF
|
||||
$LIBXML_PKG
|
||||
$LIBXSLT_PKG
|
||||
$TIDY_PKG
|
||||
$UNZIP_PKG
|
||||
$DBXML_PKG
|
||||
$DBXSL_PKG
|
||||
$LINKS_PKG
|
||||
$SUDO_PKG
|
||||
$WGET_PKG
|
||||
$SVN_PKG
|
||||
$GPM_PKG
|
||||
EOF
|
||||
) >> pkg_tarball_list
|
||||
fi
|
||||
|
||||
echo "done"
|
||||
|
||||
}
|
||||
|
163
2.3/common/libs/func_check_version.sh
Normal file
163
2.3/common/libs/func_check_version.sh
Normal file
|
@ -0,0 +1,163 @@
|
|||
# $Id$
|
||||
|
||||
check_version() {
|
||||
: <<inline_doc
|
||||
Tests for a minimum version level. Compares to version numbers and forces an
|
||||
exit if minimum level not met.
|
||||
NOTE: This test will fail on versions containing alpha chars. ie. jpeg 6b
|
||||
|
||||
usage: check_version "2.6.2" "`uname -r`" "KERNEL"
|
||||
check_version "3.0" "$BASH_VERSION" "BASH"
|
||||
check_version "3.0" "`gcc -dumpversion`" "GCC"
|
||||
|
||||
input vars: $1=min acceptable version
|
||||
$2=version to check
|
||||
$3=app name
|
||||
externals: --
|
||||
modifies: --
|
||||
returns: nothing
|
||||
on error: write text to console and dies
|
||||
on success: write text to console and returns
|
||||
inline_doc
|
||||
|
||||
declare -i major minor revision change
|
||||
declare -i ref_major ref_minor ref_revision ref_change
|
||||
declare -r spaceSTR=" "
|
||||
|
||||
ref_version=$1
|
||||
tst_version=$2
|
||||
TXT=$3
|
||||
|
||||
# This saves us the save/restore hassle of the system IFS value
|
||||
local IFS
|
||||
|
||||
write_error_and_die() {
|
||||
echo -e "\n\t\t$TXT version -->${tst_version}<-- is too old.
|
||||
This script requires ${ref_version} or greater\n"
|
||||
# Ask the user instead of bomb, to make happy that packages which version
|
||||
# ouput don't follow our expectations
|
||||
echo "If you are sure that you have instaled a proper version of ${BOLD}$TXT${OFF}"
|
||||
echo "but jhalfs has failed to detect it, press 'c' and 'ENTER' keys to continue,"
|
||||
echo -n "otherwise press 'ENTER' key to stop jhalfs. "
|
||||
read ANSWER
|
||||
if [ x$ANSWER != "xc" ] ; then
|
||||
echo "${nl_}Please, install a proper $TXT version.${nl_}"
|
||||
exit 1
|
||||
else
|
||||
minor=$ref_minor
|
||||
revision=$ref_revision
|
||||
fi
|
||||
}
|
||||
|
||||
echo -ne "${TXT}${dotSTR:${#TXT}} ${L_arrow}${BOLD}${tst_version}${OFF}${R_arrow}"
|
||||
|
||||
# echo -ne "$TXT:\t${L_arrow}${BOLD}${tst_version}${OFF}${R_arrow}"
|
||||
IFS=".-(pa" # Split up w.x.y.z as well as w.x.y-rc (catch release candidates)
|
||||
set -- $ref_version # set postional parameters to minimum ver values
|
||||
ref_major=$1; ref_minor=$2; ref_revision=$3
|
||||
#
|
||||
set -- $tst_version # Set postional parameters to test version values
|
||||
major=$1; minor=$2; revision=$3
|
||||
#
|
||||
# Compare against minimum acceptable version..
|
||||
(( major > ref_major )) && echo " ${spaceSTR:${#tst_version}}${GREEN}OK${OFF}" && return
|
||||
(( major < ref_major )) && write_error_and_die
|
||||
# major=ref_major
|
||||
(( minor < ref_minor )) && write_error_and_die
|
||||
(( minor > ref_minor )) && echo " ${spaceSTR:${#tst_version}}${GREEN}OK${OFF}" && return
|
||||
# minor=ref_minor
|
||||
(( revision >= ref_revision )) && echo " ${spaceSTR:${#tst_version}}${GREEN}OK${OFF}" && return
|
||||
|
||||
# oops.. write error msg and die
|
||||
write_error_and_die
|
||||
}
|
||||
# local -r PARAM_VALS='${config_param}${dotSTR:${#config_param}} ${L_arrow}${BOLD}${!config_param}${OFF}${R_arrow}'
|
||||
|
||||
#----------------------------#
|
||||
check_prerequisites() { #
|
||||
#----------------------------#
|
||||
|
||||
# LFS/HLFS/CLFS prerequisites
|
||||
check_version "2.6.2" "`uname -r`" "KERNEL"
|
||||
check_version "3.0" "$BASH_VERSION" "BASH"
|
||||
check_version "3.0.1" "`gcc -dumpversion`" "GCC"
|
||||
libcVer="`/lib/libc.so.6 | head -n1`"
|
||||
libcVer="${libcVer##*version }"
|
||||
check_version "2.2.5" ${libcVer%%,*} "GLIBC"
|
||||
check_version "2.12" "$(ld --version | head -n1 | cut -d" " -f4)" "BINUTILS"
|
||||
check_version "1.15" "$(tar --version | head -n1 | cut -d" " -f4)" "TAR"
|
||||
bzip2Ver="$(bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f8)"
|
||||
check_version "1.0.2" "${bzip2Ver%%,*}" "BZIP2"
|
||||
check_version "1.875" "$(bison --version | head -n1 | cut -d" " -f4)" "BISON"
|
||||
check_version "5.0" "$(chown --version | head -n1 | cut -d")" -f2)" "COREUTILS"
|
||||
check_version "2.8" "$(diff --version | head -n1 | cut -d" " -f4)" "DIFF"
|
||||
check_version "4.1.20" "$(find --version | head -n1 | cut -d" " -f4)" "FIND"
|
||||
check_version "3.0" "$(gawk --version | head -n1 | cut -d" " -f3)" "GAWK"
|
||||
check_version "2.5" "$(grep --version | head -n1 | cut -d" " -f4)" "GREP"
|
||||
check_version "1.2.4" "$(gzip --version 2>&1 | head -n1 | cut -d" " -f2)" "GZIP"
|
||||
check_version "3.79.1" "$(make --version | head -n1 | cut -d " " -f3 | cut -c1-4)" "MAKE"
|
||||
check_version "2.5.4" "$(patch --version | head -n1 | cut -d" " -f2)" "PATCH"
|
||||
check_version "3.0.2" "$(sed --version | head -n1 | cut -d" " -f4)" "SED"
|
||||
|
||||
# Check for minimum sudo version
|
||||
SUDO_LOC="$(whereis -b sudo | cut -d" " -f2)"
|
||||
if [ -x $SUDO_LOC ]; then
|
||||
sudoVer="$(sudo -V | head -n1 | cut -d" " -f3)"
|
||||
check_version "1.6.8" "${sudoVer}" "SUDO"
|
||||
else
|
||||
echo "${nl_}\"${RED}sudo${OFF}\" ${BOLD}must be installed on your system for jhalfs to run"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check for minimum libxml2 and libxslt versions
|
||||
xsltprocVer=$(xsltproc -V | head -n1 )
|
||||
libxmlVer=$(echo $xsltprocVer | cut -d " " -f3)
|
||||
libxsltVer=$(echo $xsltprocVer | cut -d " " -f5)
|
||||
|
||||
# Version numbers are packed strings not xx.yy.zz format.
|
||||
check_version "2.06.20" "${libxmlVer:0:1}.${libxmlVer:1:2}.${libxmlVer:3:2}" "LIBXML2"
|
||||
check_version "1.01.14" "${libxsltVer:0:1}.${libxsltVer:1:2}.${libxsltVer:3:2}" "LIBXSLT"
|
||||
|
||||
# The next versions checks are required only when BLFS_TOOL is set and
|
||||
# this dependencies has not be selected for installation
|
||||
if [[ "$BLFS_TOOL" = "y" ]] ; then
|
||||
|
||||
if [[ -z "$DEP_TIDY" ]] ; then
|
||||
tidyVer=$(tidy -V | cut -d " " -f9)
|
||||
check_version "2004" "${tidyVer}" "TIDY"
|
||||
fi
|
||||
|
||||
# Check if the proper DocBook-XML-DTD and DocBook-XSL are correctly installed
|
||||
XML_FILE="<?xml version='1.0' encoding='ISO-8859-1'?>
|
||||
<?xml-stylesheet type='text/xsl' href='http://docbook.sourceforge.net/release/xsl/1.69.1/xhtml/docbook.xsl'?>
|
||||
<!DOCTYPE article PUBLIC '-//OASIS//DTD DocBook XML V4.5//EN'
|
||||
'http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd'>
|
||||
<article>
|
||||
<title>Test file</title>
|
||||
<sect1>
|
||||
<title>Some title</title>
|
||||
<para>Some text</para>
|
||||
</sect1>
|
||||
</article>"
|
||||
|
||||
if [[ -z "$DEP_DBXML" ]] ; then
|
||||
if `echo $XML_FILE | xmllint -noout -postvalid - 2>/dev/null` ; then
|
||||
check_version "4.5" "4.5" "DocBook XML DTD"
|
||||
else
|
||||
echo "Warning: not found a working DocBook XML DTD 4.5 installation"
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
|
||||
# if [[ -z "$DEP_DBXSL" ]] ; then
|
||||
# if `echo $XML_FILE | xsltproc --noout - 2>/dev/null` ; then
|
||||
# check_version "1.69.1" "1.69.1" "DocBook XSL"
|
||||
# else
|
||||
# echo "Warning: not found a working DocBook XSL 1.69.1 installation"
|
||||
# exit 2
|
||||
# fi
|
||||
# fi
|
||||
|
||||
fi # end BLFS_TOOL=Y
|
||||
|
||||
}
|
139
2.3/common/libs/func_compare.sh
Normal file
139
2.3/common/libs/func_compare.sh
Normal file
|
@ -0,0 +1,139 @@
|
|||
# $Id$
|
||||
|
||||
#----------------------------------#
|
||||
wrt_compare_targets() { #
|
||||
#----------------------------------#
|
||||
|
||||
for ((N=1; N <= ITERATIONS ; N++)) ; do # Double parentheses,
|
||||
# and "ITERATIONS" with no "$".
|
||||
ITERATION=iteration-$N
|
||||
if [ "$N" != "1" ] ; then
|
||||
wrt_system_build "$N" "$PREV_IT"
|
||||
fi
|
||||
this_script=$ITERATION
|
||||
CHROOT_wrt_target "$ITERATION" "$PREV"
|
||||
wrt_compare_work "$ITERATION" "$PREV_IT"
|
||||
wrt_logs "$N"
|
||||
wrt_touch
|
||||
PREV_IT=$ITERATION
|
||||
PREV=$ITERATION
|
||||
done
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
wrt_system_build() { #
|
||||
#----------------------------------#
|
||||
local RUN=$1
|
||||
local PREV_IT=$2
|
||||
|
||||
if [[ "$PROGNAME" = "clfs" ]] ; then
|
||||
final_system_Makefiles $RUN
|
||||
else
|
||||
chapter6_Makefiles $RUN
|
||||
fi
|
||||
|
||||
if [[ "$PROGNAME" = "clfs" ]] ; then
|
||||
basicsystem="$basicsystem $PREV_IT $system_build"
|
||||
else
|
||||
chapter6="$chapter6 $PREV_IT $system_build"
|
||||
fi
|
||||
|
||||
if [[ "$RUN" = "$ITERATIONS" ]] ; then
|
||||
if [[ "$PROGNAME" = "clfs" ]] ; then
|
||||
basicsystem="$basicsystem iteration-$RUN"
|
||||
else
|
||||
chapter6="$chapter6 iteration-$RUN"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
wrt_compare_work() { #
|
||||
#----------------------------------#
|
||||
local ITERATION=$1
|
||||
local PREV_IT=$2
|
||||
local PRUNEPATH="/dev /home /${SCRIPT_ROOT} /lost+found /media /mnt /opt /proc \
|
||||
/sources /root /srv /sys /tmp /tools /usr/local /usr/src"
|
||||
|
||||
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 && \
|
||||
(
|
||||
cat << EOF
|
||||
@extras/do_copy_files "$PRUNEPATH" $ROOT_DIR $DEST_ICA/$ITERATION >>logs/\$@ 2>&1 && \\
|
||||
extras/do_ica_prep $DEST_ICA/$ITERATION >>logs/\$@ 2>&1
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
if [[ "$ITERATION" != "iteration-1" ]] ; then
|
||||
wrt_do_ica_work "$PREV_IT" "$ITERATION" "$DEST_ICA"
|
||||
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
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
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() { #
|
||||
#----------------------------------#
|
||||
local build=build_$1
|
||||
local file
|
||||
|
||||
(
|
||||
cat << EOF
|
||||
@cd logs && \\
|
||||
mkdir $build && \\
|
||||
mv -f ${system_build} $build && \\
|
||||
if [ ! $build = build_1 ] ; then \\
|
||||
cd $build && \\
|
||||
for file in \`ls .\` ; do \\
|
||||
mv -f \$\$file \`echo \$\$file | sed -e 's,-$build,,'\` ; \\
|
||||
done ; \\
|
||||
fi ;
|
||||
@cd /\$(SCRIPT_ROOT)
|
||||
@if [ -d test-logs ] ; then \\
|
||||
cd test-logs && \\
|
||||
mkdir $build && \\
|
||||
mv -f ${system_build} $build && \\
|
||||
if [ ! $build = build_1 ] ; then \\
|
||||
cd $build && \\
|
||||
for file in \`ls .\` ; do \\
|
||||
mv -f \$\$file \`echo \$\$file | sed -e 's,-$build,,'\` ; \\
|
||||
done ; \\
|
||||
fi ; \\
|
||||
cd /\$(SCRIPT_ROOT) ; \\
|
||||
fi ;
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
118
2.3/common/libs/func_custom_pkgs
Normal file
118
2.3/common/libs/func_custom_pkgs
Normal file
|
@ -0,0 +1,118 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
#----------------------------------#
|
||||
wrt_CustomTools_target() { # Add any users supplied scripts
|
||||
#----------------------------------#
|
||||
PREV=""
|
||||
|
||||
echo " Adding custom packages... ${BOLD}START${OFF}"
|
||||
|
||||
# Create the custom_tools scripts directory
|
||||
mkdir -p custom-tools
|
||||
|
||||
for file in $JHALFSDIR/custom-commands/*; do
|
||||
if [[ `basename ${file}` = "*" ]]; then
|
||||
break
|
||||
fi
|
||||
source $file
|
||||
this_script=$(basename ${file})
|
||||
echo "$tab_${GREEN}Adding${OFF} ${this_script}"
|
||||
|
||||
# Create a Makefile entry
|
||||
if [[ "x${PKG}" = "x" ]]; then
|
||||
# Create an entry for a self contained cmd script that does not
|
||||
# reference a package tarball
|
||||
case $PROGNAME in
|
||||
clfs2 | clfs3 )
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
LUSER_wrt_RunAsUser "custom-tools/${this_script}"
|
||||
;;
|
||||
*)
|
||||
CHROOT_wrt_target "${this_script}" "$PREV"
|
||||
CHROOT_wrt_RunAsRoot "custom-tools/${this_script}"
|
||||
;;
|
||||
esac
|
||||
wrt_touch
|
||||
|
||||
# Create the build script file
|
||||
( cat <<- xEOFx
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
`cat tmp`
|
||||
exit
|
||||
xEOFx
|
||||
) > custom-tools/${this_script}
|
||||
|
||||
else
|
||||
# Create an entry for package
|
||||
case $PROGNAME in
|
||||
clfs2 | clfs3 )
|
||||
LUSER_wrt_target "${this_script}" "$PREV"
|
||||
LUSER_wrt_unpack "${PKG_FILE}"
|
||||
LUSER_wrt_RunAsUser "custom-tools/${this_script}"
|
||||
LUSER_RemoveBuildDirs "${PKG}"
|
||||
echo -e "\t@touch \$(MOUNT_PT)$TRACKING_DIR/${PKG}-${PKG_VERSION}" >> $MKFILE.tmp
|
||||
;;
|
||||
*)
|
||||
CHROOT_wrt_target "${this_script}" "$PREV"
|
||||
CHROOT_Unpack "${PKG_FILE}"
|
||||
CHROOT_wrt_RunAsRoot "custom-tools/${this_script}"
|
||||
CHROOT_wrt_RemoveBuildDirs "${PKG}"
|
||||
echo -e "\t@touch $TRACKING_DIR/${PKG}-${PKG_VERSION}" >> $MKFILE.tmp
|
||||
;;
|
||||
esac
|
||||
wrt_touch
|
||||
|
||||
# Create the build script file
|
||||
( cat <<- xEOFx
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
cd \$PKGDIR
|
||||
`cat tmp`
|
||||
exit
|
||||
xEOFx
|
||||
) > custom-tools/$this_script
|
||||
fi
|
||||
|
||||
rm -f tmp
|
||||
PREV=$this_script
|
||||
custom_list="${custom_list} ${this_script}"
|
||||
done
|
||||
|
||||
# Make the scripts executable.
|
||||
chmod +x custom-tools/*
|
||||
|
||||
echo " Adding custom packages... ${BOLD}DONE${OFF}"
|
||||
}
|
||||
|
||||
|
||||
#----------------------------------#
|
||||
add_CustomToolsURLS() { # Add any users supplied scripts URL information
|
||||
#----------------------------------#
|
||||
local BLFS_SERVER="${SERVER}/pub/blfs/conglomeration/"
|
||||
local this_script
|
||||
local URL PKG PKG_VERSION PKG_FILE MD5
|
||||
|
||||
> urls.lst.tmp
|
||||
for this_script in $JHALFSDIR/custom-commands/*; do
|
||||
if [[ `basename ${this_script}` = "*" ]]; then
|
||||
CUSTOM_TOOLS="n"
|
||||
break
|
||||
fi
|
||||
source $this_script
|
||||
# A cmd only script had no PKG defined
|
||||
[[ "x${PKG}" = "x" ]] && continue
|
||||
|
||||
echo "${URL} ${BLFS_SERVER}${PKG}/${PKG_FILE} ${MD5}" >> urls.lst.tmp
|
||||
# Add any patches..
|
||||
for PATCH in PATCH{1..10}; do
|
||||
[[ -n ${!PATCH} ]] && echo "dummy-url ${!PATCH}" >> urls.lst.tmp
|
||||
done
|
||||
done
|
||||
cat urls.lst.tmp >> $BUILDDIR/sources/urls.lst
|
||||
rm urls.lst.tmp
|
||||
}
|
195
2.3/common/libs/func_download_pkgs
Normal file
195
2.3/common/libs/func_download_pkgs
Normal file
|
@ -0,0 +1,195 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
|
||||
#----------------------------#
|
||||
get_sources() { # Download file, write name to MISSING_FILES.DMP if an error
|
||||
#----------------------------#
|
||||
local saveIFS=$IFS
|
||||
local IFS line URL1 URL2 FILE BOOKMD5 MD5 HAVEMD5 fromARCHIVE
|
||||
|
||||
# Test if the packages must be downloaded
|
||||
[ ! "$GETPKG" = "y" ] && return
|
||||
|
||||
gs_wrt_message(){
|
||||
echo "${RED}$1${OFF}"
|
||||
echo "$1" >> MISSING_FILES.DMP
|
||||
}
|
||||
# Housekeeping
|
||||
[[ ! -d $BUILDDIR/sources ]] && mkdir $BUILDDIR/sources
|
||||
cd $BUILDDIR/sources
|
||||
[[ -f MD5SUMS ]] && rm MD5SUMS
|
||||
[[ -f MISSING_FILES.DMP ]] && rm MISSING_FILES.DMP
|
||||
[[ -f urls.lst ]] && rm urls.lst
|
||||
|
||||
# Generate URLs file
|
||||
create_urls
|
||||
|
||||
IFS=$'\x0A' # Modify the 'internal field separator' to break on 'LF' only
|
||||
for line in `cat urls.lst`; do
|
||||
IFS=$saveIFS # Restore the system defaults
|
||||
|
||||
# Skip some packages if they aren't needed
|
||||
case $line in
|
||||
*/tcl* | */expect* | */dejagnu* | */tree* | */gcc-testsuite* )
|
||||
[[ "$TEST" = "0" ]] && continue
|
||||
;;
|
||||
*/vim-*-lang* )
|
||||
[[ "$VIMLANG" = "0" ]] && continue
|
||||
;;
|
||||
*linux/linux-* )
|
||||
[[ -z "$CONFIG" ]] && [[ -z "$BOOT_CONFIG" ]] && \
|
||||
[[ "$GETKERNEL" = "n" ]] && continue
|
||||
;;
|
||||
esac
|
||||
|
||||
# Locations
|
||||
URL1=`echo $line | cut -d" " -f2` # Preferred URL
|
||||
URL2=`echo $line | cut -d" " -f1` # Fallback Upstream URL
|
||||
FILE=`basename $URL1` # File name
|
||||
BOOKMD5=`echo $line | cut -d" " -f3` # MD5 book value
|
||||
|
||||
# Validation pair
|
||||
MD5="$BOOKMD5 $FILE"
|
||||
HAVEMD5=1
|
||||
|
||||
set -e
|
||||
# If the file exists in the archive copy it to the
|
||||
# $BUILDDIR/sources dir. MD5SUM will be validated later.
|
||||
if [ ! -z ${SRC_ARCHIVE} ] &&
|
||||
[ -d ${SRC_ARCHIVE} ] &&
|
||||
[ -f ${SRC_ARCHIVE}/$FILE ]; then
|
||||
cp ${SRC_ARCHIVE}/$FILE .
|
||||
echo "$FILE: -- copied from $SRC_ARCHIVE"
|
||||
fromARCHIVE=1
|
||||
else
|
||||
echo "${BOLD}${YELLOW}$FILE: not found in ${SRC_ARCHIVE}${OFF}"
|
||||
fromARCHIVE=0
|
||||
# If the file does not exist yet in /sources download a fresh one
|
||||
if [ ! -f $FILE ] ; then
|
||||
if ! wget $URL1 && ! wget $URL2 ; then
|
||||
gs_wrt_message "$FILE not found in the SRC_ARCHIVE or on any server..SKIPPING"
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# IF the md5sum does not match the existing files
|
||||
if ! echo "$MD5" | md5sum -c - >/dev/null ; then
|
||||
[[ $fromARCHIVE = "1" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match SRC_ARCHIVE copy${OFF}"
|
||||
[[ $fromARCHIVE = "0" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match REMOTE copy${OFF}"
|
||||
# Remove the old file and download a new one
|
||||
rm -fv $FILE
|
||||
# Force storage in SRC_ARCHIVE
|
||||
fromARCHIVE=0;
|
||||
# Try to retrieve again the file. Servers in reverse order.
|
||||
if ! wget $URL2 && ! wget $URL1 ; then
|
||||
gs_wrt_message "$FILE not found on the servers.. SKIPPING"
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
# Validate the MD5SUM one last time
|
||||
if ! echo "$MD5" | md5sum -c - >/dev/null ; then
|
||||
gs_wrt_message "$FILE does not match MD5SUMS value"
|
||||
# Force generation of MD5SUM
|
||||
HAVEMD5=0
|
||||
fi
|
||||
|
||||
# Generate a fresh MD5SUM for this file
|
||||
if [[ "$HAVEMD5" = "0" ]] ; then
|
||||
echo "${BOLD}${YELLOW}Generating a new MD5SUM for ${OFF}$FILE"
|
||||
echo "NEW MD5SUM: $(md5sum $FILE)" >> MISSING_FILES.DMP
|
||||
fi
|
||||
|
||||
# Good or bad we write the original md5sum to a file
|
||||
echo "$MD5" >> MD5SUMS
|
||||
|
||||
# Copy the freshly downloaded file
|
||||
# to the source archive.
|
||||
if [ ! -z ${SRC_ARCHIVE} ] &&
|
||||
[ -d ${SRC_ARCHIVE} ] &&
|
||||
[ -w ${SRC_ARCHIVE} ] &&
|
||||
[ "$fromARCHIVE" = "0" ] ; then
|
||||
echo "Storing file:<$FILE> in the package archive"
|
||||
cp -f $FILE ${SRC_ARCHIVE}
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
if [[ -s MISSING_FILES.DMP ]]; then
|
||||
echo -e "\n\n${tab_}${RED} One or more files were not retrieved or have bad MD5SUMS.\n${tab_} Check ${L_arrow}$BUILDDIR/sources/MISSING_FILES.DMP${R_arrow} for names ${OFF}\n"
|
||||
# Do not allow the automatic execution of the Makefile.
|
||||
echo "${tab_}${BOLD}${RED}*** ${YELLOW}Automatic execution of the generated makefile has been inhibited. ${RED}***${OFF}${nl_}"
|
||||
RUNMAKE="n"
|
||||
fi
|
||||
}
|
||||
|
||||
#----------------------------#
|
||||
create_urls() { #
|
||||
#----------------------------#
|
||||
cd $JHALFSDIR
|
||||
|
||||
case ${PROGNAME} in
|
||||
clfs)
|
||||
echo -n "Creating CLFS <${ARCH}> specific URLs file"
|
||||
xsltproc --nonet --xinclude \
|
||||
--stringparam server $SERVER \
|
||||
--stringparam family clfs \
|
||||
-o $BUILDDIR/sources/urls.lst urls.xsl \
|
||||
$BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
|
||||
echo " ...OK"
|
||||
;;
|
||||
clfs2)
|
||||
echo -n "Creating CLFS2 <${ARCH}> specific URLs file"
|
||||
xsltproc --nonet --xinclude \
|
||||
--stringparam server $SERVER \
|
||||
--stringparam family clfs \
|
||||
-o $BUILDDIR/sources/urls.lst urls.xsl \
|
||||
$BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
|
||||
echo " ...OK"
|
||||
;;
|
||||
clfs3)
|
||||
echo -n "Creating CLFS3 <${ARCH}> specific URLs file"
|
||||
xsltproc --nonet --xinclude \
|
||||
--stringparam server $SERVER \
|
||||
--stringparam family clfs \
|
||||
-o $BUILDDIR/sources/urls.lst urls.xsl \
|
||||
$BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
|
||||
echo " ...OK"
|
||||
;;
|
||||
hlfs)
|
||||
echo -n "Creating HLFS <${MODEL}> + <${KERNEL}> specific URLs file"
|
||||
xsltproc --nonet --xinclude \
|
||||
--stringparam server $SERVER \
|
||||
--stringparam family lfs \
|
||||
--stringparam model $MODEL \
|
||||
--stringparam kernel $KERNEL \
|
||||
-o $BUILDDIR/sources/urls.lst urls.xsl \
|
||||
$BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
|
||||
echo " ...OK"
|
||||
;;
|
||||
lfs)
|
||||
echo -n "Creating LFS specific URLs file"
|
||||
xsltproc --nonet --xinclude \
|
||||
--stringparam server $SERVER \
|
||||
--stringparam family lfs \
|
||||
-o ../sources/urls.lst urls.xsl \
|
||||
$BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
|
||||
echo " ...OK"
|
||||
;;
|
||||
esac
|
||||
|
||||
cd $BUILDDIR/sources
|
||||
|
||||
if [[ "${BLFS_TOOL}" = "y" ]]; then
|
||||
add_blfs_deps_urls
|
||||
fi
|
||||
|
||||
if [[ "${CUSTOM_TOOLS}" = "y" ]]; then
|
||||
add_CustomToolsURLS
|
||||
fi
|
||||
|
||||
}
|
||||
|
211
2.3/common/libs/func_validate_configs.sh
Normal file
211
2.3/common/libs/func_validate_configs.sh
Normal file
|
@ -0,0 +1,211 @@
|
|||
# $Id$
|
||||
|
||||
declare -r dotSTR=".................."
|
||||
|
||||
|
||||
#----------------------------#
|
||||
validate_config() { # Are the config values sane (within reason)
|
||||
#----------------------------#
|
||||
: <<inline_doc
|
||||
Validates the configuration parameters. The global var PROGNAME selects the
|
||||
parameter list.
|
||||
|
||||
input vars: none
|
||||
externals: color constants
|
||||
PROGNAME (lfs,hlfs,clfs,clfs2,clfs3,blfs)
|
||||
modifies: none
|
||||
returns: nothing
|
||||
on error: write text to console and dies
|
||||
on success: write text to console and returns
|
||||
inline_doc
|
||||
|
||||
# Common settings by Config.in sections and books family
|
||||
local -r BOOK_common="BOOK CUSTOM_TOOLS"
|
||||
local -r BOOK_clfsX="ARCH TARGET"
|
||||
local -r GENERAL_common="LUSER LGROUP LHOME BUILDDIR CLEAN GETPKG SRC_ARCHIVE \
|
||||
SERVER GETKERNEL 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_common="REPORT REBUILD_MAKEFILE"
|
||||
|
||||
# BOOK Settings by book
|
||||
local -r LFS_book="$BOOK_common BLFS_TOOL"
|
||||
#local -r HLFS_added="SET_SSP SET_ASLR SET_PAX SET_HARDENED_TMP SET_WARNINGS \
|
||||
# SET_MISC SET_BLOWFISH"
|
||||
local -r HLFS_added=""
|
||||
local -r HLFS_book="$BOOK_common BLFS_TOOL MODEL KERNEL GRSECURITY_HOST $HLFS_added"
|
||||
local -r CLFS_book="$BOOK_common BLFS_TOOL METHOD $BOOK_clfsX TARGET32 BOOT_CONFIG"
|
||||
local -r CLFS2_book="$BOOK_common BLFS_TOOL $BOOK_clfsX"
|
||||
local -r CLFS3_book="$BOOK_common $BOOK_clfsX PLATFORM MIPS_LEVEL"
|
||||
|
||||
# Build Settings by book
|
||||
local -r LFS_build="$BUILD_chroot VIMLANG $BUILD_common"
|
||||
local -r HLFS_build="$BUILD_chroot $BUILD_common"
|
||||
local -r CLFS_build="$BUILD_chroot VIMLANG $BUILD_common"
|
||||
local -r CLFS2_build="STRIP VIMLANG $BUILD_common"
|
||||
local -r CLFS3_build=" $BUILD_common"
|
||||
|
||||
# Full list of books settings
|
||||
local -r lfs_PARAM_LIST="$LFS_book $GENERAL_common $LFS_build $ADVANCED_chroot $ADVANCED_common"
|
||||
local -r hlfs_PARAM_LIST="$HLFS_book $GENERAL_common $HLFS_build $ADVANCED_chroot $ADVANCED_common"
|
||||
local -r clfs_PARAM_LIST="$CLFS_book $GENERAL_common $CLFS_build $ADVANCED_chroot $ADVANCED_common"
|
||||
local -r clfs2_PARAM_LIST="$CLFS2_book $GENERAL_common $CLFS2_build $ADVANCED_common"
|
||||
local -r clfs3_PARAM_LIST="$CLFS3_book $GENERAL_common $CLFS3_build $ADVANCED_common"
|
||||
local -r blfs_PARAM_LIST="BRANCH_ID BLFS_ROOT BLFS_XML TRACKING_DIR"
|
||||
|
||||
# Additional variables (add DEP_DBXSL when required again)
|
||||
local -r blfs_tool_PARAM_LIST="BLFS_BRANCH_ID BLFS_ROOT BLFS_XML TRACKING_DIR \
|
||||
DEP_LIBXML DEP_LIBXSLT DEP_TIDY DEP_UNZIP \
|
||||
DEP_DBXML DEP_LINKS DEP_SUDO DEP_WGET \
|
||||
DEP_SVN DEP_GPM"
|
||||
local -r custom_tool_PARAM_LIST="TRACKING_DIR"
|
||||
|
||||
# Internal variables
|
||||
local -r ERROR_MSG_pt1='The variable \"${L_arrow}${config_param}${R_arrow}\" value ${L_arrow}${BOLD}${!config_param}${R_arrow} is invalid,'
|
||||
local -r ERROR_MSG_pt2='rerun make and fix your configuration settings${OFF}'
|
||||
local -r PARAM_VALS='${config_param}${dotSTR:${#config_param}} ${L_arrow}${BOLD}${!config_param}${OFF}${R_arrow}'
|
||||
|
||||
local PARAM_LIST=
|
||||
local config_param
|
||||
local validation_str
|
||||
local save_param
|
||||
|
||||
write_error_and_die() {
|
||||
echo -e "\n${DD_BORDER}"
|
||||
echo -e "`eval echo ${ERROR_MSG_pt1}`" >&2
|
||||
echo -e "`eval echo ${ERROR_MSG_pt2}`" >&2
|
||||
echo -e "${DD_BORDER}\n"
|
||||
exit 1
|
||||
}
|
||||
|
||||
validate_file() {
|
||||
# For parameters ending with a '+' failure causes a warning message only
|
||||
echo -n "`eval echo $PARAM_VALS`"
|
||||
while test $# -gt 0 ; do
|
||||
case $1 in
|
||||
# Failures caused program exit
|
||||
"-z") [[ -z "${!config_param}" ]] && echo "${tab_}<-- NO file name given" && write_error_and_die ;;
|
||||
"-e") [[ ! -e "${!config_param}" ]] && echo "${tab_}<-- file does not exist" && write_error_and_die ;;
|
||||
"-s") [[ ! -s "${!config_param}" ]] && echo "${tab_}<-- file has zero bytes" && write_error_and_die ;;
|
||||
"-r") [[ ! -r "${!config_param}" ]] && echo "${tab_}<-- no read permission " && write_error_and_die ;;
|
||||
"-w") [[ ! -w "${!config_param}" ]] && echo "${tab_}<-- no write permission" && write_error_and_die ;;
|
||||
"-x") [[ ! -x "${!config_param}" ]] && echo "${tab_}<-- file cannot be executed" && write_error_and_die ;;
|
||||
# Warning messages only
|
||||
"-z+") [[ -z "${!config_param}" ]] && echo && return ;;
|
||||
esac
|
||||
shift 1
|
||||
done
|
||||
echo
|
||||
}
|
||||
|
||||
validate_dir() {
|
||||
# For parameters ending with a '+' failure causes a warning message only
|
||||
echo -n "`eval echo $PARAM_VALS`"
|
||||
while test $# -gt 0 ; do
|
||||
case $1 in
|
||||
"-z") [[ -z "${!config_param}" ]] && echo "${tab_}NO directory name given" && write_error_and_die ;;
|
||||
"-d") [[ ! -d "${!config_param}" ]] && echo "${tab_}This is NOT a directory" && write_error_and_die ;;
|
||||
"-w") if [[ ! -w "${!config_param}" ]]; then
|
||||
echo "${nl_}${DD_BORDER}"
|
||||
echo "${tab_}${RED}You do not have ${L_arrow}write${R_arrow}${RED} access to the directory${OFF}"
|
||||
echo "${tab_}${BOLD}${!config_param}${OFF}"
|
||||
echo "${DD_BORDER}${nl_}"
|
||||
exit 1
|
||||
fi ;;
|
||||
# Warnings only
|
||||
"-w+") if [[ ! -w "${!config_param}" ]]; then
|
||||
echo "${nl_}${DD_BORDER}"
|
||||
echo "${tab_}WARNING-- You do not have ${L_arrow}write${R_arrow} access to the directory${OFF}"
|
||||
echo "${tab_} -- ${BOLD}${!config_param}${OFF}"
|
||||
echo "${DD_BORDER}"
|
||||
fi ;;
|
||||
"-z+") [[ -z "${!config_param}" ]] && echo "${tab_}<-- NO directory name given" && return
|
||||
esac
|
||||
shift 1
|
||||
done
|
||||
echo
|
||||
}
|
||||
|
||||
set +e
|
||||
PARAM_GROUP=${PROGNAME}_PARAM_LIST
|
||||
for config_param in ${!PARAM_GROUP}; do
|
||||
case $config_param in
|
||||
# Envvars that depend on other settings to be displayed
|
||||
GETKERNEL ) if [[ -z "$CONFIG" ]] && [[ -z "$BOOT_CONFIG" ]] ; then
|
||||
[[ "$GETPKG" = "y" ]] && echo -e "`eval echo $PARAM_VALS`"
|
||||
fi ;;
|
||||
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`" ;;
|
||||
MIPS_LEVEL) [[ "${ARCH}" = "mips" ]] && echo -e "`eval echo $PARAM_VALS`" ;;
|
||||
SERVER) [[ "$GETPKG" = "y" ]] && echo -e "`eval echo $PARAM_VALS`" ;;
|
||||
|
||||
# Envars that requires some validation
|
||||
LUSER) echo -e "`eval echo $PARAM_VALS`"
|
||||
[[ "${!config_param}" = "**EDIT ME**" ]] && write_error_and_die
|
||||
;;
|
||||
LGROUP) echo -e "`eval echo $PARAM_VALS`"
|
||||
[[ "${!config_param}" = "**EDIT ME**" ]] && write_error_and_die
|
||||
;;
|
||||
# BOOK validation. Very ugly, need be fixed
|
||||
BOOK) if [[ "${WORKING_COPY}" = "y" ]] ; then
|
||||
validate_dir -z -d
|
||||
else
|
||||
echo -e "`eval echo $PARAM_VALS`"
|
||||
fi
|
||||
;;
|
||||
# Validate directories, testable states:
|
||||
# fatal -z -d -w,
|
||||
# warning -z+ -w+
|
||||
SRC_ARCHIVE) [[ "$GETPKG" = "y" ]] && validate_dir -z+ -d -w+ ;;
|
||||
# The build directory/partition MUST exist and be writable by the user
|
||||
BUILDDIR) validate_dir -z -d -w
|
||||
[[ "xx x/x" =~ x${!config_param}x ]] && write_error_and_die ;;
|
||||
LHOME) validate_dir -z -d ;;
|
||||
|
||||
# Validate files, testable states:
|
||||
# fatal -z -e -s -w -x -r,
|
||||
# warning -z+
|
||||
FSTAB) validate_file -z+ -e -s ;;
|
||||
CONFIG) validate_file -z+ -e -s ;;
|
||||
BOOT_CONFIG) [[ "${METHOD}" = "boot" ]] && validate_file -z -e -s ;;
|
||||
|
||||
# Treatment of LANG parameter
|
||||
LANG ) # See it the locale value has been set
|
||||
echo -n "`eval echo $PARAM_VALS`"
|
||||
[[ -z "${!config_param}" ]] &&
|
||||
echo " -- Variable $config_param cannot be empty!" &&
|
||||
write_error_and_die
|
||||
echo
|
||||
;;
|
||||
|
||||
# BLFS params.
|
||||
BRANCH_ID | BLFS_ROOT | BLFS_XML ) echo "`eval echo $PARAM_VALS`" ;;
|
||||
TRACKING_DIR ) validate_dir -z -d -w ;;
|
||||
|
||||
# Display non-validated envars found in ${PROGNAME}_PARAM_LIST
|
||||
* ) echo -e "`eval echo $PARAM_VALS`" ;;
|
||||
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "${BLFS_TOOL}" = "y" ]] ; then
|
||||
echo "${nl_} ${BLUE}blfs-tool settings${OFF}"
|
||||
for config_param in ${blfs_tool_PARAM_LIST}; do
|
||||
echo -e "`eval echo $PARAM_VALS`"
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ "${CUSTOM_TOOLS}" = "y" ]] && [[ "${BLFS_TOOL}" = "n" ]] ; then
|
||||
for config_param in ${custom_tool_PARAM_LIST}; do
|
||||
echo -e "`eval echo $PARAM_VALS`"
|
||||
done
|
||||
fi
|
||||
|
||||
set -e
|
||||
echo "${nl_}***${BOLD}${GREEN} ${PARAM_GROUP%%_*T} config parameters look good${OFF} ***${nl_}"
|
||||
}
|
398
2.3/common/libs/func_wrt_Makefile
Normal file
398
2.3/common/libs/func_wrt_Makefile
Normal file
|
@ -0,0 +1,398 @@
|
|||
#!/bin/bash
|
||||
|
||||
# $Id$
|
||||
|
||||
#=== MAKEFILE HEADER ===
|
||||
|
||||
#----------------------------------#
|
||||
wrt_Makefile_header() { #
|
||||
#----------------------------------#
|
||||
(
|
||||
cat << EOF
|
||||
# This file is automatically generated by jhalfs
|
||||
# DO NOT EDIT THIS FILE MANUALLY
|
||||
#
|
||||
# Generated on `date "+%F %X %Z"`
|
||||
|
||||
|
||||
SHELL = /bin/bash
|
||||
|
||||
SRC = /sources
|
||||
MOUNT_PT = $BUILDDIR
|
||||
PKG_LST = $PKG_LST
|
||||
LUSER = $LUSER
|
||||
LGROUP = $LGROUP
|
||||
LHOME = $LHOME
|
||||
SCRIPT_ROOT = $SCRIPT_ROOT
|
||||
|
||||
BASEDIR = \$(MOUNT_PT)
|
||||
SRCSDIR = \$(BASEDIR)/sources
|
||||
CMDSDIR = \$(BASEDIR)/\$(SCRIPT_ROOT)/$PROGNAME-commands
|
||||
LOGDIR = \$(BASEDIR)/\$(SCRIPT_ROOT)/$LOGDIRBASE
|
||||
TESTLOGDIR = \$(BASEDIR)/\$(SCRIPT_ROOT)/$TESTLOGDIRBASE
|
||||
|
||||
crCMDSDIR = /\$(SCRIPT_ROOT)/$PROGNAME-commands
|
||||
crLOGDIR = /\$(SCRIPT_ROOT)/$LOGDIRBASE
|
||||
crTESTLOGDIR = /\$(SCRIPT_ROOT)/$TESTLOGDIRBASE
|
||||
crFILELOGDIR = /\$(SCRIPT_ROOT)/$FILELOGDIRBASE
|
||||
|
||||
SU_LUSER = su - \$(LUSER) -c
|
||||
LUSER_HOME = \$(LHOME)/\$(LUSER)
|
||||
PRT_DU = echo -e "\nKB: \`du -skx --exclude=\$(SCRIPT_ROOT) --exclude=lost+found \$(MOUNT_PT) \`\n"
|
||||
PRT_DU_CR = echo -e "\nKB: \`du -skx --exclude=\$(SCRIPT_ROOT) --exclude=lost+found / \`\n"
|
||||
TIME_MARK = \`date +%s.%N\`
|
||||
BUILD_TIME = perl -e "printf \"\nTotalseconds: %.3f\", ('\$\$end' - '\$\$start')"
|
||||
|
||||
ADD_REPORT = $REPORT
|
||||
ADD_CUSTOM_TOOLS = $CUSTOM_TOOLS
|
||||
ADD_BLFS_TOOLS = $BLFS_TOOL
|
||||
|
||||
|
||||
export PATH := \${PATH}:/usr/sbin
|
||||
|
||||
include makefile-functions
|
||||
|
||||
EOF
|
||||
) > $MKFILE
|
||||
}
|
||||
|
||||
#=======================
|
||||
|
||||
|
||||
#==== PACKAGES NAMES ===
|
||||
|
||||
#----------------------------------#
|
||||
get_package_tarball_name() { #
|
||||
#----------------------------------#
|
||||
local script_name=`echo ${1} | sed -e 's@[0-9]\{1\}-@@'`
|
||||
|
||||
# The use of 'head' is necessary to limit the return value to the FIRST match..
|
||||
# hopefully this will not cause problems.
|
||||
#
|
||||
case $script_name in
|
||||
tcl) echo $(grep "^tcl" $JHALFSDIR/pkg_tarball_list | head -n1 )
|
||||
;;
|
||||
powerpc-utils) echo $(grep "^powerpc-utils" $JHALFSDIR/pkg_tarball_list | head -n1 )
|
||||
;;
|
||||
uClibc)
|
||||
if [[ "${PROGNAME}" = "clfs3" ]]; then
|
||||
echo $(grep "^uClibc-" $JHALFSDIR/pkg_tarball_list | head -n1 )
|
||||
else
|
||||
echo $(grep "^$script_name-[[:digit:]]" $JHALFSDIR/pkg_tarball_list | head -n1 )
|
||||
fi
|
||||
;;
|
||||
linux-headers)
|
||||
if [[ "${PROGNAME}" = "lfs" ]] || [[ "${PROGNAME}" = "hlfs" ]] ; then
|
||||
# Uses kernel headers directly
|
||||
echo $(grep "^linux-[[:digit:]]" $JHALFSDIR/pkg_tarball_list | head -n1 )
|
||||
else
|
||||
# CLFS{,2,3} use massaged headers package
|
||||
echo $(grep "^linux-headers-[[:digit:]]" $JHALFSDIR/pkg_tarball_list | head -n1 )
|
||||
fi
|
||||
;;
|
||||
*) echo $(grep "^$script_name-[[:digit:]]" $JHALFSDIR/pkg_tarball_list | head -n1 )
|
||||
;;
|
||||
esac
|
||||
|
||||
}
|
||||
|
||||
#=======================
|
||||
|
||||
|
||||
#==== TARGET HEADER ====
|
||||
|
||||
#----------------------------------#
|
||||
LUSER_wrt_target() { # Create target and initialize log file
|
||||
#----------------------------------#
|
||||
local i=$1
|
||||
local PREV=$2
|
||||
(
|
||||
cat << EOF
|
||||
|
||||
$i: $PREV
|
||||
@\$(call echo_message, Building)
|
||||
@export BASHBIN=\$(SHELL) && \$(SHELL) progress_bar.sh \$@ \$\$PPID &
|
||||
@echo "\$(nl_)\`date\`\$(nl_)" >logs/\$@
|
||||
@\$(PRT_DU) >>logs/\$@
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
CHROOT_wrt_target() { # Create target and initialize log file
|
||||
#----------------------------------#
|
||||
local i=$1
|
||||
local PREV=$2
|
||||
(
|
||||
cat << EOF
|
||||
|
||||
$i: $PREV
|
||||
@\$(call echo_message, Building)
|
||||
@export BASHBIN=\$(SHELL) && \$(SHELL) progress_bar.sh \$@ \$\$PPID &
|
||||
@echo "\$(nl_)\`date\`\$(nl_)" >logs/\$@
|
||||
@\$(PRT_DU_CR) >>logs/\$@
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#=======================
|
||||
|
||||
|
||||
#======== UNPACK =======
|
||||
|
||||
#----------------------------------#
|
||||
LUSER_wrt_unpack() { # Unpack and set 'ROOT' var
|
||||
#----------------------------------#
|
||||
local FILE=$1
|
||||
local optSAVE_PREVIOUS=$2
|
||||
|
||||
if [[ "${optSAVE_PREVIOUS}" != "1" ]]; then
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call remove_existing_dirs,$FILE)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
fi
|
||||
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call unpack,$FILE)
|
||||
@\$(call get_pkg_root_LUSER)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
CHROOT_Unpack() { #
|
||||
#----------------------------------#
|
||||
local FILE=$1
|
||||
local optSAVE_PREVIOUS=$2
|
||||
|
||||
if [ "${optSAVE_PREVIOUS}" != "1" ]; then
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call remove_existing_dirs2,$FILE)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
fi
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call unpack2,$FILE)
|
||||
@\$(call get_pkg_root2)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#=======================
|
||||
|
||||
|
||||
#===== TESTS LOGS ======
|
||||
|
||||
#----------------------------------#
|
||||
LUSER_wrt_test_log() { # Initialize testsuite log file
|
||||
#----------------------------------#
|
||||
local TESTLOGFILE=$1
|
||||
(
|
||||
cat << EOF
|
||||
@echo "export TEST_LOG=\$(TESTLOGDIR)/$TESTLOGFILE" >> envars && \\
|
||||
echo "\$(nl_)\`date\`\$(nl_)" >\$(TESTLOGDIR)/\$@
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
CHROOT_wrt_test_log() { #
|
||||
#----------------------------------#
|
||||
local TESTLOGFILE=$1
|
||||
(
|
||||
cat << EOF
|
||||
@echo "export TEST_LOG=\$(crTESTLOGDIR)/$TESTLOGFILE" >> envars && \\
|
||||
echo "\$(nl_)\`date\`\$(nl_)" >test-logs/\$@
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#=======================
|
||||
|
||||
|
||||
#======== RUN AS =======
|
||||
|
||||
#----------------------------------#
|
||||
wrt_RunAsRoot() { # Some scripts must be run as root..
|
||||
#----------------------------------#
|
||||
local MOUNT_ENV
|
||||
local file=$1
|
||||
|
||||
case ${PROGNAME} in
|
||||
lfs ) MOUNT_ENV="LFS" ;;
|
||||
clfs ) MOUNT_ENV="CLFS" ;;
|
||||
clfs2 ) MOUNT_ENV="CLFS" ;;
|
||||
clfs3 ) MOUNT_ENV="CLFS" ;;
|
||||
hlfs ) MOUNT_ENV="HLFS" ;;
|
||||
*) echo "undefined progname $PROGNAME"; exit 1 ;;
|
||||
esac
|
||||
|
||||
(
|
||||
cat << EOF
|
||||
@start=\$(TIME_MARK) && \\
|
||||
export ${MOUNT_ENV}=\$(MOUNT_PT) && \\
|
||||
${PROGNAME}-commands/`dirname $file`/\$@ >>logs/\$@ 2>&1 && \\
|
||||
end=\$(TIME_MARK) && \$(BUILD_TIME) >>logs/\$@ && \\
|
||||
\$(PRT_DU) >>logs/\$@
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
LUSER_wrt_RunAsUser() { # Calculate time with perl, footer to log file
|
||||
#----------------------------------#
|
||||
local file=$1
|
||||
|
||||
(
|
||||
cat << EOF
|
||||
@start=\$(TIME_MARK) && \\
|
||||
source ~/.bashrc && \\
|
||||
\$(CMDSDIR)/`dirname $file`/\$@ >> logs/\$@ 2>&1 && \\
|
||||
end=\$(TIME_MARK) && \$(BUILD_TIME) >>logs/\$@ && \\
|
||||
\$(PRT_DU) >>logs/\$@
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
CHROOT_wrt_RunAsRoot() { #
|
||||
#----------------------------------#
|
||||
local file=$1
|
||||
(
|
||||
cat << EOF
|
||||
@start=\$(TIME_MARK) && \\
|
||||
source envars && \\
|
||||
\$(crCMDSDIR)/`dirname $file`/\$@ >>logs/\$@ 2>&1 && \\
|
||||
end=\$(TIME_MARK) && \$(BUILD_TIME) >>logs/\$@ && \\
|
||||
\$(PRT_DU_CR) >>logs/\$@
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
|
||||
}
|
||||
|
||||
#=======================
|
||||
|
||||
|
||||
#====== COPY FSTAB =====
|
||||
|
||||
#----------------------------------#
|
||||
LUSER_wrt_CopyFstab() { #
|
||||
#----------------------------------#
|
||||
(
|
||||
cat << EOF
|
||||
@start=\$(TIME_MARK) && \\
|
||||
cp -v \$(MOUNT_PT)/sources/fstab \$(MOUNT_PT)/etc/fstab >>logs/\$@ 2>&1 && \\
|
||||
end=\$(TIME_MARK) && \$(BUILD_TIME) >>logs/\$@ && \\
|
||||
\$(PRT_DU) >>logs/\$@
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
CHROOT_wrt_CopyFstab() { #
|
||||
#----------------------------------#
|
||||
(
|
||||
cat << EOF
|
||||
@start=\$(TIME_MARK) && \\
|
||||
cp -v /sources/fstab /etc/fstab >>logs/\$@ 2>&1 && \\
|
||||
end=\$(TIME_MARK) && \$(BUILD_TIME) >>logs/\$@ && \\
|
||||
\$(PRT_DU_CR) >>logs/\$@
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#=======================
|
||||
|
||||
|
||||
#==== INSTALLED FILES LOGS ====
|
||||
|
||||
#----------------------------------#
|
||||
LUSER_wrt_TouchTimestamp() { #
|
||||
#----------------------------------#
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call touch_timestamp_LUSER)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
CHROOT_wrt_TouchTimestamp() { #
|
||||
#----------------------------------#
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call touch_timestamp)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
LUSER_wrt_LogNewFiles() { #
|
||||
#----------------------------------#
|
||||
local name=$1
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call log_new_files_LUSER,$name)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
CHROOT_wrt_LogNewFiles() { #
|
||||
#----------------------------------#
|
||||
local name=$1
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call log_new_files,$name)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#=======================
|
||||
|
||||
|
||||
#==== RM BUILD DIRS ====
|
||||
|
||||
#----------------------------------#
|
||||
LUSER_RemoveBuildDirs() { #
|
||||
#----------------------------------#
|
||||
local name=$1
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call remove_build_dirs,$name)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#----------------------------------#
|
||||
CHROOT_wrt_RemoveBuildDirs() { #
|
||||
#----------------------------------#
|
||||
local name=$1
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call remove_build_dirs2,$name)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#=======================
|
||||
|
||||
|
||||
#======== TOUCH ========
|
||||
|
||||
#----------------------------------#
|
||||
wrt_touch() { #
|
||||
#----------------------------------#
|
||||
(
|
||||
cat << EOF
|
||||
@\$(call housekeeping)
|
||||
EOF
|
||||
) >> $MKFILE.tmp
|
||||
}
|
||||
|
||||
#=======================
|
242
2.3/common/makefile-functions
Normal file
242
2.3/common/makefile-functions
Normal file
|
@ -0,0 +1,242 @@
|
|||
|
||||
# $Id$
|
||||
|
||||
BOLD = "[0;1m"
|
||||
RED = "[1;31m"
|
||||
GREEN = "[0;32m"
|
||||
ORANGE = "[0;33m"
|
||||
BLUE = "[1;34m"
|
||||
WHITE = "[00m"
|
||||
YELLOW = "[1;33m"
|
||||
|
||||
OFF = "[0m"
|
||||
REVERSE = "[7m"
|
||||
|
||||
tab_ = " "
|
||||
nl_ = ""
|
||||
|
||||
#==== BUILD MESSAGES ===
|
||||
|
||||
define echo_PHASE
|
||||
@echo $(BOLD)--------------------------------------------------------------------------------
|
||||
@echo $(tab_)$(tab_)Executing $(BLUE)$(1)$(WHITE) scripts
|
||||
@echo $(BOLD)--------------------------------------------------------------------------------
|
||||
@echo $(WHITE)
|
||||
endef
|
||||
|
||||
define sh_echo_PHASE
|
||||
echo $(BOLD)--------------------------------------------------------------------------------;\
|
||||
echo $(tab_)$(tab_)Executing $(BLUE)$(1)$(WHITE) scripts; \
|
||||
echo $(BOLD)--------------------------------------------------------------------------------echo $(WHITE)
|
||||
endef
|
||||
|
||||
define echo_SU_request
|
||||
@echo $(BOLD)--------------------------------------------------------------------------------
|
||||
@echo $(BLUE)$@
|
||||
@echo $(WHITE)ROOT privilege is required to perform a number commands
|
||||
@echo sudo will request a password to all high privilege cmds to execute correctly
|
||||
endef
|
||||
|
||||
define echo_SULUSER_request
|
||||
@echo $(BOLD)--------------------------------------------------------------------------------
|
||||
@echo $(BOLD)$(BLUE)$@
|
||||
@echo $(WHITE)You are going to log into the user account $(BOLD)$(YELLOW)$(LUSER)$(OFF)
|
||||
@echo sudo requires a password
|
||||
endef
|
||||
|
||||
define echo_CHROOT_request
|
||||
@echo $(BOLD)--------------------------------------------------------------------------------
|
||||
@echo $(BOLD)$(BLUE)$@
|
||||
@echo $(WHITE)You are going to CHROOT into $(MOUNT_PT) $(BOLD)$(YELLOW)$(LUSER)$(OFF)
|
||||
@echo a password is required
|
||||
endef
|
||||
|
||||
define echo_message
|
||||
@echo $(BOLD)--------------------------------------------------------------------------------
|
||||
@echo $(BOLD)$(1) target $(BLUE)$@$(BOLD)$(WHITE)
|
||||
endef
|
||||
|
||||
#=======================
|
||||
|
||||
|
||||
#=== BUILD FUNCTIONS ===
|
||||
|
||||
define remove_existing_dirs
|
||||
@PKG_PATH=`ls -t $(SRCSDIR)/$(1) | head -n1` && \
|
||||
ROOT=`tar -tf $$PKG_PATH | head -n1 | sed -e 's@^./@@;s@/.*@@'` && \
|
||||
rm -rf $(SRCSDIR)/$$ROOT && \
|
||||
rm -rf $(SRCSDIR)/$${ROOT%-*}-build
|
||||
endef
|
||||
|
||||
define remove_existing_dirs2
|
||||
@PKG_PATH=`ls -t $(SRC)/$(1) | head -n1` && \
|
||||
ROOT=`tar -tf $$PKG_PATH | head -n1 | sed -e 's@^./@@;s@/.*@@'` && \
|
||||
rm -rf $(SRC)/$$ROOT && \
|
||||
rm -rf $(SRC)/$${ROOT%-*}-build
|
||||
endef
|
||||
|
||||
#==#
|
||||
|
||||
define unpack
|
||||
@cd $(SRCSDIR) && \
|
||||
tar -xvf `ls -t $(1) | head -n1` > $(PKG_LST)
|
||||
endef
|
||||
|
||||
define unpack2
|
||||
@cd $(SRC) && \
|
||||
tar -xvf `ls -t $(1) | head -n1` > $(PKG_LST)
|
||||
endef
|
||||
|
||||
#==#
|
||||
|
||||
define get_pkg_root
|
||||
@ROOT=`head -n1 $(SRCSDIR)/$(PKG_LST) | sed 's@^./@@;s@/.*@@'` && \
|
||||
if [ "$(1)" != "nouser" ]; then \
|
||||
echo "export PKGDIR=$(SRCSDIR)/$$ROOT" > envars; \
|
||||
chown -R $(LUSER) $(SRCSDIR)/$$ROOT; \
|
||||
else \
|
||||
echo "export PKGDIR=$(crSRCSDIR)/$$ROOT" > envars; \
|
||||
fi;
|
||||
endef
|
||||
|
||||
define get_pkg_root2
|
||||
@ROOT=`head -n1 $(SRC)/$(PKG_LST) | sed 's@^./@@;s@/.*@@'` && \
|
||||
echo "export PKGDIR=$(SRC)/$$ROOT" > envars
|
||||
endef
|
||||
|
||||
define get_pkg_root_LUSER
|
||||
@ROOT=`head -n1 $(SRCSDIR)/$(PKG_LST) | sed 's@^./@@;s@/.*@@'` && \
|
||||
echo "export PKGDIR=$(SRCSDIR)/$$ROOT" > envars
|
||||
endef
|
||||
|
||||
#==#
|
||||
|
||||
define touch_timestamp
|
||||
@touch $(SRC)/timestamp-marker && sleep 1
|
||||
endef
|
||||
|
||||
define touch_timestamp_LUSER
|
||||
@touch $(SRCSDIR)/timestamp-marker && sleep 1
|
||||
endef
|
||||
|
||||
define log_new_files
|
||||
@find / -xdev ! -path "/$(SCRIPT_ROOT)/*" ! -path "/tmp/*" ! -path "$(SRC)/*" \
|
||||
-newer $(SRC)/timestamp-marker -not -type d \
|
||||
-printf "%p\t%s\t%u:%g\t%m\t%l\n" | sort > $(crFILELOGDIR)/$(1)
|
||||
endef
|
||||
|
||||
define log_new_files_LUSER
|
||||
@find $(BASEDIR) -xdev ! -path "$(BASEDIR)/$(SCRIPT_ROOT)/*" ! -path "$(BASEDIR)/tmp/*" ! -path "$(SRCSDIR)/*" \
|
||||
-newer $(SRCSDIR)/timestamp-marker -not -type d \
|
||||
-printf "%p\t%s\t%u:%g\t%m\t%l\n" | sort > $(BASEDIR)$(crFILELOGDIR)/$(1)
|
||||
endef
|
||||
|
||||
#==@
|
||||
|
||||
define remove_build_dirs
|
||||
@ROOT=`head -n1 $(SRCSDIR)/$(PKG_LST) | sed 's@^./@@;s@/.*@@'` && \
|
||||
rm -rf $(SRCSDIR)/$$ROOT && \
|
||||
rm -rf $(SRCSDIR)/$(1)-build
|
||||
endef
|
||||
|
||||
define remove_build_dirs2
|
||||
@ROOT=`head -n1 $(SRC)/$(PKG_LST) | sed 's@^./@@;s@/.*@@'` && \
|
||||
rm -rf $(SRC)/$$ROOT && \
|
||||
rm -rf $(SRC)/$(1)-build
|
||||
endef
|
||||
|
||||
#==#
|
||||
|
||||
define housekeeping
|
||||
@touch $@ && \
|
||||
sleep .25 && \
|
||||
echo -e "\n" $(BOLD)Target $(BLUE)$@ $(WHITE)$(BOLD)OK && \
|
||||
echo --------------------------------------------------------------------------------$(WHITE) && \
|
||||
if [ "$(BREAKPOINT)" = "$@" ] ; then \
|
||||
echo $(tab_)$(RED)The build has been stopped at $(BLUE)$@ $(RED)as requested$(WHITE) ; \
|
||||
false ; \
|
||||
fi
|
||||
endef
|
||||
|
||||
#=======================
|
||||
|
||||
|
||||
#==== FINAL MESSAGES ===
|
||||
|
||||
define echo_report
|
||||
echo ; \
|
||||
echo $(BOLD) The report file $(BLUE)$(1)$(BOLD) has been created ; \
|
||||
echo ; \
|
||||
echo $(WHITE)Please send the $(BOLD)$(MOUNT_PT)/jhalfs/$(1)$(WHITE) ; \
|
||||
echo file to $(BOLD)manuel@linuxfromscratch.org$(WHITE) ; \
|
||||
echo ; \
|
||||
echo That will help us to keep more accurate SBU and ; \
|
||||
echo disk usage values into the book. Thanks. ; \
|
||||
echo $(BOLD)--------------------------------------------------------------------------------$(WHITE)
|
||||
endef
|
||||
|
||||
define echo_finished
|
||||
@echo $(BOLD)
|
||||
@echo --------------------------------------------------------------------------------
|
||||
@echo $(BOLD) Finished the build of $(BLUE)$(1)$(BOLD)
|
||||
@echo --------------------------------------------------------------------------------
|
||||
@echo $(tab_)$(tab_)$(RED)W A R N I N G$(BOLD)
|
||||
@echo --------------------------------------------------------------------------------
|
||||
@echo
|
||||
@echo To be able to boot your new system you need to follow
|
||||
@echo the next steps:$(WHITE)
|
||||
@echo
|
||||
@echo $(tab_)- Enter to the chroot using the command found
|
||||
@echo $(tab_)in the section -Entering the Chroot Environment-
|
||||
@echo $(tab_)except if building CLFS with METHOD=boot.
|
||||
@echo
|
||||
@echo $(tab_)- Set a password for the root user.
|
||||
@echo
|
||||
@echo $(tab_)- Edit or create /etc/fstab, /etc/hosts, /etc/sysconfig/clock,
|
||||
@echo $(tab_)/etc/sysconfig/console, /etc/sysconfig/network,
|
||||
@echo $(tab_)/etc/sysconfig//network-devices/ifconfig.eth0/ipv4 and
|
||||
@echo $(tab_)any other configuration file required to suit your needs.
|
||||
@echo
|
||||
@echo $(tab_)- Exit from the chroot.
|
||||
@echo
|
||||
@echo $(tab_)- Set-up the boot loader, except if building CLFS with METHOD=boot.
|
||||
@echo $(tab_)You can set-up the host bootloader or the new boot-loader
|
||||
@echo $(tab_)installed on the new system.
|
||||
@echo $(tab_)If the last, you must to mount the virtual filesystems, re-enter
|
||||
@echo $(tab_)the chroot and be sure that /dev is populated with the
|
||||
@echo $(tab_)required devices before configure the boot-loader. When ready,
|
||||
@echo $(tab_)exit from the chroot and umount the filesystems
|
||||
@echo
|
||||
@echo If you are an experienced LFS user, several of those steps can be
|
||||
@echo skipped or done in a different way. But then, that is something
|
||||
@echo that you already know and there is no need to discuss it here.
|
||||
@echo $(BOLD)
|
||||
@echo --------------------------------------------------------------------------------
|
||||
@echo $(tab_)$(tab_)$(GREEN)Have a nice day $(ORANGE):-\)$(BOLD)
|
||||
@echo --------------------------------------------------------------------------------$(WHITE)
|
||||
endef
|
||||
|
||||
define echo_boot_finished
|
||||
@echo $(BOLD)
|
||||
@echo --------------------------------------------------------------------------------
|
||||
@echo $(BOLD) Finished building a minimal boot system for $(BLUE)$(1)$(BOLD)
|
||||
@echo --------------------------------------------------------------------------------
|
||||
@echo $(tab_)$(tab_)$(RED)W A R N I N G$(BOLD)
|
||||
@echo --------------------------------------------------------------------------------
|
||||
@echo
|
||||
@echo The build is not complete. Follow the next steps:$(WHITE)
|
||||
@echo
|
||||
@echo $(tab_)- Edit or create $(MOUNT_PT)/etc/fstab
|
||||
@echo $(tab_) and any other configuration file required to suit your needs.
|
||||
@echo $(BOLD)
|
||||
@echo $(BOLD)$(YELLOW)
|
||||
@echo 1.If it is necessary, transfer the newly created partition to the target machine
|
||||
@echo 2.Boot the new partition.
|
||||
@echo 3.Once you are logged in issue the following commands
|
||||
@echo $(tab_) $(BOLD)cd /jhalfs
|
||||
@echo $(tab_) $(BOLD)make makesys
|
||||
@echo The build process should resume. Follow any instructions that appear.
|
||||
@echo --------------------------------------------------------------------------------
|
||||
@echo $(tab_)$(tab_)$(GREEN)Have a nice day $(ORANGE):-\)$(BOLD)
|
||||
@echo --------------------------------------------------------------------------------$(WHITE)
|
||||
endef
|
56
2.3/common/packages.xsl
Normal file
56
2.3/common/packages.xsl
Normal file
|
@ -0,0 +1,56 @@
|
|||
<?xml version='1.0' encoding='ISO-8859-1'?>
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
version="1.0">
|
||||
|
||||
<xsl:output method="text"/>
|
||||
|
||||
<!-- The libc model used for HLFS -->
|
||||
<xsl:param name="model" select="glibc"/>
|
||||
|
||||
<!-- The kernel series used for HLFS -->
|
||||
<xsl:param name="kernel" select="2.6"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:apply-templates select="//para"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="para">
|
||||
<xsl:if test="contains(string(),'Download:') and
|
||||
(ancestor::varlistentry[@condition=$model]
|
||||
or not(ancestor::varlistentry[@condition])) and
|
||||
(ancestor::varlistentry[@vendor=$kernel]
|
||||
or not(ancestor::varlistentry[@vendor]))">
|
||||
<xsl:call-template name="package_name">
|
||||
<xsl:with-param name="url" select="ulink/@url"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="package_name">
|
||||
<xsl:param name="url" select="foo"/>
|
||||
<xsl:param name="sub-url" select="substring-after($url,'/')"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains($sub-url,'/')">
|
||||
<xsl:call-template name="package_name">
|
||||
<xsl:with-param name="url" select="$sub-url"/>
|
||||
</xsl:call-template>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains($sub-url,'.patch')"/>
|
||||
<xsl:when test="contains($sub-url,'?')">
|
||||
<xsl:value-of select="substring-before($sub-url,'?')"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$sub-url"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
68
2.3/common/progress_bar.sh
Normal file
68
2.3/common/progress_bar.sh
Normal file
|
@ -0,0 +1,68 @@
|
|||
|
||||
# $Id$
|
||||
|
||||
set -e
|
||||
|
||||
# Be sure that we know the taget name
|
||||
[[ -z $1 ]] && exit
|
||||
TARGET=$1 # Remember the target build we are looking for
|
||||
MAKE_PPID=$2
|
||||
|
||||
declare -r CSI=$'\e[' # DEC terminology, Control Sequence Introducer
|
||||
declare -r CURSOR_OFF=${CSI}$'?25l'
|
||||
declare -r CURSOR_ON=${CSI}$'?25h'
|
||||
declare -r ERASE_LINE=${CSI}$'2K'
|
||||
declare -r FRAME_OPEN=${CSI}$'2G['
|
||||
declare -r FRAME_CLOSE=${CSI}$'63G]'
|
||||
declare -r TS_POSITION=${CSI}$'65G'
|
||||
declare -r LINE_WRAP_OFF=${CSI}$'?7l'
|
||||
declare -r LINE_WRAP_ON=${CSI}$'?7h'
|
||||
declare -a RESET_LINE=${CURSOR_OFF}${ERASE_LINE}${FRAME_OPEN}${FRAME_CLOSE}
|
||||
|
||||
declare -a GRAPHIC_STR="| / - \\ + "
|
||||
declare -i SEC=0 # Seconds accumulator
|
||||
declare -i PREV_SEC=0
|
||||
|
||||
# Prevent segfault on stripping phases
|
||||
if [[ "$BASHBIN" = "/tools/bin/bash" ]] ; then
|
||||
SLEEP=/tools/bin/sleep
|
||||
else
|
||||
SLEEP=/bin/sleep
|
||||
fi
|
||||
|
||||
write_or_exit() {
|
||||
# make has been killed or failed or run to completion, leave
|
||||
[[ ! -e /proc/${MAKE_PPID} ]] && echo -n "${CURSOR_ON}" && exit
|
||||
|
||||
# Target build complete, leave.
|
||||
[[ -f ${TARGET} ]] && echo -n "${CURSOR_ON}" && exit
|
||||
|
||||
# It is safe to write to the screen
|
||||
echo -n "$1"
|
||||
}
|
||||
|
||||
# initialize screen
|
||||
write_or_exit "${RESET_LINE}${TS_POSITION}0 min. 0 sec"
|
||||
|
||||
# loop forever..
|
||||
while true ; do
|
||||
|
||||
# Loop through the animation string
|
||||
for GRAPHIC_CHAR in ${GRAPHIC_STR} ; do
|
||||
write_or_exit "${CSI}$((SEC + 3))G${GRAPHIC_CHAR}"
|
||||
$SLEEP .12 # This value MUST be less than .2 seconds.
|
||||
done
|
||||
|
||||
# A BASH internal variable, the number of seconds the script
|
||||
# has been running. modulo convert to 0-59
|
||||
SEC=$(($SECONDS % 60))
|
||||
|
||||
# Detect rollover of the seconds.
|
||||
(( PREV_SEC > SEC )) && write_or_exit "${RESET_LINE}"
|
||||
(( PREV_SEC = SEC ))
|
||||
|
||||
# Display the accumulated time. div minutes.. modulo seconds.
|
||||
write_or_exit "${TS_POSITION}$(($SECONDS / 60)) min. $SEC sec"
|
||||
done
|
||||
|
||||
exit
|
130
2.3/common/urls.xsl
Normal file
130
2.3/common/urls.xsl
Normal file
|
@ -0,0 +1,130 @@
|
|||
<?xml version='1.0' encoding='ISO-8859-1'?>
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
version="1.0">
|
||||
|
||||
<xsl:output method="text"/>
|
||||
|
||||
<!-- The FTP server used as fallback -->
|
||||
<xsl:param name="server">ftp://ftp.osuosl.org</xsl:param>
|
||||
|
||||
<!-- The book family (lfs or clfs). Needed to use the proper FTP path. -->
|
||||
<xsl:param name="family">lfs</xsl:param>
|
||||
|
||||
<!-- The libc model used for HLFS -->
|
||||
<xsl:param name="model" select="glibc"/>
|
||||
|
||||
<!-- The kernel series used for HLFS -->
|
||||
<xsl:param name="kernel" select="2.6"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:apply-templates select="//ulink"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="ulink">
|
||||
<!-- If some package don't have the predefined strings in their
|
||||
name, the next test must be fixed to match it also. Skip possible
|
||||
duplicated URLs due that may be splitted for PDF output -->
|
||||
<xsl:if test="(ancestor::varlistentry[@condition=$model]
|
||||
or not(ancestor::varlistentry[@condition])) and
|
||||
(ancestor::varlistentry[@vendor=$kernel]
|
||||
or not(ancestor::varlistentry[@vendor])) and
|
||||
(contains(@url, '.bz2') or contains(@url, '.tar.gz') or
|
||||
contains(@url, '.tgz') or contains(@url, '.patch')) and
|
||||
not(ancestor-or-self::*/@condition = 'pdf')">
|
||||
<!-- Extract the package name -->
|
||||
<xsl:variable name="package">
|
||||
<xsl:call-template name="package.name">
|
||||
<xsl:with-param name="url" select="@url"/>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
<!-- Extract the directory for that package -->
|
||||
<xsl:variable name="cut"
|
||||
select="translate(substring-after($package, '-'),
|
||||
'0123456789', '0000000000')"/>
|
||||
<xsl:variable name="package2">
|
||||
<xsl:value-of select="substring-before($package, '-')"/>
|
||||
<xsl:text>-</xsl:text>
|
||||
<xsl:value-of select="$cut"/>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="dirname" select="substring-before($package2, '-0')"/>
|
||||
<!-- Write the upstream URLs, fixing the redirected ones -->
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains(@url,'?')">
|
||||
<xsl:value-of select="substring-before(@url,'?')"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="@url"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:text> </xsl:text>
|
||||
<!-- Write FTP mirror URLs -->
|
||||
<xsl:value-of select="$server"/>
|
||||
<xsl:text>/pub/</xsl:text>
|
||||
<xsl:value-of select="$family"/>
|
||||
<xsl:text>/conglomeration/</xsl:text>
|
||||
<xsl:choose>
|
||||
<!-- Fix some directories. Test against $dirname to be sure that we
|
||||
are matching the start of a package name, not a string in a patch name
|
||||
But some packages requires test against $package. -->
|
||||
<xsl:when test="contains($dirname, 'bash')">
|
||||
<xsl:text>bash/</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains($package, 'dvhtool')">
|
||||
<xsl:text>dvhtool/</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains($dirname, 'gcc')">
|
||||
<xsl:text>gcc/</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains($dirname, 'glibc')">
|
||||
<xsl:text>glibc/</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains($package, 'powerpc-utils')">
|
||||
<xsl:text>powerpc-utils/</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains($package, 'tcl')">
|
||||
<xsl:text>tcl/</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains($package, 'uClibc')">
|
||||
<xsl:text>uClibc/</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:when test="contains($dirname, 'udev')">
|
||||
<xsl:text>udev/</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$dirname"/>
|
||||
<xsl:text>/</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:value-of select="$package"/>
|
||||
<!-- Write MD5SUM value -->
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:value-of select="../..//para/literal"/>
|
||||
<xsl:text>
</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="package.name">
|
||||
<xsl:param name="url"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains($url, '/')">
|
||||
<xsl:call-template name="package.name">
|
||||
<xsl:with-param name="url" select="substring-after($url, '/')"/>
|
||||
</xsl:call-template>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains($url, '?')">
|
||||
<xsl:value-of select="substring-before($url, '?')"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$url"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
22
2.3/custom/examples/950-bc
Normal file
22
2.3/custom/examples/950-bc
Normal file
|
@ -0,0 +1,22 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
PKG="bc"
|
||||
PKG_VERSION="1.06"
|
||||
PKG_FILE="bc-1.06.tar.gz"
|
||||
URL="http://ftp.gnu.org/gnu/bc/${PKG_FILE}"
|
||||
MD5="d44b5dddebd8a7a7309aea6c36fda117"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
|
||||
( cat << "xEOFx"
|
||||
sed -i '/PROTO.*readline/d' bc/scan.l &&
|
||||
sed -i '/flex -I8/s/8//' configure &&
|
||||
sed -i '/stdlib/a #include <string.h>' lib/number.c &&
|
||||
sed -i 's/program.*save/static &/' bc/load.c &&
|
||||
./configure --prefix=/usr --with-readline &&
|
||||
make
|
||||
make install
|
||||
xEOFx
|
||||
) > tmp
|
22
2.3/custom/examples/951-glib
Normal file
22
2.3/custom/examples/951-glib
Normal file
|
@ -0,0 +1,22 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
PKG="glib"
|
||||
PKG_VERSION="1.2.10"
|
||||
PKG_FILE="glib-1.2.10.tar.gz"
|
||||
URL="http://gd.tuwien.ac.at/graphics/gimp/gtk/v1.2/${PKG_FILE}"
|
||||
MD5="6fe30dad87c77b91b632def29dd69ef9"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
PATCH1="http://www.linuxfromscratch.org/patches/blfs/svn/glib-1.2.10-gcc34-1.patch 0077a1cce5e8a2231ac5a9b08c6263ba"
|
||||
|
||||
|
||||
( cat << "xEOFx"
|
||||
patch -Np1 -i ../glib-1.2.10-gcc34-1.patch &&
|
||||
./configure --prefix=/usr &&
|
||||
make
|
||||
make install &&
|
||||
chmod -v 755 /usr/lib/libgmodule-1.2.so.0.0.10
|
||||
xEOFx
|
||||
) > tmp
|
18
2.3/custom/examples/952-mc
Normal file
18
2.3/custom/examples/952-mc
Normal file
|
@ -0,0 +1,18 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
PKG="mc"
|
||||
PKG_VERSION="4.6.1"
|
||||
PKG_FILE="mc-4.6.1.tar.gz"
|
||||
URL="http://www.ibiblio.org/pub/Linux/utils/file/managers/mc/${PKG_FILE}"
|
||||
MD5="18b20db6e40480a53bac2870c56fc3c4"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
|
||||
( cat << "xEOFx"
|
||||
./configure --prefix=/usr &&
|
||||
make
|
||||
make install
|
||||
xEOFx
|
||||
) > tmp
|
26
2.3/custom/examples/960-pppd
Normal file
26
2.3/custom/examples/960-pppd
Normal file
|
@ -0,0 +1,26 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
# The PPP package contains the pppd daemon and the chat program.
|
||||
# This is used for connecting to other machines; often for connecting
|
||||
# to the Internet via a dial-up or PPPoE connection to an ISP.
|
||||
#
|
||||
|
||||
PKG="ppp"
|
||||
PKG_VERSION="2.4.4"
|
||||
PKG_FILE="ppp-${PKG_VERSION}.tar.gz"
|
||||
URL="http://samba.org/ftp/ppp/${PKG_FILE}"
|
||||
MD5="183800762e266132218b204dfb428d29"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
|
||||
( cat << "xEOFx"
|
||||
./configure --prefix=/usr &&
|
||||
make
|
||||
|
||||
make install &&
|
||||
make install-etcppp
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
35
2.3/custom/examples/961-openssl
Normal file
35
2.3/custom/examples/961-openssl
Normal file
|
@ -0,0 +1,35 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
# The OpenSSL package contains management tools and libraries
|
||||
# relating to cryptography. These are useful for providing
|
||||
# cryptography functions to other packages, notably OpenSSH,
|
||||
# email applications and web browsers (for accessing HTTPS sites).
|
||||
#
|
||||
|
||||
PKG="openssl"
|
||||
PKG_VERSION="0.9.8d"
|
||||
PKG_FILE="openssl-${PKG_VERSION}.tar.gz"
|
||||
URL="ftp://ftp.openssl.org/source/${PKG_FILE}"
|
||||
MD5="8ed1853538e1d05a1f5ada61ebf8bffa"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
PATCH1=" http://www.linuxfromscratch.org/patches/blfs/svn/openssl-0.9.8d-fix_manpages-1.patch"
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
sed -i -e 's/mcpu/march/' config
|
||||
patch -Np1 -i ../openssl-0.9.8d-fix_manpages-1.patch &&
|
||||
./config --openssldir=/etc/ssl --prefix=/usr shared &&
|
||||
make MANDIR=/usr/share/man
|
||||
|
||||
make MANDIR=/usr/share/man install &&
|
||||
cp -v -r certs /etc/ssl &&
|
||||
install -v -d -m755 /usr/share/doc/openssl-0.9.8d &&
|
||||
cp -v -r doc/{HOWTO,README,*.{txt,html,gif}} \
|
||||
/usr/share/doc/openssl-0.9.8d
|
||||
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
43
2.3/custom/examples/963-gpm
Normal file
43
2.3/custom/examples/963-gpm
Normal file
|
@ -0,0 +1,43 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
PKG="gpm"
|
||||
PKG_VERSION="1.20.1"
|
||||
PKG_FILE="gpm-${PKG_VERSION}.tar.bz2"
|
||||
URL="ftp://arcana.linux.it/pub/gpm/${PKG_FILE}"
|
||||
MD5="2c63e827d755527950d9d13fe3d87692"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
PATCH1=" http://www.linuxfromscratch.org/patches/blfs/svn/gpm-1.20.1-segfault-1.patch"
|
||||
PATCH2=" http://www.linuxfromscratch.org/patches/blfs/svn/gpm-1.20.1-silent-1.patch"
|
||||
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
patch -Np1 -i ../gpm-1.20.1-segfault-1.patch &&
|
||||
patch -Np1 -i ../gpm-1.20.1-silent-1.patch &&
|
||||
./configure --prefix=/usr --sysconfdir=/etc &&
|
||||
LDFLAGS="-lm" make
|
||||
|
||||
make install &&
|
||||
cp -v conf/gpm-root.conf /etc &&
|
||||
ldconfig
|
||||
|
||||
# The normal cmd to install the boot script for gpm
|
||||
# --- PUT THIS CMD INSIDE 999-blfs_bootscripts
|
||||
#make install-gpm
|
||||
|
||||
cat > /etc/sysconfig/mouse << "EOF"
|
||||
# Begin /etc/sysconfig/mouse
|
||||
|
||||
MDEVICE="/dev/psaux"
|
||||
PROTOCOL="imps2"
|
||||
GPMOPTS=""
|
||||
|
||||
# End /etc/sysconfig/mouse
|
||||
EOF
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
||||
|
32
2.3/custom/examples/963-lynx
Normal file
32
2.3/custom/examples/963-lynx
Normal file
|
@ -0,0 +1,32 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
# Lynx is a text based web browser.
|
||||
#
|
||||
|
||||
PKG="lynx"
|
||||
PKG_VERSION="2.8.6"
|
||||
PKG_FILE="lynx${PKG_VERSION}.tar.bz2"
|
||||
URL="ftp://lynx.isc.org/lynx2.8.6/${PKG_FILE}"
|
||||
MD5="dc80497b7dda6a28fd80404684d27548"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
./configure --prefix=/usr \
|
||||
--sysconfdir=/etc/lynx \
|
||||
--datadir=/usr/share/doc/lynx-2.8.6 \
|
||||
--with-zlib \
|
||||
--with-bzlib \
|
||||
--with-screen=ncursesw \
|
||||
--enable-locale-charset &&
|
||||
|
||||
make
|
||||
|
||||
make install-full &&
|
||||
chgrp -v -R root /usr/share/doc/lynx-2.8.6/lynx_doc
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
27
2.3/custom/examples/964-hdcpcd
Normal file
27
2.3/custom/examples/964-hdcpcd
Normal file
|
@ -0,0 +1,27 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
# dhcpcd is an implementation of the DHCP client specified in RFC2131.
|
||||
# This is useful for connecting your computer to a network which uses
|
||||
# DHCP to assign network addresses.
|
||||
#
|
||||
|
||||
PKG="dhcpcd"
|
||||
PKG_VERSION="2.0.8"
|
||||
PKG_FILE="dhcpcd-${PKG_VERSION}.tar.bz2"
|
||||
URL="ftp://ftp.osuosl.org/pub/gentoo/distfiles/${PKG_FILE}"
|
||||
MD5="ec91c33b6d9cb46a42f9564e573fd249"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
./configure --prefix="" --mandir=/usr/share/man &&
|
||||
make
|
||||
|
||||
make install &&
|
||||
chmod -v 754 /etc/dhcpc/dhcpcd.exe
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
25
2.3/custom/examples/965-eject
Normal file
25
2.3/custom/examples/965-eject
Normal file
|
@ -0,0 +1,25 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
# Program for ejecting removable media under software control.
|
||||
# Can also control the auto-eject feature of some drives and
|
||||
# can be used to switch CDs on an IDE/ATAPI CD changer.
|
||||
#
|
||||
|
||||
PKG="eject"
|
||||
PKG_VERSION="2.10"
|
||||
PKG_FILE="eject-${PKG_VERSION}.tar.gz"
|
||||
URL="ftp://sunsite.unc.edu/pub/Linux/utils/disk-management/${PKG_FILE}"
|
||||
MD5="82e3a7a4d7e3323018c6938015ff25f7"
|
||||
PATCH1=""
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
./configure --prefix=/usr \
|
||||
--enable-default-device=/dev/cdrom \
|
||||
--disable-nls
|
||||
make
|
||||
make install
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
33
2.3/custom/examples/997-nasm
Normal file
33
2.3/custom/examples/997-nasm
Normal file
|
@ -0,0 +1,33 @@
|
|||
#
|
||||
# $Id:$
|
||||
# NASM (Netwide Assembler) is an 80x86 assembler designed
|
||||
# for portability and modularity. It includes a
|
||||
# disassembler as well.
|
||||
|
||||
PKG="nasm"
|
||||
PKG_VERSION="0.98.39"
|
||||
PKG_FILE="nasm-${PKG_VERSION}.tar.bz2"
|
||||
URL="http://downloads.sourceforge.net/nasm/${PKG_FILE}"
|
||||
MD5="2032ad44c7359f7a9a166a40a633e772"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
PATCH1="http://www.linuxfromscratch.org/patches/blfs/svn/nasm-0.98.39-security_fix-1.patch"
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
patch -Np1 -i ../nasm-0.98.39-security_fix-1.patch &&
|
||||
./configure --prefix=/usr &&
|
||||
make
|
||||
make -C rdoff/doc
|
||||
make -C rdoff/doc html
|
||||
|
||||
make install &&
|
||||
make install_rdf &&
|
||||
install -v -m644 rdoff/doc/rdoff.info /usr/share/info &&
|
||||
install -v -m755 -d /usr/share/doc/nasm/html &&
|
||||
install -v -m644 rdoff/doc/v1-v2.txt /usr/share/doc/nasm &&
|
||||
cp -v -R rdoff/doc/rdoff /usr/share/doc/nasm/html
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
35
2.3/custom/examples/998-syslinux
Normal file
35
2.3/custom/examples/998-syslinux
Normal file
|
@ -0,0 +1,35 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
# SYSLINUX is a collection of boot loaders for the Linux
|
||||
# operating system which operates off Linux ext2/3
|
||||
# filesystems, MS-DOS FAT filesystems, network servers
|
||||
# using PXE firmware, or from CD-ROMs. The FAT
|
||||
# filesystem version can be installed from DOS, NT, or
|
||||
# Linux.
|
||||
#
|
||||
# It includes a sophisticated API for add-on "COM32"
|
||||
# modules, including a significant subset of the
|
||||
# standard C library.
|
||||
#
|
||||
# It also includes MEMDISK, a tool to boot legacy
|
||||
# operating systems from nontraditional media like PXE
|
||||
# or CD-ROM.
|
||||
#
|
||||
|
||||
PKG="syslinux"
|
||||
PKG_VERSION="3.36"
|
||||
PKG_FILE="syslinux-$PKG_VERSION}.tar.bz2"
|
||||
URL="http://www.kernel.org/pub/linux/utils/boot/syslinux/${PKG_FILE}"
|
||||
MD5="d1bfdaa53d31f572f540be55d1480027"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
make
|
||||
make install
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
22
2.3/custom/examples/999-blfs_bootscripts
Normal file
22
2.3/custom/examples/999-blfs_bootscripts
Normal file
|
@ -0,0 +1,22 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
PKG="blfs-bootscripts"
|
||||
PKG_VERSION="20060910"
|
||||
PKG_FILE="blfs-bootscripts-${PKG_VERSION}.tar.bz2"
|
||||
URL="http://www.linuxfromscratch.org/blfs/downloads/svn/${PKG_FILE}"
|
||||
MD5="e1715c58dc694bf474c4468e6bade3ad"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
#
|
||||
# Insert ALL the blfs bootscripts you want to install
|
||||
# EXAMPLE
|
||||
#
|
||||
make install-gpm
|
||||
make install-service-dhcpcd
|
||||
xEOFx
|
||||
) > tmp
|
49
2.3/custom/examples_CLFS-E/950-dropbear
Normal file
49
2.3/custom/examples_CLFS-E/950-dropbear
Normal file
|
@ -0,0 +1,49 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
# Code taken from CLFS-Embedded
|
||||
# Chapter 12 Beyond CLFS Embedded
|
||||
#
|
||||
# Dropbear is a relatively small SSH 2 server and client.
|
||||
# Dropbear has a small memory footprint suitable for memory-constrained
|
||||
# environments, while still having the same features as OpenSSH. It
|
||||
# does not depend on OpenSSL and it has a MIT style license. Optionally
|
||||
# it can even be made smaller.
|
||||
#
|
||||
|
||||
PKG="DROPBEAR"
|
||||
PKG_VERSION="0.48.1"
|
||||
PKG_FILE="${PKG}-${PKG_VERSION}.tar.gz"
|
||||
URL="http://matt.ucc.asn.au/dropbear/releases/${PKG_FILE}"
|
||||
MD5="ca8e53a766faec831882831364568421"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
PATCH1="http://svn.cross-lfs.org/svn/repos/cross-lfs/branches/clfs-embedded/patches/dropbear-0.48.1-autotool-1.patch"
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
patch -Np1 -i ../dropbear-0.48.1-autotool-1.patch
|
||||
|
||||
cp Makefile.in{,.orig}
|
||||
sed -e s/@LD@/@CC@/ Makefile.in.orig > Makefile.in
|
||||
|
||||
CC="${CC} ${BUILD}" ./configure --prefix=/usr --host=${CLFS_TARGET}
|
||||
|
||||
cp -v options.h options.h.backup
|
||||
sed -e "s@/dev/random@/dev/urandom@" options.h.backup > options.h
|
||||
|
||||
make MULTI=1 PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
|
||||
|
||||
make MULTI=1 PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install DESTDIR=${CLFS}
|
||||
ln -svf ../../usr/bin/dropbearmulti ${CLFS}/usr/sbin/dropbear
|
||||
ln -svf ../../usr/bin/dropbearmulti ${CLFS}/usr/bin/dbclient
|
||||
ln -svf ../../usr/bin/dropbearmulti ${CLFS}/usr/bin/dropbearkey
|
||||
ln -svf ../../usr/bin/dropbearmulti ${CLFS}/usr/bin/dropbearconvert
|
||||
ln -svf ../../usr/bin/dropbearmulti ${CLFS}/usr/bin/scp
|
||||
|
||||
install -dv ${CLFS}/etc/ssh
|
||||
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
42
2.3/custom/examples_CLFS-E/960-iptables
Normal file
42
2.3/custom/examples_CLFS-E/960-iptables
Normal file
|
@ -0,0 +1,42 @@
|
|||
#
|
||||
# $Id:$
|
||||
#
|
||||
# Code taken from CLFS-Embedded
|
||||
# Chapter 12 Beyond CLFS Embedded
|
||||
#
|
||||
# iptables is the userspace command line program
|
||||
# used to configure the Linux firewall.
|
||||
#
|
||||
|
||||
PKG="iptables"
|
||||
PKG_VERSION="1.3.7"
|
||||
PKG_FILE="${PKG}-${PKG_VERSION}.tar.bz2"
|
||||
URL=" http://www.netfilter.org/projects/iptables/files/iptables-1.3.7.tar.bz2"
|
||||
MD5="077e886a9c90a11bb47f3d7a4fc4a689"
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
PATCH1="http://svn.cross-lfs.org/svn/repos/cross-lfs/branches/clfs-embedded/patches/iptables-1.3.7-do_multi-1.patch"
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
patch -Np1 -i ../iptables-1.3.7-do_multi-1.patch
|
||||
|
||||
make CC="${CC} ${BUILD}" \
|
||||
COPT_FLAGS="-Os" \
|
||||
LD=${LD} DO_MULTI=1 \
|
||||
PREFIX=/usr \
|
||||
KERNEL_DIR=${CLFS}/lib/modules/2.6.19.2/build \
|
||||
LIBDIR=/lib \
|
||||
BINDIR=/sbin
|
||||
|
||||
make CC="${CC} ${BUILD}" \
|
||||
COPT_FLAGS="-Os" \
|
||||
LD=${LD} DO_MULTI=1 \
|
||||
PREFIX=/usr \
|
||||
KERNEL_DIR=${CLFS}/lib/modules/2.6.19.2/build \
|
||||
LIBDIR=/lib BINDIR=/sbin \
|
||||
DESTDIR=${CLFS} install
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
20
2.3/custom/template
Normal file
20
2.3/custom/template
Normal file
|
@ -0,0 +1,20 @@
|
|||
#
|
||||
# $Id$
|
||||
#
|
||||
# Any comments you wish to add
|
||||
#
|
||||
|
||||
PKG=""
|
||||
PKG_VERSION=""
|
||||
PKG_FILE=""
|
||||
URL=""
|
||||
MD5=""
|
||||
for i in PATCH{1..10}; do
|
||||
unset $i
|
||||
done
|
||||
PATCH1=""
|
||||
|
||||
( cat << "xEOFx"
|
||||
|
||||
xEOFx
|
||||
) > tmp
|
36
2.3/extras/do_copy_files
Executable file
36
2.3/extras/do_copy_files
Executable file
|
@ -0,0 +1,36 @@
|
|||
#!/bin/bash
|
||||
# $Id$
|
||||
set -e
|
||||
|
||||
: <<inline_doc
|
||||
desc: Copy files from one dir to another dir using tar
|
||||
usage: do_copy_files $PRUNEPATH $ROOT_DIR $DEST_DIR
|
||||
input vars: $1 list of dirs that must be skipped by tar
|
||||
$2 the root dir of the files that will be copied
|
||||
$3 the dir where the copied files will be placed
|
||||
externals: --
|
||||
modifies: --
|
||||
returns: --
|
||||
on error:
|
||||
on success:
|
||||
inline_doc
|
||||
|
||||
TMP_FILE=/tmp/prunelist
|
||||
|
||||
echo -en "\nCopying system files to $3 ..."
|
||||
|
||||
# Create a file that we can pass to tar as an "exclude list".
|
||||
# There might be an easier way to achieve tar exclusions? Strip
|
||||
# the leading /.
|
||||
for F in $1 ; do
|
||||
echo .${F} >> $TMP_FILE
|
||||
done
|
||||
|
||||
mkdir -p $3
|
||||
cd $2
|
||||
tar -X $TMP_FILE -cf - . | tar -C $3 -xf -
|
||||
|
||||
# Clear out the temporary file
|
||||
rm -f ${TMP_FILE}
|
||||
|
||||
echo "done."
|
77
2.3/extras/do_ica_prep
Executable file
77
2.3/extras/do_ica_prep
Executable file
|
@ -0,0 +1,77 @@
|
|||
#!/bin/bash
|
||||
# $Id$
|
||||
|
||||
# Acknowledgment:
|
||||
# The following code is a modified version of an original work written by
|
||||
# Greg Schafer for the "DIY Linux" project and is included here with his
|
||||
# permission.
|
||||
# ref: http://www.diy-linux.org
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
: <<inline_doc
|
||||
desc: prepare current iteration files for ICA report
|
||||
usage: do_ica_prep $DEST_ICA/$ITERATION
|
||||
input vars: $1 directory where files from current iteration are stored
|
||||
externals: --
|
||||
modifies: --
|
||||
returns: --
|
||||
on error:
|
||||
on success:
|
||||
inline_doc
|
||||
|
||||
CMP_DIR=$1
|
||||
|
||||
# Run ica_prep if it hasn't been done already
|
||||
if [ ! -f "$CMP_DIR/icaprep" ]; then
|
||||
|
||||
echo -en "\nRemoving symbolic links in ${CMP_DIR}... "
|
||||
find $CMP_DIR -type l | xargs rm -f
|
||||
echo "done."
|
||||
|
||||
echo -n "Gunzipping \".gz\" files in ${CMP_DIR}... "
|
||||
find $CMP_DIR -name '*.gz' | xargs gunzip
|
||||
echo "done."
|
||||
|
||||
#echo -n "Bunzipping \".bz2\" files in ${CMP_DIR}... "
|
||||
#find $CMP_DIR -name '*.bz2' | xargs bunzip2
|
||||
#echo "done."
|
||||
|
||||
# ar archives contain date & time stamp info that causes us
|
||||
# grief when trying to find differences. Here we perform some
|
||||
# hackery to allow easy diffing. Essentially, replace each
|
||||
# archive with a dir of the same name and extract the object
|
||||
# files from the archive into this dir. Despite their names,
|
||||
# libieee.a & libmcheck.a are not actual ar archives.
|
||||
echo -n "Extracting object files from \".a\" files in ${CMP_DIR}... "
|
||||
L=$(find $CMP_DIR -name '*.a' ! -name 'libieee.a' ! -name 'libmcheck.a')
|
||||
for F in $L; do
|
||||
mv $F ${F}.XX
|
||||
mkdir $F
|
||||
cd $F
|
||||
BN=${F##*/}
|
||||
ar x ../${BN}.XX || {
|
||||
echo -e "\nError: ar archive extraction failed!\n" >&2
|
||||
exit 1
|
||||
}
|
||||
rm -f ../${BN}.XX
|
||||
done
|
||||
echo "done."
|
||||
|
||||
echo -n "Stripping (debug) symbols from \".o\" files in ${CMP_DIR}... "
|
||||
find $CMP_DIR -name '*.o' | xargs strip -p -g 2>/dev/null
|
||||
echo "done."
|
||||
|
||||
echo -n "Stripping (all) symbols from files OTHER THAN \".o\" files in ${CMP_DIR}... "
|
||||
find $CMP_DIR ! -name '*.o' | xargs strip -p 2>/dev/null || :
|
||||
echo "done."
|
||||
|
||||
# We're all done
|
||||
echo -en "\nSuccess: ICA preparation for "
|
||||
echo -e "${CMP_DIR} complete."
|
||||
touch $CMP_DIR/icaprep
|
||||
else
|
||||
echo -e "\n$CMP_DIR was already processed\n"
|
||||
fi
|
||||
|
55
2.3/extras/do_ica_work
Executable file
55
2.3/extras/do_ica_work
Executable file
|
@ -0,0 +1,55 @@
|
|||
#!/bin/bash
|
||||
# $Id$
|
||||
|
||||
# Acknowledgment:
|
||||
# The following code is a modified version of an original work written by
|
||||
# Greg Schafer for the "DIY Linux" project and is included here with his
|
||||
# permission.
|
||||
# ref: http://www.diy-linux.org
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
: <<inline_doc
|
||||
desc: creates the ICA report
|
||||
usage: do_ica_work $PREV $ITERATION $ICALOGDIR $DEST_ICA
|
||||
input vars: $1 previous iteration
|
||||
$2 current iteration
|
||||
$3 ICA log dir
|
||||
$4 directory where ICA iterations are stored
|
||||
externals: --
|
||||
modifies: --
|
||||
returns: --
|
||||
on error:
|
||||
on success:
|
||||
inline_doc
|
||||
|
||||
RAWDIFF=/tmp/rawdiff.$$
|
||||
REPORT="${3}/REPORT.${1}V${2}"
|
||||
|
||||
echo -en "\nGenerating ICA analysis report $1 versus $2 ..."
|
||||
|
||||
mkdir -p $3
|
||||
|
||||
cd $4
|
||||
|
||||
echo -e "Diffing ${1} and ${2}... " > $REPORT
|
||||
diff -ur ${1} ${2} > $RAWDIFF || :
|
||||
|
||||
echo -e "The list of binary files that differ:\n" > $REPORT
|
||||
grep "iles.*differ$" $RAWDIFF >> $REPORT
|
||||
|
||||
echo -e "The list of files that exist \"only in\" 1 of the directories:\n" >> $REPORT
|
||||
|
||||
if grep "^Only in" $RAWDIFF >/dev/null 2>&1; then
|
||||
grep "^Only in" $RAWDIFF >> $REPORT
|
||||
else
|
||||
echo NONE >> $REPORT
|
||||
fi
|
||||
|
||||
grep -v "iles.*differ$" $RAWDIFF | \
|
||||
grep -v "^Only in" > ${3}/${1}V${2}.ASCII.DIFF
|
||||
|
||||
rm -f $RAWDIFF
|
||||
|
||||
echo "done."
|
896
2.3/extras/farce
Executable file
896
2.3/extras/farce
Executable file
|
@ -0,0 +1,896 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Acknowledgment:
|
||||
# The following code is a no-modified version (except for this 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 <ken@linuxfromscratch.org>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
: <<inline_doc
|
||||
desc: do farce analisys and report
|
||||
usage: farce -directory $FARCELOGDIR/dir path1 list1 path2 list2
|
||||
input vars: $1 farce log dir for this comparation
|
||||
$2 full path to previous iteration
|
||||
$3 full path to filelist for previos iteration
|
||||
$4 full path to current iteration
|
||||
$5 full path to filelist for current iteration
|
||||
externals: --
|
||||
modifies: --
|
||||
returns: --
|
||||
on error:
|
||||
on success:
|
||||
inline_doc
|
||||
|
||||
|
||||
VERSION="002"
|
||||
|
||||
# variables for output files
|
||||
RESULT=farce-results
|
||||
EXTRAS=farce-extras
|
||||
IDENTICAL=farce-identical
|
||||
SUBS=farce-substitutions
|
||||
DIFFER=farce-differ
|
||||
|
||||
# documenting the variables
|
||||
# C1, C2 temp files to hold disassembled code
|
||||
# D1, D2 temp directories for extracting member of ar archive
|
||||
# DIFF temp file for diffing the filelists
|
||||
# F1, F2 temp files for tokenizeanddiff
|
||||
# FTYPE obsolete, commented out
|
||||
# M1, M2 temp files to hold members of an ar archive
|
||||
# MEMBERS temp file to list members of ar archive
|
||||
# OP1, OP2 the original $PWD, needed when extracting members of ar
|
||||
# archives
|
||||
# P1, P2 paths to first and second build
|
||||
# S1, S2 temp files for shared objects
|
||||
|
||||
# functions
|
||||
function dohelp() {
|
||||
echo "`basename $0`: compare trees of files from a build"
|
||||
echo "and lists of the files they contained"
|
||||
echo ""
|
||||
echo "`basename $0` [ -help | -version ] || path1 list1 path2 list2"
|
||||
}
|
||||
|
||||
function emessage() {
|
||||
# write a string to both stderr and $RESULT
|
||||
echo "$@" >&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"
|
||||
|
60
2.3/extras/filelist
Executable file
60
2.3/extras/filelist
Executable file
|
@ -0,0 +1,60 @@
|
|||
#!/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
|
||||
|
||||
: <<inline_doc
|
||||
desc: creates farce file lists
|
||||
usage: filelist $DEST_FARCE/$ITERATION $DEST_FARCE/$ITERATION.filelist
|
||||
input vars: $1 directory where files from current iteration are stored
|
||||
$2 name of the file list to be created
|
||||
externals: --
|
||||
modifies: --
|
||||
returns: --
|
||||
on error:
|
||||
on success:
|
||||
inline_doc
|
||||
|
||||
if [ $# -eq 2 ]; then
|
||||
OUTFILE=$2
|
||||
if [ -e $2 ]; then
|
||||
echo -e "\nOutput $2 already exists\n"
|
||||
exit
|
||||
fi
|
||||
else
|
||||
echo -e "\nMissing argument\n"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if [ "$1" == "/" ]; then
|
||||
LOC=$1
|
||||
else
|
||||
# ensure the path or mountpoint ends with a slash
|
||||
# because of the seds after the 'find'
|
||||
LOC=`echo $1 | sed 's%[^/]$%&/%'`
|
||||
fi
|
||||
|
||||
echo -en "\nCreating file list for farce amalysis in $OUTFILE ..."
|
||||
if [ -f $OUTFILE ]; then
|
||||
echo "refusing to overwrite $OUTFILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# check we can indeed do this
|
||||
>$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
|
449
2.3/jhalfs
Executable file
449
2.3/jhalfs
Executable file
|
@ -0,0 +1,449 @@
|
|||
#!/bin/bash
|
||||
# $Id$
|
||||
set -e
|
||||
|
||||
# VT100 colors
|
||||
declare -r BLACK=$'\e[1;30m'
|
||||
declare -r DK_GRAY=$'\e[0;30m'
|
||||
|
||||
declare -r RED=$'\e[31m'
|
||||
declare -r GREEN=$'\e[32m'
|
||||
declare -r YELLOW=$'\e[33m'
|
||||
declare -r BLUE=$'\e[34m'
|
||||
declare -r MAGENTA=$'\e[35m'
|
||||
declare -r CYAN=$'\e[36m'
|
||||
declare -r WHITE=$'\e[37m'
|
||||
|
||||
declare -r OFF=$'\e[0m'
|
||||
declare -r BOLD=$'\e[1m'
|
||||
declare -r REVERSE=$'\e[7m'
|
||||
declare -r HIDDEN=$'\e[8m'
|
||||
|
||||
declare -r tab_=$'\t'
|
||||
declare -r nl_=$'\n'
|
||||
|
||||
declare -r DD_BORDER="${BOLD}==============================================================================${OFF}"
|
||||
declare -r SD_BORDER="${BOLD}------------------------------------------------------------------------------${OFF}"
|
||||
declare -r STAR_BORDER="${BOLD}******************************************************************************${OFF}"
|
||||
|
||||
# bold yellow > < pair
|
||||
declare -r R_arrow=$'\e[1;33m>\e[0m'
|
||||
declare -r L_arrow=$'\e[1;33m<\e[0m'
|
||||
|
||||
|
||||
#>>>>>>>>>>>>>>>ERROR TRAPPING >>>>>>>>>>>>>>>>>>>>
|
||||
#-----------------------#
|
||||
simple_error() { # Basic error trap.... JUST DIE
|
||||
#-----------------------#
|
||||
# If +e then disable text output
|
||||
if [[ "$-" =~ e ]]; then
|
||||
echo -e "\n${RED}ERROR:${GREEN} basic error trapped!${OFF}\n" >&2
|
||||
fi
|
||||
}
|
||||
|
||||
see_ya() {
|
||||
echo -e "\n${L_arrow}${BOLD}jhalfs 2.3${R_arrow} exit${OFF}\n"
|
||||
}
|
||||
##### Simple error TRAPS
|
||||
# ctrl-c SIGINT
|
||||
# ctrl-y
|
||||
# ctrl-z SIGTSTP
|
||||
# SIGHUP 1 HANGUP
|
||||
# SIGINT 2 INTRERRUPT FROM KEYBOARD Ctrl-C
|
||||
# SIGQUIT 3
|
||||
# SIGKILL 9 KILL
|
||||
# SIGTERM 15 TERMINATION
|
||||
# SIGSTOP 17,18,23 STOP THE PROCESS
|
||||
#####
|
||||
set -e
|
||||
trap see_ya 0
|
||||
trap simple_error ERR
|
||||
trap 'echo -e "\n\n${RED}INTERRUPT${OFF} trapped\n" && exit 2' 1 2 3 15 17 18 23
|
||||
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
|
||||
version="
|
||||
${BOLD} \"jhalfs 2.3\"${OFF} builder tool (stable) \$Rev$
|
||||
\$Date$
|
||||
|
||||
Written by George Boudreau and Manuel Canales Esparcia,
|
||||
plus several contributions.
|
||||
|
||||
Based on an idea from Jeremy Huntwork
|
||||
|
||||
This set of files are published under the
|
||||
${BOLD}Gnu General Public License, Version 2.${OFF}
|
||||
"
|
||||
|
||||
case $1 in
|
||||
-v ) echo "$version" && exit 1 ;;
|
||||
run ) : ;;
|
||||
* )
|
||||
echo "${nl_}${tab_}${BOLD}${RED}This script cannot be called directly: EXITING ${OFF}${nl_}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
VERBOSITY=1
|
||||
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading config params from <configuration>..."
|
||||
source configuration
|
||||
[[ $? > 0 ]] && echo "file:configuration did not load.." && exit 1
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
|
||||
# These are boolean vars generated from Config.in.
|
||||
# ISSUE: If a boolean parameter is not set <true> that
|
||||
# variable is not defined by the menu app. This can
|
||||
# cause a headache if you are not careful.
|
||||
# The following parameters MUST be created and have a
|
||||
# default value.
|
||||
RUNMAKE=${RUNMAKE:-n}
|
||||
GETPKG=${GETPKG:-n}
|
||||
GETKERNEL=${GETKERNEL:-n}
|
||||
COMPARE=${COMPARE:-n}
|
||||
RUN_FARCE=${RUN_FARCE:-n}
|
||||
RUN_ICA=${RUN_ICA:-n}
|
||||
BOMB_TEST=${BOMB_TEST:-n}
|
||||
STRIP=${STRIP:=n}
|
||||
REPORT=${REPORT:=n}
|
||||
VIMLANG=${VIMLANG:-n}
|
||||
GRSECURITY_HOST=${GRSECURITY_HOST:-n}
|
||||
CUSTOM_TOOLS=${CUSTOM_TOOLS:-n}
|
||||
REBUILD_MAKEFILE=${REBUILD_MAKEFILE:-n}
|
||||
INSTALL_LOG=${INSTALL_LOG:-n}
|
||||
CLEAN=${CLEAN:=n}
|
||||
SET_SSP=${SET_SSP:=n}
|
||||
SET_ASLR=${SET_ASLR:=n}
|
||||
SET_PAX=${SET_PAX:=n}
|
||||
SET_HARDENED_TMP=${SET_HARDENED_TMP:=n}
|
||||
SET_WARNINGS=${SET_WARNINGS:=n}
|
||||
SET_MISC=${SET_MISC:=n}
|
||||
SET_BLOWFISH=${SET_BLOWFISH:=n}
|
||||
|
||||
# Book surces envars
|
||||
BRANCH_ID=${BRANCH_ID:=development}
|
||||
|
||||
case $BRANCH_ID in
|
||||
development )
|
||||
case $PROGNAME in
|
||||
clfs2 ) TREE=branches/clfs-sysroot/BOOK ;;
|
||||
clfs3 ) TREE=branches/clfs-embedded/BOOK ;;
|
||||
*) TREE=trunk/BOOK ;;
|
||||
esac
|
||||
LFSVRS=development
|
||||
;;
|
||||
*EDIT* ) echo " You forgot to set the branch or stable book version."
|
||||
echo " Please rerun make and fix the configuration."
|
||||
exit 2 ;;
|
||||
branch-* )
|
||||
LFSVRS=${BRANCH_ID}
|
||||
TREE=branches/${BRANCH_ID#branch-}/BOOK
|
||||
;;
|
||||
* )
|
||||
case $PROGNAME in
|
||||
lfs | hlfs )
|
||||
LFSVRS=${BRANCH_ID}
|
||||
TREE=tags/${BRANCH_ID}/BOOK
|
||||
;;
|
||||
clfs | clfs2 | clfs3)
|
||||
LFSVRS=${BRANCH_ID}
|
||||
TREE=tags/${BRANCH_ID}
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
# Set the document location...
|
||||
BOOK=${BOOK:=$PROGNAME-$LFSVRS}
|
||||
|
||||
# blfs-tool envars
|
||||
BLFS_TOOL=${BLFS_TOOL:-n}
|
||||
if [[ "${BLFS_TOOL}" = "y" ]] ; then
|
||||
BLFS_BRANCH_ID=${BLFS_BRANCH_ID:=development}
|
||||
case $BLFS_BRANCH_ID in
|
||||
development ) BLFS_TREE=trunk/BOOK ;;
|
||||
*EDIT* ) echo " You forgot to set the BLFS branch or stable book version."
|
||||
echo " Please rerun make and fix the configuration."
|
||||
exit 2 ;;
|
||||
branch-* ) BLFS_TREE=branches/${BLFS_BRANCH_ID#branch-} ;;
|
||||
* ) BLFS_TREE=tags/${BLFS_BRANCH_ID} ;;
|
||||
esac
|
||||
# Dependencies envars, to can update it more easy.
|
||||
# Tidy and Unzip version are harcoded also in wrt_blfs_tool_targets()
|
||||
# libxml2
|
||||
LIBXML_PKG="libxml2-2.6.29.tar.gz"
|
||||
LIBXML_URL="ftp://xmlsoft.org/libxml2/${LIBXML_PKG}"
|
||||
LIBXML_MD5="8b99b6e8b08e838438d9e6b639d79ebd"
|
||||
# libxslt
|
||||
LIBXSLT_PKG="libxslt-1.1.21.tar.gz"
|
||||
LIBXSLT_URL="ftp://xmlsoft.org/libxslt/${LIBXSLT_PKG}"
|
||||
LIBXSLT_MD5="59fe34e85692f71df2a38c2ee291b3ca"
|
||||
# tidy
|
||||
TIDY_PKG="tidy-cvs_20070326.tar.bz2"
|
||||
TIDY_URL="http://anduin.linuxfromscratch.org/files/BLFS/sources/${TIDY_PKG}"
|
||||
TIDY_MD5="468bfaa5cf917a8ecbe7834c13a61376"
|
||||
# unzip
|
||||
UNZIP_PKG="unzip552.tar.gz"
|
||||
UNZIP_URL="http://downloads.sourceforge.net/infozip/${UNZIP_PKG}"
|
||||
UNZIP_MD5="9d23919999d6eac9217d1f41472034a9"
|
||||
# unzip security patch
|
||||
UNZIP_PATCH="unzip-5.52-security_fix-1.patch"
|
||||
UNZIP_PATCH_URL="http://www.linuxfromscratch.org/patches/blfs/svn/${UNZIP_PATCH}"
|
||||
UNZIP_PATCH_MD5="00ebf64fdda2ad54ddfc619f85f328bb"
|
||||
# DocBook XML DTD
|
||||
DBXML_PKG="docbook-xml-4.5.zip"
|
||||
DBXML_URL="http://www.docbook.org/xml/4.5/${DBXML_PKG}"
|
||||
DBXML_MD5="03083e288e87a7e829e437358da7ef9e"
|
||||
# DocBook XSL
|
||||
# DBXSL_PKG="docbook-xsl-1.69.1.tar.bz2"
|
||||
# DBXSL_URL="http://prdownloads.sourceforge.net/docbook/${DBXSL_PKG}"
|
||||
# DBXSL_MD5="6ebd29a67f2dcc3f2220f475ee6f6552"
|
||||
# Links
|
||||
LINKS_PKG="links-2.1pre23.tar.bz2"
|
||||
LINKS_URL="http://links.twibright.com/download/${LINKS_PKG}"
|
||||
LINKS_MD5="4a1fb575c133eee821b9a1f8e9220b40"
|
||||
# sudo
|
||||
SUDO_PKG="sudo-1.6.8p12.tar.gz"
|
||||
SUDO_URL="http://anduin.linuxfromscratch.org/sources/BLFS/svn/s/${SUDO_PKG}"
|
||||
SUDO_MD5="b29893c06192df6230dd5f340f3badf5"
|
||||
# sudo envar fix patch
|
||||
SUDO_PATCH="sudo-1.6.8p12-envvar_fix-1.patch"
|
||||
SUDO_PATCH_URL="http://www.linuxfromscratch.org/patches/blfs/svn/${SUDO_PATCH}"
|
||||
SUDO_PATCH_MD5="454925aedfe054dff8fe0d03b209f986"
|
||||
# wget
|
||||
WGET_PKG="wget-1.10.2.tar.gz"
|
||||
WGET_URL="ftp://ftp.gnu.org/gnu/wget/${WGET_PKG}"
|
||||
WGET_MD5="795fefbb7099f93e2d346b026785c4b8"
|
||||
# Subversion
|
||||
SVN_PKG="subversion-1.3.1.tar.bz2"
|
||||
SVN_URL="http://subversion.tigris.org/tarballs/${SVN_PKG}"
|
||||
SVN_MD5="07b95963968ae345541ca99d0e7bf082"
|
||||
# GPM
|
||||
GPM_PKG="gpm-1.20.1.tar.bz2"
|
||||
GPM_URL="ftp://ftp.linux.ee/pub/gentoo/distfiles/distfiles/${GPM_PKG}"
|
||||
GPM_MD5="2c63e827d755527950d9d13fe3d87692"
|
||||
# GPM segfaul patch
|
||||
GPM_PATCH_1="gpm-1.20.1-segfault-1.patch"
|
||||
GPM_PATCH_1_URL="http://www.linuxfromscratch.org/patches/blfs/svn/${GPM_PATCH_1}"
|
||||
GPM_PATCH_1_MD5="8c88f92990ba7613014fcd1db14ca7ac"
|
||||
# GPM silent patch
|
||||
GPM_PATCH_2="gpm-1.20.1-silent-1.patch"
|
||||
GPM_PATCH_2_URL="http://www.linuxfromscratch.org/patches/blfs/svn/${GPM_PATCH_2}"
|
||||
GPM_PATCH_2_MD5="bf6cbefe20c6f15b587f19ebc1c8a37a"
|
||||
fi
|
||||
|
||||
#--- Envars not sourced from configuration
|
||||
case $PROGNAME in
|
||||
clfs* ) declare -r SVN="http://svn.cross-lfs.org/svn/repos" ;;
|
||||
* ) declare -r SVN="svn://svn.linuxfromscratch.org" ;;
|
||||
esac
|
||||
declare -r LOG=000-masterscript.log
|
||||
# Needed to can fetch BLFS book sources when building CLFS
|
||||
declare -r SVN_2="svn://svn.linuxfromscratch.org"
|
||||
|
||||
# Set true internal variables
|
||||
COMMON_DIR="common"
|
||||
PACKAGE_DIR=$(echo $PROGNAME | tr '[a-z]' '[A-Z]')
|
||||
MODULE=$PACKAGE_DIR/master.sh
|
||||
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading common-functions module..."
|
||||
source $COMMON_DIR/common-functions
|
||||
[[ $? > 0 ]] && echo " $COMMON_DIR/common-functions did not load.." && exit
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading code module <$MODULE>..."
|
||||
source $MODULE
|
||||
[[ $? > 0 ]] && echo "$MODULE did not load.." && exit 2
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
#
|
||||
[[ $VERBOSITY > 0 ]] && echo "${SD_BORDER}${nl_}"
|
||||
|
||||
|
||||
#*******************************************************************#
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading function <func_check_version.sh>..."
|
||||
source $COMMON_DIR/libs/func_check_version.sh
|
||||
[[ $? > 0 ]] && echo " function module did not load.." && exit 2
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading function <func_validate_configs.sh>..."
|
||||
source $COMMON_DIR/libs/func_validate_configs.sh
|
||||
[[ $? > 0 ]] && echo " function module did not load.." && exit 2
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading function <func_custom_pkgs>..."
|
||||
source $COMMON_DIR/libs/func_custom_pkgs
|
||||
[[ $? > 0 ]] && echo " function module did not load.." && exit 2
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
|
||||
|
||||
[[ $VERBOSITY > 0 ]] && echo "${SD_BORDER}${nl_}"
|
||||
|
||||
|
||||
###################################
|
||||
### MAIN ###
|
||||
###################################
|
||||
|
||||
# Check for build prereequisites.
|
||||
echo
|
||||
check_prerequisites
|
||||
echo "${SD_BORDER}${nl_}"
|
||||
|
||||
validate_config
|
||||
echo "${SD_BORDER}${nl_}"
|
||||
echo -n "Are you happy with these settings? yes/no (no): "
|
||||
read ANSWER
|
||||
if [ x$ANSWER != "xyes" ] ; then
|
||||
echo "${nl_}Rerun make to fix the configuration options.${nl_}"
|
||||
exit 1
|
||||
fi
|
||||
echo "${nl_}${SD_BORDER}${nl_}"
|
||||
|
||||
# Load additional modules or configuration files based on global settings
|
||||
# compare module
|
||||
if [[ "$COMPARE" = "y" ]]; then
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading compare module..."
|
||||
source $COMMON_DIR/libs/func_compare.sh
|
||||
[[ $? > 0 ]] && echo "$COMMON_DIR/libs/func_compare.sh did not load.." && exit
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
fi
|
||||
#
|
||||
# optimize module
|
||||
if [[ "$OPTIMIZE" != "0" ]]; then
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading optimization module..."
|
||||
source optimize/optimize_functions
|
||||
[[ $? > 0 ]] && echo " optimize/optimize_functions did not load.." && exit
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
#
|
||||
# optimize configurations
|
||||
[[ $VERBOSITY > 0 ]] && echo -n "Loading optimization config..."
|
||||
source optimize/opt_config
|
||||
[[ $? > 0 ]] && echo " optimize/opt_config did not load.." && exit
|
||||
[[ $VERBOSITY > 0 ]] && echo "OK"
|
||||
# Validate optimize settings, if required
|
||||
validate_opt_settings
|
||||
fi
|
||||
#
|
||||
|
||||
if [[ "$REBUILD_MAKEFILE" = "n" ]] ; then
|
||||
|
||||
# If $BUILDDIR has subdirectories like tools/ or bin/, stop the run
|
||||
# and notify the user about that.
|
||||
if [ -d $BUILDDIR/tools -o -d $BUILDDIR/bin ] && [ -z $CLEAN ] ; then
|
||||
eval "$no_empty_builddir"
|
||||
fi
|
||||
|
||||
# If requested, clean the build directory
|
||||
clean_builddir
|
||||
|
||||
if [[ ! -d $JHALFSDIR ]]; then
|
||||
mkdir -p $JHALFSDIR
|
||||
fi
|
||||
|
||||
# Create $BUILDDIR/sources even though it could be created by get_sources()
|
||||
if [[ ! -d $BUILDDIR/sources ]]; then
|
||||
mkdir -p $BUILDDIR/sources
|
||||
fi
|
||||
#
|
||||
# Create the log directory
|
||||
if [[ ! -d $LOGDIR ]]; then
|
||||
mkdir $LOGDIR
|
||||
fi
|
||||
>$LOGDIR/$LOG
|
||||
#
|
||||
# Copy common helper files
|
||||
cp $COMMON_DIR/{makefile-functions,progress_bar.sh,packages.xsl} $JHALFSDIR/
|
||||
#
|
||||
# Fix the XSL book parser
|
||||
sed 's,FAKEDIR,'$BOOK',' $PACKAGE_DIR/$XSL > $JHALFSDIR/${XSL}
|
||||
export XSL=$JHALFSDIR/${XSL}
|
||||
#
|
||||
|
||||
# Copy urls.xsl, if needed
|
||||
[[ "$GETPKG" = "y" ]] && cp $COMMON_DIR/urls.xsl $JHALFSDIR/
|
||||
#
|
||||
# Create the test-log directory, if needed
|
||||
[[ "$TEST" != "0" ]] && [[ ! -d $TESTLOGDIR ]] && install -d -m 1777 $TESTLOGDIR
|
||||
#
|
||||
# Create the installed-files directory, if needed
|
||||
[[ "$INSTALL_LOG" = "y" ]] && [[ ! -d $FILELOGDIR ]] && install -d -m 1777 $FILELOGDIR
|
||||
#
|
||||
# Prepare report creation, if needed
|
||||
if [[ "$REPORT" = "y" ]]; then
|
||||
cp $COMMON_DIR/create-sbu_du-report.sh $JHALFSDIR/
|
||||
# After being sure that all looks sane, dump the settings to a file
|
||||
# This file will be used to create the REPORT header
|
||||
validate_config > $JHALFSDIR/jhalfs.config
|
||||
fi
|
||||
#
|
||||
# Copy optimize files, if needed
|
||||
[[ "$OPTIMIZE" != "0" ]] && cp optimize/opt_override $JHALFSDIR/
|
||||
#
|
||||
# Copy compare files, if needed
|
||||
if [[ "$COMPARE" = "y" ]]; then
|
||||
mkdir -p $JHALFSDIR/extras
|
||||
cp extras/* $JHALFSDIR/extras
|
||||
fi
|
||||
#
|
||||
|
||||
# Copy custom tools config files, if requested
|
||||
if [[ "${CUSTOM_TOOLS}" = "y" ]]; then
|
||||
echo "Copying custom tool scripts to $JHALFSDIR"
|
||||
mkdir -p $JHALFSDIR/custom-commands
|
||||
cp -f custom/config/* $JHALFSDIR/custom-commands
|
||||
fi
|
||||
#
|
||||
# Install blfs-tool, if requested.
|
||||
if [[ "${BLFS_TOOL}" = "y" ]] ; then
|
||||
# Install the files
|
||||
[[ ! -d ${BUILDDIR}${BLFS_ROOT} ]] && mkdir -p ${BUILDDIR}${BLFS_ROOT}
|
||||
cp -r BLFS/* ${BUILDDIR}${BLFS_ROOT}
|
||||
cp -r menu ${BUILDDIR}${BLFS_ROOT}
|
||||
cp $COMMON_DIR/progress_bar.sh ${BUILDDIR}${BLFS_ROOT}
|
||||
chmod 777 ${BUILDDIR}${BLFS_ROOT}/progress_bar.sh
|
||||
cp README.BLFS ${BUILDDIR}${BLFS_ROOT}
|
||||
# Clean-up
|
||||
rm -rf ${BUILDDIR}${BLFS_ROOT}/libs/.svn
|
||||
rm -rf ${BUILDDIR}${BLFS_ROOT}/menu/.svn
|
||||
rm -rf ${BUILDDIR}${BLFS_ROOT}/menu/lxdialog/.svn
|
||||
# Set some harcoded envars to their proper values
|
||||
sed -i 's,blfs-xml,'$BLFS_XML',' ${BUILDDIR}${BLFS_ROOT}/{update_book.sh,libs/book.xsl}
|
||||
sed -i 's,tracking-dir,'$TRACKING_DIR',' ${BUILDDIR}${BLFS_ROOT}/{update_book.sh,gen-makefile.sh}
|
||||
# Copy the dependencies build scripts
|
||||
cp -r $COMMON_DIR/blfs-tool-deps $JHALFSDIR/
|
||||
rm -rf $JHALFSDIR/blfs-tool-deps/.svn
|
||||
fi
|
||||
#
|
||||
|
||||
get_book
|
||||
echo "${SD_BORDER}${nl_}"
|
||||
|
||||
# Get the BLFS book, if requested.
|
||||
if [[ "${BLFS_TOOL}" = "y" ]] ; then
|
||||
echo -n "Downloading the BLFS document, $BLFS_BRANCH_ID version... "
|
||||
if [[ ! -d ${BUILDDIR}${BLFS_ROOT}/${BLFS_XML} ]] ; then
|
||||
mkdir -p ${BUILDDIR}${BLFS_ROOT}/${BLFS_XML}
|
||||
svn co $SVN_2/BLFS/$BLFS_TREE ${BUILDDIR}${BLFS_ROOT}/${BLFS_XML} >>$LOGDIR/$LOG 2>&1
|
||||
else
|
||||
pushd ${BUILDDIR}${BLFS_ROOT}/${BLFS_XML} 1> /dev/null
|
||||
svn up >>$LOGDIR/$LOG 2>&1
|
||||
popd 1> /dev/null
|
||||
fi
|
||||
echo -ne "done\n"
|
||||
echo "${SD_BORDER}${nl_}"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
# When regeneration the Makefile we need to know also the canonical book version
|
||||
if [[ "$REBUILD_MAKEFILE" = "y" ]] ; then
|
||||
case $PROGNAME in
|
||||
clfs | clfs2 | clfs3 )
|
||||
VERSION=$(xmllint --noent $JHALFSDIR/$BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
|
||||
*)
|
||||
VERSION=$(xmllint --noent $JHALFSDIR/$BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
build_Makefile
|
||||
|
||||
echo "${SD_BORDER}${nl_}"
|
||||
|
||||
run_make
|
507
2.3/menu/BusyBox-1.1.3-menu.patch
Normal file
507
2.3/menu/BusyBox-1.1.3-menu.patch
Normal file
|
@ -0,0 +1,507 @@
|
|||
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 <andersen@codepoet.org>
|
||||
|
||||
- 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 <andersen@codepoet.org>
|
||||
+ # 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();
|
255
2.3/menu/Kconfig-language.txt
Normal file
255
2.3/menu/Kconfig-language.txt
Normal file
|
@ -0,0 +1,255 @@
|
|||
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" <prompt> ["if" <expr>]
|
||||
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" <symbol> ["if" <expr>]
|
||||
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" <expr>
|
||||
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:
|
||||
|
||||
<expr> ::= <symbol> (1)
|
||||
<symbol> '=' <symbol> (2)
|
||||
<symbol> '!=' <symbol> (3)
|
||||
'(' <expr> ')' (4)
|
||||
'!' <expr> (5)
|
||||
<expr> '||' <expr> (6)
|
||||
<expr> '&&' <expr> (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" <symbol>
|
||||
<config options>
|
||||
|
||||
This defines a config symbol <symbol> and accepts any of above
|
||||
attributes as options.
|
||||
|
||||
choices:
|
||||
|
||||
"choice"
|
||||
<choice options>
|
||||
<choice block>
|
||||
"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" <prompt>
|
||||
<comment options>
|
||||
|
||||
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" <prompt>
|
||||
<menu options>
|
||||
<menu block>
|
||||
"endmenu"
|
||||
|
||||
This defines a menu block, see "Menu structure" above for more
|
||||
information. The only possible options are dependencies.
|
||||
|
||||
if:
|
||||
|
||||
"if" <expr>
|
||||
<if block>
|
||||
"endif"
|
||||
|
||||
This defines an if block. The dependency expression <expr> is appended
|
||||
to all enclosed menu entries.
|
||||
|
||||
source:
|
||||
|
||||
"source" <prompt>
|
||||
|
||||
This reads the specified configuration file. This file is always parsed.
|
145
2.3/menu/Makefile
Normal file
145
2.3/menu/Makefile
Normal file
|
@ -0,0 +1,145 @@
|
|||
# Makefile for BusyBox
|
||||
#
|
||||
# Copyright (C) 2002 Erik Andersen <andersen@codepoet.org>
|
||||
# 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="<ncurses.h>"
|
||||
else
|
||||
ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h))
|
||||
HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
|
||||
else
|
||||
ifeq (/usr/local/include/ncurses/ncurses.h, $(wildcard /usr/local/include/ncurses/ncurses.h))
|
||||
HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses.h>"
|
||||
else
|
||||
ifeq (/usr/local/include/ncurses/curses.h, $(wildcard /usr/local/include/ncurses/curses.h))
|
||||
HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
|
||||
else
|
||||
ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h))
|
||||
HOSTNCURSES += -DCURSES_LOC="<ncurses.h>"
|
||||
else
|
||||
HOSTNCURSES += -DCURSES_LOC="<curses.h>"
|
||||
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 "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
|
||||
|
573
2.3/menu/conf.c
Normal file
573
2.3/menu/conf.c
Normal file
|
@ -0,0 +1,573 @@
|
|||
/*
|
||||
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||
* Released under the terms of the GNU GPL v2.0.
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#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", menu->sym->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;
|
||||
int type;
|
||||
tristate oldval, newval;
|
||||
const char *help;
|
||||
|
||||
while (1) {
|
||||
printf("%*s%s ", indent - 1, "", menu->prompt->text);
|
||||
if (sym->name)
|
||||
printf("(%s) ", sym->name);
|
||||
type = 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;
|
||||
int type;
|
||||
bool is_new;
|
||||
|
||||
sym = menu->sym;
|
||||
type = 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;
|
||||
}
|
392
2.3/menu/confdata.c
Normal file
392
2.3/menu/confdata.c
Normal file
|
@ -0,0 +1,392 @@
|
|||
/*
|
||||
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||
* Released under the terms of the GNU GPL v2.0.
|
||||
*/
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#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;
|
||||
}
|
1099
2.3/menu/expr.c
Normal file
1099
2.3/menu/expr.c
Normal file
File diff suppressed because it is too large
Load diff
195
2.3/menu/expr.h
Normal file
195
2.3/menu/expr.h
Normal file
|
@ -0,0 +1,195 @@
|
|||
/*
|
||||
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||
* Released under the terms of the GNU GPL v2.0.
|
||||
*/
|
||||
|
||||
#ifndef EXPR_H
|
||||
#define EXPR_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#ifndef __cplusplus
|
||||
#include <stdbool.h>
|
||||
#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 */
|
3688
2.3/menu/lex.zconf.c_shipped
Normal file
3688
2.3/menu/lex.zconf.c_shipped
Normal file
File diff suppressed because it is too large
Load diff
123
2.3/menu/lkc.h
Normal file
123
2.3/menu/lkc.h
Normal file
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||
* Released under the terms of the GNU GPL v2.0.
|
||||
*/
|
||||
|
||||
#ifndef LKC_H
|
||||
#define LKC_H
|
||||
|
||||
#include "expr.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef LKC_DIRECT_LINK
|
||||
#define P(name,type,arg) extern type name arg
|
||||
#else
|
||||
#include "lkc_defs.h"
|
||||
#define P(name,type,arg) extern type (*name ## _p) arg
|
||||
#endif
|
||||
#include "lkc_proto.h"
|
||||
#undef P
|
||||
|
||||
#define SRCTREE "srctree"
|
||||
|
||||
int zconfparse(void);
|
||||
void zconfdump(FILE *out);
|
||||
|
||||
extern int zconfdebug;
|
||||
void zconf_starthelp(void);
|
||||
FILE *zconf_fopen(const char *name);
|
||||
void zconf_initscan(const char *name);
|
||||
void zconf_nextfile(const char *name);
|
||||
int zconf_lineno(void);
|
||||
char *zconf_curname(void);
|
||||
|
||||
/* confdata.c */
|
||||
extern const char conf_def_filename[];
|
||||
extern char conf_filename[];
|
||||
|
||||
char *conf_get_default_confname(void);
|
||||
|
||||
/* kconfig_load.c */
|
||||
void kconfig_load(void);
|
||||
|
||||
/* menu.c */
|
||||
void menu_init(void);
|
||||
void menu_add_menu(void);
|
||||
void menu_end_menu(void);
|
||||
void menu_add_entry(struct symbol *sym);
|
||||
void menu_end_entry(void);
|
||||
void menu_add_dep(struct expr *dep);
|
||||
struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep);
|
||||
void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
|
||||
void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
|
||||
void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
|
||||
void menu_finalize(struct menu *parent);
|
||||
void menu_set_type(int type);
|
||||
|
||||
/* util.c */
|
||||
struct file *file_lookup(const char *name);
|
||||
int file_write_dep(const char *name);
|
||||
|
||||
struct gstr {
|
||||
size_t len;
|
||||
char *s;
|
||||
};
|
||||
struct gstr str_new(void);
|
||||
struct gstr str_assign(const char *s);
|
||||
void str_free(struct gstr *gs);
|
||||
void str_append(struct gstr *gs, const char *s);
|
||||
void str_printf(struct gstr *gs, const char *fmt, ...);
|
||||
const char *str_get(struct gstr *gs);
|
||||
|
||||
/* symbol.c */
|
||||
void sym_init(void);
|
||||
void sym_clear_all_valid(void);
|
||||
void sym_set_changed(struct symbol *sym);
|
||||
struct symbol *sym_check_deps(struct symbol *sym);
|
||||
struct property *prop_alloc(enum prop_type type, struct symbol *sym);
|
||||
struct symbol *prop_get_symbol(struct property *prop);
|
||||
|
||||
static inline tristate sym_get_tristate_value(struct symbol *sym)
|
||||
{
|
||||
return sym->curr.tri;
|
||||
}
|
||||
|
||||
|
||||
static inline struct symbol *sym_get_choice_value(struct symbol *sym)
|
||||
{
|
||||
return (struct symbol *)sym->curr.val;
|
||||
}
|
||||
|
||||
static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval)
|
||||
{
|
||||
return sym_set_tristate_value(chval, yes);
|
||||
}
|
||||
|
||||
static inline bool sym_is_choice(struct symbol *sym)
|
||||
{
|
||||
return sym->flags & SYMBOL_CHOICE ? true : false;
|
||||
}
|
||||
|
||||
static inline bool sym_is_choice_value(struct symbol *sym)
|
||||
{
|
||||
return sym->flags & SYMBOL_CHOICEVAL ? true : false;
|
||||
}
|
||||
|
||||
static inline bool sym_is_optional(struct symbol *sym)
|
||||
{
|
||||
return sym->flags & SYMBOL_OPTIONAL ? true : false;
|
||||
}
|
||||
|
||||
static inline bool sym_has_value(struct symbol *sym)
|
||||
{
|
||||
return sym->flags & SYMBOL_NEW ? false : true;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LKC_H */
|
40
2.3/menu/lkc_proto.h
Normal file
40
2.3/menu/lkc_proto.h
Normal file
|
@ -0,0 +1,40 @@
|
|||
|
||||
/* confdata.c */
|
||||
P(conf_parse,void,(const char *name));
|
||||
P(conf_read,int,(const char *name));
|
||||
P(conf_write,int,(const char *name));
|
||||
|
||||
/* menu.c */
|
||||
P(rootmenu,struct menu,);
|
||||
|
||||
P(menu_is_visible,bool,(struct menu *menu));
|
||||
P(menu_get_prompt,const char *,(struct menu *menu));
|
||||
P(menu_get_root_menu,struct menu *,(struct menu *menu));
|
||||
P(menu_get_parent_menu,struct menu *,(struct menu *menu));
|
||||
|
||||
/* symbol.c */
|
||||
P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
|
||||
P(sym_change_count,int,);
|
||||
|
||||
P(sym_lookup,struct symbol *,(const char *name, int isconst));
|
||||
P(sym_find,struct symbol *,(const char *name));
|
||||
P(sym_re_search,struct symbol **,(const char *pattern));
|
||||
P(sym_type_name,const char *,(enum symbol_type type));
|
||||
P(sym_calc_value,void,(struct symbol *sym));
|
||||
P(sym_get_type,enum symbol_type,(struct symbol *sym));
|
||||
P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri));
|
||||
P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri));
|
||||
P(sym_toggle_tristate_value,tristate,(struct symbol *sym));
|
||||
P(sym_string_valid,bool,(struct symbol *sym, const char *newval));
|
||||
P(sym_string_within_range,bool,(struct symbol *sym, const char *str));
|
||||
P(sym_set_string_value,bool,(struct symbol *sym, const char *newval));
|
||||
P(sym_is_changable,bool,(struct symbol *sym));
|
||||
P(sym_get_choice_prop,struct property *,(struct symbol *sym));
|
||||
P(sym_get_default_prop,struct property *,(struct symbol *sym));
|
||||
P(sym_get_string_value,const char *,(struct symbol *sym));
|
||||
|
||||
P(prop_get_type_name,const char *,(enum prop_type type));
|
||||
|
||||
/* expr.c */
|
||||
P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2));
|
||||
P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken));
|
4
2.3/menu/lxdialog/BIG.FAT.WARNING
Normal file
4
2.3/menu/lxdialog/BIG.FAT.WARNING
Normal file
|
@ -0,0 +1,4 @@
|
|||
This is NOT the official version of dialog. This version has been
|
||||
significantly modified from the original. It is for use by the Linux
|
||||
kernel configuration script. Please do not bother Savio Lam with
|
||||
questions about this program.
|
372
2.3/menu/lxdialog/checklist.c
Normal file
372
2.3/menu/lxdialog/checklist.c
Normal file
|
@ -0,0 +1,372 @@
|
|||
/*
|
||||
* checklist.c -- implements the checklist box
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension
|
||||
* Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
static int list_width, check_x, item_x, checkflag;
|
||||
|
||||
/*
|
||||
* Print list item
|
||||
*/
|
||||
static void
|
||||
print_item (WINDOW * win, const char *item, int status,
|
||||
int choice, int selected)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Clear 'residue' of last item */
|
||||
wattrset (win, menubox_attr);
|
||||
wmove (win, choice, 0);
|
||||
for (i = 0; i < list_width; i++)
|
||||
waddch (win, ' ');
|
||||
|
||||
wmove (win, choice, check_x);
|
||||
wattrset (win, selected ? check_selected_attr : check_attr);
|
||||
if (checkflag == FLAG_CHECK)
|
||||
wprintw (win, "[%c]", status ? 'X' : ' ');
|
||||
else
|
||||
wprintw (win, "(%c)", status ? 'X' : ' ');
|
||||
|
||||
wattrset (win, selected ? tag_selected_attr : tag_attr);
|
||||
mvwaddch(win, choice, item_x, item[0]);
|
||||
wattrset (win, selected ? item_selected_attr : item_attr);
|
||||
waddstr (win, (char *)item+1);
|
||||
if (selected) {
|
||||
wmove (win, choice, check_x+1);
|
||||
wrefresh (win);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Print the scroll indicators.
|
||||
*/
|
||||
static void
|
||||
print_arrows (WINDOW * win, int choice, int item_no, int scroll,
|
||||
int y, int x, int height)
|
||||
{
|
||||
wmove(win, y, x);
|
||||
|
||||
if (scroll > 0) {
|
||||
wattrset (win, uarrow_attr);
|
||||
waddch (win, ACS_UARROW);
|
||||
waddstr (win, "(-)");
|
||||
}
|
||||
else {
|
||||
wattrset (win, menubox_attr);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
}
|
||||
|
||||
y = y + height + 1;
|
||||
wmove(win, y, x);
|
||||
|
||||
if ((height < item_no) && (scroll + choice < item_no - 1)) {
|
||||
wattrset (win, darrow_attr);
|
||||
waddch (win, ACS_DARROW);
|
||||
waddstr (win, "(+)");
|
||||
}
|
||||
else {
|
||||
wattrset (win, menubox_border_attr);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Display the termination buttons
|
||||
*/
|
||||
static void
|
||||
print_buttons( WINDOW *dialog, int height, int width, int selected)
|
||||
{
|
||||
int x = width / 2 - 11;
|
||||
int y = height - 2;
|
||||
|
||||
print_button (dialog, "Select", y, x, selected == 0);
|
||||
print_button (dialog, " Help ", y, x + 14, selected == 1);
|
||||
|
||||
wmove(dialog, y, x+1 + 14*selected);
|
||||
wrefresh (dialog);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display a dialog box with a list of options that can be turned on or off
|
||||
* The `flag' parameter is used to select between radiolist and checklist.
|
||||
*/
|
||||
int
|
||||
dialog_checklist (const char *title, const char *prompt, int height, int width,
|
||||
int list_height, int item_no, struct dialog_list_item ** items,
|
||||
int flag)
|
||||
|
||||
{
|
||||
int i, x, y, box_x, box_y;
|
||||
int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
|
||||
WINDOW *dialog, *list;
|
||||
|
||||
checkflag = flag;
|
||||
|
||||
/* Allocate space for storing item on/off status */
|
||||
if ((status = malloc (sizeof (int) * item_no)) == NULL) {
|
||||
endwin ();
|
||||
fprintf (stderr,
|
||||
"\nCan't allocate memory in dialog_checklist().\n");
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
/* Initializes status */
|
||||
for (i = 0; i < item_no; i++) {
|
||||
status[i] = (items[i]->selected == 1); /* ON */
|
||||
if ((!choice && status[i]) || items[i]->selected == 2) /* SELECTED */
|
||||
choice = i + 1;
|
||||
}
|
||||
if (choice)
|
||||
choice--;
|
||||
|
||||
max_choice = MIN (list_height, item_no);
|
||||
|
||||
/* center dialog box on screen */
|
||||
x = (COLS - width) / 2;
|
||||
y = (LINES - height) / 2;
|
||||
|
||||
draw_shadow (stdscr, y, x, height, width);
|
||||
|
||||
dialog = newwin (height, width, y, x);
|
||||
keypad (dialog, TRUE);
|
||||
|
||||
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||
wattrset (dialog, border_attr);
|
||||
mvwaddch (dialog, height-3, 0, ACS_LTEE);
|
||||
for (i = 0; i < width - 2; i++)
|
||||
waddch (dialog, ACS_HLINE);
|
||||
wattrset (dialog, dialog_attr);
|
||||
waddch (dialog, ACS_RTEE);
|
||||
|
||||
if (title != NULL && strlen(title) >= width-2 ) {
|
||||
/* truncate long title -- mec */
|
||||
char * title2 = malloc(width-2+1);
|
||||
memcpy( title2, title, width-2 );
|
||||
title2[width-2] = '\0';
|
||||
title = title2;
|
||||
}
|
||||
|
||||
if (title != NULL) {
|
||||
wattrset (dialog, title_attr);
|
||||
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||
waddstr (dialog, (char *)title);
|
||||
waddch (dialog, ' ');
|
||||
}
|
||||
|
||||
wattrset (dialog, dialog_attr);
|
||||
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||
|
||||
list_width = width - 6;
|
||||
box_y = height - list_height - 5;
|
||||
box_x = (width - list_width) / 2 - 1;
|
||||
|
||||
/* create new window for the list */
|
||||
list = subwin (dialog, list_height, list_width, y+box_y+1, x+box_x+1);
|
||||
|
||||
keypad (list, TRUE);
|
||||
|
||||
/* draw a box around the list items */
|
||||
draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2,
|
||||
menubox_border_attr, menubox_attr);
|
||||
|
||||
/* Find length of longest item in order to center checklist */
|
||||
check_x = 0;
|
||||
for (i = 0; i < item_no; i++)
|
||||
check_x = MAX (check_x, + strlen (items[i]->name) + 4);
|
||||
|
||||
check_x = (list_width - check_x) / 2;
|
||||
item_x = check_x + 4;
|
||||
|
||||
if (choice >= list_height) {
|
||||
scroll = choice - list_height + 1;
|
||||
choice -= scroll;
|
||||
}
|
||||
|
||||
/* Print the list */
|
||||
for (i = 0; i < max_choice; i++) {
|
||||
print_item (list, items[scroll + i]->name,
|
||||
status[i+scroll], i, i == choice);
|
||||
}
|
||||
|
||||
print_arrows(dialog, choice, item_no, scroll,
|
||||
box_y, box_x + check_x + 5, list_height);
|
||||
|
||||
print_buttons(dialog, height, width, 0);
|
||||
|
||||
wnoutrefresh (list);
|
||||
wnoutrefresh (dialog);
|
||||
doupdate ();
|
||||
|
||||
while (key != ESC) {
|
||||
key = wgetch (dialog);
|
||||
|
||||
for (i = 0; i < max_choice; i++)
|
||||
if (toupper(key) == toupper(items[scroll + i]->name[0]))
|
||||
break;
|
||||
|
||||
|
||||
if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
|
||||
key == '+' || key == '-' ) {
|
||||
if (key == KEY_UP || key == '-') {
|
||||
if (!choice) {
|
||||
if (!scroll)
|
||||
continue;
|
||||
/* Scroll list down */
|
||||
if (list_height > 1) {
|
||||
/* De-highlight current first item */
|
||||
print_item (list, items[scroll]->name,
|
||||
status[scroll], 0, FALSE);
|
||||
scrollok (list, TRUE);
|
||||
wscrl (list, -1);
|
||||
scrollok (list, FALSE);
|
||||
}
|
||||
scroll--;
|
||||
print_item (list, items[scroll]->name,
|
||||
status[scroll], 0, TRUE);
|
||||
wnoutrefresh (list);
|
||||
|
||||
print_arrows(dialog, choice, item_no, scroll,
|
||||
box_y, box_x + check_x + 5, list_height);
|
||||
|
||||
wrefresh (dialog);
|
||||
|
||||
continue; /* wait for another key press */
|
||||
} else
|
||||
i = choice - 1;
|
||||
} else if (key == KEY_DOWN || key == '+') {
|
||||
if (choice == max_choice - 1) {
|
||||
if (scroll + choice >= item_no - 1)
|
||||
continue;
|
||||
/* Scroll list up */
|
||||
if (list_height > 1) {
|
||||
/* De-highlight current last item before scrolling up */
|
||||
print_item (list, items[scroll + max_choice - 1]->name,
|
||||
status[scroll + max_choice - 1],
|
||||
max_choice - 1, FALSE);
|
||||
scrollok (list, TRUE);
|
||||
scroll (list);
|
||||
scrollok (list, FALSE);
|
||||
}
|
||||
scroll++;
|
||||
print_item (list, items[scroll + max_choice - 1]->name,
|
||||
status[scroll + max_choice - 1],
|
||||
max_choice - 1, TRUE);
|
||||
wnoutrefresh (list);
|
||||
|
||||
print_arrows(dialog, choice, item_no, scroll,
|
||||
box_y, box_x + check_x + 5, list_height);
|
||||
|
||||
wrefresh (dialog);
|
||||
|
||||
continue; /* wait for another key press */
|
||||
} else
|
||||
i = choice + 1;
|
||||
}
|
||||
if (i != choice) {
|
||||
/* De-highlight current item */
|
||||
print_item (list, items[scroll + choice]->name,
|
||||
status[scroll + choice], choice, FALSE);
|
||||
/* Highlight new item */
|
||||
choice = i;
|
||||
print_item (list, items[scroll + choice]->name,
|
||||
status[scroll + choice], choice, TRUE);
|
||||
wnoutrefresh (list);
|
||||
wrefresh (dialog);
|
||||
}
|
||||
continue; /* wait for another key press */
|
||||
}
|
||||
switch (key) {
|
||||
case 'H':
|
||||
case 'h':
|
||||
case '?':
|
||||
for (i = 0; i < item_no; i++)
|
||||
items[i]->selected = 0;
|
||||
items[scroll + choice]->selected = 1;
|
||||
delwin (dialog);
|
||||
free (status);
|
||||
return 1;
|
||||
case TAB:
|
||||
case KEY_LEFT:
|
||||
case KEY_RIGHT:
|
||||
button = ((key == KEY_LEFT ? --button : ++button) < 0)
|
||||
? 1 : (button > 1 ? 0 : button);
|
||||
|
||||
print_buttons(dialog, height, width, button);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
case 'S':
|
||||
case 's':
|
||||
case ' ':
|
||||
case '\n':
|
||||
if (!button) {
|
||||
if (flag == FLAG_CHECK) {
|
||||
status[scroll + choice] = !status[scroll + choice];
|
||||
wmove (list, choice, check_x);
|
||||
wattrset (list, check_selected_attr);
|
||||
wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' ');
|
||||
} else {
|
||||
if (!status[scroll + choice]) {
|
||||
for (i = 0; i < item_no; i++)
|
||||
status[i] = 0;
|
||||
status[scroll + choice] = 1;
|
||||
for (i = 0; i < max_choice; i++)
|
||||
print_item (list, items[scroll + i]->name,
|
||||
status[scroll + i], i, i == choice);
|
||||
}
|
||||
}
|
||||
wnoutrefresh (list);
|
||||
wrefresh (dialog);
|
||||
|
||||
for (i = 0; i < item_no; i++) {
|
||||
items[i]->selected = status[i];
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < item_no; i++)
|
||||
items[i]->selected = 0;
|
||||
items[scroll + choice]->selected = 1;
|
||||
}
|
||||
delwin (dialog);
|
||||
free (status);
|
||||
return button;
|
||||
case 'X':
|
||||
case 'x':
|
||||
key = ESC;
|
||||
case ESC:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Now, update everything... */
|
||||
doupdate ();
|
||||
}
|
||||
|
||||
|
||||
delwin (dialog);
|
||||
free (status);
|
||||
return -1; /* ESC pressed */
|
||||
}
|
161
2.3/menu/lxdialog/colors.h
Normal file
161
2.3/menu/lxdialog/colors.h
Normal file
|
@ -0,0 +1,161 @@
|
|||
/*
|
||||
* colors.h -- color attribute definitions
|
||||
*
|
||||
* AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Default color definitions
|
||||
*
|
||||
* *_FG = foreground
|
||||
* *_BG = background
|
||||
* *_HL = highlight?
|
||||
*/
|
||||
#define SCREEN_FG COLOR_CYAN
|
||||
#define SCREEN_BG COLOR_BLUE
|
||||
#define SCREEN_HL TRUE
|
||||
|
||||
#define SHADOW_FG COLOR_BLACK
|
||||
#define SHADOW_BG COLOR_BLACK
|
||||
#define SHADOW_HL TRUE
|
||||
|
||||
#define DIALOG_FG COLOR_BLACK
|
||||
#define DIALOG_BG COLOR_WHITE
|
||||
#define DIALOG_HL FALSE
|
||||
|
||||
#define TITLE_FG COLOR_YELLOW
|
||||
#define TITLE_BG COLOR_WHITE
|
||||
#define TITLE_HL TRUE
|
||||
|
||||
#define BORDER_FG COLOR_WHITE
|
||||
#define BORDER_BG COLOR_WHITE
|
||||
#define BORDER_HL TRUE
|
||||
|
||||
#define BUTTON_ACTIVE_FG COLOR_WHITE
|
||||
#define BUTTON_ACTIVE_BG COLOR_BLUE
|
||||
#define BUTTON_ACTIVE_HL TRUE
|
||||
|
||||
#define BUTTON_INACTIVE_FG COLOR_BLACK
|
||||
#define BUTTON_INACTIVE_BG COLOR_WHITE
|
||||
#define BUTTON_INACTIVE_HL FALSE
|
||||
|
||||
#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE
|
||||
#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE
|
||||
#define BUTTON_KEY_ACTIVE_HL TRUE
|
||||
|
||||
#define BUTTON_KEY_INACTIVE_FG COLOR_RED
|
||||
#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE
|
||||
#define BUTTON_KEY_INACTIVE_HL FALSE
|
||||
|
||||
#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW
|
||||
#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE
|
||||
#define BUTTON_LABEL_ACTIVE_HL TRUE
|
||||
|
||||
#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK
|
||||
#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE
|
||||
#define BUTTON_LABEL_INACTIVE_HL TRUE
|
||||
|
||||
#define INPUTBOX_FG COLOR_BLACK
|
||||
#define INPUTBOX_BG COLOR_WHITE
|
||||
#define INPUTBOX_HL FALSE
|
||||
|
||||
#define INPUTBOX_BORDER_FG COLOR_BLACK
|
||||
#define INPUTBOX_BORDER_BG COLOR_WHITE
|
||||
#define INPUTBOX_BORDER_HL FALSE
|
||||
|
||||
#define SEARCHBOX_FG COLOR_BLACK
|
||||
#define SEARCHBOX_BG COLOR_WHITE
|
||||
#define SEARCHBOX_HL FALSE
|
||||
|
||||
#define SEARCHBOX_TITLE_FG COLOR_YELLOW
|
||||
#define SEARCHBOX_TITLE_BG COLOR_WHITE
|
||||
#define SEARCHBOX_TITLE_HL TRUE
|
||||
|
||||
#define SEARCHBOX_BORDER_FG COLOR_WHITE
|
||||
#define SEARCHBOX_BORDER_BG COLOR_WHITE
|
||||
#define SEARCHBOX_BORDER_HL TRUE
|
||||
|
||||
#define POSITION_INDICATOR_FG COLOR_YELLOW
|
||||
#define POSITION_INDICATOR_BG COLOR_WHITE
|
||||
#define POSITION_INDICATOR_HL TRUE
|
||||
|
||||
#define MENUBOX_FG COLOR_BLACK
|
||||
#define MENUBOX_BG COLOR_WHITE
|
||||
#define MENUBOX_HL FALSE
|
||||
|
||||
#define MENUBOX_BORDER_FG COLOR_WHITE
|
||||
#define MENUBOX_BORDER_BG COLOR_WHITE
|
||||
#define MENUBOX_BORDER_HL TRUE
|
||||
|
||||
#define ITEM_FG COLOR_BLACK
|
||||
#define ITEM_BG COLOR_WHITE
|
||||
#define ITEM_HL FALSE
|
||||
|
||||
#define ITEM_SELECTED_FG COLOR_WHITE
|
||||
#define ITEM_SELECTED_BG COLOR_BLUE
|
||||
#define ITEM_SELECTED_HL TRUE
|
||||
|
||||
#define TAG_FG COLOR_YELLOW
|
||||
#define TAG_BG COLOR_WHITE
|
||||
#define TAG_HL TRUE
|
||||
|
||||
#define TAG_SELECTED_FG COLOR_YELLOW
|
||||
#define TAG_SELECTED_BG COLOR_BLUE
|
||||
#define TAG_SELECTED_HL TRUE
|
||||
|
||||
#define TAG_KEY_FG COLOR_YELLOW
|
||||
#define TAG_KEY_BG COLOR_WHITE
|
||||
#define TAG_KEY_HL TRUE
|
||||
|
||||
#define TAG_KEY_SELECTED_FG COLOR_YELLOW
|
||||
#define TAG_KEY_SELECTED_BG COLOR_BLUE
|
||||
#define TAG_KEY_SELECTED_HL TRUE
|
||||
|
||||
#define CHECK_FG COLOR_BLACK
|
||||
#define CHECK_BG COLOR_WHITE
|
||||
#define CHECK_HL FALSE
|
||||
|
||||
#define CHECK_SELECTED_FG COLOR_WHITE
|
||||
#define CHECK_SELECTED_BG COLOR_BLUE
|
||||
#define CHECK_SELECTED_HL TRUE
|
||||
|
||||
#define UARROW_FG COLOR_GREEN
|
||||
#define UARROW_BG COLOR_WHITE
|
||||
#define UARROW_HL TRUE
|
||||
|
||||
#define DARROW_FG COLOR_GREEN
|
||||
#define DARROW_BG COLOR_WHITE
|
||||
#define DARROW_HL TRUE
|
||||
|
||||
/* End of default color definitions */
|
||||
|
||||
#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y)))
|
||||
#define COLOR_NAME_LEN 10
|
||||
#define COLOR_COUNT 8
|
||||
|
||||
/*
|
||||
* Global variables
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
char name[COLOR_NAME_LEN];
|
||||
int value;
|
||||
} color_names_st;
|
||||
|
||||
extern color_names_st color_names[];
|
||||
extern int color_table[][3];
|
203
2.3/menu/lxdialog/dialog.h
Normal file
203
2.3/menu/lxdialog/dialog.h
Normal file
|
@ -0,0 +1,203 @@
|
|||
|
||||
/*
|
||||
* dialog.h -- common declarations for all dialog modules
|
||||
*
|
||||
* AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef LOCALE
|
||||
#include <locale.h>
|
||||
#endif
|
||||
|
||||
#ifdef CURSES_LOC
|
||||
#ifdef __sun__
|
||||
#define CURS_MACROS
|
||||
#endif
|
||||
#include CURSES_LOC
|
||||
|
||||
/*
|
||||
* Colors in ncurses 1.9.9e do not work properly since foreground and
|
||||
* background colors are OR'd rather than separately masked. This version
|
||||
* of dialog was hacked to work with ncurses 1.9.9e, making it incompatible
|
||||
* with standard curses. The simplest fix (to make this work with standard
|
||||
* curses) uses the wbkgdset() function, not used in the original hack.
|
||||
* Turn it off if we're building with 1.9.9e, since it just confuses things.
|
||||
*/
|
||||
#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE)
|
||||
#define OLD_NCURSES 1
|
||||
#undef wbkgdset
|
||||
#define wbkgdset(w,p) /*nothing*/
|
||||
#else
|
||||
#define OLD_NCURSES 0
|
||||
#endif
|
||||
|
||||
#define TR(params) _tracef params
|
||||
|
||||
#define ESC 27
|
||||
#define TAB 9
|
||||
#define MAX_LEN 2048
|
||||
#define BUF_SIZE (10*1024)
|
||||
#define MIN(x,y) (x < y ? x : y)
|
||||
#define MAX(x,y) (x > y ? x : y)
|
||||
|
||||
|
||||
#ifndef ACS_ULCORNER
|
||||
#define ACS_ULCORNER '+'
|
||||
#endif
|
||||
#ifndef ACS_LLCORNER
|
||||
#define ACS_LLCORNER '+'
|
||||
#endif
|
||||
#ifndef ACS_URCORNER
|
||||
#define ACS_URCORNER '+'
|
||||
#endif
|
||||
#ifndef ACS_LRCORNER
|
||||
#define ACS_LRCORNER '+'
|
||||
#endif
|
||||
#ifndef ACS_HLINE
|
||||
#define ACS_HLINE '-'
|
||||
#endif
|
||||
#ifndef ACS_VLINE
|
||||
#define ACS_VLINE '|'
|
||||
#endif
|
||||
#ifndef ACS_LTEE
|
||||
#define ACS_LTEE '+'
|
||||
#endif
|
||||
#ifndef ACS_RTEE
|
||||
#define ACS_RTEE '+'
|
||||
#endif
|
||||
#ifndef ACS_UARROW
|
||||
#define ACS_UARROW '^'
|
||||
#endif
|
||||
#ifndef ACS_DARROW
|
||||
#define ACS_DARROW 'v'
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Attribute names
|
||||
*/
|
||||
#define screen_attr attributes[0]
|
||||
#define shadow_attr attributes[1]
|
||||
#define dialog_attr attributes[2]
|
||||
#define title_attr attributes[3]
|
||||
#define border_attr attributes[4]
|
||||
#define button_active_attr attributes[5]
|
||||
#define button_inactive_attr attributes[6]
|
||||
#define button_key_active_attr attributes[7]
|
||||
#define button_key_inactive_attr attributes[8]
|
||||
#define button_label_active_attr attributes[9]
|
||||
#define button_label_inactive_attr attributes[10]
|
||||
#define inputbox_attr attributes[11]
|
||||
#define inputbox_border_attr attributes[12]
|
||||
#define searchbox_attr attributes[13]
|
||||
#define searchbox_title_attr attributes[14]
|
||||
#define searchbox_border_attr attributes[15]
|
||||
#define position_indicator_attr attributes[16]
|
||||
#define menubox_attr attributes[17]
|
||||
#define menubox_border_attr attributes[18]
|
||||
#define item_attr attributes[19]
|
||||
#define item_selected_attr attributes[20]
|
||||
#define tag_attr attributes[21]
|
||||
#define tag_selected_attr attributes[22]
|
||||
#define tag_key_attr attributes[23]
|
||||
#define tag_key_selected_attr attributes[24]
|
||||
#define check_attr attributes[25]
|
||||
#define check_selected_attr attributes[26]
|
||||
#define uarrow_attr attributes[27]
|
||||
#define darrow_attr attributes[28]
|
||||
|
||||
/* number of attributes */
|
||||
#define ATTRIBUTE_COUNT 29
|
||||
|
||||
/*
|
||||
* Global variables
|
||||
*/
|
||||
extern bool use_colors;
|
||||
|
||||
extern chtype attributes[];
|
||||
#endif
|
||||
|
||||
extern const char *backtitle;
|
||||
|
||||
struct dialog_list_item {
|
||||
char *name;
|
||||
int namelen;
|
||||
char *tag;
|
||||
int selected; /* Set to 1 by dialog_*() function. */
|
||||
};
|
||||
|
||||
/*
|
||||
* Function prototypes
|
||||
*/
|
||||
|
||||
void init_dialog (void);
|
||||
void end_dialog (void);
|
||||
void dialog_clear (void);
|
||||
#ifdef CURSES_LOC
|
||||
void attr_clear (WINDOW * win, int height, int width, chtype attr);
|
||||
void color_setup (void);
|
||||
void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x);
|
||||
void print_button (WINDOW * win, const char *label, int y, int x, int selected);
|
||||
void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box,
|
||||
chtype border);
|
||||
void draw_shadow (WINDOW * win, int y, int x, int height, int width);
|
||||
#endif
|
||||
|
||||
int first_alpha (const char *string, const char *exempt);
|
||||
int dialog_yesno (const char *title, const char *prompt, int height, int width);
|
||||
int dialog_msgbox (const char *title, const char *prompt, int height,
|
||||
int width, int pause);
|
||||
int dialog_textbox (const char *title, const char *file, int height, int width);
|
||||
int dialog_menu (const char *title, const char *prompt, int height, int width,
|
||||
int menu_height, const char *choice, int item_no,
|
||||
struct dialog_list_item ** items);
|
||||
int dialog_checklist (const char *title, const char *prompt, int height,
|
||||
int width, int list_height, int item_no,
|
||||
struct dialog_list_item ** items, int flag);
|
||||
extern unsigned char dialog_input_result[];
|
||||
int dialog_inputbox (const char *title, const char *prompt, int height,
|
||||
int width, const char *init);
|
||||
|
||||
struct dialog_list_item *first_sel_item(int item_no,
|
||||
struct dialog_list_item ** items);
|
||||
|
||||
/*
|
||||
* This is the base for fictitious keys, which activate
|
||||
* the buttons.
|
||||
*
|
||||
* Mouse-generated keys are the following:
|
||||
* -- the first 32 are used as numbers, in addition to '0'-'9'
|
||||
* -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o')
|
||||
* -- uppercase chars are used to invoke the button (M_EVENT + 'O')
|
||||
*/
|
||||
#ifdef CURSES_LOC
|
||||
#define M_EVENT (KEY_MAX+1)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* The `flag' parameter in checklist is used to select between
|
||||
* radiolist and checklist
|
||||
*/
|
||||
#define FLAG_CHECK 1
|
||||
#define FLAG_RADIO 0
|
240
2.3/menu/lxdialog/inputbox.c
Normal file
240
2.3/menu/lxdialog/inputbox.c
Normal file
|
@ -0,0 +1,240 @@
|
|||
/*
|
||||
* inputbox.c -- implements the input box
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
unsigned char dialog_input_result[MAX_LEN + 1];
|
||||
|
||||
/*
|
||||
* Print the termination buttons
|
||||
*/
|
||||
static void
|
||||
print_buttons(WINDOW *dialog, int height, int width, int selected)
|
||||
{
|
||||
int x = width / 2 - 11;
|
||||
int y = height - 2;
|
||||
|
||||
print_button (dialog, " Ok ", y, x, selected==0);
|
||||
print_button (dialog, " Help ", y, x + 14, selected==1);
|
||||
|
||||
wmove(dialog, y, x+1+14*selected);
|
||||
wrefresh(dialog);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display a dialog box for inputing a string
|
||||
*/
|
||||
int
|
||||
dialog_inputbox (const char *title, const char *prompt, int height, int width,
|
||||
const char *init)
|
||||
{
|
||||
int i, x, y, box_y, box_x, box_width;
|
||||
int input_x = 0, scroll = 0, key = 0, button = -1;
|
||||
unsigned char *instr = dialog_input_result;
|
||||
WINDOW *dialog;
|
||||
|
||||
/* center dialog box on screen */
|
||||
x = (COLS - width) / 2;
|
||||
y = (LINES - height) / 2;
|
||||
|
||||
|
||||
draw_shadow (stdscr, y, x, height, width);
|
||||
|
||||
dialog = newwin (height, width, y, x);
|
||||
keypad (dialog, TRUE);
|
||||
|
||||
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||
wattrset (dialog, border_attr);
|
||||
mvwaddch (dialog, height-3, 0, ACS_LTEE);
|
||||
for (i = 0; i < width - 2; i++)
|
||||
waddch (dialog, ACS_HLINE);
|
||||
wattrset (dialog, dialog_attr);
|
||||
waddch (dialog, ACS_RTEE);
|
||||
|
||||
if (title != NULL && strlen(title) >= width-2 ) {
|
||||
/* truncate long title -- mec */
|
||||
char * title2 = malloc(width-2+1);
|
||||
memcpy( title2, title, width-2 );
|
||||
title2[width-2] = '\0';
|
||||
title = title2;
|
||||
}
|
||||
|
||||
if (title != NULL) {
|
||||
wattrset (dialog, title_attr);
|
||||
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||
waddstr (dialog, (char *)title);
|
||||
waddch (dialog, ' ');
|
||||
}
|
||||
|
||||
wattrset (dialog, dialog_attr);
|
||||
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||
|
||||
/* Draw the input field box */
|
||||
box_width = width - 6;
|
||||
getyx (dialog, y, x);
|
||||
box_y = y + 2;
|
||||
box_x = (width - box_width) / 2;
|
||||
draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2,
|
||||
border_attr, dialog_attr);
|
||||
|
||||
print_buttons(dialog, height, width, 0);
|
||||
|
||||
/* Set up the initial value */
|
||||
wmove (dialog, box_y, box_x);
|
||||
wattrset (dialog, inputbox_attr);
|
||||
|
||||
if (!init)
|
||||
instr[0] = '\0';
|
||||
else
|
||||
strcpy (instr, init);
|
||||
|
||||
input_x = strlen (instr);
|
||||
|
||||
if (input_x >= box_width) {
|
||||
scroll = input_x - box_width + 1;
|
||||
input_x = box_width - 1;
|
||||
for (i = 0; i < box_width - 1; i++)
|
||||
waddch (dialog, instr[scroll + i]);
|
||||
} else
|
||||
waddstr (dialog, instr);
|
||||
|
||||
wmove (dialog, box_y, box_x + input_x);
|
||||
|
||||
wrefresh (dialog);
|
||||
|
||||
while (key != ESC) {
|
||||
key = wgetch (dialog);
|
||||
|
||||
if (button == -1) { /* Input box selected */
|
||||
switch (key) {
|
||||
case TAB:
|
||||
case KEY_UP:
|
||||
case KEY_DOWN:
|
||||
break;
|
||||
case KEY_LEFT:
|
||||
continue;
|
||||
case KEY_RIGHT:
|
||||
continue;
|
||||
case KEY_BACKSPACE:
|
||||
case 127:
|
||||
if (input_x || scroll) {
|
||||
wattrset (dialog, inputbox_attr);
|
||||
if (!input_x) {
|
||||
scroll = scroll < box_width - 1 ?
|
||||
0 : scroll - (box_width - 1);
|
||||
wmove (dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width; i++)
|
||||
waddch (dialog, instr[scroll + input_x + i] ?
|
||||
instr[scroll + input_x + i] : ' ');
|
||||
input_x = strlen (instr) - scroll;
|
||||
} else
|
||||
input_x--;
|
||||
instr[scroll + input_x] = '\0';
|
||||
mvwaddch (dialog, box_y, input_x + box_x, ' ');
|
||||
wmove (dialog, box_y, input_x + box_x);
|
||||
wrefresh (dialog);
|
||||
}
|
||||
continue;
|
||||
default:
|
||||
if (key < 0x100 && isprint (key)) {
|
||||
if (scroll + input_x < MAX_LEN) {
|
||||
wattrset (dialog, inputbox_attr);
|
||||
instr[scroll + input_x] = key;
|
||||
instr[scroll + input_x + 1] = '\0';
|
||||
if (input_x == box_width - 1) {
|
||||
scroll++;
|
||||
wmove (dialog, box_y, box_x);
|
||||
for (i = 0; i < box_width - 1; i++)
|
||||
waddch (dialog, instr[scroll + i]);
|
||||
} else {
|
||||
wmove (dialog, box_y, input_x++ + box_x);
|
||||
waddch (dialog, key);
|
||||
}
|
||||
wrefresh (dialog);
|
||||
} else
|
||||
flash (); /* Alarm user about overflow */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
switch (key) {
|
||||
case 'O':
|
||||
case 'o':
|
||||
delwin (dialog);
|
||||
return 0;
|
||||
case 'H':
|
||||
case 'h':
|
||||
delwin (dialog);
|
||||
return 1;
|
||||
case KEY_UP:
|
||||
case KEY_LEFT:
|
||||
switch (button) {
|
||||
case -1:
|
||||
button = 1; /* Indicates "Cancel" button is selected */
|
||||
print_buttons(dialog, height, width, 1);
|
||||
break;
|
||||
case 0:
|
||||
button = -1; /* Indicates input box is selected */
|
||||
print_buttons(dialog, height, width, 0);
|
||||
wmove (dialog, box_y, box_x + input_x);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
case 1:
|
||||
button = 0; /* Indicates "OK" button is selected */
|
||||
print_buttons(dialog, height, width, 0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TAB:
|
||||
case KEY_DOWN:
|
||||
case KEY_RIGHT:
|
||||
switch (button) {
|
||||
case -1:
|
||||
button = 0; /* Indicates "OK" button is selected */
|
||||
print_buttons(dialog, height, width, 0);
|
||||
break;
|
||||
case 0:
|
||||
button = 1; /* Indicates "Cancel" button is selected */
|
||||
print_buttons(dialog, height, width, 1);
|
||||
break;
|
||||
case 1:
|
||||
button = -1; /* Indicates input box is selected */
|
||||
print_buttons(dialog, height, width, 0);
|
||||
wmove (dialog, box_y, box_x + input_x);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ' ':
|
||||
case '\n':
|
||||
delwin (dialog);
|
||||
return (button == -1 ? 0 : button);
|
||||
case 'X':
|
||||
case 'x':
|
||||
key = ESC;
|
||||
case ESC:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
delwin (dialog);
|
||||
return -1; /* ESC pressed */
|
||||
}
|
438
2.3/menu/lxdialog/menubox.c
Normal file
438
2.3/menu/lxdialog/menubox.c
Normal file
|
@ -0,0 +1,438 @@
|
|||
/*
|
||||
* menubox.c -- implements the menu box
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Changes by Clifford Wolf (god@clifford.at)
|
||||
*
|
||||
* [ 1998-06-13 ]
|
||||
*
|
||||
* *) A bugfix for the Page-Down problem
|
||||
*
|
||||
* *) Formerly when I used Page Down and Page Up, the cursor would be set
|
||||
* to the first position in the menu box. Now lxdialog is a bit
|
||||
* smarter and works more like other menu systems (just have a look at
|
||||
* it).
|
||||
*
|
||||
* *) Formerly if I selected something my scrolling would be broken because
|
||||
* lxdialog is re-invoked by the Menuconfig shell script, can't
|
||||
* remember the last scrolling position, and just sets it so that the
|
||||
* cursor is at the bottom of the box. Now it writes the temporary file
|
||||
* lxdialog.scrltmp which contains this information. The file is
|
||||
* deleted by lxdialog if the user leaves a submenu or enters a new
|
||||
* one, but it would be nice if Menuconfig could make another "rm -f"
|
||||
* just to be sure. Just try it out - you will recognise a difference!
|
||||
*
|
||||
* [ 1998-06-14 ]
|
||||
*
|
||||
* *) Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files
|
||||
* and menus change their size on the fly.
|
||||
*
|
||||
* *) If for some reason the last scrolling position is not saved by
|
||||
* lxdialog, it sets the scrolling so that the selected item is in the
|
||||
* middle of the menu box, not at the bottom.
|
||||
*
|
||||
* 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
|
||||
* Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus.
|
||||
* This fixes a bug in Menuconfig where using ' ' to descend into menus
|
||||
* would leave mis-synchronized lxdialog.scrltmp files lying around,
|
||||
* fscanf would read in 'scroll', and eventually that value would get used.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
static int menu_width, item_x;
|
||||
|
||||
/*
|
||||
* Print menu item
|
||||
*/
|
||||
static void
|
||||
print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey)
|
||||
{
|
||||
int j;
|
||||
char menu_item[menu_width+1];
|
||||
|
||||
strncpy(menu_item, item, menu_width);
|
||||
menu_item[menu_width] = 0;
|
||||
j = first_alpha(menu_item, "YyNnMmHh");
|
||||
|
||||
/* Clear 'residue' of last item */
|
||||
wattrset (win, menubox_attr);
|
||||
wmove (win, choice, 0);
|
||||
#if OLD_NCURSES
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < menu_width; i++)
|
||||
waddch (win, ' ');
|
||||
}
|
||||
#else
|
||||
wclrtoeol(win);
|
||||
#endif
|
||||
wattrset (win, selected ? item_selected_attr : item_attr);
|
||||
mvwaddstr (win, choice, item_x, menu_item);
|
||||
if (hotkey) {
|
||||
wattrset (win, selected ? tag_key_selected_attr : tag_key_attr);
|
||||
mvwaddch(win, choice, item_x+j, menu_item[j]);
|
||||
}
|
||||
if (selected) {
|
||||
wmove (win, choice, item_x+1);
|
||||
wrefresh (win);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Print the scroll indicators.
|
||||
*/
|
||||
static void
|
||||
print_arrows (WINDOW * win, int item_no, int scroll,
|
||||
int y, int x, int height)
|
||||
{
|
||||
int cur_y, cur_x;
|
||||
|
||||
getyx(win, cur_y, cur_x);
|
||||
|
||||
wmove(win, y, x);
|
||||
|
||||
if (scroll > 0) {
|
||||
wattrset (win, uarrow_attr);
|
||||
waddch (win, ACS_UARROW);
|
||||
waddstr (win, "(-)");
|
||||
}
|
||||
else {
|
||||
wattrset (win, menubox_attr);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
}
|
||||
|
||||
y = y + height + 1;
|
||||
wmove(win, y, x);
|
||||
|
||||
if ((height < item_no) && (scroll + height < item_no)) {
|
||||
wattrset (win, darrow_attr);
|
||||
waddch (win, ACS_DARROW);
|
||||
waddstr (win, "(+)");
|
||||
}
|
||||
else {
|
||||
wattrset (win, menubox_border_attr);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
waddch (win, ACS_HLINE);
|
||||
}
|
||||
|
||||
wmove(win, cur_y, cur_x);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display the termination buttons.
|
||||
*/
|
||||
static void
|
||||
print_buttons (WINDOW *win, int height, int width, int selected)
|
||||
{
|
||||
int x = width / 2 - 16;
|
||||
int y = height - 2;
|
||||
|
||||
print_button (win, "Select", y, x, selected == 0);
|
||||
print_button (win, " Exit ", y, x + 12, selected == 1);
|
||||
print_button (win, " Help ", y, x + 24, selected == 2);
|
||||
|
||||
wmove(win, y, x+1+12*selected);
|
||||
wrefresh (win);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display a menu for choosing among a number of options
|
||||
*/
|
||||
int
|
||||
dialog_menu (const char *title, const char *prompt, int height, int width,
|
||||
int menu_height, const char *current, int item_no,
|
||||
struct dialog_list_item ** items)
|
||||
{
|
||||
int i, j, x, y, box_x, box_y;
|
||||
int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, max_choice;
|
||||
WINDOW *dialog, *menu;
|
||||
FILE *f;
|
||||
|
||||
max_choice = MIN (menu_height, item_no);
|
||||
|
||||
/* center dialog box on screen */
|
||||
x = (COLS - width) / 2;
|
||||
y = (LINES - height) / 2;
|
||||
|
||||
draw_shadow (stdscr, y, x, height, width);
|
||||
|
||||
dialog = newwin (height, width, y, x);
|
||||
keypad (dialog, TRUE);
|
||||
|
||||
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||
wattrset (dialog, border_attr);
|
||||
mvwaddch (dialog, height - 3, 0, ACS_LTEE);
|
||||
for (i = 0; i < width - 2; i++)
|
||||
waddch (dialog, ACS_HLINE);
|
||||
wattrset (dialog, dialog_attr);
|
||||
wbkgdset (dialog, dialog_attr & A_COLOR);
|
||||
waddch (dialog, ACS_RTEE);
|
||||
|
||||
if (title != NULL && strlen(title) >= width-2 ) {
|
||||
/* truncate long title -- mec */
|
||||
char * title2 = malloc(width-2+1);
|
||||
memcpy( title2, title, width-2 );
|
||||
title2[width-2] = '\0';
|
||||
title = title2;
|
||||
}
|
||||
|
||||
if (title != NULL) {
|
||||
wattrset (dialog, title_attr);
|
||||
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||
waddstr (dialog, (char *)title);
|
||||
waddch (dialog, ' ');
|
||||
}
|
||||
|
||||
wattrset (dialog, dialog_attr);
|
||||
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||
|
||||
menu_width = width - 6;
|
||||
box_y = height - menu_height - 5;
|
||||
box_x = (width - menu_width) / 2 - 1;
|
||||
|
||||
/* create new window for the menu */
|
||||
menu = subwin (dialog, menu_height, menu_width,
|
||||
y + box_y + 1, x + box_x + 1);
|
||||
keypad (menu, TRUE);
|
||||
|
||||
/* draw a box around the menu items */
|
||||
draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2,
|
||||
menubox_border_attr, menubox_attr);
|
||||
|
||||
/*
|
||||
* Find length of longest item in order to center menu.
|
||||
* Set 'choice' to default item.
|
||||
*/
|
||||
item_x = 0;
|
||||
for (i = 0; i < item_no; i++) {
|
||||
item_x = MAX (item_x, MIN(menu_width, strlen (items[i]->name) + 2));
|
||||
if (strcmp(current, items[i]->tag) == 0) choice = i;
|
||||
}
|
||||
|
||||
item_x = (menu_width - item_x) / 2;
|
||||
|
||||
/* get the scroll info from the temp file */
|
||||
if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) {
|
||||
if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) &&
|
||||
(scroll+max_choice > choice) && (scroll >= 0) &&
|
||||
(scroll+max_choice <= item_no) ) {
|
||||
first_item = scroll;
|
||||
choice = choice - scroll;
|
||||
fclose(f);
|
||||
} else {
|
||||
scroll=0;
|
||||
remove("lxdialog.scrltmp");
|
||||
fclose(f);
|
||||
f=NULL;
|
||||
}
|
||||
}
|
||||
if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) {
|
||||
if (choice >= item_no-max_choice/2)
|
||||
scroll = first_item = item_no-max_choice;
|
||||
else
|
||||
scroll = first_item = choice - max_choice/2;
|
||||
choice = choice - scroll;
|
||||
}
|
||||
|
||||
/* Print the menu */
|
||||
for (i=0; i < max_choice; i++) {
|
||||
print_item (menu, items[first_item + i]->name, i, i == choice,
|
||||
(items[first_item + i]->tag[0] != ':'));
|
||||
}
|
||||
|
||||
wnoutrefresh (menu);
|
||||
|
||||
print_arrows(dialog, item_no, scroll,
|
||||
box_y, box_x+item_x+1, menu_height);
|
||||
|
||||
print_buttons (dialog, height, width, 0);
|
||||
wmove (menu, choice, item_x+1);
|
||||
wrefresh (menu);
|
||||
|
||||
while (key != ESC) {
|
||||
key = wgetch(menu);
|
||||
|
||||
if (key < 256 && isalpha(key)) key = tolower(key);
|
||||
|
||||
if (strchr("ynmh", key))
|
||||
i = max_choice;
|
||||
else {
|
||||
for (i = choice+1; i < max_choice; i++) {
|
||||
j = first_alpha(items[scroll + i]->name, "YyNnMmHh");
|
||||
if (key == tolower(items[scroll + i]->name[j]))
|
||||
break;
|
||||
}
|
||||
if (i == max_choice)
|
||||
for (i = 0; i < max_choice; i++) {
|
||||
j = first_alpha(items[scroll + i]->name, "YyNnMmHh");
|
||||
if (key == tolower(items[scroll + i]->name[j]))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < max_choice ||
|
||||
key == KEY_UP || key == KEY_DOWN ||
|
||||
key == '-' || key == '+' ||
|
||||
key == KEY_PPAGE || key == KEY_NPAGE) {
|
||||
|
||||
print_item (menu, items[scroll + choice]->name, choice, FALSE,
|
||||
(items[scroll + choice]->tag[0] != ':'));
|
||||
|
||||
if (key == KEY_UP || key == '-') {
|
||||
if (choice < 2 && scroll) {
|
||||
/* Scroll menu down */
|
||||
scrollok (menu, TRUE);
|
||||
wscrl (menu, -1);
|
||||
scrollok (menu, FALSE);
|
||||
|
||||
scroll--;
|
||||
|
||||
print_item (menu, items[scroll]->name, 0, FALSE,
|
||||
(items[scroll]->tag[0] != ':'));
|
||||
} else
|
||||
choice = MAX(choice - 1, 0);
|
||||
|
||||
} else if (key == KEY_DOWN || key == '+') {
|
||||
|
||||
print_item (menu, items[scroll + choice]->name, choice, FALSE,
|
||||
(items[scroll + choice]->tag[0] != ':'));
|
||||
|
||||
if ((choice > max_choice-3) &&
|
||||
(scroll + max_choice < item_no)
|
||||
) {
|
||||
/* Scroll menu up */
|
||||
scrollok (menu, TRUE);
|
||||
scroll (menu);
|
||||
scrollok (menu, FALSE);
|
||||
|
||||
scroll++;
|
||||
|
||||
print_item (menu, items[scroll + max_choice - 1]->name,
|
||||
max_choice-1, FALSE,
|
||||
(items[scroll + max_choice - 1]->tag[0] != ':'));
|
||||
} else
|
||||
choice = MIN(choice+1, max_choice-1);
|
||||
|
||||
} else if (key == KEY_PPAGE) {
|
||||
scrollok (menu, TRUE);
|
||||
for (i=0; (i < max_choice); i++) {
|
||||
if (scroll > 0) {
|
||||
wscrl (menu, -1);
|
||||
scroll--;
|
||||
print_item (menu, items[scroll]->name, 0, FALSE,
|
||||
(items[scroll]->tag[0] != ':'));
|
||||
} else {
|
||||
if (choice > 0)
|
||||
choice--;
|
||||
}
|
||||
}
|
||||
scrollok (menu, FALSE);
|
||||
|
||||
} else if (key == KEY_NPAGE) {
|
||||
for (i=0; (i < max_choice); i++) {
|
||||
if (scroll+max_choice < item_no) {
|
||||
scrollok (menu, TRUE);
|
||||
scroll(menu);
|
||||
scrollok (menu, FALSE);
|
||||
scroll++;
|
||||
print_item (menu, items[scroll + max_choice - 1]->name,
|
||||
max_choice-1, FALSE,
|
||||
(items[scroll + max_choice - 1]->tag[0] != ':'));
|
||||
} else {
|
||||
if (choice+1 < max_choice)
|
||||
choice++;
|
||||
}
|
||||
}
|
||||
|
||||
} else
|
||||
choice = i;
|
||||
|
||||
print_item (menu, items[scroll + choice]->name, choice, TRUE,
|
||||
(items[scroll + choice]->tag[0] != ':'));
|
||||
|
||||
print_arrows(dialog, item_no, scroll,
|
||||
box_y, box_x+item_x+1, menu_height);
|
||||
|
||||
wnoutrefresh (dialog);
|
||||
wrefresh (menu);
|
||||
|
||||
continue; /* wait for another key press */
|
||||
}
|
||||
|
||||
switch (key) {
|
||||
case KEY_LEFT:
|
||||
case TAB:
|
||||
case KEY_RIGHT:
|
||||
button = ((key == KEY_LEFT ? --button : ++button) < 0)
|
||||
? 2 : (button > 2 ? 0 : button);
|
||||
|
||||
print_buttons(dialog, height, width, button);
|
||||
wrefresh (menu);
|
||||
break;
|
||||
case ' ':
|
||||
case 's':
|
||||
case 'y':
|
||||
case 'n':
|
||||
case 'm':
|
||||
case '/':
|
||||
/* save scroll info */
|
||||
if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) {
|
||||
fprintf(f,"%d\n",scroll);
|
||||
fclose(f);
|
||||
}
|
||||
delwin (dialog);
|
||||
items[scroll + choice]->selected = 1;
|
||||
switch (key) {
|
||||
case 's': return 3;
|
||||
case 'y': return 3;
|
||||
case 'n': return 4;
|
||||
case 'm': return 5;
|
||||
case ' ': return 6;
|
||||
case '/': return 7;
|
||||
}
|
||||
return 0;
|
||||
case 'h':
|
||||
case '?':
|
||||
button = 2;
|
||||
case '\n':
|
||||
delwin (dialog);
|
||||
items[scroll + choice]->selected = 1;
|
||||
|
||||
remove("lxdialog.scrltmp");
|
||||
return button;
|
||||
case 'e':
|
||||
case 'x':
|
||||
key = ESC;
|
||||
case ESC:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
delwin (dialog);
|
||||
remove("lxdialog.scrltmp");
|
||||
return -1; /* ESC pressed */
|
||||
}
|
85
2.3/menu/lxdialog/msgbox.c
Normal file
85
2.3/menu/lxdialog/msgbox.c
Normal file
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
* msgbox.c -- implements the message box and info box
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
/*
|
||||
* Display a message box. Program will pause and display an "OK" button
|
||||
* if the parameter 'pause' is non-zero.
|
||||
*/
|
||||
int
|
||||
dialog_msgbox (const char *title, const char *prompt, int height, int width,
|
||||
int pause)
|
||||
{
|
||||
int i, x, y, key = 0;
|
||||
WINDOW *dialog;
|
||||
|
||||
/* center dialog box on screen */
|
||||
x = (COLS - width) / 2;
|
||||
y = (LINES - height) / 2;
|
||||
|
||||
draw_shadow (stdscr, y, x, height, width);
|
||||
|
||||
dialog = newwin (height, width, y, x);
|
||||
keypad (dialog, TRUE);
|
||||
|
||||
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||
|
||||
if (title != NULL && strlen(title) >= width-2 ) {
|
||||
/* truncate long title -- mec */
|
||||
char * title2 = malloc(width-2+1);
|
||||
memcpy( title2, title, width-2 );
|
||||
title2[width-2] = '\0';
|
||||
title = title2;
|
||||
}
|
||||
|
||||
if (title != NULL) {
|
||||
wattrset (dialog, title_attr);
|
||||
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||
waddstr (dialog, (char *)title);
|
||||
waddch (dialog, ' ');
|
||||
}
|
||||
wattrset (dialog, dialog_attr);
|
||||
print_autowrap (dialog, prompt, width - 2, 1, 2);
|
||||
|
||||
if (pause) {
|
||||
wattrset (dialog, border_attr);
|
||||
mvwaddch (dialog, height - 3, 0, ACS_LTEE);
|
||||
for (i = 0; i < width - 2; i++)
|
||||
waddch (dialog, ACS_HLINE);
|
||||
wattrset (dialog, dialog_attr);
|
||||
waddch (dialog, ACS_RTEE);
|
||||
|
||||
print_button (dialog, " Ok ",
|
||||
height - 2, width / 2 - 4, TRUE);
|
||||
|
||||
wrefresh (dialog);
|
||||
while (key != ESC && key != '\n' && key != ' ' &&
|
||||
key != 'O' && key != 'o' && key != 'X' && key != 'x')
|
||||
key = wgetch (dialog);
|
||||
} else {
|
||||
key = '\n';
|
||||
wrefresh (dialog);
|
||||
}
|
||||
|
||||
delwin (dialog);
|
||||
return key == ESC ? -1 : 0;
|
||||
}
|
556
2.3/menu/lxdialog/textbox.c
Normal file
556
2.3/menu/lxdialog/textbox.c
Normal file
|
@ -0,0 +1,556 @@
|
|||
/*
|
||||
* textbox.c -- implements the text box
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
static void back_lines (int n);
|
||||
static void print_page (WINDOW * win, int height, int width);
|
||||
static void print_line (WINDOW * win, int row, int width);
|
||||
static char *get_line (void);
|
||||
static void print_position (WINDOW * win, int height, int width);
|
||||
|
||||
static int hscroll, fd, file_size, bytes_read;
|
||||
static int begin_reached = 1, end_reached, page_length;
|
||||
static char *buf, *page;
|
||||
|
||||
/*
|
||||
* Display text from a file in a dialog box.
|
||||
*/
|
||||
int
|
||||
dialog_textbox (const char *title, const char *file, int height, int width)
|
||||
{
|
||||
int i, x, y, cur_x, cur_y, fpos, key = 0;
|
||||
int passed_end;
|
||||
char search_term[MAX_LEN + 1];
|
||||
WINDOW *dialog, *text;
|
||||
|
||||
search_term[0] = '\0'; /* no search term entered yet */
|
||||
|
||||
/* Open input file for reading */
|
||||
if ((fd = open (file, O_RDONLY)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr,
|
||||
"\nCan't open input file in dialog_textbox().\n");
|
||||
exit (-1);
|
||||
}
|
||||
/* Get file size. Actually, 'file_size' is the real file size - 1,
|
||||
since it's only the last byte offset from the beginning */
|
||||
if ((file_size = lseek (fd, 0, SEEK_END)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError getting file size in dialog_textbox().\n");
|
||||
exit (-1);
|
||||
}
|
||||
/* Restore file pointer to beginning of file after getting file size */
|
||||
if (lseek (fd, 0, SEEK_SET) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError moving file pointer in dialog_textbox().\n");
|
||||
exit (-1);
|
||||
}
|
||||
/* Allocate space for read buffer */
|
||||
if ((buf = malloc (BUF_SIZE + 1)) == NULL) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nCan't allocate memory in dialog_textbox().\n");
|
||||
exit (-1);
|
||||
}
|
||||
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError reading file in dialog_textbox().\n");
|
||||
exit (-1);
|
||||
}
|
||||
buf[bytes_read] = '\0'; /* mark end of valid data */
|
||||
page = buf; /* page is pointer to start of page to be displayed */
|
||||
|
||||
/* center dialog box on screen */
|
||||
x = (COLS - width) / 2;
|
||||
y = (LINES - height) / 2;
|
||||
|
||||
|
||||
draw_shadow (stdscr, y, x, height, width);
|
||||
|
||||
dialog = newwin (height, width, y, x);
|
||||
keypad (dialog, TRUE);
|
||||
|
||||
/* Create window for text region, used for scrolling text */
|
||||
text = subwin (dialog, height - 4, width - 2, y + 1, x + 1);
|
||||
wattrset (text, dialog_attr);
|
||||
wbkgdset (text, dialog_attr & A_COLOR);
|
||||
|
||||
keypad (text, TRUE);
|
||||
|
||||
/* register the new window, along with its borders */
|
||||
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||
|
||||
wattrset (dialog, border_attr);
|
||||
mvwaddch (dialog, height-3, 0, ACS_LTEE);
|
||||
for (i = 0; i < width - 2; i++)
|
||||
waddch (dialog, ACS_HLINE);
|
||||
wattrset (dialog, dialog_attr);
|
||||
wbkgdset (dialog, dialog_attr & A_COLOR);
|
||||
waddch (dialog, ACS_RTEE);
|
||||
|
||||
if (title != NULL && strlen(title) >= width-2 ) {
|
||||
/* truncate long title -- mec */
|
||||
char * title2 = malloc(width-2+1);
|
||||
memcpy( title2, title, width-2 );
|
||||
title2[width-2] = '\0';
|
||||
title = title2;
|
||||
}
|
||||
|
||||
if (title != NULL) {
|
||||
wattrset (dialog, title_attr);
|
||||
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||
waddstr (dialog, (char *)title);
|
||||
waddch (dialog, ' ');
|
||||
}
|
||||
print_button (dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
|
||||
wnoutrefresh (dialog);
|
||||
getyx (dialog, cur_y, cur_x); /* Save cursor position */
|
||||
|
||||
/* Print first page of text */
|
||||
attr_clear (text, height - 4, width - 2, dialog_attr);
|
||||
print_page (text, height - 4, width - 2);
|
||||
print_position (dialog, height, width);
|
||||
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
|
||||
wrefresh (dialog);
|
||||
|
||||
while ((key != ESC) && (key != '\n')) {
|
||||
key = wgetch (dialog);
|
||||
switch (key) {
|
||||
case 'E': /* Exit */
|
||||
case 'e':
|
||||
case 'X':
|
||||
case 'x':
|
||||
delwin (dialog);
|
||||
free (buf);
|
||||
close (fd);
|
||||
return 0;
|
||||
case 'g': /* First page */
|
||||
case KEY_HOME:
|
||||
if (!begin_reached) {
|
||||
begin_reached = 1;
|
||||
/* First page not in buffer? */
|
||||
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr,
|
||||
"\nError moving file pointer in dialog_textbox().\n");
|
||||
exit (-1);
|
||||
}
|
||||
if (fpos > bytes_read) { /* Yes, we have to read it in */
|
||||
if (lseek (fd, 0, SEEK_SET) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError moving file pointer in "
|
||||
"dialog_textbox().\n");
|
||||
exit (-1);
|
||||
}
|
||||
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr,
|
||||
"\nError reading file in dialog_textbox().\n");
|
||||
exit (-1);
|
||||
}
|
||||
buf[bytes_read] = '\0';
|
||||
}
|
||||
page = buf;
|
||||
print_page (text, height - 4, width - 2);
|
||||
print_position (dialog, height, width);
|
||||
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
|
||||
wrefresh (dialog);
|
||||
}
|
||||
break;
|
||||
case 'G': /* Last page */
|
||||
case KEY_END:
|
||||
|
||||
end_reached = 1;
|
||||
/* Last page not in buffer? */
|
||||
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr,
|
||||
"\nError moving file pointer in dialog_textbox().\n");
|
||||
exit (-1);
|
||||
}
|
||||
if (fpos < file_size) { /* Yes, we have to read it in */
|
||||
if (lseek (fd, -BUF_SIZE, SEEK_END) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr,
|
||||
"\nError moving file pointer in dialog_textbox().\n");
|
||||
exit (-1);
|
||||
}
|
||||
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr,
|
||||
"\nError reading file in dialog_textbox().\n");
|
||||
exit (-1);
|
||||
}
|
||||
buf[bytes_read] = '\0';
|
||||
}
|
||||
page = buf + bytes_read;
|
||||
back_lines (height - 4);
|
||||
print_page (text, height - 4, width - 2);
|
||||
print_position (dialog, height, width);
|
||||
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
case 'K': /* Previous line */
|
||||
case 'k':
|
||||
case KEY_UP:
|
||||
if (!begin_reached) {
|
||||
back_lines (page_length + 1);
|
||||
|
||||
/* We don't call print_page() here but use scrolling to ensure
|
||||
faster screen update. However, 'end_reached' and
|
||||
'page_length' should still be updated, and 'page' should
|
||||
point to start of next page. This is done by calling
|
||||
get_line() in the following 'for' loop. */
|
||||
scrollok (text, TRUE);
|
||||
wscrl (text, -1); /* Scroll text region down one line */
|
||||
scrollok (text, FALSE);
|
||||
page_length = 0;
|
||||
passed_end = 0;
|
||||
for (i = 0; i < height - 4; i++) {
|
||||
if (!i) {
|
||||
/* print first line of page */
|
||||
print_line (text, 0, width - 2);
|
||||
wnoutrefresh (text);
|
||||
} else
|
||||
/* Called to update 'end_reached' and 'page' */
|
||||
get_line ();
|
||||
if (!passed_end)
|
||||
page_length++;
|
||||
if (end_reached && !passed_end)
|
||||
passed_end = 1;
|
||||
}
|
||||
|
||||
print_position (dialog, height, width);
|
||||
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
|
||||
wrefresh (dialog);
|
||||
}
|
||||
break;
|
||||
case 'B': /* Previous page */
|
||||
case 'b':
|
||||
case KEY_PPAGE:
|
||||
if (begin_reached)
|
||||
break;
|
||||
back_lines (page_length + height - 4);
|
||||
print_page (text, height - 4, width - 2);
|
||||
print_position (dialog, height, width);
|
||||
wmove (dialog, cur_y, cur_x);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
case 'J': /* Next line */
|
||||
case 'j':
|
||||
case KEY_DOWN:
|
||||
if (!end_reached) {
|
||||
begin_reached = 0;
|
||||
scrollok (text, TRUE);
|
||||
scroll (text); /* Scroll text region up one line */
|
||||
scrollok (text, FALSE);
|
||||
print_line (text, height - 5, width - 2);
|
||||
wnoutrefresh (text);
|
||||
print_position (dialog, height, width);
|
||||
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
|
||||
wrefresh (dialog);
|
||||
}
|
||||
break;
|
||||
case KEY_NPAGE: /* Next page */
|
||||
case ' ':
|
||||
if (end_reached)
|
||||
break;
|
||||
|
||||
begin_reached = 0;
|
||||
print_page (text, height - 4, width - 2);
|
||||
print_position (dialog, height, width);
|
||||
wmove (dialog, cur_y, cur_x);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
case '0': /* Beginning of line */
|
||||
case 'H': /* Scroll left */
|
||||
case 'h':
|
||||
case KEY_LEFT:
|
||||
if (hscroll <= 0)
|
||||
break;
|
||||
|
||||
if (key == '0')
|
||||
hscroll = 0;
|
||||
else
|
||||
hscroll--;
|
||||
/* Reprint current page to scroll horizontally */
|
||||
back_lines (page_length);
|
||||
print_page (text, height - 4, width - 2);
|
||||
wmove (dialog, cur_y, cur_x);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
case 'L': /* Scroll right */
|
||||
case 'l':
|
||||
case KEY_RIGHT:
|
||||
if (hscroll >= MAX_LEN)
|
||||
break;
|
||||
hscroll++;
|
||||
/* Reprint current page to scroll horizontally */
|
||||
back_lines (page_length);
|
||||
print_page (text, height - 4, width - 2);
|
||||
wmove (dialog, cur_y, cur_x);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
case ESC:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
delwin (dialog);
|
||||
free (buf);
|
||||
close (fd);
|
||||
return 1; /* ESC pressed */
|
||||
}
|
||||
|
||||
/*
|
||||
* Go back 'n' lines in text file. Called by dialog_textbox().
|
||||
* 'page' will be updated to point to the desired line in 'buf'.
|
||||
*/
|
||||
static void
|
||||
back_lines (int n)
|
||||
{
|
||||
int i, fpos;
|
||||
|
||||
begin_reached = 0;
|
||||
/* We have to distinguish between end_reached and !end_reached
|
||||
since at end of file, the line is not ended by a '\n'.
|
||||
The code inside 'if' basically does a '--page' to move one
|
||||
character backward so as to skip '\n' of the previous line */
|
||||
if (!end_reached) {
|
||||
/* Either beginning of buffer or beginning of file reached? */
|
||||
if (page == buf) {
|
||||
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError moving file pointer in "
|
||||
"back_lines().\n");
|
||||
exit (-1);
|
||||
}
|
||||
if (fpos > bytes_read) { /* Not beginning of file yet */
|
||||
/* We've reached beginning of buffer, but not beginning of
|
||||
file yet, so read previous part of file into buffer.
|
||||
Note that we only move backward for BUF_SIZE/2 bytes,
|
||||
but not BUF_SIZE bytes to avoid re-reading again in
|
||||
print_page() later */
|
||||
/* Really possible to move backward BUF_SIZE/2 bytes? */
|
||||
if (fpos < BUF_SIZE / 2 + bytes_read) {
|
||||
/* No, move less then */
|
||||
if (lseek (fd, 0, SEEK_SET) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError moving file pointer in "
|
||||
"back_lines().\n");
|
||||
exit (-1);
|
||||
}
|
||||
page = buf + fpos - bytes_read;
|
||||
} else { /* Move backward BUF_SIZE/2 bytes */
|
||||
if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR)
|
||||
== -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError moving file pointer "
|
||||
"in back_lines().\n");
|
||||
exit (-1);
|
||||
}
|
||||
page = buf + BUF_SIZE / 2;
|
||||
}
|
||||
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError reading file in back_lines().\n");
|
||||
exit (-1);
|
||||
}
|
||||
buf[bytes_read] = '\0';
|
||||
} else { /* Beginning of file reached */
|
||||
begin_reached = 1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (*(--page) != '\n') { /* '--page' here */
|
||||
/* Something's wrong... */
|
||||
endwin ();
|
||||
fprintf (stderr, "\nInternal error in back_lines().\n");
|
||||
exit (-1);
|
||||
}
|
||||
}
|
||||
/* Go back 'n' lines */
|
||||
for (i = 0; i < n; i++)
|
||||
do {
|
||||
if (page == buf) {
|
||||
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr,
|
||||
"\nError moving file pointer in back_lines().\n");
|
||||
exit (-1);
|
||||
}
|
||||
if (fpos > bytes_read) {
|
||||
/* Really possible to move backward BUF_SIZE/2 bytes? */
|
||||
if (fpos < BUF_SIZE / 2 + bytes_read) {
|
||||
/* No, move less then */
|
||||
if (lseek (fd, 0, SEEK_SET) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError moving file pointer "
|
||||
"in back_lines().\n");
|
||||
exit (-1);
|
||||
}
|
||||
page = buf + fpos - bytes_read;
|
||||
} else { /* Move backward BUF_SIZE/2 bytes */
|
||||
if (lseek (fd, -(BUF_SIZE / 2 + bytes_read),
|
||||
SEEK_CUR) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError moving file pointer"
|
||||
" in back_lines().\n");
|
||||
exit (-1);
|
||||
}
|
||||
page = buf + BUF_SIZE / 2;
|
||||
}
|
||||
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError reading file in "
|
||||
"back_lines().\n");
|
||||
exit (-1);
|
||||
}
|
||||
buf[bytes_read] = '\0';
|
||||
} else { /* Beginning of file reached */
|
||||
begin_reached = 1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
} while (*(--page) != '\n');
|
||||
page++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Print a new page of text. Called by dialog_textbox().
|
||||
*/
|
||||
static void
|
||||
print_page (WINDOW * win, int height, int width)
|
||||
{
|
||||
int i, passed_end = 0;
|
||||
|
||||
page_length = 0;
|
||||
for (i = 0; i < height; i++) {
|
||||
print_line (win, i, width);
|
||||
if (!passed_end)
|
||||
page_length++;
|
||||
if (end_reached && !passed_end)
|
||||
passed_end = 1;
|
||||
}
|
||||
wnoutrefresh (win);
|
||||
}
|
||||
|
||||
/*
|
||||
* Print a new line of text. Called by dialog_textbox() and print_page().
|
||||
*/
|
||||
static void
|
||||
print_line (WINDOW * win, int row, int width)
|
||||
{
|
||||
int y, x;
|
||||
char *line;
|
||||
|
||||
line = get_line ();
|
||||
line += MIN (strlen (line), hscroll); /* Scroll horizontally */
|
||||
wmove (win, row, 0); /* move cursor to correct line */
|
||||
waddch (win, ' ');
|
||||
waddnstr (win, line, MIN (strlen (line), width - 2));
|
||||
|
||||
getyx (win, y, x);
|
||||
/* Clear 'residue' of previous line */
|
||||
#if OLD_NCURSES
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < width - x; i++)
|
||||
waddch (win, ' ');
|
||||
}
|
||||
#else
|
||||
wclrtoeol(win);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Return current line of text. Called by dialog_textbox() and print_line().
|
||||
* 'page' should point to start of current line before calling, and will be
|
||||
* updated to point to start of next line.
|
||||
*/
|
||||
static char *
|
||||
get_line (void)
|
||||
{
|
||||
int i = 0, fpos;
|
||||
static char line[MAX_LEN + 1];
|
||||
|
||||
end_reached = 0;
|
||||
while (*page != '\n') {
|
||||
if (*page == '\0') {
|
||||
/* Either end of file or end of buffer reached */
|
||||
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError moving file pointer in "
|
||||
"get_line().\n");
|
||||
exit (-1);
|
||||
}
|
||||
if (fpos < file_size) { /* Not end of file yet */
|
||||
/* We've reached end of buffer, but not end of file yet,
|
||||
so read next part of file into buffer */
|
||||
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError reading file in get_line().\n");
|
||||
exit (-1);
|
||||
}
|
||||
buf[bytes_read] = '\0';
|
||||
page = buf;
|
||||
} else {
|
||||
if (!end_reached)
|
||||
end_reached = 1;
|
||||
break;
|
||||
}
|
||||
} else if (i < MAX_LEN)
|
||||
line[i++] = *(page++);
|
||||
else {
|
||||
/* Truncate lines longer than MAX_LEN characters */
|
||||
if (i == MAX_LEN)
|
||||
line[i++] = '\0';
|
||||
page++;
|
||||
}
|
||||
}
|
||||
if (i <= MAX_LEN)
|
||||
line[i] = '\0';
|
||||
if (!end_reached)
|
||||
page++; /* move pass '\n' */
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
/*
|
||||
* Print current position
|
||||
*/
|
||||
static void
|
||||
print_position (WINDOW * win, int height, int width)
|
||||
{
|
||||
int fpos, percent;
|
||||
|
||||
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||
endwin ();
|
||||
fprintf (stderr, "\nError moving file pointer in print_position().\n");
|
||||
exit (-1);
|
||||
}
|
||||
wattrset (win, position_indicator_attr);
|
||||
wbkgdset (win, position_indicator_attr & A_COLOR);
|
||||
percent = !file_size ?
|
||||
100 : ((fpos - bytes_read + page - buf) * 100) / file_size;
|
||||
wmove (win, height - 3, width - 9);
|
||||
wprintw (win, "(%3d%%)", percent);
|
||||
}
|
378
2.3/menu/lxdialog/util.c
Normal file
378
2.3/menu/lxdialog/util.c
Normal file
|
@ -0,0 +1,378 @@
|
|||
/*
|
||||
* util.c
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
|
||||
/* use colors by default? */
|
||||
bool use_colors = 1;
|
||||
|
||||
const char *backtitle = NULL;
|
||||
|
||||
const char *dialog_result;
|
||||
|
||||
/*
|
||||
* Attribute values, default is for mono display
|
||||
*/
|
||||
chtype attributes[] =
|
||||
{
|
||||
A_NORMAL, /* screen_attr */
|
||||
A_NORMAL, /* shadow_attr */
|
||||
A_NORMAL, /* dialog_attr */
|
||||
A_BOLD, /* title_attr */
|
||||
A_NORMAL, /* border_attr */
|
||||
A_REVERSE, /* button_active_attr */
|
||||
A_DIM, /* button_inactive_attr */
|
||||
A_REVERSE, /* button_key_active_attr */
|
||||
A_BOLD, /* button_key_inactive_attr */
|
||||
A_REVERSE, /* button_label_active_attr */
|
||||
A_NORMAL, /* button_label_inactive_attr */
|
||||
A_NORMAL, /* inputbox_attr */
|
||||
A_NORMAL, /* inputbox_border_attr */
|
||||
A_NORMAL, /* searchbox_attr */
|
||||
A_BOLD, /* searchbox_title_attr */
|
||||
A_NORMAL, /* searchbox_border_attr */
|
||||
A_BOLD, /* position_indicator_attr */
|
||||
A_NORMAL, /* menubox_attr */
|
||||
A_NORMAL, /* menubox_border_attr */
|
||||
A_NORMAL, /* item_attr */
|
||||
A_REVERSE, /* item_selected_attr */
|
||||
A_BOLD, /* tag_attr */
|
||||
A_REVERSE, /* tag_selected_attr */
|
||||
A_BOLD, /* tag_key_attr */
|
||||
A_REVERSE, /* tag_key_selected_attr */
|
||||
A_BOLD, /* check_attr */
|
||||
A_REVERSE, /* check_selected_attr */
|
||||
A_BOLD, /* uarrow_attr */
|
||||
A_BOLD /* darrow_attr */
|
||||
};
|
||||
|
||||
|
||||
#include "colors.h"
|
||||
|
||||
/*
|
||||
* Table of color values
|
||||
*/
|
||||
int color_table[][3] =
|
||||
{
|
||||
{SCREEN_FG, SCREEN_BG, SCREEN_HL},
|
||||
{SHADOW_FG, SHADOW_BG, SHADOW_HL},
|
||||
{DIALOG_FG, DIALOG_BG, DIALOG_HL},
|
||||
{TITLE_FG, TITLE_BG, TITLE_HL},
|
||||
{BORDER_FG, BORDER_BG, BORDER_HL},
|
||||
{BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
|
||||
{BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
|
||||
{BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
|
||||
{BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL},
|
||||
{BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL},
|
||||
{BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
|
||||
BUTTON_LABEL_INACTIVE_HL},
|
||||
{INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
|
||||
{INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
|
||||
{SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
|
||||
{SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
|
||||
{SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
|
||||
{POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
|
||||
{MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
|
||||
{MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
|
||||
{ITEM_FG, ITEM_BG, ITEM_HL},
|
||||
{ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
|
||||
{TAG_FG, TAG_BG, TAG_HL},
|
||||
{TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
|
||||
{TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
|
||||
{TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
|
||||
{CHECK_FG, CHECK_BG, CHECK_HL},
|
||||
{CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
|
||||
{UARROW_FG, UARROW_BG, UARROW_HL},
|
||||
{DARROW_FG, DARROW_BG, DARROW_HL},
|
||||
}; /* color_table */
|
||||
|
||||
/*
|
||||
* Set window to attribute 'attr'
|
||||
*/
|
||||
void
|
||||
attr_clear (WINDOW * win, int height, int width, chtype attr)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
wattrset (win, attr);
|
||||
for (i = 0; i < height; i++) {
|
||||
wmove (win, i, 0);
|
||||
for (j = 0; j < width; j++)
|
||||
waddch (win, ' ');
|
||||
}
|
||||
touchwin (win);
|
||||
}
|
||||
|
||||
void dialog_clear (void)
|
||||
{
|
||||
attr_clear (stdscr, LINES, COLS, screen_attr);
|
||||
/* Display background title if it exists ... - SLH */
|
||||
if (backtitle != NULL) {
|
||||
int i;
|
||||
|
||||
wattrset (stdscr, screen_attr);
|
||||
mvwaddstr (stdscr, 0, 1, (char *)backtitle);
|
||||
wmove (stdscr, 1, 1);
|
||||
for (i = 1; i < COLS - 1; i++)
|
||||
waddch (stdscr, ACS_HLINE);
|
||||
}
|
||||
wnoutrefresh (stdscr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do some initialization for dialog
|
||||
*/
|
||||
void
|
||||
init_dialog (void)
|
||||
{
|
||||
#ifdef LOCALE
|
||||
setlocale(LC_CTYPE, ""); /* required by ncurses on linux UTF-8 console */
|
||||
#endif
|
||||
initscr (); /* Init curses */
|
||||
keypad (stdscr, TRUE);
|
||||
cbreak ();
|
||||
noecho ();
|
||||
|
||||
|
||||
if (use_colors) /* Set up colors */
|
||||
color_setup ();
|
||||
|
||||
|
||||
dialog_clear ();
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup for color display
|
||||
*/
|
||||
void
|
||||
color_setup (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (has_colors ()) { /* Terminal supports color? */
|
||||
start_color ();
|
||||
|
||||
/* Initialize color pairs */
|
||||
for (i = 0; i < ATTRIBUTE_COUNT; i++)
|
||||
init_pair (i + 1, color_table[i][0], color_table[i][1]);
|
||||
|
||||
/* Setup color attributes */
|
||||
for (i = 0; i < ATTRIBUTE_COUNT; i++)
|
||||
attributes[i] = C_ATTR (color_table[i][2], i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* End using dialog functions.
|
||||
*/
|
||||
void
|
||||
end_dialog (void)
|
||||
{
|
||||
endwin ();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Print a string of text in a window, automatically wrap around to the
|
||||
* next line if the string is too long to fit on one line. Newline
|
||||
* characters '\n' are replaced by spaces. We start on a new line
|
||||
* if there is no room for at least 4 nonblanks following a double-space.
|
||||
*/
|
||||
void
|
||||
print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
|
||||
{
|
||||
int newl, cur_x, cur_y;
|
||||
int i, prompt_len, room, wlen;
|
||||
char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
|
||||
|
||||
strcpy (tempstr, prompt);
|
||||
|
||||
prompt_len = strlen(tempstr);
|
||||
|
||||
/*
|
||||
* Remove newlines
|
||||
*/
|
||||
for(i=0; i<prompt_len; i++) {
|
||||
if(tempstr[i] == '\n') tempstr[i] = ' ';
|
||||
}
|
||||
|
||||
if (prompt_len <= width - x * 2) { /* If prompt is short */
|
||||
wmove (win, y, (width - prompt_len) / 2);
|
||||
waddstr (win, tempstr);
|
||||
} else {
|
||||
cur_x = x;
|
||||
cur_y = y;
|
||||
newl = 1;
|
||||
word = tempstr;
|
||||
while (word && *word) {
|
||||
sp = index(word, ' ');
|
||||
if (sp)
|
||||
*sp++ = 0;
|
||||
|
||||
/* Wrap to next line if either the word does not fit,
|
||||
or it is the first word of a new sentence, and it is
|
||||
short, and the next word does not fit. */
|
||||
room = width - cur_x;
|
||||
wlen = strlen(word);
|
||||
if (wlen > room ||
|
||||
(newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
|
||||
&& (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
|
||||
cur_y++;
|
||||
cur_x = x;
|
||||
}
|
||||
wmove (win, cur_y, cur_x);
|
||||
waddstr (win, word);
|
||||
getyx (win, cur_y, cur_x);
|
||||
cur_x++;
|
||||
if (sp && *sp == ' ') {
|
||||
cur_x++; /* double space */
|
||||
while (*++sp == ' ');
|
||||
newl = 1;
|
||||
} else
|
||||
newl = 0;
|
||||
word = sp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Print a button
|
||||
*/
|
||||
void
|
||||
print_button (WINDOW * win, const char *label, int y, int x, int selected)
|
||||
{
|
||||
int i, temp;
|
||||
|
||||
wmove (win, y, x);
|
||||
wattrset (win, selected ? button_active_attr : button_inactive_attr);
|
||||
waddstr (win, "<");
|
||||
temp = strspn (label, " ");
|
||||
label += temp;
|
||||
wattrset (win, selected ? button_label_active_attr
|
||||
: button_label_inactive_attr);
|
||||
for (i = 0; i < temp; i++)
|
||||
waddch (win, ' ');
|
||||
wattrset (win, selected ? button_key_active_attr
|
||||
: button_key_inactive_attr);
|
||||
waddch (win, label[0]);
|
||||
wattrset (win, selected ? button_label_active_attr
|
||||
: button_label_inactive_attr);
|
||||
waddstr (win, (char *)label + 1);
|
||||
wattrset (win, selected ? button_active_attr : button_inactive_attr);
|
||||
waddstr (win, ">");
|
||||
wmove (win, y, x + temp + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Draw a rectangular box with line drawing characters
|
||||
*/
|
||||
void
|
||||
draw_box (WINDOW * win, int y, int x, int height, int width,
|
||||
chtype box, chtype border)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
wattrset (win, 0);
|
||||
for (i = 0; i < height; i++) {
|
||||
wmove (win, y + i, x);
|
||||
for (j = 0; j < width; j++)
|
||||
if (!i && !j)
|
||||
waddch (win, border | ACS_ULCORNER);
|
||||
else if (i == height - 1 && !j)
|
||||
waddch (win, border | ACS_LLCORNER);
|
||||
else if (!i && j == width - 1)
|
||||
waddch (win, box | ACS_URCORNER);
|
||||
else if (i == height - 1 && j == width - 1)
|
||||
waddch (win, box | ACS_LRCORNER);
|
||||
else if (!i)
|
||||
waddch (win, border | ACS_HLINE);
|
||||
else if (i == height - 1)
|
||||
waddch (win, box | ACS_HLINE);
|
||||
else if (!j)
|
||||
waddch (win, border | ACS_VLINE);
|
||||
else if (j == width - 1)
|
||||
waddch (win, box | ACS_VLINE);
|
||||
else
|
||||
waddch (win, box | ' ');
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Draw shadows along the right and bottom edge to give a more 3D look
|
||||
* to the boxes
|
||||
*/
|
||||
void
|
||||
draw_shadow (WINDOW * win, int y, int x, int height, int width)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (has_colors ()) { /* Whether terminal supports color? */
|
||||
wattrset (win, shadow_attr);
|
||||
wmove (win, y + height, x + 2);
|
||||
for (i = 0; i < width; i++)
|
||||
waddch (win, winch (win) & A_CHARTEXT);
|
||||
for (i = y + 1; i < y + height + 1; i++) {
|
||||
wmove (win, i, x + width);
|
||||
waddch (win, winch (win) & A_CHARTEXT);
|
||||
waddch (win, winch (win) & A_CHARTEXT);
|
||||
}
|
||||
wnoutrefresh (win);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the position of the first alphabetic character in a string.
|
||||
*/
|
||||
int
|
||||
first_alpha(const char *string, const char *exempt)
|
||||
{
|
||||
int i, in_paren=0, c;
|
||||
|
||||
for (i = 0; i < strlen(string); i++) {
|
||||
c = tolower(string[i]);
|
||||
|
||||
if (strchr("<[(", c)) ++in_paren;
|
||||
if (strchr(">])", c) && in_paren > 0) --in_paren;
|
||||
|
||||
if ((! in_paren) && isalpha(c) &&
|
||||
strchr(exempt, c) == 0)
|
||||
return i;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the first selected item in the dialog_list_item list.
|
||||
*/
|
||||
struct dialog_list_item *
|
||||
first_sel_item(int item_no, struct dialog_list_item ** items)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < item_no; i++) {
|
||||
if (items[i]->selected)
|
||||
return items[i];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
118
2.3/menu/lxdialog/yesno.c
Normal file
118
2.3/menu/lxdialog/yesno.c
Normal file
|
@ -0,0 +1,118 @@
|
|||
/*
|
||||
* yesno.c -- implements the yes/no box
|
||||
*
|
||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "dialog.h"
|
||||
|
||||
/*
|
||||
* Display termination buttons
|
||||
*/
|
||||
static void
|
||||
print_buttons(WINDOW *dialog, int height, int width, int selected)
|
||||
{
|
||||
int x = width / 2 - 10;
|
||||
int y = height - 2;
|
||||
|
||||
print_button (dialog, " Yes ", y, x, selected == 0);
|
||||
print_button (dialog, " No ", y, x + 13, selected == 1);
|
||||
|
||||
wmove(dialog, y, x+1 + 13*selected );
|
||||
wrefresh (dialog);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display a dialog box with two buttons - Yes and No
|
||||
*/
|
||||
int
|
||||
dialog_yesno (const char *title, const char *prompt, int height, int width)
|
||||
{
|
||||
int i, x, y, key = 0, button = 0;
|
||||
WINDOW *dialog;
|
||||
|
||||
/* center dialog box on screen */
|
||||
x = (COLS - width) / 2;
|
||||
y = (LINES - height) / 2;
|
||||
|
||||
draw_shadow (stdscr, y, x, height, width);
|
||||
|
||||
dialog = newwin (height, width, y, x);
|
||||
keypad (dialog, TRUE);
|
||||
|
||||
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||
wattrset (dialog, border_attr);
|
||||
mvwaddch (dialog, height-3, 0, ACS_LTEE);
|
||||
for (i = 0; i < width - 2; i++)
|
||||
waddch (dialog, ACS_HLINE);
|
||||
wattrset (dialog, dialog_attr);
|
||||
waddch (dialog, ACS_RTEE);
|
||||
|
||||
if (title != NULL && strlen(title) >= width-2 ) {
|
||||
/* truncate long title -- mec */
|
||||
char * title2 = malloc(width-2+1);
|
||||
memcpy( title2, title, width-2 );
|
||||
title2[width-2] = '\0';
|
||||
title = title2;
|
||||
}
|
||||
|
||||
if (title != NULL) {
|
||||
wattrset (dialog, title_attr);
|
||||
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||
waddstr (dialog, (char *)title);
|
||||
waddch (dialog, ' ');
|
||||
}
|
||||
|
||||
wattrset (dialog, dialog_attr);
|
||||
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||
|
||||
print_buttons(dialog, height, width, 0);
|
||||
|
||||
while (key != ESC) {
|
||||
key = wgetch (dialog);
|
||||
switch (key) {
|
||||
case 'Y':
|
||||
case 'y':
|
||||
delwin (dialog);
|
||||
return 0;
|
||||
case 'N':
|
||||
case 'n':
|
||||
delwin (dialog);
|
||||
return 1;
|
||||
|
||||
case TAB:
|
||||
case KEY_LEFT:
|
||||
case KEY_RIGHT:
|
||||
button = ((key == KEY_LEFT ? --button : ++button) < 0)
|
||||
? 1 : (button > 1 ? 0 : button);
|
||||
|
||||
print_buttons(dialog, height, width, button);
|
||||
wrefresh (dialog);
|
||||
break;
|
||||
case ' ':
|
||||
case '\n':
|
||||
delwin (dialog);
|
||||
return button;
|
||||
case ESC:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
delwin (dialog);
|
||||
return -1; /* ESC pressed */
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue