2013-02-18 45 views
1

我有以下Makefile.am這是應該(通過Python腳本)來創建foo.hfoo.hdbfoo.cdbAutomake的,GNU做,檢查和(忽略)模式規則

TESTS = check_foo 

check_PROGRAMS = check_foo 

check_foo_SOURCES = check_foo.c $(top_builddir)/src/isti.h \ 
    foo.cdb foo.h foo.hdb 
check_foo_CFLAGS = @[email protected] $(all_includes) -I../../clib/src/ 
check_foo_LDADD = $(top_builddir)/src/libcorm.la @[email protected] -lsqlite3 

%.hdb %.cdb: %.h 
    PYTHONPATH=$(top_builddir)/cgen/src python $(top_builddir)/cgen/src/isti/cgen/run.py $< 

clean-local: 
    rm -f *.hdb *.cdb 

然而,儘管make foo.hdbmake foo.cdb工作(調用Python代碼,並從foo.h產生foo.hdbfoo.cdb文件),make clean check(或單獨兩個)沒有(缺foo.hdb - 沒有這樣的文件) - 模式規則不叫生成foo.hfoo.hdb

換言之:對於check_foo_SOURCES中列出的文件,未調用模式規則。

我該如何做這項工作?其餘的autotools基礎設施工作正常。從查看Makefile我懷疑問題是自動工具如何擴展檢查源。

這是所有在Linux上與Gnu make。這裏是the Makefile

[稍微更新以反映MadScientist的幫助]。

後來更新

下的Makefile(只是做,沒有自動工具)正常工作,所以這個問題似乎與自動工具和檢查的支持。 (請注意,我已從xxx.hdb切換到corm_xxx.h等,以便文件擴展名保持不變)。

更多詳細信息

因爲它似乎是相關的檢查宏,這是configure.ac:

AC_INIT([corm], [0.1], [[email protected]]) 
AC_CONFIG_MACRO_DIR([m4]) 
PKG_CHECK_MODULES([CHECK], [check >= 0.9.4]) 
AM_INIT_AUTOMAKE([-Wall foreign -Werror]) 
AC_PROG_CC_C99 
AM_PROG_CC_C_O 
LT_INIT 
AC_CONFIG_HEADERS([config.h]) 
AC_CONFIG_FILES([Makefile clib/Makefile clib/src/Makefile clib/tests/Makefile clib/docs/Makefile cgen/Makefile cgen/docs/Makefile example/Makefile example/src/Makefile]) 
AC_CHECK_PROGS([DOXYGEN], [doxygen], AC_MSG_WARN([Doxygen not found - continuing without Doxygen support])) 
AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"]) 
AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([clib/docs/Doxyfile cgen/docs/Doxyfile])]) 

SOLUTION

好了,總結各種事情下面,有兩個重要的問題(一旦我有固定的文件擴展名 - 請參閱「普通」的makefile和fceller的答案),其中任何一個足以使工作的事情:

  1. (的處理),頭文件是複雜的。由於自動依賴性,編程生成的頭文件會破壞事情。解決方案是使用BUILT_SOURCES

  2. 但是(處理).c文件並不複雜。所以把corm_foo.c放在check_foo.c的前面會觸發該文件的生成。由於這也會生成corm_foo.h,所以一切正常(因爲check_foo.c現在可以包含corm_foo.h)。

另外,fceller對於整潔的makefile有一些很好的一般觀點,並解釋了爲什麼「普通」makefile有效。

+0

什麼是您的'Makefile'?如果問題太大,您可以將其添加到pastebin – congusbongus 2013-02-18 22:28:32

+0

您好 - 我已將它添加(pastebin鏈接)到問題,謝謝。 – 2013-02-18 23:02:44

+0

什麼'找到。名稱foo.hdb輸出? – emallove 2013-02-19 00:00:20

回答

1

你需要告訴automake的是foo.hdb是源文件,它是被修建。將以下內容添加到Makefile.am中:

BUILT_SOURCES = foo.hdb 
+0

@fceller一直非常有幫助,但是這個評論讓我明白了發生了什麼。謝謝。 – 2013-02-23 21:43:58

2

%.cdb: %.hdb 

沒有做任何事情。檢查GNU make手冊,您會看到沒有命令行的模式規則用於使用相同的模式刪除先前定義的規則。由於沒有以前的規則,這基本上是沒有作用的。

如果你有一個創建一個調用規則的兩個輸出文件的命令,那麼你需要把兩個模式在同一規則中,像這樣:

%.cdb %.hdb: %.h 
     PYTHONPATH=$(top_builddir)/cgen/src python $(top_builddir)/cgen/src/isti/cgen/run.py $< 

這將告訴GNU使這兩個目標是通過調用規則生成的。意識到!此語法對於模式規則只具有此行爲。顯式規則與多個目標完全不同(足夠令人困惑)。

至於make clean的行爲,我不確定。 automake生成的makefile對於我來說太複雜了,只能閱讀它;它需要一些調試(運行它並跟蹤發生的情況)。然而,我懷疑那裏的規則沒有被設計得適當,以允許clean目標和構建目標都在make的相同調用中運行。分別運行這兩個命令,看看效果是否更好:

make clean 
make check 
+0

感謝修復hdb/cdb(我按照顯式規則的多個輸出的說明)。然而,這並不影響主要問題(這與清潔無關 - 分別做它們具有相同的問題)。所以對於發佈(回顧)有兩個問題的問題表示歉意 - 我不希望這樣做是正確的,因爲它不能使事情正常工作(但有一個upvote!)。另外,我會更新這個問題來反映這個答案。再次感謝。 – 2013-02-20 13:48:01

2

首先:您不需要在* _SOURCES中包含「* .h」。 automake將生成代碼來生成依賴關係。從手冊:_SOURCES定義中列出的頭文件將包含在發行版中,但在其他情況下將被忽略

您在普通Makefile中所做的更改(「請注意,我已從xxx.hdb切換到corm_xxx.h等,所以文件擴展名保持不變「)是必不可少的。 automake使用文件擴展名篩選* _SOURCES列表以查看要調用的內容(CC,CXX,F77)。

以下Makefile.am將工作:

TEST = check_foo 

check_PROGRAMS = check_foo 

check_foo_SOURCES = check_foo.c foo.db.c 
check_foo_CFLAGS = 
check_foo_LDADD = 

%.db.c %.db.h: %.h 
    echo "int i = 1;" > foo.db.c 
    echo "int j;" > foo.db.h 

clean-local: 
    rm -f *.db.h *.db.c 
+0

沒有解決問題 - 它需要要交換的.c文件的順序或要使用的BUILT_SOURCES。這是有道理的,但我不明白爲什麼我給的「普通」makefile工作。無論如何,感謝您對整理的一般建議。 – 2013-02-23 14:50:42

+0

如果你不包含「foo.db.h」,上述工作。如果在「check_foo.c」中包含「foo.db.h」,則需要BUILT_SOURCE – fceller 2013-02-23 19:04:06

+0

如果不包含「foo.db.h」,則上述工作。如果在「check_foo.c」中包含「foo.db.h」,則需要使用BUILT_SOURCE,因爲第一次做make時,依賴關係尚未生成,因此make不知道「check_foo.c」需要「foo.db.h」(你會注意到,如果你做了「make -k」一次並且生成.deps文件,它就會起作用)。反轉文件的順序並沒有幫助,因爲「make -j 2」仍然會中斷。 – fceller 2013-02-23 19:10:33