이 페이지에서

qmake 언어

많은 qmake 프로젝트 파일은 ` name = value ` 및 ` name += value ` 정의 목록을 사용하여 프로젝트에서 사용하는 소스 파일과 헤더 파일을 단순히 기술합니다. qmake는 또한 변수 선언에 제공된 정보를 처리하는 데 사용할 수 있는 다른 연산자, 함수 및 범위를 제공합니다. 이러한 고급 기능을 통해 단일 프로젝트 파일로부터 여러 플랫폼용 Makefile을 생성할 수 있습니다.

연산자

많은 프로젝트 파일에서 할당 연산자(=)와 추가 연산자(+=)를 사용하여 프로젝트에 대한 모든 정보를 포함할 수 있습니다. 일반적인 사용 패턴은 변수에 값 목록을 할당하고, 다양한 테스트 결과에 따라 추가 값을 덧붙이는 것입니다. qmake는 특정 변수를 기본값으로 정의하므로, 필요하지 않은 값을 걸러내기 위해 제거 연산자(-=)를 사용해야 할 때가 있습니다. 다음 섹션에서는 연산자를 사용하여 변수의 내용을 조작하는 방법을 설명합니다.

값 할당

= 연산자는 변수에 값을 할당합니다:

TARGET = myapp

위의 줄은 TARGET 변수에 myapp 을 할당합니다. 이렇게 하면 TARGET 에 이전에 설정된 모든 값이 myapp 으로 덮어쓰게 됩니다.

값 추가

+= 연산자는 변수의 값 목록에 새로운 값을 추가합니다:

DEFINES += USE_MY_STUFF

위의 줄은 생성된 Makefile에 포함될 전처리기 정의 목록에 ` USE_MY_STUFF `를 추가합니다.

값 제거

-= 연산자는 변수의 값 목록에서 특정 값을 제거합니다:

DEFINES -= USE_MY_STUFF

위의 코드는 생성된 Makefile에 포함될 전처리기 정의 목록에서 USE_MY_STUFF 를 제거합니다.

고유한 값 추가

*= 연산자는 변수의 값 목록에 값을 추가하지만, 해당 값이 이미 존재하지 않는 경우에만 추가합니다. 이를 통해 변수에 값이 여러 번 포함되는 것을 방지합니다. 예를 들어:

DEFINES *= USE_MY_STUFF

위의 코드에서, ` USE_MY_STUFF `은 이미 정의되어 있지 않은 경우에만 전처리기 정의 목록에 추가됩니다. 또한 ` unique()` 함수를 사용하면 변수에 각 값이 단 한 번만 포함되도록 할 수 있다는 점에 유의하십시오.

값 대체

~= 연산자는 정규 표현식과 일치하는 모든 값을 지정된 값으로 대체합니다:

DEFINES ~= s/QT_[DT].+/QT

위의 코드에서, 목록 내의 값 중 QT_D 또는 QT_T 로 시작하는 모든 값은 QT 으로 대체됩니다.

변수 전개

$$ 연산자는 변수의 내용을 추출하는 데 사용되며, 변수 간에 값을 전달하거나 함수에 값을 전달하는 데 사용할 수 있습니다:

EVERYTHING = $$SOURCES $$HEADERS
message("The project contains the following files:")
message($$EVERYTHING)

변수는 환경 변수의 내용을 저장하는 데 사용할 수 있습니다. 이러한 변수는 qmake가 실행될 때 평가되거나, 프로젝트가 빌드될 때 평가되도록 생성된 Makefile에 포함될 수 있습니다.

qmake가 실행될 때 환경 변수의 값을 얻으려면 $$(...) 연산자를 사용합니다:

DESTDIR = $$(PWD)
message(The project will be installed in $$DESTDIR)

위의 할당문에서, 프로젝트 파일이 처리될 때 ` PWD ` 환경 변수의 값이 읽힙니다.

생성된 Makefile이 처리될 때 환경 변수의 값을 얻으려면 ` $(...) ` 연산자를 사용합니다:

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 `의 값이 읽히지만, 생성된 Makefile에서는 ` $(PWD) `가 ` DESTDIR `에 할당됩니다. 이렇게 하면 Makefile이 처리될 때 환경 변수가 올바르게 설정되어 있는 한 빌드 프로세스의 유연성이 높아집니다.

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

범위

스코프는 절차적 프로그래밍 언어의 if 문과 유사합니다. 특정 조건이 참인 경우, 해당 스코프 내의 선언이 처리됩니다.

범위 구문

스코프는 조건문과 같은 줄에 오는 여중괄호, 일련의 명령어와 정의, 그리고 새 줄에 오는 닫는 중괄호로 구성됩니다:

<condition> {
    <command or definition>
    ...
}

열기 중괄호는 조건과 같은 줄에 작성되어야 합니다. 다음 절에서 설명하듯이, 스코프는 하나 이상의 조건을 포함하도록 연결될 수 있습니다.

범위와 조건

스코프는 조건 뒤에 중괄호 한 쌍으로 둘러싸인 일련의 선언이 이어지는 형태로 작성됩니다. 예를 들면 다음과 같습니다:

win32 {
    SOURCES += paintwidget_win.cpp
}

위의 코드는 Windows 플랫폼용으로 빌드할 때 생성된 Makefile에 나열된 소스 파일에 ` 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 줄에 사용자 정의 값을 입력할 수 있으므로, 이를 통해 프로젝트 파일을 맞춤 설정하고 생성된 Makefile을 세밀하게 조정할 수 있는 편리한 방법을 제공합니다.

플랫폼 범위 값

많은 범위 조건에서 사용되는 win32, macx 및 unix 값 외에도, 다양한 다른 내장 플랫폼 및 컴파일러별 값을 범위를 통해 테스트할 수 있습니다. 이러한 값들은 Qt의 mkspecs 디렉터리에 제공된 플랫폼 사양을 기반으로 합니다. 예를 들어, 프로젝트 파일의 다음 줄들은 현재 사용 중인 사양을 표시하고 linux-g++ 사양을 테스트합니다:

message($$QMAKESPEC)

linux-g++ {
    message(Linux)
}

mkspecs 디렉터리에 해당 사양이 존재하는 한, 다른 어떤 플랫폼-컴파일러 조합에 대해서도 테스트할 수 있습니다.

변수

프로젝트 파일에서 사용되는 변수 중 상당수는 DEFINES, SOURCES, HEADERS와 같이 qmake가 Makefile을 생성할 때 사용하는 특수 변수입니다. 또한, 사용자 전용 변수를 생성할 수도 있습니다. 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.)
}

이러한 유형의 함수는 조건식에서만 사용해야 합니다.

스코프의 조건을 제공하기 위해 사용자 정의 함수를 정의할 수도 있습니다. 다음 예제는 목록에 있는 각 파일이 존재하는지 테스트하고, 모두 존재하면 true를, 그렇지 않으면 false를 반환합니다:

defineTest(allFiles) {
    files = $$ARGS

    for(file, files) {
        !exists($$file) {
            return(false)
        }
    }
    return(true)
}

© 2026 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.