[C]例によるMakefileの作成

2245 ワード

Makefileとは?


makeは、条件に従って所定のshellコマンドを実行するプログラムです.
この場合、コマンドを実行する条件を含むファイルをmakefileと呼びます.
ではShell Scriptでいいんじゃないですか?
Makefileは、変更されたソースファイルのみをコンパイルします.
Shell Scriptにプログラム全体をコンパイルさせます.
そのため、Makefileの方が効果的です.

NAME = libft.a
CC = gcc
CFLAG = -Wall -Wextra -Werror
RM = rm -f
AR = ar
ARFLAGS = rcs
INC = libft.h
SRCS = ft_isalpha.c ft_isdigit.c ...
OBJS = $(SRCS:.c=.o)

all : $(NAME)
$(NAME) : $(OBJ_FILES)
	$(AR) $(ARFLAGS) $@ $^
.c.o:
	$(CC) -I $(INC) $(CFLAG) -c -o $@ $<
clean:
	$(RM) $(OBJS)
fclean: clean
	$(RM) $(NAME)
re: fclean all
.PHONY : all clean fclean re
NAME(TARGET):最終的に作成するアーカイブ名
CC:コンパイルタイプ
CFAG:コンパイルオプション
RM:削除オプション
AR:ar(複数のオブジェクトを1つのアーカイブにマージ)
ARFLAGS:arオプション
  • r:新しいオブジェクトファイルの場合は追加、既存ファイルの場合は置換
  • c:アーカイブの作成時に標準エラー診断メッセージの出力を制限
  • s:アーカイブファイル情報を含むインデックスを作成します.
    -アーカイブインデックスを作成しないと、リンク速度が遅くなります.
  • INC:含まれるヘッダファイル
    SRCS:コンパイルするcファイル
    OBJS:objectファイル((src:.c=.o)コマンドSRCS用.cファイル.oに変換
    all:成果物
    .PHONY:targetにファイルが重なると、このコマンドが実行できないことを防止します.
    デフォルトのコマンドフォーマット
    target : dependency1 ....2 .... n
    	command1
        	command2
            
    $(NAME) : $(OBJ_FILES)
    	$(AR) $(ARFLAGS) $@ $^
        
    $(NAME) : target
    $(OBJ_FILES) : dependency1
    $(AR) $(ARFLAGS) $@ $^ : command 
    
    해석 : 다음과 같은 명령어로. dependency를 이용해 target을 생성함.
    실제 수행되는 명령어 : ar rcs libft.a ft_isalpha.o ...
    $@:ターゲット名に対応します.
    $<:依存ファイルリストの最初のファイルに対応します.
    $^:依存ファイルのリスト全体に対応します.
    $? : ターゲットより更新された依存ファイルに対応します.
    $+:$^と似ていますが、重複するすべてのファイル名が含まれています.
    拡張子ルール
    ファイル拡張子を表示し、適切な演算を実行するルール.
    .c.o:
    	$(CC) -I $(INC) $(CFLAG) -c -o $@ $<
    
    .c.o 표현은 .c와 .o 확장자를 가진 파일들을 확장자 규칙에 의거해서 처리될 수 있도록 표현된 것 이다.
    
    즉 아래 명령어를 통해 .c를 컴파일해서 .o를 만들어 내는 루틴이 자동적으로 동작한다.
    $(CC) -I $(INC) $(CFLAG) -c -o $@ $<
    
    실제 수행되는 명령어 : gcc -I libft.h -Wall -Wextra -Werror -c -o ft_isalpha.a ... .a ft_isalpha.c ... .c 

    リファレンス


    C++Makefileを噛む
    GNU Makeレッスン