День добрый.
Возник вопрос:
как сделать чтобы при сборке собирались конкретные файлы в зависимости от платформы, на которой запущен Makefile?
Т.е. проще: как мне сделать чтобы работало следующее:
#ifdef LINUXx86
...
#include "lin86/tcplib.h"
...
#endif
#ifdef LINUXx64
...
#include "lin64/tcplib.h"
...
#endif
#ifdef WINDOWSx86
...
#include "win86/tcplib.h"
...
#endif
Ну и так далее... Желательно не просто определить вин или линь это, а также к примеру семейство линуксов — убунту/кубунту/дебиан, генту, федора/редхет, сюз/мандрива и тд и версию БСД (если используется БСД)
Пока что идея только аutotools и uname -a
Но что делать в винде? Или может есть более простой способ?
Заранее спасибо за ответы. (можно просто ткнуть мордой в ссылку на нужный материал)
Здравствуйте, alsemm, Вы писали:
A>Здравствуйте, madproger, Вы писали:
M>>Но что делать в винде? Или может есть более простой способ?
A>cygwin?
А чем мне поможет cygwin? у меня скажем к примеру два класса реализующих одинаковый интерфейс для работы, к примеру с сокетами, под линь/БСД это юникс-сокеты, под виндоуз какие то ее библиотеки (пока еще не знаю точно какие), интерфейс, как я уже заметил выше у обоих классов идентичен, соответственно я могу использовать эти классы (включая нужный в зависимости от системы) в остальной части программы, не особо заботясь как они работают... cygwin же насколько я знаю это просто крутой эмулятор юниксов под виндой (с gcc, gmake и тд), и чем он мне поможет если программа будет использоваться на системе где нет этого эмулятора?
Самый простой вариант поставить идентичные IDE под линь и вынь, и прописать разные настройки в них (разные пути к либам, инклюд-файлам) и пусть IDE само компилит... Но этот путь абсолютно исключает распространение исходников, потому как мануал по сборке (в крупном проекте) превысит все мыслимые нормы....
Здравствуйте, madproger, Вы писали:
M>Здравствуйте, alsemm, Вы писали:
A>>Здравствуйте, madproger, Вы писали:
M>>>Но что делать в винде? Или может есть более простой способ?
A>>cygwin?
M> А чем мне поможет cygwin?
Тем что в нем есть make. Напишешь в своих makefile-ах что-то вроде:
__UNAMEBASE := $(shell uname | tr A-Z a-z)
ifneq ($(filter cygwin%,$(__UNAMEBASE)),)
UNAME := cygwin
else
ifneq ($(filter mingw%,$(__UNAMEBASE)),)
UNAME := mingw
else
ifneq ($(filter windows%,$(__UNAMEBASE)),)
UNAME := win
else
UNAME := unix
endif
endif
endif
Что делать с UNAME дальше, думаю понятно.
Я бы посоветовал обратить внимание на CMake, там подобные задачи решаются очень просто. Пример:
set (HEADERS header1.h header2.h)
if (WIN32)
set (HEADERS ${HEADERS} win32.h)
elseif (APPLE)
set (HEADERS ${HEADERS} apple.h)
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
if (${CMAKE_SYSTEM_NAME} MATCHES "fc8")
set (HEADERS ${HEADERS} fedora8.h)
else ()
set (HEADERS ${HEADERS} linux.h)
endif ()
else ()
message (FATAL_ERROR "System not supported")
endif ()
Думаю тут все понятно.