2009-11-19 5 views
21

che sto cercando di impostare un multi progetto Go pacchetto qualcosa comepacchetto multi esempio makefile per andare

./main.go

./subpackage1/sub1_1.go

./subpackage1/ sub1_2.go

./subpackage2/sub2_1.go

./subpackage2/sub2_2.go

dove main.go importa sia subpackage1 che subpackage2. E il subpackage2 importa il subpackage1.

Ive ha cercato in giro per fare esempi di makefile ma non riesco a trovare nulla che supporti questo tipo di set-up. Qualche idea?

risposta

7

Qualcosa del genere dovrebbe funzionare

# 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 

Se non si installano i pacchetti secondari è necessario impostare in modo esplicito il percorso di inclusione. Il makefile fornito da Make.pkg è principalmente quello di creare pacchetti, motivo per cui è incluso solo nel makefile del pacchetto secondario.

+1

'$ (GOROOT)/src/Make. $ (GOARCH)' è il vecchio modo per farlo e non funziona più. – thejoshwolfe

17

Installare godag quindi eseguire:

gd -o myapp

Si costruirà automaticamente un Aciclica grafo diretto (DAG) di tutte le dipendenze nella directory src/, quindi compilare e collegare ciascun pacchetto nel giusto ordine.

Molto più semplice del mantenimento manuale di un Makefile, soprattutto poiché $ (GOROOT) /src/Make.* è cambiato nelle versioni recenti di Go (non esiste più un Make. $ (GOARCH)). Utile anche:

gd clean rimuove i file oggetto.

gd -test esegue i test automatici (vedere il pacchetto di test).

gd -dot=myapp.dot genera un grafico dell'importazione del pacchetto che è possibile visualizzare utilizzando GraphViz.

+1

Anche io non ho trovato un modo più sicuro per creare pacchetti multipli rispetto all'utilizzo di strumenti di costruzione come 'gd'. –

+0

Da quando ghc --make ho visto un processo di compilazione così semplice. – Eli

4

Check out https://github.com/banthar/Go-SDL che è un progetto multi-pacchetto go mantenuto attivamente utilizzando Makefile.

Ho notato che alcune di queste risposte utilizzano l'obsoleto Make.$(GOARCH) include. Quindi spero che il link sopra sia più stabile di cercare di rimanere in cima alle API mutevoli di Google in una risposta qui.

+0

Uhm, non mantiene le dipendenze e usa la marca ricorsiva, che non funzionerebbe davvero per progetti di grandi dimensioni (sebbene non sia stato scritto un progetto di grandi dimensioni in AFAIK). –

+0

Vero sulle dipendenze.Recursive Make mi sembra l'unico modo di usare go's Make.cmd o Make.pkg. Finora ho avuto fortuna ad usare il Make ricorsivo in un mio progetto, anche se è ancora piuttosto giovane. Faccio manualmente la gestione delle dipendenze. La marca ricorsiva – thejoshwolfe

+0

è l'unico modo sensato di utilizzare Crea per build multi-pacchetto, ed infatti è raccomandato dalla documentazione. Tuttavia è un modo orribile per farlo, inefficiente e problematico. Fare se stesso è rotto, penso che dovrebbe includere 'gd' come un modo standard per realizzare progetti. È davvero essenziale averlo come parte della lingua. –