2010-02-05 10 views
9

Gần đây tôi đã quyết định tổ chức các tệp trong thư mục dự án của mình. Tôi đã chuyển các trình phân tích cú pháp mà tôi đã có cho một vài loại tệp khác nhau vào thư mục riêng của chúng và cũng quyết định sử dụng ocamlbuild (vì dự án trở nên phức tạp hơn và kịch bản lệnh shell đơn giản không còn đủ nữa). Tôi đã có thể bao gồm thành công các dự án bên ngoài bằng cách sửa đổi myocamlbuild với một số quy tắc cơ bản (gọi ocaml_lib, tôi sẽ sử dụng ocamlfind một số thời gian khác), nhưng tôi bị mắc kẹt về cách đưa thư mục làm mô-đun vào dự án đúng cách . Tôi tạo ra một tập tin parser.mlpack và điền nó với các mô-đun thích hợp để được bao gồm (ví dụ, "phân tích cú pháp/Ngày", et cetera), đã viết một parser.mli trong thư mục gốc của thư mục để thực hiện của họ, và sửa đổi các tập tin _tags (xem bên dưới) .Việc biên dịch đúng mô-đun trong các thư mục con (ocamlbuild)

Trong quá trình biên dịch, thư mục trình phân tích cú pháp được duyệt ngang một cách chính xác và parser.cmi, parser.mli.depends đều được tạo trong thư mục _build; cũng như tất cả các tệp *.cm[xio] trong thư mục con của trình phân tích cú pháp.

Tôi cảm thấy mình có thể đang làm điều gì đó dư thừa, nhưng bất kể dự án vẫn là không thể tìm thấy mô-đun Parser khi biên dịch!

Cảm ơn!

_tags

debug : true 
<*.ml> : annot 
"parser" : include 
<parser/*.cmx>: for-pack(Parser) 
<curlIO.*> : use_curl 
<mySQL.*> : use_mysql 
<**/*.native> or <**/*.byte> : use_str,use_unix,use_curl,use_mysql 

lỗi biên dịch

/usr/local/bin/ocamlopt.opt unix.cmxa str.cmxa -g -I /usr/local/lib/ocaml/site-lib/mysql mysql.cmxa -I /usr/local/lib/ocaml/curl curl.cmxa curlIO.cmx utilities.cmx date.cmx fraction.cmx logger.cmx mySQL.cmx data.cmx project.cmx -o project.native 
File "\_none\_", line 1, characters 0-1: 
Error: **No implementations provided for the following modules:** 
     Parser referenced from project.cmx 
Command exited with code 2. 

Bạn sẽ nhận thấy -I parser không được bao gồm trong các giai đoạn liên kết ở trên; thực sự không có tệp liên quan đến trình phân tích cú pháp nào được bao gồm!

chỉnh sửa: Đã thêm chi tiết mới từ nhận xét và câu trả lời bên dưới.

Trả lời

3

Tôi tự hỏi liệu parser.mli có bằng cách nào đó can thiệp vào các phụ thuộc trong việc xử lý tệp mlpack hay không. parser.cmi sẽ được tạo từ hoạt động đóng gói khi parser.mlpack được xử lý và biên dịch. Thử xây dựng với tệp parser.mli đã bị xóa. Nếu nó hoạt động, thì điều này có thể được tái xử lý thành một câu trả lời thực sự.

Ngoài ra, bạn không cần parser/ như một tiền tố để module của bạn trong parser.mlpack nếu parser.mlpack là trong thư mục parser và bạn có thẻ include thiết lập. Nhưng điều đó không tạo nên sự khác biệt cho điều này.

Cập nhật: điều này làm việc xung quanh vấn đề, nhưng không phải là nguyên nhân gốc rễ. Nguyên nhân gốc, theo nhận xét bên dưới, là một tệp được đề cập trong số .mlpack đã được di chuyển.

+0

Có, tính năng này hoạt động nhưng không có hậu quả dự định. Một mô-đun đại diện cho nội dung của thư mục không được tạo; chúng được tham chiếu trực tiếp bởi các mô-đun con. Đối số '-pack' được thêm vào các mô-đun thích hợp trong quá trình biên dịch. Nhưng không được sử dụng trong sản phẩm cuối cùng. Giải thích của tôi về -pack có đúng không? – nlucaroni

+0

'-pack' sẽ tạo mô-đun chứa các mô-đun khác làm mô-đun con. Mã khác của bạn sau đó phải gọi chúng là các mô-đun con của chúng (ví dụ: 'Parser.ConfParser'); nếu nó liên quan đến chúng trực tiếp (chỉ là 'ConfParser' mà không có' mở'ing 'Parser' đầu tiên), thì mọi thứ sẽ bị rối tung lên. Bạn có thể đăng đầu ra '-verbose' khi bạn không có' parser.mli' không? –

+1

Tôi đã thêm lại tệp parser.mli. Tôi nghĩ rằng vì lý do nào đó một lỗi trong khi biên soạn các gói không phá vỡ nơi nó nên. ** Có một mô-đun bổ sung trong tệp 'mlpack' của tôi mà tôi đã di chuyển **. – nlucaroni

4

Bạn cần phải "bao gồm" thư mục trình phân tích cú pháp trong đường dẫn tìm kiếm. Bạn có thể làm điều này trong _tags:

"parser": include 

Sau đó ocamlbuild có thể tìm kiếm các thư mục phân tích cú pháp cho các tập tin thú vị.

+1

Tất nhiên phải là -> "trình phân tích cú pháp": bao gồm – ygrek

+0

@ygrek cảm ơn - đã cập nhật. –

+0

... Tôi đã sửa đổi câu hỏi của mình ở trên. Điều này đã giúp, nhưng tôi đã thực sự đã làm điều này, nhưng từ sự tương đương trên dòng lệnh với '-I parser'. Bây giờ, tôi chỉ xây dựng với dự án 'ocamlbuild. ' – nlucaroni