2017-06-29 5 views
2

他のものをコンパイルする前に、ある目標を構築するスクリプトをどのように実行するかについていくつかの方法(例えばQt run script before make)が見つかりました。qmakeでコンパイルする前に実行ファイルを使って複数のヘッダファイルを構築するには?

私は全体の概念を得ていないようです。コンパイルのために生成されたヘッダーファイルが必要なので、すべてをコンパイルする前にスクリプト/実行可能ファイルを呼び出すことによって、いくつかのターゲット(いくつかのC++ヘッダーファイル)を作成する方法がわかりません。プレーンなメイクで

私のような何かをするだろう:

GENERATOR= \dist\gen_headers.exe 

BUILD_SOURCES+= header1.h header2.h header3.h 

header1.h header2.h header3.h: headers.h.in $(GENERATOR) 
    -$(RM) header1.h 
    -$(RM) header2.h 
    -$(RM) header3.h 
    $(GENERATOR) headers.h.in 

clean-hook: 
    -$(RM) header1.h >NUL: 2>NUL: 
    -$(RM) header2.h >NUL: 2>NUL: 
    -$(RM) header3.h >NUL: 2>NUL: 

どのように私は、次のファイルのように見えるプロでqmakeの中でこれを行うことができますか?

win32:TEMPLATE = vclib 
!win32:TEMPLATE = lib 

QT += core 
CONFIG += staticlib 
CONFIG += no_keywords 

#C++ exception specification ignored except to indicate a function is not __declspec(nothrow) 
QMAKE_CXXFLAGS += /wd4290 

#forcing value to bool ->performance warning 
QMAKE_CXXFLAGS += /wd4800 

INCLUDEPATH += . 
... 

HEADERS += header1.h \ 
    header2.h \ 
    header3.h \ 
    ... 

SOURCES += source.cpp \ 
    ... 

contains(DEFINES, ARCH_x32) { 
    DESTDIR = ../Bin32 
    CONFIG(debug, debug|release) { 
     OBJECTS_DIR = ./debug_x86 
     MOC_DIR = ./debug_x86 
     TARGET = lib32D 
    } else { 
     OBJECTS_DIR = ./release_x86 
     MOC_DIR = ./release_x86 
     TARGET = lib32 
    } 
} 

contains(DEFINES, ARCH_x64) { 
    DESTDIR = ../Bin64 
    CONFIG(debug, debug|release) { 
     OBJECTS_DIR = ./debug_x64 
     MOC_DIR = ./debug_x64 
     TARGET = lib64D 
    } else { 
     OBJECTS_DIR = ./release_x64 
     MOC_DIR = ./release_x64 
     TARGET = lib64 
    } 
} 

EDIT 1:

私は文を含む前に、次のコードを追加しようとしましたが、動作するようには思えません。 qmakeのを呼び出すとき

headers.target = headersDep 
headers.commands = echo "Building headers..."; \ 
       dist\gen_headers.exe headers.h.in; \ 
       echo "Done building headers."; \ 
headers.depends = 

QMAKE_EXTRA_TARGETS += headers 
PRE_TARGETDEPS = headersDep 

私は、HEADER2をHEADER1エラーを取得し、header3が見つかりませんでした。コンパイルしようとすると、同様のエラーNo such file or directoryが発生します。私のエコー出力は決して表示されません。だから私は何が間違っているの?

EDIT 2

まあ、私はsystem(command)を見つけました。私は編集1からコンテンツを削除し、INCLUDEPATHステートメントの前に次の権利を追加しました。

message(Building headers...) 
system(dist\gen_headers.exe headers.h.in):message(Done building headers.) 

qmakeを呼び出してプロジェクトをビルドすると、ヘッダーが作成されるようになりました。しかし、1つの問題があります。ヘッダーを作成する際に発行するメッセージのペアが5回表示されます。何故ですか?私はヘッダーを一度しか作成しません。

+0

あなたの投稿にリンクしたのと同じ投稿に続いて、あなたは 'QMAKE_EXTRA_TARGETS + = targetlib1 targetlib2'と' PRE_TARGETDEPS = extra1 extra2'のように、複数のターゲットに対してこうすることができます。これはあなたがやりたいことですか? – Azeem

+0

@Azeemいいえ、これは私が欲しいものではありません。私の実行ファイルは、1回の呼び出しで3つのターゲットすべてを生成します。 – Lilo

+0

多分この答えはあなたを助けることができます:https://stackoverflow.com/a/3626970/6165833 – ymoreau

答えて

1

私はついに道を見つけました。私はqmakeの可能性をadd my own compilerに使い、hereからインスピレーションを得ました。

私はcontainsステートメントの直前に次の行を追加しました。私は、Visual Studio内でコンパイル場合

# Building headers for each call of make (build process). 
HEADERS_IN = headers.h.in 
gen_headers.name = Building auto generated headers. 
gen_headers.input = HEADERS_IN 
gen_headers.output = header1.h header2.h header3.h 
gen_headers.commands = dist\gen_headers.exe $${HEADERS_IN} 
gen_headers.CONFIG += target_predeps 
gen_headers.dependency_type = TYPE_C 
gen_headers.variables_out = HEADERS 
QMAKE_EXTRA_COMPILERS += gen_headers 

さて、ヘッダが構築され、gen_headers.nameの内容は、出力として発行されます。

関連する問題