我被委托将基于古老的C ++代码从Unix环境迁移到Linux。该项目由多个Makefile组成,用于库的不同“模块”。我已经解决了一些问题,但现在在include指令方面遇到了麻烦。
显然,Makefile的构建方式是为不同的文件使用单独的include指令,并且在Unix服务器上运行多年没有问题。
例如:
您可以在这里看到,选项卡包括仅引用指定的目标!它们是该目标配方的一部分。
然而,在Linux中,此结构不起作用,我收到以下错误:
这似乎不起作用,我还尝试直接将包含的代码带入包含文件中(注释掉包含命令)- 这处理了与Makefile相关的错误,但这并不是好的解决方案,因为在整个项目中复制相同的代码到所有模块中会很难迁移和维护,当然每次微小的更改都必须反映在所有文件中。
请问是否有任何Make专家可以就此问题提供建议?同时,欢迎提供关于如何最好地处理此迁移任务的任何建议 :)
谢谢!
编辑-额外信息: genmake.slinc的内容:
如果我去Makefile,删除包含的前导制表符,就会出现以下错误: ../../../../util/genmake.slinc:10: *** commands commence before first target. Stop.
显然,Makefile的构建方式是为不同的文件使用单独的include指令,并且在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
您可以在这里看到,选项卡包括仅引用指定的目标!它们是该目标配方的一部分。
然而,在Linux中,此结构不起作用,我收到以下错误:
include ../../../../util/genmake.slinc
make: include: Command not found
make: *** [processControl.sl] Error 127
显然我不能仅仅删除这个选项卡,因为这个包含应该只针对该目标...
所以,我尝试用shell的'source'命令替换它来引入包含的文件,就像这样:
source ../../../../util/genmake.slinc
这似乎不起作用,我还尝试直接将包含的代码带入包含文件中(注释掉包含命令)- 这处理了与Makefile相关的错误,但这并不是好的解决方案,因为在整个项目中复制相同的代码到所有模块中会很难迁移和维护,当然每次微小的更改都必须反映在所有文件中。
请问是否有任何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: *** commands commence before first target. Stop.