Problema di makefile con condizionale utilizzato in define utilizzato nella parte comandi di una regola

StackOverflow https://stackoverflow.com/questions/228567

  •  04-07-2019
  •  | 
  •  

Domanda

Ho una sezione di makefile che ha questo tipo di struttura:


bob:
ifdef DEBUG
    @echo running
endif
    @echo chug chug chug
ifdef DEBUG
    @echo done
endif    

bobit:
    @echo "before"
    @make bob
    @echo "after"

Sto semplificando molto qui, tutti gli echi sono in realtà blocchi di comandi non banali e c'è più roba condizionale, ma questo cattura l'essenza del mio problema.

Per motivi tecnici non voglio entrare in questo momento, ho bisogno di sbarazzarmi di quella sottomissione, ma poiché l'eco rappresenta quantità non banali di codice non voglio solo copiare e incollare il corpo di bob in luogo della sottomissione.

Idealmente quello che mi piacerebbe fare è qualcosa del genere


define BOB_BODY 
ifdef DEBUG
    @echo running
endif
    @echo chug chug chug
ifdef DEBUG
    @echo done
endif
endef

bob:
    $(BOB_BODY)

bobit:
    @echo "before"
    $(BOB_BODY)
    @echo "after"

Sfortunatamente i condizionali sembrano stancarmi, producono "ifdef: comando non trovato" errori, ho cercato di aggirare questo problema con varie combinazioni di eval e call, ma non riesco a trovare un modo per farlo funzionare.

Come posso farlo funzionare? ed è anche il modo giusto di affrontare il problema?

È stato utile?

Soluzione

Il modo in cui ho risolto questo problema è usare invece i condizionali bash, il che in realtà ha un certo senso dato che stiamo giocando con i comandi e non creando regole.

Quindi la mia soluzione ideale dall'alto diventa qualcosa di simile


define BOB_BODY
    @if [[ -n "$(DEBUG)" ]]; then \
        echo running; \
    fi;
    @echo chug chug chug
    @if [[ -n "$(DEBUG)" ]]; then \
        echo done; \
    fi
endef

bob: $(BOB_BODY)

bobit: @echo "before" $(BOB_BODY) @echo "after"

Altri suggerimenti

Puoi semplicemente cambiare l'ordine di ifdef / define:

ifdef DEBUG
  define BOB_BODY 
    @echo running
    @echo chug chug chug
    @echo done
  endef
else 
  define BOB_BODY 
    @echo chug chug chug
  endef
endif

Aggiorna

define CHUG
  @echo chug chug chug
endef

ifdef DEBUG
  define BOB_BODY 
    @echo running
    $(CHUG)
    @echo done
  endef
else 
  define BOB_BODY 
    $(CHUG)
  endef
endif
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top