在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取决于生成的源文件,而不是由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. 

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

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

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