LINUX.ORG.RU

при этом если написать Z=123 _ВЫШЕ_ правила x : y то она определяется и выводиться echo, но нужно именно внутри правила!

quest ★★★★
() автор топика
Ответ на: комментарий от quasimoto

нужно передать эту переменную в gcc в виде -D чтобы программа знала с какой опцией ее компилили

quest ★★★★
() автор топика
Ответ на: комментарий от quest

если перенести в моем примере Z=123 до правила, то то-же работает(((

Ну так и пусть работает

# -*- makefile -*-

CC     = gcc
CFLAGS = ...
DOPT   = _X86

TARGET = my-prog
SRCS   = my-prog.c

$(TARGET): $(SRCS)
	$(CC) -D$(DOPT) $(CFLAGS) -o $@ $^

clean:
	rm $(TARGET)
/* my-prog.c */

#include <stdio.h>

int main () {
#ifdef _X86
	printf ("Arch: X86\n");
#endif
#ifdef _x86_64
	printf ("Arch: X86-64\n");
#endif
	return 0;
}
$ make
gcc -D_X86  -o my-prog my-prog.c
$ ./my-prog
Arch: X86
$ make clean
rm my-prog
$ make DOPT=_x86_64
gcc -D_x86_64  -o my-prog my-prog.c
$ ./my-prog
Arch: X86-64
quasimoto ★★★★
()
Ответ на: комментарий от quest

make DOPT=_x86_64

да я читал про, но это не так красиво и забудется со временем(

Ну это был искусственный пример, реально для выставления опций нужно либо использовать autoconf, либо делать скрипт make.sh, кучку файлов config-$ARCH-$OS, писать в Makefile «include config» и по запуску make.sh, в зависимости от выхлопа uname копировать нужный config-$ARCH-$OS в config.

А что изменится если переменная будет локальной?

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

>А что изменится если переменная будет локальной?

Я Makefile руками пишу. Там множество правил вызывается типа make x, make x2, make x3, соответственно если будет локально определеяться думать о этих переменных не надо, только о правилах

quest ★★★★
() автор топика
Ответ на: комментарий от quasimoto

Правило всё равно вызывается с помощью RULE -> /bin/sh RULE

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

забавный вариант.
вообщем я выкрутился тем что передаю gcc имя правила через $(@)
для моей задачи это подходит

quest ★★★★
() автор топика
Ответ на: комментарий от quest

Я вызывал дочерний make и ему передавал как цель:

.PHONY: all

ifeq ($(MAKECMDGOALS),)
all:
        $(MAKE) `uname`
else

FILE_TO_TOUCH = $(MAKECMDGOALS)

$(MAKECMDGOALS):
        touch $@

endif
rymis ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.