2009-11-19 24 views
21

Tôi đang cố gắng để thiết lập một cái gì đó nhiều dự án đi gói nhưgói đa dụ makefile cho đi

./main.go

./subpackage1/sub1_1.go

./subpackage1/ sub1_2.go

./subpackage2/sub2_1.go

./subpackage2/sub2_2.go

nơi main.go nhập cả subpackage1 và subpackage2. Và subpackage2 nhập subpackage1.

Tôi đã tìm kiếm các ví dụ về makefile nhưng tôi không thể tìm thấy bất kỳ thứ gì hỗ trợ loại thiết lập này. Bất kỳ ý tưởng?

Trả lời

7

Something như thế này nên làm việc

# Makefile 
include $(GOROOT)/src/Make.$(GOARCH) 
all:main 
main:main.$O 
    $(LD) -Lsubpackage1/_obj -Lsubpackage2/_obj -o [email protected] $^ 
%.$O:%.go subpackage1 subpackage2 
    $(GC) -Isubpackage1/_obj -Isubpackage2/_obj -o [email protected] $^ 
subpackage1: 
    $(MAKE) -C subpackage1 
subpackage2: 
    $(MAKE) -C subpackage2 
.PHONY:subpackage1 subpackage2 

# subpackage1/Makefile 
TARG=subpackage1 
GOFILES=sub1_1.go sub1_2.go 
include $(GOROOT)/src/Make.$(GOARCH) 
include $(GOROOT)/src/Make.pkg 

# subpackage2/Makefile 
TARG=subpackage2 
GOFILES=sub2_1.go sub2_2.go 
include $(GOROOT)/src/Make.$(GOARCH) 
include $(GOROOT)/src/Make.pkg 
GC+=-I../subpackage1/_obj 
LD+=-L../subpackage1/_obj 
sub2_1.$O sub2_2.$O:subpackage1 
subpackage1: 
    $(MAKE) -C ../subpackage1 
.PHONY:subpackage1 

Nếu bạn không cài đặt các gói con bạn cần phải rõ ràng thiết lập bao gồm đường dẫn. Makefkg được cung cấp là chủ yếu để xây dựng các gói, đó là lý do tại sao nó chỉ được bao gồm trong makefile gói phụ.

+1

'$ (GOROOT)/src/Make. $ (GOARCH)' là cách cũ để thực hiện và không hoạt động nữa. – thejoshwolfe

17

Install godag sau đó chạy:

gd -o myapp

Nó sẽ tự động xây dựng một mạch hở đồ thị có hướng (DAG) của tất cả các phụ thuộc trong thư mục src/ của bạn, sau đó biên dịch và liên kết từng gói theo thứ tự đúng.

Dễ dàng hơn nhiều so với việc duy trì Makefile theo cách thủ công, đặc biệt vì $ (GOROOT) /src/Make.* đã thay đổi trong các phiên bản Go gần đây (không còn là Make. $ (GOARCH)). Cũng hữu ích:

gd clean xóa tệp đối tượng.

gd -test chạy thử nghiệm tự động của bạn (xem gói thử nghiệm).

gd -dot=myapp.dot tạo biểu đồ nhập gói hàng của bạn, bạn có thể trực quan hóa bằng GraphViz.

+1

Tôi cũng không tìm được cách nào để xây dựng nhiều gói hơn là sử dụng các công cụ xây dựng như 'gd'. –

+0

Không phải kể từ ghc - tôi có thấy một quá trình biên dịch đơn giản như vậy không. – Eli

4

Khám phá https://github.com/banthar/Go-SDL là dự án đa gói được duy trì tích cực sử dụng Makefiles.

Tôi nhận thấy một số câu trả lời này sử dụng lỗi Make.$(GOARCH) bao gồm. Vì vậy, hy vọng rằng các liên kết trên sẽ được stabler hơn cố gắng để ở trên đầu trang của Google thay đổi API trong một câu trả lời ở đây.

+0

Um, nó không giữ phụ thuộc, và sử dụng đệ quy thực hiện, mà sẽ không thực sự làm việc cho dự án lớn (mặc dù không có dự án lớn được viết trong đi nhưng AFAIK). –

+0

Đúng về phụ thuộc.Recursive Tạo vẻ ngoài với tôi như cách duy nhất để sử dụng Make.cmd hoặc Make.pkg của go. Cho đến nay tôi đang có may mắn bằng cách sử dụng đệ quy Thực hiện trong một dự án của riêng tôi, mặc dù nó vẫn còn khá trẻ. Tôi làm quản lý phụ thuộc theo cách thủ công. – thejoshwolfe

+0

làm đệ quy là cách duy nhất để sử dụng Làm cho các gói xây dựng đa gói, và trên thực tế nó được đề xuất bởi tài liệu. Tuy nhiên đó là một cách khủng khiếp để làm điều đó, không hiệu quả và có vấn đề. Làm cho chính nó bị hỏng, tôi nghĩ rằng nên đi kèm 'gd' như là một cách tiêu chuẩn để thực hiện các dự án đi. Nó thực sự cần thiết để có nó như là một phần của ngôn ngữ. –

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