需要不时地构建新的tarball或新的xyHub / Lab-repository。它们通常带有一个Makfile或一个Autotools / CMake / XY-Generator提供一个动态。由于维护者很可能使用的是另一个操作系统或分发而不是我目前正在运行的操作系统或分发,因此进入Makefile的假设通常不适合我的文件系统层次结构(lib与lib64,bin与sbin,/ usr / lib vs. / lib等)。由于构建序列中的最后一个命令通常是
sudo make install
将数千个文件移动到正确的位置非常烦人。或者更糟糕的是确定我的发行版中的哪些文件被覆盖。这里GNU使干运行模式非常方便。运行
sudo make -n install
首先,通过打印来自所有活动GNU Make接收的所有命令而不执行它们,我省去了清理文件系统的麻烦。在手写或Autotools生成的Makfile的情况下,这可以按预期工作。如果Makefile包含以下内容:
#PREFIX is environment variable, but if it is not set, then set default value
ifeq ($(PREFIX),)
PREFIX := /usr/local
endif
install: unixlib.a
install -d $(DESTDIR)$(PREFIX)/lib/
install -m 644 unixlib.a $(DESTDIR)$(PREFIX)/lib/
install -d $(DESTDIR)$(PREFIX)/include/
install -m 644 unixlib.h $(DESTDIR)$(PREFIX)/include/
我会看到到底会发生什么。将打印每个带有完整路径信息的install
/ cp
/ mv
命令。如果我在配置步骤中使用安装前缀出错,我可以在那里看到它。如果Makefile中的默认值很奇怪,因为它来自另一个操作系统,我会在那里看到它。
现在,在CMake生成的Makefile的情况下,这是不同的。干
mkdir build && cd build
cmake ..
make
sudo make -n install
只生成以...结尾的输出
...
make -f CMakeFiles/Makefile2 preinstall
/usr/bin/cmake -E cmake_echo_color --switch= --cyan "Install the project..."
/usr/bin/cmake -P cmake_install.cmake
由于这些命令没有执行,只是打印,我没有得到所有cp
/ mv
/ mkdir
/ install
/ etc-命令,我想先看看,然后我让Makefile触摸文件系统。
有没有办法从CMake生成的Makefile中获取将从安装目标执行的命令列表,就像手写或Autotools生成的那样?
有没有办法获取将从安装目标执行的命令列表。
实际上,安装过程的核心部分包含在文件cmake_install.cmake
(在构建目录中创建)中。使用cmake -P
可执行文件的cmake流程将此文件作为CMake脚本处理。
脚本cmake_install.cmake
使用install
命令执行文件安装。脚本使用的install
命令的语义不同于documentation中描述的语义:在内部,CMake使用命令的一些未记录的功能。
但是,理解cmake_install.cmake
脚本并不是很难理解并从中推断出路径。