SlideShare a Scribd company logo
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/
ご静聴ありがとうございました
Ad

More Related Content

What's hot (20)

C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
 
SecurityCamp2015「バグハンティング入門」
SecurityCamp2015「バグハンティング入門」SecurityCamp2015「バグハンティング入門」
SecurityCamp2015「バグハンティング入門」
Masato Kinugawa
 
Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
Yoshitaka Kawashima
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
MITSUNARI Shigeo
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
とある診断員とSQLインジェクション
とある診断員とSQLインジェクションとある診断員とSQLインジェクション
とある診断員とSQLインジェクション
zaki4649
 
証明プログラミング超入門
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門
Kyoko Kadowaki
 
暗認本読書会7
暗認本読書会7暗認本読書会7
暗認本読書会7
MITSUNARI Shigeo
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
 
IDガバナンス&管理の基礎
IDガバナンス&管理の基礎IDガバナンス&管理の基礎
IDガバナンス&管理の基礎
Hitachi, Ltd. OSS Solution Center.
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
torisoup
 
Pietのエディタを作った話
Pietのエディタを作った話Pietのエディタを作った話
Pietのエディタを作った話
京大 マイコンクラブ
 
DeNAのQCTマネジメント IaaS利用のベストプラクティス [AWS Summit Tokyo 2019]
DeNAのQCTマネジメント IaaS利用のベストプラクティス [AWS Summit Tokyo 2019]DeNAのQCTマネジメント IaaS利用のベストプラクティス [AWS Summit Tokyo 2019]
DeNAのQCTマネジメント IaaS利用のベストプラクティス [AWS Summit Tokyo 2019]
DeNA
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
MITSUNARI Shigeo
 
1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法
NVIDIA Japan
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
 
SecurityCamp2015「バグハンティング入門」
SecurityCamp2015「バグハンティング入門」SecurityCamp2015「バグハンティング入門」
SecurityCamp2015「バグハンティング入門」
Masato Kinugawa
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
とある診断員とSQLインジェクション
とある診断員とSQLインジェクションとある診断員とSQLインジェクション
とある診断員とSQLインジェクション
zaki4649
 
証明プログラミング超入門
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門
Kyoko Kadowaki
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
torisoup
 
DeNAのQCTマネジメント IaaS利用のベストプラクティス [AWS Summit Tokyo 2019]
DeNAのQCTマネジメント IaaS利用のベストプラクティス [AWS Summit Tokyo 2019]DeNAのQCTマネジメント IaaS利用のベストプラクティス [AWS Summit Tokyo 2019]
DeNAのQCTマネジメント IaaS利用のベストプラクティス [AWS Summit Tokyo 2019]
DeNA
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
MITSUNARI Shigeo
 
1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法
NVIDIA Japan
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 

Viewers also liked (14)

Qt qmake advanced
Qt qmake advancedQt qmake advanced
Qt qmake advanced
ansarhun
 
QtでC++開発環境構築
QtでC++開発環境構築QtでC++開発環境構築
QtでC++開発環境構築
You&I
 
Jubeatプレゼン
JubeatプレゼンJubeatプレゼン
Jubeatプレゼン
latte0
 
POSIX中心主義と情報科学教育
POSIX中心主義と情報科学教育POSIX中心主義と情報科学教育
POSIX中心主義と情報科学教育
Tomoyuki Matsuura
 
中年以降エンジニアの成長戦略
中年以降エンジニアの成長戦略中年以降エンジニアの成長戦略
中年以降エンジニアの成長戦略
Ryo Tomidokoro
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish
SQALab
 
20150201 シェル芸勉強会LT GlueLangについて (シェル書いてますが何か?)
20150201 シェル芸勉強会LT GlueLangについて(シェル書いてますが何か?)20150201 シェル芸勉強会LT GlueLangについて(シェル書いてますが何か?)
20150201 シェル芸勉強会LT GlueLangについて (シェル書いてますが何か?)
Ryuichi Ueda
 
Qt multi threads
Qt multi threadsQt multi threads
Qt multi threads
Ynon Perek
 
C++でテスト駆動開発
C++でテスト駆動開発C++でテスト駆動開発
C++でテスト駆動開発
Akineko Shimizu
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
 
Qt小技(修正版)
Qt小技(修正版)Qt小技(修正版)
Qt小技(修正版)
hermit4 Ishida
 
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
Richie Shellshoccar
 
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)
Kazuo Asano (@kazuo_asa)
 
Slideshare ppt
Slideshare pptSlideshare ppt
Slideshare ppt
Mandy Suzanne
 
Qt qmake advanced
Qt qmake advancedQt qmake advanced
Qt qmake advanced
ansarhun
 
QtでC++開発環境構築
QtでC++開発環境構築QtでC++開発環境構築
QtでC++開発環境構築
You&I
 
Jubeatプレゼン
JubeatプレゼンJubeatプレゼン
Jubeatプレゼン
latte0
 
POSIX中心主義と情報科学教育
POSIX中心主義と情報科学教育POSIX中心主義と情報科学教育
POSIX中心主義と情報科学教育
Tomoyuki Matsuura
 
中年以降エンジニアの成長戦略
中年以降エンジニアの成長戦略中年以降エンジニアの成長戦略
中年以降エンジニアの成長戦略
Ryo Tomidokoro
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish
SQALab
 
20150201 シェル芸勉強会LT GlueLangについて (シェル書いてますが何か?)
20150201 シェル芸勉強会LT GlueLangについて(シェル書いてますが何か?)20150201 シェル芸勉強会LT GlueLangについて(シェル書いてますが何か?)
20150201 シェル芸勉強会LT GlueLangについて (シェル書いてますが何か?)
Ryuichi Ueda
 
Qt multi threads
Qt multi threadsQt multi threads
Qt multi threads
Ynon Perek
 
C++でテスト駆動開発
C++でテスト駆動開発C++でテスト駆動開発
C++でテスト駆動開発
Akineko Shimizu
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
 
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
Richie Shellshoccar
 
Ad

Similar to qmake入門 (20)

Server side Swift & Photo Booth
Server side Swift & Photo Booth Server side Swift & Photo Booth
Server side Swift & Photo Booth
LINE Corporation
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
Etsuji Nakai
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
Kentaro Ebisawa
 
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
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
Yu Nobuoka
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
Hiroshi Miura
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
Hiroshi Miura
 
Capistrano
CapistranoCapistrano
Capistrano
Yasuharu Fukuda
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
shigeya
 
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
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
Daisuke Hiraoka
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
npsg
 
Open Shift v3 主要機能と内部構造のご紹介
Open Shift v3 主要機能と内部構造のご紹介Open Shift v3 主要機能と内部構造のご紹介
Open Shift v3 主要機能と内部構造のご紹介
Etsuji Nakai
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
龍一 田中
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Masahito Zembutsu
 
Getting Start for Azure Pipelines
Getting Start for Azure PipelinesGetting Start for Azure Pipelines
Getting Start for Azure Pipelines
Kazushi Kamegawa
 
第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
Ryosuke MATSUMOTO
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
Masahito Zembutsu
 
Server side Swift & Photo Booth
Server side Swift & Photo Booth Server side Swift & Photo Booth
Server side Swift & Photo Booth
LINE Corporation
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
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
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
Yu Nobuoka
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
Hiroshi Miura
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
Hiroshi Miura
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
shigeya
 
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
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
Daisuke Hiraoka
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
npsg
 
Open Shift v3 主要機能と内部構造のご紹介
Open Shift v3 主要機能と内部構造のご紹介Open Shift v3 主要機能と内部構造のご紹介
Open Shift v3 主要機能と内部構造のご紹介
Etsuji Nakai
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
龍一 田中
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Masahito Zembutsu
 
Getting Start for Azure Pipelines
Getting Start for Azure PipelinesGetting Start for Azure Pipelines
Getting Start for Azure Pipelines
Kazushi Kamegawa
 
第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
Ryosuke MATSUMOTO
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
Masahito Zembutsu
 
Ad

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の追加 • カスタムターゲット、カスタムコンパイル まとめ