linux - make 的目标给出 "nothing to be done"

标签 linux makefile cobol microfocus

我对“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 和脚本中的其他类似结构可以正常工作。

通过一个简单的“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”仍然给出与上面相同的错误。诡异的!然而,我真正无法理解的是当目标存在时我从“make datLoad.o”得到的响应:

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

我假设(老天保佑)目标“datLoad.o”会尝试创建所需的目标文件,如果该文件不存在的话。我要疯了吗?

抱歉,如果这看起来有点晦涩,我不确定如何更好地表达它。如果有人知道可能会发生什么,我将非常感激......

最佳答案

谢谢疯狂科学家。你的提示是正确的。

包含的 .mk 包含一个 .SUFFIXES 规则。问题是 $O 没有被一致使用。对于 Windows,$O 最初设置为“.obj”。在 Linux 下它是“.o”。但是,.SUFFIXES 规则将“.obj”硬编码到其中,因此当然无法识别“.o”目标。我用 $O 变量替换了硬编码后缀,它现在可以工作了。

阿金

关于linux - make 的目标给出 "nothing to be done",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19585914/

相关文章:

linux - 在引导过程后检查操作系统是否启动

linux - sed流编辑器unix linux命令: how to keep retain a paragraph with a particular text string

xcode - 我如何通过 xcode "make install"?

从 C 程序调用 COBOL 程序,错误 LNKG2019 : unresolved external symbol _verkoop referenced in function _main

antlr4 - Cobol - 解析 cobol 程序中的组项

linux - 无法在 "/bin/verilator"期间打开 perl 脚本 'make test'

linux - 使用 bash 脚本终止在另一个终端中运行的进程并关闭终端

shell - 在 makefile 中运行脚本

linux - 移植 Qt 项目,调试/发布配置?

cobol - 可变 block 格式和固定 block 格式有什么区别?