Switch gen-kconfig to new framework

Also:
- Move companion_* to comp_* to match the kconfig symbols
- Replace bootstrap with former gen-versions.sh
- Fold *.in.2 into their respective first parts; this moves common
  options to the end - if it is undesirable, inclusion of *.in
  can be moved where *.in.2 used to be (but that will also move
  version selection after common options).
- Retire addToolVersion.sh (may later replace with a more
  comprehensive script that tries to download the added tarballs,
  copy the patches and try to apply them, and create a version.desc).

Signed-off-by: Alexey Neyman <stilor@att.net>
dev-linux
Alexey Neyman 6 years ago
parent 50a387afa7
commit ff0a1a3da6

17
TODO

@ -1,24 +1,23 @@
TBD
packages todo
[X] convert gen-kconfig to use templates
[ ] some way of patching development sources - version based? or just directory with "apply-to-any-revision" patches.
[X] mention custom glibc addons are no longer handled (even though they never fully were, ct-ng would be unable to fetch them unless they were secretly placed into the download area)
[x] mention incompatibility of sample options
[X] version-locked packages
[X] make glibc-ports package for glibc <2.17 (it has its own repo)
[ ] convert gen-kconfig to use templates
[ ] new packages
[ ] config.guess
[ ] gnulib
[ ] use gnulib in m4, gettext, libiconv, libtool
[ ] autoconf-archive
[ ] use to retrieve ax_pthread.m4 (gettext?)
[ ] uclibc-locales
[ ] some way of patching development sources - version based? or just directory with "apply-to-any-revision" patches.
[x] dependencies like cloog
A (slightly) ordered set of tasks for crosstool-NG. Written in a cryptic language; contact me if you want to help with any of these :)
-- Alexey Neyman (@stilor)
[ ] new packages
[ ] config.guess
[ ] gnulib
[ ] use gnulib in m4, gettext, libiconv, libtool
[ ] autoconf-archive
[ ] use to retrieve ax_pthread.m4 (gettext?)
[ ] retire wiki-samples
[ ] Fix displaying the versions in case devel is used (custom location/repo) - display "devel" or "custom" in those cases
[ ] clean up GDB versions - no X.Y if X.Y.1 is present

@ -1,13 +1,644 @@
#!/bin/sh
set -e
#!/bin/bash
printf "Running autoconf...\n"
autoconf -Wall --force
########################################
# Common meta-language implementation. Syntax:
#
# The template file is processed line by line, with @@VAR@@ placeholders
# being replaced with a value of the VAR variable.
# Special lines start with '#!' and a keyword:
#
# #!//
# Comment, the rest of the line is ignored
# #!if COND
# Conditional: the lines until the matching #!end-if are processed
# only if the conditional COND evaluates to true.
# #!foreach NAME
# Iterate over NAME entities (the iterator must be set up first
# using the set_iter function), processing the lines until the matching
# #!end-foreach line.
declare -A info
debug()
{
if [ -n "${DEBUG}" ]; then
echo "DEBUG :: $@" >&2
fi
}
msg()
{
if [ -z "${QUIET}" ]; then
echo "INFO :: $@" >&2
fi
}
warn()
{
echo "WARN :: $@" >&2
}
error()
{
echo "ERROR :: $@" >&2
exit 1
}
find_end()
{
local token="${1}"
local count=1
# Skip first line, we know it has the proper '#!' command on it
endline=$[l + 1]
while [ "${endline}" -le "${end}" ]; do
case "${tlines[${endline}]}" in
"#!${token} "*)
count=$[count + 1]
;;
"#!end-${token}")
count=$[count - 1]
;;
esac
if [ "${count}" = 0 ]; then
return
fi
endline=$[endline + 1]
done
error "line ${l}: '${token}' token is unpaired"
}
set_iter()
{
local name="${1}"
if [ "${info[iter_${name}]+set}" = "set" ]; then
error "Iterator over '${name}' is already set up"
fi
shift
debug "Setting iterator over '${name}' to '$*'"
info[iter_${name}]="$*"
}
run_if()
{
local cond="${1}"
local endline
find_end "if"
if eval "${cond}"; then
debug "True conditional '${cond}' at lines ${l}..${endline}"
run_lines $[l + 1] $[endline - 1]
else
debug "False conditional '${cond}' at lines ${l}..${endline}"
fi
lnext=$[endline + 1]
debug "Continue at line ${lnext}"
}
do_foreach()
{
local var="${1}"
local v saveinfo
shift
if [ "`type -t enter_${var}`" != "function" ]; then
error "No parameter setup routine for iterator over '${var}'"
fi
for v in ${info[iter_${var}]}; do
saveinfo=`declare -p info`
eval "enter_${var} ${v}"
eval "$@"
eval "${saveinfo#declare -A }"
done
}
run_foreach()
{
local var="${1}"
local endline
if [ "${info[iter_${var}]+set}" != "set" ]; then
error "line ${l}: iterator over '${var}' is not defined"
fi
find_end "foreach"
debug "Loop over '${var}', lines ${l}..${endline}"
do_foreach ${var} run_lines $[l + 1] $[endline - 1]
lnext=$[endline + 1]
debug "Continue at line ${lnext}"
}
run_lines()
{
local start="${1}"
local end="${2}"
local l lnext s s1 v
debug "Running lines ${start}..${end}"
l=${start}
while [ "${l}" -le "${end}" ]; do
lnext=$[l+1]
s="${tlines[${l}]}"
# Expand @@foo@@ to ${info[foo]}. First escape variables/backslashes for evals below.
s="${s//\\/\\\\}"
s="${s//\$/\\\$}"
s1=
while [ -n "${s}" ]; do
case "${s}" in
*@@*@@*)
v="${s#*@@}"
v="${v%%@@*}"
if [ "${info[${v}]+set}" != "set" ]; then
error "line ${l}: reference to undefined variable '${v}'"
fi
s1="${s1}${s%%@@*}\${info[${v}]}"
s="${s#*@@*@@}"
;;
*@@*)
error "line ${l}: non-paired @@ markers"
;;
*)
s1="${s1}${s}"
break
;;
esac
done
s=${s1}
debug "Evaluate: ${s}"
case "${s}" in
"#!if "*)
run_if "${s#* }"
;;
"#!foreach "*)
run_foreach "${s#* }"
;;
"#!//"*)
# Comment, do nothing
;;
"#!"*)
error "line ${l}: unrecognized command"
;;
*)
# Not a special command
eval "echo \"${s//\"/\\\"}\""
;;
esac
l=${lnext}
done
}
run_template()
{
local -a tlines
local src="${1}"
if [ ! -r "${src}" ]; then
error "Template '${src}' not found"
fi
debug "Running template ${src}"
mapfile -O 1 -t tlines < "${src}"
run_lines 1 ${#tlines[@]}
}
########################################
# Convert the argument to a Kconfig-style macro
kconfigize()
{
local v="${1}"
v=${v//[^0-9A-Za-z_]/_}
echo "${v^^}"
}
# Helper for cmp_versions: compare an upstream/debian portion of
# a version. Returns 0 if equal, otherwise echoes "-1" or "1" and
# returns 1.
equal_versions()
{
local v1="${1}"
local v2="${2}"
local p1 p2
# Compare alternating non-numerical/numerical portions, until
# non-equal portion is found or either string is exhausted.
while [ -n "${v1}" -a -n "${v2}" ]; do
# Find non-numerical portions and compare lexicographically
p1="${v1%%[0-9]*}"
p2="${v2%%[0-9]*}"
v1="${v1#${p1}}"
v2="${v2#${p2}}"
#debug "lex [${p1}] v [${p2}]"
if [ "${p1}" \< "${p2}" ]; then
echo "-1"
return 1
elif [ "${p1}" \> "${p2}" ]; then
echo "1"
return 1
fi
#debug "rem [${v1}] v [${v2}]"
# Find numerical portions and compare numerically
p1="${v1%%[^0-9]*}"
p2="${v2%%[^0-9]*}"
v1="${v1#${p1}}"
v2="${v2#${p2}}"
#debug "num [${p1}] v [${p2}]"
if [ "${p1:-0}" -lt "${p2:-0}" ]; then
echo "-1"
return 1
elif [ "${p1:-0}" -gt "${p2:-0}" ]; then
echo "1"
return 1
fi
#debug "rem [${v1}] v [${v2}]"
done
if [ -n "${v1}" ]; then
echo "1"
return 1
elif [ -n "${v2}" ]; then
echo "-1"
return 1
fi
return 0
}
# Compare two version strings, similar to sort -V. But we don't
# want to depend on GNU sort availability on the host.
# See http://www.debian.org/doc/debian-policy/ch-controlfields.html
# for description of what the version is expected to be.
# Returns "-1", "0" or "1" if first version is earlier, same or
# later than the second.
cmp_versions()
{
local v1="${1}"
local v2="${2}"
local e1=0 e2=0 u1 u2 d1=0 d2=0
# Case-insensitive comparison
v1="${v1^^}"
v2="${v2^^}"
# Find if the versions contain epoch part
case "${v1}" in
*:*)
e1="${v1%%:*}"
v1="${v1#*:}"
;;
esac
case "${v2}" in
*:*)
e2="${v2%%:*}"
v2="${v2#*:}"
;;
esac
# Compare epochs numerically
if [ "${e1}" -lt "${e2}" ]; then
echo "-1"
return
elif [ "${e1}" -gt "${e2}" ]; then
echo "1"
return
fi
# Find if the version contains a "debian" part.
# v1/v2 will now contain "upstream" part.
case "${v1}" in
*-*)
d1=${v1##*-}
v1=${v1%-*}
;;
esac
case "${v2}" in
*-*)
d2=${v2##*-}
v2=${v2%-*}
;;
esac
# Compare upstream
if equal_versions "${v1}" "${v2}" && equal_versions "${d1}" "${d2}"; then
echo "0"
fi
}
# Sort versions, descending
sort_versions()
{
local sorted
local remains="$*"
local next_remains
local v vx found
while [ -n "${remains}" ]; do
#debug "Sorting [${remains}]"
for v in ${remains}; do
found=yes
next_remains=
#debug "Candidate ${v}"
for vx in ${remains}; do
#debug "${v} vs ${vx} :: `cmp_versions ${v} ${vx}`"
case `cmp_versions ${v} ${vx}` in
1)
next_remains+=" ${vx}"
;;
0)
;;
-1)
found=no
#debug "Bad: earlier than ${vx}"
break
;;
esac
done
if [ "${found}" = "yes" ]; then
# $v is less than all other members in next_remains
sorted+=" ${v}"
remains="${next_remains}"
#debug "Good candidate ${v} sorted [${sorted}] remains [${remains}]"
break
fi
done
done
echo "${sorted}"
}
read_file()
{
local l p
while read l; do
l="${p}${l}"
p=
case "${l}" in
"")
continue
;;
*\\)
p="${l%\\}"
continue
;;
"#"*)
continue
;;
*=*)
echo "info[${l%%=*}]=${l#*=}"
;;
*)
error "syntax error in '${1}': '${l}'"
;;
esac
done < "${1}"
}
printf "Generating kconfig component lists...\n"
./maintainer/gen-kconfig.sh
read_package_desc()
{
read_file "packages/${1}/package.desc"
}
printf "Generating kconfig component versions...\n"
./maintainer/gen-versions.sh
read_version_desc()
{
read_file "packages/${1}/${2}/version.desc"
}
find_forks()
{
local -A info
info[preferred]=${1}
eval `read_package_desc ${1}`
if [ -n "${info[master]}" ]; then
pkg_nforks[${info[master]}]=$[pkg_nforks[${info[master]}]+1]
pkg_forks[${info[master]}]+=" ${1} "
else
pkg_preferred[${1}]=${info[preferred]}
pkg_nforks[${1}]=$[pkg_nforks[${1}]+1]
pkg_forks[${1}]+=" ${1} "
pkg_milestones[${1}]=`sort_versions ${info[milestones]}`
pkg_masters+=( "${1}" )
fi
# Keep sorting so that preferred fork is first
if [ -n "${pkg_preferred[${1}]}" ]; then
pkg_forks[${1}]="${pkg_preferred[${1}]} ${pkg_forks[${1}]##* ${pkg_preferred[${1}]} } ${pkg_forks[${1}]%% ${pkg_preferred[${1}]} *}"
fi
}
check_obsolete_experimental()
{
[ -z "${info[obsolete]}" ] && only_obsolete=
[ -z "${info[experimental]}" ] && only_experimental=
}
enter_fork()
{
local fork="${1}"
local versions
local only_obsolete only_experimental
# Set defaults
info[obsolete]=
info[experimental]=
info[repository]=
info[repository_branch]=
info[repository_cset]=
info[repository_subdir]=
info[bootstrap]=
info[fork]=${fork}
info[name]=${fork}
info[mirrors]=
info[archive_filename]='@{pkg_name}-@{version}'
info[archive_dirname]='@{pkg_name}-@{version}'
eval `read_package_desc ${fork}`
info[pfx]=`kconfigize ${fork}`
info[originpfx]=`kconfigize ${info[origin]}`
if [ -r "packages/${info[origin]}.help" ]; then
info[originhelp]=`sed 's/^/ /' "packages/${info[origin]}.help"`
else
info[originhelp]=" ${info[master]} from ${info[origin]}."
fi
if [ -n "${info[repository]}" ]; then
info[vcs]=${info[repository]%% *}
info[repository_url]=${info[repository]#* }
fi
info[versionlocked]=`kconfigize "${info[versionlocked]}"`
versions=`cd packages/${fork} && \
for f in */version.desc; do [ -r "${f}" ] && echo "${f%/version.desc}"; done`
versions=`sort_versions ${versions}`
set_iter version ${versions}
info[all_versions]=${versions}
# If a fork does not define any versions at all ("rolling release"), do not
# consider it obsolete/experimental unless it is so marked in the fork's
# description.
if [ -n "${versions}" ]; then
only_obsolete=yes
only_experimental=yes
do_foreach version check_obsolete_experimental
info[only_obsolete]=${only_obsolete}
info[only_experimental]=${only_experimental}
else
info[only_obsolete]=${info[obsolete]}
info[only_experimental]=${info[experimental]}
fi
}
enter_version()
{
local -A ver_postfix=( \
[,yes,,]=" (OBSOLETE)" \
[,,yes,]=" (EXPERIMENTAL)" \
[,yes,yes,]=" (OBSOLETE,EXPERIMENTAL)" )
local version="${1}"
eval `read_version_desc ${info[fork]} ${version}`
info[ver]=${version}
info[kcfg]=`kconfigize ${version}`
info[ver_postfix]=${ver_postfix[,${info[obsolete]},${info[experimental]},]}
}
enter_milestone()
{
local ms="${1}"
local cmp
info[ms]=${ms}
info[ms_kcfg]=`kconfigize ${ms}`
if [ -n "${info[ver]}" ]; then
info[version_cmp_milestone]=`cmp_versions ${info[ver]} ${info[ms]}`
fi
}
gen_packages()
{
local -A pkg_forks pkg_milestones pkg_nforks
local -a pkg_masters pkg_all pkg_preferred
pkg_all=( `cd packages && \
ls */package.desc 2>/dev/null | \
while read f; do [ -r "${f}" ] && echo "${f%/package.desc}"; done | \
xargs echo` )
debug "Packages: ${pkg_all[@]}"
# We need to group forks of the same package into the same
# config file. Discover such relationships and only iterate
# over "master" packages at the top.
for p in "${pkg_all[@]}"; do
find_forks "${p}"
done
msg "Master packages: ${pkg_masters[@]}"
# Now for each master, create its kconfig file with version
# definitions.
for p in "${pkg_masters[@]}"; do
msg "Generating '${config_versions_dir}/${p}.in'"
exec >"${config_versions_dir}/${p}.in"
# Base definitions for the whole config file
info=( \
[master]=${p} \
[masterpfx]=`kconfigize ${p}` \
[nforks]=${pkg_nforks[${p}]} \
[all_milestones]=${pkg_milestones[${p}]} \
)
set_iter fork ${pkg_forks[${p}]}
set_iter milestone ${pkg_milestones[${p}]}
run_template "maintainer/kconfig-versions.template"
done
}
msg "*** Generating package version descriptions"
config_versions_dir=config/versions
rm -rf "${config_versions_dir}"
mkdir -p "${config_versions_dir}"
gen_packages
get_components()
{
local dir="${1}"
local f b
for f in ${dir}/*.in; do
b=${f#${dir}/}
echo ${b%.in}
done
}
enter_choice()
{
local choice="${1}"
local l
# TBD generate sourcing of versions/$component.in automatically - and add a comment that versions must
# TBD generated first? [what to do with glibc/glibc-ports]
info[choice]="${choice}"
info[has_part2]="${p2}"
# Not local, we need these arrays be set in enter_dependency/enter_help
deplines=( )
helplines=( )
while read l; do
case "${l}" in
"## help "*)
helplines+=( "${l#* help }" )
;;
"## depends "*|"## select "*)
deplines+=( "${l#* }" )
;;
esac
done < "config/${info[dir]}/${choice}.in"
set_iter dependency "${!deplines[@]}"
set_iter help "${!helplines[@]}"
}
enter_dependency()
{
info[depline]="${deplines[${1}]}"
}
enter_help()
{
info[helpline]="${helplines[${1}]}"
}
gen_selection()
{
local type="${1}"
local dir="${2}"
local label="${3}"
msg "Generating ${dir}.in and ${dir}.in.2"
exec >"${config_gen_dir}/${dir}.in"
info=( \
[prefix]=`kconfigize ${dir}` \
[dir]=${dir} \
[label]="${label}" \
)
set_iter choice `get_components config/${dir}`
run_template "maintainer/kconfig-${type}.template"
}
msg "*** Generating menu/choice selections"
config_gen_dir=config/gen
rm -rf "${config_gen_dir}"
mkdir -p "${config_gen_dir}"
gen_selection choice arch "Target Architecture"
gen_selection choice kernel "Target OS"
gen_selection choice cc "Compiler"
gen_selection choice binutils "Binutils"
gen_selection choice libc "C library"
gen_selection menu debug "Debug facilities"
gen_selection menu comp_tools "Companion tools"
msg "*** Running autoconf"
autoconf -Wall --force
printf "Done. You may now run:\n ./configure\n"
msg "*** Done!"

@ -5,5 +5,60 @@
## select ARCH_USE_MMU
## select ARCH_SUPPORTS_WITH_CPU
## select ARCH_SUPPORTS_WITH_TUNE
##
## help The Alpha architecture.
choice
bool
prompt "Variant"
config ARCH_ALPHA_EV4
bool
prompt "EV4"
config ARCH_ALPHA_EV45
bool
prompt "EV45"
config ARCH_ALPHA_EV5
bool
prompt "EV5"
config ARCH_ALPHA_EV56
bool
prompt "EV56"
config ARCH_ALPHA_EV6
bool
prompt "EV6"
config ARCH_ALPHA_EV67
bool
prompt "EV67"
endchoice
config ARCH_ALPHA_VARIANT
string
default "ev4" if ARCH_ALPHA_EV4
default "ev45" if ARCH_ALPHA_EV45
default "ev5" if ARCH_ALPHA_EV5
default "ev56" if ARCH_ALPHA_EV56
default "ev6" if ARCH_ALPHA_EV6
default "ev67" if ARCH_ALPHA_EV67
config ARCH_CPU
default "ev4" if ARCH_ALPHA_EV4
default "ev45" if ARCH_ALPHA_EV45
default "ev5" if ARCH_ALPHA_EV5
default "ev56" if ARCH_ALPHA_EV56
default "ev6" if ARCH_ALPHA_EV6
default "ev67" if ARCH_ALPHA_EV67
config ARCH_TUNE
default "ev4" if ARCH_ALPHA_EV4
default "ev45" if ARCH_ALPHA_EV45
default "ev5" if ARCH_ALPHA_EV5
default "ev56" if ARCH_ALPHA_EV56
default "ev6" if ARCH_ALPHA_EV6
default "ev67" if ARCH_ALPHA_EV67

@ -1,56 +0,0 @@
# Alpha specific configuration file
choice
bool
prompt "Variant"
config ARCH_ALPHA_EV4
bool
prompt "EV4"
config ARCH_ALPHA_EV45
bool
prompt "EV45"
config ARCH_ALPHA_EV5
bool
prompt "EV5"
config ARCH_ALPHA_EV56
bool
prompt "EV56"
config ARCH_ALPHA_EV6
bool
prompt "EV6"
config ARCH_ALPHA_EV67
bool
prompt "EV67"
endchoice
config ARCH_ALPHA_VARIANT
string
default "ev4" if ARCH_ALPHA_EV4
default "ev45" if ARCH_ALPHA_EV45
default "ev5" if ARCH_ALPHA_EV5
default "ev56" if ARCH_ALPHA_EV56
default "ev6" if ARCH_ALPHA_EV6
default "ev67" if ARCH_ALPHA_EV67
config ARCH_CPU
default "ev4" if ARCH_ALPHA_EV4
default "ev45" if ARCH_ALPHA_EV45
default "ev5" if ARCH_ALPHA_EV5
default "ev56" if ARCH_ALPHA_EV56
default "ev6" if ARCH_ALPHA_EV6
default "ev67" if ARCH_ALPHA_EV67
config ARCH_TUNE
default "ev4" if ARCH_ALPHA_EV4
default "ev45" if ARCH_ALPHA_EV45
default "ev5" if ARCH_ALPHA_EV5
default "ev56" if ARCH_ALPHA_EV56
default "ev6" if ARCH_ALPHA_EV6
default "ev67" if ARCH_ALPHA_EV67

@ -14,6 +14,101 @@
## select ARCH_SUPPORTS_WITH_FLOAT if ARCH_32
## select ARCH_SUPPORTS_WITH_FPU if ARCH_32
## select ARCH_SUPPORTS_SOFTFP if ARCH_32
##
## help The ARM architecture, as defined by:
## help http://www.arm.com/
if ARCH_32
config ARCH_ARM_MODE
string
default "arm" if ARCH_ARM_MODE_ARM
default "thumb" if ARCH_ARM_MODE_THUMB
choice
bool
prompt "Default instruction set mode"
default ARCH_ARM_MODE_ARM
config ARCH_ARM_MODE_ARM
bool
prompt "arm"
help
Defaults to emitting instructions in the ARM mode.
config ARCH_ARM_MODE_THUMB
bool
prompt "thumb"
help
Defaults to emitting instructions in the THUMB mode.
endchoice
config ARCH_ARM_INTERWORKING
bool
prompt "Use Thumb-interworking (READ HELP)"
help
Excerpt from the gcc manual:
> Generate code which supports calling between the ARM and Thumb
> instruction sets. Without this option the two instruction sets
> cannot be reliably used inside one program. The default is
> [not to use interwork], since slightly larger code is generated
> when [interwork] is specified.
NOTE: Interworking in crosstool-NG is not sell-tested. Use at your
own risks, and report success and/or failure.
# Until we only support EABI:
config ARCH_ARM_ABI_OK
def_bool y
depends on ! ARCH_ARM_EABI
select ARCH_SUPPORTS_WITH_ABI
# Little trick to force EABI *and* always show the prompt
config ARCH_ARM_EABI_FORCE
bool
default y if ! OBSOLETE
select ARCH_ARM_EABI
config ARCH_ARM_EABI
bool
prompt "Use EABI"
default y
help
Set up the toolchain so that it generates EABI-compliant binaries.
If you say 'n' here, then the toolchain will generate OABI binaries.
OABI has long been deprecated, and is now considered legacy.
config ARCH_ARM_TUPLE_USE_EABIHF
bool
prompt "append 'hf' to the tuple (EXPERIMENTAL)"
depends on ARCH_FLOAT_HW
depends on ARCH_ARM_EABI # Until we only support that...
default y
help
Is you say 'y' here, then the tuple for the toolchain will end
up with *eabihf, instead of the usual *eabi.
*eabihf is used to denote that the toolchain *is* using the
hard-float ABI, while *eabi is just an indication of using the
soft-float ABI.
Ie. all one can say is: *eabihf ⊢ hard-float ABI
Saying 'n' here does *not* impact the ability of the toolchain to
generate hard-float instructions with the hard-float ABI. It is a
purely cosmetic thing, used by distros to differentiate their
hard-float-ABI-using ports from their soft-float-ABI-using ports.
(eg. Debian Wheezy and above).
This is an option, as not all versions of gcc/binutils do support
such tuple, and fail to build with *eabihf. Stock gcc version up
to, and including 4.7.2 have an issue or another with *eabihf.
This option is here for the future.
Say 'n', unless you are trying to fix gcc to properly recognise
the *eabihf tuples.
endif

@ -1,96 +0,0 @@
# ARM specific configuration file
if ARCH_32
config ARCH_ARM_MODE
string
default "arm" if ARCH_ARM_MODE_ARM
default "thumb" if ARCH_ARM_MODE_THUMB
choice
bool
prompt "Default instruction set mode"
default ARCH_ARM_MODE_ARM
config ARCH_ARM_MODE_ARM
bool
prompt "arm"
help
Defaults to emitting instructions in the ARM mode.
config ARCH_ARM_MODE_THUMB
bool
prompt "thumb"
help
Defaults to emitting instructions in the THUMB mode.
endchoice
config ARCH_ARM_INTERWORKING
bool
prompt "Use Thumb-interworking (READ HELP)"
help
Excerpt from the gcc manual:
> Generate code which supports calling between the ARM and Thumb
> instruction sets. Without this option the two instruction sets
> cannot be reliably used inside one program. The default is
> [not to use interwork], since slightly larger code is generated
> when [interwork] is specified.
NOTE: Interworking in crosstool-NG is not sell-tested. Use at your
own risks, and report success and/or failure.
# Until we only support EABI:
config ARCH_ARM_ABI_OK
def_bool y
depends on ! ARCH_ARM_EABI
select ARCH_SUPPORTS_WITH_ABI
# Little trick to force EABI *and* always show the prompt
config ARCH_ARM_EABI_FORCE
bool
default y if ! OBSOLETE
select ARCH_ARM_EABI
config ARCH_ARM_EABI
bool
prompt "Use EABI"
default y
help
Set up the toolchain so that it generates EABI-compliant binaries.
If you say 'n' here, then the toolchain will generate OABI binaries.
OABI has long been deprecated, and is now considered legacy.
config ARCH_ARM_TUPLE_USE_EABIHF
bool
prompt "append 'hf' to the tuple (EXPERIMENTAL)"
depends on ARCH_FLOAT_HW
depends on ARCH_ARM_EABI # Until we only support that...
default y
help
Is you say 'y' here, then the tuple for the toolchain will end
up with *eabihf, instead of the usual *eabi.
*eabihf is used to denote that the toolchain *is* using the
hard-float ABI, while *eabi is just an indication of using the
soft-float ABI.
Ie. all one can say is: *eabihf ⊢ hard-float ABI
Saying 'n' here does *not* impact the ability of the toolchain to
generate hard-float instructions with the hard-float ABI. It is a
purely cosmetic thing, used by distros to differentiate their
hard-float-ABI-using ports from their soft-float-ABI-using ports.
(eg. Debian Wheezy and above).
This is an option, as not all versions of gcc/binutils do support
such tuple, and fail to build with *eabihf. Stock gcc version up
to, and including 4.7.2 have an issue or another with *eabihf.
This option is here for the future.
Say 'n', unless you are trying to fix gcc to properly recognise
the *eabihf tuples.
endif

@ -9,6 +9,43 @@
## select ARCH_SUPPORTS_WITH_ARCH
## select ARCH_SUPPORTS_WITH_TUNE
## select ARCH_SUPPORTS_WITH_FLOAT
##
## help The MIPS architecture, as defined by:
## help http://www.mips.com/
choice
bool
prompt "ABI"
config ARCH_mips_o32
bool
prompt "o32"
depends on (ARCH_32 || MULTILIB)
help
This is the -mabi=32 gcc option.
config ARCH_mips_n32
bool
prompt "n32"
depends on ARCH_64
help
This is the -mabi=n32 gcc option.
config ARCH_mips_n64
bool
prompt "n64"
depends on ARCH_64
help
This is the -mabi=64 gcc option.
# Not supported on Linux:
# o64 : seems related to *BSD
# eabi : seems related to bare-metal
endchoice
config ARCH_mips_ABI
string
default "32" if ARCH_mips_o32
default "n32" if ARCH_mips_n32
default "64" if ARCH_mips_n64

@ -1,38 +0,0 @@
# MIPS specific config options
choice
bool
prompt "ABI"
config ARCH_mips_o32
bool
prompt "o32"
depends on (ARCH_32 || MULTILIB)
help
This is the -mabi=32 gcc option.
config ARCH_mips_n32
bool
prompt "n32"
depends on ARCH_64
help
This is the -mabi=n32 gcc option.
config ARCH_mips_n64
bool
prompt "n64"
depends on ARCH_64
help
This is the -mabi=64 gcc option.
# Not supported on Linux:
# o64 : seems related to *BSD
# eabi : seems related to bare-metal
endchoice
config ARCH_mips_ABI
string
default "32" if ARCH_mips_o32
default "n32" if ARCH_mips_n32
default "64" if ARCH_mips_n64

@ -1,4 +1,4 @@
# powerpc specific configuration file
# Powerpc specific configuration file
## select ARCH_SUPPORTS_32
## select ARCH_SUPPORTS_64
@ -13,3 +13,44 @@
##
## help The PowerPC architecture, as defined by:
## help http://www.ibm.com/developerworks/eserver/articles/archguide.html
config ARCH_powerpc_ABI
string
default "" if ARCH_powerpc_ABI_DEFAULT
default "eabi" if ARCH_powerpc_ABI_EABI
default "spe" if ARCH_powerpc_ABI_SPE
choice
bool
prompt "ABI"
default ARCH_powerpc_ABI_DEFAULT
config ARCH_powerpc_ABI_DEFAULT
bool
prompt "default"
help
The default ABI (System V.4).
config ARCH_powerpc_ABI_EABI
bool
prompt "EABI"
depends on BARE_METAL
help
The Embedded ABI (stack alignment of 8 bytes, etc).
config ARCH_powerpc_ABI_SPE
bool
prompt "SPE"
help
Add support for the Signal Processing Engine. This will set up
the toolchain so that it supports the SPE ABI extensions. This
mainly targets Freescale e500 processors.
Setting this option will append "spe" to the end of your target
tuple name (e.g., powerpc-e500v2-linux-gnuspe) so that the gcc
configure/build system will know to include SPE ABI support. It
will also automatically add "-mabi=spe -mspe" to your TARGET_CFLAGS,
and "--enable-e500_double" to your CC_EXTRA_CONFIG_ARRAY, so you
do not need to explicitly add them.
endchoice

@ -1,42 +0,0 @@
# powerpc specific configuration file
config ARCH_powerpc_ABI
string
default "" if ARCH_powerpc_ABI_DEFAULT
default "eabi" if ARCH_powerpc_ABI_EABI
default "spe" if ARCH_powerpc_ABI_SPE
choice
bool
prompt "ABI"
default ARCH_powerpc_ABI_DEFAULT
config ARCH_powerpc_ABI_DEFAULT
bool
prompt "default"
help
The default ABI (System V.4).
config ARCH_powerpc_ABI_EABI
bool
prompt "EABI"
depends on BARE_METAL
help
The Embedded ABI (stack alignment of 8 bytes, etc).
config ARCH_powerpc_ABI_SPE
bool
prompt "SPE"
help
Add support for the Signal Processing Engine. This will set up
the toolchain so that it supports the SPE ABI extensions. This
mainly targets Freescale e500 processors.
Setting this option will append "spe" to the end of your target
tuple name (e.g., powerpc-e500v2-linux-gnuspe) so that the gcc
configure/build system will know to include SPE ABI support. It
will also automatically add "-mabi=spe -mspe" to your TARGET_CFLAGS,
and "--enable-e500_double" to your CC_EXTRA_CONFIG_ARRAY, so you
do not need to explicitly add them.
endchoice

@ -9,3 +9,27 @@
##
## help The Super-H architecture, as defined by:
## help http://www.renesas.com/fmwk.jsp?cnt=superh_family_landing.jsp&fp=/products/mpumcu/superh_family/
choice
bool
prompt "Variant"
config ARCH_SH_SH3
bool
prompt "sh3"
config ARCH_SH_SH4
bool
prompt "sh4"
config ARCH_SH_SH4A
bool
prompt "sh4a"
endchoice
config ARCH_SH_VARIANT
string
default "sh3" if ARCH_SH_SH3
default "sh4" if ARCH_SH_SH4
default "sh4a" if ARCH_SH_SH4A

@ -1,25 +0,0 @@
# Super-H specific configuration file
choice
bool
prompt "Variant"
config ARCH_SH_SH3
bool
prompt "sh3"
config ARCH_SH_SH4
bool
prompt "sh4"
config ARCH_SH_SH4A
bool
prompt "sh4a"
endchoice
config ARCH_SH_VARIANT
string
default "sh3" if ARCH_SH_SH3
default "sh4" if ARCH_SH_SH4
default "sh4a" if ARCH_SH_SH4A

@ -5,7 +5,7 @@
## select ARCH_DEFAULT_LE
## select ARCH_SUPPORTS_BOTH_MMU
## select ARCH_DEFAULT_HAS_MMU
##
## help The xtensa architecture
## help
## help Xtensa is a configurable and extensible processor architecture.
@ -20,3 +20,16 @@
## help
## help The default option (ARCH_xtensa_fsf) uses a built-in configuration,
## help which may or may not work for a particular Xtensa processor.
choice
prompt "Target Architecture Variant"
default ARCH_xtensa_fsf
config XTENSA_CUSTOM
bool "Custom Xtensa processor configuration"
select TARGET_USE_OVERLAY
config ARCH_xtensa_fsf
bool "fsf - Default configuration"
endchoice

@ -1,12 +0,0 @@
choice
prompt "Target Architecture Variant"
default ARCH_xtensa_fsf
config XTENSA_CUSTOM
bool "Custom Xtensa processor configuration"
select TARGET_USE_OVERLAY
config ARCH_xtensa_fsf
bool "fsf - Default configuration"
endchoice

@ -34,6 +34,5 @@ config ARCH_BINFMT_FDPIC
endchoice
source "config/gen/binutils.in"
source "config/gen/binutils.in.2"
endmenu

@ -128,6 +128,4 @@ config CC_LANG_OTHERS
Eg. gcc-4.1+ has a toy programming language, treelang. As it is not useful
in real life, it is not available in the selection above.
source "config/gen/cc.in.2"
endmenu

@ -1,5 +1,5 @@
# Compiler options
#
# GCC options
## default y
## select CC_SUPPORT_CXX if !LIBC_none
## select CC_SUPPORT_FORTRAN
@ -19,10 +19,423 @@
## select ISL_REQUIRE_0_10_or_later if ISL_NEEDED && GCC_4_8_or_later
## select ISL_REQUIRE_0_15_or_older if ISL_NEEDED && GCC_4_9_or_later && !GCC_5_or_later
## select ISL_REQUIRE_0_14_or_older if ISL_NEEDED && GCC_4_8_or_later && !GCC_4_9_or_later
##
## help gcc is the full-blown GNU compiler. This is what most people will choose.
## help
## help gcc supports many languages, a powerful code parser, optimised binary
## help output, and lots of other features.
source "config/versions/gcc.in"
# Only enable gcc's support for plugins if binutils has it as well
# They are useful only when doing LTO, but it does no harm enabling
# them even without LTO.
config CC_GCC_ENABLE_PLUGINS
bool
depends on BINUTILS_PLUGINS
depends on ! STATIC_TOOLCHAIN
default y
# Affects the build of musl
config GCC_BUG_61144
bool
default y if GCC_4_9_or_later && !GCC_4_9_2_or_later
# If binutils installs gold, enable support for gold in gcc
config CC_GCC_GOLD
bool
depends on BINUTILS_GOLD_INSTALLED
default y
config CC_GCC_HAS_LIBMPX
depends on GCC_5_or_later
bool
config CC_LANG_JAVA_USE_ECJ
bool
default y
depends on CC_LANG_JAVA
config CC_GCC_ENABLE_CXX_FLAGS
string
prompt "Flags to pass to --enable-cxx-flags"
default ""
help
Enter here the value of the gcc's ./configure option --enable-cxx-flags.
Leave empty if you don't know better.
Note: just pass in the option _value_, that is only the part that goes
after the '=' sign.
config CC_GCC_CORE_EXTRA_CONFIG_ARRAY
string
prompt "Core gcc extra config"
default ""
depends on CC_CORE_PASS_1_NEEDED || CC_CORE_PASS_2_NEEDED
help
Extra flags to pass onto ./configure when configuring the core gcc.
The core gcc is a stripped down, C-only compiler needed to build
the C library. Kinda bootstrap gcc, if you wish.
You can enter multiple arguments here, and arguments can contain spaces
if they are properly quoted (or escaped, but prefer quotes). Eg.:
--with-foo="1st arg with 4 spaces" --with-bar=2nd-arg-without-space
config CC_GCC_EXTRA_CONFIG_ARRAY
string
prompt "gcc extra config"
default ""
help
Extra flags to pass onto ./configure when configuring gcc.
You can enter multiple arguments here, and arguments can contain spaces
if they are properly quoted (or escaped, but prefer quotes). Eg.:
--with-foo="1st arg with 4 spaces" --with-bar=2nd-arg-without-space
config CC_GCC_MULTILIB_LIST
string
prompt "List of multilib variants"
depends on MULTILIB
help
Architecture-specific option of expanding or restricting the list of
the multilib variants to be built. Refer to GCC installation manual
for the format of this option for a particular architecture.
Leave empty to use the default list for this architecture.
config STATIC_TOOLCHAIN
bool
select CC_GCC_STATIC_LIBSTDCXX
config CC_GCC_STATIC_LIBSTDCXX
bool
prompt "Link libstdc++ statically into the gcc binary"
default y
depends on CONFIGURE_has_static_link || CANADIAN || CROSS_NATIVE
select WANTS_STATIC_LINK if CROSS || NATIVE
select WANTS_STATIC_LINK_CXX if CROSS || NATIVE
help
Newer gcc versions require some c++ libraries. So statically
linking libstdc++ increases the likeliness that the gcc binary will
run on machines other than the one which it was built on, without
having to worry about distributing the matching version of libstdc++
along with it.
config CC_GCC_SYSTEM_ZLIB
bool
prompt "Use system zlib"
help
Do not use bundled zlib, and use the zlib already available for
the host (eg. the system library).
If zlib is built as a companion library, selecting this option
will use it.
If you want to build a static toolchain, you will need to also
install the static version of zlib for your host.
If unsure, say 'n'.
config CC_GCC_CONFIG_TLS
tristate
prompt "Configure TLS (Thread Local Storage)"
default m
help
Specify that the target supports TLS (Thread Local Storage). Usually
configure can correctly determine if TLS is supported. In cases where
it guesses incorrectly, TLS can be explicitly enabled or disabled.
This can happen if the assembler supports TLS but the C library does
not, or if the assumptions made by the configure test are incorrect.
Option | TLS use | Associated ./configure switch
---------+--------------------+--------------------------------
Y | forcibly used | --enable-tls
M | auto | (none, ./configure decides)
N | forcibly not used | --disable-tls
If unsure, say 'M'.
#-----------------------------------------------------------------------------
# Optimisation features
comment "Optimisation features"
# Defined in config/cc/gcc.in
# For graphite: gcc needs cloog and isl
# In >= gcc-5.x, cloog is no longer needed, but isl is.
config CC_GCC_USE_GRAPHITE
bool "Enable GRAPHITE loop optimisations"
default y
select CLOOG_NEEDED if !GCC_5_or_later
select ISL_NEEDED
help
Enable the GRAPHITE loop optimsations.
On some systems (eg. Cygwin), CLooG and ISL (required to enable
GRAPHITE) may not build properly (yet), so you'll have to say 'N'
here (or help debug the issues)
TODO: Is this still true on Cygwin?
# The way LTO works is a bit twisted.
# See: http://gcc.gnu.org/wiki/LinkTimeOptimization#Requirements
# Basically:
# - if binutils has plugins: LTO is handled by ld/gold by loading
# the plugin when linking
# - if binutils does not have plugins: LTO is handled by collect2
# In any case, LTO support does not depend on plugins, but takes
# advantage of it
config CC_GCC_USE_LTO
bool "Enable LTO"
default y
depends on ! STATIC_TOOLCHAIN
help
Enable the Link Time Optimisations.
#-----------------------------------------------------------------------------
comment "Settings for libraries running on target"
config CC_GCC_ENABLE_TARGET_OPTSPACE
bool
prompt "Optimize gcc libs for size"
default y
help
Pass --enable-target-optspace to crossgcc's configure.
This will compile crossgcc's libs with -Os.
config CC_GCC_LIBMUDFLAP
bool
prompt "Compile libmudflap"
help
libmudflap is a pointer-use checking tool, which can detect
various mis-usages of pointers in C and (to some extents) C++.
You should say 'N' here, as libmduflap generates instrumented
code (thus it is a bit bigger and a bit slower) and requires
re-compilation and re-link, while it exists better run-time
alternatives (eg. DUMA, dmalloc...) that need neither re-
compilation nor re-link.
config CC_GCC_LIBGOMP
bool
prompt "Compile libgomp"
depends on !THREADS_NONE
help
libgomp is "the GNU implementation of the OpenMP Application Programming
Interface (API) for multi-platform shared-memory parallel programming in
C/C++ and Fortran". See:
http://gcc.gnu.org/onlinedocs/libgomp/
GNU OpenMP support requires threading.
The default is 'N'. Say 'Y' if you need it, and report success/failure.
config CC_GCC_LIBSSP
bool
prompt "Compile libssp"
help
libssp is the run-time Stack-Smashing Protection library.
The default is 'N'. Say 'Y' if you need it, and report success/failure.
config CC_GCC_LIBQUADMATH
bool
prompt "Compile libquadmath"
help
libquadmath is a library which provides quad-precision mathematical
functions on targets supporting the __float128 datatype. See:
http://gcc.gnu.org/onlinedocs/libquadmath/
The default is 'N'. Say 'Y' if you need it, and report success/failure.
config CC_GCC_LIBSANITIZER
bool
prompt "Compile libsanitizer"
depends on THREADS_NATIVE
depends on ! LIBC_uClibc && ! LIBC_musl # Currently lacks required headers (like netrom.h)
help
libsanitizer is a library which provides run-time sanitising of either
or both of:
- memory access patterns (out-of-bonds, use-after-free)
- racy data accesses (in multi-threaded programs)
The default is 'N'. Say 'Y' if you need it, and report success/failure.
config CC_GCC_LIBMPX
bool
default y
prompt "Compile libmpx"
depends on CC_GCC_HAS_LIBMPX
depends on ARCH_x86
# MUSL does not define libc types that GCC requires. Mingw lacks certain headers.
depends on !LIBC_musl && ! LIBC_mingw
help
Enable GCC support for Intel Memory Protection Extensions (MPX).
#-----------------------------------------------------------------------------
comment "Misc. obscure options."
config CC_CXA_ATEXIT
bool
prompt "Use __cxa_atexit"
default y
depends on ! BARE_METAL || LIBC_PROVIDES_CXA_ATEXIT
help
If you get the missing symbol "__cxa_atexit" when building C++ programs,
you might want to try disabling this option.
config CC_GCC_DISABLE_PCH
bool
prompt "Do not build PCH"
help
Say 'y' here to not use Pre-Compiled Headers in the resulting toolchain.
at the expense of speed when compiling C++ code.
For some configurations (most notably canadian?), PCH are broken, and
need to be disabled. Please see:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40974
config CC_GCC_SJLJ_EXCEPTIONS
tristate
prompt "Use sjlj for exceptions"
depends on ! BARE_METAL
default m
help
'sjlj' is short for setjmp/longjmp.
On some architectures, stack unwinding during exception handling
works perfectly well without using sjlj, while on some others,
use of sjlj is required for proper stack unwinding.
Option | sjlj use | Associated ./configure switch
---------+--------------------+--------------------------------
Y | forcibly used | --enable-sjlj-exceptions
M | auto | (none, ./configure decides)
N | forcibly not used | --disable-sjlj-exceptions
It should be safe to say 'M' or 'N'.
It can happen that ./configure is wrong in some cases. Known
case is for ARM big endian, where you should say 'N'.
config CC_GCC_LDBL_128
tristate
prompt "Enable 128-bit long doubles"
default m
help
Saying 'Y' will force gcc to use 128-bit wide long doubles
Saying 'N' will force gcc to use 64-bit wide long doubles
Saying 'M' will let gcc choose (default is 128-bit for
glibc >= 2.4, 64-bit otherwise)
If in doubt, keep the default, ie. 'M'.
config CC_GCC_BUILD_ID
bool
prompt "Enable build-id"
help
Tells GCC to pass --build-id option to the linker for all final
links (links performed without the -r or --relocatable option),
if the linker supports it. If you say 'y' here, but your linker
does not support --build-id option, a warning is issued and this
option is ignored.
The default is off.
choice CC_GCC_LNK_HASH_STYLE_CHOICE
bool
prompt "linker hash style"
depends on BINUTILS_HAS_HASH_STYLE
config CC_GCC_LNK_HASH_STYLE_DEFAULT
bool
prompt "Default"
help
Do not specify any value, and use the default value (sysv).
config CC_GCC_LNK_HASH_STYLE_SYSV
bool
prompt "sysv"
help
Force use of the SYSV hash style.
config CC_GCC_LNK_HASH_STYLE_GNU
bool
prompt "gnu"
help
Force use of the GNU hash style.
config CC_GCC_LNK_HASH_STYLE_BOTH
bool
prompt "both"
help
Force use of both hash styles.
endchoice # CC_GCC_LNK_HASH_STYLE_CHOICE
config CC_GCC_LNK_HASH_STYLE
string
default "" if CC_GCC_LNK_HASH_STYLE_DEFAULT
default "sysv" if CC_GCC_LNK_HASH_STYLE_SYSV
default "gnu" if CC_GCC_LNK_HASH_STYLE_GNU
default "both" if CC_GCC_LNK_HASH_STYLE_BOTH
choice CC_GCC_DEC_FLOATS_CHOICE
bool "Decimal floats"
default CC_GCC_DEC_FLOATS_AUTO
help
Choose what type of decimal floats to support.
Note that using decimal floats requires a C library that provides
support for fenv (namely, the fenv.h header). This is the case
for (e)glibc, and uClibc on x86/32. For other C libraries, or
uClibc on other archs, this might not be the case, so you should
disable support for decimal floats.
The default is to let ./configure decide.
config CC_GCC_DEC_FLOAT_AUTO
bool "auto"
help
Let ./configure decide. If you say 'y' here, gcc will default to:
- 'bid' for x86 (32- and 64-bit)
- 'dpd' for powerpc
- 'no' for the other architectures
config CC_GCC_DEC_FLOAT_BID
bool "bid"
help
Use the 'binary integer decimal' format for decimal floats.
config CC_GCC_DEC_FLOAT_DPD
bool "dpd"
help
Use the 'densely packed decimal' for decimal floats.
config CC_GCC_DEC_FLOATS_NO
bool "no"
help
Do not support decimal floats. The default.
endchoice # CC_GCC_DEC_FLOATS_CHOICE
config CC_GCC_DEC_FLOATS
string
default "" if CC_GCC_DEC_FLOATS_AUTO
default "bid" if CC_GCC_DEC_FLOATS_BID
default "dpd" if CC_GCC_DEC_FLOATS_DPD
default "no" if CC_GCC_DEC_FLOATS_NO
#-----------------------------------------------------------------------------
config CC_GCC_HAS_ARCH_OPTIONS
bool
comment "archictecture-specific options"
depends on CC_GCC_HAS_ARCH_OPTIONS
if ARCH_mips
source "config/cc/gcc.in.mips"
endif # ARCH_mips

@ -1,413 +0,0 @@
# Only enable gcc's support for plugins if binutils has it as well
# They are useful only when doing LTO, but it does no harm enabling
# them even without LTO.
config CC_GCC_ENABLE_PLUGINS
bool
depends on BINUTILS_PLUGINS
depends on ! STATIC_TOOLCHAIN
default y
# Affects the build of musl
config GCC_BUG_61144
bool
default y if GCC_4_9_or_later && !GCC_4_9_2_or_later
# If binutils installs gold, enable support for gold in gcc
config CC_GCC_GOLD
bool
depends on BINUTILS_GOLD_INSTALLED
default y