I have a makefile that compiles C source files into corresponding object files and then archives those object files. This is what the makefile looks like:-
.PHONY = all clean fclean re
SRC = ./src/
INC = ./inc
CC = gcc
CFLAGS = -I${INC} -Wall -Wextra -Werror
SRCS := $(wildcard ${SRC}*.c)
OBJS := $(patsubst ./src/%.c,%.o,${SRCS})
BINS := $(OBJS:%.o=%)
all: compile archive
archive:
@echo "creating archive..."
@ar cr libsst.a ${OBJS}
@echo "DONE!"
compile: ${BINS}
%: %.o
@echo "generating $<..."
%.o: ${SRC}%.c
@echo "compiling $<..."
@gcc -c $< ${CFLAGS}
fclean: clean
@echo "removing archive..."
@rm -f libsst.a
@echo "DONE!"
clean:
@echo "removing object files..."
@rm -f *.o
@echo "DONE!"
re: fclean all
The issue is that it runs an extra rm command at the end which is not specified in the recipe for either the compile or archive targets. This is the result I get upon running make:-
compiling src/sst_tolower.c...
generating sst_tolower.o...
compiling src/sst_strmapi.c...
generating sst_strmapi.o...
compiling src/sst_strrchr.c...
generating sst_strrchr.o...
compiling src/sst_strcat.c...
generating sst_strcat.o...
compiling src/sst_striteri.c...
generating sst_striteri.o...
compiling src/sst_atoi.c...
generating sst_atoi.o...
compiling src/sst_strncpy.c...
generating sst_strncpy.o...
compiling src/sst_lstdel.c...
generating sst_lstdel.o...
compiling src/sst_putstr.c...
generating sst_putstr.o...
compiling src/sst_isascii.c...
generating sst_isascii.o...
compiling src/sst_strnew.c...
generating sst_strnew.o...
compiling src/sst_toupper.c...
generating sst_toupper.o...
compiling src/sst_lstadd.c...
generating sst_lstadd.o...
compiling src/sst_putchar_fd.c...
generating sst_putchar_fd.o...
compiling src/sst_memccpy.c...
generating sst_memccpy.o...
compiling src/sst_strncat.c...
generating sst_strncat.o...
compiling src/sst_strsub.c...
generating sst_strsub.o...
compiling src/sst_strclr.c...
generating sst_strclr.o...
compiling src/sst_putnbr_fd.c...
generating sst_putnbr_fd.o...
compiling src/sst_memset.c...
generating sst_memset.o...
compiling src/sst_strdup.c...
generating sst_strdup.o...
compiling src/sst_lstiter.c...
generating sst_lstiter.o...
compiling src/sst_strmap.c...
generating sst_strmap.o...
compiling src/sst_putendl_fd.c...
generating sst_putendl_fd.o...
compiling src/sst_strlcat.c...
generating sst_strlcat.o...
compiling src/sst_strstr.c...
generating sst_strstr.o...
compiling src/sst_strchr.c...
generating sst_strchr.o...
compiling src/sst_strncmp.c...
generating sst_strncmp.o...
compiling src/sst_putchar.c...
generating sst_putchar.o...
compiling src/sst_strequ.c...
generating sst_strequ.o...
compiling src/sst_memmove.c...
generating sst_memmove.o...
compiling src/sst_strnequ.c...
generating sst_strnequ.o...
compiling src/sst_memchr.c...
generating sst_memchr.o...
compiling src/sst_striter.c...
generating sst_striter.o...
compiling src/sst_strdel.c...
generating sst_strdel.o...
compiling src/sst_memcpy.c...
generating sst_memcpy.o...
compiling src/sst_lstdelone.c...
generating sst_lstdelone.o...
compiling src/sst_putendl.c...
generating sst_putendl.o...
compiling src/sst_isprint.c...
generating sst_isprint.o...
compiling src/sst_strsplit.c...
generating sst_strsplit.o...
compiling src/sst_isdigit.c...
generating sst_isdigit.o...
compiling src/sst_lstnew.c...
generating sst_lstnew.o...
compiling src/sst_bzero.c...
generating sst_bzero.o...
compiling src/sst_itoa.c...
generating sst_itoa.o...
compiling src/sst_putnbr.c...
generating sst_putnbr.o...
compiling src/sst_lstmap.c...
generating sst_lstmap.o...
compiling src/sst_strlen.c...
generating sst_strlen.o...
compiling src/sst_strtrim.c...
generating sst_strtrim.o...
compiling src/sst_memcmp.c...
generating sst_memcmp.o...
compiling src/sst_memalloc.c...
generating sst_memalloc.o...
compiling src/sst_strjoin.c...
generating sst_strjoin.o...
compiling src/sst_memdel.c...
generating sst_memdel.o...
compiling src/sst_putstr_fd.c...
generating sst_putstr_fd.o...
compiling src/sst_isalnum.c...
generating sst_isalnum.o...
compiling src/sst_strcpy.c...
generating sst_strcpy.o...
compiling src/sst_isalpha.c...
generating sst_isalpha.o...
compiling src/sst_strnstr.c...
generating sst_strnstr.o...
compiling src/sst_strcmp.c...
generating sst_strcmp.o...
creating archive...
DONE!
rm sst_atoi.o sst_putendl.o sst_strmap.o sst_strtrim.o sst_putnbr.o sst_memdel.o sst_strequ.o sst_putendl_fd.o sst_strmapi.o sst_putstr.o sst_strclr.o sst_itoa.o sst_strlen.o sst_isdigit.o sst_memchr.o sst_memset.o sst_tolower.o sst_memalloc.o sst_strjoin.o sst_strrchr.o sst_strlcat.o sst_strncat.o sst_isprint.o sst_strcat.o sst_strchr.o sst_strsplit.o sst_putchar.o sst_memcpy.o sst_lstiter.o sst_lstnew.o sst_striter.o sst_putnbr_fd.o sst_bzero.o sst_isalpha.o sst_strsub.o sst_lstadd.o sst_strncpy.o sst_strcpy.o sst_isalnum.o sst_memcmp.o sst_strdup.o sst_lstdelone.o sst_lstdel.o sst_memmove.o sst_strnew.o sst_lstmap.o sst_toupper.o sst_striteri.o sst_strnstr.o sst_isascii.o sst_putstr_fd.o sst_strcmp.o sst_memccpy.o sst_strstr.o sst_strnequ.o sst_strdel.o sst_strncmp.o sst_putchar_fd.o
I cannot figure out how the makefile is executing the rm command in the end. It should stop after having archived the object files but instead it proceeds to remove the generated object files. Any answers would be of great help. Thanks!