2017-01-15 1 views
0

Я пытаюсь написать файл 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 

Любое объяснение есть идея, как выполнить эти шаги?

ответ

2

Вам необходимо пометить ассемблере файлы как драгоценные:

.PRECIOUS: %.s 

или просто отметьте добавить следующее принужденно сохранить все промежуточные результаты:

.SECONDARY: 

Также см this question.

+0

Спасибо за ваш ответ, но это не получилось. Речь идет не о файлах, которые удаляются промежуточно, но не генерируются в первую очередь. Здесь показаны результаты первого: 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

+0

Хорошо, я смог воспроизвести. Кажется, что мы сталкиваемся с следующим: «правило, предпосылки которого фактически существуют или упоминаются всегда, имеет приоритет над правилом с предпосылками, которые должны выполняться путем связывания других неявных правил» (из [здесь] (https://ftp.gnu.org /old-gnu/Manuals/make-3.79.1/html_chapter/make_10.html)). Таким образом, ваши правила переопределяются неявными правилами. Вы можете отключить неявные правила через флаг '-r' make. – yugr

0

Большое спасибо yugr, флаг -r был соответствующим советом! К любому struggeling такое же поведение: Следующий Makefile (по сравнению с приведенной выше, .PRECIOUS:% .s была добавлена) производит желаемых результатов (.s и .o файлов):

objects = main.o mod1.o 
    assembly = main.s mod1.s 

    .PRECIOUS: %.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 

производит, вызывается с

make 
    cc -c -o main.o main.c 
    cc -c -o mod1.o mod1.c 
    gcc -o app main.o mod1.o 
    chmod +x app 

, но при вызове с

make -r 
    gcc -S main.c 
    gcc -c main.s 
    gcc -S mod1.c 
    gcc -c mod1.s 
    gcc -o app main.o mod1.o 
    chmod +x app 

то есть. создавались требуемые файлы .s, что также приводило к исполняемому «приложению».

Знайте, нет .o или .s файл существует в целевых папках.

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