CMakeLists.txt를 생성하는 방법
CMake Lists를 자동으로 생성하는 방법에 대한 조언이나 조언이 필요합니다.txt 파일을 지정합니다.기존 발전기에 대해 아는 사람 있나요?CMake Wiki에 기재되어 있는 것을 확인했습니다만, 유감스럽게도 저에게 맞지 않습니다.
프로젝트의 디렉토리 구조를 통과해 필요한 파일을 생성하는 기본적인 Python 스크립트를 이미 가지고 있지만, 지금은 정말 "dumb"입니다.사용하고 있는 컴파일러나 크로스 컴파일러의 다른 버전이나 라이브러리의 의존관계 등, 구축 대상의 플랫폼이 다른 것을 고려해 확장해 나가고 싶다고 생각하고 있습니다.CMake에 대한 경험이 별로 없기 때문에 작업이나 이미 가동 중인 발전기의 예를 들 수 있습니다.
저도 Cmake에 대한 경험이 별로 없지만 크로스 플랫폼을 실행하려면 Cmake Lists를 포함하여 많은 파일을 작성 및 수정해야 합니다.txt 파일은 Project Generator Tool이라고 하는 새로운 툴을 사용하는 것이 좋습니다.이것은 매우 멋집니다.필요한 모든 추가 작업을 할 수 있고, 서드파티 소스에 필요한 파일을 쉽게 생성할 수 있습니다.README를 사용하기 전에 주의 깊게 읽어주세요.
링크: http://www.ogre3d.org/forums/viewtopic.php?f=1&t=54842
1000개 이상의 모듈(공유, 정적 라이브러리, 프로그램)이 있고 20개 이상의 서드파티(부스트, openCV, Qt, Qwt...)를 사용하는 C++ 소프트웨어 환경을 유지하고 있습니다.이 소프트웨어 환경에서는 많은 프로그램(~50개)이 호스트되어 있으며, 각 프로그램은 일부 라이브러리, 프로그램 및 서드파티를 채택하고 있습니다.저는 CMake를 사용하여 make 파일을 생성하는데, 그것은 매우 훌륭합니다.
하지만, 만약 당신이 당신의 글을 쓴다면CMakeLists.txt
(모듈을 라이브러리/프로그램으로 지정, 소스 파일 Import, 의존관계 추가 등)나는 셀라벡에 동의한다: 그것들을 유지하는 것CMakeLists.txt
파일은 정말 골칫거리입니다.
- 모듈에 새 파일을 추가할 때 해당 파일을 업데이트해야 합니다.
CMakeLists.txt
- 서드파티를 업그레이드하려면
CMakeLists.txt
사용하고 있는 모든 모듈의 - 새 종속성을 추가할 때(라이브러리)
A
이제 라이브러리가 필요합니다.B
)의 갱신이 필요할 수 있습니다.CMakeLists.txt
사용하는 모든 프로그램 중A
- 새로운 글로벌 설정(컴파일러 설정, 사전 정의된 변수, C++ 표준 사용)을 변경할 경우 모든 설정을 업데이트해야 합니다.
CMakeLists.txt
그리고, 이러한 문제에 대처하기 위한 2개의 전략과 OP가 언급하고 있는 것 같습니다.
1 - 글을 잘 쓰고, 즉시 업데이트하지 않도록 충분히 현명하게 행동합니다.이것이, 델의 소프트웨어 환경에 존재하는 것입니다.각 모듈에는 표준화된 파일 구성이 있습니다(소스는src
폴더, 포함 위치inc
폴더...) 및 종속성을 지정하기 위한 간단한 텍스트 파일(예: 우리가 정의한 키워드를 사용하여)이 필요합니다.QT
모듈을 링크할 필요가 있다고 말합니다.Qt
)그럼 우리CMakeLists.txt
는 2행 파일이며 모듈을 자동으로 셋업하기 위해 작성한 cmake 매크로를 호출하기만 하면 됩니다.MCVE로서 다음과 같은 것이 있습니다.
CMake Lists(CMake 리스트)txt:
include( utl.cmake )
add_module( "mylib", lib )
utl.cmake:
macro( add_module name what )
file(GLOB_RECURSE source_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
if ( what STREQUEL "lib" )
add_library( ${name} SHARED ${source_files} )
elseif ( what STREQUEL "prg" )
add_executable( ${name} ${source_files} )
endif()
# TODO: Parse the simple texts files to add target_link_libraries accordingly
endmacro()
그런 다음 위의 모든 상황에 대해 utl.cmake를 업데이트하기만 하면 됩니다.CMakeLists.txt
당신은...
솔직히 이 접근법에 매우 만족하고 있습니다.시스템 유지보수가 매우 쉬워지고 새로운 의존관계 추가, 서드파티 업그레이드, 빌드/의존관계 전략 변경 등이 쉬워집니다.
하지만, 여전히 많은 것들이 남아 있다.CMake
작성되는 스크립트그리고.CMake
스크립트 언어는 형편없어...툴은 매우 강력합니다만, 스크립트의 가변 범위, 캐시, 번거롭고 문서화되어 있지 않은 구문(목록이 비어 있는지 확인하기 위해서만 그 크기를 물어보고 변수에 저장해야 합니다!)은 객체 지향적이지 않습니다.유지하기가 정말 힘들죠.
그래서 저는 이제 정말 좋은 접근법은 다음과 같은 것이라고 확신합니다.
2 - Python과 같은 보다 강력한 언어에서 완전히 를 생성합니다.Python 스크립트는 utl.cmake와 유사한 작업을 수행하며 대신 utl.cmake를 생성합니다.CMakeLists.txt
전달 준비 완료 CMake 도구(HelloWorld에서 제안된 형식, 변수 없음, 함수 없음... 표준 CMake 함수만 호출)
그런 범용적인 툴이 존재하는지 의심스럽다.왜냐하면 이 툴은 제작이 어렵기 때문이다.CMakeLists.txt
모든 사람이 만족할 수 있는 파일을 직접 작성해야 합니다.gen-cmake는 (CMakeLists.txt를 생성하지만) 매우 원시적인 방법으로 Linux만 지원하지만 좋은 시작점이 될 수 있습니다.
이것은, 장래의 소프트웨어 환경의 v2가 될 가능성이 있습니다.
주의: 예를 들어 qmake와 cmake를 모두 지원하고 싶다면 Python 스크립트를 잘 작성하면 CMake Lists와 pro 파일을 온 디맨드로 생성할 수 있습니다.
CLion은 CMake 프로젝트 파일을 완전히 기반으로 하는 통합 개발 환경입니다.
스스로 CMake Lists를 생성할 수 있습니다.원본에서 프로젝트 가져오기 사용 시 txt 파일
그러나 프로젝트가 확장되고 외부 종속성을 추가하기 위해 이 파일을 수동으로 편집해야 할 가능성이 높습니다.
이것이 원래 포스터가 직면했던 문제인지 아닌지는 잘 모르겠습니다만, 상기의 「그냥 CMakefile.txt」라고 하는 답변이 많이 있는 것을 알 수 있기 때문에, CMake 파일을 생성하는 것이 유효한 이유를 간단하게 설명하겠습니다.
a) 마음에 드는 다른 빌드 시스템이 있습니다.
(또한 다양한 내부 및 외부 의존관계, 특이점 및 변종과 함께 상호 연결된 공유 및 정적 라이브러리, 프로그램, 스크립트 언어 확장 및 도구 모음의 대규모 멀티플랫폼 구축을 포함합니다.)
b) 교체해도 cmake는 고려하지 않습니다.
CMake 파일을 봤는데 구문이 마음에 들지 않고 의미론도 마음에 들지 않습니다.
c) CLion은 CMake 파일만 사용하고 Cmake 파일만 사용합니다(또한 다소 흥미로워 보입니다).
따라서 CLion에게 기회를 주기 위해(PyCharm을 매우 좋아하기 때문에 매력적입니다), 하지만 빌드 시스템을 계속 사용하기 위해 make_cmake를 구현하고 빌드 시스템에서 추출된 현재 정보에 따라 필요한 CMake 파일을 즉시 생성할 수 있는 도구를 기꺼이 사용할 것입니다.앱이 어떤 소스와 헤더로 구성되어 있는지, 어떤 라이브러리와 프로그램이 구축될지, 어떤 컴포넌트에 -I, -L, -D 등이 설정될지 등에 대한 정보를 툴/스크립트에 제공할 수 있습니다.
물론 JetBrains가 IDE에 필요한 정보를 직접 제공하는 프로토콜(예를 들어 컴파일, 실행 및 실제로 필요한 메타데이터를 전송하기 위한 명령어를 직접 제공)을 제공할 수 있다면 훨씬 더 행복할 것입니다.주로 indir와 fly code analysis에 대한 정의를 구현해야 한다고 생각합니다.bpaths)를 사용하여 디버거의 LD_LIBRARY_PATH를 설정합니다.프로토콜로서의 CMake 파일은 다소 복잡합니다.
이것이 도움이 될 수도 있습니다.
저자는 cmake와 cmake를 사용하여 CPPCon으로 모듈러 프로젝트를 작성하는 방법에 대해 몇 가지 연설을 했습니다.제가 알기로는 이 툴은 cmake가 필요하기 때문에 새로운 패키지를 통합하거나 새로운 패키지를 작성할 때 생성될 것입니다.최근 YAML 파일을 사용하여 C/C++ 프로젝트를 보다 높은 레벨로 기술하는 방법에 대해 읽은 적이 있습니다만, 코난의 일부인지 아닌지는 잘 모르겠습니다(코난의 저자가 쓴 것입니다).저는 사용한 적이 없고, 아직 미결이기 때문에, 만약 당신이 그것을 사용하고, 당신의 요구에 맞는다면, 그것에 대한 당신의 의견과 시나리오에 맞는 코멘트를 부탁드립니다.
저는 그런 발전기를 찾고 있었는데, 결국 제가 직접 쓰기로 했습니다(부분적으로는 CMake가 어떻게 작동하는지 알고 싶었기 때문이기도 합니다.
https://github.com/Aenteas/cmake-generator
Python Wrapper(SWIG) 작성 등 몇 가지 추가 기능이 있습니다.
누구에게나 맞는 발전기를 쓰는 것은 불가능하지만, 맞춤형으로 만들고 싶은 경우에 대한 아이디어가 있으면 좋겠습니다.
CMake List를 생성하기 위해 자동 스크립트를 사용할 필요는 없다고 생각합니다.Txt는 기본적인 절차를 이해한 후 작성하는 매우 간단한 작업입니다.네, CMake Wiki에서 주어진 대로 작성 절차를 이해하는 것도 너무 상세하기 때문에 어렵다는 것에 동의합니다.
CMake Lists 의 기입 방법을 나타내는 기본적인 예.여기에 txt가 표시되어 있기 때문에 CMake Lists를 작성하는 모든 사람에게 도움이 될 것입니다.첫 번째 txt 입니다.
난 네가 이걸 거꾸로 하고 있다고 생각해.
CMake를 사용하는 경우 CMake Lists를 작성해야 합니다.너 자신을 시험해봐.일반적으로 CMake는 다른 컴파일러에 대해 알고 있기 때문에 다른 컴파일러를 다룰 필요가 없습니다.단, 필요한 경우 CMakeFiles에 코드를 추가하여 사용하는 도구에 따라 다른 작업을 수행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/6914524/how-to-generate-cmakelists-txt
'itsource' 카테고리의 다른 글
C에서 빅 엔디안을 리틀 엔디안으로 변환하다[제공된 펑크를 사용하지 않고] (0) | 2022.08.17 |
---|---|
Gradle을 사용하여 실행 가능한 JAR 생성 (0) | 2022.08.17 |
vue.js for loop 내의 함수를 호출하여 현재 항목을 전달하려면 어떻게 해야 합니까? (0) | 2022.08.17 |
클래스와 인터페이스를 갖춘 Java Generics - 함께 (0) | 2022.08.17 |
C의 함수의 크기가 항상 1바이트인 이유는 무엇입니까? (0) | 2022.08.17 |