8

Tôi đang làm việc trên một dự án lớn C++, nhắm mục tiêu nhiều nền tảng với một số cấu hình cho mỗi nền tảng.Visual Studio: biên dịch danh sách các mô-đun trên mỗi nền tảng và cấu hình

Do thời gian biên dịch dài, hãy xây dựng toàn bộ dự án trên mọi nền tảng để kiểm tra nếu một thay đổi biên dịch thành công, không phải là một tùy chọn.

Điều tôi thường làm là biên dịch các mô-đun cpp đơn lẻ mà tôi đã sửa đổi trên kết hợp nền tảng/cấu hình khác nhau. Tôi muốn tự động hóa quy trình này, hoặc sử dụng tập lệnh, phần mở rộng VS, bất cứ điều gì, tôi mở để đánh giá các tùy chọn khác nhau.

Điều tôi cần chính xác là lấy danh sách tệp cpp và biên dịch từng tệp, cho mỗi nền tảng và mỗi cấu hình (về cơ bản lặp qua tất cả kết hợp trình quản lý cấu hình).

Điều này có khả thi không? bất kỳ đề xuất tốt về cách tiếp cận vấn đề?


EDIT:

Tôi biết rằng đây là cách xa là một giải pháp hoàn hảo, và sẽ phát chỉ là một tập hợp con của lỗi. Tôi sẽ vẫn phải đối mặt với lỗi liên kết, lỗi trình biên dịch trên các đơn vị cpp khác phụ thuộc vào tiêu đề đã sửa đổi, v.v ..

Tôi cũng không có cơ hội sửa đổi hệ thống xây dựng hiện tại hoặc tạo dự án .

Tôi chủ yếu quan tâm đến giải pháp địa phương, để giảm số lượng vấn đề có thể xảy ra và phải đối mặt với quy trình xây dựng thời gian lớn.


EDIT2

Chúng tôi có một hệ thống xây dựng. Điều này đã được coi là một tối ưu hóa hệ thống trước khi xây dựng, cho công việc cá nhân của tôi.

Lý do:

Kích hoạt công việc hệ thống xây dựng yêu cầu thời gian. Nó sẽ là bước cuối cùng, nhưng thay vì dành hàng giờ chờ đợi, và có thể khám phá sau đó rằng một trình biên dịch đã cho trên một nền tảng nhất định cho một cấu hình cụ thể sẽ gây ra lỗi, nó sẽ hiệu quả hơn nhiều để dự đoán những phát hiện đó càng nhiều càng tốt.

hiện thủ công việc:

  1. mở mỗi file cpp tôi sửa đổi
  2. Biên dịch mỗi file cpp như một đơn vị duy nhất (. Không xây dựng dự án Mở VS dựng-> Compile)
  3. Thay đổi Platform và/hoặc cấu hình và làm lại 2 điểm một lần nữa.

Đây là quy trình thủ công mà tôi muốn tối ưu hóa.

+0

Bạn có đang sử dụng các công cụ Tích hợp nội dung để tự động tạo khi thực hiện thay đổi mã không? – 1201ProgramAlarm

+0

Không. Có một quá trình xây dựng phức tạp, nhưng điều này không liên quan đến câu hỏi của tôi. Những gì tôi cần là để biên dịch các đơn vị duy nhất. – Heisenbug

+0

Tò mò cờ "quá rộng". Câu hỏi khá cụ thể. – Heisenbug

Trả lời

3

tôi sẽ đề nghị bạn nên "đơn giản là" viết một kịch bản để làm điều này (sử dụng Python ví dụ, đó là rất mạnh mẽ cho các loại hình này)

Bạn có thể:

  • Phân tích các. tập tin sln để trích xuất danh sách cấu hình, nền tảng (mục nhập GlobalSection(SolutionConfigurationPlatforms)) và các dự án (Project mục nhập)
  • Nếu cần, bạn có thể phân tích mọi dự án để tìm danh sách tệp nguồn (dễ dàng hơn phân tích cú pháp tệp .sln, vcxproj) đang ở dạng xml). Tìm kiếm các nútxml để trích xuất danh sách tệp .cpp.
  • Sau đó, bạn có thể xác định các dự án cần một số tác phẩm được biên dịch lại (nhận được danh sách các tập tin được sửa đổi như tham số kịch bản đầu vào hoặc dựa trên dấu thời gian kiểm tra)

Cuối cùng, để xây dựng lại, bạn có hai lựa chọn:

  • Call "msbuild" để biên dịch lại toàn bộ dự án (vcxproj) (ví dụ msbuild project.vcxproj /p:Configuration=Debug;TargetFrameworkVersion=v3.5)
  • Bạn cũng có thể biên dịch lại một tập tin duy nhất (cl simple.cpp). Để làm như vậy, bạn cần biết các tùy chọn xây dựng cl là gì để đảm bảo bạn biên dịch tệp chính xác theo cách tương tự như Visual Studio. Nếu trước đó bạn đã xây dựng một giải pháp đầy đủ (nó có thể là một rquirement cho kịch bản của bạn để làm việc), sau đó bạn sẽ có thể tìm thấy rằng từ Visual Studio bản ghi (trong thư mục đích). Trong các giải pháp của tôi, tôi có thể tìm mọi dự án (tệp vcxproj) nhật ký xây dựng cho mỗi cấu hình (trong %OUTPUT_DIR%\lib\%libname%\%libname%.dir\%configuration%\%libname%.tlog\CL.command.1.tlog), tệp này báo cáo chính xác các đối số cl được sử dụng để biên dịch mọi tệp của dự án. Sau đó, bạn có thể tự gọi lệnh cl và điều này sẽ kết thúc biên dịch lại tệp giống như cách Visual Studio sẽ làm điều đó.

Ngoài ra, bạn có thể thêm dự án trong giải pháp Visual Studio có thể kích hoạt tập lệnh này làm lệnh tùy chỉnh.

Tập lệnh như vậy sẽ có thể xác định dự án nào cần được xây dựng lại và xây dựng lại chúng.

+0

Cảm ơn câu trả lời. Tôi đã kiểm tra tài liệu của msbuild. Vấn đề của tôi là, tôi không thể kích hoạt một bản dựng đầy đủ cho mọi nền tảng (điều này chủ yếu là điểm của câu hỏi) vì thời gian xây dựng dài. Tôi buộc phải biên dịch các đơn vị cpp đơn, và có như bạn có thể tưởng tượng tôi muốn tránh để trích xuất tất cả các tham số cl. – Heisenbug

+0

@Heisenbug Bạn nên đề cập đến các số liệu về giải pháp của mình. Có bao nhiêu dự án? Có bao nhiêu tệp cho mỗi dự án? Về cơ bản, nếu bạn có hàng trăm dự án, chỉ xây dựng một vài dự án thay vì toàn bộ giải pháp sẽ tiết kiệm ít thời gian hơn là chỉ xây dựng một vài tệp nhưng có thể không phải là giải pháp tồi. – jpo38

+0

Ngoài ra, bạn có cơ hội tạo giải pháp của mình thông qua CMake không? – jpo38

2

Đây là yêu cầu chung rất, nó không bao giờ được giải quyết theo cách này. Những gì bạn đang đề xuất không phải là hoàn toàn không thể, nhưng nó chắc chắn là rất đau đớn để thực hiện. Bạn đang xem những gì sẽ xảy ra khi bạn sửa đổi tệp .h, có thể buộc một loạt các tệp .cpp được biên dịch lại. Và bạn không xem xét lỗi liên kết. Trong khi bạn sẽ có một phát hiện tại các tệp .cpp, việc phát hiện ra #include phụ thuộc tệp là rất khó chịu. Bạn không thể lấy chúng từ dự án hoặc tạo tệp. Biên dịch với/showIncludes và phân tích cú pháp các tập tin dấu vết xây dựng là những gì nó cần. Không có gì ngoài giá cả.

Đừng làm điều này, bạn sẽ hối tiếc. Sử dụng giải pháp mà mọi người sử dụng: bạn cần một máy chủ xây dựng. Tốt hơn là với tính năng tích hợp liên tục để máy chủ khởi động bản dựng cho tất cả các nền tảng đích ngay khi bạn đăng ký thay đổi mã. Nhiều người lựa chọn, this Q+A nói về nó.

+0

Tôi hoàn toàn nhận thức được rằng đó không phải là một giải pháp hoàn hảo. Tôi sẽ không nhận được lỗi liên kết và lỗi trong các đơn vị cpp khác nhau bao gồm các tiêu đề đã sửa đổi và vv .. Tuy nhiên, điều này khá hữu ích để nhanh chóng tìm thấy một số lỗi phổ biến: 1) sự khác biệt giữa các trình biên dịch ví dụ. đã ký và so sánh các lỗi so sánh/cảnh báo trên các trình biên dịch khác nhau 2) các dòng mã bị loại trừ bằng cách biên dịch bằng tiền xử lý macro và vân vân. – Heisenbug

+0

Nghe có vẻ như bạn nghĩ rằng một máy chủ xây dựng không thể làm điều này. Hay là bằng cách nào đó nó hút được việc này. Điều đó không chính xác. Khó thuyết phục ai đó khi họ bị nhốt trong một giải pháp, tôi đã bắn nó. –

+0

Tôi không thể sửa đổi cơ chế xây dựng cũng như cài đặt máy chủ xây dựng. Nó không phải là tôi không muốn, hoặc không xem xét nó. Nó chỉ đơn giản là một cái gì đó ngoài tầm kiểm soát của tôi. – Heisenbug

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