Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 生成依赖项列表中的通配符_Makefile_Gnu Make - Fatal编程技术网

Makefile 生成依赖项列表中的通配符

Makefile 生成依赖项列表中的通配符,makefile,gnu-make,Makefile,Gnu Make,嘿,我正试图用不同的后缀同时构建一些文件。不知何故,似乎不可能在一行中做到这一点。我的makefile如下所示: ARCH=ar ARCHFLAGS=r F90=gfortran F90FLAGS=-O2 -Wall LDFLAGS=-llapack -lblas SRCF=/Users/pm/bin/src OBJF=/Users/pm/bin/objs MODF=/Users/pm/bin/mods LIBF=/Users/pm/bin/include SOURCES=a.f b.f90

嘿,我正试图用不同的后缀同时构建一些文件。不知何故,似乎不可能在一行中做到这一点。我的makefile如下所示:

ARCH=ar
ARCHFLAGS=r
F90=gfortran
F90FLAGS=-O2 -Wall
LDFLAGS=-llapack -lblas

SRCF=/Users/pm/bin/src
OBJF=/Users/pm/bin/objs
MODF=/Users/pm/bin/mods
LIBF=/Users/pm/bin/include

SOURCES=a.f b.f90 c.f90
OBJECTS=$(addprefix $(OBJF)/,$(addsuffix .o,$(basename $(SOURCES))))
MODULES=$(addprefix $(MODF)/,*.mod)
TARGET=lib_pm_math_lib.a

$(LIBF)/$(TARGET): $(OBJECTS)
    $(ARCH) $(ARCHFLAGS) $@ $(OBJECTS) $(MODULES)

obmod.clean :
    rm $(OBJECTS) $(MODULES)

clean :
    rm $(OBJECTS) $(MODULES) $(LIBF)/$(TARGET)

$(OBJECTS): $(OBJF)/%.o : $(addprefix $(SRCF)/,$(join %.,$(suffix $(SOURCES))))
    $(F90) $(F90FLAGS) $(LDFLAGS) -c $< -o$@ -J$(MODF)

#$(OBJECTS): $(OBJF)/%.o : $(subst .x, ,$(addprefix $(SRCF)/,$(addsuffix .x$(suffix $(SOURCES)),%)))
#   $(F90) $(F90FLAGS) $(LDFLAGS) -c $< -o$@ -J$(MODF)

#$(OBJECTS): $(OBJF)/%.o : $(SRCF)/%.f90
#   $(F90) $(F90FLAGS) $(LDFLAGS) -c $< -o $@ -J$(MODF)
ARCH=ar
ARCHFLAGS=r
F90=gfortran
F90FLAGS=-O2-墙壁
LDFLAGS=-llapack-lblas
SRCF=/Users/pm/bin/src
OBJF=/Users/pm/bin/objs
MODF=/Users/pm/bin/mods
LIBF=/Users/pm/bin/include
来源=a.f b.f90 c.f90
OBJECTS=$(addprefix$(OBJF)/,$(addsuffix.o,$(basename$(SOURCES)))
模块=$(addprefix$(MODF)/,*.mod)
TARGET=lib\u pm\u math\u lib.a
$(LIBF)/$(目标):$(对象)
$(拱门)$(拱门标志)$@$(对象)$(模块)
obmod.clean:
rm$(对象)$(模块)
清洁:
rm$(对象)$(模块)$(LIBF)/$(目标)
$(对象):$(OBJF)/%。o:$(addprefix$(SRCF)/,$(join%,$(suffix$(SOURCES)))
$(F90)$(F90FLAGS)$(LDFLAGS)-c$<-o$@-J$(MODF)
#$(对象):$(OBJF)/%.o:$(subst.x,$(addprefix$(SRCF)/,$(addsuffix.x$(suffix$(SOURCES)),%))
#$(F90)$(F90FLAGS)$(LDFLAGS)-c$<-o$@-J$(MODF)
#$(对象):$(OBJF)/%.o:$(SRCF)/%.f90
#$(F90)$(F90FLAGS)$(LDFLAGS)-c$<-o$@-J$(MODF)
如您所见,我已经设法定义了我的对象。但我无法创建一个对对象的建筑部分也有相同作用的构造。当然,我的第一次尝试是使用连接而不使用额外的点,但无论出于何种原因,这只会导致后缀。用一个点替换两个点也可以做到这一点。所以我迷路了。我命令输出的行是另一个有趣的尝试,并且是一个仅适用于.f90后缀的工作版本。事实上,我希望下面这样的东西能起作用:

$(OBJECTS): $(OBJF)/%.o : $(SRCF)/%.*
   $(F90) $(F90FLAGS) $(LDFLAGS) -c $< -o $@ -J$(MODF)
$(对象):$(OBJF)/%。o:$(SRCF)/%*
$(F90)$(F90FLAGS)$(LDFLAGS)-c$<-o$@-J$(MODF)

我希望不要太乱。我把整个文件都贴出来了,因为我敢打赌你们一定看到了其他问题,我到目前为止都没想到。提前谢谢

在这种情况下,我可能只使用两条规则:

$(OBJF)/%.o: $(SRCF)/%.f
    $(F90) $(F90FLAGS) $(LDFLAGS) -c $< -o$@ -J$(MODF)

$(OBJF)/%.o: $(SRCF)/%.f90
    $(F90) $(F90FLAGS) $(LDFLAGS) -c $< -o$@ -J$(MODF)
$(OBJF)/%.o:$(SRCF)/%.f
$(F90)$(F90FLAGS)$(LDFLAGS)-c$<-o$@-J$(MODF)
$(OBJF)/%.o:$(SRCF)/%.f90
$(F90)$(F90FLAGS)$(LDFLAGS)-c$<-o$@-J$(MODF)

您可以将它们合并为一个,但这并不真正值得努力。

如果我理解正确,您需要一个基于后缀的通配符规则,可以在多个文件后缀上运行。每个配方只能有一个通配符,因此无法直接执行。每个后缀都需要单独的规则

简单的解决方法是复制粘贴一条规则并更改后缀。当您开始有很多后缀时,这可能会变得难以管理。另一个选项是创建规则模板,并使用该模板为您动态生成规则:

# Template for build rules
# Pass a file extension for an argument
define build_rule
$(OBJF)/%.o: $(SRCF)/%.$(1)
    $(F90) $(F90FLAGS) $(LDFLAGS) -c $$< -o$$@ -J$(MODF)
endef

# Generate rules for each selected file extension
FILE_EXTS = f f90
$(foreach ext,$(FILE_EXTS),$(eval $(call build_rule,$(ext))))
#生成规则模板
#传递参数的文件扩展名
定义构建规则
$(OBJF)/%.o:$(SRCF)/%.$(1)
$(F90)$(F90FLAGS)$(LDFLAGS)-c$<-o$$@-J$(MODF)
恩德夫
#为每个选定的文件扩展名生成规则
文件\u EXTS=f f90
$(foreach ext,$(FILE_EXTS),$(eval$(call build_rule,$(ext)))
这将动态生成一个规则,该规则仅因输入文件上使用的文件扩展名而异。要支持新的文件扩展名,只需将其添加到
file\u EXTS
列表中即可


请注意,当make最初解析配方模板(在
调用中)时,它将展开变量。在配方实际执行之前,您必须将模板中的
$
加倍,以获得任何不希望进行扩展的内容(如
$@
$在easies中是的,这就解决了问题。当然,如何将它们组合起来会很有趣。但对我来说更重要的是,如何指定只编译对象列表中提到的对象。可能因此有必要将这两个步骤组合起来。@PeMa:你似乎没有o对Make的工作原理有错误的想法。假设有另一个源文件,
src/d.f90
;Make在你构建
lib\u pm\u math\u lib.a
时不会对它做任何事情。当你键入
Make objs/d.o
时,你想让Make做什么?是的,我已经知道了。bta在他(或她)的信中说得很清楚编辑。这是我的第一个制作文件,所以我不完全处于制作的思维方式。非常感谢!有趣的是,没有直接的方法,但您的解决方案仍然非常令人满意。