qmake 언어
대부분의 qmake 프로젝트 파일은 name = value
및 name += value
정의 목록을 사용하여 프로젝트에서 사용하는 소스 및 헤더 파일을 간단히 설명합니다. 또한 변수 선언에 제공된 정보를 처리하는 데 사용할 수 있는 다른 연산자, 함수 및 범위도 제공합니다. 이러한 고급 기능을 사용하면 단일 프로젝트 파일에서 여러 플랫폼용 메이크파일을 생성할 수 있습니다.
연산자
많은 프로젝트 파일에서 할당(=
) 및 추가(+=
) 연산자를 사용하여 프로젝트에 대한 모든 정보를 포함할 수 있습니다. 일반적인 사용 패턴은 변수에 값 목록을 할당하고 다양한 테스트 결과에 따라 더 많은 값을 추가하는 것입니다. qmake는 기본값을 사용하여 특정 변수를 정의하기 때문에 제거(-=
) 연산자를 사용하여 필요하지 않은 값을 필터링해야 하는 경우가 있습니다. 다음 섹션에서는 연산자를 사용하여 변수의 내용을 조작하는 방법을 설명합니다.
값 할당하기
=
연산자는 변수에 값을 할당합니다:
TARGET = myapp
위 줄은 TARGET 변수를 myapp
로 설정합니다. 이렇게 하면 TARGET
에 이전에 설정된 모든 값을 myapp
로 덮어씁니다.
값 추가하기
+=
연산자는 변수의 값 목록에 새 값을 추가합니다:
DEFINES += USE_MY_STUFF
위 줄은 생성된 메이크파일에 넣을 전처리기 정의 목록에 USE_MY_STUFF
을 추가합니다.
값 제거하기
-=
연산자는 변수의 값 목록에서 값을 제거합니다:
DEFINES -= USE_MY_STUFF
위 줄은 생성된 메이크파일에 넣을 전처리기 정의 목록에서 USE_MY_STUFF
을 제거합니다.
고유 값 추가하기
*=
연산자는 변수의 값 목록에 값을 추가하지만 아직 존재하지 않는 경우에만 값을 추가합니다. 이렇게 하면 변수에 값이 여러 번 포함되는 것을 방지할 수 있습니다. 예를 들어
DEFINES *= USE_MY_STUFF
위 줄에서 USE_MY_STUFF
은 아직 정의되어 있지 않은 경우에만 전처리기 정의 목록에 추가됩니다. 고유() 함수는 변수에 각 값의 인스턴스가 하나만 포함되도록 하는 데에도 사용할 수 있습니다.
값 바꾸기
~=
연산자는 정규식과 일치하는 모든 값을 지정된 값으로 바꿉니다:
DEFINES ~= s/QT_[DT].+/QT
위 줄에서 QT_D
또는 QT_T
으로 시작하는 목록의 모든 값은 QT
으로 바뀝니다.
변수 확장
$$
연산자는 변수의 내용을 추출하는 데 사용되며, 변수 간에 값을 전달하거나 함수에 값을 제공하는 데 사용할 수 있습니다:
EVERYTHING = $$SOURCES $$HEADERS message("The project contains the following files:") message($$EVERYTHING)
변수는 환경 변수의 내용을 저장하는 데 사용할 수 있습니다. 변수는 qmake가 실행될 때 평가하거나 프로젝트 빌드 시 평가를 위해 생성된 메이크파일에 포함시킬 수 있습니다.
qmake를 실행할 때 환경 값의 내용을 가져오려면 $$(...)
연산자를 사용합니다:
DESTDIR = $$(PWD) message(The project will be installed in $$DESTDIR)
위의 할당에서는 프로젝트 파일이 처리될 때 PWD
환경 변수의 값을 읽습니다.
생성된 메이크파일이 처리되는 시점의 환경 값의 내용을 가져오려면 $(...)
연산자를 사용합니다:
DESTDIR = $$(PWD) message(The project will be installed in $$DESTDIR) DESTDIR = $(PWD) message(The project will be installed in the value of PWD) message(when the Makefile is processed.)
위의 할당에서는 프로젝트 파일이 처리될 때 PWD
의 값을 즉시 읽지만, 생성된 메이크파일에서는 $(PWD)
이 DESTDIR
에 할당됩니다. 이렇게 하면 메이크파일이 처리될 때 환경 변수가 올바르게 설정되어 있는 한 빌드 프로세스가 더 유연해집니다.
qmake 속성 액세스
특수 $$[...]
연산자를 사용하여 qmake 속성에 액세스할 수 있습니다:
message(Qt version: $$[QT_VERSION]) message(Qt is installed in $$[QT_INSTALL_PREFIX]) message(Qt resources can be found in the following locations:) message(Documentation: $$[QT_INSTALL_DOCS]) message(Header files: $$[QT_INSTALL_HEADERS]) message(Libraries: $$[QT_INSTALL_LIBS]) message(Binary files (executables): $$[QT_INSTALL_BINS]) message(Plugins: $$[QT_INSTALL_PLUGINS]) message(Data files: $$[QT_INSTALL_DATA]) message(Translation files: $$[QT_INSTALL_TRANSLATIONS]) message(Settings: $$[QT_INSTALL_CONFIGURATION]) message(Examples: $$[QT_INSTALL_EXAMPLES])
자세한 내용은 qmake 구성하기를 참조하세요.
이 연산자로 접근할 수 있는 속성은 일반적으로 타사 플러그인과 컴포넌트를 Qt에 통합할 수 있도록 하는 데 사용됩니다. 예를 들어, 프로젝트 파일에 다음과 같은 선언을 하면 Qt Widgets Designer 플러그인을 Qt Widgets Designer 의 내장 플러그인과 함께 설치할 수 있습니다:
target.path = $$[QT_INSTALL_PLUGINS]/designer INSTALLS += target
Scopes
범위는 절차적 프로그래밍 언어의 if
문과 유사합니다. 특정 조건이 참이면 범위 내의 선언이 처리됩니다.
범위 구문
범위는 조건과 같은 줄의 여는 중괄호, 명령 및 정의 시퀀스, 새 줄의 닫는 중괄호로 구성됩니다:
<condition> { <command or definition> ... }
여는 중괄호는 조건과 같은 줄에 작성해야 합니다. 다음 섹션에 설명된 대로 범위를 연결하여 두 개 이상의 조건을 포함할 수 있습니다.
범위 및 조건
범위는 한 쌍의 중괄호 안에 포함된 일련의 선언이 뒤에 오는 조건으로 작성됩니다. 예를 들어
win32 { SOURCES += paintwidget_win.cpp }
위의 코드는 Windows 플랫폼용으로 빌드할 때 생성된 메이크파일에 나열된 소스에 paintwidget_win.cpp
파일을 추가합니다. 다른 플랫폼용으로 빌드할 때는 이 정의가 무시됩니다.
주어진 범위에서 사용된 조건을 무효화하여 원래 조건이 거짓인 경우에만 처리되는 대체 선언 집합을 제공할 수도 있습니다. 예를 들어 Windows를 제외한 모든 플랫폼에 대해 빌드할 때 무언가를 처리하려면 다음과 같이 범위를 무효화합니다:
!win32 { SOURCES -= paintwidget_win.cpp }
범위를 중첩하여 둘 이상의 조건을 결합할 수 있습니다. 예를 들어 디버깅이 활성화된 경우에만 특정 플랫폼에 대한 특정 파일을 포함하려면 다음과 같이 작성하세요:
macx { CONFIG(debug, debug|release) { HEADERS += debugging.h } }
중첩된 범위를 많이 작성하지 않으려면 :
연산자를 사용하여 범위를 중첩할 수 있습니다. 위의 예에서 중첩된 범위는 다음과 같은 방식으로 다시 작성할 수 있습니다:
macx:CONFIG(debug, debug|release) { HEADERS += debugging.h }
:
연산자를 사용하여 한 줄 조건부 할당을 수행할 수도 있습니다. 예를 들어
win32:DEFINES += USE_MY_STUFF
위 줄은 Windows 플랫폼용으로 빌드할 때만 DEFINES 변수에 USE_MY_STUFF
을 추가합니다. 일반적으로 :
연산자는 논리 AND 연산자처럼 작동하며, 여러 조건을 결합하고 모든 조건이 참이어야 합니다.
또한 |
연산자는 여러 조건을 결합하고 그 중 하나만 참이어야 하는 논리 OR 연산자처럼 작동합니다.
win32|macx { HEADERS += debugging.h }
두 연산자를 혼합해야 하는 경우 if
함수를 사용하여 연산자 우선 순위를 지정할 수 있습니다.
if(win32|macos):CONFIG(debug, debug|release) { # Do something on Windows and macOS, # but only for the debug configuration. } win32|if(macos:CONFIG(debug, debug|release)) { # Do something on Windows (regardless of debug or release) # and on macOS (only for debug). }
이 조건은 와일드카드 문자를 허용하여 CONFIG
값 또는 mkspec 이름 계열과 일치하도록 합니다.
win32-* { # Matches every mkspec starting with "win32-" SOURCES += win32_specific.cpp }
참고: 이전에는 위와 같이 와일드카드로 mkspec 이름을 확인하는 것이 qmake의 플랫폼 확인 방식이었습니다. 요즘에는 QMAKE_PLATFORM
변수에 mkspec으로 정의된 값을 사용하는 것이 좋습니다.
else
범위를 사용하여 범위 내에 대체 선언을 제공할 수도 있습니다. 각 else
범위는 앞 범위의 조건이 거짓인 경우 처리됩니다. 이렇게 하면 다른 범위와 결합하여 복잡한 테스트를 작성할 수 있습니다(위와 같이 :
연산자로 구분). 예를 들어
win32:xml { message(Building for Windows) SOURCES += xmlhandler_win.cpp } else:xml { SOURCES += xmlhandler.cpp } else { message("Unknown configuration") }
구성 및 범위
CONFIG 변수에 저장된 값은 qmake에서 특별히 취급합니다. 가능한 각 값을 범위의 조건으로 사용할 수 있습니다. 예를 들어 CONFIG
에 저장된 값 목록은 opengl
값으로 확장할 수 있습니다:
CONFIG += opengl
이 작업의 결과로 opengl
를 테스트하는 모든 범위가 처리됩니다. 이 기능을 사용하여 최종 실행 파일에 적절한 이름을 지정할 수 있습니다:
opengl { TARGET = application-gl } else { TARGET = application }
이 기능을 사용하면 특정 구성에 필요한 모든 사용자 지정 설정을 잃지 않고 프로젝트의 구성을 쉽게 변경할 수 있습니다. 위 코드에서는 첫 번째 범위의 선언이 처리되고 최종 실행 파일은 application-gl
으로 호출됩니다. 그러나 opengl
을 지정하지 않으면 두 번째 범위의 선언이 대신 처리되고 최종 실행 파일은 application
으로 호출됩니다.
CONFIG
줄에 자신만의 값을 넣을 수 있으므로 프로젝트 파일을 사용자 정의하고 생성된 메이크파일을 미세 조정할 수 있는 편리한 방법을 제공합니다.
플랫폼 범위 값
많은 범위 조건에서 사용되는 win32
, macx
, unix
값 외에도 다양한 기본 제공 플랫폼 및 컴파일러별 값을 범위로 테스트할 수 있습니다. 이러한 값은 Qt의 mkspecs
디렉터리에 제공된 플랫폼 사양을 기반으로 합니다. 예를 들어, 프로젝트 파일의 다음 줄은 현재 사용 중인 사양과 linux-g++
사양에 대한 테스트를 보여줍니다:
message($$QMAKESPEC) linux-g++ { message(Linux) }
mkspecs
디렉터리에 해당 사양이 존재하는 한 다른 모든 플랫폼-컴파일러 조합에 대해 테스트할 수 있습니다.
변수
프로젝트 파일에 사용되는 많은 변수는 qmake가 메이크파일을 생성할 때 사용하는 특수 변수(예: 정의, 소스 및 헤더)입니다. 또한 사용자가 직접 사용할 변수를 만들 수도 있습니다. qmake는 해당 이름에 대한 할당이 발생하면 지정된 이름으로 새 변수를 만듭니다. 예를 들어:
MY_VARIABLE = value
범위를 처리할 때 변수를 평가할 필요가 없는 한 qmake는 변수를 무시하므로 사용자가 자신의 변수에 대해 수행하는 작업에는 제한이 없습니다.
변수 이름 앞에 $$를 붙여서 현재 변수의 값을 다른 변수에 할당할 수도 있습니다. 예를 들어
MY_DEFINES = $$DEFINES
이제 MY_DEFINES 변수는 프로젝트 파일에서 이 시점의 DEFINES 변수에 있는 내용을 포함합니다. 이는 다음과 같기도 합니다:
MY_DEFINES = $${DEFINES}
두 번째 표기법을 사용하면 공백으로 구분하지 않고 변수의 내용을 다른 값에 추가할 수 있습니다. 예를 들어 다음과 같이 하면 최종 실행 파일에 사용 중인 프로젝트 템플릿이 포함된 이름이 지정됩니다:
TARGET = myproject_$${TEMPLATE}
함수 바꾸기
qmake는 변수의 내용을 처리할 수 있는 다양한 내장 함수를 제공합니다. 이러한 함수는 제공된 인수를 처리하고 그 결과로 값 또는 값 목록을 반환합니다. 변수에 결과를 할당하려면 한 변수의 내용을 다른 변수에 할당할 때와 마찬가지로 이 유형의 함수와 함께 $$
연산자를 사용합니다:
HEADERS = model.h HEADERS += $$OTHER_HEADERS HEADERS = $$unique(HEADERS)
이 유형의 함수는 할당의 오른쪽(즉, 피연산자로)에 사용해야 합니다.
다음과 같이 변수의 내용을 처리하는 함수를 직접 정의할 수 있습니다:
defineReplace(functionName){ #function code }
다음 예제 함수는 변수 이름을 유일한 인수로 사용하고, 내장 함수인 eval() 을 사용하여 변수에서 값 목록을 추출한 다음 파일 목록을 컴파일합니다:
defineReplace(headersAndSources) { variable = $$1 names = $$eval($$variable) headers = sources = for(name, names) { header = $${name}.h exists($$header) { headers += $$header } source = $${name}.cpp exists($$source) { sources += $$source } } return($$headers $$sources) }
테스트 함수
qmake는 스코프를 작성할 때 조건으로 사용할 수 있는 내장 함수를 제공합니다. 이러한 함수는 값을 반환하지 않고 대신 성공 또는 실패를 나타냅니다:
count(options, 2) { message(Both release and debug specified.) }
이 유형의 함수는 조건 표현식에만 사용해야 합니다.
범위의 조건을 제공하기 위해 자체 함수를 정의할 수 있습니다. 다음 예는 목록에 있는 각 파일이 존재하는지 여부를 테스트하여 모두 존재하면 참을 반환하고, 없으면 거짓을 반환합니다:
defineTest(allFiles) { files = $$ARGS for(file, files) { !exists($$file) { return(false) } } return(true) }
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.