2013-04-18 20 views
27

Đối với một số kiểm tra nội bộ, tôi muốn tiền tố cài đặt mặc định cho thư mục con của thư mục xây dựng, trừ khi người dùng ghi đè rõ ràng. Tôi biết người dùng có thể chỉ định một tiền tố cài đặt bằng cách:Đặt tiền tố cài đặt tự động vào đường dẫn tùy chỉnh nếu không được chỉ định rõ ràng trên dòng lệnh

$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar .. 

Nhưng nếu người dùng không không định này, nên mặc định, ví dụ ${PWD}/installed.

Biến CMAKE_INSTALL_PREFIX đã được đặt thành /usr/local, vì vậy tôi không thể chỉ kiểm tra xem nó chưa được đặt/trống trước khi đặt.

giải pháp hiện tại của tôi là thêm một công tắc tùy chỉnh mà người dùng phải gọi để xác định rằng biến CMAKE_INSTALL_PREFIX được tôn trọng:

option(ENABLE_INSTALL_PREFIX "Install build targets to system (path given by '-DCMAKE_INSTALL_PREFIX' or '${CMAKE_INSTALL_PREFIX}' if not specified)." OFF) 
if (ENABLE_INSTALL_PREFIX) 
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root") 
else() 
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root" FORCE) 
endif() 

Câu hỏi của tôi là:

(a) Có bất kỳ vấn đề với những điều trên, vượt quá sự bực mình của lá cờ phụ cần được chuyển đến CMake để có được CMAKE_INSTALL_PREFIX để có hiệu lực?

(b) Có cách nào tốt hơn, sạch hơn, mạnh mẽ hơn, thành ngữ và/hoặc ít phiền toái hơn để đạt được điều này không?

Cảm ơn.

Trả lời

45

CMake đặt biến boolean CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT nếu CMAKE_INSTALL_PREFIX chưa được chỉ định rõ ràng và được khởi tạo thành cài đặt mặc định. Bạn có thể ghi đè lên theo cách sau:

if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) 
    set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/installed" CACHE PATH "default install path" FORCE) 
endif() 
+0

Hoàn hảo! Cảm ơn! – Jeet

+0

Tôi ước gì tôi tìm thấy bài đăng này một vài ngày trước trong khi tôi đã kéo tóc ra cố gắng để có được nhiều phụ thuộc ExternalProject để làm điều đúng. Cảm ơn! – KarateSnowMachine

2

Một vài năm trước, tôi muốn thử điều tương tự. Thật không may tôi không bao giờ có thể tìm thấy một giải pháp hoàn toàn thỏa đáng. Thay vào đó, tôi đã chọn sử dụng regex để kiểm tra xem CMAKE_INSTALL_PREFIX có khớp với mặc định hay không.

Ví dụ: trên cửa sổ tôi sử dụng sau đây để tạo ra các install dir trong việc xây dựng thư mục:

if (CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files") 
    # Override to an "Install" directory in the current build-dir 
    message(STATUS " Install-prefix was at default -> forcing it to the build-dir") 
    message(STATUS "  'set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install)'") 
    set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install) 
endif (CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files") 

Vấn đề lớn nhất với cấu trúc này là bạn có thể xác định bằng tay mà CMake nên cài đặt vào C:\Program Files. Khi tôi phân phối công cụ của mình với trình cài đặt NSIS, đây không phải là vấn đề (đối với tôi).

Có lẽ bạn có thể thử một cái gì đó tương tự trên Unix.

+0

Trên Unix sẽ sử dụng '" ^/usr/local "' trong kết hợp; hoặc, thậm chí tốt hơn, 'STREQUAL"/usr/local "' thay vì đối sánh cụm từ thông dụng. – thiagowfx

Các vấn đề liên quan