Цель для 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) — это команда ссылки. $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 и другие подобные конструкции в сценарии работают правильно.

С простым «сделать» я получаю ошибку ссылки:

> 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 datLoad.o», когда цель не существует:

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

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

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


person Achim Schmitz    schedule 25.10.2013    source источник
comment
Вы обращались в службу поддержки Micro Focus? www.микрофокус.com   -  person Bill Woodger    schedule 25.10.2013
comment
Поскольку вы используете формат правила суффикса, я предполагаю, что вы использовали .SUFFIXES: .cbl .o, чтобы гарантировать, что .cbl является известным суффиксом. Я предлагаю вам запустить make -p и изучить вывод, чтобы убедиться, что правила, которые вы ожидаете, присутствуют, что переменная $O установлена ​​достаточно рано, чтобы иметь правильное значение, и т. д. Также вы можете запустить make -d и изучить вывод, чтобы понять, какие шаги make принимает, чтобы определить, устарела ли цель или нет.   -  person MadScientist    schedule 25.10.2013
comment
@Bill Woodger: Проблема была не в Micro Focus. Я дал эту информацию просто в качестве предыстории.   -  person Achim Schmitz    schedule 25.10.2013
comment
Идея заключалась в том, что у Micro Focus уже были клиенты, которые выбрали этот путь, и, вероятно, у них был контрольный список того, на что нужно обратить внимание. Вам хоть тут повезло.   -  person Bill Woodger    schedule 26.10.2013


Ответы (1)


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

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

Ахим

person Achim Schmitz    schedule 25.10.2013