2012-05-15 4 views
0

Я пытаюсь сделать свою платформу Makefiles условно с заявлениями типа:Платформа условного Makefiles

ifeq ($(UNAME), Linux) 
# LINUX version 
program_NAME := lib$(TARGET).so 
OBJDIR = ../build/linux 
endif 

ifeq ($(UNAME), MINGW32_NT-6.1) 
# WINDOWS version 
program_NAME := lib$(TARGET).dll 
OBJDIR = ../build/windows 
endif 

и:

ifeq ($(UNAME), Linux) 
# LINUX version 
program_INCLUDE_DIRS := \ 
    /home/ben/projects/g2/src \ 
    /home/ben/projects/pulse_IO/src \ 
    /home/ben/projects/core/src 

endif 

ifeq ($(UNAME), MINGW32_NT-6.1) 

# WINDOWS Virtual Machine version 
program_INCLUDE_DIRS := \ 
    E:/g2/src \ 
    E:/pulse_IO/src \ 
    E:/core/src 

endif 

Я тогда компилировать СРК либо под Linux или Windows 7 работает как VM (через виртуальный бокс) на ОС Linux. Проблема, которую мне не удалось решить, заключается в том, как получить объектные файлы и результирующие совместно используемые библиотеки или исполняемые файлы в конкретный каталог платформы, например. /build/linux или /build/windows, где исходный код находится в /src

Как вы можете видеть, я добавил OBJDIR переменные, но я не могу понять, как использовать, чтобы перенаправить .o, .so, .dll, .exe файлов в правильном реже условно на платформе. Я уверен, что это должно быть легко, но мое исследование продолжает увязнуть со статьями по использованию vpath, которые я не думаю, что я за ним.

Часть моей Makefile я думаю, что нужно изменить следующим образом:

LINK.c := $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) 

$(program_NAME): $(program_OBJS) 
    $(LINK.c) -shared -Wl,-soname,$(program_NAME) $(program_OBJS) -o $(program_NAME) 

я, вероятно, следует использовать что-то умнее, как Autotools или CMake, но это было бы здорово просто получить эту работу сейчас.

следует также добавить, мой список объектных файлов создается следующим образом:

program_C_OBJS := ${program_C_SRCS:.c=.o} 

Пытались:

program_OBJS := $(addprefix $(OBJDIR)/$program_C_OBJS) 

но сделать compains что addprefix имеет неправильный нет. аргументов

+0

реализованы в течение двух лет спустя, что я должен Проб был кросс-компиляции для окон на Linux хосте, вместо того, чтобы один условный Makefile, который может производить собственные исполняемые файлы под обе ОС – bph

ответ

1

Для gmake см Here:

OBJDIR := objdir 
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o) 

$(OBJDIR)/%.o : %.c 
     $(COMPILE.c) $(OUTPUT_OPTION) $< 

all: $(OBJS) 

$(OBJS): | $(OBJDIR) 

$(OBJDIR): 
     mkdir $(OBJDIR) 
1

Какой компилятор и набор инструментов вы используете? В случае QNX, он имеет макросы, такие как:

$OS 
$CPU 
$PRODUCT 
$PROJECT 
$SECTION 
$VARIANT ($VARIANTLIST, $EXCLUDE_VARIANTLIST) 

Они позволяют настроить целевую папку и имя файла для результатов сборки.

http://www.qnx.com/developers/docs/6.3.2/neutrino/prog/make_convent.html

Другие компиляторы/компилированные инструменты имеют схожие объекты.

+0

gcc под linux, mingw под окнами – bph

Смежные вопросы