CLion의 Makefile 프로젝트 공개!
CLion 2020.2 EAP2가 오랫동안 기다려온 Makefile 프로젝트 지원을 선보입니다. 아직 여러 제약과 알려진 이슈가 있는 개발 초기 단계이지만, 다양한 프로젝트를 처리하기엔 충분한 기능을 갖추고 있습니다.
Makefile 프로젝트를 보유하고 계시나요? 그렇다면 무료 EAP 빌드를 받아 지금 사용해보고, 의견을 공유해 주세요!
이번 블로그 게시물을 통해 다음 질문에 대한 답변을 얻으실 수 있습니다.
- 내부적인 작동 방식은 어떻게 되나요?
- CLion에서 Makefile 프로젝트를 어떻게 시작하나요?
- 오류가 발생해 프로젝트가 적절히 로드되지 않으면 어떻게 하나요?
- 알려진 이슈와 제약 사항은 무엇인가요?
구현 접근 방식
얼마 전 저희가 발견한 내용을 발표하고 CLion에서 Makefile 프로젝트를 지원하는 데 활용한 접근 방식을 공개했습니다. 그 과정에서 다양한 최신 C++ IDE 및 에디터에서 널리 사용되는 Makefile을 처리하기 위한 방법을 간략히 소개했습니다.
- 실제 컴파일러 호출을 래핑하는 데 컴파일러 래퍼를 활용한 후 전반적 빌드 정리 작업을 수행합니다. 다음으로 프로젝트 정보를 추출합니다.
- LD_PRELOAD 환경 변수를 사용하며 모든 빌드 프로세스 실행 전 특정 동적 라이브러리를 로드하여 컴파일러 호출을 인터셉트하고 프로젝트 정보를 수집합니다.
make
명령어의 출력 결과를 파싱합니다. 실제 빌드를 방지하기 위해--just-print
옵션과 함께 사용하는 경우가 많습니다.
3번째 옵션은 매우 중요한 여러 혜택을 제공합니다.
- 빌드 프로세스에 영향을 미치지 않습니다.
- 전체 프로젝트 빌드보다 더 빠르게 정보를 수집할 수 있습니다.
- 이론상으로는 다른 기기에서 기록된 Make 출력을 활용해 IDE를 시작할 수 있기에 이 옵션은 ‘휴대용” 옵션으로 작동합니다.
따라서 저희는 3번째 접근 방식을 채택하고 프로토타입을 구현했습니다. 또한 Confluence 페이지에서 확인하실 수 있는 것처럼, 다양한 프로젝트에서 테스트를 실행했습니다. 다른 여러 프로젝트도 실행되기를 기대하고 있습니다. 이제 여러분이 직접 Makefile 프로젝트에서 이 방식을 활용하고 피드백을 보내주실 차례입니다!
CLion에서 Makefile 프로젝트를 시작하는 방법
CLion에서 Makefile 프로젝트를 여는 방법은 다음과 같습니다.
- File | Open(파일 | 열기)에서 프로젝트를 선택합니다.
- 폴더를 프로젝트로 열면 CLion에서 최상위 Makefile을 검색하고 프로젝트로 열도록 제안합니다(CMakeList.txt 또는compile_commands.json 파일도 마찬가지입니다). 또는 Open(열기) 대화상자에서 Makefile을 바로 지정할 수도 있습니다.
- CLion에서 프로젝트 정리를 요청할 수 있습니다. 정리가 필요한 이유는 Make 빌드가 증분 빌드이며 정리되지 않은 프로젝트에서 실행될 시 업데이트한 파일만이 컴파일되기 때문입니다. 이런 경우 프로젝트 재로드가 적절히 작동하지 않으며 변경되지 않은 모든 파일이 누락될 수 있습니다.
- 이제 CLion에서 프로젝트 로드를 시도합니다.
- 프로젝트가 성공적으로 로드되면 CLion에서 해당 프로젝트 작업을 시작하고 스마트한 IDE 기능을 모두 활용할 수 있습니다.
기본 설정이 적합하지 않은 경우 중요 설정을 조정할 수 있습니다. Settings/Preferences(설정/환경 설정) | Build, Execution, Deployment(빌드, 실행, 배포) | Makefile setting(Makefile 설정)으로 이동하세요.
변경 가능한 항목은 다음과 같습니다.
- 툴체인: Makefile 프로젝트 로드에 사용됩니다. 모든 로컬 툴체인(Clang, GCC, MinGW, Cygwin, WSL)이 지원됩니다. Visual Studio 툴체인은 현재 지원되지 않는 NMake을 기반으로 하지만 GNU Make를 사용해 프로젝트를 빌드할 경우 CLion에서 작동합니다. 원격 모드는 아직 포함되지 않습니다.
- 인수: 프로젝트 정보 추출을 위해 CLion의
make
명령어를 호출하는 데 사용됩니다. - 빌드 및 정리: 프로젝트 정보 추출을 위해 CLion의
make
명령어와 함께 대상이 사용되도록 합니다. 빌드 시 공백 필드는 CLion이 프로젝트 Makefile에 지정된 첫 번째 대상을 채택하였음을 의미합니다.
CLion에서 Makefile 프로젝트 작업 시 유용한 최종 팁을 확인해 보세요.
팁 1: CLion은 Makefile 프로젝트 대상을 검색하여 Run/Debug configuration(실행/디버그 구성)에서 즉시 사용할 수 있도록 합니다.
또한 CLion에서 Make 대상을 검색하지 못할 경우 Make 유형의 사용자 지정 빌드 대상을 생성하여 구성에 사용할 수 있습니다.
팁 2: 소스 외부 빌드는 지원되지만 Project View(프로젝트 뷰)에 소스가 적절히 표시되려면 프로젝트 로딩 후 Tools(도구) | Makefile | Change Project Root(프로젝트 루트 변경)을 호출하는 편이 좋습니다.
팁 3: 현재 CLion은 새 파일 추가 등의 파일 변경이 있을 시 자동으로 프로젝트를 업데이트하거나 다시 로드하지 않습니다. 업데이트 후 Makefile에 알림이 표시되므로 프로젝트 재로드를 잊을 염려가 없습니다. 하지만 구성 단계가 프로젝트에 사용될 경우, Makefile을 업데이트하고 알림을 받으려면 호출이 필요합니다.
오류가 발생해 프로젝트가 적절히 로드되지 않으면 어떻게 하나요?
Confluence 페이지에서 확인하실 수 있는 것처럼, 다양한 프로젝트에서 테스트를 실행했습니다. 또한 저희는 여러분의 프로젝트를 비롯한 다른 프로젝트도 실행되기를 기대하고 있습니다. 하지만 혹시 이슈가 발생했다면 다음과 같은 액션을 활용해 보세요.
- Settings/Preferences(설정/환경 설정) | Build, Execution, Deployment(빌드, 실행, 배포) | Makefile setting(Makefile 설정)에서 사용 중인 툴체인을 확인합니다. 선택한 환경에서 프로젝트를 빌드할 수 있어야 합니다.
- Settings/Preferences(설정/환경 설정) | Build, Execution, Deployment(빌드, 실행, 배포) | Makefile setting(Makefile 설정)에서 인수 및 빌드 대상 재로드를 확인합니다. 저희 측에서 성공적으로 작동했던 프로젝트 대부분의 경우 기본 인수는 문제가 없었습니다. 하지만 상황에 따라 변경이 필요할 수도 있습니다.
- Tools(도구) | Makefile | Clean and Reload Makefile Project(Makefile 프로젝트 정리 및 재로드)를 시도합니다.
- 상단의 단계로도 해결되지 않으면 시스템 디렉토리의 /makefiles에서 프로젝트를 정리해 보세요. 예를 들어, 저의 macOS에서 postgres 프로젝트의 경우 ~/Library/Caches/JetBrains/CLion2020.2/makefiles/postgres.dc29ef09입니다. 이후 프로젝트를 다시 로드합니다.
- 마지막으로 혹시 상단의 팁들이 전혀 효과가 없을 경우 Help(도움말) | Diagnostic Tools(진단 도구) | Debug Log Settings…(디버그 로그 설정…)으로 이동하고 #com.jetbrains.cidr.cpp.makefile을 추가해 디버그 로그를 활성화합니다. 다음으로 문제를 재현하고 로그를 트래커 또는 지원 팀에 제출해 주세요.
알려진 이슈 및 제약 사항
현재 사용되는 알고리즘의 가장 취약한 지점은 make
명령어 출력에서 컴파일 명령어를 추출하는 것입니다. 일부 사례에서 발생하는 이슈가 발견되었습니다.
- 프로젝트가 디렉토리 출력을 억제합니다. 따라서 알고리즘은 실제 빌드되는 소스 파일을 적절히 탐지하지 못합니다.
- 알 수 없는 컴파일러 또는 적절히 추출될 수 없는 컴파일 플래그.
libtool
을 비롯한 다양한 래퍼가 컴파일 플래그를 숨김 처리하고 Make의 출력을 방해하여 상황이 더욱 악화됩니다(CPP-19549, CPP-19305).
이전 테스트 프로젝트에서 경험한 사례와 같은 문제를 해결하기 위해 여러 경험적 지식을 동원하고 있습니다. 또한 사용자가 프로젝트 정보를 추출하는 동안 make
명령어 호출에 사용되는 인수를 제어할 수도 있습니다. Settings/Preferences(설정/환경 설정) | Build, Execution, Deployment(빌드, 실행, 배포) | Makefile | Arguments(인수)로 이동하여 설정하세요.
다음 단계는?
- Makefile 지원 플러그인으로 코드 강조 표시 및 Make 프로젝트 빌드와 관련한 일부 기능을 제공합니다. 향후 계획은 이 플러그인을 재편하고 CLion에 번들로 제공하는 것입니다(CPP-16933).
- 앞으로 Makefile 프로젝트에도 유닛 테스트 통합 기능이 제공될 예정입니다(CPP-20718).
- Make 파일을 기존 프로젝트에 연결하는 기능이 추가됩니다(CPP-20733).
- 툴체인 또는 프로젝트 로드에 영향을 미치는 기타 설정을 변경하면 재로드가 생성됩니다(CPP-18982).
- GNU Autotool 프로젝트 지원이 확장됩니다. 따라서 사용자는 Makefile 프로젝트에 “사전 구성된” 단계를 설정할 수 있습니다(CPP-16924).
- 비 GNU Makes(NMake, BSD)가 지원됩니다(CPP-18723).
- 컴파일러 래퍼가 지원되는 접근 방식을 구현하여 현재 방식과 함께 사용할 수 있도록 합니다.
하지만 무엇보다 현재 프로토타입을 개선하고 여러 이슈를 수정할 계획입니다. 또한 지금은 여러분의 피드백이 정말 중요하고 귀중한 시기입니다. 사용 중 발생한 이슈를 이슈 트래커에 보고해 주세요.
프로토타입에 테스트를 마친 프로젝트 목록은 다음에서 확인하실 수 있습니다: CLion의 Makefile 프로젝트.
CLion 팀
JetBrains
The Drive to Develop
이 게시물은 Anastasia Kazakova가 작성한 Makefile projects in CLion: now public!를 번역한 글 입니다.