Visual C ++, XCode 및 makefile의 별도 빌드 관리 시스템에서 크로스 플랫폼 프로젝트를 CMake로 전환하는 것을 고려하고 있습니다.
필요한 한 가지 필수 기능은 디렉토리의 모든 파일을 대상에 자동으로 추가하는 것입니다. 이것은 make로하기 쉽지만 Visual C ++ 및 XCode로는 쉽게 수행 할 수 없습니다 (잘못된 경우 수정하십시오). CMake에서 직접 할 수 있습니까? 어떻게?
Visual C ++, XCode 및 makefile의 별도 빌드 관리 시스템에서 크로스 플랫폼 프로젝트를 CMake로 전환하는 것을 고려하고 있습니다.
필요한 한 가지 필수 기능은 디렉토리의 모든 파일을 대상에 자동으로 추가하는 것입니다. 이것은 make로하기 쉽지만 Visual C ++ 및 XCode로는 쉽게 수행 할 수 없습니다 (잘못된 경우 수정하십시오). CMake에서 직접 할 수 있습니까? 어떻게?
답변:
것이 가능하다. 예 file(GLOB
:
cmake_minimum_required(VERSION 2.8)
file(GLOB helloworld_SRC
"*.h"
"*.cpp"
)
add_executable(helloworld ${helloworld_SRC})
참고이이 요구하는 매뉴얼 을 다시 실행하는 cmake
생성 된 빌드 시스템이 다시 생성 CMake를 요청할 때 알 수 없기 때문에 소스 파일이 추가되거나 제거되면, 그리고 빌드 시간을 증가시킬 모든 빌드에 그 일을.
Kleist의 대답은 확실히 작동하지만 중요한주의 사항이 있습니다.
Makefile
수동으로 작성할 때 SRCS
모든 .cpp
및 .h
파일 을 선택하는 함수를 사용하여 변수를 생성 할 수 있습니다. 소스 파일이 나중에 추가되면 재실행에 make
포함됩니다.
그러나 CMake (와 같은 명령 사용 file(GLOB ...)
)는 명시 적으로 파일 목록을 생성하여 자동 생성 된 파일 목록에 배치합니다 Makefile
. 새 소스 파일이 있으면을 다시 Makefile
실행 하여 파일을 다시 생성해야합니다 cmake
.
편집 : Makefile을 제거 할 필요가 없습니다.
확장 에 대한 @Kleist 대답 :
CMake 3.12부터 추가 옵션 CONFIGURE_DEPENDS 가 명령 및에서 지원 됩니다 . 이 옵션을 사용하면 디렉토리에 소스 파일을 추가 / 삭제 한 후 CMake 를 수동으로 다시 실행할 필요 가 없습니다 . 다음 프로젝트 빌드시 CMake가 자동으로 다시 실행됩니다.file(GLOB)
file(GLOB_RECURSE)
그러나 CONFIGURE_DEPENDS 옵션 은 빌드가 요청 될 때마다 해당 디렉토리가 다시 검사됨을 의미하므로 빌드 프로세스는 CONFIGURE_DEPENDS 가없는 것보다 더 많은 시간을 소비 합니다.
CONFIGURE_DEPENDS 옵션을 사용할 수 있어도 CMake 설명서 는 소스를 사용 하거나 수집하는 것을 권장하지 않습니다 .file(GLOB)
file(GLOB_RECURSE)
file(GLOB)
또는 file(GLOB_RECURSE)
수집을 권장하지 않습니다. "그렇다면 무엇을 권장합니까? 다른 것을 사용하여 소스를 수집하거나 모든 단일 소스 파일을 수동으로 나열합니까?
따라서 powershell을 사용하여 소스 파일 목록을 만드십시오. 이 스크립트를 한번보세요
param (
[Parameter(Mandatory=$True)]
[string]$root
)
if (-not (Test-Path -Path $root)) {
throw "Error directory does not exist"
}
#get the full path of the root
$rootDir = get-item -Path $root
$fp=$rootDir.FullName;
$files = Get-ChildItem -Path $root -Recurse -File |
Where-Object { ".cpp",".cxx",".cc",".h" -contains $_.Extension} |
Foreach {$_.FullName.replace("${fp}\","").replace("\","/")}
$CMakeExpr = "set(SOURCES "
foreach($file in $files){
$CMakeExpr+= """$file"" " ;
}
$CMakeExpr+=")"
return $CMakeExpr;
이 구조의 폴더가 있다고 가정하십시오.
C:\Workspace\A
--a.cpp
C:\Workspace\B
--b.cpp
이제이 파일을 "generateSourceList.ps1"로 저장하고 스크립트를 다음과 같이 실행하십시오.
~>./generateSourceList.ps1 -root "C:\Workspace" > out.txt
out.txt 파일에는
set(SOURCE "A/a.cpp" "B/b.cpp")