如何与.gpr 项目文件和gprbuild 交叉编译?
How to cross-compile with .gpr project file and gprbuild?
我正在尝试从 Linux (Fedora 29) 交叉编译一个以 Windows 作为目标的 Ada 程序。我对编译一无所知,Gnat project manager doc 帮不了我这个菜鸟。
我更愿意在项目文件中使用开关并使命令尽可能简单。我该怎么办?
我试过 gprbuild -P logfilter.gpr --target=Windows
结果是
Error: no compiler found for language 'c', target = Windows, default runtime
Error: no compiler found for language 'ada', target = Windows, default runtime
logfilter.gpr:3:09: warning: no compiler specified for language "Ada", ignoring all its sources
logfilter.gpr:7:19: "log_filter_main.adb" is not a source of project "logfilter"
gprbuild: problems with main sources
这是我的 gprconfig
:
prconfig has found the following compilers on your PATH.
Only those matching the target and the selected compilers are displayed.
1. GNAT for Ada in /usr/bin/ version 8.3 (default runtime)
2. GCC-ASM for Asm in /usr/bin/ version 8.3.1
3. GCC-ASM for Asm2 in /usr/bin/ version 8.3.1
4. GCC-ASM for Asm_Cpp in /usr/bin/ version 8.3.1
5. LLVM for C in /usr/bin/ version 7.0.1
6. GCC for C in /usr/bin/ version 8.3.1
7. G++ for C++ in /usr/bin/ version 8.3.1
和我的 gprconfig --show-targets
:
List of targets supported by a compiler:
x86_64-redhat-linux
x86_64-unknown-linux-gnu
这是我的 file.gpr
:
with "../../lib/gnat/gtkada";
project LogFilter is
for Source_Dirs use ("src");
for Object_Dir use "obj";
for Exec_Dir use "exec";
for Main use ("log_filter_main.adb");
package Builder is
for Executable ("main.adb") use "Logs_Filter";
end Builder;
package Compiler is
for Switches ("ada") use ("-gnat2012");
end Compiler;
end Logfilter;
有一次我用 Fedora 24 做了这个。但这需要构建一个交叉编译器。我还有一个docker image
我在 fedora 上填写了一个请求,要求在交叉编译器的 windows 中包含 ada,但他们关闭了它。但是,我找不到错误编号。
如果您对此新版本或使用说明感兴趣,请告诉我。
更新:我为 FC29 重建了 cross。你可以这样试试:
dnf copr enable reznik/ada
dnf install mingw64-gcc-gnat
dnf install gprbuild
sed -i -e 's/-pc-mingw/-w64-mingw/g' /usr/share/gprconfig/*
cat > hello.adb << EOF
with Ada.Text_IO;
procedure Hello is
begin
Ada.Text_IO.Put_Line ("Hello");
end Hello;
EOF
cat > hello.gpr << EOF
project Hello is
for Main use ("hello.adb");
end Hello;
EOF
gprbuild --target=x86_64-w64-mingw32 -P hello.gpr
file hello.exe
hello.exe: PE32+ executable (console) x86-64, for MS Windows
PS: link to copr
正如其他人所指出的,您遇到的问题是因为您没有使用 cross compiler。
只是为了澄清一些关于 gprbuild
的事情,这可能会使这一点更清楚:gprbuild
只是您系统上 gcc
和 gnat
版本的前端。本质上它只是 make
的 Ada 特有的类似物。它处理项目配置文件并确定要构建项目的哪些部分。从 gprconfig
输出看来,您正在使用从 Fedora 存储库获得的 FSF GNAT。 gprconfig --show-targets
仅向您显示 $PATH
.
中的本机 Linux 编译器的 targets
要解决您的问题,您需要找到针对 Windows 的 Ada 编译器。 AdaCore 提供了一个相当不错的本机 Windows 编译器,如果您愿意的话。
我正在尝试从 Linux (Fedora 29) 交叉编译一个以 Windows 作为目标的 Ada 程序。我对编译一无所知,Gnat project manager doc 帮不了我这个菜鸟。 我更愿意在项目文件中使用开关并使命令尽可能简单。我该怎么办?
我试过 gprbuild -P logfilter.gpr --target=Windows
结果是
Error: no compiler found for language 'c', target = Windows, default runtime
Error: no compiler found for language 'ada', target = Windows, default runtime
logfilter.gpr:3:09: warning: no compiler specified for language "Ada", ignoring all its sources
logfilter.gpr:7:19: "log_filter_main.adb" is not a source of project "logfilter"
gprbuild: problems with main sources
这是我的 gprconfig
:
prconfig has found the following compilers on your PATH.
Only those matching the target and the selected compilers are displayed.
1. GNAT for Ada in /usr/bin/ version 8.3 (default runtime)
2. GCC-ASM for Asm in /usr/bin/ version 8.3.1
3. GCC-ASM for Asm2 in /usr/bin/ version 8.3.1
4. GCC-ASM for Asm_Cpp in /usr/bin/ version 8.3.1
5. LLVM for C in /usr/bin/ version 7.0.1
6. GCC for C in /usr/bin/ version 8.3.1
7. G++ for C++ in /usr/bin/ version 8.3.1
和我的 gprconfig --show-targets
:
List of targets supported by a compiler:
x86_64-redhat-linux
x86_64-unknown-linux-gnu
这是我的 file.gpr
:
with "../../lib/gnat/gtkada";
project LogFilter is
for Source_Dirs use ("src");
for Object_Dir use "obj";
for Exec_Dir use "exec";
for Main use ("log_filter_main.adb");
package Builder is
for Executable ("main.adb") use "Logs_Filter";
end Builder;
package Compiler is
for Switches ("ada") use ("-gnat2012");
end Compiler;
end Logfilter;
有一次我用 Fedora 24 做了这个。但这需要构建一个交叉编译器。我还有一个docker image
我在 fedora 上填写了一个请求,要求在交叉编译器的 windows 中包含 ada,但他们关闭了它。但是,我找不到错误编号。
如果您对此新版本或使用说明感兴趣,请告诉我。
更新:我为 FC29 重建了 cross。你可以这样试试:
dnf copr enable reznik/ada
dnf install mingw64-gcc-gnat
dnf install gprbuild
sed -i -e 's/-pc-mingw/-w64-mingw/g' /usr/share/gprconfig/*
cat > hello.adb << EOF
with Ada.Text_IO;
procedure Hello is
begin
Ada.Text_IO.Put_Line ("Hello");
end Hello;
EOF
cat > hello.gpr << EOF
project Hello is
for Main use ("hello.adb");
end Hello;
EOF
gprbuild --target=x86_64-w64-mingw32 -P hello.gpr
file hello.exe
hello.exe: PE32+ executable (console) x86-64, for MS Windows
PS: link to copr
正如其他人所指出的,您遇到的问题是因为您没有使用 cross compiler。
只是为了澄清一些关于 gprbuild
的事情,这可能会使这一点更清楚:gprbuild
只是您系统上 gcc
和 gnat
版本的前端。本质上它只是 make
的 Ada 特有的类似物。它处理项目配置文件并确定要构建项目的哪些部分。从 gprconfig
输出看来,您正在使用从 Fedora 存储库获得的 FSF GNAT。 gprconfig --show-targets
仅向您显示 $PATH
.
要解决您的问题,您需要找到针对 Windows 的 Ada 编译器。 AdaCore 提供了一个相当不错的本机 Windows 编译器,如果您愿意的话。