GNU Делать странные замены переменных - PullRequest
1 голос
/ 19 февраля 2012

У меня есть следующий Makefile:

CPPCOMPILER=g++
CCOMPILER=gcc
#CPPCOMPILER=i586-mingw32msvc-g++

FLAGS=-Wall -g -O3
LIBRARIES=-lpthread
MODULES=obj/HTTPRequest.o obj/main.o obj/Server.o obj/SocketUtils.o obj/HTTPServer.o \
    obj/CookieManager.o obj/FileLister.o
STATIC=obj/static/files.html.o obj/static/login.html.o

all: $(MODULES) $(STATIC)
    $(CPPCOMPILER) $(MODULES) $(STATIC) $(LIBRARIES) -o httpserver

obj/main.o : main.cpp
    @mkdir -p obj
    $(CPPCOMPILER) -c $(FLAGS) $< -o $@ 

obj/static/%.o : %
    @mkdir -p obj/static
    file2obj $< $(subst .,_,$<) > $<.c
    $(CCOMPILER) $<.c -o $@ -c $(FLAGS)   #<-------***THIS LINE***

obj/%.o : %.cpp %.h
    @mkdir -p obj
    $(CPPCOMPILER) -c $(FLAGS) $< -o $@ 

clean:
    rm -rf $(STATIC) $(MODULES) httpserver

У меня есть files.html, для которого file2obj испускает исходный код C. Этот код компилируется в файл .o.

Однако процесс make несколько отличается от того, что я ожидал. Вот вывод:

thrustmaster@thrustmaster:~/Code/HTTPFileSharer$ make
cc     files.html.c   -o files.html #<--------- ****THIS LINE!****
[and more linker errors here because of wrong command]
make: *** [files.html] Error 1
  • Как можно вызвать cc в этом случае? Я ожидаю gcc. (Я сталкивался с подобными проблемами и в другом проекте, но результаты не были серьезными.)
  • И как получается, что некоторые параметры съедают? Также -o параметр неверен. (Я получаю -o files.html)
  • Несколько раз files.html были удалены. Любые идеи относительно того, что может быть причиной этого?

Я использую GNU make 3.81.

Что-то не так с моим кодом Makefile? Или это известная ошибка в GNU / make?

Буду очень признателен за любые советы / указания / предложения: -)

Спасибо


UPDATE

Я привожу здесь еще один случай, где я сталкиваюсь с аналогичной проблемой.

Makefile:

CPPCOMPILER=g++
CCOMPILER=gcc
FLAGS=-Wall -pg -O3
LIBRARIES=`pkg-config --libs libglfw` -lm -lGLU -lGL -lXrandr
UNITS=obj/main.o obj/TextureManager.o obj/Thread.o obj/Tile.o obj/PictureTile.o     obj/Coverflow.o obj/Vector3D.o \
        obj/TilePopulator.o obj/FileLister.o
SOIL_DEPENDS=soil/image_DXT.c  soil/image_helper.c  soil/SOIL.c  soil/stbi_DDS_aug_c.h      soil/stb_image_aug.c \
                soil/image_DXT.h  soil/image_helper.h  soil/SOIL.h  soil/stbi_DDS_aug.h      soil/stb_image_aug.h
SOIL_UNITS=obj/soil/image_DXT.o obj/soil/image_helper.o obj/soil/SOIL.o     soil/stb_image_aug.o

all: $(SOIL_UNITS) $(UNITS)
        $(CPPCOMPILER) $(FLAGS) $(SOIL_UNITS) $(UNITS) $(LIBRARIES) -o coverflow

obj/soil/%.o : soil/%.c
        @mkdir -p obj/soil
        $(CCOMPILER) -c $< -o $@     #<--Issue in this line 

obj/main.o : main.cpp
        @mkdir -p obj
        $(CPPCOMPILER) -c $(FLAGS) $< -o $@ 
obj/%.o : %.cpp %.h
        @mkdir -p obj
        $(CPPCOMPILER) -c $(FLAGS) $< -o $@ 
clean:
        rm -rf $(UNITS) $(SOIL_UNITS) coverflow

ВЫВОД:

thrustmaster@thrustmaster:~/Code/Skroll$ make
gcc -c soil/image_DXT.c -o obj/soil/image_DXT.o
gcc -c soil/image_helper.c -o obj/soil/image_helper.o
gcc -c soil/SOIL.c -o obj/soil/SOIL.o
cc    -c -o soil/stb_image_aug.o soil/stb_image_aug.c  #<-----**THIS LINE**
g++ -c -Wall -pg -O3 main.cpp -o obj/main.o 
g++ -c -Wall -pg -O3 TextureManager.cpp -o obj/TextureManager.o 
g++ -c -Wall -pg -O3 Thread.cpp -o obj/Thread.o 
g++ -c -Wall -pg -O3 Tile.cpp -o obj/Tile.o 
g++ -c -Wall -pg -O3 PictureTile.cpp -o obj/PictureTile.o 
g++ -c -Wall -pg -O3 Coverflow.cpp -o obj/Coverflow.o 
g++ -c -Wall -pg -O3 Vector3D.cpp -o obj/Vector3D.o 
g++ -c -Wall -pg -O3 TilePopulator.cpp -o obj/TilePopulator.o 
g++ -c -Wall -pg -O3 FileLister.cpp -o obj/FileLister.o 
g++ -Wall -pg -O3 obj/soil/image_DXT.o obj/soil/image_helper.o obj/soil/SOIL.o     soil/stb_image_aug.o obj/main.o obj/TextureManager.o obj/Thread.o obj/Tile.o     obj/PictureTile.o obj/Coverflow.o obj/Vector3D.o obj/TilePopulator.o obj/FileLister.o `pkg-    config --libs libglfw` -lm -lGLU -lGL -lXrandr -o coverflow

Ответы [ 2 ]

3 голосов
/ 19 февраля 2012

В GNU Make есть встроенное неявное правило для создания файла X из Xc:

%: %.c
#  commands to execute (built-in):
    $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@

Похоже, это неявное правило вызывается при запуске команды "make".

Хотя это не является хорошим постоянным решением, вы можете избежать этой проблемы, запустив make с опцией -r (или --no-builtin-rules), чтобы отключить неявные правила.

2 голосов
/ 19 февраля 2012

В первом случае вы пытаетесь собрать obj/static/files.html.o, используя это правило:

obj/static/%.o : %
    @mkdir -p obj/static
    file2obj $< $(subst .,_,$<) > $<.c
    $(CCOMPILER) $<.c -o $@ -c $(FLAGS)

Прежде чем Make выполнит это правило, оно сначала проверит, может ли предварительное условие (files.html)/ должен быть восстановлен.Существует неявное правило, которое будет строить files.html из files.html.c, поэтому это то, что произойдет , если files.html.c существует .(Похоже, вы идете в направлении, противоположном тому, что ожидает Make; я недостаточно знаю о построении HTML, чтобы понять, хорошая ли это идея.) И если это сработает, Make рассмотрит files.html промежуточный файл , и удалит его, когда он больше не нужен.

Существует более одного способа решения этой проблемы.Возможно, самое простое - написать собственное правило для сборки files.html, которое отменяет правило Make и ничего не делает:

%.html: %.html.c;

Во втором случае вы допустили небольшую ошибку в переменной SOIL_UNITS:

SOIL_UNITS=obj/soil/image_DXT.o obj/soil/image_helper.o obj/soil/SOIL.o soil/stb_image_aug.o

Обратите внимание на последний член.У вас есть правило для obj/soil/%.o, но не для soil/%.o, поэтому Make использует свое неявное правило.Просто измените этот термин на obj/soil/stb_image_aug.o.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...