C语言 在 Linux coreutils 包中编译特定的源文件



我需要从Linux coreutils源文件中编译特定版本的cp(copy)和mv(move)实用程序。而不是编译整个包:

./configure
make

这需要很长时间,我怎么能只编译cp(./src/cp.c)和mv(./src/mv.c)?

我试图删除不相关的 c 文件,但 cp.c 和 mv.c 有太多的依赖项需要跟踪......我意识到这是简化我的问题的愚蠢方法。必须有一个单行或一些东西告诉 make 或 gcc 只编译 cp 和 mv!

要使用的示例源代码:http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz

提前感谢!

运行configure后运行make src/cp src/mv应该可以工作,但 coreutils 构建系统没有正确设置依赖项。 cpmv依赖于生成的源文件,而生成文件未跟踪这些文件。但是,您需要生成的文件是在默认make all的开头创建的,因此您可以开始完整构建,并在它通过GEN行后立即杀死它:

$ ./configure
...
$ make
  GEN    lib/alloca.h
  GEN    lib/c++defs.h
  ...
  GEN    src/version.c
  GEN    src/version.h
make  all-recursive
make[1]: Entering directory `/home/andrew/coreutils-8.21'
Making all in po
make[2]: Entering directory `/home/andrew/coreutils-8.21/po'
make[2]: Leaving directory `/home/andrew/coreutils-8.21/po'
Making all in .
make[2]: Entering directory `/home/andrew/coreutils-8.21'
  CC     lib/set-mode-acl.o
  CC     lib/copy-acl.o
^C
make[2]: *** wait: No child processes.  Stop.
make[2]: *** Waiting for unfinished jobs....
make[2]: *** wait: No child processes.  Stop.
make[1]: *** wait: No child processes.  Stop.
make[1]: *** Waiting for unfinished jobs....
make[1]: *** wait: No child processes.  Stop.
make: *** wait: No child processes.  Stop.
make: *** Waiting for unfinished jobs....
make: *** wait: No child processes.  Stop.

然后运行make src/cp src/mv来构建所需的程序:

$ make src/cp src/mv
  CC     src/cp.o
  CC     src/copy.o
  CC     src/cp-hash.o
  CC     src/extent-scan.o
  CC     src/version.o
  AR     src/libver.a
  CC     lib/argmatch.o
  CC     lib/argv-iter.o
  CC     lib/backupfile.o
  ... 230 other files ...
  CC     lib/vasprintf.o
  CC     lib/vfprintf.o
  CC     lib/vprintf.o
  AR     lib/libcoreutils.a
  CCLD   src/cp
  CC     src/mv.o
  CC     src/remove.o
  CCLD   src/mv
$ src/cp --version
cp (GNU coreutils) 8.21
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Torbjörn Granlund, David MacKenzie, and Jim Meyering.

您需要深入研究在 ./configure 之后创建的 make 文件。尝试找出与源构建过程相关的 make 命令。

我相信禁用您不想要或不需要的功能(例如对母语支持的支持),只包含绝对必要的模块(例如 gnulib),然后构建整个项目仍然是获得所需内容的最快、最简单的方法。

coreutils只需要很短的时间就可以编译。请注意,它很好地支持并行编译,因此请添加-j $(nproc)选项。

最大的时间部分是由于配置,这是强制性的。

因此,coreutils最初使用BUILT_SOURCES生成构建中所需的一些源。自动制作手册说

"you cannot use BUILT_SOURCES if the ability to run ‘make foo’ on a clean tree is important to you."

鉴于构建的时间相对较短,并且从干净的树部分构建的不寻常用例,Coreutils 项目避免手动指定所有依赖项,而是如上所述使用BUILT_SOURCES

最新更新