2017-08-03 1 views
-1

J'essaie d'utiliser la même valeur pour toutes les tâches, mais les variables évaluent pour chaque tâche. Comment l'éviter?Comment évaluer une fois une variable conditionnelle makefile?

Version: GNU Make 4.1

contenu Makefile:

SHELL = /bin/bash -ex 
BUILD_TIMESTAMP ?= $(shell date '+%Y%m%d%H%M%S') 
VERSION ?= 1.2-${BUILD_TIMESTAMP} 

t1: 
    echo ${VERSION} 
    sleep 1 

t2: 
    echo ${VERSION} 
    sleep 1 

Sortie:

$ make t1 t2 
date +%Y%m%d%H%M%S 
echo 1.2-20170803143838 
+ echo 1.2-20170803143838 
1.2-20170803143838 
sleep 1 
+ sleep 1 
+ date +%Y%m%d%H%M%S 
echo 1.2-20170803143839 
+ echo 1.2-20170803143839 
1.2-20170803143839 
sleep 1 
+ sleep 1 

Répondre

2

Le ?= dans GNU make est équivalente à une = qui est fait uniquement lorsque la variable était indéfini auparavant. Comme peut peut savoir, = définit une variable récursivement développée, c'est-à-dire, sa valeur n'est développée que lorsque la variable elle-même est développée. Ce que vous voulez à la place est une variable simplement développée, son contenu n'est développé qu'une seule fois et lui est assigné directement. Pour plus d'informations sur la différence, voir The Two Flavors of Variables. Vous obtenez une variable simplement étendue en l'affectant avec :=.

Vous avez deux options pour résoudre votre problème immédiat:

  1. Faire BUILD_TIMESTAMP une variables simplement élargi par le réaffectant:

    BUILD_TIMESTAMP ?= $(shell date '+%Y%m%d%H%M%S') 
    BUILD_TIMESTAMP := ${BUILD_TIMESTAMP} 
    
    VERSION ?= 1.2-${BUILD_TIMESTAMP} 
    
  2. Est-ce que la logique d'attribuer uniquement lorsque la variable était indéfini:

    ifeq ($(origin BUILD_TIMESTAMP), undefined) 
    BUILD_TIMESTAMP := $(shell date '+%Y%m%d%H%M%S') 
    endif 
    
    VERSION ?= 1.2-${BUILD_TIMESTAMP} 
    
1

Il suffit d'ajouter les déclarations suivantes à votre code après correspondant ?= missions:

BUILD_TIMESTAMP := $(BUILD_TIMESTAMP) 
VERSION := $(VERSION)