2009-08-07 33 views
5

Tôi muốn sử dụng make để có được một xây dựng mô-đun kết hợp với continuous integration, tự động kiểm tra đơn vịđa nền tảng xây dựng. Các thiết lập tương tự là phổ biến trong Java và .NET, nhưng tôi đang gặp khó khăn khi kết hợp với nhau để tạo và C/C++. Làm thế nào nó có thể đạt được?Perfect makefile

yêu cầu của tôi:

  • nhanh xây dựng; không đệ quy làm (Stack Overflow câu hỏi What is your experience with non-recursive make?)
  • hệ thống mô-đun (có nghĩa là, phụ thuộc tối thiểu, makefile trong thư mục con với các thành phần)
  • đa nền (thường là máy tính để thử nghiệm đơn vị, mục tiêu nhúng cho hệ thống tích hợp/phát hành)
  • hoàn thành kiểm tra
  • khả năng thực hiện các bài kiểm tra (tự động) đơn vị (kỹ thuật Agile)
  • móc vào hệ thống tích hợp liên tục
  • dễ sử dụng
  • phụ thuộc

Tôi đã bắt đầu với non-rec make. Tôi vẫn thấy đây là một nơi tuyệt vời để bắt đầu.

Hạn chế cho đến nay:

  • không lồng ghép các đơn vị kiểm tra
  • không tương thích của cửa sổ trình biên dịch ARM dựa với đường dẫn Cygwin
  • không tương thích của makefile với Windows \ đường dẫn
  • về phía trước cách phụ thuộc

Cấu trúc của tôi trông giống như:

project_root 
     /algorithm 
       /src 
        /algo1.c 
        /algo2.c 
       /unit_test 
        /algo1_test.c 
        /algo2_test.c 
       /out 
        algo1_test.exe 
        algo1_test.xml 
        algo2_test.exe 
        algo2_test.xml 
      headers.h 
     /embunit 
     /harnass 
    makefile 
    Rules.top 

Tôi muốn giữ mọi thứ đơn giản; ở đây các bài kiểm tra đơn vị (algo1_test.exe) phụ thuộc vào cả thành phần 'thuật toán' (ok) và khung kiểm thử đơn vị (có thể hoặc không thể biết tại thời điểm xây dựng này). Tuy nhiên, việc di chuyển các quy tắc xây dựng lên đầu sẽ không hấp dẫn tôi vì điều này sẽ phân phối kiến ​​thức địa phương về các thành phần trong toàn hệ thống.

Đối với đường dẫn Cygwin: Tôi đang làm việc để tạo bản dựng bằng cách sử dụng các đường dẫn tương đối. Điều này giải quyết các vấn đề /cygdrive/c (như trình biên dịch thường có thể xử lý/đường dẫn) mà không cần đưa vào C: (mà làm cho không thích). Bất kỳ ý tưởng nào khác?

+0

Lưu ý rằng bạn có thể sử dụng '/' làm dấu phân tách đường dẫn trong Windows thường tốt. Gần như tất cả các hàm API sử dụng các đường dẫn trong suốt đều dịch chúng sang '\'. – Joey

+0

Thật vậy. Tuy nhiên, đó là ký tự ổ đĩa gây ra vấn đề. Làm cho không xử lý: tốt (vì nó định nghĩa một mục tiêu). Và/cygdrive/c/không được các ứng dụng windows nhận ra. Nếu tôi dịch/cygdrive/c thành c:/thì tệp phụ thuộc được tạo bởi trình biên dịch sẽ không được công nhận bởi makefile. – Adriaan

Trả lời

3

CMake cùng với các công cụ liên quan CTest và CDash dường như trả lời các yêu cầu của bạn. Đáng cho nó một cái nhìn.

Bill Hoffman (A dẫn nhà phát triển CMake) đề cập đến giấy Recursive Make Considered Harmful trong một post tại mailing list CMake:

...vì cmake đang tạo ra các makefiles cho bạn, nên tránh được nhiều nhược điểm của việc đệ quy, ví dụ bạn không cần phải gỡ lỗi các makefiles hoặc thậm chí nghĩ về cách chúng hoạt động. Có những ví dụ khác là của những thứ trong giấy đó mà sửa lỗi cho bạn.

Xem thêm this answer cho "Đệ quy - bạn bè hoặc kẻ thù?" ở đây trên stackoverflow.

- Recursive Make - friend or foe?

+0

Cảm ơn; Tôi sẽ cung cấp cho sự kết hợp này một cái nhìn xa hơn. 1 cho nỗ lực của bạn. – Adriaan

+0

Nó không phải là câu trả lời tôi đang tìm kiếm, nhưng tôi vẫn chấp nhận nó vì nó thực sự có thể tốt hơn để tránh vấn đề hơn là giải quyết nó trong các tập tin. – Adriaan

0

Ok đây là những gì tôi làm:

tôi sử dụng một Makefile ở thư mục gốc và mẫu đại diện để thu thập tất cả tập tin trong một thư mục. Lưu ý rằng tôi giả sử rằng foo/*. C sẽ tạo thành foo.so chẳng hạn. Điều này làm cho việc duy trì Makefile tối thiểu, vì chỉ cần thêm một tệp vào thư mục sẽ tự động thêm nó vào bản dựng.

Vì nó làm cho bạn đang sử dụng tôi giả sử (tôi làm điều đó cho các dự án của tôi) rằng trình biên dịch được sử dụng sử dụng cú pháp dòng lệnh tương thích gcc (cc). Vì vậy, MSC đã hết hàng; nhưng đừng thất vọng, tôi làm hầu hết sự phát triển của tôi (không may) trên Windows và sử dụng MinGW với MSys; hoạt động như một sự quyến rũ. Tạo các tệp nhị phân gốc, nhưng được xây dựng bằng môi trường xây dựng tương thích Posix.

Kiểm tra phụ thuộc được thực hiện bằng công tắc có phần tiêu chuẩn -MD. Sau đó tôi bao gồm tất cả các tệp * .d vào Makefile. Tôi xây dựng các mẫu từ các tệp nguồn được thu thập tự động.

Cuối cùng kiểm tra đơn vị được triển khai với mục tiêu "tiêu chuẩn" check. Mục tiêu kiểm tra giống như tất cả các mục tiêu, ngoại trừ nó phụ thuộc vào việc kiểm thử đơn vị và thực hiện rằng khi mọi thứ được xây dựng. Tôi làm theo cách này để bạn có thể xây dựng dự án hoặc xây dựng các bài kiểm tra đơn vị (và phần còn lại của dự án) tách biệt. Khi tôi không phát triển dự án tôi muốn xây dựng nó và được thực hiện với nó.

Dưới đây là một ví dụ về cách tôi làm điều đó: https://github.com/rioki/c9y/blob/master/Makefile Nó cũng có các mục tiêu install, uninstalldist.

Như bạn có thể thấy mọi thứ được thực hiện đơn giản, không có cuộc gọi thực hiện đệ quy nào và tất cả đều tương đối đơn giản. Tôi đã sử dụng automake và autoconf và tôi sẽ không bao giờ làm điều đó nữa; cũng các công cụ xây dựng khác không có trong câu hỏi, nếu tôi cần cài đặt foojam hoặc barmake để xây dựng một thứ gì đó, tôi thường bỏ qua dự án đó ngay lập tức.