$$@” $(CXX)$(CPP_标志)$(LFLAGS)-c$,makefile,pgi,Makefile,Pgi" /> $$@” $(CXX)$(CPP_标志)$(LFLAGS)-c$,makefile,pgi,Makefile,Pgi" />

Makefile 我可以控制c+;的.d独立性文件的输出目录吗+;项目 我的C++项目有以下通用的Mag文件。我最近将编译器从GNU转换为PGI编译器,发现依赖项文件不再存储在BUILD_路径中,而是存储在SRC_路径中。我是否可以保存所有文件以生成路径来保持src文件夹的干净 OBJECTS = $(SOURCES:$(SRC_PATH)/%.$(SRC_EXT)=$(BUILD_PATH)/%.o) DEP = $(OBJECTS:.o=.d) CPP_FLAGS = -std=c++11 -g -Wall -MD .PHONY: default_target default_target: release .PHONY: release release: dirs @$(MAKE) all .PHONY: dirs dirs: @echo "Creating directories" @mkdir -p $(dir $(OBJECTS)) @mkdir -p $(BIN_PATH) .PHONY: clean clean: @echo "Deleting $(BIN_NAME) symlink" @$(RM) $(BIN_NAME) @echo "Deleting directories" @$(RM) -r $(BUILD_PATH) @$(RM) -r $(BIN_PATH) @$(RM) $(DEPS) # checks the executable and symlinks to the output .PHONY: all all: $(BIN_PATH)/$(BIN_NAME) @echo "Making symlink: $(BIN_NAME) -> $<" @$(RM) $(BIN_NAME) @ln -s $(BIN_PATH)/$(BIN_NAME) $(BIN_NAME) # Creation of the executable $(BIN_PATH)/$(BIN_NAME): $(OBJECTS) @echo "Linking: $@" $(CXX) $(CPPFLAGS) $(LFLAGS) -o $@ $(OBJECTS) $(LIBS) # Add dependency files, if they exist -include $(DEPS) # Source file rules # After the first compilation they will be joined with the rules from the # dependency files to provide header dependencies $(BUILD_PATH)/%.o: $(SRC_PATH)/%.$(SRC_EXT) @echo "Compiling: $< -> $@" $(CXX) $(CPP_FLAGS) $(LFLAGS) -c $< -o $@ $(LIBS) OBJECTS=$(源代码:$(SRC\u路径)/% DEP=$(对象:.o=.d) CPP_FLAGS=-std=c++11-g-Wall-MD .PHONY:默认_目标 默认_目标:发布 .虚假:释放 发布:dirs @美元(全部) .冒牌货:迪尔斯 目录: @回显“创建目录” @mkdir-p$(dir$(对象)) @mkdir-p$(BIN_路径) .假冒:干净 清洁: @echo“删除$(BIN_名称)符号链接” @$(RM)$(银行名称) @回显“删除目录” @$(RM)-r$(构建路径) @$(RM)-r$(BIN_路径) @$(RM)$(DEPS) #检查输出的可执行文件和符号链接 冒牌货:全部 全部:$(BIN\u路径)/$(BIN\u名称) @echo“生成符号链接:$(BIN_名称)->$$@” $(CXX)$(CPP_标志)$(LFLAGS)-c$

Makefile 我可以控制c+;的.d独立性文件的输出目录吗+;项目 我的C++项目有以下通用的Mag文件。我最近将编译器从GNU转换为PGI编译器,发现依赖项文件不再存储在BUILD_路径中,而是存储在SRC_路径中。我是否可以保存所有文件以生成路径来保持src文件夹的干净 OBJECTS = $(SOURCES:$(SRC_PATH)/%.$(SRC_EXT)=$(BUILD_PATH)/%.o) DEP = $(OBJECTS:.o=.d) CPP_FLAGS = -std=c++11 -g -Wall -MD .PHONY: default_target default_target: release .PHONY: release release: dirs @$(MAKE) all .PHONY: dirs dirs: @echo "Creating directories" @mkdir -p $(dir $(OBJECTS)) @mkdir -p $(BIN_PATH) .PHONY: clean clean: @echo "Deleting $(BIN_NAME) symlink" @$(RM) $(BIN_NAME) @echo "Deleting directories" @$(RM) -r $(BUILD_PATH) @$(RM) -r $(BIN_PATH) @$(RM) $(DEPS) # checks the executable and symlinks to the output .PHONY: all all: $(BIN_PATH)/$(BIN_NAME) @echo "Making symlink: $(BIN_NAME) -> $<" @$(RM) $(BIN_NAME) @ln -s $(BIN_PATH)/$(BIN_NAME) $(BIN_NAME) # Creation of the executable $(BIN_PATH)/$(BIN_NAME): $(OBJECTS) @echo "Linking: $@" $(CXX) $(CPPFLAGS) $(LFLAGS) -o $@ $(OBJECTS) $(LIBS) # Add dependency files, if they exist -include $(DEPS) # Source file rules # After the first compilation they will be joined with the rules from the # dependency files to provide header dependencies $(BUILD_PATH)/%.o: $(SRC_PATH)/%.$(SRC_EXT) @echo "Compiling: $< -> $@" $(CXX) $(CPP_FLAGS) $(LFLAGS) -c $< -o $@ $(LIBS) OBJECTS=$(源代码:$(SRC\u路径)/% DEP=$(对象:.o=.d) CPP_FLAGS=-std=c++11-g-Wall-MD .PHONY:默认_目标 默认_目标:发布 .虚假:释放 发布:dirs @美元(全部) .冒牌货:迪尔斯 目录: @回显“创建目录” @mkdir-p$(dir$(对象)) @mkdir-p$(BIN_路径) .假冒:干净 清洁: @echo“删除$(BIN_名称)符号链接” @$(RM)$(银行名称) @回显“删除目录” @$(RM)-r$(构建路径) @$(RM)-r$(BIN_路径) @$(RM)$(DEPS) #检查输出的可执行文件和符号链接 冒牌货:全部 全部:$(BIN\u路径)/$(BIN\u名称) @echo“生成符号链接:$(BIN_名称)->$$@” $(CXX)$(CPP_标志)$(LFLAGS)-c$,makefile,pgi,Makefile,Pgi,编译器描述'-MD': -MD生成make依赖项列表并将其打印到file.d文件中,其中file是编译文件的根名称 它不提供任何控制位置的选项。同样地,GCC: -MD-MD相当于-M-MF文件,只是没有暗示-E。驱动程序确定文件 基于是否给出了-o选项。如果是,则驱动程序使用其参数,但带有 后缀为.d,否则它采用输入文件的名称,将删除任何目录组件 和后缀,并应用a.d后缀 表面上,有两种选择: 在“%.o”规则中,如果在生成路径的SRC中创建,则将命令添加到“.d”的“mv”中 使用'-M'添

编译器描述'-MD':

-MD生成make依赖项列表并将其打印到file.d文件中,其中file是编译文件的根名称

它不提供任何控制位置的选项。同样地,
GCC

-MD-MD相当于-M-MF文件,只是没有暗示-E。驱动程序确定文件 基于是否给出了-o选项。如果是,则驱动程序使用其参数,但带有 后缀为.d,否则它采用输入文件的名称,将删除任何目录组件 和后缀,并应用a.d后缀

表面上,有两种选择:

  • 在“%.o”规则中,如果在生成路径的SRC中创建,则将命令添加到“.d”的“mv”中
  • 使用'-M'添加显式规则,并将标准输出重定向到BUILD_PATH文件夹
  • 我认为#1更容易:

    $(BUILD_PATH)/%.o: $(SRC_PATH)/%.$(SRC_EXT)
        @echo "Compiling: $< -> $@"
        $(CXX) $(CPP_FLAGS) $(LFLAGS) -c $< -o $@ $(LIBS) 
        [ -f "${^D}/$*.d" ] && mv -f "${^D}/${*}.d" "${@D}/" || true
    
    $(构建路径)/%.o:$(SRC\u路径)/%.$(SRC\u扩展)
    @echo“编译:$<->$@”
    $(CXX)$(CPP_标志)$(LFLAGS)-c$<-o$@$(LIBS)
    [-f“${^D}/$*.D”]&&mv-f“${^D}/${*}.D”“${@D}/”|真
    
    无法使用PGI编译器(我没有PGI编译器)进行测试,因此我希望它能真正工作