๐ก ๋ณธ ๋ฌธ์๋ '[Linux] C++ ์ปดํ์ผ๋ฌ์ ๋ํ์ฌ (feat. clang/LLVM, clang-format, clang-tidy)'์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
C++ ํ์ผ์ ์ปดํ์ผํ๊ธฐ ์ํด์ ๋ง์ด ์ฌ์ฉํ๋ ์ปดํ์ผ๋ฌ๋ gcc์ clang์ ๋๋ค. ๋ณธ ๋ฌธ์์๋ clang์ ๋ํ ์ค๋ช ๋ฐ ๊ด๋ จ ๋๊ตฌ๋ค์ ๋ํด ์ ๋ฆฌํ์์ผ๋ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
About clang
C, C++, Obejctive-C, Obejctive-C++ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ํ ์ปดํ์ผ๋ฌ ํ๋ก ํธ์๋์ด๋ฉฐ, LLVM์ ๋ฐฑ์๋๋ก ์ฌ์ฉํ๋ฉฐ LLVM 2.6 ์ดํ๋ก ๋ฆด๋ฆฌ์ฆ์ ์ผ๋ถ๋ก ์๋ฆฌ์ก์ผ๋ฉฐ, GCC(GNU ์ปดํ์ผ๋ฌ ๋ชจ์)๋ฅผ ๋์ฒดํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๋ค.
ํ์ฌ GCC๊ฐ GPLv3๋ฅผ ์ ์ฉํ ์ดํ ์์ค ์ฝ๋ ๊ณต๊ฐ๋ฅผ ๊บผ๋ฆฌ๋ ๊ธฐ์ ๋ค์ด ํ๋๋์ฉ LLVM/Clang (UIUC License: ์์ค์ฝ๋ ๊ณต๊ฐ ์๋ฌด ์์)์ ์ง์ํ๊ณ ์์ต๋๋ค.
- LLVM
- ์ปดํ์ผ๋ฌ๋ ํ๋ก ํธ์๋-๋ฏธ๋ค์๋-๋ฐฑ์๋์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ,
LLVM์ ์ํคํ ์ฒ๋ณ๋ก ๋ถ๋ฆฌ๋ ๋ชจ๋์ ๋ฏธ๋ค์๋-๋ฐฑ์๋๋ฅผ ์ค์ ์ผ๋ก ํ๊ณ ์์ต๋๋ค. - ๋ฐ๋ผ์ LLVM์ ํ๋ก ํธ์๋๊ฐ ์ฌ๋ฌ๊ฐ์ง ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค์ ์ค๊ฐ ํํ ์ฝ๋๋ก ๋ฐ๊ฟ๋์ผ๋ฉด,
์ด๋ฅผ ๊ฐ๊ฐ์ ์ํคํ ์ฒ์ ๋ง๊ฒ ์ต์ ํํ์ฌ ์คํ์ด ๊ฐ๋ฅํ ํํ๋ก ๋ฐ๊พธ๋ ๋ฐฉ์์ ๋๋ค.
- ์ปดํ์ผ๋ฌ๋ ํ๋ก ํธ์๋-๋ฏธ๋ค์๋-๋ฐฑ์๋์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ,
- LLVD
- LLVM ํ๋ก ํธ์๋์ ๋์ํ๋ ๋๋ฒ๊ฑฐ.
- GCC์ GDB์ ๋์ผํ ํฌ์ง์ ์ ๊ฐ๊ณ ์์ผ๋ฉฐ, ์ ํ Xcode 5.0 ์ด์์ ๋ฒ์ ์์ ๊ธฐ๋ณธ ๋๋ฒ๊ฑฐ๋ก ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
About clang-format
C/C++/Objective-C ์ฝ๋ ์๋ ์์ ๋ง์ถค ๋๊ตฌ๋ก ์ฝ๋์ ์ต์๋จ์ ๋ค์๊ณผ ๊ฐ์ .clang-format์ ๋๋ค๋ฉด ์ฝ๋ฉ ์ปจ๋ฒค์ (coding convention)์ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ด๋? ์ด๋ค ๊ท์น์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ํํ ์ง์ ๋ํ ๊ท์ฝ์ ๋๋ค.
BasedOnStyle: LLVM
UseTab: Never
IndentWidth: 4
TabWidth: 4
BreakBeforeBraces: Allman
AllowShortIfStatementsOnASingleLine: false
IndentCaseLabels: false
ColumnLimit: 0
AccessModifierOffset: -4
์ฝ๋ฉ์ปจ๋ฒค์ ์๋ ์ ์ฉ: ์ ์ฅ, ํ์ดํ, ํญ์ ํ ๊ฒฝ์ฐ ์ ์ฉ.
- ๋ค์์ ๋ด์ฉ์ .vscode/settings.json ๋ด ์ค์ ํ์ฌ, ์ ์ฅ-ํ์ดํ-๋ถ์ฌ๋ฃ๊ธฐ ๋ฑ์ ํ ๋์ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ด ๊ฐ์ ํ ์ ์์ต๋๋ค.
// Coding convention
"editor.formatOnPaste": true,
"editor.formatOnSave": true,
"editor.formatOnType": true,
"files.trimTrailingWhitespace": true
ํน์ ํ์ผ์ clang-format ์ ์ฉ
1. ํน์ style guide ์ ์ฉ (predefined style)
clang-format -style=google -i path/to/file.cpp
2. ํน์ style guide๋ฅผ ์ผ๋ถ ๋ณํํ .clang-format ํ์ผ ์ ์ฉ (custom style)
ํน์ style guide๋ฅผ dump ํ์ฌ .clang-format ํ์ผ์ ์์ฑํฉ๋๋ค.
clang-format -style=google -dump-config > .clang-format
clang format sytle options์ ๋ฐ๋ผ ํญ๋ชฉ์ ์ํ๋๋๋ก ๋ณ๊ฒฝ ํ ๋ค์์ ๋ช ๋ น์ด๋ก ํน์ ํ์ผ์ ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
clang-format -i path/to/file.cpp
- one can either use one of the predefined styles (LLVM, Google, Chromium, Mozilla, WebKit, Microsoft)
- LLVM A style complying with the LLVM coding standards
- Google A style complying with Google’s C++ style guide
- Chromium A style complying with Chromium’s style guide
- Mozilla A style complying with Mozilla’s style guide
- WebKit A style complying with WebKit’s style guide
- Microsoft A style complying with Microsoft’s style guide
- GNU A style complying with the GNU coding standards
About clang-tidy
์คํ์ผ ์๋ฐ, ์ธํฐํ์ด์ค ์ค์ฉ ๋๋ ์ ์ ๋ถ์์ ํตํด ์ถ๋ก ํ ์ ์๋ ๋ฒ๊ทธ์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ค๋ฅ๋ฅผ ์ง๋จํ๊ณ ์์ ํ๊ธฐ ์ํ ํ์ฅ ๊ฐ๋ฅํ ํ๋ ์์ํฌ์ ๋๋ค. ์ด๋ ๋ณดํธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ๋ฉฐ, ์ฌ๊ธฐ์ 'linter'๋? ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ํ๋ก๊ทธ๋จ ์ค๋ฅ, ๋ฒ๊ทธ, ์คํ์ผ ์ค๋ฅ, ์์ฌ์ค๋ฌ์ด ๊ตฌ์กฐ์ฒด์ ํ์(flag)๋ฅผ ๋ฌ์๋๊ธฐ ์ํ ๋๊ตฌ๋ฅผ ๋งํฉ๋๋ค.
clang-based C++ “linter” tool
How do you install clang-format on macOS?
clang์ macOS์ ์ค์น๋๋ฉฐ ๊ธฐ๋ณธ ์ปดํ์ผ๋ฌ์ด์ง๋ง clang-format ๋๋ clang-tidy (๋๋ ์ถ๊ฐ ๋๊ตฌ)์ ํจ๊ป ์ค์น๋์ง๋ ์์ต๋๋ค. ์ํ๋ ๊ฒฝ์ฐ Brew๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ค์นํ ์ ์์ต๋๋ค.
$ brew install clang-format
$ brew install fmenezes/tap/clang-tidy
์์ ๊ฐ์ ๋ฐฉ์(fmenezes/tap/clang-tidy)์ผ๋ก ์ค์นํ๋ฉด Ubuntu์์์ ๋์ผํ CMake ํ์ผ์ ๋น๋ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ macOS์์ clang-tidy๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ llvm๊น์ง ์ค์นํ ๋ค์, ์ฌ์ฉํ๋ ค๋ ๋๊ตฌ์ ๋ํ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
$ brew install llvm
$ ln -s "$(brew --prefix llvm)/bin/clang-format" "/usr/local/bin/clang-format"
$ ln -s "$(brew --prefix llvm)/bin/clang-tidy" "/usr/local/bin/clang-tidy"
+ ๊ธฐ๋ณธ clang ์ปดํ์ผ๋ฌ์์ ์ถฉ๋๋ก ์ธํด ๋ชจ๋ llvm์ PATH์ ์ถ๊ฐํ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค.
# ์ฐธ๊ณ
- [Official Docs] clang official guideline: https://clang.llvm.org/extra/clang-doc.html
- [Blog] macOS์ clang-tidy๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?:
https://www.wake-up-neo.com/ko/macos/macos%EC%97%90-clangtidy%EB%A5%BC-%EC%84%A4%EC%B9%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C/808393026/ - [StackOverFlow] How to install clang-tidy on macOS?
https://stackoverflow.com/questions/53111082/how-to-install-clang-tidy-on-macos