2012-03-22 37 views
14

Tôi đang mã hóa một dự án C++ trong vim.chạy lệnh shell (ctags) trong cmake và tạo

Tôi muốn chạy lệnh ctags (ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .) để tạo tham chiếu khi tôi chạy.

Tôi nghĩ rằng cách để làm điều đó là sử dụng add_custom_command nhưng tôi bị lẫn lộn về cách tích hợp nó vào CMakeLists.txt.

+0

Tôi không thử nghiệm các câu trả lời này nữa. ctags mất thời gian trên i5 điện cực thấp của tôi vì vậy tôi chỉ cần gọi nó từ vim một lần trong một thời gian. –

Trả lời

15

Cách cơ bản nhất để làm điều này là:

set_source_files_properties(tags PROPERTIES GENERATED true) 
add_custom_command (OUTPUT tags 
    COMMAND ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . 
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) 
add_executable (MyProjectOutput tags) 

Dòng đầu tiên kể CMake rằng tags sẽ được tạo ra. add_custom_commandCMake sẽ tạo ra tags khi cần và cuối cùng, một số mục tiêu cần phải phụ thuộc vào tags. Thư mục làm việc mặc định nằm trong cây xây dựng, do đó, WORKING_DIRECTORY phải được đặt thành cây nguồn của bạn. Đây là tương đương với một mục Makefile:

tags: 
    ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . 

MyProjectOutput: tags 
    # Whatever here... 
+0

chỉ để đảm bảo, 'CMAKE_SOURCE_DIR' được chỉ định theo mặc định. Tôi không cần phải xác định nó. đúng? –

+1

Có, 'CMAKE_SOURCE_DIR' được đặt tự động vào thư mục nguồn _current_ (có thể là thư mục con, nếu bạn đang đệ quy thêm tệp nguồn). 'CMAKE_SOURCE_DIR' thường là thư mục chứa tập tin' CMakeLists.txt'. –

+0

CMAKE_SOURCE_DIR là đường dẫn đến cấp cao nhất của cây nguồn. – camino

7

giải pháp mới:

Tôi nghĩ CMake thay đổi kể từ khi câu trả lời trước đã được đưa ra.
Dưới đây là những dòng tôi thêm vào trong CMakeLists.txt của tôi (thử nghiệm với phiên bản 2.8.12):

# Add "tags" target and make my_project depending on this target. 
set_source_files_properties(tags PROPERTIES GENERATED true) 
add_custom_target(tags 
    COMMAND ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . 
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) 
add_dependencies(my_project tags) 

Và nó hoạt động hoàn hảo bây giờ!

+1

Xin chào Creak, điều này đã bị gắn cờ không phải là câu trả lời. Điều này có giải quyết được vấn đề của bạn hay bạn đang đặt câu hỏi. Nếu giải quyết vấn đề, bạn có thể chỉnh sửa bài đăng của mình và làm rõ để những người khác không vô tình gắn cờ bài đăng đó không? Nếu đặt câu hỏi, bạn có thể xóa câu hỏi này và xem [hỏi] để biết thêm chi tiết không? Hy vọng điều này sẽ giúp và may mắn! :) – jmort253

+1

@ jmort253: Xin lỗi, tôi đã không đọc bài viết của bạn một cách chính xác. Tôi không có ý tưởng về cách hoàn tác gắn cờ (Bạn đã mắc lỗi và bạn không muốn thu hút sự chú ý của người kiểm duyệt nữa ...). – user2284570

+1

@ jmort253: Tôi đã thay đổi nhận xét của mình, đó chắc chắn là câu trả lời ** và ** không phải là câu hỏi **. – Creak

8

câu trả lời của Daniel và lung lay đã bị tôi bắt đầu, nhưng tôi đã kết thúc với một giải pháp phức tạp hơn mà tôi nghĩ rằng tôi muốn chia sẻ:

# Add a top-level "tags" target which includes all files in both 
# the build and source versions of src/*. 
set_source_files_properties(tags PROPERTIES GENERATED true) 
add_custom_target(tags 
    COMMAND ctags -R --c++-kinds=+p --fields=+iaS --extra=+q 
     ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} 
    COMMAND ln -sf ${CMAKE_CURRENT_BINARY_DIR}/tags ${CMAKE_BINARY_DIR} 
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 

# ...but only make it a dependency of the project if the ctags program 
# is available, else it will fail to build on Windows. 
find_program(CTAGS_PATH ctags) 
if(CTAGS_PATH) 
    message(STATUS "Found ctags: ${CTAGS_PATH}") 
    add_dependencies(MyProjecct tags) 
endif(CTAGS_PATH) 

Nó làm một vài điều mà các giải pháp đơn giản hơn không:

  1. Chỉ thêm "thẻ" làm phụ thuộc của sản phẩm xây dựng chính (MyProject) nếu thực sự có chương trình ctags trên hệ thống. Chúng tôi không muốn phá vỡ xây dựng chỉ vì đây là Windows, hoặc bởi vì ctags chỉ đơn giản là chưa được cài đặt trên hệ thống xây dựng.

  2. Nó trích xuất các biểu tượng từ tệp nguồn trong cả thư mục xây dựng và nguồn. Điều này quan trọng trong một vài trường hợp.

    Trước tiên, bạn có thể đang sử dụng configure_file() và đến từ nền Tự động, vì vậy bạn đã đặt tên tệp nguồn thực sự là *.in, có nghĩa là ctags -R sẽ không quét chúng. Bạn cần nó để quét các phiên bản được tạo ra trong thư mục xây dựng. Ví dụ: bạn có thể có src/mainheader.h.in trong cây nguồn của mình, với số phiên bản dự án tự động được nhúng vào nó dưới dạng build/src/mainheader.h.

    Thứ hai, một số tệp "nguồn" của bạn có thể được tạo bởi các công cụ khác. Trong dự án hiện tại của tôi, tôi có một vài tệp tiêu đề C++ được tạo bởi các tập lệnh Perl. Tôi muốn các biểu tượng từ cả hai tiêu đề được tạo ra các tập lệnh Perl trong tệp thẻ.

  3. Nó hoạt động trong thư mục phụ.Trong dự án tôi đang làm việc ngay bây giờ, sản phẩm xây dựng chính được tạo từ src/* liên quan đến gốc của dự án và tôi chỉ muốn các biểu tượng từ cây con đó trong tệp thẻ. Tôi không muốn nó bao gồm các biểu tượng từ các bài kiểm tra đơn vị, các ví dụ, hoặc các kịch bản tiện ích.

    Vì nó được thiết kế để chạy trong thư mục con, nó tạo liên kết tượng trưng đến tệp src/tags ở đầu thư mục xây dựng, để vi -t TagName hoạt động. (Tôi giả định ở đây rằng nếu có ctags, ln cũng vậy.)

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