簡體   English   中英

生成的C文件和自動工具

[英]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'是不同的東西。

有兩種主要選擇:

  1. 在你的構建規則,只有依靠自動make變量(如$< )指的依賴。 make執行源外構建時,它將使用可行路徑初始化自動變量。

  2. 通過顯式路徑引用源目錄中的文件。

要單獨使用選項(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM