Я пытаюсь написать файл makefile, который генерирует файлы сборки (путем вызова gcc с флагом -S), а затем изменяет сгенерированные s.-файлы , а затем компилирует его. Чтобы найти подход, я сделал короткий образец makefile, который отлично работает, когда я точно перечисляю имя .s-sourcefiles (main.s, mod1.s и т. Д.).gcc/make - Как определить зависимости для генерации и компиляции файлов сборки (.s)?
objects = main.o mod1.o
assembly = main.s mod1.s
app : $(objects)
gcc -o app $(objects)
chmod +x app
%.s : %.c
gcc -S $<
# here some code will be called to modify
# the .s file for some experimental purpose ..
main.o : main.s
gcc -c main.s
mod1.o : mod1.s
gcc -c mod1.s
cleanobj :
rm app $(objects)
cleanass :
rm $(assembly)
cleanall : cleanobj cleanass
Это работает по назначению. Но когда, когда я определить зависимые пакеты чуть более общий характер («% .o:% .s») сборка (.s) не создаются файлы больше:
objects = main.o mod1.o
assembly = main.s mod1.s
app : $(objects)
gcc -o app $(objects)
chmod +x app
%.s : %.c
gcc -S $<
# here some code will be called to modify
# the .s file for some experimental purpose ..
%.o : %.s
gcc -c $<
cleanobj :
rm app $(objects)
cleanass :
rm $(assembly)
cleanall : cleanobj cleanass
Любое объяснение есть идея, как выполнить эти шаги?
Спасибо за ваш ответ, но это не получилось. Речь идет не о файлах, которые удаляются промежуточно, но не генерируются в первую очередь. Здесь показаны результаты первого: gcc -S main.c gcc -c main.s gcc -S mod1.c gcc -c mod1.s gcc -o app main.o mod1.o и второй файл makefile: cc -c -o main.o main.c cc -c -o mod1.o mod1.c gcc -o app main.o mod1.o Похоже, что .s-файлы мне вообще не сгенерированы. – OliverJL
Хорошо, я смог воспроизвести. Кажется, что мы сталкиваемся с следующим: «правило, предпосылки которого фактически существуют или упоминаются всегда, имеет приоритет над правилом с предпосылками, которые должны выполняться путем связывания других неявных правил» (из [здесь] (https://ftp.gnu.org /old-gnu/Manuals/make-3.79.1/html_chapter/make_10.html)). Таким образом, ваши правила переопределяются неявными правилами. Вы можете отключить неявные правила через флаг '-r' make. – yugr