在 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...

CCCXX 环境变量分别设置为 gccg++

export CC=gcc
export CXX=g++

第 3 步:修改 Port 文件

进入 lang/gcc14 Port 目录,修改相关文件以确保 Ada 相关文件被包含在软件包中。

cd /usr/ports/lang/gcc14

请参考以下 diff 内容,修改 Makefilepkg-descrpkg-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 reinstallpkg 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... 的内容,即表示构建已正确完成。