2012-02-13 85 views
0

首先,抱歉,如果我最終做了一個太長的帖子,但我認爲它會丟失信息,否則。Makefile遞歸不通過CPPFLAGS

我想在每個版本中包含我的存儲庫版本。 有一個主makefile在其各自的子目錄中掌握了一些其他的。 子項目是「automaked」。

我試圖通過包含可變的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 [email protected] finished." 

subdirs: $(SUBDIRS) 

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

每個子目錄具有Makefile.amconfigure.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], [<[email protected]>]) 
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,並在主Makefile中的REPO_VERSION變化被忽略在進一步構建。

一塊的輸出是這樣的:

== 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]. 

這顯然不是我想要的。

有人可以在這裏請給出一種方法來解決這個問題嗎?

謝謝。

回答

4

在您的頂級make文件添加

export REPO_VERSION 

和修改每個Makefile.am有

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

出口指令,使得它使REPO_VERSION的價值出口遞歸調用作。 Makefile.am片段爲REPO_VERSION設置了默認值(例如,make是從子目錄中的shell運行的),並且AM_CPPFLAGS爲該Makefile中的所有目標指定了CPPFLAGS的默認值。如果您有一個特定於目標的_CPPFLAGS變量,則應該爲其添加$(AM_CPPFLAGS)或在其中包含-DREPO_VERSION =「$(REPO_VERSION)」。再花些功夫,你可以在configure.ac文件中添加一些東西,這樣就可以在配置時設置REPO_VERSION的默認值。

+0

+1:這是一個很好的解決方案,除了導出不可移植,許多make不支持它。 – 2012-02-13 16:51:38

+0

好吧!那正是我正在尋找的。唯一的變化就是我不得不寫'AM_CPPFLAGS = -DREPO_VERSION = \「$(REPO_VERSION)\」'(轉義''') – j4x 2012-02-13 17:09:48

1

您試圖通過環境傳遞CPPFLAGS,但我看不到配置的調用在其環境中設置CPPFLAGS的位置。嘗試通過它在命令行:

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

此外,您只運行配置一次。 Makefile存在後,您不會重新運行configure,因此您不會重置子目錄中CPPFLAGS的值。

在配置時設置版本非常不方便。看一看 here對於一些技術,允許在設置時間的版本。

+0

我同意你的更正,但它沒有迴應我的問題。我仍然想要重新生成'configure'來查看我的版本,我會考慮你給後者的鏈接,但是@Geoff Reedy的回覆恰好符合我的需求。 – j4x 2012-02-13 17:12:17