gpt4 book ai didi

c++ - 从 Unix 迁移到 Linux 时 Makefile Include 指令

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:51 25 4
gpt4 key购买 nike

我的任务是将古老的基于 C++ 的代码从 Unix 环境迁移到 Linux。该项目由多个 Makefile 组成,用于库的不同“模块”。我已经解决了一些问题,但是现在在使用 include 指令时遇到了问题。

显然,Makefile 的构造方式是为不同的文件使用单独 包含指令,并且它在 Unix 服务器中运行了多年。

例如:

include ../../../../util/genmake.def

processControl.slOBJS = processControl.o
outputControlOBJS = outputControl.o
inputControlOBJS = inputControl.o
cleanList = *.o *.C *.out processControl.sl outputControl inputControl

all: processControl.sl outputControl inputControl

processControl.sl: $(processControl.slOBJS)
include ../../../../util/genmake.slinc

outputControl: $(outputControlOBJS)
include ../../../../util/genmake.exeinc

inputControl: $(inputControlOBJS)
include ../../../../util/genmake.exeinc

include ../../../../util/genmake.inc

这里可以看到,tabbed includes,只引用指定的目标!它们是该目标的一部分。

但是,这个构造在 Linux 中不起作用,我得到这个错误:

include ../../../../util/genmake.slinc
make: include: Command not found
make: *** [processControl.sl] Error 127

显然我不能只删除选项卡,因为包含应该只针对那个目标...

所以,我尝试用 shell 'source' 命令替换它来获取包含的文件,例如:

        source ../../../../util/genmake.slinc

这显然不起作用,我还尝试将包含的代码直接引入包含文件(注释掉 include 命令)——这处理了与 Makefile 相关的错误,但这不是一个好的解决方案,因为它会迁移和维护它真的很困难,必须在整个项目中将相同的代码复制到所有模块中,然后当然我必须在所有文件中反射(reflect)每一个微小的变化。

有哪位 Make 专家可以就此问题提出建议吗?此外,通常欢迎就如何最好地完成此迁移任务提出任何建议 :)

谢谢!

编辑-额外信息:genmake.slinc 的内容:


#######################################################################
## This include will inherit the target and dependent files in
## a make file that inlcudes it.
## The inclusion of this file should look like:
##
## {target}: {dependent file list}
## include genmake.slinc
##
#######################################################################
@echo "----------------------------------------------------------------"
@echo " (G) Creating shared library $@ from $($(MaKeObJs:x=$(@)OBJS))";
@echo "----------------------------------------------------------------"
@echo "$(CPP) -b -o $@ $($(MaKeObJs:x=$(@)OBJS))"
@$(CPP) -b -o $@ $($(MaKeObJs:x=$(@)OBJS))
@echo " Moving shared library to $(SHLIBINSTALL) as lib$(@)"
@$(MV) $@ $(SHLIBINSTALL)/lib$(@)
@echo "----------------------------------------------------------------"

那些是@之前的制表符。

现在genmake.exeinc的内容:


#######################################################################
## This include will inherit the target and dependent files in
## a make file that inlcudes it.
## The inclusion of this file should look like:
##
## {target}: {dependent file list}
## include /opt/app/fba/util/genmake.exeinc
##
#######################################################################
@cp $(SHLIBINSTALL)/* $(TEMP_SHLIB_DIR)/.
@echo "----------------------------------------------------------------"
@echo " (G) Linking $($(MaKeObJs:x=$(@)OBJS)) to make $@ "
@echo " LDOPTS set to: $(LDOPTS)"
# @echo " $(PURIFY) $(LD) "
@echo " SHLIB Temp Path: $(TEMP_SHLIB_DIR)
@echo " FBA libraries: $(FBALIB)"
@echo " Application libraries: $(APPLIBS)"
$(PURIFY) $(LD) -o $@ $($(MaKeObJs:x=$(@)OBJS)) \
$(CXXOPTS) \
$(LDFLAGS) \
$(FBALIB) \
$(PROLDLIBS) \
`cat /usr/local/opt/oracle/product/t1c3d771/lib/ldflags` \
`cat /usr/local/opt/oracle/product/t1c3d771/lib/sysliblist` \
$(APPLIBS)
@echo " Moving executable to $(EXEINSTALL) "
@$(MV) $@ $(EXEINSTALL)
@echo "----------------------------------------------------------------"

如果我转到 Makefile,并删除包含的前导选项卡,我会收到此错误: ../../../../util/genmake.slinc:10: *** 命令在第一个目标之前开始。停止。

最佳答案

我让 gnumake 做所有处理的想法被证明是错误的。 HP-UX 11i Version 1 与最新 Linux build 的相关差异如下:

  • TABinclude 之前被默默忽略;现在它被解释为配方前缀,gnu make 尝试在您的机器上找到 include 可执行文件。

  • include in gnu make 悄悄地添加一个空行到合并的输出 在每个 包含文件(如MadScientist正确指出的),因此包含文件不能只包含配方语句。

如果包含的文件没有递归地使用相同的技巧(并且在您的示例中它们似乎是简单的操作,没有额外的 include 语句),您可以使用 awk 像这样即时准备合并的 Makefile:

awk '{ if (NF == 2 && $1 == "include") { while ((getline line < $2) > 0) print line ; close($2) } else print }' Makefile | make -f -

上面的脚本将处理您系统上的文件,无需编辑。

关于c++ - 从 Unix 迁移到 Linux 时 Makefile Include 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41573148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com