조건문 기본 개념
CMakeLists.txt에서 조건문은 특정 조건에 따라 빌드 설정을 다르게 적용하기 위해 사용된다. 이 조건문은 if
, else
, elseif
, endif
등의 키워드를 통해 구현된다. 기본적인 형태는 다음과 같다:
if(조건)
# 조건이 참일 때 실행되는 코드
elseif(다른 조건)
# 다른 조건이 참일 때 실행되는 코드
else()
# 모든 조건이 거짓일 때 실행되는 코드
endif()
CMake의 조건문은 주로 변수의 값, 파일의 존재 여부, 컴파일러 종류, 플랫폼 등에 따라 다르게 빌드 설정을 해야 할 때 사용된다.
조건문에서 사용되는 주요 표현식
CMake 조건문에서 자주 사용되는 표현식은 다음과 같다:
-
변수 검사: 변수가 정의되었는지, 또는 특정 값과 일치하는지를 확인한다.
cmake if(DEFINED 변수명) if(변수명 STREQUAL "값")
-
파일 검사: 파일이나 디렉토리의 존재 여부를 확인한다.
cmake if(EXISTS "경로/파일명") if(IS_DIRECTORY "경로") if(IS_FILE "파일명")
-
플랫폼 검사: 운영체제나 컴파일러를 확인하여 특정 플랫폼에 맞는 설정을 적용한다.
cmake if(WIN32) if(UNIX) if(APPLE) if(MSVC)
-
논리 연산자: 조건을 결합하거나 부정할 때 사용된다.
cmake if(NOT 조건) if(조건1 AND 조건2) if(조건1 OR 조건2)
고급 조건문 사용법
조건문은 기본적인 조건 검사를 넘어서 복잡한 빌드 스크립트를 작성하는 데 유용하다.
-
정규 표현식 사용: 문자열 매칭을 통해 조건을 검사할 수 있다.
cmake if(변수명 MATCHES "정규표현식")
-
조건부 옵션 설정: 특정 조건에 따라 옵션을 활성화하거나 비활성화할 수 있다. ```cmake option(OPTION_NAME "옵션 설명" OFF)
if(조건) set(OPTION_NAME ON) endif() ```
-
함수 내부에서 조건문 사용: CMake 함수나 매크로 내에서 조건문을 사용해 동적으로 설정을 조정할 수 있다.
cmake function(함수명) if(조건) # 조건에 따른 작업 수행 endif() endfunction()
-
정의된 대상에 따라 조건적 빌드 설정: 특정 대상(target)이 존재하는지에 따라 설정을 다르게 할 수 있다.
cmake if(TARGET target_name) # 대상이 존재할 때 수행할 작업 endif()
조건문을 사용한 예제
다음은 실제 프로젝트에서 조건문을 사용하는 예제이다:
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
add_definitions(-DDEBUG_MODE)
message(STATUS "디버그 모드로 빌드 중이다.")
else()
add_definitions(-DNDEBUG)
message(STATUS "릴리즈 모드로 빌드 중이다.")
endif()
if(WIN32)
set(OS_SPECIFIC_LIBS ws2_32)
elseif(UNIX)
set(OS_SPECIFIC_LIBS pthread)
endif()
target_link_libraries(내_타겟 ${OS_SPECIFIC_LIBS})
이 예제에서는 빌드 타입과 운영체제에 따라 서로 다른 정의와 라이브러리를 설정한다. 이는 멀티플랫폼 프로젝트에서 필수적인 방법이다.
조건문 디버깅
CMake에서 조건문이 예상대로 동작하지 않을 경우, message()
함수를 사용하여 조건문 내부에서 변수 값을 출력함으로써 디버깅할 수 있다.
if(NOT DEFINED 변수명)
message(STATUS "변수명이 정의되지 않았다.")
endif()
이렇게 하면 스크립트 실행 중에 변수의 상태를 명확하게 파악할 수 있어, 조건문이 올바르게 평가되는지 확인하는 데 도움이 된다.
관련 자료: - CMake 공식 문서: 조건문 사용법 - CMake tutorial