LINUX.ORG.RU

make, кроссплатформенность и разделяемые либы


0

2

Юзал самописный Makefile для сборки основного проекта. Но вот, дело дошло до плагинов, которые выносятся в разделяемые библиотеки. С подключением проблем нет, кроссплатформенное решение - GModule от GLib. Но как собирать dll под Windows и so под Linux используя один только Makefile? Хотелось бы обойтись без autotools по возможности. Пока делаю все руками. Не то, чтобы не могу сам придумать решение, просто не хочу заниматься велосипедом. Кто как делает?


если gnu make, будет примерно так

OS=$(exec uname)

ifeq "$(OS)" "Linux" 
build=build_linux
else
build=build_other
endif

build: $(build)

build_linux:
  .....

build_other:
  .....

Skolotovich ★★★
()
Ответ на: комментарий от O02eg

либтул

Мне кажется, она была послана нам Столлманом за грехи наши, за то, что мы еще не избавились от проприетарного ПО.

buddhist ★★★★★
()
Ответ на: комментарий от O02eg

От всяких кривых либтулов уже тошнит.

Вещь, конечно, лажевая до чертиков, но дареному коню, как говорится...

nickey
() автор топика

make_functions:

# detect OS: WIN32/UNIX
# $(call detect-os,$(shell uname -s))
detect-os=$(if $(or $(findstring CYGWIN,$1),$(findstring MINGW,$1)),WIN32,UNIX)

------------
Makefile:

# detect environment we are running in
TARGET_OS:=$(call detect-os,$(shell uname -s))

---------------
ifeq «$(TARGET_OS)» «Linux»
LOCAL_LDFLAGS+= -lpthread
endif

например...

В сторону автотулзов начинать глядеть имеет смысл
если тебе хочется набрать config.h в котором будет
написано какие ф-ии в системе доступны, иначе большого
смысла.

Для автоматического выбора/проверки утилит можно
юзать что-то типа:

-----------
# Functions to verify required utilities are present:
# $(call check-toolvars,LIST_OF_VARS)
check-toolvars=$(foreach toolvar,$1,$(call check-toolvar,$(toolvar)))
# $(call check-toolvar,VAR)
check-toolvar=$(if $(call tool-present,$($1)),$(info $1=$(shell $(SHELL) -c «type -P $($1)»)),\
$(error Ooops, '$($1)' not found for $1. Run 'make $1=<path to $1>' to continue))

# $(call tool-present,NAME/PATH)
tool-present=$(if $(strip $(shell $(SHELL) -c «type -P $1»)),$1,)

generate-tool-list=$(foreach item,$1,$(call tool-present,$(item)))

one-of=$(word 1,$(call generate-tool-list,$1))
-------------------

....
MAKE := $(call one-of,gmake make mingw32-make)
QMAKE := $(call one-of,qmake qmake-qt4)


# List of required tools to verify before actual build
ALL_TOOLS:=CC CXX AR CP MV RM SED AWK TAR TEST MKDIR INSTALL MAKE QMAKE UIC MOC RCC

# Build system bootstrap: verify we have all required tools
TOOLS_OK :=$(call check-toolvars,$(ALL_TOOLS))

deadman ★★
()
Ответ на: комментарий от I-Love-Microsoft

qmake ушиблен от природы и годится только на то, чтобы собирать qt-приложения по предлагаемой схеме. Шаг в сторону - и ты начинаешь огребать массу проблем. Также не стоит забывать, что это генератор, а не конечное решение...

deadman ★★
()
Ответ на: комментарий от nickey

Ежели так, то откуда в библии строки ./configure && make && make install ?

  1. Ради ./configure на венды надо устанавливать MSYS.
  2. Как у autohell с поддержкой Visual C++?
  3. Библия не нужна.
Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Я использую gcc и под Linux, и под Win(mingw). MSYS тоже везде проставлен т. к. собираю GTK+, libCURL, libXML и прочее из исходников. Поэтому оно не проблема.

nickey
() автор топика
Ответ на: комментарий от Begemoth

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

O02eg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.