From 230dc12285842a51e0a2a95137ae4eae675b97d3 Mon Sep 17 00:00:00 2001 From: Erico Nunes Date: Sun, 21 Jun 2015 20:49:10 -0300 Subject: avr: add support for AVR 8-bit architecture This commit adds support for the Atmel AVR 8-bit RISC architecture. This is the first 8-bit architecture to be added to crosstool-ng so the configuration options for 8-bit architectures are added here as well. gcc has had support for AVR for quite a while, at least since the 4.3 series for the currently popular ATmega microcontroler series. The AVR architecture only supports bare-metal toolchains. gcc for the AVR 8-bit architecture, usually referred to as avr-gcc, is commonly used in conjunction with the avr-libc library which provides additional resources for the Atmel AVR 8-bit microcontrollers. avr-gcc can also be found as a supported package in some recent Linux distributions. This commit also closes #66 Signed-off-by: Erico Nunes --- scripts/build/arch/avr.sh | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 scripts/build/arch/avr.sh (limited to 'scripts') diff --git a/scripts/build/arch/avr.sh b/scripts/build/arch/avr.sh new file mode 100644 index 00000000..501b020b --- /dev/null +++ b/scripts/build/arch/avr.sh @@ -0,0 +1,5 @@ +# Compute AVR-specific values + +CT_DoArchTupleValues() { + CT_TARGET_ARCH="${CT_ARCH}" +} -- cgit v1.2.3 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 --- config/libc/avr-libc.in | 51 ++++++++++++++++++++++++++++++ config/libc/avr-libc.in.2 | 8 +++++ config/toolchain.in | 1 + scripts/build/libc/avr-libc.sh | 71 ++++++++++++++++++++++++++++++++++++++++++ scripts/build/libc/glibc.sh | 4 +++ scripts/build/libc/mingw.sh | 4 +++ scripts/build/libc/musl.sh | 4 +++ scripts/build/libc/newlib.sh | 4 +++ scripts/build/libc/none.sh | 4 +++ scripts/build/libc/uClibc.sh | 4 +++ scripts/functions | 10 +++++- steps.mk | 1 + 12 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 config/libc/avr-libc.in create mode 100644 config/libc/avr-libc.in.2 create mode 100644 scripts/build/libc/avr-libc.sh (limited to 'scripts') diff --git a/config/libc/avr-libc.in b/config/libc/avr-libc.in new file mode 100644 index 00000000..968ca6be --- /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 00000000..89a182fe --- /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 5048e919..361c6bd0 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 00000000..502beb8b --- /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 672e6725..39dbe01d 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 23f31d1a..26a00e09 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 ac98bb97..81a19d72 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 af04a6d1..744c291f 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 ca95e739..d4bf7dcb 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 f0522abd..d270915e 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 e62fba2b..0fe8239a 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 1323379e..6a6e07ed 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 v1.2.3 From 219c5e932fddfa9a5a996fb5774fdbe0e117c05c Mon Sep 17 00:00:00 2001 From: Erico Nunes Date: Sun, 21 Jun 2015 20:53:43 -0300 Subject: functions: add support for arch-specific patch Add support for applying arch-specific patches found in "patches/${pkgname}/${version}/${CT_ARCH}". This is needed for applying a popular binutils patch specific for the AVR architecture but which isn't isolated for AVR in binutils' code. In this case, applying it for every architecture would end up bloating binutils' "size" options with AVR specifics. This feels like a bit of a hack but it is easy enough to support with current crosstool-ng infrastructure, seems like worth it for this case. Signed-off-by: Erico Nunes --- scripts/functions | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'scripts') diff --git a/scripts/functions b/scripts/functions index 0fe8239a..6429aa8c 100644 --- a/scripts/functions +++ b/scripts/functions @@ -1101,13 +1101,14 @@ CT_Patch() { CT_DoLog EXTRA "Patching '${pkgdir}'" bundled_patch_dir="${CT_LIB_DIR}/patches/${pkgname}/${version}" + bundled_patch_arch_dir="${bundled_patch_dir}/${CT_ARCH}" local_patch_dir="${CT_LOCAL_PATCH_DIR}/${pkgname}/${version}" case "${CT_PATCH_ORDER}" in - bundled) patch_dirs=("${bundled_patch_dir}");; + bundled) patch_dirs=("${bundled_patch_dir}" "${bundled_patch_arch_dir}");; local) patch_dirs=("${local_patch_dir}");; - bundled,local) patch_dirs=("${bundled_patch_dir}" "${local_patch_dir}");; - local,bundled) patch_dirs=("${local_patch_dir}" "${bundled_patch_dir}");; + bundled,local) patch_dirs=("${bundled_patch_dir}" "${bundled_patch_arch_dir}" "${local_patch_dir}");; + local,bundled) patch_dirs=("${local_patch_dir}" "${bundled_patch_dir}" "${bundled_patch_arch_dir}");; none) patch_dirs=;; esac -- cgit v1.2.3 From 14cc1cb28e37d5e6ce0b01990445de493ec7a967 Mon Sep 17 00:00:00 2001 From: Erico Nunes Date: Sun, 21 Jun 2015 20:54:16 -0300 Subject: functions: write permission in config.{guess,sub} avr-libc doesn't have write permissions in these by default in the 1.8.1 tar release, this caused an error during build with CT_OVERIDE_CONFIG_GUESS_SUB enabled. chmod u+w them before overriding to avoid an this error. Signed-off-by: Erico Nunes --- scripts/functions | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'scripts') diff --git a/scripts/functions b/scripts/functions index 6429aa8c..86653465 100644 --- a/scripts/functions +++ b/scripts/functions @@ -1132,7 +1132,9 @@ CT_Patch() { eval ${cfg}="${CT_LIB_DIR}/scripts/${cfg/_/.}" [ -e "${CT_TOP_DIR}/scripts/${cfg/_/.}" ] && eval ${cfg}="${CT_TOP_DIR}/scripts/${cfg/_/.}" # Can't use CT_DoExecLog because of the '{} \;' to be passed un-mangled to find - find . -type f -name "${cfg/_/.}" -exec cp -v "${!cfg}" {} \; |CT_DoLog ALL + find . -type f -name "${cfg/_/.}" \ + -exec chmod -v u+w {} \; \ + -exec cp -v "${!cfg}" {} \; |CT_DoLog ALL done fi -- cgit v1.2.3