@[ide|build event]
通常我們?cè)诰幾g一個(gè)工程或是鏈接庫(kù)的時(shí)候蛹批,需要在編譯鏈接之前或者編譯鏈接之后執(zhí)行一些操作,比如:拷貝一些第三方庫(kù)到工程的工作目錄下或執(zhí)行一些批處理(shell)操作篮愉,這個(gè)時(shí)候就需要在編譯器環(huán)境中進(jìn)行相關(guān)設(shè)置:
Visual Studio####
說明: 在vs2005以及以上都支持了Build Events, 同時(shí)可以支持多行命令.
而在vs2003中要想執(zhí)行多行命令腐芍,只能把命令寫在一個(gè)批處理文件中,然后通過調(diào)用批處理來執(zhí)行.
打開Build Events方框步驟:
1.右鍵單擊Solution Explorer试躏,選擇Properties
2.選擇Build Events猪勇,可以看到Pre-build 和Post-build,以及運(yùn)行Post-build event 的條件可以在相應(yīng)的編譯事件中添加以下常用操作:
1.build完后修改build產(chǎn)物的名字(后綴),并覆蓋已有的同名文件.
copy /y $(TargetFileName) $(TargetName).XXX
2.調(diào)用外部命令或批處理:
call "C:\Program Files\XXX.exe"
3.條件判斷:
IF NOT $(ConfigurationName) == Release GOTO end call "C:\Program Files\XXX.exe" $(ProjectDir)$(TargetName).cvp :end
4.web project 自動(dòng)部署
copy $(TargetDir)*.* //MyServer/MyService/bin copy $(ProjectDir)*.ascx //MyServer/MyService
5.拷貝文件到制定目錄
copy "$(ProjectDir)pri.bin" "$(SolutionDir)$(SolutionName)\$(OutDir)"
xcode####
- 選擇項(xiàng)目TARGETS颠蕴,進(jìn)入Build Phases頁面
- 點(diǎn)擊“+”按鈕泣刹,選擇“New Run Script Phase”
- 在Shell選框中填入使用的bash版本,默認(rèn)是/bin/sh
- 在接下來的方框中編寫想要執(zhí)行的shell命令(支持所有shell命令)
- 如果是想建立編譯前事件犀被,需將Run Script用鼠標(biāo)拖動(dòng)到Compile Sources之前椅您,若是建立編譯后事件,則保證Run Script在最后即可
CMake####
在CMake中提供了add_custom_command和add_custom_target用來為某個(gè)目標(biāo)或庫(kù)添加一些自定義命令寡键,該命令本身會(huì)成為目標(biāo)的一部分掀泳,僅在目標(biāo)本身被構(gòu)建時(shí)才會(huì)執(zhí)行。如果該目標(biāo)已經(jīng)構(gòu)建西轩,命令將不會(huì)執(zhí)行员舵。
- add_custom_command: 增加自定義的構(gòu)建規(guī)則到生成的構(gòu)建系統(tǒng)中
add_custom_command(TARGET target
PRE_BUILD | PRE_LINK| POST_BUILD
COMMAND command1[ARGS] [args1...]
[COMMAND command2[ARGS] [args2...] ...]
[WORKING_DIRECTORYdir]
[COMMENT comment][VERBATIM])
命令執(zhí)行的時(shí)機(jī)由如下參數(shù)決定:
1.PRE_BUILD - 命令將會(huì)在其他依賴項(xiàng)執(zhí)行前執(zhí)行
2.PRE_LINK - 命令將會(huì)在其他依賴項(xiàng)執(zhí)行完后執(zhí)行
3.POST_BUILD - 命令將會(huì)在目標(biāo)構(gòu)建完后執(zhí)行。
- add_custom_target: 增加一個(gè)沒有輸出的目標(biāo)藕畔,使得它總是被構(gòu)建
add_custom_target(Name [ALL][command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM]
[SOURCES src1 [src2...]])
增加一個(gè)指定名字的目標(biāo)马僻,并執(zhí)行指定的命令。該目標(biāo)沒有輸出文件注服,總是被認(rèn)為是過期的韭邓,即使是在試圖用目標(biāo)的名字創(chuàng)建一個(gè)文件措近。如果指定了ALL選項(xiàng),那就表明該目標(biāo)會(huì)被添加到默認(rèn)的構(gòu)建目標(biāo)仍秤,使得它每次都被運(yùn)行。
關(guān)于以上兩個(gè)編譯命令的具體用法可很,可以參考以下鏈接:CMake客制化命令
例子(在CMake文件中任意位置添加):
ADD_CUSTOM_TARGET(
TestExample ALL
)
ADD_CUSTOM_COMMAND(TARGET TestExample
PRE_BUILD
COMMAND chmod 700 /home/chenjs/test
COMMAND /home/chenjs/test -c -o ../../output ../../input/test.txt
COMMENT "Generate project output file"
)
Jni環(huán)境下的Android.mk####
在使用NDK為Android項(xiàng)目編譯CPP庫(kù)時(shí)诗力,可以直接在Android.mk中添加執(zhí)行Shell命令,需要注意的是在Cywin以及在Linux下編譯的不同點(diǎn)我抠,并對(duì)兩個(gè)平臺(tái)區(qū)別對(duì)待處理
例子(在Android.mk文件中正確添加):
ifndef SYSENV
SYSENV := $(shell uname)
endif
ifeq (CYGWIN,$(findstring CYGWIN,$(SYSENV)))
$(info Generate project output file under cywin)
$(shell ../../tools/test.exe -c -o ../../output ../../output ../../input/test.txt)
else ifeq ($(SYSENV), Linux)
$(info Generate project output file under linux)
$(shell chmod 700 /home/chenjs/test)
$(shell /home/chenjs/test -c -o ../../output ../../input/test.txt)
endif
參考鏈接:
MSDN build events
Visual Studio build event使用方法
CMake客制化命令
Android.mk中條用shell bash命令
Android.mk詳解