关于布鲁斯·亚当斯(Bruce Adams)的答案:
您的答案会造成危险的混乱。DESTDIR用于在根目录树之外进行安装。如果没有指定DESTDIR,它可以让人们看到在根树中将安装什么。PREFIX是实际安装所基于的基本目录。
例如,PREFIX = / usr / local表示软件包的最终目的地是/ usr / local。使用DESTDIR = $ HOME将安装文件,就好像$ HOME是根(/)。如果说DESTDIR是/ tmp / destdir,则可以看到“ make install”会产生什么影响。本着这种精神,DESTDIR 绝不应该影响已构建的对象。
一个makefile段来解释它:
install:
cp program $DESTDIR$PREFIX/bin/program
程序必须假定PREFIX是最终(即生产)目录的基本目录。将DESTDIR = /某物中安装的程序进行符号链接的可能性仅表示该程序不访问基于PREFIX的文件,因为它根本无法工作。cat(1)是一个程序(以最简单的形式)可以在任何地方运行。这是一个不会的示例:
prog.pseudo.in:
open("@prefix@/share/prog.db")
...
prog:
sed -e "s/@prefix@/$PREFIX/" prog.pseudo.in > prog.pseudo
compile prog.pseudo
install:
cp prog $DESTDIR$PREFIX/bin/prog
cp prog.db $DESTDIR$PREFIX/share/prog.db
如果您尝试从$ PREFIX / bin / prog之外的其他地方运行prog,则将找不到prog.db,因为它不在其预期的位置。
最后,/ etc / alternatives确实无法通过这种方式工作。在根目录树中有指向安装的程序的符号链接(例如vi-> / usr / bin / nvi,vi-> / usr / bin / vim等)。
CMakeLists.txt
以便您可以设置它而忘记它。我并不是说没有即时更改安装目录的常见用例-显然是根据投票数来判断的-我对CMake还是很陌生,并且在出现此问题时感到好奇。