LINUX.ORG.RU

Automake. Надо написать хитрый Makefile.am


0

0

Вопрос к специалистам по automake. В Xorg есть драйвер карточек S3. 
Когда переходили от системы сборки Imake, то потеряли при переходе 
правила компиляции этого драйвера. А компилировался он хитро. Среди
исходных текстов есть такой файл s3_accel.c, который надо 
компилировать дважды: один раз с переменной S3_NEWMMIO=1 и получить на
 выходе, предположим, s3_newmmio.o, а другой раз -- с переменной 
S3_NEWMMIO=0 и получить на выходе s3_pio.o. А потом надо эти два 
объектника вместе с остальными вместе слинковать. Вот сколько не 
бьюсь, не получается написать Makefile.am корректный. Получился пока 
грязный хак. То есть я  удалил из списка исходников s3_accel.c, а 
правила компиляции просто методом китайских программистов "копипаст" 
выдрал из уже сгенеренных Makefile.in для других файлов, что, 
разумеется, некорректно. Но работает. Но так как мне надо патч на 
freedesktop.org отправить, я не хочу хаки пубиковать. Вот мой вариант:


AM_CFLAGS = @XORG_CFLAGS@
s3_drv_la_LTLIBRARIES = s3_drv.la
s3_drv_la_LDFLAGS = -module -avoid-version
s3_drv_ladir = @moduledir@/drivers

s3_drv_la_SOURCES = \
         newmmio.h \
         s3_exa.c \
         s3_bios.c \
         s3_cursor.c \
         s3_dga.c \
         s3_driver.c \
         s3.h \
         s3_IBMRGB.c \
         s3_reg.h \
         s3_Ti.c \
         s3_Trio64DAC.c \
         s3_video.c

EXTRA_s3_drv_la_SOURCES = s3_accel.c
s3_drv_la_LIBADD = s3_accel_newmmio.lo s3_accel_pio.lo

s3_accel_newmmio.lo: s3_accel.c
        if $(LTCOMPILE) -DS3_NEWMMIO=1 -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
        then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi

s3_accel_pio.lo: s3_accel.c
        if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
        then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi

Как сделать корректно? В Imake вообще хитро делалось. Там сначала этот
 Imake генерил два разных исходника из одного при разных переменных 
препроцессора, а потом уже компилил это все хозяйство. Спасибо!
★★★★★

Мне бы хотелось вместо этой дряни выдранной

s3_accel_newmmio.lo: s3_accel.c
        if $(LTCOMPILE) -DS3_NEWMMIO=1 -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
        then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi

иметь что-то вроде такого:

s3_accel_newmmio_lo_SOURCES = s3_accel.c
s3_accel_newmmio_lo_LDFLAGS = -S3_NEWMMIO=1

s3_accel_pio_lo_SOURCES = s3_accel.c
s3_accel_pio_lo_LDFLAGS = -S3_NEWMMIO=0

Но это все работает только для *.la, а не для *.lo. На _lo_ ругается 
libtool. _lo_ -- это not valid libtool object. Вроде так было. Не 
перепроверял

Zubok ★★★★★
() автор топика
Ответ на: комментарий от anonymous

>noinst_LTLIBRARIES= s3_accel_newmmio.la s3_accel_pio.la

А-а-а-а-а! Да! Это оно! Огромное спасибо за noinst_LTLIBRARIES! Это
именно то, что я пропустил. С _la_ у меня получалось и ранее,
но основная проблема была в отсутвии именно этого noinst. Надеюсь, что
вы в списках тех, которые выживут после страшного суда. Чтобы не 
перепутали с остальными анонимами, скажите на входе "Я Makefile.am 
помог написать человеку, то есть помог людям, у которых драйвер не
работает." :)

Конечный вариант:

AM_CFLAGS = @XORG_CFLAGS@
s3_drv_la_LTLIBRARIES = s3_drv.la
s3_drv_la_LDFLAGS = -module -avoid-version
s3_drv_ladir = @moduledir@/drivers

s3_drv_la_SOURCES = \
         newmmio.h \
         s3_bios.c \
         s3_cursor.c \
         s3_dga.c \
         s3_driver.c \
         s3.h \
         s3_IBMRGB.c \
         s3_reg.h \
         s3_Ti.c \
         s3_Trio64DAC.c \
         s3_video.c

noinst_LTLIBRARIES = libs3_accel_newmmio.la libs3_accel_pio.la
s3_drv_la_LIBADD = libs3_accel_newmmio.la libs3_accel_pio.la

libs3_accel_newmmio_la_SOURCES = s3_accel.c
libs3_accel_newmmio_la_CFLAGS = $(AM_CFLAGS) -DS3_NEWMMIO=1

libs3_accel_pio_la_SOURCES = s3_accel.c
libs3_accel_pio_la_CFLAGS = $(AM_CFLAGS)

Уже не так страшно. Можно отсылать. :)

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