web-gelistirme-sc.com

Bir autotools projesine -std = gnu99 gibi bir CFLAG nereye eklenir

Basit bir Autotools C projesi var (C++ değil).

CFLAG'ler (inceleme ile) -g -O2 gibi görünüyor.

Oluşturulan tüm marka dosyalarının da CFLAG'lara -std=gnu99 eklenmiş olmasını istiyorum, çünkü for (int i = 0; i < MAX; i++) ve benzerlerini kullanıyorum.

Belli ki Makefile’i hackleyebiliyorum ama bu ./configure üzerine yazıyor.

Kodun gerektirdiği CFL'leri eklemek (veya değiştirmek) doğru yer neresidir (kullanıcının değiştirmek isteyebileceği CFLAG'lerin aksine)?

(Bunun kısmi bir kopyası olduğuna dikkat edin: Nerede -std = gnu99 gibi bir CFLAG (Eclipse CDT) autotools projesine eklenir istemediğim Eclipse'e özgü yanıtlar alırken.)


@ DevSolar'ın cevabı henüz yardımcı olmadı. Bir configure.ac dosyası (altta) configure komut dosyasını (ayrıca altta) oluşturur.

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 yapılandırması

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'
23
fadedbee

autoconf bunun için bir makroya sahip:

Sadece koy:

AC_PROG_CC_STDC

AC_PROG_CC'nizden sonra her şey doğru olacaktır.

Özellikle -std=gnu99'su olmayan ancak varsayılan olarak C99 modunda çalışan (veya hpcc'nin -AC99'su farklı bir seçeneğe sahipse) başka derleyiciler kullandığınızda.

Ben böyle bir şey içinDEĞILCFLAGS kullanırdım.

dokümanlardan :

- Makro: AC_PROG_CC_STDC 
 Eğer C derleyici ISO Standard C'yi (şu anda C99) derleyemezse, 
, Çalışması için `CC 'değişkenini çıkış seçeneği sunmayı deneyin. 
, Derleyici C99'u desteklemiyorsa, ANSI 
 C89 (ISO C90). 
 
 Desteklemeye geri dönün. Bu makroyu çağırdıktan sonra C derleyicisinin olup olmadığını kontrol edebilirsiniz. 
, Standart C'yi kabul edecek şekilde ayarlandı; değilse, Shell değişkeni 
 `ac_cv_prog_cc_stdc '` hayır' olarak ayarlanır.
26
hroptatyr

CFLAGS'a derleyici seçenekleri eklemek yerine AC_PROG_CC_STDC gibi bir makro kullanmak tercih edilse de, autoconf şu anda C11 derleyici desteğini mümkün kılan makrolara sahip değildir - henüz AC_PROG_CC_C11 yoktur ve AC_PROG_CC_STDC, -std=gnu99 veya -std=gnu11 yerine sadece gcc için -std=c11 seçeneğini ekler.

Derleyici bayraklarını basitçe ekleyerek ekleyebilirsiniz

CFLAGS+=" -std=c11"

configure.ac içinde.

Alternatif olarak, önce derleyicinin eklenen seçeneği destekleyip desteklemediğini kontrol etmek ve aksi takdirde bir uyarı yazdırmak, kullanıcıya derleyicileri için çalışan CFLAGS'a eşdeğer bir seçeneği elle eklemesini söyleyerek daha iyi olabilir:

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.])
])

Bu, GNU Autoconf Archive 'de bulunan AX_CHECK_COMPILE_FLAG ve AX_APPEND_FLAG makrolarını kullanır. Bunları kullanmak için, onları bir m4 alt dizinine yerleştirin ve configure.ac dosyasına AC_CONFIG_MACRO_DIR([m4]) ekleyin.

1
dpi

Bu konu, Automake manual, 27.6 Bayrak Değişkenleri Siparişini Verme . configure.ac ve Makefile.am arasında bir etkileşim var ve bunun üstü kapalı kurallarda kullanılan iyi bilinen bir Shell değişkenini ayarlamaktan daha fazlası.

Kısacası, Automake kılavuzunda tartışılan mumble_CFLAGS gibi bir şey adı verilen yeni bir değişkene ayarlamanız gerekir. mumble, programınızın adıdır ve diğer örneklerde genellikle foo veya bar'dır. Daha sonra, makefile dosyanız oluşturulduğunda, programınızın tarifi (mumble veya foo veya bar), hedefi oluşturmak için $(mumble_CFLAGS) $(CFLAGS) işlevini kullanır.

İşte nasıl görünebileceğine bir örnek. mumble veya foo veya bar kullanmak yerine, yapay bir ad olarak my_prog öğesini kullanır.

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

Make.de.am:

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

Daha sonra, makefile dosyası oluşturulduğunda, aşağıdakine benzer bir tarifi olacaktır; burada $(MY_PROG_CFLAGS), my_prog dosyasını oluşturan tüm nesnelere uygulanır:

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

my_prog_CFLAGS dosyasının ekstra indirmeleri, farklı hedefler için birden fazla bayrak almanıza izin verir. Örneğin, bir my_prog_CFLAGS, bir my_archive_CFLAGS ve bir my_sharedobj_CFLAGS olabilir.

Ve my_prog_CFLAGS ile sınırlı değil. Ayrıca, my_prog_CPPFLAGS, my_prog_CXXFLAGS ve makefiles öğelerinde dolaylı olarak kullanılan diğer değişkenlere sahip olabilirsiniz.


Bu, Automake manual : dan

Bayrak Değişkenlerini Derleme

Bu bölüm yukarıdaki tüm soruları cevaplamaya çalışır. Çoğunlukla CPPFLAGS'ı örneklerimizde tartışacağız, ancak aslında cevap Automake'da kullanılan tüm derleme bayrakları için . Cevapları: CCASFLAGS, CFLAGS, CPPFLAGS, CXXFLAGS, FCFLAGS, FFLAGS, GCJFLAGS, LDFLAGS, LFLAGS, LIBTOOLFLAGS, OBJCFLAGS, OBJCXXFLAGS, RFLAGS, UPCFLAGS ve YFLAGS.

CPPFLAGS, AM_CPPFLAGS ve mumble_CPPFLAGS, Öğelerinin C önişlemcisine bayrak iletmek için kullanabileceği üç değişkendir (aslında bu Değişkenleri, C++ veya önişlemeli Fortran gibi diğer diller için de kullanılır. ). CPPFLAGS kullanıcı değişkenidir (bkz. Kullanıcı Değişkenleri), AM_CPPFLAGS, Automake değişkenidir ve mumble_CPPFLAGS, mumble hedefe özgü Değişkenidir (buna hedef başına diyoruz. değişkeni, bkz. Program ve Kütüphane Değişkenleri).

Automake, C kaynakları Dosyalarını derlerken daima bu değişkenlerden ikisini kullanır. Mumble hedefi için bir nesne dosyası derlenirken, ilk Değişkeni tanımlanmışsa mumble_CPPFLAGS veya aksi takdirde AM_CPPFLAGS Olacaktır. İkinci değişken daima CPPFLAGS'dir.

Aşağıdaki örnekte,

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

xyz.o '$ (foo_CPPFLAGS) $ (CPPFLAGS)' ile derlenecek (çünkü xyz.o foo hedefinin bir parçası), main.o ise ile derlenecek. $ (AM_CPPFLAGS) $ (CPPFLAGS) '' (çünkü hedef çubuk için hedef başına değişken Yoktur).

Mumble_CPPFLAGS ve AM_CPPFLAGS arasındaki fark yeterince açık , CPPFLAGS'a odaklanalım. CPPFLAGS bir kullanıcı değişkeni, yani Paketini derlemek için kullanıcıların değiştirmeye yetkili olduğu bir Değişkenidir. Bu değişken, diğerleri gibi, Sonunda ‘configure --help’ çıktısı ile belgelenmiştir.

Örneğin, C/.____.] Derleyicisinin arama yoluna/home/my/usr/include eklemesi gereken biri bir paketi yapılandırabilir

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

ve bu bayrak tüm Makefiles dosyalarının derleme kurallarına yayılacaktı.

0
jww