Makro tanımını "make" komut satırı bağımsız değişkenlerinden (-D) C kaynak koduna nasıl geçirebilirim?


107

Makro tanımlarını genellikle "make komut satırı" ndan "makefile" ye şu seçeneği kullanarak geçiririm: -Dname = değer. Tanıma makefile içinden erişilebilir.

Ayrıca benzer derleyici seçeneğini kullanarak "makefile" dan "kaynak koda" makro tanımlarını iletiyorum: -Dname = value (birçok derleyicide desteklenir). Bu tanıma kaynak koddan erişilebilir.

Şimdi ihtiyacım olan şey, makefile'ımın kullanıcısına, makefile'da herhangi bir değişiklik yapmadan, "make.exe komut satırı" ndan "kaynak kod" a keyfi makro tanımlamalarını hemen geçirebilmesi.

böylece kullanıcı şunu yazabilir: make -f mymakefile.mk -SOMEOPTION var = 5

sonra doğrudan main.c kodu var görebilir:

int main()
{
  int i = var;
}

15
Neden olumsuz oy? Bana tamamen doğru bir soru gibi görünüyor.
Thomas

Yanıtlar:


99

makeKomutu şu şekilde çağırın :

make CFLAGS=-Dvar=42

Ve $(CFLAGS)Makefile'daki derleme komutunuzda kullandığınızdan emin olun . @ Jørgensen'in bahsettiği gibi, değişken atamasını makekomuttan sonra koymak CFLAGS, Makefile'da zaten tanımlanmış olan değeri geçersiz kılacaktır .

Alternatif olarak -Dvar=42, başka bir değişkeni ayarlayabilir CFLAGSve daha sonra CFLAGStamamen geçersiz kılmamak için bu değişkeni yeniden kullanabilirsiniz CFLAGS.


8
"CFLAGS = $ (CFLAGS) -Wall" kullanamazsınız; bu özyinelemeli bir tanım olacaktır ve make buna izin vermez. "CFLAGS: = $ (CFLAGS) -Wall" veya "CFLAGS + = -Wall" kullanabilirsiniz, ancak bunlar da çalışmaz, çünkü komut satırındaki bir atamanın önceliği daha yüksektir. "CFLAGS + = -Wall'u geçersiz kıl" kullanabilirsiniz, ancak genellikle dahili olarak farklı değişkenler seçmenizi öneririz. GNU Kodlama Standartları, kullanıcı için CFLAGS vb. Bırakılmasını gerektirir ve makefiles "local_CFLAGS = $ (CFLAGS) -Wall" gibi başka bir değişken seçer.
MadScientist

2
@MadScientist notuna eklemek için, GNU Kodlama Standartları da bunun $(CFLAGS)en son gelmesi gerektiğini belirtir, böylece bir kullanıcı tarafından belirtilen herhangi bir seçenek Makefile'ın dahili olarak ayarladığı her şeyi geçersiz kılar. Bu örneğin kullanmak anlamına gelir local_CFLAGS = -Wall $(CFLAGS). Tersine, gerçekten öncelikli olmak istediğiniz bir şey varsa $(CFLAGS), @MadScientist'in yorumunda olduğu gibi sonrasına koyun .
Sam

1
Bununla birden fazla makro nasıl ayarlanır?
Woody Huang

2
Örneğin CFLAGS="-Dvar1=42 -Dvar2=314"
@WoodyHuang

1
CPPFLAGSCFLAGSveya CXXFLAGS
şundan

11

Bunun için belirli bir değişken kullanın.

$ cat Makefile 
all:
    echo foo | gcc $(USER_DEFINES) -E -xc - 

$ make USER_DEFINES="-Dfoo=one"
echo foo | gcc -Dfoo=one -E -xc - 
...
one

$ make USER_DEFINES="-Dfoo=bar"
echo foo | gcc -Dfoo=bar -E -xc - 
...
bar

$ make 
echo foo | gcc  -E -xc - 
...
foo

10

Yapmak Çağrı Bu şekilde

make CFLAGS=-Dvar=42

çünkü sadece ortamı değil (Makefile değişkenlerine göre daha düşük önceliğe sahiptir) Makefile'ınızın CFLAGS'ını geçersiz kılmak istiyorsunuz.


6

Düşük itibar nedeniyle, kabul edilen cevaba yorum yapamam.

Önceden tanımlanmış değişkenden bahsetmek istiyorum CPPFLAGS. GNU Make el kitabında şu şekilde açıklandığı için CFLAGSveya daha uygun olabilir :CXXFLAGS

C ön işlemcisine ve onu kullanan programlara (C ve Fortran derleyicileri) verilecek ekstra işaretler.

Kullanan yerleşik örtük kural örnekleri CPPFLAGS

  • n.oaşağıdaki n.cformdaki bir tarif ile otomatik olarak yapılır :
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.ootomatik olarak yapılır n.cc, n.cppya da n.Cbir form tarifi ile:
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

make CPPFLAGS=-Dvar=123İstenilen makroyu tanımlamak için komut kullanılır .

Daha fazla bilgi


1
$ kedi x.mak
herşey:
    echo $ (SEÇENEK)
$ make -f x.mak 'OPTION = -DPASSTOC = 42'
echo -DPASSTOC = 42
-DPASSTOC = 42

-4

Gereksinimlerinizi karşılamak için aşağıda C dosyasını ve Makefile uygulamasını bulun

foo.c

 main ()
    {
        int a = MAKE_DEFINE;
        printf ("MAKE_DEFINE value:%d\n", a);
    }

Makefile

all:
    gcc -DMAKE_DEFINE=11 foo.c

soru, "makefile" dosyasını değiştirmeden "make komut satırından" rastgele tanımları doğrudan C kaynak koduna geçirmektir. Bu yüzden keyfi tanımların yapılmasına izin vermek için makefile'ımı bir kez değiştirmek istedim.
MohamedEzz

Make için çalışmıyor. Yani -DMAKE_DEFINE = 11, geçersiz seçenek diyor.
Ramakrishnan Kannan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.