Makefile рекурсивный не проходящий CPPFLAGS - PullRequest
0 голосов
/ 13 февраля 2012

Прежде всего, извините, если я в конечном итоге сделаю слишком длинный пост, но я думаю, что в противном случае будет отсутствовать информация.

Я бы хотел включить свою версию репозитория в каждую сборку.Существует основной make-файл, который управляет некоторыми другими в их соответствующих подкаталогах.Подпроекты «автоматизированы».

Я пытаюсь передать переменную, содержащую svnversion, во внутренний Makefiles следующим образом:

# Main Makefile

SUBDIRS = sd1 sd2
REPO_VERSION = `svnversion`
export ECHO = @echo
export CPPFLAGS

all: versioned
    $(ECHO) "Build of all projects in $(PWD) finished."

clean :
    $(ECHO) "Cleaning up entire project tree..."
    -for d in $(SUBDIRS); do ($(ECHO) "Cleaning up \"$$d\""; $(MAKE) -C $$d clean ); done

.PHONY: versioned unversioned $(SUBDIRS)

versioned:  CPPFLAGS = -DREPO_VERSION=\"v$(REPO_VERSION)\"

versioned:  subdirs

unversioned:    subdirs

versioned unversioned:
    $(ECHO) "Build $@ finished."

subdirs: $(SUBDIRS)

$(SUBDIRS):
    $(ECHO) "== Building $@                      =="
    $(ECHO) "    [ CPPFLAGS = \"$(CPPFLAGS)\" ]"
    ( cd $@ && \
        ( [ -f Makefile ] || \
            ( aclocal       && \
            autoheader  && \
            automake --foreign --add-missing && \
            autoconf    && \
            configure ) )   && \
        $(MAKE) \
        )

В каждом подкаталоге есть Makefile.am иconfigure.ac вот так:

Makefile.am:

# Makefile.am in "sd1" and "sd2"

bin_PROGRAMS = app
app_SOURCES = source.c

configure.ac:

AC_PREREQ(2.59)

AC_INIT([app], [1.00], [<suport@domain>])
AM_INIT_AUTOMAKE

AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET

# Checks for header files.
AC_HEADER_STDC

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T

# Output configuration files.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

Я ожидал, что это сработает, но автоинструмент встраивает REPO_VERSION в make-файле при запуске, а изменения в REPO_VERSION основного Make-файла игнорируются в последующих сборках.

Часть вывода выглядит следующим образом:

== Building sd1                      ==
    [ CPPFLAGS = "-DREPO_VERSION="1050"" ]
( cd sd1 && \
        ( [ -f Makefile ] || \
                ( aclocal               && \
                autoheader      && \
                automake --foreign --add-missing && \
                autoconf        && \
                configure ) )   && \
        make \
        )
make[1]: Entrando no diretório `./recursive/sd1'
make  all-am
make[2]: Entrando no diretório `./recursive/sd1'
gcc -DHAVE_CONFIG_H -I.   -DREPO_VERSION=\"1049M\"  -g -O2 -MT source.o -MD -MP -MF .deps/source.Tpo -c -o source.o source.c
mv -f .deps/source.Tpo .deps/source.Po
gcc  -g -O2   -o app source.o
make[2]: Saindo do diretório `./recursive/sd1'
make[1]: Saindo do diretório `./recursive/sd1'

Программа выводит:

> ./sd1/appVersão = [1049M].

Это явно не то, что я хотел.

Кто-нибудь может подсказать, пожалуйста, как это исправить?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

В вашем верхнем уровне make file добавьте

export REPO_VERSION

и измените каждый Makefile.am так, чтобы он имел

REPO_VERSION ?= unknown
AM_CPPFLAGS = -DREPO_VERSION="$(REPO_VERSION)"

Директива экспорта делает так, чтобы значение REPO_VERSION экспортировалось врекурсивные вызовы make.Фрагмент Makefile.am устанавливает значение по умолчанию для REPO_VERSION, если оно не задано (например, make запускается из оболочки в подкаталоге), а AM_CPPFLAGS указывает значение по умолчанию CPPFLAGS для всех целей в этом Makefile.Если у вас есть целевая переменная _CPPFLAGS, вы должны либо добавить к ней $ (AM_CPPFLAGS), либо включить в нее параметр -DREPO_VERSION = "$ (REPO_VERSION)".Приложив немного больше усилий, вы можете добавить некоторые вещи в файлы configure.ac, чтобы можно было установить значение по умолчанию для REPO_VERSION во время настройки.

1 голос
/ 13 февраля 2012

Вы пытаетесь передать CPPFLAGS через среду, но я не вижу, где при вызове configure устанавливается CPPFLAGS в его среде.Попробуйте передать его в командной строке:

$(SUBDIRS):
    $(ECHO) "== Building $@                      =="
    $(ECHO) "    [ CPPFLAGS = \"$(CPPFLAGS)\" ]"
    cd $@ && autoreconf -i && ./configure CPPFLAGS=$(CPPFLAGS) && $(MAKE)

Кроме того, вы запускаете configure только один раз.После того, как Makefile существует, вы не перезапускаете configure, поэтому никогда не сбрасываете значение CPPFLAGS в подкаталоге.

Установка версии во время конфигурирования очень неудобна.Взгляните здесь на некоторые технические вопросы, которые позволяют установить версию во время создания.

...