2012-07-25 20 views
21

Tôi có một dự án Autotools C đơn giản (không phải C++).Nơi để thêm một CFLAG, chẳng hạn như -std = gnu99, vào một dự án autotools

CFLAGs (bằng cách kiểm tra) có vẻ là -g -O2.

Tôi muốn tất cả các tệp tạo được tạo cũng có -std=gnu99 được thêm vào CFLAG, vì tôi sử dụng for (int i = 0; i < MAX; i++) và tương tự.

Tôi rõ ràng có thể hack Makefile, nhưng điều này bị ghi đè trên ./configure.

Địa điểm chính xác để thêm (hoặc thay đổi) CFLAG được yêu cầu bởi mã (ngược với các CFLAG mà người dùng có thể muốn thay đổi) ở đâu?

(Lưu ý đây là bản sao một phần của Where to add a CFLAG, such as -std=gnu99, into an (Eclipse CDT) autotools project như tôi đã nhận được câu trả lời Eclipse cụ thể mà tôi không muốn.)


@ câu trả lời DevSolar đã không giúp được nêu ra. Tệp configure.ac (bên dưới) tạo tập lệnh configure (cũng bên dưới).

configure.ac:

dnl Process this file with autoconf to produce a configure script. 

CFLAGS="$CFLAGS -std=gnu99" 
AC_PREREQ(2.59) 
AC_INIT(tuntest, 1.0) 


AC_CANONICAL_SYSTEM 
AM_INIT_AUTOMAKE() 

AC_PROG_CC 

AC_CONFIG_FILES(Makefile src/Makefile) 
AC_OUTPUT 

$ grep CFLAGS cấu hình

CFLAGS 
CFLAGS 
To assign environment variables (e.g., CC, CFLAGS...), specify them as 
    CFLAGS  C compiler flags 
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' 
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' 
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' 
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' 
ac_test_CFLAGS=${CFLAGS+set} 
ac_save_CFLAGS=$CFLAGS 
    CFLAGS="-g" 
    CFLAGS="" 
    CFLAGS="-g" 
if test "$ac_test_CFLAGS" = set; then 
    CFLAGS=$ac_save_CFLAGS 
    CFLAGS="-g -O2" 
    CFLAGS="-g" 
    CFLAGS="-O2" 
    CFLAGS= 
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' 
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' 
+1

Có thể bạn muốn đặt 'CFLAGS' khi định cấu hình, ví dụ:' ./configure CFLAGS = "- g -O2 -std = gnu99" '. –

+1

Vâng, đó là những gì tôi hiện đang làm. CFLAG tôi muốn thêm '-std = gnu99' là cần thiết, do đó tôi muốn nó không phải là thứ mà người dùng phải cấu hình. Mã sẽ không biên dịch mà không có nó, vì vậy nó phải luôn luôn ở đó, do đó câu hỏi. – fadedbee

+0

Sau đó, làm thế nào về './configure CC =" gcc -std = gnu99 "? –

Trả lời

22

autoconf có một vĩ mô cho việc này:

Chỉ cần đặt:

AC_PROG_CC_STDC 

sau AC_PROG_CC của bạn và mọi thứ sẽ đúng.

Đặc biệt khi bạn sử dụng các trình biên dịch khác không có -std=gnu99 nhưng hoạt động ở chế độ C99 theo mặc định (hoặc có một tùy chọn khác nhau của hpcc là -AC99 lò xo).

Tôi sẽ NOT sử dụng CFLAGS cho loại điều đó.

Từ docs:

-- Macro: AC_PROG_CC_STDC 
If the C compiler cannot compile ISO Standard C (currently C99), 
try to add an option to output variable `CC' to make it work. If 
the compiler does not support C99, fall back to supporting ANSI 
C89 (ISO C90). 

After calling this macro you can check whether the C compiler has 
been set to accept Standard C; if not, the shell variable 
`ac_cv_prog_cc_stdc' is set to `no'.
+1

Làm thế nào điều này hợp tác với '-std = c99' của GCC so với' -std = gnu99'? – DevSolar

+0

nó sẽ tự động sử dụng '-std = gnu99' nếu trình biên dịch là gcc hoặc hỗ trợ nó. – hroptatyr

+2

Bất kỳ cơ hội yêu cầu * hành vi * không mở rộng ('-std = c99') một cách rõ ràng? (Không phải những gì OP yêu cầu, không quan tâm - tôi không quan tâm đến các phần mở rộng GNU, cá nhân.) – DevSolar

1

Mặc dù sử dụng một macro như AC_PROG_CC_STDC là thích hợp hơn để thêm tùy chọn biên dịch để CFLAGS, autoconf hiện không có macro cho phép hỗ trợ biên dịch C11 - không có AC_PROG_CC_C11 nêu ra, và chỉ AC_PROG_CC_STDC thêm tùy chọn -std=gnu99 cho gcc thay vì -std=gnu11 hoặc -std=c11.

Bạn có thể thêm cờ biên dịch chỉ đơn giản bằng cách đặt

CFLAGS+=" -std=c11" 

trong configure.ac.

Ngoài ra, nó có thể là tốt hơn để kiểm tra đầu tiên nếu trình biên dịch hỗ trợ các tùy chọn bổ sung, và in cảnh báo bằng cách khác, cho người dùng tự thêm một tùy chọn tương đương với CFLAGS mà làm việc cho trình biên dịch của họ:

AX_CHECK_COMPILE_FLAG([-std=c11], 
    [AX_APPEND_FLAG([-std=c11])], 
    [AC_MSG_WARN([-std=c11 not supported, you may have to set CFLAGS to enable C11 support.]) 
]) 

Điều này sử dụng các macro AX_CHECK_COMPILE_FLAGAX_APPEND_FLAG được tìm thấy trong GNU Autoconf Archive. Để sử dụng chúng, hãy đặt chúng vào một thư mục con m4 và thêm AC_CONFIG_MACRO_DIR([m4]) để định cấu hình.ac

+1

Cách đơn giản hơn một chút, mặc dù không có tùy chọn để tùy chỉnh thông báo cảnh báo, là sử dụng: AX_APPEND_COMPILE_FLAGS ([- std = c11 -foo -bar]) – Eric

+1

'CFLAGS + =" -std = c11 "' - Bạn không nên thay đổi 'CFLAGS'. Người dùng sở hữu chúng, không phải Autoconf hoặc Automake. Câu trả lời nằm trong 'AM_CFLAGS' và các biến thể cho mỗi mục tiêu của nó, nhưng không có ai cung cấp câu trả lời cho nó. @Arjun đến gần, nhưng câu trả lời đã bị xóa. – jww

0

Chủ đề này được bao gồm trong hướng dẫn sử dụng Tự động, 27.6 Flag Variables Ordering. Có một sự tương tác giữa configure.acMakefile.am, và nó không chỉ là thiết lập một biến shell nổi tiếng được sử dụng trong các quy tắc tạo ngầm.

Tóm lại, bạn nên đặt nó trong một biến mới có tên là mumble_CFLAGS được thảo luận trong hướng dẫn sử dụng Automake. mumble chỉ là tên chương trình của bạn và thường là foo hoặc bar trong các ví dụ khác. Sau đó, khi makefile của bạn được tạo, công thức cho chương trình của bạn (mumble hoặc foo hoặc bar) sẽ sử dụng $(mumble_CFLAGS) $(CFLAGS) để tạo mục tiêu.

Dưới đây là ví dụ về cách nó có thể trông như thế nào. Thay vì sử dụng mumble hoặc foo hoặc bar, nó sử dụng my_prog làm tên tạo tác.

configure.ac:

# Perform a compile test using -std=gnu99, set has_gnu99 
if test "$has_gnu99" -eq "1"; then 
    AC_SUBST([MY_GNU99], [-std=gnu99]) 
fi 

Makefile.am:

bin_PROGRAMS = my_prog 
my_prog_CFLAGS = $(MY_GNU99) $(MY_ANOTHER_FLAG) $(MY_YET_ANOTHER_FLAG) ... 

Sau này, khi makefile được tạo ra, nó sẽ có một công thức tương tự như theo sau, trong đó $(MY_PROG_CFLAGS) được áp dụng cho tất cả các đối tượng xây dựng my_prog:

my_prog : 
    $(CC) $(CPPFLAGS) $(MY_PROG_CFLAGS) $(CFLAGS) -c $< -o [email protected] 

Các số khác của my_prog_CFLAGS cho phép bạn có nhiều cờ cho các mục tiêu khác nhau. Ví dụ: bạn có thể có một số my_prog_CFLAGS, my_archive_CFLAGSmy_sharedobj_CFLAGS.

Và không giới hạn ở số my_prog_CFLAGS. Bạn cũng có thể có my_prog_CPPFLAGS, my_prog_CXXFLAGS và các biến khác được sử dụng ngầm trong makefiles.


Đây là từ Automake manual:

Compile Cờ Biến

phần này cố gắng trả lời tất cả các câu hỏi trên.Chúng tôi sẽ chủ yếu thảo luận CPPFLAGS trong ví dụ của chúng tôi, nhưng thực sự là câu trả lời giữ cho tất cả những lá cờ biên dịch sử dụng trong Automake: CCASFLAGS, CFLAGS, CPPFLAGS, CXXFLAGS, FCFLAGS, FFLAGS, GCJFLAGS, LDFLAGS, LFLAGS, LIBTOOLFLAGS, OBJCFLAGS, OBJCXXFLAGS , RFLAGS, UPCFLAGS và YFLAGS.

CPPFLAGS, AM_CPPFLAGS, và mumble_CPPFLAGS ba biến thể được sử dụng để vượt qua những lá cờ để Preprocessor C (trên thực tế những biến cũng được sử dụng cho các ngôn ngữ khác như C++ hoặc xử lý trước Fortran). CPPFLAGS là biến người dùng (xem Biến người dùng), AM_CPPFLAGS là biến Automake và mumble_CPPFLAGS là biến số cụ thể cho mục tiêu bị mumble (chúng tôi gọi biến này là biến số mục tiêu , xem Biến số chương trình và thư viện).

Tự động luôn sử dụng hai trong số các biến này khi biên dịch nguồn C tệp. Khi biên dịch một tệp đối tượng cho mục tiêu mumble, biến số đầu tiên sẽ là mumble_CPPFLAGS nếu nó được xác định hoặc AM_CPPFLAGS nếu không. Biến thứ hai luôn là CPPFLAGS.

Trong ví dụ sau,

bin_PROGRAMS = foo bar 
foo_SOURCES = xyz.c 
bar_SOURCES = main.c 
foo_CPPFLAGS = -DFOO 
AM_CPPFLAGS = -DBAZ 

xyz.o sẽ được biên dịch với '$ (foo_CPPFLAGS) $ (CPPFLAGS)', (vì xyz.o là một phần của mục tiêu foo), trong khi chính .o sẽ được biên dịch với '$ (AM_CPPFLAGS) $ (CPPFLAGS)' (vì không có biến cho mỗi mục tiêu cho thanh mục tiêu).

Sự khác biệt giữa mumble_CPPFLAGS và AM_CPPFLAGS rõ ràng là đủ, hãy tập trung vào CPPFLAGS. CPPFLAGS là biến người dùng, tức là, biến số mà người dùng có quyền sửa đổi để biên dịch gói . Biến này, giống như nhiều biến khác, được ghi lại ở cuối đầu ra của ‘configure --help’.

Ví dụ, một người cần phải thêm/home/my/usr/include đến đường dẫn tìm kiếm các trình biên dịch của C sẽ cấu hình một gói với

./configure CPPFLAGS='-I /home/my/usr/include' 

và cờ này sẽ được truyền đến các quy tắc biên dịch của tất cả Makefiles.

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