2013-02-23 31 views
6

Tôi đang làm việc trên một dự án đòi hỏi một tiểu dự án có makefile của riêng mình và configure.ac. Tiểu dự án là một chương trình được sử dụng để tạo các tệp nguồn cho dự án chính. Có một tùy chọn để vô hiệu hóa việc xây dựng dự án này và cố gắng sử dụng một phiên bản đã cài đặt để thay thế.Làm thế nào để có được đường dẫn tuyệt đối đến thư mục xây dựng hàng đầu trong config.ac autoconf?

Trong cả hai trường hợp, tôi tạo một biến được sử dụng trong Makefile.am chứa đường dẫn đến chương trình.

Câu hỏi của tôi là, Khi sử dụng phiên bản cục bộ của dự án, làm cách nào để có được vị trí của nó để sử dụng trong Makefile.am?

Tôi đã thử

FOOPLACE=${abs_top_builddir}/bar/foo 

Nhưng điều này luôn làm cho FOOPLACE chỉ chứa /bar/foo. Tôi thậm chí không chắc chắn đây sẽ là cách đúng đắn để làm điều này mặc dù thậm chí về nguyên tắc.

+1

Đây có phải là '$ (abs_top_builddir)' trong tệp 'Makefile.am' không? –

+0

@BrettHale, tôi _believe_ Tôi không thể làm điều này trong Makefile như thể tôi đang sử dụng phiên bản đã cài đặt của chương trình, thay vì phiên bản được xây dựng trong thư mục nguồn của tôi, sau đó tôi cần sử dụng đường dẫn này . Có cách nào để giái quyết vấn đề này không? Nếu có một cách để sửa đổi biến 'FOOPLACE' của tôi trong makefile, tôi có thể đặt điều này trong một điều kiện trong Makefile, nhưng điều này dường như không hoạt động. – crobar

+0

@BrettHale: Trong 'Makefile.am' bạn thực sự có thể sử dụng, nhưng dạng' $() 'là thông thường. –

Trả lời

7

Tôi vừa thực hiện một số thử nghiệm với một đơn giản configure.ac.

Tôi không thể nhận được giá trị hợp lý cho $abs_top_builddir trừ khi nó được thông qua thay thế (tức là, AC_CONFIG_FILES). Theo số Preset Output Variables(autoconf), ít nhất chúng nên có sẵn trong config.status (ví dụ: AC_CONFIG_COMMANDS). Họ không phải.

Lặn vào config.status, tôi thấy rằng @[email protected] được đặt thành giá trị $ac_abs_top_builddir. Điều này có vẻ kỳ lạ, và tôi nghĩ rằng nó có thể là một lỗi. I have sent it to bug-autoconf để xem suy nghĩ của họ.

Đạo đức của câu chuyện: Nó sẽ hoạt động ở mọi nơi thay thế được thực hiện. Bạn có thể sử dụng $ac_abs_top_builddir trong phạm vi config.status, nhưng tôi sẽ không dựa vào nó.

Đây là thử nghiệm tôi đã sử dụng:

configure.ac:

AC_PREREQ([2.67]) 
AC_INIT([], [0], [[email protected]]) 
AC_MSG_NOTICE([notice: ${abs_top_builddir}]) 
AC_MSG_NOTICE([notice+ac: ${abs_top_builddir}]) 
AC_CONFIG_COMMANDS_PRE([echo "pre+ac: ${ac_abs_top_builddir}"]) 
AC_CONFIG_COMMANDS_PRE([echo "pre: ${abs_top_builddir}"]) 
AC_CONFIG_COMMANDS_POST([echo "post+ac: ${ac_abs_top_builddir}"]) 
AC_CONFIG_COMMANDS_POST([echo "post: ${abs_top_builddir}"]) 
AC_CONFIG_COMMANDS([echo], 
[echo "config.status+ac: ${ac_abs_top_builddir}" 
echo "config.status: ${abs_top_builddir}"]) 
AC_CONFIG_FILES([test], [chmod +x test]) 
AC_OUTPUT 

test.in:

#!/bin/sh 
# -*- sh -*- 
# @[email protected] 
echo "test: @[email protected]" 
echo "test+ac: @[email protected]" 

Run nó với autoconf && ./configure && ./test.

Các vấn đề liên quan