2016-01-23 2 views
1

Я написал простой, полу-общий, Makefile, чтобы скомпилировать простой проект C, однако он случайно перезаписывает себя. Это выход вызова make:Makefile переписывает себя

clang -g -O0 -march=native -Wall -Wextra -ansi -pedantic -c appley.c -o Makefile.o 
clang Makefile.o -o Makefile 
rm Makefile.o 
Makefile:1: warning: NUL character seen; rest of line ignored 
Makefile:1: *** missing separator. Stop. 

Это Makefile:

CC  ?= gcc 
DEBUG ?= -g -O0 -march=native 

CFLAGS := $(CFLAGS) $(DEBUG) -Wall -Wextra -ansi -pedantic 
LDFLAGS := $(LDFLAGS) 
LDLIBS := $(LDLIBS) 

SRC  := appley.c 
OBJ  := $(SRC:.c=.o) 
SYM  := $(SRC:.c=.o.dSYM) 
BIN  := appley 

PREFIX ?= /usr/local 
BINDIR := $(PREFIX)/bin 

.PHONY: clean all 

all: $(BIN) 

$(BIN): $(OBJ) 
    $(CC) $(LDFLAGS) $(LDLIBS) $(OBJ) -o $(BIN) 

%.o: $(SRC) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

install: $(BIN) 
    install -d $(BINDIR) 
    install $(BIN) $(BINDIR) 

clean: 
    rm -rf $(OBJ) $(BIN) 

Как стать [email protected]Makefile.o? А также, как может $(BIN) стать Makefile?
Я считаю, что это подстановочный знак, так как без него он работает нормально.

Редактировать: Это не шаблон, он сохраняет исходный файл в VIM на другой панели TMUX. Компиляция после этого сворачивает make-файл. Я официально смущен.

+0

Makefile, вы обеспечиваете не имеет ошибки и не может произвести вывод вы показали здесь. Итак, ясно, что когда вы «_распределили ненужные части», вы фактически удалили часть make-файла, который вызывает вашу ошибку ... это означает, что мы не можем помочь вам решить вашу проблему. – MadScientist

+0

@MadScientist Нет, я могу воспроизвести его с помощью этого make-файла. Но вы правы, ответ ниже - это не вся правда, я упустил что-то. – Ctx

+0

Добавлен полный make-файл. – Leandros

ответ

2

У шаблонов обычно есть% с обеих сторон. Попробуйте заменить это,

%.o: $(SRC) 

с этим,

%.o: %.c 
+0

Да, это исправило ошибку. И я также теперь, когда это произошло, произошло, когда я скомпилировал двоичный файл, изменил исходный код и затем перекомпилировал (который только компилирует обнаруженные изменения). – Leandros

+0

В оригинальном примере происходят странные вещи, даже не детерминированные. Я поместил исходное содержимое в 'temp.mk', затем запустил этот сценарий оболочки как' test.sh', http://pastebin.com/BVNumq1f и, возможно, 1 раз в 10 раз, он работает так, как ожидалось, остальные 9 раз перезаписывает Makefile. Выход: http://pastebin.com/6CZ9ATUv – jamieguinan

+0

Btw Я предполагаю, что @Leandros находится на OSX, потому что 'clang'. Я тестировал на Linux, но та же проблема. – jamieguinan

Смежные вопросы