Цель для make дает "ничего не поделаешь"

У меня проблема с "make" (О, ужас!).

Мы пытаемся перенести некоторый код COBOL из Windows в Linux. Компилятор и тому подобное от Micro Focus. Под Windows код разрабатывается с помощью Micro Focus Net Express. Linux использует Micro Focus Server Express в качестве аналога. Программы компилируются и связываются с использованием скриптов make.

Так много для фона.

Проблема в том, что скрипт "make" не хочет компилировать и связывать исполняемый файл под Linux. Цели выглядят так:

# HP INIT-Daten laden
#
datLoad$O:   \
        $(UI)/defretrn.cpy \
        $(UI)/e12sy00s.cpy \
        $(UI)/e12sy005.cpy \
        $(UI)/e12sy006.cpy \
        $(UI)/e12sy010.cpy \
        $(UI)/e12sy013.cpy \
        $(UI)/e12sy050.cpy \
        $(UI)/e12db001.cpy \
        $(UI)/e12db050.cpy \
        $(UI)/evlg.cpy \
        $(UI)/deffehl.cpy \
        datLoad.xcbl $(FRC)
#       @echo "dollar-O is \"$O\" in $@"


datLoad$X:  $(LIBDSQL) datLoad$O \
        $(LP)/evlg$O $(LP)/alock$O
    $(LCOB) -o $(@:$X=) -e $(@:$X=) $(LCOBFLAGS) \
        -d e12db001 -d e12db003 -d e12db012 \
        -d e12sy005 -d e12sy006 -d e12sy009 \
        -d e12sy010 -d e12sy012 -d e12sy013 \
        -d e12sy050 \
        -I EvLgSetCategory $(LP)/evlg$O \
        -I ALckSetDebug $(LP)/alock$O \
        $(LIBEXEEXT) "$(LIBXSQL)"
    if [ -f $B/$@ -a ! -w $B/$@ ] ; then rm -f $B/$@ ; fi
    cp $@ $B

Чтобы поместить это в контекст, $0=". O" (то есть расширение объектного файла). $(LCOB) - это команда link. $X=". Exe" (исполняемый файл... просто забудьте о расширении, мы исправим это в свое время). Все остальное относится к путям ==>, не относящимся к рассматриваемой проблеме, и, да, все они были проверены и проверены.

В конечном счете, я пытаюсь заставить "make" разрешить цель с именем "datLoad.o".

Включен второй скрипт "make", содержащий следующее:

COBFLAGS    = -cx # create object file
GNTFLAGS    =   -ug # create .gnt file
SOFLAGS     =   -z # create 
LCOB        = cob
...
.cbl$O:
    $(CCOB) $(COBFLAGS) $*.cbl, $*$O, NUL, NUL
    if [ -f $(LP)/$*$O -a ! -w $(LP)/$*$O ] ; then rm -f $(LP)/$*$O ; fi
    cp $*$O $(LP)

Соответствующей частью является цель, которая разрешается в ".cbl.o:". Да, это сокращенная версия, и она мне не очень нравится, но я не писал этот сценарий. Я уверен, что это действительно означает *.o:*.cbl и другие подобные конструкции в скрипте работают правильно.

При простом "make" я получаю ошибку ссылки:

> In function `cbi_entry_point': (.data+0x384): undefined reference to
> `datLoad' /tmp/cobwZipkt/%cob0.o: In function `main': (.text+0x28):
> undefined reference to `datLoad' make: *** [datLoad.exe] Error 1

Это означает, что datLoad.o не был создан. Если я создам это явно с:

 cob -cx datload

Тогда "make" по-прежнему выдает ту же ошибку, что и выше. Weird! Однако, что я действительно не могу понять, это ответ, который я получаю от "make datLoad.o", когда цель не существует:

make: Nothing to be done for `datLoad.o'.

Я предположил (господи, помоги мне), что целевой файл "datLoad.o" попытается создать требуемый целевой файл, если этот файл еще не существует. Я схожу с ума?

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

1 ответ

Спасибо, Безумный Ученый. Ваш совет был правильным.

Включенный.mk содержал правило.SUFFIXES. Проблема состояла в том, что $O не использовался последовательно. Первоначально для $O было установлено значение ".obj" для Windows. Под Linux это ".o". Однако в правиле.SUFFIXES было жестко закодировано ".obj", поэтому, конечно, цели ".o" не распознавались. Я заменил жестко закодированный суффикс переменной $O, и теперь он работает.

Ахим

Другие вопросы по тегам