Допустим, у меня есть функция "foo", которую я реализую для нескольких операционных систем. Существует общий способ сделать это, но если ОС имеет встроенную поддержку для этого, то я хочу использовать это.
Как условно скомпилировать только нужные исходные файлы с помощью автоинструментов?
Пример:
Допустим, «foo» - это «перезагрузить компьютер».
В Linux я бы использовал reboot () и поместил бы это в reboot_reboot.c, где я определяю myreboot (), просто вызовите reboot () с правильными параметрами.
На всех BSD я бы использовал bsd_made_up_blah_reboot (), который принимает разные параметры. Я бы положил это в reboot_bsd_made_up_blah_reboot.c, который делает это. (это всего лишь пример, я знаю, что BSD имеют перезагрузку ())
Иначе, используйте reboot_generic.c, который просто вызывает систему («shutdown -i6 -g0»). (Да, давайте проигнорируем синтаксис для различных двоичных файлов завершения работы)
В configure.ac я могу проверить наличие «перезагрузки», «bsd_made_up_blah_reboot», а затем в Makefile.am сделать:
if HAVE_REBOOT
blah_SOURCES += reboot_reboot.c
else
if HAVE_BSD_MADE_UP_BLAH_REBOOT
blah_SOURCES += reboot_bsd_made_up_blah_reboot.c
else
blah_SOURCES += reboot_generic.c
endif
endif
Мне это не нравится, так как (насколько я понимаю) в Makefile.am нет «else if», и с ростом числа реализаций он будет становиться все уродливее и уродливее.
Какой правильный способ сделать это? Имейте в виду, что я хочу защитить от будущей системы, имеющей и reboot (), и bsd_made_up_blah_reboot (), поэтому я не могу просто включить обе.