Makefile:“make”失败,但“make -d”和“make -n + hand execution”有效

时间:2014-12-03 10:09:13

标签: debugging module makefile fortran

一个简单的Makefile有一个奇怪的行为......它正在杀了我。 总结一下:

_“make”产生错误

_“make -n”+手工执行(-n显示make执行的命令,然后在终端上一个接一个地执行每个命令)

_“make -d”有效(-d只显示调试信息!)

我尝试使用一些模块编译Fortran代码

这是我的makefile(只有七个.f90源文件):

F90 = gfortran  # Fortran Compiler 
FLAGS=          # Compiler flags
LDFLAGS =       #Linker flags

OBJ_DIR_NAME := obj
SRC_DIR_NAME := src
BIN_DIR_NAME := bin

PWD :=  $(shell pwd)
OBJ_DIR := $(PWD)/$(OBJ_DIR_NAME)
SRC_DIR := $(PWD)/$(SRC_DIR_NAME)
BIN_DIR := $(PWD)/$(BIN_DIR_NAME)

# List of source files 
SRC := $(wildcard $(SRC_DIR)/*.f90)

# List of object files :
NAME := $(basename $(notdir $(SRC)))
OBJ := $(addprefix $(OBJ_DIR)/, $(addsuffix .o, $(NAME)))

# To make the executable
all: make_directory $(OBJ)
    $(F90) -o $(BIN_DIR)/$(EXEC) $(OBJ) $(LDFLAGS) 

# Rule to make directories
make_directory: dirobj bin

# Create all .o and .mod from the .f90 found
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.f90
    $(F90) -J$(OBJ_DIR) -I$(OBJ_DIR) -c $< -o $@ $(FLAGS)

.PHONY: dirobj bin

# Create the directory $(OBJ_DIR) if needed :
ifeq ($(strip $( $(wildcard $(OBJ_DIR)) ) ), )
dirobj: 
    mkdir -p $(OBJ_DIR)
else
dirobj: 
endif

# Create the directory $(BIN_DIR) if needed :
ifeq ($(strip $( $(wildcard $(BIN_DIR)) ) ), )
bin: 
    mkdir -p $(BIN_DIR)
else
bin: 
endif 

.PHONY: clean purge 

# Clean remove all .o and .mod
clean:
    rm -rf $(OBJ_DIR)
# Clean + remove executable
purge: clean
    rm -rf $(BIN_DIR) $(OBJ_DIR) OUTPUT_FILES

这些是“make”所做的命令:

gfortran -J./obj -I./obj -c src/define_derivative_matrix.f90 -o obj/define_derivative_matrix.o 
gfortran -J./obj -I./obj -c src/gaussm3.f90 -o obj/gaussm3.o 
gfortran -J./obj -I./obj -c src/gll_library.f90 -o obj/gll_library.o 
gfortran -J./obj -I./obj -c src/lagrange_poly.f90 -o obj/lagrange_poly.o
gfortran -J./obj -I./obj -c src/modules.f90 -o obj/modules.o 
gfortran -J./obj -I./obj -c src/source_time_function.f90 -o obj/source_time_function.o
gfortran -J./obj -I./obj -c src/specfem1d.f90 -o obj/specfem1d.o
gfortran -o bin/xspecfem1d obj/*.o 

它会产生以下错误消息:

  use grid
    1
Fatal Error: Can't open module file 'grid.mod' for reading at (1): No such file or directory

错误消息来自:

gfortran -J./obj -I./obj -c src/specfem1d.f90 -o obj/specfem1d.o

这需要obj / grid.mod创建:

gfortran -J./obj -I./obj -c src/modules.f90 -o obj/modules.o 

但是这个文件已经正确创建了! (它位于obj /“make”的末尾) 如果我手动一个接一个地运行每个命令,一切都很完美!甚至“make -d”也有效......但不是“make”......

你见过这样的问题吗?就好像make不会等待前面命令的结束来执行其他命令。谢谢你的帮助!

干杯

编辑:我通过在

之前添加一个小“睡眠”来解决这个问题
gfortran -J./obj -I./obj -c src/modules.f90 -o obj/modules.o

但我不应该在一个完美的世界中这样做......

0 个答案:

没有答案