2017-10-13 5 views
0

J'ai ajouté des sources au fichier makefile inclus pour un projet. Comme c'est le cas actuellement, cela fonctionne parfaitement. Mais si je les deux lignes décommenter indiquées dans le code, faire l'erreur recrache suivante:Y at-il une limite à la taille d'une variable dans un fichier makefile?

make: *** No rule to make target 'engine/obj/graphics/window.o', needed by 'lib/engine.a'. Stop. 

Je suppose, car il est juste couper le début de son quelque chose à la longueur. Si c'est une limitation de la longueur de la variable, y a-t-il un moyen de contourner le problème?

CXX = g++ 
CXXFLAGS = -std=c++11 -g -Wall -Wextra 

OUT_DIR=out 
LIB_OUT_DIR=lib 
APP_NAME=main 
ENGINE_NAME=engine.a 
EXECUTABLE=$(OUT_DIR)/$(APP_NAME) 
ENGINE_LIB=$(LIB_OUT_DIR)/$(ENGINE_NAME) 

ENGINE_OBJECT_DIR=engine/obj 
ENGINE_HEADER_DIR=engine/include 
ENGINE_SOURCE_DIR=engine/src 
ENGINE_SHADER_DIR=engine/shaders 
APP_OBJECT_DIR=app/obj 
APP_SOURCE_DIR=app/src 

ENGINE_OBJECTS = $(ENGINE_OBJECT_DIR)/graphics/window.o 
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/shader_program.o 
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/array.o 
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/attribute_definition.o 
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/abstract/buffer.o 
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/simple_buffer.o 
# ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/instance_buffer.o 
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/index_buffer.o 
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/math/vec2.o 
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/math/vec3.o 
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/math/vec4.o 
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/math/mat4.o 
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/util/logging.o 

ENGINE_SOURCES = $(ENGINE_SOURCE_DIR)/graphics/window.cpp 
ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/graphics/shader_program.cpp 
ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/graphics/array.cpp 
ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/graphics/attribute_definition.cpp 
ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/graphics/abstract/buffer.cpp 
ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/graphics/simple_buffer.cpp 
# ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/graphics/instance_buffer.cpp 
ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/graphics/index_buffer.cpp 
ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/math/vec2.cpp 
ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/math/vec3.cpp 
ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/math/vec4.cpp 
ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/math/mat4.cpp 
ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/util/logging.cpp 

ENGINE_SHADERS = \ 
    $(OUT_DIR)/vertexshader.glsl \ 
    $(OUT_DIR)/fragmentshader.glsl 

APP_OBJECTS = \ 
    $(APP_OBJECT_DIR)/main.o 

APP_SOURCES = \ 
    $(APP_SOURCE_DIR)/main.cpp 

ENGINE_CXX_LIBS=-Wl,-Bstatic -lGLEW -lglfw3 -pthread -Wl,-Bdynamic -lGL -lGLU -ldl -lX11 -lXi -lXxf86vm -lXrandr -lXcursor -lXinerama 
APP_CXX_LIBS=-L$(LIB_OUT_DIR) -l:$(ENGINE_NAME) 

.PHONY: all build clean engine app run 

all: clean build run 

clean: 
    rm -f $(OUT_DIR)/* $(LIB_OUT_DIR)/* $(ENGINE_OBJECTS) $(APP_OBJECTS) 

build: engine app 

run: 
    cd $(OUT_DIR) && \ 
    ./$(APP_NAME) 

engine: $(ENGINE_LIB) $(ENGINE_SHADERS) 

app: $(EXECUTABLE) 

$(ENGINE_OBJECT_DIR)/%.o: $(ENGINE_SOURCE_DIR)/%.cpp $(ENGINE_SOURCES) 
    $(CXX) -I$(ENGINE_HEADER_DIR) -c -o [email protected] $< $(CXXFLAGS) 

$(ENGINE_LIB): $(ENGINE_OBJECTS) 
    ar rvs [email protected] $(ENGINE_OBJECTS) 

$(OUT_DIR)/%.glsl: $(ENGINE_SHADER_DIR)/%.glsl 
    cp -f $< [email protected] 

$(APP_OBJECT_DIR)/%.o: $(APP_SOURCE_DIR)/%.cpp $(APP_SOURCES) 
    $(CXX) -I$(ENGINE_HEADER_DIR) -c -o [email protected] $< $(CXXFLAGS) 

$(EXECUTABLE): $(APP_OBJECTS) 
    $(CXX) -o [email protected] $^ $(APP_CXX_LIBS) $(ENGINE_CXX_LIBS) 
+0

Je pense que vous êtes sur la mauvaise voie. Il y a une limite à la taille, mais c'est généralement énorme (64K ou quelque chose comme ça), et vous êtes loin de ça ... Vous pouvez utiliser $ (info ENGINE_OBJECTS = $ (ENGINE_OBJECTS)) 'pour être sûr que c'est pas le problème après l'avoir déclaré. Je pourrais chercher des caractères cachés, et essayer d'utiliser un ': =' au lieu d'un '=' à l'étape d'assignation ... – HardcoreHenry

Répondre

1

Il n'y a aucune limite à la taille d'une variable dans make (sauf pour la quantité de mémoire dans votre système). Votre système d'exploitation impose un maximum sur la taille d'une ligne de commande qui peut invoquer, donc si vos variables sont très grandes et que vous essayez de les utiliser dans une recette, il est possible que le système d'exploitation ne le permette pas. avec make et pas le problème que vous voyez ici de toute façon.

Je pense que le problème est que le fichier $(ENGINE_SOURCE_DIR)/graphics/instance_buffer.cpp n'existe pas ou n'est pas accessible pour une raison quelconque.

Cette règle est très accidentée:

$(ENGINE_OBJECT_DIR)/%.o: $(ENGINE_SOURCE_DIR)/%.cpp $(ENGINE_SOURCES) 
     $(CXX) -I$(ENGINE_HEADER_DIR) -c -o [email protected] $< $(CXXFLAGS) 

En ajoutant le $(ENGINE_SOURCES) ici vous dites que si les modifications du fichier source, ALL des fichiers objets doivent être reconstruits. Je ne peux pas croire que c'est ce que vous voulez (si vous voulez tout reconstruire si un fichier change, vous pouvez simplement écrire un script shell qui reconstruit toujours tout et vous n'avez pas besoin de faire du tout). Non seulement cela, mais si make ne peut pas trouver ou construire ALL les fichiers source, alors cette règle de modèle ne correspondra pas et make continuera à chercher pour voir si une autre règle de modèle va correspondre. Dans ce cas, il n'y en a pas d'autres, alors faites juste "hey, je ne sais pas comment construire le fichier" (dans ce cas, le fichier .../window.o).

Si vous exécutez make with debugging (make -d), vous verrez le problème (bien que la sortie soit volumineuse, vous devrez probablement la rediriger vers un fichier et l'examiner avec un éditeur ou moins, ou quelque chose qui vous permettra recherche et page d'avant en arrière).

Vous devez supprimer $(ENGINE_SOURCES) de cette règle. Alors probablement faire échouera avec une erreur plus raisonnable, qu'il ne peut pas construire .../instance_buffer.o.