빌드 플래그는 컴파일러에 전달하는 옵션.
코드 수정 없이 동작을 바꿀 수 있다.
기본 사용법
[env:esp32]
platform = espressif32
board = esp32dev
framework = arduino
build_flags =
-D DEBUG_MODE
-D VERSION=123
-D는 매크로 정의.
코드에서 사용
#include <Arduino.h>
void setup() {
Serial.begin(115200);
#ifdef DEBUG_MODE
Serial.println("Debug mode enabled");
#endif
Serial.print("Version: ");
Serial.println(VERSION); // 123 출력
}
void loop() {
}
문자열 전달
따옴표 이스케이프 필요:
build_flags =
-D DEVICE_NAME=\"ESP32-Dev\"
-D WIFI_SSID=\"MyNetwork\"
Serial.println(DEVICE_NAME); // "ESP32-Dev" 출력
자주 쓰는 플래그
디버그 레벨 (ESP32)
build_flags =
-D CORE_DEBUG_LEVEL=5 ; 모든 로그
; 0=None, 1=Error, 2=Warn, 3=Info, 4=Debug, 5=Verbose
최적화 레벨
build_flags =
-O0 ; 최적화 없음 (디버깅용)
-O2 ; 속도 최적화
-Os ; 크기 최적화 (기본값)
-O3 ; 최대 속도 최적화
경고 설정
build_flags =
-Wall ; 모든 경고 켜기
-Wextra ; 추가 경고
-Werror ; 경고를 에러로
-Wno-unused-variable ; 특정 경고 끄기
조건부 컴파일 패턴
기능 토글
; 개발용
[env:dev]
build_flags =
-D DEBUG_MODE
-D FEATURE_WIFI
-D FEATURE_BLUETOOTH
; 릴리즈용
[env:release]
build_flags =
-D FEATURE_WIFI
; 블루투스 제외
void setup() {
#ifdef FEATURE_WIFI
initWiFi();
#endif
#ifdef FEATURE_BLUETOOTH
initBluetooth();
#endif
#ifdef DEBUG_MODE
Serial.println("Debug build");
#endif
}
하드웨어 버전
[env:v1]
build_flags = -D HARDWARE_VERSION=1
[env:v2]
build_flags = -D HARDWARE_VERSION=2
#if HARDWARE_VERSION == 1
#define LED_PIN 13
#elif HARDWARE_VERSION == 2
#define LED_PIN 2
#endif
build_unflags
기존 플래그 제거:
build_flags = -Os ; 기본 최적화
build_unflags = -Os ; 제거
build_flags = -O0 ; 다른 걸로 교체
환경별 플래그
[env]
build_flags =
-D COMMON_FLAG
[env:esp32]
build_flags =
${env.build_flags} ; 공통 상속
-D ESP32_FLAG
[env:uno]
build_flags =
${env.build_flags}
-D ARDUINO_FLAG
인클루드 경로 추가
build_flags =
-I include/mylib
-I lib/external/include
헤더 파일 검색 경로 추가.
소스 정의 추가
build_src_flags =
-D SRC_ONLY_FLAG
src/ 폴더 파일에만 적용. 라이브러리엔 적용 안 됨.
실제 예시
BMS 프로젝트
[env:bms_dev]
platform = ststm32
board = genericSTM32F103VE
framework = arduino
build_flags =
-D DEBUG_MODE
-D CELL_COUNT=24
-D BALANCE_THRESHOLD=50
-D CAN_SPEED=500000
-D SERIAL_DEBUG
[env:bms_release]
platform = ststm32
board = genericSTM32F103VE
framework = arduino
build_flags =
-D CELL_COUNT=24
-D BALANCE_THRESHOLD=30
-D CAN_SPEED=500000
; DEBUG 없음
ESP32 웹서버
[env:webserver]
platform = espressif32
board = esp32dev
framework = arduino
build_flags =
-D WIFI_SSID=\"MyNetwork\"
-D WIFI_PASS=\"MyPassword\"
-D WEB_PORT=80
-D ASYNC_TCP_SSL_ENABLED=0
-D CONFIG_ASYNC_TCP_QUEUE_SIZE=128
외부 파일에서 읽기
build_flags =
!python scripts/get_version.py
스크립트 실행 결과를 플래그로.
# scripts/get_version.py
import subprocess
version = subprocess.check_output(['git', 'describe', '--tags']).strip()
print(f"-D GIT_VERSION=\\\"{version.decode()}\\\"")
정리
| 용도 | 플래그 |
|---|---|
| 매크로 정의 | -D NAME |
| 값 있는 매크로 | -D NAME=VALUE |
| 문자열 매크로 | -D NAME=\"string\" |
| 최적화 | -O0, -Os, -O2 |
| 경고 | -Wall, -Werror |
| 인클루드 경로 | -I path |
다음 글에서 디버깅.