青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

GYP and Chrome

轉載自:http://www.sunchangming.com/blog/post/4589.html

一、簡介

GYP是google的一套構建系統,和 cmake 的目的很像。GYP和CMake的主要作用是,從用戶編寫的一套配置文件,針對不同的工具鏈生成不同的項目文件(如Makefile/vc projects/xcode projects)。

GYP安裝:

svn co http://gyp.googlecode.com/svn/trunk gyp cd gyp ./setup.py build ./setup.py install 

下面是GYP的配置文件的示例:

{ 'targets': [ { 'target_name': 'hello', 'type': 'executable', 'sources': [ 'main.cpp' ] } ] } 

看上去基本就是一個json。它定義了一個名為hello的target。target的類型是executable,表明它是一個可執行文件。如果要編譯庫,就換成static_library或者shared_library。sources是一個數組,列出所有的源文件。

然后用

# gyp hello.gyp --depth=. -f make

生成makefile。

然后執行make命令即可。

從設計目標上來說,它和autotools還不大一樣。autotools只針對make,且僅限于gnu make。autotools的核心是autoconf,如何利用shell腳本在不同的操作系統環境下生成相應的config.h文件。它利用它強大的檢測功能很容易適應不同的Unix/Linux環境。

而GYP和CMake都支持各種主流的構建系統。如make/Visual studio/XCode/Ninja。CMake支持構建系統的種類要更多些,比如eclipse cdt、Sublime Text 2、CodeBlocks、Borland C++等等。而這些非主流的東西GYP壓根就不會去碰,不敢碰。

按最理想的情況,我們寫一套配置規則,在所有平臺上都能執行。此時我們可以不關心操作系統是什么。拿autotools來說,假如你要include某個頭文件,那么就在autoconf執行的時候檢查下有沒有這個頭文件,然后在真正使用的時候,利用ifdef/else/endif來條件編譯,假如有,我們就用它,沒有就砍掉某個功能,或者使用替代實現。由于unix種類甚多,差異甚大,按照這樣方式寫的程序,即便被扔到一個作者從不知曉的陌生環境里,(也許)也能正常運行。

cmake和autotools都是這樣的理想主義者,它們試圖把不同的工具鏈的相同部分抽象出來,用一套統一的配置文件來適應不同的平臺。迫不得已的時候你可以寫 if(OS==WIN) ... else if (OS== Linux) ... 。 于是就這樣工作了很多年,很好。而GYP覺得我們不該做這樣的過分抽象,構建系統自身應該簡潔,把適應不同平臺的事情交給程序員自己去做。比如,不同的工具鏈參數不同,gcc編譯多線程程序的時候要加-pthread或-pthreads或-lpthread,而vc則要在4種不同的CRT做出選擇。那么,你自己去把不同平臺的編譯參數挨個標明,GYP不管這事。所以,GYP的項目不可能盲目的去支持Sublime Text 2、eclipse cdt這樣的小眾玩意兒。為了支持它們,condition會急劇膨脹。

GYP是為Chrome項目開發的,Chrome也是GYP的唯一成功案例。就比如前面編譯hello world的時候,加上"--depth=. ",這完全是Chrome的特殊遺留。Chrome是一個有600多萬行代碼的大型C++項目,它的成功值得借鑒。

雖然GYP和CMake相比還很不成熟,而且很不獨立(它幾乎是專為Chrome項目服務),但是Chrome本身其實已經給我們貢獻了足夠多的代碼。雖然GYP不像CMake那樣自帶了很多Module(豐富的FindXXX),但是我們完全可以去Chrome的項目中把那些GYP文件挖出來。

另外,如果你想復用Chrome的代碼,那么就得遷就GYP。比如apache的mod_spdy模塊,它的SPDY協議的實現就是從Chrome中直接拿去的。為了引用Chrome的代碼,mod_spdy就不得不采用GYP做構建。

二、.gyp 文件的格式說明。

.gyp文件基本上就是一個json文件,和標準的json相比,它有兩點不同:

  1. 可以用#注釋

  2. list或dictionary的最后一個元素后面可以多一個逗號 (便于用程序自動生成這樣的文件)

在它最頂層的大括號內,有5種對象:variables、includes、target_defaults、targets、conditions。

  • 'variables': Definitions of variables that can be interpolated and used in various other parts of the file.
  • 'includes': A list of of other files that will be included in this file. By convention, included files have the suffix .gypi (gyp include).
  • 'target_defaults': Settings that will apply to all of the targets defined in this .gyp file.
  • 'targets': The list of targets for which this .gyp file can generate builds. Each target is a dictionary that contains settings describing all the information necessary to build the target.
  • 'conditions': A list of condition specifications that can modify the contents of the items in the global dictionary defined by this .gyp file based on the values of different variablwes. As implied by the above example, the most common use of a conditions section in the top-level dictionary is to add platform-specific targets to the targets list.

Chrome在跨平臺問題上采用了一個很有趣的事情,把第三方庫的源代碼copy到現有項目中,并且靜態鏈接進來。相當于,Chrome為它所有用到的第三方庫都做了SVN一個分支,在需要的時候與上游同步。然后它為所有的第三方庫都生成了一個GYP項目文件,然后在Chrome中引用這些第三方庫的項目文件,完成構建。比如,不管你操作系統有沒有裝libevent版本是多少,我都用我自己帶的這個,然后最終鏈接成一個無比巨大的exe或ELF文件。

我非常贊同Chrome的這種做法。有些第三方庫的接口變動非常快,比如glib,單單為了在linux這一種操作系統下適應不同的glib版本,就得在代碼中寫大量的條件編譯宏。查core dump的時候也困難很多,單是找源代碼都能找死一批人(別忘了發行版喜歡 編譯前打自己的patch)。另一點是,構建系統本身也得以簡化,我不需要去把autoconf/automake/cmake/scons等等全裝一遍。最可恨的是,autotools自身還有很多版本,而且各不兼容。要把不同版本的autotools全裝上,并且用起來互不干擾,也需要很大技巧。

下面以glib為例演示下如何在一個項目中包含另一個項目。

首先從svn中checkout出zlib的代碼

svn co http://src.chromium.org/svn/trunk/src/third\_party/zlib

然后把下面代碼保存為test.cpp

#include <stdio.h>
#include 
<string.h>
#include 
<assert.h>
#include 
"zlib.h"

#define CHUNK 16384

/* Compress from file source to file dest until EOF on source.
   def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
   allocated for processing, Z_STREAM_ERROR if an invalid compression
   level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
   version of the library linked do not match, or Z_ERRNO if there is
   an error reading or writing the files. 
*/

int main(int argc, char** argv) {
  FILE
* source = stdin;
  FILE
* dest = stdout;
  
int level = Z_DEFAULT_COMPRESSION;

  
int flush;
  unsigned have;
  z_stream strm;
  unsigned 
char in[CHUNK];
  unsigned 
char out[CHUNK];

  
/* allocate deflate state */
  strm.zalloc 
= Z_NULL;
  strm.zfree 
= Z_NULL;
  strm.opaque 
= Z_NULL;
  
int ret = deflateInit(&strm, level);
  
if (ret != Z_OK) return ret;

  
/* compress until end of file */
  
do {
    strm.avail_in 
= fread(in1, CHUNK, source);
    
if (ferror(source)) {
      deflateEnd(
&strm);
      
return -1;
    }
    flush 
= feof(source) ? Z_FINISH : Z_NO_FLUSH;
    strm.next_in 
= in;

    
/* run deflate() on input until output buffer not full, finish
       compression if all of source has been read in 
*/
    
do {
      strm.avail_out 
= CHUNK;
      strm.next_out 
= out;
      ret 
= deflate(&strm, flush);   /* no bad return value */
      assert(ret 
!= Z_STREAM_ERROR); /* state not clobbered */
      have 
= CHUNK - strm.avail_out;
      
if (fwrite(out1, have, dest) != have || ferror(dest)) {
        (
void) deflateEnd(&strm);
        
return Z_ERRNO;
      }
    } 
while (strm.avail_out == 0);

    
/* done when last data in file processed */
  } 
while (flush != Z_FINISH);

  
/* clean up and return */
  deflateEnd(
&strm);
  
return 0;
}

然后把前面的hello.gyp稍作修改

{
  
'targets': [
    { 
      
'target_name''hello',
      
'type''executable',     
      
'sources': [
        
'test.cpp'
      ],
      
'dependencies': [
        
'zlib/zlib.gyp:zlib'
      ]    
    }
  ]
}

就是在target中加入了一個"dependencies"節。它引用了zlib/zlib.gyp這個文件中的zlib這個target。

然后生成makefile

$ gyp hello.gyp --depth=. -D OS=linux -D os_bsd=0 -D clang=0 -f make

加入了一些新的define,是因為zlib/zlib.gyp中用到了這些variable。

然后make

$ make

用ldd看一下生成的結果文件會發現,

# ldd out/Default/hello linux-vdso.so.1 => (0x00007fff87c1c000) libstdc++.so.6 => /lib64/libstdc++.so.6 (0x0000003b0d000000) libm.so.6 => /lib64/libm.so.6 (0x0000003b07000000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003b08400000) libc.so.6 => /lib64/libc.so.6 (0x0000003b06400000) /lib64/ld-linux-x86-64.so.2 (0x0000003b06000000) 

它不依賴于zlib的so/dll。zlib已經被靜態鏈接進去了。

這樣當需要在服務器上部署的時候就很容易了。不用再總是去編譯、安裝第三方的庫。

posted on 2015-06-16 15:29 楊粼波 閱讀(985) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产伦精品一区二区三区视频黑人| 午夜精品久久久久久久99樱桃 | 一本高清dvd不卡在线观看| 欧美揉bbbbb揉bbbbb| 亚洲精品日韩一| 亚洲人在线视频| 欧美人与禽猛交乱配| 夜夜嗨av色一区二区不卡| 99这里只有久久精品视频| 欧美日韩国产精品一区| 亚洲一区二区三区精品动漫| 一本色道久久综合狠狠躁篇怎么玩| 欧美午夜不卡视频| 欧美与黑人午夜性猛交久久久| 性一交一乱一区二区洋洋av| 国内精品99| 欧美激情aⅴ一区二区三区| 欧美精品日韩综合在线| 亚洲欧美日韩中文播放| 久久成人精品无人区| 91久久国产综合久久蜜月精品| 亚洲精品日韩在线| 国产乱码精品一区二区三| 美女免费视频一区| 欧美日韩中文| 久久久亚洲国产天美传媒修理工 | 久久亚洲综合色| 亚洲国产二区| 99re国产精品| 国产最新精品精品你懂的| 亚洲国产精品视频一区| 国产噜噜噜噜噜久久久久久久久| 牛夜精品久久久久久久99黑人| 欧美日韩中文在线| 美女视频黄a大片欧美| 欧美日在线观看| 欧美 日韩 国产在线| 欧美午夜宅男影院在线观看| 美女国产精品| 国产精品狼人久久影院观看方式| 亚洲激情不卡| 午夜精品久久久久久久| 国产一区二区久久精品| 国产精品尤物| 亚洲高清在线精品| 国产精品一区二区你懂的| 欧美激情精品久久久久久黑人| 国产精品普通话对白| 亚洲精品社区| 91久久精品网| 欧美在线资源| 久久国产精品99国产| 欧美午夜免费影院| 亚洲激情社区| 亚洲欧洲在线免费| 久久青草久久| 久久综合久久美利坚合众国| 国产模特精品视频久久久久| 一本色道久久99精品综合| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 一区二区三区高清| 久久久久欧美精品| 久久久久www| 国产精品亚洲综合天堂夜夜| 99精品国产高清一区二区| 日韩视频久久| 欧美日韩国产丝袜另类| 亚洲片在线观看| 亚洲精品国产精品国产自| 快射av在线播放一区| 欧美成人黄色小视频| 在线看不卡av| 麻豆精品精华液| 欧美高清视频在线播放| 亚洲欧洲日韩在线| 欧美激情精品久久久久久| 亚洲国产日韩欧美在线图片| 99re66热这里只有精品4| 最新成人av网站| 久久久久久综合网天天| 国产欧美日韩不卡| 欧美一二区视频| 久久国产夜色精品鲁鲁99| 国产一区二区三区无遮挡| 久久久久久久久久久久久9999| 免费亚洲一区二区| 99精品热视频| 国产精品欧美一区二区三区奶水 | 久久国产视频网站| 国产亚洲欧美另类一区二区三区| 久久久久久久久久久久久久一区 | 久久久久久国产精品mv| 黄网动漫久久久| 欧美国产先锋| 亚洲图片欧美午夜| 久久精品视频在线看| 国内精品视频久久| 蜜桃av综合| 99国产精品久久久| 欧美伊人久久大香线蕉综合69| 黑人巨大精品欧美一区二区小视频| 久久综合精品国产一区二区三区| 亚洲国产另类久久精品| 午夜一区不卡| 亚洲高清资源| 国产精品免费aⅴ片在线观看| 久久久伊人欧美| 一区二区三区精品视频在线观看| 久久久91精品| 在线亚洲一区| 在线看无码的免费网站| 国产精品hd| 欧美国产一区二区在线观看 | 久久久久9999亚洲精品| 99re视频这里只有精品| 国产亚洲欧美激情| 欧美香蕉视频| 一本色道久久综合亚洲二区三区 | 欧美三级网址| 性欧美xxxx大乳国产app| 亚洲东热激情| 久久免费观看视频| 制服丝袜激情欧洲亚洲| 亚洲国产精品一区制服丝袜| 国产精品区一区| 欧美日韩视频一区二区| 久久综合精品一区| 欧美尤物一区| 午夜精品福利视频| 亚洲午夜在线观看| 亚洲精品一线二线三线无人区| 毛片一区二区三区| 久久国产一二区| 午夜精品久久久久久| 一区二区三区视频在线 | 欧美日韩另类丝袜其他| 久久综合99re88久久爱| 欧美影院一区| 午夜国产精品视频| 亚洲综合丁香| 亚洲午夜日本在线观看| 中文国产成人精品| 一本色道久久综合亚洲精品不| 亚洲日本国产| 亚洲激情在线观看视频免费| 欧美成人亚洲| 欧美国产成人精品| 老牛影视一区二区三区| 久久视频精品在线| 免费观看日韩av| 美国十次了思思久久精品导航| 久久欧美肥婆一二区| 毛片精品免费在线观看| 免费av成人在线| 欧美国内亚洲| 91久久极品少妇xxxxⅹ软件| 亚洲国产欧美日韩| 日韩一级免费观看| 亚洲午夜激情免费视频| 午夜精品一区二区三区电影天堂| 欧美一级淫片播放口| 欧美在线视频一区二区三区| 久久久久久一区二区| 欧美黄色大片网站| 国产精品第一页第二页第三页| 国产精品高潮呻吟久久| 国产一区二区黄色| 亚洲人成亚洲人成在线观看| 一区二区日本视频| 久久成人精品一区二区三区| 免费成人网www| 亚洲欧洲在线一区| 亚洲免费视频网站| 美女久久网站| 欧美性jizz18性欧美| 国产一区二三区| 亚洲精品人人| 久久www成人_看片免费不卡| 欧美va亚洲va香蕉在线| 一区二区三区国产在线| 久久精品国产精品亚洲综合| 欧美激情一区二区三级高清视频 | 久久精品99国产精品日本| 欧美**人妖| 国产精品久久久久久久久久尿| 精品88久久久久88久久久| 亚洲最新在线| 久久综合999| 一区二区三区国产在线| 久久人人97超碰国产公开结果| 欧美三级视频在线| 亚洲第一天堂av| 欧美一二三区在线观看| 亚洲黄色影片| 欧美在线视频网站| 欧美性做爰猛烈叫床潮| 亚洲精品国产精品国自产在线| 久久国产免费| 亚洲性视频h| 欧美金8天国|