# Script for various external toolchain tasks, refer to
# the --help output for more information.
#
-# Copyright (C) 2012 Jo-Philipp Wich <jow@openwrt.org>
+# Copyright (C) 2012 Jo-Philipp Wich <jo@mein.io>
#
# 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
rt: librt-* librt
pthread: libpthread-* libpthread
stdcpp: libstdc++
+ thread_db: libthread-db
gcc: libgcc_s
ssp: libssp
gfortran: libgfortran
+ gomp: libgomp
"
# Binary specs
gdbserver: gdbserver
"
+OVERWRITE_CONFIG=""
test_c() {
cat <<-EOT | "${CC:-false}" $CFLAGS -o /dev/null -x c - 2>/dev/null
local sysroot="$("$CC" $CFLAGS -print-sysroot 2>/dev/null)"
if [ -d "${sysroot:-$TOOLCHAIN}" ]; then
local lib
- for lib in "${sysroot:-$TOOLCHAIN}"/{lib,usr/lib,usr/local/lib}/ld-uClibc*.so*; do
+ for lib in "${sysroot:-$TOOLCHAIN}"/{lib,usr/lib,usr/local/lib}/ld*-uClibc*.so*; do
if [ -f "$lib" ] && [ ! -h "$lib" ]; then
return 0
fi
}
+wrap_bin_cc() {
+ local out="$1"
+ local bin="$2"
+
+ echo '#!/bin/sh' > "$out"
+ echo 'for arg in "$@"; do' >> "$out"
+ echo ' case "$arg" in -l*|-L*|-shared|-static)' >> "$out"
+ echo -n ' exec "'"$bin"'" '"$CFLAGS"' ${STAGING_DIR:+' >> "$out"
+ echo -n '-idirafter "$STAGING_DIR/usr/include" ' >> "$out"
+ echo -n '-L "$STAGING_DIR/usr/lib" ' >> "$out"
+ echo '-Wl,-rpath-link,"$STAGING_DIR/usr/lib"} "$@" ;;' >> "$out"
+ echo ' esac' >> "$out"
+ echo 'done' >> "$out"
+ echo -n 'exec "'"$bin"'" '"$CFLAGS"' ${STAGING_DIR:+' >> "$out"
+ echo '-idirafter "$STAGING_DIR/usr/include"} "$@"' >> "$out"
+
+ chmod +x "$out"
+}
+
+wrap_bin_ld() {
+ local out="$1"
+ local bin="$2"
+
+ echo '#!/bin/sh' > "$out"
+ echo -n 'exec "'"$bin"'" ${STAGING_DIR:+' >> "$out"
+ echo -n '-L "$STAGING_DIR/usr/lib" ' >> "$out"
+ echo '-rpath-link "$STAGING_DIR/usr/lib"} "$@"' >> "$out"
+
+ chmod +x "$out"
+}
+
+wrap_bin_other() {
+ local out="$1"
+ local bin="$2"
+
+ echo '#!/bin/sh' > "$out"
+ echo 'exec "'"$bin"'" "$@"' >> "$out"
+
+ chmod +x "$out"
+}
+
wrap_bins() {
if probe_cc; then
mkdir -p "$1" || return 1
for cmd in "${CC%-*}-"*; do
if [ -x "$cmd" ]; then
local out="$1/${cmd##*/}"
+ local bin="$cmd"
+
+ if [ -x "$out" ] && ! grep -q STAGING_DIR "$out"; then
+ mv "$out" "$out.bin"
+ bin='$(dirname "$0")/'"${out##*/}"'.bin'
+ fi
- echo '#!/bin/sh' > "$out"
case "${cmd##*/}" in
*-*cc|*-*cc-*|*-*++|*-*++-*|*-cpp)
- echo -n 'exec "'"$cmd"'" '"$CFLAGS"' ' >> "$out"
- echo -n '${STAGING_DIR:+-idirafter ' >> "$out"
- echo -n '"$STAGING_DIR/usr/include" ' >> "$out"
- echo -n '-L "$STAGING_DIR/usr/lib" ' >> "$out"
- echo -n '-Wl,-rpath-link,' >> "$out"
- echo '"$STAGING_DIR/usr/lib"} "$@"' >> "$out"
+ wrap_bin_cc "$out" "$bin"
;;
*-ld)
- echo -n 'exec "'"$cmd"'" ${STAGING_DIR:+' >> "$out"
- echo -n '-L "$STAGING_DIR/usr/lib" ' >> "$out"
- echo -n '-rpath-link ' >> "$out"
- echo '"$STAGING_DIR/usr/lib"} "$@"' >> "$out"
+ wrap_bin_ld "$out" "$bin"
;;
*)
- echo "exec '$cmd' \"\$@\"" >> "$out"
+ wrap_bin_other "$out" "$bin"
;;
esac
- chmod +x "$out"
fi
done
local mksubtarget
local target="$("$CC" $CFLAGS -dumpmachine)"
+ local version="$("$CC" $CFLAGS -dumpversion)"
local cpuarch="${target%%-*}"
- local prefix="${CC##*/}"; prefix="${prefix%-*}-"
+
+ # get CC; strip version; strip gcc and add - suffix
+ local prefix="${CC##*/}"; prefix="${prefix%-$version}"; prefix="${prefix%-*}-"
local config="${0%/scripts/*}/.config"
# if no target specified, print choice list and exit
fi
# bail out if there is a .config already
- if [ -f "${0%/scripts/*}/.config" ]; then
- echo "There already is a .config file, refusing to overwrite!" >&2
- return 1
+ if [ -f "$config" ]; then
+ if [ "$OVERWRITE_CONFIG" == "" ]; then
+ echo "There already is a .config file, refusing to overwrite!" >&2
+ return 1
+ else
+ echo "There already is a .config file, trying to overwrite!"
+ fi
fi
case "$mktarget" in */*)
mktarget="${mktarget%/*}"
;; esac
+ if [ ! -f "$config" ]; then
+ touch "$config"
+ fi
- echo "CONFIG_TARGET_${mktarget}=y" > "$config"
+ echo "CONFIG_TARGET_${mktarget}=y" >> "$config"
if [ -n "$mksubtarget" ]; then
echo "CONFIG_TARGET_${mktarget}_${mksubtarget}=y" >> "$config"
fi
if test_feature "locale"; then
- echo "CONFIG_NLS=y" >> "$config"
+ echo "CONFIG_BUILD_NLS=y" >> "$config"
else
- echo "# CONFIG_NLS is not set" >> "$config"
+ echo "# CONFIG_BUILD_NLS is not set" >> "$config"
fi
echo "CONFIG_DEVEL=y" >> "$config"
echo "CONFIG_TOOLCHAIN_PREFIX=\"$prefix\"" >> "$config"
echo "CONFIG_TARGET_NAME=\"$target\"" >> "$config"
+ if [ -f "$config" ]; then
+ sed -i '/CONFIG_EXTERNAL_TOOLCHAIN_LIBC_USE_MUSL/d' "$config"
+ sed -i '/CONFIG_EXTERNAL_TOOLCHAIN_LIBC_USE_GLIBC/d' "$config"
+ fi
+
+ if [ "$LIBC_TYPE" == glibc ]; then
+ echo "CONFIG_EXTERNAL_TOOLCHAIN_LIBC_USE_GLIBC=y" >> "$config"
+ elif [ "$LIBC_TYPE" == musl ]; then
+ echo "CONFIG_EXTERNAL_TOOLCHAIN_LIBC_USE_MUSL=y" >> "$config"
+ else
+ echo "Can't detect LIBC type. Aborting!" >&2
+ return 1
+ fi
+
local lib
- for lib in C RT PTHREAD GCC STDCPP SSP GFORTRAN; do
+ for lib in C RT PTHREAD GCC STDCPP SSP GFORTRAN GOMP; do
local file
local spec=""
local llib="$(echo "$lib" | sed -e 's#.*#\L&#')"
}
probe_libc() {
+ if [ -f $TOOLCHAIN/info.mk ]; then
+ LIBC_TYPE=$(grep LIBC_TYPE $TOOLCHAIN/info.mk | sed 's/LIBC_TYPE=//')
+ return 0
+ fi
+
+ echo "Warning! Can't find info.mk, trying to detect with alternative way."
+
if [ -z "$LIBC_TYPE" ]; then
if test_uclibc; then
LIBC_TYPE="uclibc"
exit $?
;;
+ --overwrite-config)
+ OVERWRITE_CONFIG=y
+ ;;
+
--config)
if probe_cc; then
+ probe_libc
print_config "$1"
exit $?
fi
echo -e " $me --toolchain {directory} --config {target}" >&2
echo -e " Analyze the given toolchain and print a suitable" >&2
echo -e " .config for the given target. Omit target " >&2
- echo -e " argument to get a list of names." >&2
- echo -e " suitable to prime .config with.\n" >&2
+ echo -e " argument to get a list of names.\n" >&2
echo -e " $me --help" >&2
echo -e " Display this help text and exit.\n\n" >&2
echo -e " Most commands also take a --cflags parameter which " >&2
echo -e " is used to specify C flags to be passed to the " >&2
echo -e " cross compiler when performing tests." >&2
- echo -e " This paremter may be repeated multiple times." >&2
+ echo -e " This parameter may be repeated multiple times." >&2
+ echo -e " Use --overwrite-config before --config to overwrite" >&2
+ echo -e " an already present config with the required changes.">&2
exit 1
;;