cmake 사용 기록

6232 단어 번역하다

CMake의 매크로 및 함수 매개변수 ARGV ARGC ARGN


cmake의 매크로(macro)와 함수(function)는 동적 매개 변수 ARGC가 전송된 매개 변수 개수 변수 ARGV0, ARGV1을 기록합니다... 순서는 전송된 매개 변수 ARGV는 모든 전송된 매개 변수를 포함하는list 변수 ARGN도 전송된 매개 변수를 포함하는list입니다. 그러나 모든 매개 변수가 아니라macro/function가 성명한 매개 변수 뒤에 있는 모든 전송된 매개 변수를 의미합니다. #매크로를 정의하고 두 개의 매개 변수를 명시합니다.world
macro(argn_test hello world)
	MESSAGE(STATUS ARGV=${ARGV})
	MESSAGE(STATUS ARGN=${ARGN})
	MESSAGE(STATUS ARGV0=${ARGV0})
	MESSAGE(STATUS ARGV1=${ARGV1})
	MESSAGE(STATUS ARGV2=${ARGV2})
	MESSAGE(STATUS ARGV3=${ARGV3})
endmacro()

매크로 호출 시 매개 변수 4개 전송
argn_test(TOM JERRY SUSAN BERN)

==== output ====

-- ARGV=TOMJERRYSUSANBERN
-- ARGN=SUSANBERN
-- ARGV0=TOM
-- ARGV1=JERRY
-- ARGV2=SUSAN
-- ARGV3=BERN

CMake 변수 및 변수 참조


CMake의 변수는 성명할 필요가 없고 유형 개념이 없다는 점은python과 유사하다.변수는 하나의 매크로에 정의된 변수라도 매크로 밖에서 접근할 수 있는 전역적인 것으로 간주할 수 있다.모든 변수는 목록 변수로 다음에 예를 들면 이 점을 상세하게 설명한다.CMake는 대소문자에 민감합니다.CMake에는 두 가지 인용 방식이 있습니다. 변수 값에 대한 인용과 이 변수 자체를 직접 인용하는 방식은 각각 ${varName}과 varName입니다.바늘 같다

CMake의 매크로 및 함수


대부분의 스크립트 언어와 마찬가지로 CMake에도 매크로와 함수의 개념이 있다. 키워드는 각각'macro'와'function'이다. 구체적인 사용법은 다음과 같다.
#  

macro( [arg1 [arg2 [arg3 ...]]])
     COMMAND1(ARGS ...)
     COMMAND2(ARGS ...)
     ...
endmacro()
#  

function( [arg1 [arg2 [arg3 ...]]])
     COMMAND1(ARGS ...)
     COMMAND2(ARGS ...)
     ...
endfunction()

간단한 구문 및 함수를 예로 들면 매크로의 예를 살펴보겠습니다.
macro(sum outvar)
     set(_args ${ARGN})
     set(result 0)
     foreach(_var ${_args})
         math(EXPR result "result+{_var}")
     endforeach()
     set(outvar{result})
endmacro()
sum(addResult 1 2 3 4 5)
message("Result is :${addResult}")

위쪽은 구문 및 매크로 정의입니다. 코드를 해석해 보겠습니다. "${ARGN}"은 CMake의 변수입니다. 매크로에 전달된 여분의 매개 변수를 가리킵니다. 이 매크로sum에는 하나의 매개 변수 "outvar"만 정의되어 있기 때문에 나머지 구문 숫자는 부정확한 형식으로 전달되기 때문에 여분의 매개 변수를 단독 변수에 먼저 전달해야 합니다.물론 이 예시에서 첫 번째 줄 코드는 불필요한 것 같다. 왜냐하면 추가 파라미터를 하나의 변수에 단독으로 놓을 필요가 없을 것 같지만, 이렇게 하는 것을 권장한다.위의 매크로에 대해 더욱 강화합니다. 만약에 우리가 이 매크로에 전송된 매개 변수의 수를 제한하고 싶다면, 매크로를 다시 쓸 수 있습니다.
macro(sum outvar)
     set(_args ${ARGN})
     list(LENGTH _args argLength)
     if(NOT argLength LESS 4)        #  4 
         message(FATAL_ERROR "to much args!")
     endif()
     set(result 0)
     foreach(_var ${ARGN})
         math(EXPR result "result+{_var}")
     endforeach()
     set(outvar{result})
endmacro()
sum(addResult 1 2 3 4 5)
message("Result is :${addResult}")

한편, CMake의 함수('function')와 매크로의 유일한 차이점은 함수가 매크로처럼 계산 결과를 전달할 수 없고 (전혀 할 수 없는 것도 아니고 복잡한 것일 뿐이다) 함수 중의 변수는 국부적이고 매크로의 변수는 밖에서도 방문할 수 있다는 것이다. 다음 예를 보십시오.
macro(macroTest)
     set(test1 "aaa")
endmacro()

function(funTest)
     set(test2 "bbb")
endfunction()

macroTest()
message("${test1}")

funTest()
message("${test2}")

==== output ====
aaa

이 코드를 실행하면 메시지 "aaa"만 출력되어 매크로와 함수의 차이를 볼 수 있습니다

cmake 함수 매개 변수 해석 cmake_parse_arguments


만약 우리가 하나의 function에 list를 매개 변수로 전달한다면, function에서 형삼은 다음과 같은 상황이 될 것이다.
set(SRC)
list(APPEND SRC a.cpp b.cpp)
list(APPEND SRC c.cpp d.cpp)
 
function(tst_arguments src_list)
	message("src_list = "${src_list})
endfunction()
 
message("SRC = "${SRC})
tst_arguments(${SRC})
 
==== output ====
SRC = a.cppb.cppc.cppd.cpp
src_list = a.cpp

이상하게도 이곳의 ${SRC}는 function 외에 완전한 네 개의 원소인데, function에는 첫 번째 원소만 남았다. (list의 길이와 관련이 있을 수 있다.)만약 우리가 function에 n개의 원본 파일로 구성된list를 보내려고 한다면, 이것은 분명히 안 된다.간단한 해결 방법은 ARGV, ARGC를 사용하는 것이다. 그들의 의미는 C/C++에서main의argv와argc와 같다. 각각 매개 변수와 매개 변수의 개수를 대표하고 다음과 같은 방법으로 매개 변수를 해석한다.
function(tst_arguments src_list)
	message("ARGC = "${ARGC})
	message("ARGV = "${ARGV})
 
        set(INDEX 0)
    
	while(INDEX LESS ${ARGC})
		message("ARG = "${ARGV${INDEX}})
		math(EXPR INDEX "${INDEX} + 1")
	endwhile()
endfunction()
 
tst_arguments(${SRC})

==== output ====
ARGC = 4
ARGV = a.cppb.cppc.cppd.cpp
ARG = a.cpp
ARG = b.cpp
ARG = c.cpp
ARG = d.cpp 

가장 사용하기 편한 것은 cmake의 cmake_parse_arguments는 함수 파라미터를 해석합니다. 이것은 맵 키 값을 해석하는 것과 같습니다. 우선 함수 원형을 보십시오.
# cmake 
include (CMakeParseArguments) 

cmake_parse_arguments (    args...)

우선,prefix는 접두사입니다. 이따가 매개 변수를 인용할 때 언급할 것입니다. 목록입니다. 관심 있는 KeyWord를 포함할 수 있습니다. 그 다음에 그것을 통해 당신이 필요로 하는 KeyWord가 설정되었는지 확인할 수 있습니다.단일 값 매개변수의 KeyWord 목록입니다.다중 값 매개 변수의 KeyWord 목록 (예:list) 입니다. 다음 예를 들어 어떻게 사용하는지 보십시오. 우선 필요한 함수를 정의합니다. 매개 변수는 cmake_parse_arguments에서 해석하기 때문에 함수 성명에서 매개 변수를 정의할 필요가 없습니다.
function(tst_arguments)
  CMAKE_PARSE_ARGUMENTS( TEST "" "NAME;COMMAND;BASELINE" "ARGSLIST" ${ARGN}  )
 
  message("TEST_DEFAULT_ARGS is ${TEST_DEFAULT_ARGS} from ${ARGN}")
  message("TEST_NAME is ${TEST_NAME}")
  message("TEST_COMMAND is ${TEST_COMMAND}")
  message("TEST_ARGSLIST is ${TEST_ARGSLIST}")
  message("TEST_BASELINE is ${TEST_BASELINE}")
 
endfunction(tst_arguments)

여기서 접두사는 TEST입니다. 단일 값 매개 변수의 KeyWord(NAME;COMMAND;BASELINE)를 설정합니다. 이것은 다음 함수 호출에서 KeyWord와 Value의 관계를 표시하고 다중 값 매개 변수의 KeyWord("ARGSLIST")를 설정합니다. 호출 함수:
tst_arguments(  NAME testiso
    COMMAND  "RunMe"
    ARGSLIST  ${SRC}
    BASELINE   "/home/sakaue/iWork" )
 
==== output ====
TEST_DEFAULT_ARGS is  from NAME;testiso;COMMAND;RunMe;ARGSLIST;a.cpp;b.cpp;c.cpp;d.cpp;BASELINE;/home/sakaue/iWork
TEST_NAME is testiso
TEST_COMMAND is RunMe
TEST_ARGSLIST is a.cpp;b.cpp;c.cpp;d.cpp
TEST_BASELINE is /home/sakaue/iWork

여기서 호출할 때의 매개 변수 전달은 맵과 같다. 등등, 함수에서 접두사 + KeyWord를 사용하여 Value를 호출한다. 이렇게 하면 자신이 해석하는 매개 변수보다 훨씬 편리하고list 매개 변수가 있을 때 다른 종류의 함수와 혼합되지 않는다.

참고

  • CMake 입문 및 학습 노트
  • cmake 함수 매개 변수 해석
  • CMakeParseArguments
  • cmake:macro,function에서 ARGV,ARGN 파라미터의 차이

  • 좋은 웹페이지 즐겨찾기