请问rake到底是如何调用gcc来编译c代码的?

问题描述 投票:0回答:1

我试图了解“cmock”/“unity”在幕后是如何工作的。这两者都使用 ruby rake 构建工具。有没有一种简单的方法来显示/记录构建期间 rake 调用的所有 shell 命令及其选项?我希望看到其他一堆(或类似的):

gcc a.c -o a.o -Wall -g -I"some/path"
gcc b.c -o b.o -Wall -g -I"some/path"

编辑:
这个问题的一些背景:我(还)不明白 rake 和 cmock 是如何工作的。所以我想:如果我可以在构建提供的示例时记录 rake 如何调用其他程序(主要是编译器),那将会有很大的帮助。这样我就可以一步一步地看到过程,而无需了解太多有关 reke/cmock 的知识。 (我尝试过 -t 选项,但它不显示 shell 命令)。

c rake cmock
1个回答
0
投票

这里有两个基本问题。

Rake 并不能真正让你轻松配置编译器,也不能轻易让你看到它在幕后所做的“魔法”。

我处于同样的境地,并找到了这两个问题的答案。您可能只关心可见性问题,但我认为其他人会想要下一步(“现在我看到它在做什么,我该如何更改它?”)所以我将把它们都添加。

首先要容易得多。 Rake 执行了一堆构建命令,您可以通过添加“--trace”来查看它们,例如:

rake --trace compile

但是,在许多情况下,您可能会发现 rake 被要求构建 Makefile 并使用“make”或“gmake”或其他一些变体,您最终会在跟踪输出中看到:

/bin/gmake install target_prefix=

gmake 正在运行一些 Makefile,可能在某些路径中,如“tmp/x86_64-linux/libxml_ruby/3.2.2”或任何与您正在使用的系统、库和版本相匹配的路径。

Makefile是由rake扩展任务生成的,通常它只使用'gcc'和'g++',根本没有路径,如果你安装了多个gcc并且想要指定它,这将是一场噩梦。

如果您的 rake 任务确实调用了 gmake 或 make 之类的东西,那么您可以通过首先设置环境变量来查看that正在调用哪些命令:

bash/sh:   export MAKE='gmake V=1'
tcsh/csh:  setenv MAKE 'gmake V=1'

但更重要的是,如果你想指定编译器的实际路径,事情就会变得混乱。如果您查看包含 Makefile 的同一个 (tmp/..) 目录,您将看到它(如果它是由 rake Extensiontask 构建的)将有一个名为“.rake-compiler-siteconf.rb”的隐藏文件(这是在 Unix 上,我不完全确定 Windows 路径是什么)。

在该文件内部,您可以添加一些补丁,实际上,我通过在周围的行之后添加行到“lib/rake/extensiontask.rb”来更新我的 rake 编译器库:

siteconf.puts "require 'mkmf'"

(然后重建 rake 编译器),但这将更改使用该 gem 扩展任务的 any rake 的 CC/CXX 设置。

另一个选项是将其直接添加到您尝试编译的库的“.rake-compiler-siteconf.rb”中,并尝试再次进行 rake 构建/编译。

线条看起来像:

RbConfig::MAKEFILE_CONFIG['CC'] = '/my/path/to/gcc'
RbConfig::MAKEFILE_CONFIG['CXX'] = '/my/path/to/c++/or/gcc/or/g++/or/whatever'
RbConfig::MAKEFILE_CONFIG['LDSHAREDXX'] = '/my/path/to/gcc/or/ld'
$DLDFLAGS.qsub!('-Wl,--example-of-removing-flags-from-default-ld-flags')
© www.soinside.com 2019 - 2024. All rights reserved.