avr-libc: add support for avr-libc C library

This commit adds support for the avr-libc C library.
According to the project page at http://www.nongnu.org/avr-libc , the
avr-libc package provides a subset of the standard C library for Atmel
AVR 8-bit RISC microcontrollers. In addition, the library provides the
basic startup code needed by most applications.

Support for this library in crosstool-ng is only enabled for the AVR
8-bit target.

The avr-libc manual and most distributions build the AVR 8-bit gcc
toolchain with the "avr" (non-canonical) target.
Some experimentation also led to the conclusion that other (canonical)
targets are not very well supported, so we force the "avr" target for
crosstool-ng as well.

The manual also recommends building avr-libc after the final gcc build.
To accomplish this with crosstool-ng, a new do_libc_post_cc step is
added, in which currently only avr-libc performs its build, and is a
no-op for the other libc options.

Signed-off-by: Erico Nunes <nunes.erico@gmail.com>
This commit is contained in:
Erico Nunes 2015-06-21 20:53:06 -03:00
parent 230dc12285
commit b8e64a0c08
12 changed files with 165 additions and 1 deletions

51
config/libc/avr-libc.in Normal file
View File

@ -0,0 +1,51 @@
# avr-libc options
## depends on ARCH_avr
## depends on ! LINUX && ! WINDOWS && BARE_METAL
##
## select LIBC_SUPPORT_THREADS_NONE
##
## help The AVR Libc package provides a subset of the standard C library for
## help Atmel AVR 8-bit RISC microcontrollers. In addition, the library
## help provides the basic startup code needed by most applications.
choice
bool
prompt "avr-libc version"
# Don't remove next line
# CT_INSERT_VERSION_BELOW
config LIBC_AVR_LIBC_V_1_8_1
bool
prompt "1.8.1"
config LIBC_AVR_LIBC_V_1_8_0
bool
prompt "1.8.0"
config LIBC_AVR_LIBC_CUSTOM
bool
prompt "Custom avr-libc"
depends on EXPERIMENTAL
endchoice
if LIBC_AVR_LIBC_CUSTOM
config LIBC_AVR_LIBC_CUSTOM_LOCATION
string
prompt "Full path to custom avr-libc source"
default ""
help
Enter the path to the directory (or tarball) of your source for avr-libc,
or leave blank to use default CT_CUSTOM_LOCATION_ROOT_DIR/avr-libc
endif # LIBC_AVR_LIBC_CUSTOM
config LIBC_VERSION
string
# Don't remove next line
# CT_INSERT_VERSION_STRING_BELOW
default "1.8.1" if LIBC_AVR_LIBC_V_1_8_1
default "1.8.0" if LIBC_AVR_LIBC_V_1_8_0
default "custom" if LIBC_AVR_LIBC_CUSTOM

View File

@ -0,0 +1,8 @@
# avr-libc second-part options
config LIBC_AVR_LIBC_EXTRA_CONFIG_ARRAY
string
prompt "Extra config for avr-libc"
default ""
help
Extra flags to pass onto ./configure when configuring the avr-libc.

View File

@ -99,6 +99,7 @@ comment "Tuple completion and aliasing"
config TARGET_VENDOR
string
prompt "Tuple's vendor string"
depends on !LIBC_avr_libc
default "unknown"
help
Vendor part of the target tuple.

View File

@ -0,0 +1,71 @@
# This file adds functions to build the avr-libc C library
do_libc_get() {
local libc_src
libc_src="http://download.savannah.gnu.org/releases/avr-libc"
if [ "${CT_LIBC_AVR_LIBC_CUSTOM}" = "y" ]; then
CT_GetCustom "avr-libc" "${CT_LIBC_VERSION}" \
"${CT_LIBC_AVR_LIBC_CUSTOM_LOCATION}"
else # ! custom location
CT_GetFile "avr-libc-${CT_LIBC_VERSION}" "${libc_src}"
fi # ! custom location
}
do_libc_extract() {
# If using custom directory location, nothing to do.
if [ "${CT_LIBC_AVR_LIBC_CUSTOM}" = "y" ]; then
# Abort if the custom directory is not found.
if ! [ -d "${CT_SRC_DIR}/avr-libc-${CT_LIBC_VERSION}" ]; then
CT_Abort "Directory not found: ${CT_SRC_DIR}/avr-libc-${CT_LIBC_VERSION}"
fi
return 0
fi
CT_Extract "avr-libc-${CT_LIBC_VERSION}"
CT_Patch "avr-libc" "${CT_LIBC_VERSION}"
}
do_libc_check_config() {
:
}
do_libc_configure() {
CT_DoLog EXTRA "Configuring C library"
CT_DoExecLog CFG \
./configure \
--build=${CT_BUILD} \
--host=${CT_TARGET} \
--prefix=${CT_PREFIX_DIR} \
"${CT_LIBC_AVR_LIBC_EXTRA_CONFIG_ARRAY[@]}"
}
do_libc_start_files() {
:
}
do_libc() {
:
}
do_libc_post_cc() {
CT_DoStep INFO "Installing C library"
CT_DoLog EXTRA "Copying sources to build directory"
CT_DoExecLog ALL cp -av "${CT_SRC_DIR}/avr-libc-${CT_LIBC_VERSION}" \
"${CT_BUILD_DIR}/build-libc-post-cc"
cd "${CT_BUILD_DIR}/build-libc-post-cc"
do_libc_configure
CT_DoLog EXTRA "Building C library"
CT_DoExecLog ALL make ${JOBSFLAGS}
CT_DoLog EXTRA "Installing C library"
CT_DoExecLog ALL make install
CT_EndStep
}

View File

@ -665,3 +665,7 @@ do_libc_locales() {
install_root="${CT_SYSROOT_DIR}" \
localedata/install-locales
}
do_libc_post_cc() {
:
}

View File

@ -112,3 +112,7 @@ do_libc() {
CT_EndStep
}
do_libc_post_cc() {
:
}

View File

@ -113,3 +113,7 @@ do_libc() {
CT_EndStep
}
do_libc_post_cc() {
:
}

View File

@ -149,3 +149,7 @@ do_libc() {
CT_EndStep
}
do_libc_post_cc() {
:
}

View File

@ -21,3 +21,7 @@ do_libc_start_files() {
do_libc() {
:
}
do_libc_post_cc() {
:
}

View File

@ -554,3 +554,7 @@ mungeuClibcConfig() {
sed -r -f "${munge_file}" "${src_config_file}" >"${dst_config_file}"
}
do_libc_post_cc() {
:
}

View File

@ -1206,6 +1206,11 @@ CT_DoBuildTargetTuple() {
*glibc) CT_TARGET_SYS=gnu;;
uClibc) CT_TARGET_SYS=uclibc;;
musl) CT_TARGET_SYS=musl;;
avr-libc)
# avr-libc only seems to work with the non-canonical "avr" target.
CT_TARGET_SKIP_CONFIG_SUB=y
CT_TARGET_SYS= # CT_TARGET_SYS must be empty too
;;
*) CT_TARGET_SYS=elf;;
esac
@ -1259,7 +1264,10 @@ CT_DoBuildTargetTuple() {
esac
# Canonicalise it
CT_TARGET=$(CT_DoConfigSub "${CT_TARGET}")
if [ "${CT_TARGET_SKIP_CONFIG_SUB}" != "y" ]; then
CT_TARGET=$(CT_DoConfigSub "${CT_TARGET}")
fi
# Prepare the target CFLAGS
CT_ARCH_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_ARCH_ENDIAN_CFLAG}"
CT_ARCH_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_ARCH_ARCH_CFLAG}"

View File

@ -30,6 +30,7 @@ CT_STEPS := libc_check_config \
libc \
cc_for_build \
cc_for_host \
libc_post_cc \
libelf_for_target \
binutils_for_target \
debug \