在 FreeBSD Ports 中为 GCC14 添加 Ada 支持并构建软件包
Last updated on
本指南详细介绍了如何修改 FreeBSD 的 lang/gcc14 Port 以启用 Ada 语言支持,并进行编译,最终生成可安装的软件包文件的全过程。
此过程需要进行自举(bootstrapping)。这意味着为了构建 GCC 14 的 Ada 前端(GNAT),系统中必须已经安装了可用的 Ada 编译器。
第 1 步:安装自举编译器
首先,安装编译器 gnat13 作为构建 GCC14 的自举工具。如果没有此步骤,GCC14 的 Ada 前端编译将会失败。
sudo pkg install gnat13
第 2 步:设置环境变量
为了确保构建系统优先找到刚才安装的 gnat13 编译器,而不是系统中其他的 GCC 版本,需要将 gnat13 的路径添加到 PATH 环境变量的最前面。
# 将 gnat13 路径添加到当前 Shell 会话
export PATH=/usr/local/gnat13/bin:$PATH
# 确认 PATH 是否设置正确
echo $PATH
# 输出示例: /usr/local/gnat13/bin:/sbin:/bin:/usr/sbin:/usr/bin...
将 CC 和 CXX 环境变量分别设置为 gcc 和 g++。
export CC=gcc
export CXX=g++
第 3 步:修改 Port 文件
进入 lang/gcc14 Port 目录,修改相关文件以确保 Ada 相关文件被包含在软件包中。
cd /usr/ports/lang/gcc14
请参考以下 diff 内容,修改 Makefile、pkg-descr 和 pkg-plist 这三个文件。
diff --git a/lang/gcc14/Makefile b/lang/gcc14/Makefile
index 3f2d7cf484..89ffefc12e 100644
--- a/lang/gcc14/Makefile
+++ b/lang/gcc14/Makefile
@@ -3,7 +3,7 @@ PORTVERSION= 14.2.0
PORTREVISION= 4
CATEGORIES= lang
MASTER_SITES= GCC
-PKGNAMESUFFIX= ${SUFFIX}
+PKGNAMESUFFIX= ${SUFFIX}-ada
MAINTAINER= salvadore@FreeBSD.org
COMMENT= GNU Compiler Collection 14
@@ -80,7 +80,7 @@ CONFIGURE_TARGET= x86_64-portbld-${OPSYS:tl}${OSREL}
CONFIGURE_ARGS+= --with-abi=elfv2
.endif
-LANGUAGES= c,c++,objc,fortran
+LANGUAGES= c,c++,objc,fortran,ada
.if ${ARCH} != i386 && !empty(PORT_OPTIONS:M*BOOTSTRAP)
LANGUAGES:= ${LANGUAGES},jit
.endif
@@ -134,6 +134,9 @@ INFO= gcc${SUFFIX}/cpp \
gcc${SUFFIX}/gccinstall \
gcc${SUFFIX}/gccint \
gcc${SUFFIX}/gfortran \
+ gcc${SUFFIX}/gnat-style \
+ gcc${SUFFIX}/gnat_rm \
+ gcc${SUFFIX}/gnat_ugn \
gcc${SUFFIX}/libgccjit \
gcc${SUFFIX}/libgomp
# Release tarballs (as opposed to snapshots) always carry this.
diff --git a/lang/gcc14/pkg-descr b/lang/gcc14/pkg-descr
index 4802e1f26c..5987959593 100644
--- a/lang/gcc14/pkg-descr
+++ b/lang/gcc14/pkg-descr
@@ -1,3 +1,3 @@
GCC, the GNU Compiler Collection, supports a number of languages.
-This port installs the C, C++, and Fortran front ends as gcc14, g++14,
-and gfortran14, respectively.
+This port installs the C, C++, Fortran, and Ada front ends as gcc14, g++14,
+gfortran14, and gnat14 respectively.
diff --git a/lang/gcc14/pkg-plist b/lang/gcc14/pkg-plist
index 8dcc98c6dd..26c9ba393d 100644
--- a/lang/gcc14/pkg-plist
+++ b/lang/gcc14/pkg-plist
@@ -17,6 +17,16 @@ bin/gcov%%SUFFIX%%
bin/gcov-dump%%SUFFIX%%
bin/gcov-tool%%SUFFIX%%
bin/gfortran%%SUFFIX%%
+bin/gnat%%SUFFIX%%
+bin/gnatbind%%SUFFIX%%
+bin/gnatchop%%SUFFIX%%
+bin/gnatclean%%SUFFIX%%
+bin/gnatkr%%SUFFIX%%
+bin/gnatlink%%SUFFIX%%
+bin/gnatls%%SUFFIX%%
+bin/gnatmake%%SUFFIX%%
+bin/gnatname%%SUFFIX%%
+bin/gnatprep%%SUFFIX%%
bin/lto-dump%%SUFFIX%%
include/gcc%%SUFFIX%%/ISO_Fortran_binding.h
share/man/man1/cpp%%SUFFIX%%.1.gz
第 4 步:编译及打包
所有文件修改完成后,使用 make package 命令进行编译和打包。
# 同时进行编译和软件包生成
make package
* 编译时间: 根据系统配置不同,此过程可能需要几十分钟到数小时。
* make 的工作方式: 如果源代码尚未编译,make package 会自动先执行编译(build)阶段,然后再生成软件包。
第 5 步:检查、安装及验证软件包
编译完成后,需要将构建好的软件包安装到系统中,并确认其是否正确应用。
检查构建产物:验证软件包文件
首先,确认软件包文件是否已正确生成。
生成的软件包位于 Port 目录下的 work/pkg/ 中。
ls -l work/pkg/
您应该能看到类似 gcc14-14.2.0_4.pkg 名称的文件。
在安装之前,可以使用以下命令检查软件包中是否确实包含了 gnat 相关文件。这是验证构建是否成功包含 Ada 的有效方法。
pkg info -l -F work/pkg/gcc14-14.2.0_4.pkg | grep gnat
/usr/local/bin/gnat14
/usr/local/bin/gnatbind14
/usr/local/bin/gnatchop14
/usr/local/bin/gnatclean14
/usr/local/bin/gnatkr14
/usr/local/bin/gnatlink14
/usr/local/bin/gnatls14
/usr/local/bin/gnatmake14
/usr/local/bin/gnatname14
/usr/local/bin/gnatprep14
/usr/local/lib/gcc14/gcc/x86_64-portbld-freebsd14.3/14.2.0/adainclude/gnat.ads
/usr/local/lib/gcc14/gcc/x86_64-portbld-freebsd14.3/14.2.0/adalib/libgnat.a
/usr/local/lib/gcc14/gcc/x86_64-portbld-freebsd14.3/14.2.0/adalib/libgnat-14.so
/usr/local/lib/gcc14/gcc/x86_64-portbld-freebsd14.3/14.2.0/adalib/gnat.ali
/usr/local/lib/gcc14/gcc/x86_64-portbld-freebsd14.3/14.2.0/adalib/libgnat.so
/usr/local/lib/gcc14/gcc/x86_64-portbld-freebsd14.3/14.2.0/adalib/libgnat_pic.a
/usr/local/libexec/gcc14/gcc/x86_64-portbld-freebsd14.3/14.2.0/gnat1
/usr/local/share/info/gcc14/gnat-style.info
/usr/local/share/info/gcc14/gnat_rm.info
/usr/local/share/info/gcc14/gnat_ugn.info
如果命令执行结果如上所示,输出了 .../bin/gnat14、.../bin/gnatmake14 等路径,则说明 Ada 组件已正确包含。
安装选项:make reinstall 与 pkg add
有两种方法可以将软件包安装到系统中。在大多数情况下,建议使用第一种方法 make reinstall。
- 方法 1:使用
make reinstall
场景: FreeBSD 系统中很可能已经安装了 gcc14,因为许多其他程序都依赖于它。在这种情况下,直接使用 make install 命令会因与现有软件包冲突而失败。
解决方案: make reinstall 命令会先安全卸载现有的 gcc14,然后在该位置安装我们新构建的带有 Ada 支持的版本。该命令自动处理卸载和安装,简化了操作流程。
` sh # 卸载现有软件包并重新安装新构建的版本 make reinstall `
- 方法 2:使用
pkg add(手动安装及存档用)
用途:当需要将生成的 .pkg 文件传输到其他系统,或用于备份时,使用此方法。
` shell # 使用 pkg add 命令直接安装(需要 root 权限) $ sudo pkg add ./work/pkg/gcc14-14.2.0_4.pkg Installing gcc14-14.2.0_4… the most recent version of gcc14-14.2.0_4 is already installed `
同样,如果系统中已安装 gcc14,此方法也可能失败。此时,可以使用 -f (force) 选项强制覆盖现有安装的软件包。
` shell $ sudo pkg add -f work/pkg/gcc14-14.2.0_4.pkg Installing gcc14-14.2.0_4… package gcc14 is already installed, forced install `
最终安装验证
安装完成后,打开一个新的终端窗口并执行命令,最终确认 Ada 编译器是否被正确识别。
# 检查 gnat 版本
gnat14 --version
GNAT 14.2.0
Copyright 1996-2024, Free Software Foundation, Inc.
To list Ada build switches use --help-ada
List of available commands
gnat bind gnatbind14
gnat chop gnatchop14
gnat clean gnatclean14
gnat compile gnatmake14 -f -u -c
gnat check gnatcheck14
gnat elim gnatelim14
gnat krunch gnatkr14
gnat link gnatlink14
gnat list gnatls14
gnat make gnatmake14
gnat metric gnatmetric14
gnat name gnatname14
gnat preprocess gnatprep14
gnat pretty gnatpp14
gnat stack gnatstack14
gnat stub gnatstub14
gnat test gnattest14
# 检查 gcc 详细信息
gcc14 -v
Using built-in specs.
COLLECT_GCC=gcc14
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc14/gcc/x86_64-portbld-freebsd14.3/14.2.0/lto-wrapper
Target: x86_64-portbld-freebsd14.3
Configured with: /usr/ports/lang/gcc14/work/gcc-14.2.0/configure --disable-multilib --without-isl --with-build-config=bootstrap-debug --disable-nls --disable-libssp --enable-gnu-indirect-function --enable-host-shared --enable-plugin --libdir=/usr/local/lib/gcc14 --libexecdir=/usr/local/libexec/gcc14 --program-suffix=14 --with-as=/usr/local/bin/as --with-gmp=/usr/local --with-gxx-include-dir=/usr/local/lib/gcc14/include/c++/ --with-gxx-libcxx-include-dir=/usr/include/c++/v1 --with-ld=/usr/local/bin/ld --with-pkgversion='FreeBSD Ports Collection' --with-system-zlib --without-zstd --enable-languages=c,c++,objc,fortran,jit,ada --prefix=/usr/local --localstatedir=/var --mandir=/usr/local/share/man --infodir=/usr/local/share/info/gcc14 --build=x86_64-portbld-freebsd14.3
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 14.2.0 (FreeBSD Ports Collection)
如果在 gcc14 -v 命令输出的 Configured with: 项目中看到了类似 --enable-languages=...ada... 的内容,即表示构建已正确完成。