SlideShare a Scribd company logo
1 of 41
Download to read offline
qmake入門
日本Qtユーザー会
• Twitter ID : hermit4
• 日本Qtユーザー会 おやつ部部長
• フリーランスなので他の肩書きありません
• Qt3頃からQtの利用を開始
• 商用ライセンスユーザー
自己紹介
2
3
• あまり大きな声を出せる人ではないし、人前は苦手ですので、聴き
にくかったら申し訳ない
• 既にQt Creatorにはqbsが同梱されているご時世なのですが、今回
は、qbsの話はしません
• QtCreatorは最近使うようになったばっかりなのでコマンドライン
の話が中心です
• 生成された後のプロジェクトファイルやMakefileの話はしません
ごめんなさい
qmakeの概要
5
qmakeとは
GCC, make
Xcode
Visual Studio
Qtはクロスプラットフォーム向けのフレームワークです
でも、ビルドのツールチェーンは各プラットフォームにお任せです
6
qmakeとは
Makefile
.xcodeproj
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = helloworld
TEMPLATE = app
SOURCES += main.cpp
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
.pro file
.vcxproj
qmake -tp vc
qmake -spec macx-xcode
7
helloworld.pro file
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = helloworld
TEMPLATE = app
SOURCES += main.cpp
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
• 変数
• QT
• TARGET
• TEMPLATE
• SOURCES
• HEADERS
• FORMS
• テスト関数
• greaterThan
8
Qt5.5.0/Examples/Qt-5.5/qt3d/qt3d.pro
TEMPLATE = subdirs
SUBDIRS += 
exampleresources 
playground-qml 
:
skybox
# TODO Port the old examples to new APIs
#SUBDIRS += qt3d
#qtHaveModule(qml): SUBDIRS += quick3d
# Make all other subdirs depend on exampleresources
for(subdir, SUBDIRS) {
!equals(subdir, exampleresources) {
$${subdir}.depends += exampleresources
}
}
• 変数
• TEMPLATE
• SUBDIRS
• テスト関数
• for
• equals
• コメント
qmakeの基礎
10
qmakeの基礎
• コマンド
• qmake -project [-nopwd]
プロジェクトファイルの生成
• qmake [-makefile] [-spec spec][ -tp prefix] [-t template] [-nocache|-cache
file] [-nomoc] [-d] [-nodpend] files
Makefileの生成
• qmake [-query| -set varname value | -unset varname]
プロパティ値の取得・設定・削除
11
qmakeの基礎 - プロパティ
QT_SYSROOT:
:
:
QT_HOST_PREFIX:/Users/hermit4/Qt5.5.0/5.5/clang_64
QT_HOST_DATA:/Users/hermit4/Qt5.5.0/5.5/clang_64
QT_HOST_BINS:/Users/hermit4/Qt5.5.0/5.5/clang_64/bin
QT_HOST_LIBS:/Users/hermit4/Qt5.5.0/5.5/clang_64/lib
QMAKE_SPEC:macx-clang
QMAKE_XSPEC:macx-clang
QMAKE_VERSION:3.0
QT_VERSION:5.5.0
-specを指定しない場合は、プロパティでプラットフォーム標準のプロパティに従った
SPECが利用されます
12
qmakeの基礎
• 入力ファイル
• *.pro ファイル
プロジェクトファイル
• *.pri ファイル
インクルードプロジェクトファイル、include()関数で読み込みます
• *.prf ファイル
機能ファイル
• qmake.conf ファイル
mkspecs下のファイル。-specで指定
13
qmakeの基礎 - Project File Elements
• 変数
変数は、文字列のリストを保持するもので、簡単なプロジェクトは最低限
の変数を指定するだけで作成できます。
• TEMPLATE
• CONFIG
• QT
• SOURCES
• HEADERS
• FORMS
• RESOURCES
• TRANSLATIONS
14
qmakeの基礎 - Project File Elements
• 変数
他にもMakefileに必要な様々な変数が用意されています。
• INCLUDEPATH
• DEFINES
• LIBS
• DEPENDS
• _PRO_FILE_
• _PRO_FILE_PWD_
変数によっては環境によってはMakefile等へ反映されない変数もあるので、
注意が必要になります。
15
qmakeの基礎 - Project File Elements
• 変数
• 値の代入
TEMPLATE = app
• 値の追加
QT += core
• ユニーク値の追加
LIBS *= -lm
• 値の削除
QT -= gui
• 値の置換
DEFINES ~= s/QT_[DT].*/QT
例えば、「DEFINES = QT_D_TEST QT_X_TEST」の場合、
上記で$$DEFINES の値「 QT QT_X_TEST」に置き換わります
16
qmakeの基礎 - Project File Elements
• 変数
• 変数の参照
$$HOGE , $${HOGE}
$${HOGE}_piyo
• 環境変数の参照
$$(HOME)
• プロパティの参照
$$[QMAKE_SPEC]
• 注意事項
• INCLUDEPATH += $(PWD)はMakefileでは“-I$(PWD)”に変換されます
• message($$INCLUDEPATH) では”/home/hermit4”と展開されます
17
qmakeの基礎 - Project File Elements
• 空白・バックスラッシュ(¥)
• 空白は、リストの区切り文字として使われます
• 空白を含む文字列を一つの文字列として登録する場合は、ダブルクウォ
ートかシングルクォートで囲む必要があります
• 行末をバックスラッシュにすると、次の1行も合わせて連続した1行と
して処理されます
• コメント
• # から行末まではコメントとして扱われます
• “# xxxxx”となっていても、#から先はコメントになるので”閉じがなくて
エラーになります
18
qmakeの基礎 - Project File Elements
• 組込関数
qmakeではプロジェクトファイルで利用できる関数が幾つか定義されています。大別すると変
換結果を返す変換関数と、真偽値を返すテスト関数に大別されます。
• 変換関数
• absolute_path
• dirname
• format_number
• system
• テスト関数
• include
• contains
• equals
• exists
• system
19
qmakeの基礎 - Project File Elements
• スコープ構文
<condition>:<definition or command>
<condition> {
<definition or command>
:
}
<condition>を満たす場合に : の後の1行あるいは{}内のすべてが実行されま
す。入れ子にできるので
<condition>:<condition> {
<definition or command>
}
という表記も可能です
20
qmakeの基礎 - Project File Elements
• スコープ構文 - condition
conditionとして使えるのは以下の通り
• テスト関数の結果
contains(SOURCES, “debugprint.cpp”):DEFINES += DEBUGPRINT
• プラットフォーム名(QMAKE_PLATFORMの値)
win32:SOURCES += platform_w32.cpp
!unix:SOURCES -= platform_unix.cpp
• CONFIGに設定されたリスト
release:DEFINES -= DEBUG_SETTING
• QMAKESPEC 名
linux-g++ : message(linux-g++ spec)
• ‘:’ (AND), | (OR), ! (NOT)
21
qmakeの基礎 - TEMPLATE
どのようなMakefileを生成するのかを、TEMPLATE変数に値を設定することで選択できます。
• app
アプリケーションの作成用Makefile
• lib
ライブラリ作成用のMakefile
• subdirs
ディレクトリ再帰用のMakefile
• aux [Makefile only ]
非コンパイル用のMakefile
• vcapp [Windows only ]
• vclib [ Windows only ]
• vcsubdirs [ Windows only ]
22
qmakeの基礎 - CONFIG
qmakeの動作に関わる設定を行う変数で、リスト中の文字.prfファイルがあればそれ
を読み込み有効化します。
• qt (qt.prf)
• c++14 (c++14.prf)
• gcov (gcov.prf)
また、prfファイルはないものの、生成処理に影響を与える設定もあります。
• release
• debug
• staticlib
• dll
• order
23
qmakeの基礎 - アプリケーションの作成
• TEMPLATE = app
• CONFIG
• windows
• console
• testcase
CONFIG += testcase を行うとMakefileにcheckターゲットが作成される。
make check時は以下の変数が利用できる
TESTRUNNER : テストの起動に呼び出されるツール
TESTARGS : テスト呼び出しに利用される引数
ex
make check TESTRUNNER=valgrind
24
qmakeの基礎 - ライブラリの作成
• TEMPLATE = lib
• CONFIG
• dll
共有ライブラリの生成
• staticlib
静的ライブラリの生成
• plugin
プラグインの作成
qmakeの応用
26
qmakeの応用 - サブプロジェクト
• TEMPLATE = subdirs
• SUBDIRS 対象となるディレクトリのリスト記述
• CONFIG
• ordered
SUBDIRS定義順に る
SUBDIR対象のディレクトリ値にはプロパティで依存プロジェクトを設定で
きる
SUBDIRS = app lib
app.depend = lib
27
qmakeの応用 - サブプロジェクト例
• ファイルツリー
• myproj
• myproj.pro
• app/
• app.pro
• main.cpp
• lib/
• lib.pro
• lib.pri
• lib_global.h
• hello.h
• hello.cpp
TEMPLATE = subdirs
SUBDIRS = app lib
app.depends = lib
myproj.pro
28
qmakeの応用 - サブプロジェクト例
#pragma once
#include <QtCore/qglobal.h>
#if defined(LIB_COMPILE)
# define LIBTESTSHARED_EXPORT Q_DECL_EXPORT
#else
# define LIBTESTSHARED_EXPORT Q_DECL_IMPORT
#endif
lib_global.h
#pragma once
#include <QString>
#include "lib_global.h"
LIBTESTSHARED_EXPORT void hello(const QString& msg);
hello.h
29
qmakeの応用 - サブプロジェクト例
#include "hello.h"
#include <QTextStream>
QTextStream cout(stdout);
void hello(const QString& msg)
{
cout << "Hello " << msg << endl;
}
hello.cpp
#include "hello.h"
int main(int /* argc */, char* /* argv */ [])
{
hello("world");
return 0;
}
main.cpp
30
qmakeの応用 - サブプロジェクト例
TEMPLATE = lib
QT = core
CONFIG += console
TARGET = hello
SOURCES = hello.cpp
HEADERS = hello.h
DEFINES += LIB_COMPILE
VERSION = 0.0.1
lib.pro
LIBS += -L$$shadowed($${PWD}) -lhello
INCLUDEPATH += $${PWD}
DEPENDPATH += $${PWD}
lib.pri
TEMPLATE = app
SOURCES = main.cpp
linux:QMAKE_LFLAGS += -Wl,-rpath,'$$ORIGIN/../lib'
include(../lib/lib.pri)
app.pro
31
qmakeの応用 - Install
• TARGETのinstallはINSTALLS変数とtarget.pathを使う
TEMPLATE = lib
QT = core
CONFIG += console
TARGET = hello
SOURCES = hello.cpp
HEADERS = hello.h
DEFINES += LIB_COMPILE
VERSION = 0.0.1
INSTALLS += target
target.path = /usr/local/lib
lib.pro
TEMPLATE = app
SOURCES = main.cpp
linux:QMAKE_LFLAGS += -Wl,-rpath,'$$ORIGIN/../lib'
include(../lib/lib.pri)
INSTALLS += target
target.path = /usr/local/bin
app.pro
32
qmakeの応用 - Install
• 追加のファイルインストールを記載することもできます
TEMPLATE = app
SOURCES = main.cpp
linux:QMAKE_LFLAGS += -Wl,-rpath,'$$ORIGIN/../lib'
include(../lib/lib.pri)
INSTALLS += target docs
target.path = /usr/local/bin
docs.files = readme
docs.path = /usr/local/share/app
app.pro
app for QtJS
readme
• Makefileまで「’」や「$$」などを引き継ぎたい場合は、¥でエスケープする必要があります
33
qmakeの応用 - Functionの追加
• 置換関数やテスト関数を独自に定義できます
defineReplace(name) {
:
:
:
}
defineTest(name) {
:
:
:
}
34
qmakeの応用 - Functionの追加
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)
}
• headersAndSources()
• 引数は1つのvariable名
• variable中のリストを
basenameとする.hと.cpp
のリストを生成する
35
qmakeの応用 - Functionの追加
defineTest(isFiles) {
files = $$ARGS
for(file, files) {
!exists($$file) {
return(false)
}
}
return(true)
}
• isFiles()
• リストを受け取る
• リストがすべてファイルな
らtrue
• ファイル以外があればfalse
36
qmakeの応用 - Functionの追加の検証
defineTest(isFiles) {
:
}
defineReplace(headersAndSources) {
:
}
TEMPLATE = aux
T1 = test1 test2 test3
message($$headersAndSources(T1))
isFiles(test1.cpp):message("test1.cpp is file")
!isFiles(test1):message("test1 is not file")
myfunction.pro
myfunction$ qmake
Project MESSAGE: test1.h test2.h test1.cpp test2.cpp
Project MESSAGE: test1.cpp is file
Project MESSAGE: test1 is not file
• ファイルツリー
• myfunction
• myfunction.
pro
• test1.cpp
• test1.h
• test2.cpp
• test2.h
• test2.bak
37
qmakeの応用 - Featuresの追加
message(myfeature.prf loaded)
myfeature.prf
myfeature.pro
TEMPLATE = aux
CONFIG += myfeature
$ ~/Qt5.5.0/5.5/gcc_64/bin/qmake
Project MESSAGE: loaded myfeature
• 複数のプロジェクトに独自の機能を追加できます
38
qmakeの応用 - カスタムターゲット
TEMPLATE = aux
mytarget.target = testfile
mytarget.commands = touch $$mytarget.target
mytarget.depends = mytarget2
mytarget2.commands = @echo start custom target build
QMAKE_EXTRA_TARGETS += mytarget mytarget2
customtarget.pro
• カスタムのターゲットも可能です
Makefile
testfile: mytarget2
touch testfile
mytarget2:
@echo start custom target build
39
qmakeの応用 - カスタムコンパイラ
updateqm.input = TRANSLATIONS
updateqm.output = $$MODULE_BASE_OUTDIR/translations/${QMAKE_FILE_BASE}.qm
updateqm.commands = $$LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT}
silent:updateqm.commands = @echo lrelease ${QMAKE_FILE_IN} && $
$updateqm.commands
updateqm.name = LRELEASE ${QMAKE_FILE_IN}
updateqm.CONFIG += no_link target_predeps
QMAKE_EXTRA_COMPILERS += updateqm
qttranslations/translations/translations.pro
• あるinputからあるoutputを作るためのルール定義
TRANSLATIONS内のリストから、.qmファイルを生成するためのルール
40
• qmakeの概要
• qmakeとは、簡単な例
• qmakeの基礎
• コマンド、プロパティ、プロジェクトファイル構成、
• qmakeの応用
• サブプロジェクト、Install、Functionの追加、Featuresの追加
• カスタムターゲット、カスタムコンパイル
まとめ
http://qt-users.jp/
ご静聴ありがとうございました

More Related Content

What's hot

現場で役に立たないsudoの使い方
現場で役に立たないsudoの使い方現場で役に立たないsudoの使い方
現場で役に立たないsudoの使い方
(^-^) togakushi
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
Akihiro Ikezoe
 

What's hot (20)

StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践
 
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
 
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
 
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
WebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updateWebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample update
 
現場で役に立たないsudoの使い方
現場で役に立たないsudoの使い方現場で役に立たないsudoの使い方
現場で役に立たないsudoの使い方
 
数クリックで瞬時に切り替えられる メンテナンスページの作り方
数クリックで瞬時に切り替えられる メンテナンスページの作り方数クリックで瞬時に切り替えられる メンテナンスページの作り方
数クリックで瞬時に切り替えられる メンテナンスページの作り方
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
HashMapとは?
HashMapとは?HashMapとは?
HashMapとは?
 
runC概要と使い方
runC概要と使い方runC概要と使い方
runC概要と使い方
 
OPC UAをオープンソースやフリーのソフトで遊んでみた
OPC UAをオープンソースやフリーのソフトで遊んでみたOPC UAをオープンソースやフリーのソフトで遊んでみた
OPC UAをオープンソースやフリーのソフトで遊んでみた
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
 
P4によるデータプレーンプログラミングとユースケースのご紹介
P4によるデータプレーンプログラミングとユースケースのご紹介P4によるデータプレーンプログラミングとユースケースのご紹介
P4によるデータプレーンプログラミングとユースケースのご紹介
 
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
 

Viewers also liked

Qt qmake advanced
Qt qmake advancedQt qmake advanced
Qt qmake advanced
ansarhun
 
QtでC++開発環境構築
QtでC++開発環境構築QtでC++開発環境構築
QtでC++開発環境構築
You&I
 

Viewers also liked (14)

Qt qmake advanced
Qt qmake advancedQt qmake advanced
Qt qmake advanced
 
QtでC++開発環境構築
QtでC++開発環境構築QtでC++開発環境構築
QtでC++開発環境構築
 
Jubeatプレゼン
JubeatプレゼンJubeatプレゼン
Jubeatプレゼン
 
POSIX中心主義と情報科学教育
POSIX中心主義と情報科学教育POSIX中心主義と情報科学教育
POSIX中心主義と情報科学教育
 
中年以降エンジニアの成長戦略
中年以降エンジニアの成長戦略中年以降エンジニアの成長戦略
中年以降エンジニアの成長戦略
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish
 
20150201 シェル芸勉強会LT GlueLangについて (シェル書いてますが何か?)
20150201 シェル芸勉強会LT GlueLangについて(シェル書いてますが何か?)20150201 シェル芸勉強会LT GlueLangについて(シェル書いてますが何か?)
20150201 シェル芸勉強会LT GlueLangについて (シェル書いてますが何か?)
 
Qt multi threads
Qt multi threadsQt multi threads
Qt multi threads
 
C++でテスト駆動開発
C++でテスト駆動開発C++でテスト駆動開発
C++でテスト駆動開発
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
 
Qt小技(修正版)
Qt小技(修正版)Qt小技(修正版)
Qt小技(修正版)
 
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
 
Make a graph at Qt(used Qwt library)
Make a graph at Qt(used Qwt library)Make a graph at Qt(used Qwt library)
Make a graph at Qt(used Qwt library)
 
Slideshare ppt
Slideshare pptSlideshare ppt
Slideshare ppt
 

Similar to qmake入門

環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
Etsuji Nakai
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud Automation
Etsuji Nakai
 
Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2
shozon
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osaka
Naotaka Jay HOTTA
 

Similar to qmake入門 (20)

Server side Swift & Photo Booth
Server side Swift & Photo Booth Server side Swift & Photo Booth
Server side Swift & Photo Booth
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud Automation
 
Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Capistrano
CapistranoCapistrano
Capistrano
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osaka
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
 
Open Shift v3 主要機能と内部構造のご紹介
Open Shift v3 主要機能と内部構造のご紹介Open Shift v3 主要機能と内部構造のご紹介
Open Shift v3 主要機能と内部構造のご紹介
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
Getting Start for Azure Pipelines
Getting Start for Azure PipelinesGetting Start for Azure Pipelines
Getting Start for Azure Pipelines
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
 

qmake入門

  • 2. • Twitter ID : hermit4 • 日本Qtユーザー会 おやつ部部長 • フリーランスなので他の肩書きありません • Qt3頃からQtの利用を開始 • 商用ライセンスユーザー 自己紹介 2
  • 3. 3 • あまり大きな声を出せる人ではないし、人前は苦手ですので、聴き にくかったら申し訳ない • 既にQt Creatorにはqbsが同梱されているご時世なのですが、今回 は、qbsの話はしません • QtCreatorは最近使うようになったばっかりなのでコマンドライン の話が中心です • 生成された後のプロジェクトファイルやMakefileの話はしません ごめんなさい
  • 6. 6 qmakeとは Makefile .xcodeproj QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = helloworld TEMPLATE = app SOURCES += main.cpp mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui .pro file .vcxproj qmake -tp vc qmake -spec macx-xcode
  • 7. 7 helloworld.pro file QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = helloworld TEMPLATE = app SOURCES += main.cpp mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui • 変数 • QT • TARGET • TEMPLATE • SOURCES • HEADERS • FORMS • テスト関数 • greaterThan
  • 8. 8 Qt5.5.0/Examples/Qt-5.5/qt3d/qt3d.pro TEMPLATE = subdirs SUBDIRS += exampleresources playground-qml : skybox # TODO Port the old examples to new APIs #SUBDIRS += qt3d #qtHaveModule(qml): SUBDIRS += quick3d # Make all other subdirs depend on exampleresources for(subdir, SUBDIRS) { !equals(subdir, exampleresources) { $${subdir}.depends += exampleresources } } • 変数 • TEMPLATE • SUBDIRS • テスト関数 • for • equals • コメント
  • 10. 10 qmakeの基礎 • コマンド • qmake -project [-nopwd] プロジェクトファイルの生成 • qmake [-makefile] [-spec spec][ -tp prefix] [-t template] [-nocache|-cache file] [-nomoc] [-d] [-nodpend] files Makefileの生成 • qmake [-query| -set varname value | -unset varname] プロパティ値の取得・設定・削除
  • 12. 12 qmakeの基礎 • 入力ファイル • *.pro ファイル プロジェクトファイル • *.pri ファイル インクルードプロジェクトファイル、include()関数で読み込みます • *.prf ファイル 機能ファイル • qmake.conf ファイル mkspecs下のファイル。-specで指定
  • 13. 13 qmakeの基礎 - Project File Elements • 変数 変数は、文字列のリストを保持するもので、簡単なプロジェクトは最低限 の変数を指定するだけで作成できます。 • TEMPLATE • CONFIG • QT • SOURCES • HEADERS • FORMS • RESOURCES • TRANSLATIONS
  • 14. 14 qmakeの基礎 - Project File Elements • 変数 他にもMakefileに必要な様々な変数が用意されています。 • INCLUDEPATH • DEFINES • LIBS • DEPENDS • _PRO_FILE_ • _PRO_FILE_PWD_ 変数によっては環境によってはMakefile等へ反映されない変数もあるので、 注意が必要になります。
  • 15. 15 qmakeの基礎 - Project File Elements • 変数 • 値の代入 TEMPLATE = app • 値の追加 QT += core • ユニーク値の追加 LIBS *= -lm • 値の削除 QT -= gui • 値の置換 DEFINES ~= s/QT_[DT].*/QT 例えば、「DEFINES = QT_D_TEST QT_X_TEST」の場合、 上記で$$DEFINES の値「 QT QT_X_TEST」に置き換わります
  • 16. 16 qmakeの基礎 - Project File Elements • 変数 • 変数の参照 $$HOGE , $${HOGE} $${HOGE}_piyo • 環境変数の参照 $$(HOME) • プロパティの参照 $$[QMAKE_SPEC] • 注意事項 • INCLUDEPATH += $(PWD)はMakefileでは“-I$(PWD)”に変換されます • message($$INCLUDEPATH) では”/home/hermit4”と展開されます
  • 17. 17 qmakeの基礎 - Project File Elements • 空白・バックスラッシュ(¥) • 空白は、リストの区切り文字として使われます • 空白を含む文字列を一つの文字列として登録する場合は、ダブルクウォ ートかシングルクォートで囲む必要があります • 行末をバックスラッシュにすると、次の1行も合わせて連続した1行と して処理されます • コメント • # から行末まではコメントとして扱われます • “# xxxxx”となっていても、#から先はコメントになるので”閉じがなくて エラーになります
  • 18. 18 qmakeの基礎 - Project File Elements • 組込関数 qmakeではプロジェクトファイルで利用できる関数が幾つか定義されています。大別すると変 換結果を返す変換関数と、真偽値を返すテスト関数に大別されます。 • 変換関数 • absolute_path • dirname • format_number • system • テスト関数 • include • contains • equals • exists • system
  • 19. 19 qmakeの基礎 - Project File Elements • スコープ構文 <condition>:<definition or command> <condition> { <definition or command> : } <condition>を満たす場合に : の後の1行あるいは{}内のすべてが実行されま す。入れ子にできるので <condition>:<condition> { <definition or command> } という表記も可能です
  • 20. 20 qmakeの基礎 - Project File Elements • スコープ構文 - condition conditionとして使えるのは以下の通り • テスト関数の結果 contains(SOURCES, “debugprint.cpp”):DEFINES += DEBUGPRINT • プラットフォーム名(QMAKE_PLATFORMの値) win32:SOURCES += platform_w32.cpp !unix:SOURCES -= platform_unix.cpp • CONFIGに設定されたリスト release:DEFINES -= DEBUG_SETTING • QMAKESPEC 名 linux-g++ : message(linux-g++ spec) • ‘:’ (AND), | (OR), ! (NOT)
  • 21. 21 qmakeの基礎 - TEMPLATE どのようなMakefileを生成するのかを、TEMPLATE変数に値を設定することで選択できます。 • app アプリケーションの作成用Makefile • lib ライブラリ作成用のMakefile • subdirs ディレクトリ再帰用のMakefile • aux [Makefile only ] 非コンパイル用のMakefile • vcapp [Windows only ] • vclib [ Windows only ] • vcsubdirs [ Windows only ]
  • 22. 22 qmakeの基礎 - CONFIG qmakeの動作に関わる設定を行う変数で、リスト中の文字.prfファイルがあればそれ を読み込み有効化します。 • qt (qt.prf) • c++14 (c++14.prf) • gcov (gcov.prf) また、prfファイルはないものの、生成処理に影響を与える設定もあります。 • release • debug • staticlib • dll • order
  • 23. 23 qmakeの基礎 - アプリケーションの作成 • TEMPLATE = app • CONFIG • windows • console • testcase CONFIG += testcase を行うとMakefileにcheckターゲットが作成される。 make check時は以下の変数が利用できる TESTRUNNER : テストの起動に呼び出されるツール TESTARGS : テスト呼び出しに利用される引数 ex make check TESTRUNNER=valgrind
  • 24. 24 qmakeの基礎 - ライブラリの作成 • TEMPLATE = lib • CONFIG • dll 共有ライブラリの生成 • staticlib 静的ライブラリの生成 • plugin プラグインの作成
  • 26. 26 qmakeの応用 - サブプロジェクト • TEMPLATE = subdirs • SUBDIRS 対象となるディレクトリのリスト記述 • CONFIG • ordered SUBDIRS定義順に る SUBDIR対象のディレクトリ値にはプロパティで依存プロジェクトを設定で きる SUBDIRS = app lib app.depend = lib
  • 27. 27 qmakeの応用 - サブプロジェクト例 • ファイルツリー • myproj • myproj.pro • app/ • app.pro • main.cpp • lib/ • lib.pro • lib.pri • lib_global.h • hello.h • hello.cpp TEMPLATE = subdirs SUBDIRS = app lib app.depends = lib myproj.pro
  • 28. 28 qmakeの応用 - サブプロジェクト例 #pragma once #include <QtCore/qglobal.h> #if defined(LIB_COMPILE) # define LIBTESTSHARED_EXPORT Q_DECL_EXPORT #else # define LIBTESTSHARED_EXPORT Q_DECL_IMPORT #endif lib_global.h #pragma once #include <QString> #include "lib_global.h" LIBTESTSHARED_EXPORT void hello(const QString& msg); hello.h
  • 29. 29 qmakeの応用 - サブプロジェクト例 #include "hello.h" #include <QTextStream> QTextStream cout(stdout); void hello(const QString& msg) { cout << "Hello " << msg << endl; } hello.cpp #include "hello.h" int main(int /* argc */, char* /* argv */ []) { hello("world"); return 0; } main.cpp
  • 30. 30 qmakeの応用 - サブプロジェクト例 TEMPLATE = lib QT = core CONFIG += console TARGET = hello SOURCES = hello.cpp HEADERS = hello.h DEFINES += LIB_COMPILE VERSION = 0.0.1 lib.pro LIBS += -L$$shadowed($${PWD}) -lhello INCLUDEPATH += $${PWD} DEPENDPATH += $${PWD} lib.pri TEMPLATE = app SOURCES = main.cpp linux:QMAKE_LFLAGS += -Wl,-rpath,'$$ORIGIN/../lib' include(../lib/lib.pri) app.pro
  • 31. 31 qmakeの応用 - Install • TARGETのinstallはINSTALLS変数とtarget.pathを使う TEMPLATE = lib QT = core CONFIG += console TARGET = hello SOURCES = hello.cpp HEADERS = hello.h DEFINES += LIB_COMPILE VERSION = 0.0.1 INSTALLS += target target.path = /usr/local/lib lib.pro TEMPLATE = app SOURCES = main.cpp linux:QMAKE_LFLAGS += -Wl,-rpath,'$$ORIGIN/../lib' include(../lib/lib.pri) INSTALLS += target target.path = /usr/local/bin app.pro
  • 32. 32 qmakeの応用 - Install • 追加のファイルインストールを記載することもできます TEMPLATE = app SOURCES = main.cpp linux:QMAKE_LFLAGS += -Wl,-rpath,'$$ORIGIN/../lib' include(../lib/lib.pri) INSTALLS += target docs target.path = /usr/local/bin docs.files = readme docs.path = /usr/local/share/app app.pro app for QtJS readme • Makefileまで「’」や「$$」などを引き継ぎたい場合は、¥でエスケープする必要があります
  • 33. 33 qmakeの応用 - Functionの追加 • 置換関数やテスト関数を独自に定義できます defineReplace(name) { : : : } defineTest(name) { : : : }
  • 34. 34 qmakeの応用 - Functionの追加 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) } • headersAndSources() • 引数は1つのvariable名 • variable中のリストを basenameとする.hと.cpp のリストを生成する
  • 35. 35 qmakeの応用 - Functionの追加 defineTest(isFiles) { files = $$ARGS for(file, files) { !exists($$file) { return(false) } } return(true) } • isFiles() • リストを受け取る • リストがすべてファイルな らtrue • ファイル以外があればfalse
  • 36. 36 qmakeの応用 - Functionの追加の検証 defineTest(isFiles) { : } defineReplace(headersAndSources) { : } TEMPLATE = aux T1 = test1 test2 test3 message($$headersAndSources(T1)) isFiles(test1.cpp):message("test1.cpp is file") !isFiles(test1):message("test1 is not file") myfunction.pro myfunction$ qmake Project MESSAGE: test1.h test2.h test1.cpp test2.cpp Project MESSAGE: test1.cpp is file Project MESSAGE: test1 is not file • ファイルツリー • myfunction • myfunction. pro • test1.cpp • test1.h • test2.cpp • test2.h • test2.bak
  • 37. 37 qmakeの応用 - Featuresの追加 message(myfeature.prf loaded) myfeature.prf myfeature.pro TEMPLATE = aux CONFIG += myfeature $ ~/Qt5.5.0/5.5/gcc_64/bin/qmake Project MESSAGE: loaded myfeature • 複数のプロジェクトに独自の機能を追加できます
  • 38. 38 qmakeの応用 - カスタムターゲット TEMPLATE = aux mytarget.target = testfile mytarget.commands = touch $$mytarget.target mytarget.depends = mytarget2 mytarget2.commands = @echo start custom target build QMAKE_EXTRA_TARGETS += mytarget mytarget2 customtarget.pro • カスタムのターゲットも可能です Makefile testfile: mytarget2 touch testfile mytarget2: @echo start custom target build
  • 39. 39 qmakeの応用 - カスタムコンパイラ updateqm.input = TRANSLATIONS updateqm.output = $$MODULE_BASE_OUTDIR/translations/${QMAKE_FILE_BASE}.qm updateqm.commands = $$LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT} silent:updateqm.commands = @echo lrelease ${QMAKE_FILE_IN} && $ $updateqm.commands updateqm.name = LRELEASE ${QMAKE_FILE_IN} updateqm.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += updateqm qttranslations/translations/translations.pro • あるinputからあるoutputを作るためのルール定義 TRANSLATIONS内のリストから、.qmファイルを生成するためのルール
  • 40. 40 • qmakeの概要 • qmakeとは、簡単な例 • qmakeの基礎 • コマンド、プロパティ、プロジェクトファイル構成、 • qmakeの応用 • サブプロジェクト、Install、Functionの追加、Featuresの追加 • カスタムターゲット、カスタムコンパイル まとめ