Linux/Mac: какой хороший способ определить платформу во время компиляции?

Я хотел бы обобщить систему сборки для компиляции на нескольких (несколько похожих) платформах. Каков хороший метод для определения типа хоста, на котором выполняется сценарий оболочки или Makefile. Я хотел бы различать Mac и Linux, а также разные конкретные дистрибутивы Linux (например, RHEL, Ubuntu). Cygwin не важен для меня, но если вы включите его в свой ответ, я уверен, что другие сочтут его ценным.

Обоснование может включать использование типа хоста для получения и установки правильных версий двоичных пакетов, когда это удобнее, чем компилировать из исходного кода. Кроме того, некоторые коммерческие программы упакованы в виде бинарных файлов для определенных дистрибутивов, поэтому часть мотивации состоит в том, чтобы получить правильный бинарный файл.

Спасибо,

SetJmp


person Setjmp    schedule 08.02.2011    source источник
comment
Если вам нужно знать, какой дистрибутив вы используете, значит, что-то не так с вашим подходом.   -  person user562374    schedule 08.02.2011
comment
@ user562374 Некоторое программное обеспечение является коммерческим и / или упаковано для определенных дистрибутивов. Кроме того   -  person Setjmp    schedule 09.02.2011
comment
@ user562374 Некоторое программное обеспечение является коммерческим и / или упаковано для определенных дистрибутивов. Кроме того, для пакетов на основе исходного кода у меня может быть подход компиляции один раз, а затем везде rsync. Чтобы автоматизировать извлечение правильных бинарных пакетов, мне нужно было бы определить, какой вариант нужно захватить. (например, RHEL против Ubuntu).   -  person Setjmp    schedule 09.02.2011


Ответы (5)


Автоинструменты в помощь. В нем есть множество макросов, которые помогут вам в этом.

http://www.lrde.epita.fr/~adl/autotools.html

person rmk    schedule 08.02.2011
comment
Спасибо. Я думаю, что ОП должен изменить свой подход и искать то, что ему нужно, а не то, в какой системе он работает, чтобы его система сборки работала правильно. - person rmk; 08.02.2011
comment
rmk — Знакомы ли вы с макросами или методами autotools, которые отличают RHEL от Ubuntu? или RHEL и OpenSuse? - person Setjmp; 09.02.2011
comment
Повторю мою мысль: если вы используете автоинструменты для определения ОС/дистрибутива, вы делаете это неправильно. - person rmk; 09.02.2011
comment
РМК - Спасибо за ссылки. Мне интересно, как бы вы сделали это правильно? Если у вас хватит терпения и интереса перевести беседу в офлайн: andrewschein.com/contact.html - person Setjmp; 09.02.2011

uname -a, чтобы различать основные варианты *nix

Не совсем уверен, каким будет лучший способ отличить красную шляпу от ubuntu - можно поискать инструменты управления пакетами и запросить установленные пакеты, что в конечном итоге поможет вам сузить круг различных производных от Debian и т. д. Возможно, есть что-то более очевидное и заранее.

person Chris Stratton    schedule 08.02.2011

Варианты Linux обычно хранят информацию о дистрибутивах в /etc/issue.

большинство ядер помещают информацию в /proc/version

person Foo Bah    schedule 08.02.2011

Это не совсем просто. Вы можете использовать uname, чтобы узнать общие параметры, но различать дистрибутивы — более сложная задача. Может быть, вам следует подумать об использовании чего-то вроде autoconf, чтобы обобщить вашу систему сборки?

person Noufal Ibrahim    schedule 08.02.2011

На тот случай, если вы используете Qt, есть очень хороший набор определений, Q_OS_*, который поможет вам определить операционную систему, в которой вы компилируете:

Q_OS_AIX
Q_OS_BSD4
Q_OS_BSDI
Q_OS_CYGWIN
Q_OS_DARWIN
Q_OS_DGUX
Q_OS_DYNIX
Q_OS_FREEBSD
Q_OS_HPUX
Q_OS_HURD
Q_OS_IRIX
Q_OS_LINUX
Q_OS_LYNX
Q_OS_MAC
Q_OS_MSDOS
Q_OS_NETBSD
Q_OS_OS2
Q_OS_OPENBSD
Q_OS_OS2EMX
Q_OS_OSF
...

Они определены в QtGlobal. Существуют даже определения, помогающие определить, какой компилятор использовал Q_CC_* или целевую оконную систему Q_WS_*.

Но если вы не используете Qt и хотите использовать общий метод, вам, скорее всего, придется вернуться к Autotools или CMake.

Определить дистрибутив Linux довольно сложно, но несложно. Сначала вам нужно выяснить, какие дистрибутивы вас интересуют, а затем выполнить всевозможные проверки файлов/конфигурации конкретного дистрибутива, как в этот пример для тех, которые вы выбрали, так как вы не можете поддерживать все бесчисленное множество доступных дистрибутивов Linux. :-)

Что касается Mac, я позволю экспертам Mac ответить, но это не должно быть так сложно, поскольку, по крайней мере, проблема разнообразия не может быть и речи.

person Shinnok    schedule 08.02.2011