2011-12-12 32 views
18

Something như thế này:Cách lấy biến CMake từ dòng lệnh?

cmake --get-variable=MY_CMAKE_VARIABLE 

Biến thể tồn tại trong một tập tin CMake bao gồm.

+1

Câu hỏi có một chút không rõ ràng: Bạn có muốn chỉ định giá trị cho một biến trên dòng lệnh không? Hoặc bạn có muốn trích xuất một biến hiện có từ một số CMakeFile và có in cmake ra tiêu chuẩn không? –

Trả lời

15

Nếu bạn có một tập tin bộ nhớ cache hiện tại, bạn có thể làm:

grep MY_CMAKE_VARIABLE CMakeCache.txt 

Nếu bạn chưa có một tập tin bộ nhớ cache và bạn muốn xem những tùy chọn có trong một file CMakeLists.txt, bạn có thể làm (trong một thư mục khác nhau vì điều này sẽ viết một tập tin bộ nhớ cache):

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE 

đó sẽ trở lại với bạn điều gì đó như

<VARIABLE>:<TYPE>=<VALUE> 

Nếu đó là một biến nâng cao, hãy thêm cờ -A vào cùng một lệnh và nó sẽ bao gồm các biến nâng cao. Tất nhiên, nếu bạn chỉ muốn giá trị, bạn có thể làm:

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE | cut -d "=" -f2 

EDIT

Ví dụ, với một CMakeLists.txt đó là:

cmake_minimum_required(VERSION 2.8) 

project(test) 

include(otherFile.txt) 

set(MY_VAR "Testing" CACHE STRING "") 

Và nơi otherFile. txt là:

set(MY_OTHER_VAR "Hi" CACHE STRING "") 

Lệnh (chạy từ thư mục khác):

cmake -L ../cmaketest 

Cung cấp:

-- The C compiler identification is GNU 
-- The CXX compiler identification is GNU 
-- Check for working C compiler: /usr/bin/gcc 
-- Check for working C compiler: /usr/bin/gcc -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Check for working CXX compiler: /usr/bin/c++ 
-- Check for working CXX compiler: /usr/bin/c++ -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/tgallagher/cmaketest-build 
-- Cache values 
CMAKE_BUILD_TYPE:STRING= 
CMAKE_INSTALL_PREFIX:PATH=/usr/local 
MY_OTHER_VAR:STRING=Hi 
MY_VAR:STRING=Testing 

Vì vậy, nó có phải hiển thị các biến từ các tập tin khác. Nó sẽ phân tích cú pháp toàn bộ bản dựng. Vấn đề là mặc dù nó sẽ không hiển thị bất kỳ biến nào không được đánh dấu bằng CACHE. Và nó sẽ không hiển thị bất kỳ được lưu trữ nội bộ, và sẽ chỉ hiển thị ADVANCED nếu -LA được sử dụng thay vì -L.

Nếu các biến của bạn được đánh dấu là NỘI BỘ hoặc không CACHE, thì không có phương pháp nào trong CMake để kéo nó ra. Tuy nhiên, các biến không phải CACHE'd có nghĩa là tạm thời, vì vậy tôi không chắc chắn tại sao bạn cần chúng ngoài môi trường xây dựng.

+0

Không có đề xuất nào trong số này có vẻ phù hợp với các biến được đưa vào từ CMakeFiles khác – Allan

+0

Thêm ví dụ hoạt động bao gồm các tệp cmake khác. Bạn đang cố gắng đạt được điều gì? Có thể có một cách khác, hoặc một cách để thiết lập các biến để bạn có thể sử dụng chúng với cách tiếp cận trên. – tpg2114

-1

-D <var>:<type>=<value>:

Khi cmake là chạy đầu tiên trong một cây build trống rỗng, nó tạo ra một tập tin CMakeCache.txt và populates nó với các thiết lập tùy chỉnh cho dự án. Tùy chọn này có thể được sử dụng để chỉ định cài đặt ưu tiên hơn giá trị mặc định của dự án. Tùy chọn có thể được lặp lại cho nhiều mục nhập bộ nhớ cache như mong muốn.

+1

Đó không phải là những gì OP hỏi –

2

Nếu bạn cần không được lưu trữ biến người dùng nhưng không thể chỉnh sửa tập lệnh cmake gốc, bạn có thể sử dụng mẹo. Tạo tệp CMakeLists.txt mới trong một thư mục khác có nội dung sau:

include(<Path to original CMakeLists.txt>) 

message(STATUS "MY_VAR={${MY_VAR}}") 

Rất có thể, cmake sẽ tạo ra nhiều lỗi khi chạy trong thư mục mới.Đường dẫn tương đối, nếu được sử dụng trong tập lệnh gốc, chắc chắn là nguyên nhân gây ra lỗi như vậy. Nhưng cmake sẽ in giá trị cuối cùng được gán cho biến của bạn. Hơn nữa, lọc tất cả các lỗi và cảnh báo sử dụng bất kỳ bộ xử lý văn bản nổi tiếng (giả UNIX quen thuộc), ví dụ:

cmake . | sed -n 's/-- MY_VAR={\(.*\)}/\1/p' 2>&1 

tôi sử dụng phương pháp này trong kịch bản duy trì dự án, đó là đáng tin cậy miễn là gốc CMakeLists.txt không có lỗi cú pháp.

1

Sử dụng:

cmake -LA -N /path/to/project 

để có được một danh sách của tất cả các giá trị bộ nhớ cache. -N là quan trọng; nó ngăn cản cmake cố gắng tạo bất kỳ tệp xây dựng nào và chỉ cho bạn thấy những gì trong bộ nhớ cache.

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