2010-08-31 30 views
13

我們有一個相當大的代碼庫。絕大多數代碼是使用qmake編譯生成makefile的。但是,有一些通過運行批處理文件或運行其他程序生成的子項目。從QMake運行程序/腳本

我希望能夠使用qmake編譯所有的東西,但我無法弄清楚如何讓qmake簡單地運行腳本。

有一兩件事,我試過在我的親文件使用QMAKE_EXTRA_TARGETS,就像這樣:

TEMPLATE = lib 
SOURCES = placeholder.cpp 
CONFIG += no_link staticlib 
batch_runner.target = placeholder.cpp 
batch_runner.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS = batch_runner 

然後我必須有這個批處理文件產生placeholder.cpp像這樣:

# do the real work here 
# ... 
# create placeholder.cpp so qmake and nmake are happy 
echo // dummy >> placeholder.cpp 

這似乎工作正常。麻煩在於它有點狡猾。如果我沒有指定batch_runner.target(即,我將其留空),或者不將placeholder.cpp放入SOURCES中,那麼批處理文件永遠不會運行。這是因爲qmake沒有在Makefile中爲batch_runner.commands做任何其他依賴的操作。

有沒有更好的方法讓QMake構建一個Makefile文件,以便在Makefile執行時運行腳本?

回答

14

它看起來像QMAKE_POST_LINK很適合這樣的事情。

這似乎完成了工作。當nmake運行時(而不是當qmake運行時)運行my_batch_file.bat,並且我不需要對佔位符目標或文件做任何有趣的事情。

這很可能是我不需要'CONFIG'中列出的所有項目。

TEMPLATE = lib 
TARGET = 
CONFIG += no_link target_predeps staticlib 

QMAKE_POST_LINK = my_batch_file.bat 
QMAKE_CLEAN  += batch_output.obj 
6

嘗試system() command。例如:

system(pwd) 
+1

有趣。這是有效的,但是當運行'qmake'而不是'nmake'運行時,命令會運行。它也恰好運行三次,而不是一次運行。 – 2010-09-01 12:38:18

+1

您可能需要添加一些範圍以確保它只運行一次。 – 2010-09-01 12:41:39

+0

我只是將範圍添加到示例中,以便在運行qmake時該命令僅運行一次。 – pixelgrease 2017-03-31 23:53:50

1

即使使用相同的生成文件,您也可以使用SUBDIRS配置運行多個不同的目標。這可能對您的額外目標特別有效,因爲子目錄配置可以指定makefile中的特定目標運行(有關詳細信息,請參閱undocumented qmake)。在這種情況下,我會將所有「常規」構建命令放在一個.pro文件中,將外部構建命令放在另一個文件中,並將所有這些命令放在一個子文件.pro文件中。我還沒有測試過這樣的東西,但它應該可以工作。

regular.pro:

SOURCES += main.cpp 
TARGET = regular.exe 

external.pro:

batch_runner.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS += batch_runner 

other_runner.commands = other_batch_file.bat 
QMAKE_EXTRA_TARGETS += other_runner 

do_it_all.pro:

TEMPLATE = subdirs 
CONFIG += ordered 

regular.file = regular.pro 
SUBDIRS += regular 

batch.file = external.pro 
batch.target = batch_runner 
SUBDIRS += batch 

other.file = external.pro 
other.target = other_runner 
SUBDIRS += other 
+0

這與我在原始問題中列出的問題相同。額外的目標將不會運行,除非指定了.target(您似乎只是指定了這些命令),並且.target實際上需要Makefile的其他部分,否則它將不會運行。 – 2010-09-02 12:12:16

5

下面是另一種解決方案:

TEMPLATE = aux 
OBJECTS_DIR = ./ 
DESTDIR = ./ 

first.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS += first 
QMAKE_CLEAN += batch_output.obj 

模板aux基本上產生一個生成文件時沒有指定一個目標跑其不執行任何操作。OBJECTS_DIRDESTDIR變量被設置爲當前目錄,以防止qmake創建debugrelease目錄(至少在Windows上將它們設置爲./而不僅僅是.很重要)。然後,使用QMAKE_EXTRA_TARGETS,我們重新定義目標first以在調用沒有目標的makefile時運行自定義命令。

這有點冒失,但它完成了工作。

增加: 如果要防止三種生成文件(MakefileMakefile.DebugMakefile.Release)的產生,可以添加

CONFIG -= debug_and_release 

但是,如果您使用此,並根據生成文件是如何調用(總是手動調用,由父目錄的「子目錄」* .pro文件調用...),可能需要創建僞造的debugrelease目標以避免「無規則制定目標...」錯誤。例如:

release.target = release 
release-clean.target = release-clean 
release-install.target = release-install 
[...] 
debug.target = debug 
debug-clean.target = debug-clean 
debug-install.target = debug-install 
[...] 
QMAKE_EXTRA_TARGETS += release release-clean release-install [...] 
QMAKE_EXTRA_TARGETS += debug debug-clean debug-install [...]