makefile의 병렬성
shell
make -j 4 re
make에 -j 옵션을 주면 코어 수를 정할 수 있다.
- 클러스터 아이맥은 6코어인 걸로 알려져 있다.
- 이때 명령어들이 병렬적으로 실행되서 안되는 명령어가 발생할 수 있다.
예시 : make -j 4 re
다음과 같은 makefile이 있다고 쳐보자.
makefile
NAME = philo
CC = cc -g -Wall -Wextra -Werror -fsanitize=thread
SRCS = philo_main.c philo_util.c philo_util2.c \
philo_exe.c philo_check.c philo_input.c
OBJS = $(SRCS:.c=.o)
all : $(NAME)
$(NAME) : $(OBJS)
$(CC) $(OBJS) -o $(NAME)
clean :
rm -rf $(OBJS)
fclean : clean
rm -rf $(NAME)
re : fclean
make all
.PHONY : all clean fclean re
이때 make -j 4 re 의 결과는 다음과 같다.
shell
rm -rf philo_main.o philo_util.o philo_util2.o philo_exe.o philo_check.o philo_input.o
rm -rf philo
왜? 병렬로 돌기 때문이다. 즉, fclean과 all이 한번에 돌면서 object 파일의 소멸이 되던 중 생성이 됨.
따라서 소멸하는 명령만 실행이 될 수 밖에 없다.
그래서 그 대안으로 Makefile을 다음과 같이 바꿀 수 있다.
re 부분 중 all을 의존성이 아닌 실행부에 두면 된다.
makefile
NAME = philo
CC = cc -g -Wall -Wextra -Werror -fsanitize=thread
SRCS = philo_main.c philo_util.c philo_util2.c \
philo_exe.c philo_check.c philo_input.c
OBJS = $(SRCS:.c=.o)
all : $(NAME)
$(NAME) : $(OBJS)
$(CC) $(OBJS) -o $(NAME)
clean :
rm -rf $(OBJS)
fclean : clean
rm -rf $(NAME)
re : fclean
make all
.PHONY : all clean fclean re