我对makefile有些问题。 我只想测试src / launcher.c上的编译是否失败。 但在此之前,我无法转换此bash代码:
out=$(gcc -c src/launcher.c -o /obj/launcher.o 2>&1)
到“Makefile code”
事实上,我想做出类似的东西: Handling gcc warnings and output in a Bash Script 但是在makefile中
如果你有一些想法,请。
CC = clang
RM = rm -f
NAME = automakefile
CFLAGS += -Wall -Wextra
CFLAGS += -O2 -march=native -fomit-frame-pointer
LDFLAGS +=
OBJS_DIR = ./obj/
SRCS_DIR = ./src/
INCLUDES += -I ./src/include
OBJS_FILES = launcher.o
OBJS = $(foreach obj,$(OBJS_FILES),$(OBJS_DIR)$(obj))
all: script $(NAME)
script:
@if [ ! -d "$(OBJS_DIR)" ]; then \
mkdir $(OBJS_DIR); \
fi
$(NAME): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $(NAME) $(LDFLAGS)
$(OBJS_DIR)%.o: $(SRCS_DIR)%.c
//This line isn't working!
$(eval TMP=$$(gcc -c src/launcher.c -o obj/launcher.o 2>&1))
echo $(TMP)
clean:
$(RM) $(OBJS)
fclean: clean
$(RM) $(NAME)
re: fclean all
.Phony: all script clean fclean re
由于 祝你有愉快的一天
答案 0 :(得分:1)
Make会在发生错误时自动停止编译过程,但是如果出现警告或没有发生任何不良事件,您可以使用消息:
$(OBJS_DIR)%.o: $(SRCS_DIR)%.c
@$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $< &>output
@if grep "warning" output >/dev/null ; then echo "$(<F) Warning" ; else echo "$(<F) OK" ; fi
@$(RM) output
你走了:
$(OBJS_DIR)%.o: $(SRCS_DIR)%.c
@if $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $< &>output; then \
if grep "warning" output >/dev/null; then \
echo "$(<F) Warning(s)"; \
else \
echo "$(<F) OK"; \
fi; \
else \
echo "$(<F) Error(s)"; \
fi
@$(RM) output
答案 1 :(得分:1)
停止目标失败,你不会比失败的编辑更进一步,所以你不会看到任何其他东西。
如果您希望&#34;沉默&#34;有点编译(所以你不会看到编译命令本身)你可以考虑使用我的silent make rules makefile之类的东西(基于最近的autotools中的静默支持)。
它不会隐藏编译命令本身的输出(警告等),但是对于成功/无警告的编译,无论如何都不应该输出太多的输出以及您可能希望看到的失败/警告它
如果您 想要在原始链接中执行某些操作,那么您需要确保隐藏gcc
中if
或类似内容中的错误代码返回(然后捕捉它)然后在配方的末尾再次退出,这样make仍然可以正确停止。
答案 2 :(得分:0)
最后,我用了一个小技巧:
@$(CC) $(CFLAGS) -c $^ -o $@ $(INCLUDES) \
&& echo -e "\033[33;1m=== Compilation $@ \tSUCCEED===\033[0m"\
|| echo -e "\033[1;31m=== Compilation $@ \tFAILED===\033[0m"