LINUX.ORG.RU

autotools: как задать разные компиляторы для двух разных програм?


0

0


есть программы A и B, обе, допустим, написаны на C. опять же, допустим, в системе при сборке есть два разных C компилятора - X + Y - и хочется A собирать X а B соотв. Y. вопрос: как сказать automake, что чем собирать?

// wbr

насколько я помню стандартных штуков там нету  , ну а так 

AC_CHECK_PROGS && AC_SUBST ?

и в Makefile придется ченить вроде 

source2=$(wildcard b_src/*.c)
objectlist2=$(source2:.c=.b)

source1=$(wildcard a_src/*.c)
objectlist1=$(source1:.c=.a)

A: $(objectlist1)
<TAB><TAB>$(X) -o A $(objectlist1)

B: $(objectlist2)
<TAB><TAB>$(Y) -o B $(objectlist2)

%.a: %.c
<TAB><TAB>$(X) -c $< -o $@

%.b: %.c
<TAB><TAB>$(Y) -c $< -o $@

Имхо изврат, но помоему и задача не очень обычная.
Если ошибаюсь поправьте.

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

ну и соберется все c some_gcc_version ... смысл то такой - походу что один Makefile на две проги иначе вопрос непонятен

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

> ну и соберется все c some_gcc_version ... смысл то такой - походу что один Makefile на две проги иначе вопрос непонятен

да, смысл именно такой aka имея нечто навроде:

CC1 = abc
CC2 = xyz
.....
bin_PROGRAMS = foo bar
foo_SOURCES = foo.c
bar_SOURCES = bar.c

..собрать foo.c с помощью $(CC1) а bar.c соотв. с помощью $(CC2)

// wbr

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

> ..собрать foo.c с помощью $(CC1) а bar.c соотв. с помощью $(CC2)

aka меня бы устроило нечто на вроде:

<где-то там в configure.ac ставятся CC1/CC2>
CC1 = abc
CC2 = xyz

.....

bin_PROGRAMS = foo bar

foo_SOURCES = foo.c
foo_CC = $(CC1)
foo_LINK = $(CC1)

bar_SOURCES = bar.c
bar_CC = $(CC2)
bar_LINK = $(CC2)

но вот подстановки xxx_CC я как-то не обнаружил, в отличие от xxx_LINK :-/

// wbr

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


source2=$(wildcard b_src/*.c)
objectlist2=$(source2:.c=.b)

source1=$(wildcard a_src/*.c)
objectlist1=$(source1:.c=.a)

A: $(objectlist1)
<TAB><TAB>$(X) -o A $(objectlist1)

B: $(objectlist2)
<TAB><TAB>$(Y) -o B $(objectlist2)

%.a: %.c
<TAB><TAB>$(X) -c $< -o $@

%.b: %.c
<TAB><TAB>$(Y) -c $< -o $@

aka хак с временной подстановкой .o->.temp? нет, это как-то слишком жестоко. а с учётом того, что таких програмок может быть туева хуча...

// wbr

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

ну да ... тоды

%.foo_object: %.c

и

%.bar_object: %.c

и тута рулить компиляторами, единственное что некрасиво (непривычно) концы(расширения) выглядят и clean нужно незабыть ... зато буд пахать :)

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

я вначале хотел предложить через if'ы но т.к. я их не юзал незнаю ... может быть можно что то там придумать вроде if inside($(SRC_FOO),foo_func.c) then ...

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

> и тута рулить компиляторами, единственное что некрасиво (непривычно) концы(расширения) выглядят и clean нужно незабыть ... зато буд пахать :)

окончания то фиг с ними, но в указанном варианте соотв. автоматически не отслеживаются зависимости от заголовков, что есть совсем нехорошо :(

bin_PROGRAMS = foo bar

foo_src = foo.c
foo_obj = $(foo_src:.c=.fo)

bar_src = bar.c
bar_obj = $(bar_src:.c=.bo)

foo: $(foo_obj)
$(CC) -o foo $(foo_obj)

bar: $(bar_obj)
$(CC) -o bar $(bar_obj)

%.fo: %.c
$(CC) -c $< -o $@

%.bo: %.c
$(CC) -c $< -o $@

CLEANFILES = *.fo *.bo

// wbr

klalafuda ★☆☆
() автор топика

Как вариант сделать врапер для компилятора: wrap_cc.sh -cc $(X) ... А этот врапер будет вызывать компилятор CC с нужными опциями. Тогда: foo_CFLAGS=-cc gcc -g... bar_CFLAGS=-cc icc -g...

Хотя лучше сделать configure для основного дерева и 2 конфигуры для foo и bar, которые будут вызываться из основного. Ну и 3 Makefile.am'а.

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