한량처럼 살고 싶다

IDS 프로젝트 - MAKEFILE 작성하기 본문

C C++/IDS 개발 - C

IDS 프로젝트 - MAKEFILE 작성하기

투영 2024. 4. 22. 09:02

명령어로 이렇게 한 줄 계속 치면서 실행하니까 손 아파서 메이크파일을 만들었다.

gcc IDS.c queue.c readpacket.c detectpacket.c logpacket.c -o IDS.out -g -lpthread -lpcap -lnsl -D_BSD_SOURCE -lsqlite3

 

조건

  • 컴파일러(CC): gcc
  • 컴파일러옵션(CFLAGS): -g -O2 -Wall -D_BSD_SOURCE
    • -g: 디버그 정보를 포함하도록 컴파일한다. 프로그램 실행 시 디버깅이 용이하게 됨
    • -O2: 최적화 수준, 숫자가 높을수록 더 많은 최적화가 수행되는데 컴파일 시간이 오래걸릴 수 있음
    • -Wall: 모든 경고 메세지를 출력한다. (잠재적 오류 해결 가능)
    • -D_BSD_SOURCE: 프로그램을 BSD 환경에서 컴파일 할 때 필요한 메크로 정의
  • 라이브러리(LIBS)
    • - lpthread: 멀티스레드 환경에서 필요한 라이브러리
    • - lpcap: 네트워크 패킷을 캡처하고 분석하는데 사용되는 라이브러리
    • - lnsl: 소켓 통신 및 네트워크 프로토콜 구현에 사용됨
    • - lsqlite3: sqlite3 라이브러리
  • 프로세스 실행 순서: preprocess 이후 $(TARGET)

 

Makefile

 

위에서 말한 것들을 다 아래에 넣으면 이렇게 된다

.PHONY: all clean preprocess

CC = gcc
CFLAGS = -g -O2 -Wall -D_BSD_SOURCE
LIBS = -lpthread -lpcap -lnsl -lsqlite3
TARGET = IDS.out

SRCS = IDS.c queue.c readpacket.c detectpacket.c logpacket.c
OBJS = $(SRCS:.c=.o)

all: preprocess $(TARGET)

$(TARGET): $(OBJS)
        $(CC) $(CFLAGS) -o $@ $^ $(LIBS)

%.o: %.c
        $(CC) $(CFLAGS) -c $< -o $@

preprocess:
        ./check_and_move.sh

clean:
        rm -f $(OBJS) $(TARGET)

 

사실 아직도 저 .PHONY가 이해가 안 간다

 

- preprocess는 프로그램 실행 전에 먼저 실행되어야 할 파일이다 (하단에 코드 있음)

 

- $(TARGET): $(OBJS) 제일 위에 있는 한 줄 짜리 명령어를 기호로 치환한 것과 같다

-> gcc [컴파일러 옵션] -o [아웃파일] [의존파일] [라이브러리]

-> $(CC) $(CFLAGS) -o $@ $^ $(LIBS) //여기서 $^는 모든 의존 파일 목록을 의미, 링킹할 오브젝트 파일을 의미한다

 

- clean: 오브젝트 파일과 타겟파일 (.out)을 없앤다

 

이게 preprocess 에 있는 쉘 스크립트 -> processed_packets 에서 packets로 파일을 옮긴다

#!/bin/bash

if [ "$(ls -A ./processed_packets)" ]; then
    mv ./processed_packets/* packets
fi

 

실행 방법

make //makefile 실행 (타겟파일 생성)
make clean //옵젝파일 + 아웃파일 삭제