Makefile 从同一目录编译*.C和*.S源代码';制作';

Makefile 从同一目录编译*.C和*.S源代码';制作';,makefile,gnu-make,Makefile,Gnu Make,我一直在处理一个只编译C源代码的项目,但我发现我也需要一些汇编程序,我不愿意将asm代码内联到C文件中,因为GCC可能无法正确解释它 我的前任为项目创建了makefile(抱歉,它相当长): 为了引入.S文件,我对对象进行了编辑,使其也包含ASM源(“*.S”) 但当使用“全部生成”重新编译时,我得到: $ make all make: *** No rule to make target `obj/asi_access.S', needed by `icu_asw'. Stop. 我想没有

我一直在处理一个只编译C源代码的项目,但我发现我也需要一些汇编程序,我不愿意将asm代码内联到C文件中,因为GCC可能无法正确解释它

我的前任为项目创建了makefile(抱歉,它相当长):

为了引入.S文件,我对对象进行了编辑,使其也包含ASM源(“*.S”)

但当使用“全部生成”重新编译时,我得到:

$ make all
make: *** No rule to make target `obj/asi_access.S', needed by `icu_asw'.  Stop.
我想没有人能发现我哪里出了问题?我想我没有正确地添加到对象行

谢谢表达式
$(var:.ext1=.ext2)
不按
.ext1
过滤,即

$(源代码:.$(srtext)=.$(OBJEXT))$(源代码:.$(astext)=.$(OBJEXT))
为测试源列表提供以下结果

a.o b.o c.S a.c b.c.o
也就是说,您复制了文件,并且在
对象
定义中有源文件

以下是正确的方法:

OBJECTS:=$(patsubst$(SRCDIR)/%,$(BUILDDIR)/%\
$(patsubst%.$(SRCEXT),%.$(OBJEXT)\
$(patsubst%.$(ASMEXT),%.$(OBJEXT),$(来源))\
) \
)

<强> Update:您应该考虑使用2个单独的对象列表,以便可以为它们应用不同的规则,例如

SOURCES\u C:=$(filter%.$(SRCEXT),$(SOURCES))
对象_C:=$(patsubst$(SRCDIR)/%,$(BUILDDIR)/%,$(源代码_C:%。$(SRCEXT)=%。$(OBJEXT)))
SOURCES_ASM:=$(筛选%。$(ASMEXT),$(源))
对象\u ASM:=$(patsubst$(SRCDIR)/%,$(BUILDDIR)/%,$(源\u ASM:%。$(astext)=%。$(OBJEXT)))
$(OBJECTS_C):$(BUILDDIR)/%.$(OBJEXT):$(SRCDIR)/%.$(SRCEXT)
.... C编译器配方。。。。
$(OBJECTS_ASM):$(BUILDDIR)/%.$(OBJEXT):$(SRCDIR)/%.$(astext)
.... 汇编程序配方。。。。
$(目标):$(对象_C)$(对象_ASM)|目录
表达式
$(var:.ext1=.ext2)
不按
.ext1
过滤,即

$(源代码:.$(srtext)=.$(OBJEXT))$(源代码:.$(astext)=.$(OBJEXT))
为测试源列表提供以下结果

a.o b.o c.S a.c b.c.o
也就是说,您复制了文件,并且在
对象
定义中有源文件

以下是正确的方法:

OBJECTS:=$(patsubst$(SRCDIR)/%,$(BUILDDIR)/%\
$(patsubst%.$(SRCEXT),%.$(OBJEXT)\
$(patsubst%.$(ASMEXT),%.$(OBJEXT),$(来源))\
) \
)

<强> Update:您应该考虑使用2个单独的对象列表,以便可以为它们应用不同的规则,例如

SOURCES\u C:=$(filter%.$(SRCEXT),$(SOURCES))
对象_C:=$(patsubst$(SRCDIR)/%,$(BUILDDIR)/%,$(源代码_C:%。$(SRCEXT)=%。$(OBJEXT)))
SOURCES_ASM:=$(筛选%。$(ASMEXT),$(源))
对象\u ASM:=$(patsubst$(SRCDIR)/%,$(BUILDDIR)/%,$(源\u ASM:%。$(astext)=%。$(OBJEXT)))
$(OBJECTS_C):$(BUILDDIR)/%.$(OBJEXT):$(SRCDIR)/%.$(SRCEXT)
.... C编译器配方。。。。
$(OBJECTS_ASM):$(BUILDDIR)/%.$(OBJEXT):$(SRCDIR)/%.$(astext)
.... 汇编程序配方。。。。
$(目标):$(对象_C)$(对象_ASM)|目录

Hmm,现在我得到了:make:**没有规则使目标
obj/asi\u访问',这是icu\u asw需要的。停止。我建议将
$(info OBJECTS'$(OBJECTS))
添加到makefile中,这样您就可以看到实际的变量内容。这比在黑暗中猜测可能的错误要容易得多。。。您可能在patsubst中有一个变量名输入错误,即
asi\u access.S
被替换为
asi\u access.
Ah ok,因此似乎每个文件扩展名都丢失了。对象的obj/asi_访问。obj/复制\u nocache。。。。等编辑:刚刚看到你的更新,所以将进一步探索。谢谢哦,对不起,我键入了
$(OBJECT)
而不是
$(OBJEXT)
:-/我会更新我的答案谢谢Stefan,我会更进一步,但我想现在我还必须编辑:-包括$(OBJECTS:.$(OBJEXT)=.$(DEPEXT))对象和对象。我可以在同一条线上同时接这两个电话吗?谢谢嗯,现在我得到了:make:**没有规则让target
obj/asi\u访问',icu\u asw需要。停止。我建议将
$(info OBJECTS'$(OBJECTS))
添加到makefile中,这样您就可以看到实际的变量内容。这比在黑暗中猜测可能的错误要容易得多。。。您可能在patsubst中有一个变量名输入错误,即
asi\u access.S
被替换为
asi\u access.
Ah ok,因此似乎每个文件扩展名都丢失了。对象的obj/asi_访问。obj/复制\u nocache。。。。等编辑:刚刚看到你的更新,所以将进一步探索。谢谢哦,对不起,我键入了
$(OBJECT)
而不是
$(OBJEXT)
:-/我会更新我的答案谢谢Stefan,我会更进一步,但我想现在我还必须编辑:-包括$(OBJECTS:.$(OBJEXT)=.$(DEPEXT))对象和对象。我可以在同一条线上同时接这两个电话吗?谢谢
SOURCES     := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT) -or -name *.$(ASMEXT))
OBJECTS     := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.$(OBJEXT)),$(SOURCES:.$(ASMEXT)=.$(OBJEXT)))
$ make all
make: *** No rule to make target `obj/asi_access.S', needed by `icu_asw'.  Stop.