给树莓派3B+构建Linux时添加gcc

给树莓派 3B+ 构建 Linux 时想顺便添加 gcc,反正都是玩儿么。

不过根据 Buildroot 官方文档,从 Buildroot-2012.11 开始,对 native gcc 的支持就停止了。yocto 又太复杂了,只能在网上找添加目标 gcc 包的方法。

可能因为没什么用,很难找,找了一圈,最终在一个国外学校的网站上搜到了:Buildroot and compiler on target

最终过程如下:


打补丁

git clone https://gitee.com/mirrors/buildroot.git

wget https://luplab.cs.ucdavis.edu/assets/buildroot-gcc/gcc-target.patch

git apply --stat ../gcc-target.patch
git apply --check ../gcc-target.patch
git apply ../gcc-target.patch

似乎应用不了,reset 到 2021.08-rc1 也不行。
算了,直接添加好了。

添加 hash 列表

添加文件 hash 值,用于下载校验

cd package/gcc/gcc-target/
ln -s ../gcc.hash gcc-target.hash

添加 mk 文件

添加 mk 文件,用于编译

nano package/gcc/gcc-target/gcc-target.mk

内容如下

################################################################################
#
# gcc-target
#
################################################################################

GCC_TARGET_VERSION = $(GCC_VERSION)
GCC_TARGET_SITE = $(GCC_SITE)
GCC_TARGET_SOURCE = $(GCC_SOURCE)

# Use the same archive as gcc-initial and gcc-final
GCC_TARGET_DL_SUBDIR = gcc

GCC_TARGET_DEPENDENCIES = gmp mpfr mpc

# First, we use HOST_GCC_COMMON_MAKE_OPTS to get a lot of correct flags (such as
# the arch, abi, float support, etc.) which are based on the config used to
# build the internal toolchain
GCC_TARGET_CONF_OPTS = $(HOST_GCC_COMMON_CONF_OPTS)
# Then, we modify incorrect flags from HOST_GCC_COMMON_CONF_OPTS
GCC_TARGET_CONF_OPTS += \
	--with-sysroot=/ \
	--with-build-sysroot=$(STAGING_DIR) \
	--disable-__cxa_atexit \
	--with-gmp=$(STAGING_DIR) \
	--with-mpc=$(STAGING_DIR) \
	--with-mpfr=$(STAGING_DIR)
# Then, we force certain flags that may appear in HOST_GCC_COMMON_CONF_OPTS
GCC_TARGET_CONF_OPTS += \
	--disable-libquadmath \
	--disable-libsanitizer \
	--disable-plugin \
	--disable-lto
# Finally, we add some of our own flags
GCC_TARGET_CONF_OPTS += \
	--enable-languages=c \
	--disable-boostrap \
	--disable-libgomp \
	--disable-nls \
	--disable-libmpx \
	--disable-gcov \
	$(EXTRA_TARGET_GCC_CONFIG_OPTIONS)

GCC_TARGET_CONF_ENV = $(HOST_GCC_COMMON_CONF_ENV)

GCC_TARGET_MAKE_OPTS += $(HOST_GCC_COMMON_MAKE_OPTS)

# Install standard C headers (from glibc)
define GCC_TARGET_INSTALL_HEADERS
	cp -r $(STAGING_DIR)/usr/include $(TARGET_DIR)/usr
endef
GCC_TARGET_POST_INSTALL_TARGET_HOOKS += GCC_TARGET_INSTALL_HEADERS

# Install standard C libraries (from glibc)
GCC_TARGET_GLIBC_LIBS = \
	*crt*.o *_nonshared.a \
	libBrokenLocale.so libanl.so libbfd.so libc.so libcrypt.so libdl.so \
	libm.so libnss_compat.so libnss_db.so libnss_files.so libnss_hesiod.so \
	libpthread.so libresolv.so librt.so libthread_db.so libutil.so

define GCC_TARGET_INSTALL_LIBS
	for libpattern in $(GCC_TARGET_GLIBC_LIBS); do \
		$(call copy_toolchain_lib_root,$$libpattern) ; \
	done
endef
GCC_TARGET_POST_INSTALL_TARGET_HOOKS += GCC_TARGET_INSTALL_LIBS

# Remove unnecessary files (extra links to gcc binaries, and libgcc which is
# already in `/lib`)
define GCC_TARGET_RM_FILES
	rm -f $(TARGET_DIR)/usr/bin/$(ARCH)-buildroot-linux-gnu-gcc*
	rm -f $(TARGET_DIR)/usr/lib/libgcc_s*.so*
	rm -f $(TARGET_DIR)/usr/$(ARCH)-buildroot-linux-gnu/lib/ldscripts/elf32*
	rm -f $(TARGET_DIR)/usr/$(ARCH)-buildroot-linux-gnu/lib/ldscripts/elf64b*
endef
GCC_TARGET_POST_INSTALL_TARGET_HOOKS += GCC_TARGET_RM_FILES

$(eval $(autotools-package))

添加目标包配置脚本

nano package/gcc/Config.in

内容如下

config BR2_PACKAGE_GCC_TARGET
	bool "gcc"
	depends on BR2_TOOLCHAIN_BUILDROOT
	select BR2_PACKAGE_BINUTILS
	select BR2_PACKAGE_BINUTILS_TARGET
	select BR2_PACKAGE_GMP
	select BR2_PACKAGE_MPFR
	select BR2_PACKAGE_MPC
	help
	  If you want the target system to be able to run
	  binutils/gcc and compile native code, say Y here.

config BR2_EXTRA_TARGET_GCC_CONFIG_OPTIONS
	string "Additional target gcc options"
	default ""
	depends on BR2_PACKAGE_GCC_TARGET
	help
	  Any additional target gcc options you may want to include....
	  Including, but not limited to --disable-checking etc.
	  Refer to */configure in your gcc sources.
      

添加目标包引用

nano package/Config.in

在 Develope tools 下面添加

source "package/gcc/Config.in"

包含头文件

安装到目标时将头文件包含进去

nano Makefile

修改如下

rm -rf $(TARGET_DIR)/usr/include $(TARGET_DIR)/usr/share/aclocal \
替换为
rm -rf $(TARGET_DIR)/usr/share/aclocal \

\( -name '*.a' -o -name '*.la' -o -name '*.prl' \) -print0 | xargs -0 rm -f
替换为
\( -name '*.la' -o -name '*.prl' \) -print0 | xargs -0 rm -f

重新配置

make menuconfig

修改如下

Target packages ->Development tools,添加 gcc
Filesystem ->images exact size,改为 500M
Build options ->strip target binaries,取消

重新编译

make -j8

Share Tweet Send
0 Comments
Loading...
You've successfully subscribed to 隔窗听雨
Great! Next, complete checkout for full access to 隔窗听雨
Welcome back! You've successfully signed in
Success! Your account is fully activated, you now have access to all content.
豫ICP备19045256号-1