发生错误时如何在makefile中同时退出并记录文件中的数据

时间:2016-08-05 07:05:44

标签: c bash unix makefile

makefile

RUN_EXE = xyz.exe
SOME_DIR_PATH = ../folder1/

ifdef $(MAKECMDGOALS)
   ifeq ($(MAKECMDGOALS), "target_1")
      ABC = status.log
      ARGS_TO_EXE = "argc1"
   endif
   ifeq ($(MAKECMDGOALS), "target_1")
      ABC = file2.txt
      ARGS_TO_EXE = "argc2"
   endif
else
   ABC = status.log file2.txt
   ARGS_TO_EXE = ""
endif

 # phony define
.PHONY = default target_1 target_2 

# if target not mention run default
default: $(ABC)


target_1 target_2:$(ABC)

$(ABC):
      $(CD) $(SOME_DIR_PATH) && ( $(RUN_EXE) $(ARGS_TO_EXE) || (exit 1;)) 2>&1 | tee -a ../status.log; \

我有两个makefile使用第一个makefile我正在调用这个makefile。 如果出现一些错误,它应该成功返回到第一个makefile。

出于测试目的我在可执行文件中创建了一个错误我试图在读取模式下打开一个不存在的文件。所以我的可执行文件将通过错误,它将出来

当我给出

make target_1

错误:打开文件时出错(使用c printf函数,同样将在文件中)

make target_2 

错误:打开文件时出错(使用c printf函数,同样将在文件中)

但问题出现在这里

make

错误:错误打开文件(使用c printf函数,同样将在文件中)。 错误:错误打开文件(使用c printf函数,同样将在文件中)。

它应该在第一次打印后退出并成功登录status.log文件,但它没有发生。 AS $(ABC)包含两个目标status.log和file2.txt,因此在第一次运行时它尝试构建status.log,然后在第二次尝试构建file2.txt。

但我想如果第一次运行时出现错误,它应该返回第一个makefile并在status.log中记录错误,不应该运行file2.txt并使用exit 1出来

1 个答案:

答案 0 :(得分:0)

  

如果出现一些错误,它应该成功返回到第一个makefile。

您的第一个makefile可以使用-选项调用此makefile,例如

run_submake:
    -$(MAKE) <arguments>

这样就忽略了子制作中的错误。

您的规则似乎不正确。食谱必须产生一个文件(或多个文件)或虚假的目标。例如,应该有规则来生成status.logfile2.txt。你的makefile应该是这样的:

RUN_EXE := xyz.exe
SOME_DIR_PATH := ../folder1/
ARGS_TO_EXE := "argc1"

all : status.log file2.txt # The default target.
target_1: status.log
target_2: file2.txt

.PHONY: all target_1 target_2

status.log:
    ${CD} ${SOME_DIR_PATH} && ( $(RUN_EXE) $(ARGS_TO_EXE) | tee -a $@; exit $${PIPESTATUS[0]} )

file2.txt:
    # Add a recipe to produce file2.txt