qmake로 의존 라이브러리의 유무를 확인하고 결과에 따라 처리를 변경합시다.

8651 단어 Qtqmake
이 기사는 Qt Advent Calendar 2016 5일째의 기사가 됩니다.

@taskjp 입니다. 첫날 부리네요. 그 이후 다양한 노력을하고 있습니다. .

어제는 @hermit4 씨의 Qt Creator를 원하는 모양으로 사용자 정의하세요. Qt 이라는 기사였습니다.

Qt Creator 1.0정도의 무렵은 아래와 같은 화상의 아카마루의 에리어를 더블 클릭 하는 것만으로 모드 선택기 색상 이 바뀌어져 편리했습니다만 왜 없어졌다. . .


그건 그렇고, 오늘은 조금 진지하게 Qt를 사용하는 데 도움이되는 이야기를 작성하려고합니다.

소개



한 프로젝트에 다음과 같은 코드가 있습니다.

한 프로젝트.pro
contains(QT_ARCH, arm.*) {
    INCLUDEPATH += 別のライブラリのヘッダファイルの場所
    LIBS += -L別のライブラリの場所 -l別のライブラリ
}

특정 프로젝트 .cpp
#ifdef __arm__
#include <別のライブラリのヘッダファイル>
#endif

#ifdef __arm__
    // 別のライブラリの関数の呼び出し
#endif

이 코드를 작성한 사람에게는
「어째서 arm인가 어떤가로 처리 나누고 있는 거야?」
라고 물었더니
「그렇다고 해서 그 다른 라이브러리는 arm상에서 밖에 준비되어 있지 않아」
라고 했습니다.

그 머리 이상한 그 다른 라이브러리는 별로 아키텍쳐에 의존하고 있는 것이 아니고, 개발기로 빌드하면 나름대로 움직이고, (Gentoo용의 ebuild 쓰고), 뭔가 더 좋은 방법이 있는 것은 아냐?

그래서 오늘은 qmake에서 종속성을 테스트하고 결과에 따라 처리를 변경하는 방법을 소개하고 싶습니다.

load(feature)



load 함수는 인수로 지정된 이름의 .prf(프로젝트 함수) 파일을 호출합니다.

configure 라고 지정했을 경우에는 (불필요한 일을 하고 있지 않는 경우는) qtbase/mkspecs/features/configure.prf 가 읽힙니다.

configure.prf의 일부를 발췌
# Try to build the test project in $$QMAKE_CONFIG_TESTS_DIR/$$1
# ($$_PRO_FILE_PWD_/config.tests/$$1 by default).
#
# If the test passes, config_$$1 will be added to CONFIG.
# The result is automatically cached. Use of cached results
# can be suppressed by passing CONFIG+=recheck to qmake.
#
# Returns: true iff the test passes
defineTest(qtCompileTest) {
   # 指定されたテストの実施
}

configure.prf 를 로드하면 qtCompileTest(test) 라는 함수를 사용할 수 있게 됩니다.
이 함수는 $$QMAKE_CONFIG_TESTS_DIR/이하의 인수로 지정된 디렉토리 이하에 있는 프로젝트를 빌드 해, 실행합니다.$$QMAKE_CONFIG_TESTS_DIR 는 기본적으로 $$_PRO_FILE_PWD_/config.tests 입니다.

테스트를 작성해 보자.


load(configure) 를 작성한 프로젝트 파일과 동일한 디렉토리에 config.tests 라는 디렉토리를 작성하고 그 아래에 종속성 테스트용 프로젝트를 작성합니다.

config.tests/libhoge/libhoge.pro
SOURCES = libhoge.cpp

CONFIG -= qt
CONFIG += link_pkgconfig
PKGCONFIG += hoge

config.tests/libhoge/libhoge.cpp
#include <hoge.h>

int main(int argc,char **argv)
{
    Hoge hoge;
    if (!hoge.isValid()) return -1;
    return 0;
}

이번에는 Linux에서 자주 사용되는 pkg-config이라는 구조를 사용하여 의존 패키지 hoge의 유무를 확인하기 위한 qmake 프로젝트를 만들었습니다.
pkg-config 로 hoge 가 발견되지 않는 경우나, libhoge.cpp 의 컴파일에 실패하는 경우, libhoge 를 실행해 0 이외의 코드가 돌려주고 오는 경우에는 에러로 간주합니다.

메인 프로젝트 파일에서 load(configure) 를 한 다음 qtCompileTest() 를 사용하여 libhoge 를 테스트합니다.

테스트가 성공했을 경우에는 qtCompileTest() 내에서 CONFIG += libhoge 라고 하는 코드가 달리기 때문에, 이하와 같은 형태로 성부로 분기할 수 있게 됩니다.

또, 헤더 파일이나 소스 파일에서도 판별할 수 있도록, .pro 속에서 전용의 매크로를 정의하고 있습니다.

main.pro
load(configure)
qtCompileTest(libhoge)

config_libhoge {
    CONFIG += link_pkgconfig
    PKGCONFIG += hoge
    DEFINES += HAVE_LIBHOGE
}

소스 코드는 이런 느낌입니다.

main.cpp
#ifdef HAVE_LIBHOGE
#include <hoge.h>
#endif

...

#ifdef HAVE_LIBHOGE
    Hoge hoge;
    hoge.exec();
#endif


실행



qmake 때 다음과 같은 로그가 출력됩니다.
$ qmake
...
Checking for libhoge... yes
...

결론



「ARM 때는 이 기능을 사용한다」코드보다, 「이 기능을 사용할 수 있을 때는 이 기능을 사용한다」가 직관적이고 알기 쉽네요.

이 구조는 qtmultimedia/qtmultimedia.pro 이나 qtmultimedia/config.tests/ 등, Qt 의 모듈에서도 사용되고 있는 기능이므로, 이 옆도 참고해 주시면 좋겠습니다.

그럼 또.

좋은 웹페이지 즐겨찾기