From b8e64a0c08ea2c3b2940d8e7154970f0dc610ed5 Mon Sep 17 00:00:00 2001 From: Erico Nunes Date: Sun, 21 Jun 2015 20:53:06 -0300 Subject: 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 diff --git a/config/libc/avr-libc.in b/config/libc/avr-libc.in new file mode 100644 index 0000000..968ca6b --- /dev/null +++ b/config/libc/avr-libc.in @@ -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 diff --git a/config/libc/avr-libc.in.2 b/config/libc/avr-libc.in.2 new file mode 100644 index 0000000..89a182f --- /dev/null +++ b/config/libc/avr-libc.in.2 @@ -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. diff --git a/config/toolchain.in b/config/toolchain.in index 5048e91..361c6bd 100644 --- a/config/toolchain.in +++ b/config/toolchain.in @@ -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. diff --git a/scripts/build/libc/avr-libc.sh b/scripts/build/libc/avr-libc.sh new file mode 100644 index 0000000..502beb8 --- /dev/null +++ b/scripts/build/libc/avr-libc.sh @@ -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 +} diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh index 672e672..39dbe01 100644 --- a/scripts/build/libc/glibc.sh +++ b/scripts/build/libc/glibc.sh @@ -665,3 +665,7 @@ do_libc_locales() { install_root="${CT_SYSROOT_DIR}" \ localedata/install-locales } + +do_libc_post_cc() { + : +} diff --git a/scripts/build/libc/mingw.sh b/scripts/build/libc/mingw.sh index 23f31d1..26a00e0 100644 --- a/scripts/build/libc/mingw.sh +++ b/scripts/build/libc/mingw.sh @@ -112,3 +112,7 @@ do_libc() { CT_EndStep } + +do_libc_post_cc() { + : +} diff --git a/scripts/build/libc/musl.sh b/scripts/build/libc/musl.sh index ac98bb9..81a19d7 100644 --- a/scripts/build/libc/musl.sh +++ b/scripts/build/libc/musl.sh @@ -113,3 +113,7 @@ do_libc() { CT_EndStep } + +do_libc_post_cc() { + : +} diff --git a/scripts/build/libc/newlib.sh b/scripts/build/libc/newlib.sh index af04a6d..744c291 100644 --- a/scripts/build/libc/newlib.sh +++ b/scripts/build/libc/newlib.sh @@ -149,3 +149,7 @@ do_libc() { CT_EndStep } + +do_libc_post_cc() { + : +} diff --git a/scripts/build/libc/none.sh b/scripts/build/libc/none.sh index ca95e73..d4bf7dc 100644 --- a/scripts/build/libc/none.sh +++ b/scripts/build/libc/none.sh @@ -21,3 +21,7 @@ do_libc_start_files() { do_libc() { : } + +do_libc_post_cc() { + : +} diff --git a/scripts/build/libc/uClibc.sh b/scripts/build/libc/uClibc.sh index f0522ab..d270915 100644 --- a/scripts/build/libc/uClibc.sh +++ b/scripts/build/libc/uClibc.sh @@ -554,3 +554,7 @@ mungeuClibcConfig() { sed -r -f "${munge_file}" "${src_config_file}" >"${dst_config_file}" } + +do_libc_post_cc() { + : +} diff --git a/scripts/functions b/scripts/functions index e62fba2..0fe8239 100644 --- a/scripts/functions +++ b/scripts/functions @@ -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}" diff --git a/steps.mk b/steps.mk index 1323379..6a6e07e 100644 --- a/steps.mk +++ b/steps.mk @@ -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 \ -- cgit v0.10.2-6-g49f6