在Linux coreutils软件包中编译特定的源文件

7

我需要从Linux coreutils源文件中编译特定版本的cp(复制)和mv(移动)实用程序。而不是使用以下命令编译整个软件包:

./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。谢谢!

cp.c和mv.c有太多的依赖关系,那么你如何只编译cp(./src/cp.c)和mv(./src/mv.c)呢? - Jayesh Bhoi
我本意只想编译最小/必要的文件,以生成cp和mv。 - yy502
好的,那是正确的,但你必须编译相关的文件。还需要从makefile中禁用不需要的构建。 - Jayesh Bhoi
4个回答

8

运行configure后再运行make src/cp src/mv应该可以工作,但是coreutils构建系统的依赖关系设置不正确。 cpmv依赖于未被Makefile跟踪的生成源文件。但是需要的生成文件在默认的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.

1
哇!非常感谢您提供的解决方案,为我节省了大量时间! - yy502

0

编译coreutils只需要很短的时间。 请注意它支持并行编译,因此在make命令中添加-j $(nproc)选项。

最耗时的部分是必须的configure。

因此,coreutils使用BUILT_SOURCES来最初生成构建所需的一些源代码。 automake手册指出

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

考虑到构建的相对短时间以及从干净的代码库进行部分构建的不寻常用例,coreutils项目避免手动指定所有依赖项,而是像上面描述的那样使用BUILT_SOURCES。

谢谢你的见解。下次我一定会尝试并行编译! :-) - yy502

0
你需要深入研究一下在./configure之后生成的make文件。试着找出与你的源代码构建过程相关的make命令。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接