Về câu trả lời của Bruce Adams:
Câu trả lời của bạn tạo ra sự nhầm lẫn nguy hiểm. DESTDIR được thiết kế để cài đặt ra khỏi cây gốc. Nó cho phép người ta thấy những gì sẽ được cài đặt trong cây gốc nếu người ta không chỉ định DESTDIR. PREFIX là thư mục cơ sở mà cài đặt thực sự dựa trên.
Ví dụ: PREFIX = / usr / local chỉ ra rằng đích cuối cùng của gói là / usr / local. Sử dụng DESTDIR = $ HOME sẽ cài đặt các tệp như thể $ HOME là gốc (/). Nếu, giả sử DESTDIR, là / tmp / Destdir, người ta có thể thấy những gì 'thực hiện cài đặt' sẽ ảnh hưởng. Theo tinh thần đó, DESTDIR không bao giờ nên ảnh hưởng đến các đối tượng được xây dựng.
Một phân đoạn makefile để giải thích nó:
install:
cp program $DESTDIR$PREFIX/bin/program
Các chương trình phải cho rằng PREFIX là thư mục cơ sở của thư mục cuối cùng (nghĩa là sản xuất). Khả năng liên kết chương trình được cài đặt trong DESTDIR = / một cái gì đó chỉ có nghĩa là chương trình không truy cập các tệp dựa trên PREFIX vì đơn giản là nó không hoạt động. cat (1) là một chương trình (ở dạng đơn giản nhất) có thể chạy từ bất cứ đâu. Đây là một ví dụ sẽ không:
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
Nếu bạn đã cố chạy prog từ nơi khác ngoài $ PREFIX / bin / prog, prog.db sẽ không bao giờ được tìm thấy vì nó không nằm trong vị trí dự kiến của nó.
Cuối cùng, / etc / thay thế thực sự không hoạt động theo cách này. Có các liên kết đến các chương trình được cài đặt trong cây gốc (ví dụ vi -> / usr / bin / nvi, vi -> / usr / bin / vim, v.v.).
CMakeLists.txt
để bạn có thể đặt và quên nó. Tôi không nói rằng không có trường hợp sử dụng phổ biến nào để thay đổi thư mục cài đặt một cách nhanh chóng - rõ ràng có sự đánh giá qua số phiếu bầu - Tôi chỉ khá mới đối với CMake và tò mò khi vấn đề này xuất hiện.