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)


답변

따라서 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")


답변