Цель для 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, и теперь он работает.
Ахим