References
- Professional CMake : A Practical Guide
Contents
- foreach()
- while()
- Interrupting Loops
2021.10.30 - [CMake] - [CMake] Flow Control - if
if() 명령에 이어서 이번에는 리스트 요소들 또는 어떤 값 범위에 대해서 반복적인 작업을 수행하거나, 특정 조건이 만족할 때까지 작업을 반복 수행하는 foreach()와 while()에 대해서 살펴보겠습니다.
사실 foreach는 자주 사용되나, while은 한번도 사용되는 것을 보지 못했고.. 다른 언어와 거의 유사하기 때문에 넘어갈까하다가 그래도 CMake에서 제공되는 명령이기 때문에 한 번 알아보고 넘어가도록 하겠습니다 !
foreach()
CMake에서는 프로젝트에서 리스트나 값들의 집합에 대해서 반복(iteration)할 수 있도록 다음의 foreach() 명령을 제공합니다.
각 argN 값들이 loopVar라는 이름으로 설정되고 루프 본문이 실행됩니다. 이때, arguments의 값들이 그대로 사용되는 것에 주의해야합니다.
cmake_minimum_required(VERSION 3.10)
project(loop)
set(list1 A B)
set(list2 1 2)
set(foo WillNotBeShown)
foreach(loopVar list1 list2 foo)
message("Iteration for: ${loopVar}")
endforeach()
보다 일반적인 형태로 foo와 같은 argument들을 ITEMS 키워드를 사용하여 지정할 수 있습니다. 이때 리스트인 argument는 LISTS 키워드를 사용하여 지정하면 예상한 결과를 얻을 수 있습니다.
(그래도 ITEMS 키워드로 지정된 단일 argument들은 값이 아닌 그 이름을 그대로 가져와서 loopVar로 설정된 것을 볼 수 있습니다.)
cmake_minimum_required(VERSION 3.10)
project(loop)
set(list1 A B)
set(list2 1 2)
set(foo WillNotBeShown)
foreach(loopVar IN LISTS list1 list2 ITEMS foo bar)
message("Iteration for: ${loopVar}")
endforeach()
사실 다른 github 프로젝트들의 CMakeLists.txt를 살펴보면, 위 형태는 거의 사용되지는 않는 것 같습니다.
대신 아래의 형태로 자주 사용되며, 보통 argument는 그냥 리스트 하나만 지정하는 것이 일반적입니다.
cmake_minimum_required(VERSION 3.10)
project(loop)
set(list1 A B C D E F G)
foreach(loopVar ${list1})
message("Iteration for: ${loopVar}")
endforeach()
추가로, foreach() 명령은 C와 유사하게 숫자 값 범위에 대한 반복을 지원합니다.
이 명령은 반복할 숫자 값의 범위 시작값 start와 마지막값stop을 입력하고, step은 선택적으로 입력해야합니다. 만약 step을 입력하지 않으면 step은 1(start < stop 인 경우) 또는 -1(만약 start > stop 인 경우)로 설정됩니다.
cmake_minimum_required(VERSION 3.10)
project(loop)
message(STATUS "first iteration with step")
foreach(loopVar RANGE 3 7 2)
message("Iteration for: ${loopVar}")
endforeach()
message(STATUS "second iteration without step")
foreach(loopVar RANGE 3 7)
message("Iteration for: ${loopVar}")
endforeach()
만약 start < stop인데 step이 음수거나 start > stop 인데 step 양수라면 에러가 발생하게 됩니다.
RANGE는 다음과 같이 하나의 argument로도 반복이 수행될 수 있습니다.
이 명령어는 foreach(loopVar RANGE 0 value)와 동일한 명령입니다. 따라서 이 명령어에서 loopVar는 0부터 value까지 반복되어 수행됩니다. 물론 value값이 음수라면 0부터 -1, -2, ..., value로 진행됩니다.
(0부터 시작하기 때문에 반복문은 (value + 1)번 반복됩니다.)
foreach() 명령에 여러가지 사용법이 있지만, 사실 중간에 설명드렸던 foreach(loopVar ${listVar})의 명령어만 알아도 문제는 없을 듯 합니다. 경험상, 이 명령 외에는 사용한 적이 거의 없습니다.
while()
다른 loop 명령으로 while() 명령어가 있습니다. 글 초반에 언급했듯이 사용되는 것을 거의 본적이 없습니다.
while 명령은 위의 형태로 사용할 수 있습니다.
condition은 if() 명령어와 동일한 규칙으로 판단되고 해당 규칙에 따라서 루프의 본문이 실행됩니다. 반복은 condition이 false로 간주되거나 break() 명령을 만나면 종료됩니다.
cmake_minimum_required(VERSION 3.10)
project(loop)
set(index 0)
while(${index} LESS 10)
message("index = ${index}")
math(EXPR index "${index} + 1")
endwhile()
Interrupting Loops
위의 while() 명령에 대해서 이야기할 때 이야기했듯이 다른 언어와 마찬가지로 loop에서 종료하거나 다음 iteration으로 스킵하기 위한 break()와 continue() 명령 또한 CMake에서 지원합니다. 동작은 C언어와 거의 동일하다고 보면 되고, 해당 명령을 만났을 때, 해당 명령을 감싸는 가장 안쪽의 loop에서만 동작합니다.
cmake_minimum_required(VERSION 3.10)
project(loop)
foreach(outerVar IN ITEMS a b c)
unset(s)
foreach(innerVar IN ITEMS 1 2 3)
# Stop inner loop one string s gets long
list(APPEND s "${outerVar}${innerVar}")
string(LENGTH s length)
if(length GREATER 5)
break()
endif()
# Do no more processing if outer var is "b"
if(outerVar STREQUAL "b")
continue()
endif()
message("Processing ${outerVar}-${innerVar}")
endforeach()
message("Accumulated list: ${s}")
endforeach()
foreach와 while에 대해서 살펴봤는데, foreach(그 중에서도 리스트의 값으로 반복하는 것) 외에는 자주 사용되지는 않기 때문에 그냥 간단히 이런게 있구나 하고 넘어가도 괜찮을 것 같습니다 !
'CMake' 카테고리의 다른 글
[CMake] Functions and Macros (0) | 2021.11.01 |
---|---|
[CMake] add_subdirectory() 와 변수 Scope (0) | 2021.10.31 |
[CMake] Flow Control - if (0) | 2021.10.30 |
[CMake] Lists (0) | 2021.10.29 |
[CMake] String Handling (string 명령어) (0) | 2021.10.29 |
댓글