2013-08-16 52 views
6

Dự án của tôi biên dịch bằng cách sử dụng GNU autotools (aclocal && autoconf && ./configure && make). Tôi muốn sử dụng Boost và tôi cũng muốn những người khác có thể biên dịch nó.Làm thế nào để đưa dự án Nâng cấp lên GNU Autotools?

  1. Tôi có nên đặt Tăng cường trong thư mục dự án của mình hoặc dựa vào Boost của hệ thống không?
  2. Tôi nên nói với các autotools để sử dụng Boost như thế nào? Tôi đã google và tìm thấy nhiều tập tin m4 tuyên bố để làm điều này - nhưng nơi tôi nên đặt những tập tin m4? Tôi có thể cất giấu một trong thư mục /usr/share/aclocal của tôi, nhưng điều đó không giúp người khác muốn biên dịch dự án bằng cách sử dụng ./configure && make.

Trả lời

0
  1. tôi muốn chắc chắn dựa vào cài đặt Boost của hệ thống. IIRC, lần cuối tôi xây dựng Boost nó yêu cầu các công cụ không chuẩn (wrt các công cụ di động cần thiết cho autoconf) cho Boost để xây dựng. Nó cũng mất một thời gian dài.
  2. AC_CONFIG_MACRO_DIR là nơi các tập tin .m4 đi

    AC_CONFIG_MACRO_DIR([m4]) 
    

nơi macro nằm trong thư mục "m4". Tôi mong đợi các macro Boost .m4 khác nhau có một số cách để kể cho configure gói Boost nào cần tìm (cho nhiều cài đặt Boost) và ở đâu (cài đặt không chuẩn).

+0

Cảm ơn. Bạn có thể đưa ra một ví dụ về cách sử dụng 'AC_CONFIG_MACRO_DIR' - tôi thấy AC perplexing. Ngoài ra: Nếu người dùng cài đặt Boost theo hướng dẫn của trang web, AC có thể tìm thấy nó không? Tôi muốn thông báo lỗi cho họ biết phải làm gì "Lỗi: Tăng cường được yêu cầu. Cài đặt theo hướng dẫn trên http: // ..." – SRobertJames

+0

Tăng của hệ thống có thể đã lỗi thời và/hoặc không tương thích, vì vậy bạn có thể phải cài đặt một phiên bản khác trong thư mục chính của bạn (khi bạn không có quyền truy cập root). – DanielKO

+0

Trong trường hợp đó, tôi có lẽ sẽ tìm một phiên bản dựng sẵn mà sẽ làm việc. Nếu không, bạn có thể vá nguồn cho phiên bản Boost đã cài đặt hoặc tải xuống từ nguồn và xây dựng nó. – ldav1s

1

Có một macro tuyệt vời boost.m4 mà bạn có thể đưa vào dự án của mình trong thư mục con m4. Các macro này được đặt với AC_CONFIG_MACRO_DIR([m4]) trong configure.ac.

Thêm ACLOCAL_AMFLAGS = -I m4 --install lên cấp cao nhất Makefile.am, được sử dụng bởi automake.

Dưới đây là lý do tại sao nó là một vĩ mô như vậy tốt:

BOOST_REQUIRE([1.54],[ACTION-IF-NOT-FOUND]) 

này sẽ xác định BOOST_CPPFLAGS mà bạn có thể thêm vào CPPFLAGS, sử dụng trong một AC_SUBST vv

Đối với các thành phần Boost cá nhân, nó có thể để xác định gỡ lỗi xây dựng, xây dựng tĩnh, vv Nhưng (thường) đa luồng, thư viện động là tốt nhất, ví dụ:

BOOST_FILESYSTEM([mt]) 

sẽ xác định BOOST_FILESYSTEM_LIBSBOOST_FILESYSTEM_LDFLAGS. Như thưởng khác, nếu thư viện dựa vào, nói, Boost.System, sau đó các thư viện phụ thuộc sẽ được tự động thêm vào LIBS, LDFLAGS vv


Bạn chỉ nên xác định rằng một cài đặt Boost là cần thiết chứ không phải là cố gắng phân phối nó. Nó dễ dàng được xây dựng và cài đặt từ nguồn, hoặc từ các gói biên dịch sẵn. Cái cũ mất một thời gian dài, nhưng tốt nhất là phải có một bản dựng 'tối ưu' trên hệ thống. Có rất nhiều phần mềm có thể sử dụng một triển khai Boost (mạnh mẽ và tối ưu).

Sau đó, sử dụng thông báo lỗi BOOST_REQUIRE nếu không có phiên bản chấp nhận được.

15

The ArchiveAX_BOOST_*.

Tôi chuyển sang boost.m4 trong một thời gian, nhưng nó quá chậm đến nỗi tôi có thể chỉnh sửa Makefile bằng đường dẫn Boost đầy đủ bằng tay trước khi boost.m4 kiểm tra xong cho thư viện thứ hai.

Tôi đã quay lại Lưu trữ và rất vui khi biết các macro tăng cường đang được duy trì tích cực một lần nữa; sau đó tôi tiến hành thanh lọc boost.m4 từ mọi dự án của mình.

trích đoạn liên quan từ một trường hợp sử dụng (giả sử các ax_boost _ * file m4 trong subdir m4.):

./bootstrap

aclocal -I m4 --install 
... 

./configure.ac

... 
AC_CONFIG_MACRO_DIR([m4]) 
... 
AX_BOOST_BASE([1.48],, [AC_MSG_ERROR([libfoo needs Boost, but it was not found in your system])]) 
AX_BOOST_SYSTEM 
AX_BOOST_FILESYSTEM 
... 

./Makefile.am

ACLOCAL_AMFLAGS = -I m4 
EXTRA_DIST = bootstrap ... 
SUBDIRS = ... src ... 
... 

./src/Makefile.am

AM_CPPFLAGS = \ 
    ... \ 
    $(BOOST_CPPFLAGS) \ 
    ... 

... 

AM_LDFLAGS = ... \ 
    $(BOOST_LDFLAGS) 

... 

lib_LTLIBRARIES = libFoo.la 

... 

libFoo_la_LIBADD = \ 
    ... \ 
    $(BOOST_FILESYSTEM_LIB) \ 
    $(BOOST_SYSTEM_LIB) \ 
    ... 
+0

Cảm ơn, tôi đã gặp vấn đề với dấu phẩy trong AC_MSG_ERROR' cần Boost, nhưng nó', loại bỏ dấu phẩy đã giải quyết nó. – aberaud

+0

Sau đó, bạn không trích dẫn đúng (các ký tự '[' và ']'.) – DanielKO