我需要从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
提前致谢!
答案 0 :(得分:4)
运行make src/cp src/mv
后运行configure
应该有效,但coreutils构建系统没有正确设置依赖项。 cp
和mv
依赖于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