STM32 빌드환경을 CubeIDE가 아닌 직접 빌드 시스템을 구성하여 개발중에 있다. 그런데 지난달 vscode c/c++ extension이 업데이트 되면서 ctag 기능이 동작하지 않는 것을 확인하였다. 당연히 난 extension 버그려니 했는데 지난주 업데이트 했음에도 문제가 해결되지 않았다. 임시방편으로 1.22.11 버전으로 롤백하여 사용하였는데 오늘 문제의 원인을 찾아 블로그에 정리해 둔다.
vscode에서 comiple_commands.json 기반의 ctag 기능이 활성화 되지 않으면 아래와 같이 소스 트랙킹에 아주 불편함을 느끼게 되기 때문에 이 문제는 반드시 extension이 수정되거나, 내가 문제의 원인을 찾아 수정해야 한다.
ctag가 안되려면 다 안되던가... 어떤 것은 트랙킹되고 어떤건 안되니 환장할 노릇이나 당연히 extension 버그라고 생각하였고, 빌드 후 생성된 compile_commands.json 파일을 살펴보아도 특이사항은 없었다. define이나 include path에는 전혀 문제가 되지 않았다.
만약 이것이 extension 문제라면 깃허브에 이슈가 리포팅되었을텐데, 이슈를 찾아보아도 나와 같은 문제가 발생하지 않았다. 아무리 생각해도 내가 구성한 빌드 환경에 문제가 있나 싶어 살펴본 결과, 빌드후 발생하는 extension 출력 문구로 하나의 힌트를 얻게 되었다.
분명 파일이 존재하는데 plus.c / stm32g4_hal_msp.c 파일 등을 찾을 수 없다고 하니 좀 이상했는데, macOS 환경의 특성 차이로 발생한 것을 알 수 있었다.
우선 macOS는 파티션 포멧시 따로 설정하지 않으면 리눅스와 다르게 윈도우처럼 대소문자를 구분하지 않는다. 그래서 macOS 환경에서 개발환경을 구성하다 보니, 이 부분을 관가하였다. 아래 내용은 칩셋별로 자동으로 빌드 파일을 설정할 수 있겠끔 하였는데 이것이 문제의 원인이 되었다.
위와 같이 칩셋별로 빌드 소스가 관리되어 Prefix를 설정하여 Chipset 변경이 있더라도 자동으로 설정되게 템플릿을 만들었는데 여기서 대소문자 구분이 되어 발생한 문제이다. 따라서 아래와 같이 Prefix를 소문자로 변화하여 간단히 해결하였다.
if (MODEL_DIR STREQUAL "PLUS")
set(STM32_ASMFILE "startup_stm32g484vetx.s")
set(STM32_CHIPSET "STM32G484")
set(STM32_GROUP "STM32G4")
set(STM32_HAL_DIR "STM32CubeG4")
set(STM32_LDFILE "STM32G484VETX_FLASH.ld")
endif()
# vscod extension 1.23.5 버전부터 compile_commands.json에서 대소문자 구분함
string(TOLOWER ${MODEL_DIR} MODEL_SRC)
string(TOLOWER ${STM32_GROUP} STM32_GROUP_SRC)
execute_process(
COMMAND git log -1 --format=%h
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE COMMITID
OUTPUT_STRIP_TRAILING_WHITESPACE
)
빌드에 사용되는 파일에 대해 Prefix가 동일할 경우 위와 같이 소문자로 변환하여 빌드 하도록 설정하면 compile_commands.json에서 ctag 기능이 안되는 기능은 없어진다.