2017-08-23 3 views
1

J'écris une bibliothèque (dynamique) en C++ et j'ai un ensemble de tests pour cela. Actuellement, je travaille sur un makefile (cible par défaut) qui peut soit construire la bibliothèque, soit compiler et exécuter les tests (cible test). La différence entière est dans un couple d'indicateurs de liens et si un seul fichier .cpp (contenant main) est inclus, mais je ne peux pas obtenir la cible test pour construire correctement, car la liste des dépendances n'est pas mise à jour pour une raison quelconque. est ici l'ensemble makefile:Ajout de fichiers source et mise à jour des dépendances dans les fichiers makefiles

CXX = g++ 
RM=rm -f 

EXTRA_CCFLAGS = -Wall -Wextra -Wcast-qual -Wfloat-equal -Wpedantic -Wpointer-arith -Wshadow 
CXXOPTFLAGS  = -O2 
CXXFLAGS  = -std=c++11 $(EXTRA_CCFLAGS) $(CXXOPTFLAGS) 

LDLIBS=-larmadillo 
MAKELIBFLAGS=-current_version 0.1 -compatibility_version 0.1 -dynamiclib 

TARGET = libadsp.dylib 
TESTTARGET = dsptest 
SOURCE_FILES=src/stft.cpp src/filters.cpp src/windows.cpp src/helpers.cpp 
OBJECT_FILES=$(subst .cpp,.o,$(SOURCE_FILES)) 

all: $(TARGET) 

test: SOURCE_FILES += tests/tests.cpp 
test: OBJECT_FILES = $(subst .cpp,.o,$(SOURCE_FILES)) 
test: $(TESTTARGET) 

$(TARGET): $(OBJECT_FILES) 
    $(CXX) $(CXXFLAGS) $(MAKELIBFLAGS) -o $(TARGET) $(OBJECT_FILES) $(LDLIBS) 

$(TESTTARGET): $(OBJECT_FILES) 
    $(CXX) $(CXXFLAGS) -o $(TESTTARGET) $(OBJECT_FILES) $(LDLIBS) 
    ./dsptest 

depend: .depend 

.depend: $(SOURCE_FILES) 
    $(RM) ./.depend 
    $(CXX) $(CXXFLAGS) -MM $^>>./.depend; 

.PHONY: clean 

clean: 
    $(RM) $(OBJECT_FILES) 
    $(RM) ./.depend 

include .depend 
+0

Typiquement 'make' est utilisé pour _make_ things, pas pour exécuter des choses (je ne suis pas fan des effets secondaires de make). Cela étant dit, vous voulez être en mesure de faire votre test ou votre construction régulière. Une note: vous reconstruisez toujours votre fichier '.depend', quoi qu'il arrive. Si c'était un gros projet, cela tuerait votre temps de construction. Il est préférable d'avoir un répertoire d'objets spécifique à la cible, puis de générer des fichiers .d pour chaque source au fur et à mesure que vous les compilez. Ce lien: http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/] a une bonne description. – blackghost

Répondre

2

Vous ne pouvez pas utiliser des valeurs variables spécifiques à la cible dans les listes préalables. Le manuel GNU make est very clear à ce sujet:

L'autre exception est des valeurs variables spécifiques à la cible. Cette fonctionnalité vous permet de définir différentes valeurs pour la même variable, en fonction de la cible que la construction est en train de construire. Comme pour les variables automatiques, ces valeurs ne sont disponibles que dans le contexte de la recette d'une cible (et dans d'autres affectations spécifiques à la cible).

(soulignement ajouté). Vous pouvez ajouter la cible de test spécifiquement:

$(TESTTARGET): $(OBJECT_FILES) tests/tests.o 
     $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDLIBS) 
     ./dsptest 

PS. Je ne recommande pas d'utiliser $(subst ...) pour remplacer les extensions; utilisez $(patsubst ...) à la place.

+0

Juste pour clarifier, cette solution nécessite que OBJECT_FILES soit encore modifié en tant que variable spécifique à la cible. (Et je serais en faveur de changer cela, par souci de clarté.) – Beta

+0

Vous avez raison, c'était mon mauvais. Correction d'utiliser des variables automatiques qui est plus correct de toute façon: avec ceci vous pouvez éviter de rendre OBJECT_FILES une variable spécifique à la cible. – MadScientist