CMake: In ra tất cả các biến có thể truy cập trong tập lệnh


222

Tôi tự hỏi liệu có cách nào để in ra tất cả các biến có thể truy cập trong CMake. Tôi không quan tâm đến các biến CMake - như trong --help-variablestùy chọn. Tôi đang nói về các biến của tôi mà tôi đã xác định hoặc các biến được xác định bởi các tập lệnh được bao gồm.

Tôi hiện đang bao gồm:

INCLUDE (${CMAKE_ROOT}/Modules/CMakeBackwardCompatibilityCXX.cmake)

Và tôi đã hy vọng rằng tôi có thể in ra tất cả các biến ở đây, thay vì phải xem qua tất cả các tệp và đọc những gì có sẵn - tôi có thể tìm thấy một số biến tôi không biết có thể hữu ích. Nó sẽ là tốt để hỗ trợ học tập và khám phá. Nó là nghiêm ngặt để gỡ lỗi / phát triển.

Điều này tương tự với câu hỏi trong In tất cả các biến cục bộ có thể truy cập phạm vi hiện tại trong Lua , nhưng đối với CMake!

Có ai đã làm điều này?

Câu trả lời:


368

Sử dụng get_cmake_propertyhàm, vòng lặp sau sẽ in ra tất cả các biến CMake được xác định và các giá trị của chúng:

get_cmake_property(_variableNames VARIABLES)
list (SORT _variableNames)
foreach (_variableName ${_variableNames})
    message(STATUS "${_variableName}=${${_variableName}}")
endforeach()

Điều này cũng có thể được nhúng trong một hàm tiện lợi, có thể tùy ý sử dụng biểu thức chính quy để chỉ in một tập hợp con các biến có tên phù hợp

function(dump_cmake_variables)
    get_cmake_property(_variableNames VARIABLES)
    list (SORT _variableNames)
    foreach (_variableName ${_variableNames})
        if (ARGV0)
            unset(MATCHED)
            string(REGEX MATCH ${ARGV0} MATCHED ${_variableName})
            if (NOT MATCHED)
                continue()
            endif()
        endif()
        message(STATUS "${_variableName}=${${_variableName}}")
    endforeach()
endfunction()

Để in các biến môi trường, sử dụng chế độ lệnh của CMake :

execute_process(COMMAND "${CMAKE_COMMAND}" "-E" "environment")

Đó là một đoạn rất hữu ích. Tại sao nó không in ra các biến ENV mà tôi đặt trên dòng lệnh?
IgorGanapolsky

2
@Geremia bạn có thể sao chép khối mã này vào tệp myfile.txt và chạy: cmake -P myfile.txt
Idok

2
VARIABLESchỉ liệt kê "các biến được định nghĩa trong thư mục hiện tại." cmake.org/cmake/help/latest/prop_dir/ từ
CivilFan

1
Tôi đã phải loại bỏ STATUSkhỏi messagelệnh để đầu ra được hiển thị.
luator

Không làm việc cho tôi. tất cả những gì tôi nhận được là các biến bắt đầu bằng CMAKE_ *
C Johnson

173

Một cách khác là sử dụng đơn giản:

cmake -LAH

Từ trang hướng dẫn :

-L[A][H]

Liệt kê các biến lưu trữ không nâng cao.

Liệt kê các biến bộ đệm sẽ chạy CMake và liệt kê tất cả các biến từ bộ đệm CMake không được đánh dấu là INTERNALhoặc ADVANCED. Điều này sẽ hiển thị hiệu quả các cài đặt CMake hiện tại [...].

Nếu Ađược chỉ định, thì nó cũng sẽ hiển thị các biến nâng cao.

Nếu Hđược chỉ định, nó cũng sẽ hiển thị trợ giúp cho từng biến.


4
Làm điều này trên thư mục xây dựng của bạn
jtsagata

5
Lưu ý rằng phương pháp này KHÔNG in các biến hệ thống (WIN32, UNIX, APPLE, v.v.).
holocronweaver

4
Điều này không in ra tất cả các thư viện có sẵn, chỉ có những thư viện được lưu trữ.
rafalcieslak

2
Điều này không in ra tất cả các biến, chỉ có các biến được lưu trữ. (FTFY rafa)
Qwertie

9

ccmakelà một tùy chọn tương tác tốt để kiểm tra tương tác các biến được lưu trong bộ nhớ cache ( option(hoặc set( CACHE:

sudo apt-get install cmake-curses-gui
mkdir build
cd build
cmake ..
ccmake ..


3
Công cụ hữu ích :) Tuy nhiên, các câu hỏi yêu cầu in ra tất cả các biến .. nhưng điều này sẽ chỉ tiết lộ các biến được lưu trong bộ nhớ cache.
OLL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.