Автоматическая компиляция из C или Objective- C источников - PullRequest
0 голосов
/ 12 апреля 2020

Я использую следующее для условной компиляции в automake примера программы amhello [1]:

В configure.ac:

AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_PROG_OBJC
build_linux=no
build_windows=no
build_mac=no
AC_CANONICAL_HOST
case "${host_os}" in
    cygwin*|mingw*)
        build_windows=yes;;
    darwin*)
        build_mac=yes;;
    *)
        build_linux=yes;;
esac
AM_CONDITIONAL([LINUX], [test "$build_linux" = "yes"])
AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"])
AM_CONDITIONAL([MACOS], [test "$build_mac" = "yes"])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
 Makefile
 src/Makefile
])
AC_OUTPUT

В src/Makefile.am:

bin_PROGRAMS = hello
hello_SOURCES = main.c
if MACOS
    hello_SOURCES += hello-mac.m
endif
if LINUX
    hello_SOURCES += hello-linux.c
endif

Он работает как положено, за исключением одной проблемы - даже при компиляции на Linux он пытается использовать набор сборки Objective- C вместо C. Побочным эффектом этого является то, что OBJCFLAGS используется вместо CFLAGS, что нелогично, поскольку исходный код Objective- C не компилируется при сборке для Linux. Демонстрация:

$ OBJCFLAGS="-DOBJCFLAGS" CFLAGS="-DCFLAGS" ./configure
...
$ make
make  all-recursive
make[1]: Entering directory '/'
Making all in src
make[2]: Entering directory '/src'
gcc -DHAVE_CONFIG_H -I. -I..     -DCFLAGS -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc -DHAVE_CONFIG_H -I. -I..     -DCFLAGS -MT hello-linux.o -MD -MP -MF .deps/hello-linux.Tpo -c -o hello-linux.o hello-linux.c
mv -f .deps/hello-linux.Tpo .deps/hello-linux.Po
gcc  -DOBJCFLAGS   -o hello main.o  hello-linux.o  
...

Из сгенерированного src/Makefile:

...
hello$(EXEEXT): $(hello_OBJECTS) $(hello_DEPENDENCIES) $(EXTRA_hello_DEPENDENCIES)
    @rm -f hello$(EXEEXT)
    $(AM_V_OBJCLD)$(OBJCLINK) $(hello_OBJECTS) $(hello_LDADD) $(LIBS)
...

Есть ли хороший способ использовать компилятор C / CFLAGS при сборке для Linux и можно ли использовать компилятор Objective- C / OBJCFLAGS только при сборке для MacOS (когда фактически должен быть собран исходный файл Objective- C)? Я попытался использовать оба подхода к условной компиляции, описанные в [2], но оба демонстрируют одинаковое поведение.

[1] https://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html#Creating -amhello

[2] https://www.gnu.org/software/automake/manual/html_node/Conditional-Sources.html#Conditional -Sources

...