Делать и инкрементные сборки - PullRequest
4 голосов
/ 29 декабря 2011

Мне было интересно ...

Когда вы вносите изменения в file1.c или file2.c или file1.h, следующий make-файл перекомпилирует только то, что нужно (что приятно)

# Link to executable
result: file1.o file2.o
    gcc file1.o file2.o -o result23

# Assemble to .o object files
file1.o:    file1.s
    gcc -c dist/file1.s

file2.o:    file2.s
    gcc -c dist/file2.s

# Compile to .s assembly files
file1.s:    file1.c
    gcc -S file1.c

file2.s:    file2.c
    gcc -S file2.c

Однако, когда я перемещаю построенный объект в другой каталог, все перестраивается все время, независимо от того, было ли изменено содержимое только 1 файла.

# Link to executable
result: file1.o file2.o
    gcc file1.o file2.o -o result23

# Assemble to .o object files
file1.o:    file1.s
    gcc -c dist/file1.s
    mv file1.o dist

file2.o:    file2.s
    gcc -c dist/file2.s
    mv file2.o dist

# Compile to .s assembly files
file1.s:    file1.c
    gcc -S file1.c
    mv file1.s dist

file2.s:    file2.c
    gcc -S file2.c
    mv file2.s dist

Похоже, это происходит потому, что make не знает, где находятся файлы .o в его среде.

С этим несколько вопросов:

  • Может ли make иметь доступ к переменным окружения? Если да, не могли бы вы привести пример?
  • Может ли быть сделано уведомление об инкрементных сборках, если каталог дистрибутива отличается от текущего каталога?

Ответы [ 2 ]

5 голосов
/ 29 декабря 2011

Чтобы исправить вашу сборку, вам нужно сделать что-то вроде этого:

# Link to executable
result: dist/file1.o dist/file2.o
    gcc dist/file1.o dist/file2.o -o result

# Assemble to .o object files in main directory
dist/file1.o:    dist/file1.s
    gcc -c dist/file1.s -o dist/file1.o

dist/file2.o:    dist/file2.s
    gcc -c dist/file2.s -o dist/file2.o

# Compile to .s assembly files
dist/file1.s:    file1.c
    gcc -S file1.c -o dist/file1.s

dist/file2.s:    file2.c
    gcc -S file2.c -o dist/file2.s

Вы также можете использовать переменные окружения в make тоже ... хотя я не уверен, как это относится к ядруВаш вопрос: просто используйте что-то вроде этого, установите BUILDDIR и OBJDIR и получите такой make-файл:

$(BUILDDIR)/foo : $(OBJDIR)/bar.o
   g++ $(OBJDIR)/bar.o -o $(BUILDDIR)/foo

Хотя вы можете сделать это (и мой фиксированный make-файл тоже) лучше, используя автоматические переменные :

$(BUILDDIR)/foo : $(OBJDIR)/bar.o
  g++ $? -o $@
1 голос
/ 29 декабря 2011

1, вы можете обращаться к переменным окружения, как и к любой другой переменной;Например, $(TERM)

2, просто измените вашу цель создания, чтобы включить каталог назначения:

 dist/file1.o:    file1.s
      gcc -c dist/file1.s -o $@

Где $@ - неявная переменная, представляющая цель, dist/file1.o вэтот пример.

...