[英]A generated C file and autotools
在基於autoools的構建中,我想用生成的C文件替換版本控制的C文件。
這個虛擬的hello世界示例排序工作:
#!/bin/sh -ex
cat > configure.ac <<EOF
AC_INIT([hello], [0.01])
AC_PREREQ([2.68])
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([1.11])
AC_CONFIG_FILES([Makefile])
AC_PROG_CC
AC_OUTPUT
EOF
cat > autogen.sh <<EOF
touch NEWS README AUTHORS ChangeLog COPYING
autoreconf -i
EOF
chmod +x autogen.sh
printf "
bin_PROGRAMS = hello
hello_SOURCES = hello.c
hello.c: generate
\t./generate
" > Makefile.am
cat > hello.c <<EOF
#include <stdio.h>
int main()
{
puts("hello world");
return 0;
}
EOF
cat > generate <<EOF0
#!/bin/sh
cat > hello.c <<EOF
#include <stdio.h>
int main()
{
puts("HELLO WORLD");
return 0;
}
EOF
EOF0
chmod +x generate
./autogen.sh
./configure
make -j$(nproc)
除了它阻止我進行樹外構建,例如:
mkdir B
cd B
../configure
make
我通常可以在基於autotools的程序包中執行此操作。 如何生成C文件,以便樹外構建繼續工作?
重要的是要記住, make
對目錄的了解並不多。 在大多數情況下,一切都是字符串。 這並不總是那么明顯,但是當您試圖編寫可以處理源代碼外構建的構建系統時,它往往會給您帶來極大的困擾。
您提供了一個構建規則,其中hello.c
取決於您的generate
腳本,原則上很好。 Make
甚至可以在源外構建中正確處理依賴項處理,在源目錄中找到generate
腳本。 但是構建規則中的配方顯式運行./generate
,當您執行源外構建時不存在。 此外,在依賴項和構建規則之間存在脫節:'generate'與'./generate'是不同的東西。
有兩種主要選擇:
在你的構建規則,只有依靠自動make
變量(如$<
)指的依賴。 當make
執行源外構建時,它將使用可行路徑初始化自動變量。
通過顯式路徑引用源目錄中的文件。
要單獨使用選項(1),您需要解決(大概)不在路徑中時如何運行generate
腳本的問題。 您可以通過外殼間接運行它來實現。 在這種情況下,您想要的制造規則是
hello.c: generate
$(SHELL) $<
這對於源內或源外構建均適用。 $(SHELL)
make變量應由Autotools提供。
另一方面,要使用選項(2),您可能會依賴$(srcdir)
或$(top_srcdir)
:
# Note that the dependency name will always contain a '/':
hello.c: $(srcdir)/generate
$<
(您也可以在構建配方中使用路徑命名生成腳本,但是通常最好避免重復。)Autotools也提供$(srcdir)
和$(top_srcdir)
變量。 前者是指源樹中與我們當前正在構建的build-tree目錄相對應的目錄; 后者是指包含configure
腳本的源樹目錄。
在這兩個代碼中,我本着外包資源的精神對(1)進行了更多評價,但實際上並沒有太大區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.