ext-toolchain.sh: add option to write .config Add a new --config option to generate a .config from a given toolchain, this allows for easy integration of external toolchains, e.g.
./scripts/ext-toolchain.sh --toolchain /opt/mips-2011.03 --cflags "-muclibc" --config atheros to setup a ready-to-compile atheros target using the external CodeSourcery toolchain. SVN-Revision: 29780
This commit is contained in:
		| @@ -34,7 +34,7 @@ LIB_SPECS=" | |||||||
| 	c:        ld-* lib{anl,c,cidn,crypt,dl,m,nsl,nss_dns,nss_files,resolv,util} | 	c:        ld-* lib{anl,c,cidn,crypt,dl,m,nsl,nss_dns,nss_files,resolv,util} | ||||||
| 	rt:       librt-* librt | 	rt:       librt-* librt | ||||||
| 	pthread:  libpthread-* libpthread | 	pthread:  libpthread-* libpthread | ||||||
| 	cpp:      libstdc++ | 	stdcpp:   libstdc++ | ||||||
| 	gcc:      libgcc_s | 	gcc:      libgcc_s | ||||||
| 	ssp:      libssp | 	ssp:      libssp | ||||||
| 	gfortran: libgfortran | 	gfortran: libgfortran | ||||||
| @@ -142,7 +142,7 @@ test_feature() { | |||||||
|  |  | ||||||
|  |  | ||||||
| find_libs() { | find_libs() { | ||||||
| 	local spec="$(echo "$LIB_SPECS" | sed -ne "s#^[[:space:]]*$1:##p")" | 	local spec="$(echo "$LIB_SPECS" | sed -ne "s#^[[:space:]]*$1:##ip")" | ||||||
|  |  | ||||||
| 	if [ -n "$spec" ] && probe_cpp; then | 	if [ -n "$spec" ] && probe_cpp; then | ||||||
| 		local libdir libdirs | 		local libdir libdirs | ||||||
| @@ -167,7 +167,7 @@ find_libs() { | |||||||
| } | } | ||||||
|  |  | ||||||
| find_bins() { | find_bins() { | ||||||
| 	local spec="$(echo "$BIN_SPECS" | sed -ne "s#^[[:space:]]*$1:##p")" | 	local spec="$(echo "$BIN_SPECS" | sed -ne "s#^[[:space:]]*$1:##ip")" | ||||||
|  |  | ||||||
| 	if [ -n "$spec" ] && probe_cpp; then | 	if [ -n "$spec" ] && probe_cpp; then | ||||||
| 		local sysroot="$("$CPP" -print-sysroot)" | 		local sysroot="$("$CPP" -print-sysroot)" | ||||||
| @@ -237,6 +237,126 @@ wrap_bins() { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | print_config() { | ||||||
|  | 	local mktarget="$1" | ||||||
|  | 	local mksubtarget | ||||||
|  |  | ||||||
|  | 	local target="$("$CC" $CFLAGS -dumpmachine)" | ||||||
|  | 	local cpuarch="${target%%-*}" | ||||||
|  | 	local prefix="${CC##*/}"; prefix="${prefix%-*}-" | ||||||
|  | 	local config="${0%/scripts/*}/.config" | ||||||
|  |  | ||||||
|  | 	# if no target specified, print choice list and exit | ||||||
|  | 	if [ -z "$mktarget" ]; then | ||||||
|  | 		# prepare metadata | ||||||
|  | 		if [ ! -f "${0%/scripts/*}/tmp/.targetinfo" ]; then | ||||||
|  | 			"${0%/*}/scripts/config/mconf" prepare-tmpinfo | ||||||
|  | 		fi | ||||||
|  |  | ||||||
|  | 		local mktargets=$( | ||||||
|  | 			sed -ne " | ||||||
|  | 				/^Target: / { h }; | ||||||
|  | 				/^Target-Arch: $cpuarch\$/ { x; s#^Target: ##p } | ||||||
|  | 			" "${0%/scripts/*}/tmp/.targetinfo" | sort -u | ||||||
|  | 		) | ||||||
|  |  | ||||||
|  | 		for mktarget in $mktargets; do | ||||||
|  | 			case "$mktarget" in */*) | ||||||
|  | 				mktargets=$(echo "$mktargets" | sed -e "/^${mktarget%/*}\$/d") | ||||||
|  | 			esac | ||||||
|  | 		done | ||||||
|  |  | ||||||
|  | 		if [ -n "$mktargets" ]; then | ||||||
|  | 			echo "Available targets:"                               >&2 | ||||||
|  | 			echo $mktargets                                         >&2 | ||||||
|  | 		else | ||||||
|  | 			echo -e "Could not find a suitable OpenWrt target for " >&2 | ||||||
|  | 			echo -e "CPU architecture '$cpuarch' - you need to "    >&2 | ||||||
|  | 			echo -e "define one first!"                             >&2 | ||||||
|  | 		fi | ||||||
|  | 		return 1 | ||||||
|  | 	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 | ||||||
|  | 	fi | ||||||
|  |  | ||||||
|  | 	case "$mktarget" in */*) | ||||||
|  | 		mksubtarget="${mktarget#*/}" | ||||||
|  | 		mktarget="${mktarget%/*}" | ||||||
|  | 	;; esac | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	echo "CONFIG_TARGET_${mktarget}=y" > "$config" | ||||||
|  |  | ||||||
|  | 	if [ -n "$mksubtarget" ]; then | ||||||
|  | 		echo "CONFIG_TARGET_${mktarget}_${mksubtarget}=y" >> "$config" | ||||||
|  | 	fi | ||||||
|  |  | ||||||
|  | 	if test_feature "softfloat"; then | ||||||
|  | 		echo "CONFIG_SOFT_FLOAT=y" >> "$config" | ||||||
|  | 	else | ||||||
|  | 		echo "# CONFIG_SOFT_FLOAT is not set" >> "$config" | ||||||
|  | 	fi | ||||||
|  |  | ||||||
|  | 	if test_feature "ipv6"; then | ||||||
|  | 		echo "CONFIG_IPV6=y" >> "$config" | ||||||
|  | 	else | ||||||
|  | 		echo "# CONFIG_IPV6 is not set" >> "$config" | ||||||
|  | 	fi | ||||||
|  |  | ||||||
|  | 	if test_feature "locale"; then | ||||||
|  | 		echo "CONFIG_NLS=y" >> "$config" | ||||||
|  | 	else | ||||||
|  | 		echo "# CONFIG_NLS is not set" >> "$config" | ||||||
|  | 	fi | ||||||
|  |  | ||||||
|  | 	echo "CONFIG_DEVEL=y" >> "$config" | ||||||
|  | 	echo "CONFIG_EXTERNAL_TOOLCHAIN=y" >> "$config" | ||||||
|  | 	echo "CONFIG_TOOLCHAIN_ROOT=\"$TOOLCHAIN\"" >> "$config" | ||||||
|  | 	echo "CONFIG_TOOLCHAIN_PREFIX=\"$prefix\"" >> "$config" | ||||||
|  | 	echo "CONFIG_TARGET_NAME=\"$target\"" >> "$config" | ||||||
|  |  | ||||||
|  | 	local lib | ||||||
|  | 	for lib in C RT PTHREAD GCC STDCPP SSP GFORTRAN; do | ||||||
|  | 		local file | ||||||
|  | 		local spec="" | ||||||
|  | 		local llib="$(echo "$lib" | sed -e 's#.*#\L&#')" | ||||||
|  | 		for file in $(find_libs "$lib"); do | ||||||
|  | 			spec="${spec:+$spec }$(echo "$file" | sed -e "s#^$TOOLCHAIN#.#")" | ||||||
|  | 		done | ||||||
|  | 		if [ -n "$spec" ]; then | ||||||
|  | 			echo "CONFIG_PACKAGE_lib${llib}=y" >> "$config" | ||||||
|  | 			echo "CONFIG_LIB${lib}_FILE_SPEC=\"$spec\"" >> "$config" | ||||||
|  | 		else | ||||||
|  | 			echo "# CONFIG_PACKAGE_lib${llib} is not set" >> "$config" | ||||||
|  | 		fi | ||||||
|  | 	done | ||||||
|  |  | ||||||
|  | 	local bin | ||||||
|  | 	for bin in LDD LDCONFIG; do | ||||||
|  | 		local file | ||||||
|  | 		local spec="" | ||||||
|  | 		local lbin="$(echo "$bin" | sed -e 's#.*#\L&#')" | ||||||
|  | 		for file in $(find_bins "$bin"); do | ||||||
|  | 			spec="${spec:+$spec }$(echo "$file" | sed -e "s#^$TOOLCHAIN#.#")" | ||||||
|  | 		done | ||||||
|  | 		if [ -n "$spec" ]; then | ||||||
|  | 			echo "CONFIG_PACKAGE_${lbin}=y" >> "$config" | ||||||
|  | 			echo "CONFIG_${bin}_FILE_SPEC=\"$spec\"" >> "$config" | ||||||
|  | 		else | ||||||
|  | 			echo "# CONFIG_PACKAGE_${lbin} is not set" >> "$config" | ||||||
|  | 		fi | ||||||
|  | 	done | ||||||
|  |  | ||||||
|  | 	# inflate | ||||||
|  | 	make -C "${0%/scripts/*}" defconfig | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| probe_cc() { | probe_cc() { | ||||||
| 	if [ -z "$CC" ]; then | 	if [ -z "$CC" ]; then | ||||||
| 		local bin | 		local bin | ||||||
| @@ -366,6 +486,15 @@ while [ -n "$1" ]; do | |||||||
| 			exit $? | 			exit $? | ||||||
| 		;; | 		;; | ||||||
|  |  | ||||||
|  | 		--config) | ||||||
|  | 			if probe_cc; then | ||||||
|  | 				print_config "$1" | ||||||
|  | 				exit $? | ||||||
|  | 			fi | ||||||
|  | 			echo "No C compiler found in '$TOOLCHAIN'." >&2 | ||||||
|  | 			exit 1 | ||||||
|  | 		;; | ||||||
|  |  | ||||||
| 		-h|--help) | 		-h|--help) | ||||||
| 			me="$(basename "$0")" | 			me="$(basename "$0")" | ||||||
| 			echo -e "\nUsage:\n"                                            >&2 | 			echo -e "\nUsage:\n"                                            >&2 | ||||||
| @@ -388,6 +517,11 @@ while [ -n "$1" ]; do | |||||||
| 			echo -e "    Create wrapper scripts for C and C++ compiler, "   >&2 | 			echo -e "    Create wrapper scripts for C and C++ compiler, "   >&2 | ||||||
| 			echo -e "    linker, assembler and other key executables in "   >&2 | 			echo -e "    linker, assembler and other key executables in "   >&2 | ||||||
| 			echo -e "    the directory given with --wrap.\n"                >&2 | 			echo -e "    the directory given with --wrap.\n"                >&2 | ||||||
|  | 			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 "  $me --help"                                          >&2 | 			echo -e "  $me --help"                                          >&2 | ||||||
| 			echo -e "    Display this help text and exit.\n\n"              >&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 "  Most commands also take a --cflags parameter which " >&2 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jo-Philipp Wich
					Jo-Philipp Wich