SORU
18 Kasım 2008, Salı


Nasıl bir Makefile otomatik olarak değiştirilmiş bir başlık içeren yeniden kaynak dosyaları alabilir miyim? (C/C )

Şu an üzerinde çalıştığım bir program (bir çekirdek, aslında) oluşturmak için kullanabileceğiniz aşağıdaki makefile var. Sıfırdan ve süreç hakkında bilgi topluyorum, onun mükemmel değil, ama deneyim seviyem makefiles yazmak için bu noktada onun kadar güçlü bence.

AS  =	nasm
CC  =	gcc
LD  =	ld

TARGET  	=	core
BUILD   	=	build
SOURCES 	=	source
INCLUDE     =   include
ASM     	= 	assembly

VPATH = $(SOURCES)

CFLAGS  =	-Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
    		-nostdinc -fno-builtin -I $(INCLUDE)
ASFLAGS =	-f elf

#CFILES 	=	core.c consoleio.c system.c
CFILES  	=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES  	=	assembly/start.asm

SOBJS   =	$(SFILES:.asm=.o)
COBJS   =	$(CFILES:.c=.o)
OBJS    =	$(SOBJS) $(COBJS)

build : $(TARGET).img

$(TARGET).img : $(TARGET).elf
    c:/python26/python.exe concat.py stage1 stage2 pad.bin core.elf floppy.img

$(TARGET).elf : $(OBJS)
    $(LD) -T link.ld -o $@ $^

$(SOBJS) : $(SFILES)
    $(AS) $(ASFLAGS) $< -o $@

%.o: %.c
    @echo Compiling $<...
    $(CC) $(CFLAGS) -c -o $@ $<

#Clean Script - Should clear out all .o files everywhere and all that.
clean:
    -del *.img
    -del *.o
    -del assembly\*.o
    -del core.elf

Bu makefile ile benim ana sorun, bir veya daha fazla C dosyalarını içeren bir başlık dosyası değiştirdiğinizde, C dosyaları yeniden değil. Ben bunu düzeltmek çok kolay sahip oluyor, hepsi benim başlık dosyaları bağımlılıkları için benim C dosyaları, ama bu etkili neden tam bir yeniden inşa projesi ne zaman değişti/eklendi bir başlık dosyası, hangisi değil, çok zarif.

Benim istediğim sadece C dosyaları içindirvardırBaşlığı yeniden oluşturulması için değiştirdim, ve tüm proje daha bağlantılı olduğu için dosya. Tüm başlık dosyaları hedef bağımlılıkları neden ile bağlantı yapabilirim, ama kütüphanelerin başlık dosyaları daha yeni olduğunda C dosyalarını geçersiz kılmak için nasıl anlamaya olamaz.

Duydum ki GCC bazı komutlar için bu mümkün (yani makefile olabilir bir şekilde anlamaya hangi dosyalara ihtiyacımız olacak yeniden) ama ben yapamam hayat beni gerçek bir uygulama örneği için bak. Birisi bir makefile bu davranışı sağlayacak bir çözüm gönderebilir miyim?

Açıklamalıyım, bireysel hedefler koyarak ve her bir hedefe sahip olduğunu biliyorum.EDİT: o başlık dosyaları gerektirir. Benim makefile her zaman bir ağrı biraz olan bir başlık dosyası bir yerde bulunur, düzenleme gerektirir. Başlığı diğer projelerde gördüm oldukça eminim ki, kendi kendine Dosya bağımlılıkları elde edebileceği bir çözüm arıyorum.

CEVAP
9 Mart 2009, PAZARTESİ


Zaten başka bir yerde bu sitede belirttiği gibi, bu sayfaya bakın: http://make.paulandlesley.org/autodep.html

Kısacası, gcc otomatik olarak oluşturabilirsiniz .mini makefile, d bağımlılık dosyaları bağımlılıklarını içeren parçaları .c derlenmiş dosya. Bu değişim her zaman .c dosyasını derleyin .d dosya güncellenecektir.

-M gcc bayrak katan dahil etmek gerekir .d makefile dosyaları Chris yukarıda yazdığı gibi. "Temiz" açık uzak olmasını sağlar .ama bunları göz ardı edip yapabilirsin sed kullanarak çözdü, hangi sayfada daha karmaşık bazı sorunları vardır d artık var olmayan bir başlık dosyası oluşturmak için mümkün değil varlık hakkında şikayet dosyaları zaman.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • campos9896

    campos9896

    24 Mart 2012
  • Jay Will

    Jay Will

    19 NİSAN 2006
  • Jon Reed

    Jon Reed

    14 AĞUSTOS 2006