References
- Professional CMake : A Practical Guide
Contents
- string()
- Search and Replace (FIND, REPLACE, REGEX MATCH, REGEX MATCHALL, REGEX REPLACE)
- Manipulation (SUBSTRING, LENGTH, TOLOWER, TOUPPER, STRIP)
string()
CMake에서는 string() 명령어를 통해 광범위하고 유용한 문자열 처리 기능을 제공합니다. 이 명령을 사용하면 문자열 찾기, 바꾸기, 정규식, 대소문자 변환, 공백 제거 등 다양한 작업들을 수행할 수 있습니다.
이번에는 이 string 명령어를 통해서 처리할 수 있는 유용한 기능들에 대해서 알아보겠습니다.
string 명령어의 첫 번째 argument는 수행할 작업입니다. 그 뒤에 따르는 argument들은 수행되는 작업에 따라서 조금씩 다릅니다. 뒤 따르는 argument에는 일반적으로 하나 이상의 문자열이 필요하고, 그 작업 결과를 저장할 출력 변수가 필요합니다.
Search and Replace
- FIND
string(FIND) 명령어는 inputString에서 subString을 검색하고 그 (inputString에서) 첫 번째 인덱스를 outVar에 저장합니다. (다른 언어와 마찬가지로 첫 번째 문자의 인덱스는 0입니다.) 만약 subString이 inputString에서 발견되지 않는다면 outVar에 -1의 값이 저장됩니다.
예시를 살펴보겠습니다.
cmake_minimum_required(VERSION 3.10)
project(string)
set(longStr abcdefabcdef)
set(shortBit def)
string(FIND ${longStr} ${shortBit} fwdIndex)
string(FIND ${longStr} ${shortBit} revIndex REVERSE)
message("fwdIndex = ${fwdIndex}")
message("revIndex = ${revIndex}")
위 예시의 결과는 다음과 같습니다.
inputString인 'abcdefabcdef'에서 subString 'def'를 찾는 예제인데, string 명령어에 REVERSE 키워드를 추가하면 뒤쪽부터 검색하는 것을 볼 수 있습니다. 그 결과, REVERSE 키워드가 없는 경우에는 앞에서부터 찾아서 결과가 3이 되고, REVERSE 키워드가 있는 경우에는 뒤에서부터 찾아서 결과가 9가 됩니다.
- REPLACE
string(REPLACE) 명령어는 다음과 같이 사용됩니다.
입력 문자열(input)의 모든 matchString을 replaceWith로 바꾸고 그 결과를 outVar에 저장합니다. 만약 입력 문자열 input이 여러개 입력되면, 문자열을 바꾸기 전에 각 입력 문자열을 사이에 공백없이 결합하고 변환을 수행합니다. 따라서, 이로 인해 예기치 못한 일치가 발생할 수 있으므로 일반적으로는 하나의 입력 문자열만 제공하는 것을 권장합니다.
cmake_minimum_required(VERSION 3.10)
project(string)
set(matchString abc)
set(replaceWith def)
set(input1 abcdefabcdefab)
set(input2 cdefghi)
# abcdefabcdefab -> defdefdefdefab
string(REPLACE ${matchString} ${replaceWith} output1 ${input1})
# abcdefabcdefab + cdefghi -> abcdefabcdefabcdefghi -> defdefdefdefdefghi
string(REPLACE ${matchString} ${replaceWith} output2 ${input1} ${input2})
message("output1 = ${output1}")
message("output2 = ${output2}")
- REGEX MATCH / REGEX MATCHALL / REGEX REPLACE
정규식 표현 또한, 아래 3개의 명령어를 통하여 지원됩니다.
일반적인 기본 정규식 표현을 사용할 수 있지만, 일부 기능은 지원되지 않는다고 합니다. (자세한 사양은 link 참조!)
그리고 일반 문자열과 마찬가지로 여러 개의 input이 있다면 작업 수행 전에 입력 문자열들이 하나로 연결됩니다.
REGEX MATCH는 첫 번째 일치 항목을 outVar에 저장하고,
REGEX MATCHALL은 입력 문자열에서 일치하는 모든 항목을 찾아서 outVar에 list로 저장합니다.
REGEX REPLACE의 경우 입력 문자열에서 일치되는 항목들이 모두 replaceWith로 대체되고 그 결과를 outVar에 저장합니다. 일치되는 항목들을 \1 또는 \2 등의 일반적인 표기법을 사용하여 replaceWith에서 참조할 수는 있지만, CMake에서는 백슬래시(\)자체를 사용하기 위해서는 이스케이프해야합니다. (\\1, \\2 로 사용)
cmake_minimum_required(VERSION 3.10)
project(string)
set(longStr abcdefabcdef)
string(REGEX MATCH "[ace]" matchVar ${longStr})
string(REGEX MATCHALL "[ace]" matchAllVar ${longStr})
string(REGEX REPLACE "([de])" "X\\1Y" replVar ${longStr})
message("matchVar = ${matchVar}")
message("matchAllVar = ${matchAllVar}")
message("replVar = ${replVar}")
Manipulation
- SUBSTRING
SUBSTRING으로 입력 문자열에서 일부 문자열을 추출할 수 있습니다.
string(SUBSTRING)에서 index는 input으로부터 추출할 시작 인덱스이고, 이 인덱스부터 length만큼 추출합니다. 만약 length에 -1이 입력되면, 시작 인덱스부터 input 문자열의 끝까지 추출하게 됩니다. (CMake 3.1 및 이전 버전에서는 length가 index에서 문자열 끝보다 더 길면 에러가 발생했습니다.)
cmake_minimum_required(VERSION 3.10)
project(string)
set(inputStr abcdefghijklmn)
string(SUBSTRING ${inputStr} 5 5 outputStr1)
string(SUBSTRING ${inputStr} 5 -1 outputStr2)
string(SUBSTRING ${inputStr} 5 100 outputStr3)
message("outputStr1 = ${outputStr1}")
message("outputStr2 = ${outputStr2}")
message("outputStr3 = ${outputStr3}")
- LENGTH, TOLOWER, TOUPPER, STRIP
위 명령어를 통해 문자열의 길이를 구하고, 대소문자 변환, 그리고 문자열 양 끝의 공백 제거가 가능합니다.
cmake_minimum_required(VERSION 3.10)
project(string)
set(inputStr " This is a string. ")
string(LENGTH ${inputStr} length)
string(TOLOWER ${inputStr} lowerStr)
string(TOUPPER ${inputStr} upperStr)
string(STRIP ${inputStr} noBlankStr)
message("length = ${length}")
message("lowerStr = ${lowerStr}")
message("upperStr = ${upperStr}")
message("noBlankStr = ${noBlankStr}")
이외에도 문자열 비교(Comparison), 해싱(Hashing), 등 다양한 작업들을 제공하지만, 일반적인 CMake 프로젝트에서는 잘 사용되지는 않는 것 같습니다.
(문자열 비교는 그나마 좀 사용될 것 같긴하네요.)
다른 기능들은 link를 참조하시길 바랍니다 !
'CMake' 카테고리의 다른 글
[CMake] Flow Control - if (0) | 2021.10.30 |
---|---|
[CMake] Lists (0) | 2021.10.29 |
[CMake] Variable (변수) (0) | 2021.10.29 |
[CMake] Tutorial (2) - Library 추가 (0) | 2021.10.28 |
[CMake] Tutorial (1) - Start CMake (0) | 2021.10.28 |
댓글