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

时间:2014-02-25 05:02:44

标签: c linux gcc compilation makefile

我需要从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

提前致谢!

4 个答案:

答案 0 :(得分:4)

运行make src/cp src/mv后运行configure应该有效,但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 :(得分:0)

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

答案 2 :(得分:0)

我相信禁用您不想要或不需要的功能(例如支持本地语言支持),只包含绝对必要的模块(例如gnulib),然后构建整个项目仍然是最快捷,最简单的方法得到你需要的东西。

答案 3 :(得分:0)

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

最大的时间部分是配置必须的。

因此,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