精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從用戶和開(kāi)發(fā)者視角詳解如何創(chuàng)建兼容GNU構(gòu)建系統(tǒng)

系統(tǒng) Linux 系統(tǒng)運(yùn)維
經(jīng)常使用Linux的開(kāi)發(fā)人員或者運(yùn)維人員,可能對(duì)configure->make->make install相當(dāng)熟悉。事實(shí)上,這叫GNU構(gòu)建系統(tǒng),利用腳本和make程序在特定平臺(tái)上構(gòu)建軟件。這種方式成為一種習(xí)慣,被廣泛使用。本文從用戶視角和開(kāi)發(fā)者視角詳細(xì)說(shuō)明,這種構(gòu)建方式的細(xì)節(jié),以及開(kāi)發(fā)者如何利用autoconf和automake等工具(autotools)創(chuàng)建兼容GNU構(gòu)建系統(tǒng)的項(xiàng)目。

經(jīng)常使用Linux的開(kāi)發(fā)人員或者運(yùn)維人員,可能對(duì)configure->make->make install相當(dāng)熟悉。事實(shí)上,這叫GNU構(gòu)建系統(tǒng),利用腳本和make程序在特定平臺(tái)上構(gòu)建軟件。這種方式成為一種習(xí)慣,被廣泛使用。本文從用戶視角和開(kāi)發(fā)者視角詳細(xì)說(shuō)明,這種構(gòu)建方式的細(xì)節(jié),以及開(kāi)發(fā)者如何利用autoconf和automake等工具(autotools)創(chuàng)建兼容GNU構(gòu)建系統(tǒng)的項(xiàng)目。

為了簡(jiǎn)化可移植構(gòu)建的難度,在早期有一套autotools工具幫助程序員構(gòu)建軟件。我們熟知的configure->make->make install三部曲,大多都是基于autotools來(lái)構(gòu)建的。autotools是GNU程序的標(biāo)準(zhǔn)構(gòu)建系統(tǒng),所以其實(shí)我們經(jīng)常在使用三部曲。有些程序雖然也是這三部曲,但卻不是用autotools實(shí)現(xiàn)的,比如nginx的源碼就是作者自己編寫(xiě)的構(gòu)建程序。

用戶視角

用戶通過(guò)configure->make->make install基于源碼安裝軟件。然而大部分用戶可能并不知道這個(gè)過(guò)程究竟做了些什么。

configure腳本是由軟件開(kāi)發(fā)者維護(hù)并發(fā)布給用戶使用的shell腳本。這個(gè)腳本的作用是檢測(cè)系統(tǒng)環(huán)境,最終目的是生成Makefile和config.h。

make通過(guò)讀取Makefile文件,開(kāi)始構(gòu)建軟件。而make install可以將軟件安裝到需要安裝的位置。

 如上圖,開(kāi)發(fā)者在分發(fā)源碼包時(shí),除了源代碼(.c .h...),還有許多用以支撐軟件構(gòu)建的文件和工具,其中最重要的文件就是Makefile.in和config.h.in。configure腳本執(zhí)行成功后,將為每一個(gè)*.in文件處理成對(duì)應(yīng)的非*.in文件。

大部分情況只生成Makefile和config.h,因?yàn)镸akefile用于make程序識(shí)別并構(gòu)建軟件,而config.h中定義的宏,有助于軟件通過(guò)預(yù)編譯來(lái)改變自身的代碼,以適應(yīng)目標(biāo)平臺(tái)某些特殊性。有些軟件在configure階段,還可以生成其他文件,這完全取決于如軟件本身。

configure

當(dāng)運(yùn)行configure時(shí),將看到類似如下的系統(tǒng)檢查,這些檢查的多少取決于軟件本身的需要,也就是由軟件開(kāi)發(fā)者來(lái)定義和編寫(xiě)的。

  1. checking for a BSD-compatible install... /usr/bin/install -c 
  2. checking whether build environment is sane... yes 
  3. checking for a thread-safe mkdir -p... /bin/mkdir -p 
  4. checking for gawk... gawk 
  5. checking whether make sets $(MAKE)... yes 
  6. checking for gcc... gcc 
  7. checking for C compiler default output file name... a.out 
  8. ...  

一般來(lái)說(shuō),configure主要檢查當(dāng)前目標(biāo)平臺(tái)的程序、庫(kù)、頭文件、函數(shù)等的兼容性。這些檢查結(jié)果將作用于config.h和Makefile文件的生成。從而影響最終的編譯。

用戶也可以通過(guò)給configure配置參數(shù)來(lái)定制軟件需要包含或不需要包含的組件、安裝路徑等行為。這些參數(shù)分為5組,可以通過(guò)執(zhí)行./configure --help來(lái)查看,軟件提供哪些配置參數(shù):

  • *安裝路徑相關(guān)配置。最常見(jiàn)的是--prefix。
  • *程序名配置。例如--program-suffix可用于為生成的程序添加后綴。
  • *跨平臺(tái)編譯。不太常用。
  • *動(dòng)態(tài)庫(kù)靜態(tài)庫(kù)選項(xiàng)。用于控制是否生成某種類型的庫(kù)文件。
  • 程序組件選項(xiàng)。用于配置程序是否將某種功能編譯到程序中,一般形如--with-xxx。這可能是最常用的配置,而且由軟件開(kāi)發(fā)者來(lái)定義。

(*表示這是幾乎所有軟件都支持的配置,因?yàn)檫@些配置是autotool生成的configure腳本默認(rèn)支持的。)

configure在執(zhí)行過(guò)程中,除了生成Makefile外,還會(huì)生成的文件包括但不限于:

  • config.log 日志文件
  • config.cache 緩存,以提高下一次configure的速度,需通過(guò)-C來(lái)指定才會(huì)生成
  • config.status 實(shí)際調(diào)用編譯工具構(gòu)建軟件的shell腳本

 如果軟件通過(guò)libtool構(gòu)建,還會(huì)生成libtool腳本。關(guān)于libtool腳本如何生成,請(qǐng)看開(kāi)發(fā)者視角。

configure經(jīng)常會(huì)中途出錯(cuò),這一般是由于當(dāng)前平臺(tái)不具有構(gòu)建該軟件所必需的依賴(庫(kù)、函數(shù)、頭文件、程序...)。此時(shí),不要慌張,仔細(xì)查看輸出,解決這些依賴。

開(kāi)發(fā)者視角

開(kāi)發(fā)者除了編寫(xiě)軟件本身的代碼外,還需要負(fù)責(zé)生成構(gòu)建軟件所需要文件和工具。當(dāng)我接觸到autotools后,我發(fā)現(xiàn),雖然有工具的幫助,但這件事情依舊十分復(fù)雜。

對(duì)于C或C++程序員,在早期,構(gòu)建跨平臺(tái)的應(yīng)用程序是相當(dāng)繁瑣的一件事情,而且對(duì)于經(jīng)驗(yàn)不足的程序員而言,甚至難度巨大。因?yàn)闃?gòu)建可移植的程序的必要前提是對(duì)各個(gè)平臺(tái)足夠了解,這往往要花上相當(dāng)長(zhǎng)的時(shí)間去積累。

Unix系統(tǒng)的分支復(fù)雜度很高,不同的商用版或開(kāi)源版或多或少都有差異。這些差異主要體現(xiàn)在:系統(tǒng)組件、系統(tǒng)調(diào)用。我們主要將Unix分為如下幾個(gè)大類:IBM-AIX HP-UX Apple-DARWIN Solaris Linux FreeBSD。Unix分支大全

因此,對(duì)于開(kāi)發(fā)者而言,要么自己編寫(xiě)構(gòu)建用的腳本,這往往需要極其扎實(shí)的shell能力和平臺(tái)熟悉度。另一個(gè)選擇就是部分依賴工具。autoconf和automake就是這樣的工具。

autoreconf

為了生成configure腳本和Makefile.in等文件,開(kāi)發(fā)者需要?jiǎng)?chuàng)建并維護(hù)一個(gè)configure.ac文件(在早期,通常叫configure.in文件,雖然沒(méi)有區(qū)別,但強(qiáng)烈建議使用.ac,因?yàn)?in文件往往意味著被configure腳本識(shí)別為模板文件并生成直接參與最終構(gòu)建的文件,configure.in在命名上有歧義),以及一系列的Makefile.am。autoreconf程序能夠自動(dòng)按照合理的順序調(diào)用autoconfautomake aclocal等程序。

 configure.ac

configure.ac用于生成configure腳本。autoconf工具用來(lái)完成這一步。下面是一個(gè)configure.ac的例子:

  1. AC_PREREQ([2.63]) 
  2. AC_INIT([st], [1.0], [zhoupingtkbjb@163.com]) 
  3. AC_CONFIG_SRCDIR([src/main.c]) 
  4. AC_CONFIG_HEADERS([src/config.h]) 
  5.  
  6. AM_INIT_AUTOMAKE([foreign]) 
  7.  
  8.  
  9. # Checks for programs. 
  10. AC_PROG_CC 
  11. AC_PROG_LIBTOOL 
  12.  
  13. # Checks for libraries. 
  14.  
  15. # Checks for header files. 
  16.  
  17. # Checks for typedefs, structures, and compiler characteristics. 
  18.  
  19. # Checks for library functions. 
  20.  
  21. AC_CONFIG_FILES([Makefile 
  22.                  src/Makefile 
  23.                  src/a/Makefile 
  24.                  src/b/Makefile]) 
  25. AC_OUTPUT  

其中以AC_開(kāi)頭的類似函數(shù)調(diào)用一樣的代碼,實(shí)際是一些被稱為“宏”的調(diào)用。這里的宏與C中的宏概念類似,會(huì)被替換展開(kāi)。m4是一個(gè)經(jīng)典的宏工具,autoconf正是構(gòu)建在m4之上,可以理解為autoconf預(yù)先實(shí)現(xiàn)了大量的,用于檢測(cè)系統(tǒng)可移植性的宏,這些宏在展開(kāi)后就是大量的shell腳本。所以編寫(xiě)configure.ac需要對(duì)這些宏熟練掌握,并且合理調(diào)用。有時(shí),甚至可以自己實(shí)現(xiàn)自己的宏。

autoscan和configure.scan

可以通過(guò)調(diào)用autoscan命令得到一個(gè)初始化的configure.scan文件,然后重命名為configure.ac后,在此基礎(chǔ)上編輯configure.ac。autoscan會(huì)掃描源碼,并生成一些通用的宏調(diào)用、輸入的聲明以及輸出的聲明。盡管autoscan十分方便,但是沒(méi)人能夠在構(gòu)建之前,就把代碼完全寫(xiě)好,因此autoscan通常用于初始化configure.ac。

autoheader和config.h

autoheader命令掃描configure.ac中的內(nèi)容,并確定需要如何生成config.h.in。每當(dāng)configure.ac有所變化,都可以通過(guò)再次執(zhí)行autoheader更新config.h.in。在configure.ac通過(guò)AC_CONFIG_HEADERS([config.h])告訴autoheader應(yīng)當(dāng)生成config.h.in的路徑。在實(shí)際的編譯階段,生成的編譯命令會(huì)加上-DHAVE_CONFIG_H定義宏,于是在代碼中,我們可以通過(guò)下面代碼安全的引用config.h。 

  1. /bin/sh ../../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H ...  
  1. #ifdef HAVE_CONFIG_H 
  2. #include <config.h> 
  3. #endif  

config.h包含了大量的宏定義,其中包括軟件包的名字等信息,程序可以直接使用這些宏;更重要的是,程序可以根據(jù)其中的對(duì)目標(biāo)平臺(tái)的可移植性相關(guān)的宏,通過(guò)條件編譯,動(dòng)態(tài)的調(diào)整編譯行為。

automake和Makfile.am

手工編寫(xiě)Makefile是一件相當(dāng)煩瑣的事情,而且,如果項(xiàng)目復(fù)雜的話,編寫(xiě)難度將越來(lái)越大。因而,automake工具應(yīng)運(yùn)而生。我們可以編寫(xiě)像下面這樣的Makefile.am文件,并依靠automake來(lái)生成Makefile.in: 

  1. SUBDIRS = a b 
  2. bin_PROGRAMS    = st 
  3. st_SOURCES        = main.c 
  4. st_LDADD        = $(top_builddir)/src/a/liba.la $(top_builddir)/src/b/libb.la   

這里通過(guò)SUBDIRS聲明了兩個(gè)子目錄,子目錄的中的構(gòu)建需要靠a/Makefile.am和b/Makefile.am來(lái)進(jìn)行,這樣多目錄組織起來(lái)就方便多了。

bin_PROGRAMS聲明一個(gè)可執(zhí)行文件目標(biāo),st_SOURCES指定這個(gè)目標(biāo)所依賴的源代碼文件。另外,st_LDADD聲明了可執(zhí)行文件在連接時(shí),需要依賴的Libtool庫(kù)文件。

通過(guò)這個(gè)Makefile.am文件生成的Makefile.in文件相當(dāng)大,不便貼出,但是可以想象,Makefile.in要比我們手工編寫(xiě)的Makefile文件復(fù)雜的多。

automake的出現(xiàn)晚于autoconf,所以automake是作為autoconf的擴(kuò)展來(lái)實(shí)現(xiàn)的。通過(guò)在configure.ac中聲明AM_INIT_AUTOMAKE告訴autoconf需要配置和調(diào)用automake。

aclocal

上面提到,configure.ac實(shí)際是依靠宏展開(kāi)來(lái)得到configure的。因此,能否成功生成取決于,宏定義能否找到。autoconf會(huì)從自身安裝路徑下來(lái)尋找事先定義好了宏。然而對(duì)于像automake、libtool和gettext等第三方擴(kuò)展宏,甚至是開(kāi)發(fā)者自行編寫(xiě)的宏就一無(wú)所知了。于是,存在這個(gè)工具aclocal,將在configure.ac同一目錄下生成aclocal.m4,在掃描configure.ac的過(guò)程中,將第三方擴(kuò)展和開(kāi)發(fā)者自己編寫(xiě)的宏定義復(fù)制進(jìn)去。這樣,autoconf在遇到不認(rèn)識(shí)的宏時(shí),就會(huì)從aclocal.m4中查找。

下面這張圖更為詳細(xì)的展現(xiàn)了整個(gè)工具鏈?zhǔn)侨绾位ハ嗯浜系摹?/p>

 libtool

libtool試圖解決不同平臺(tái)下,庫(kù)文件的差異。libtool實(shí)際是一個(gè)shell腳本,實(shí)際工作過(guò)程中,調(diào)用了目標(biāo)平臺(tái)的cc編譯器和鏈接器,以及給予合適的命令行參數(shù)。libtool可以單獨(dú)使用,這里只介紹與autotools集成使用相關(guān)的內(nèi)容。

automake支持libtool構(gòu)建聲明。在Makefile.am中,普通的庫(kù)文件目標(biāo)寫(xiě)作xxx_LIBRARIES: 

  1. noinst_LIBRARIES = liba.a 
  2. liba_SOURCES = ao1.c ao2.c ao3.c 

 而對(duì)于一個(gè)libtool目標(biāo),寫(xiě)作xxx_LTLIBRARIES,并以.la作為后綴聲明庫(kù)文件。 

  1. noinst_LTLIBRARIES = liba.la 
  2. liba_la_SOURCES = ao1.c ao2.c ao3.c  

在configure.ac中需要聲明LT_INIT: 

  1. ... 
  2. AM_INIT_AUTOMAKE([foreign]) 
  3. LT_INIT 
  4. ... 

 有時(shí),如果需要用到libtool中的某些宏,則推薦將這些宏copy到項(xiàng)目中。首先,通過(guò)AC_CONFIG_MACRO_DIR([m4])指定使用m4目錄存放第三方宏;然后在最外層的Makefile.am中加入ACLOCAL_AMFLAGS = -I m4。

all-in-one

上面討論了很多關(guān)于autoreconf的細(xì)節(jié)。實(shí)際上,如今我們可以直接調(diào)用autoreconf --install來(lái)自動(dòng)調(diào)用上面提到的所有子命令。這里--install參數(shù)試圖將輔助的腳本和宏copy到當(dāng)前項(xiàng)目目錄中,下面是執(zhí)行時(shí)的輸出: 

  1. autoreconf: Entering directory `.' 
  2. autoreconf: configure.ac: not using Gettext 
  3. autoreconf: running: aclocal  
  4. autoreconf: configure.ac: tracing 
  5. autoreconf: running: libtoolize --copy 
  6. libtoolize: putting auxiliary files in `.'. 
  7. libtoolize: copying file `./ltmain.sh' 
  8. libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and 
  9. libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree. 
  10. libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. 
  11. autoreconf: running: /usr/bin/autoconf 
  12. autoreconf: running: /usr/bin/autoheader 
  13. autoreconf: running: automake --add-missing --copy --no-force 
  14. configure.ac:10: installing `./config.guess' 
  15. configure.ac:10: installing `./config.sub' 
  16. configure.ac:9: installing `./install-sh' 
  17. configure.ac:9: installing `./missing' 
  18. src/Makefile.am: installing `./depcomp' 
  19. autoreconf: Leaving directory `.'  

當(dāng)我們以--install參數(shù)運(yùn)行時(shí),libtoolize --copy被調(diào)用,這將使得ltmain.sh被copy進(jìn)來(lái);接下來(lái)分別執(zhí)行autoconf和autoheader;automake的參數(shù)為--add-missing --copy --no-force,這將使得幾個(gè)輔助腳本和文件被安裝到目錄下。

這些輔助文件默認(rèn)安裝在configure.ac同一個(gè)目錄下,如果你希望用另一個(gè)目錄來(lái)存放他們,可以配置AC_CONFIG_AUX_DIR,例如AC_CONFIG_AUX_DIR([build-aux])將使用build-aux目錄來(lái)存放輔助文件。

如果不使用--install參數(shù),輔助文件要么不copy,要么以軟鏈的形式創(chuàng)建。推薦使用--install,因?yàn)檫@樣,其他軟件維護(hù)可以避免由于構(gòu)建工具版本不一致造成問(wèn)題。

輔助文件

一個(gè)依靠GNU構(gòu)建系統(tǒng)開(kāi)發(fā)的軟件除了源碼之外,還有很多輔助的文件,有些是腳本,有些是文本文件。下面將逐一解釋這些文件:

  • aclocal.m4:上面提到了,這個(gè)宏定義文件里面包含了第三方的宏定義,用于autoconf展開(kāi)configure.ac
  • NEWS README AUTHORS ChangeLog:這些文件是GNU軟件的標(biāo)配,不過(guò)在項(xiàng)目中不一定需要加入。如果項(xiàng)目中沒(méi)有這些文件,每次autoreconf會(huì)提示缺少文件,不過(guò)這并不影響。如果不想看到這些錯(cuò)誤提示,可以用AM_INIT_AUTOMAKE([foreign])來(lái)配置automake。foreign參數(shù)就是告訴automake不要這么較真:)
  • config.guess config.sub:由automake產(chǎn)生,兩個(gè)用于目標(biāo)平臺(tái)檢測(cè)的腳本
  • depcomp install-sh:由automake產(chǎn)生,用于完成編譯和安裝的腳本
  • missing:由automake產(chǎn)生
  • ltmain.sh:有l(wèi)ibtoolize產(chǎn)生,該腳本用于在configure階段配置生成可運(yùn)行于目標(biāo)平臺(tái)的libtool腳本
  • ylwrap:由automake產(chǎn)生,如果檢測(cè)構(gòu)建需要使用lex和yacc,那么會(huì)產(chǎn)生這個(gè)包裝腳本
  • autogen.sh:在早期,autoreconf并不存在,軟件開(kāi)發(fā)者往往需要自己編寫(xiě)腳本,按照順序調(diào)用autoconf autoheaderautomake等工具程序。這個(gè)文件就是這樣的腳本。起這么個(gè)名字可能是習(xí)慣性的

總結(jié)

本文總概念上闡述了autotool系列工具是如何工作的。相比如今現(xiàn)成的IDE,GNU構(gòu)建系統(tǒng)其實(shí)是非常難用的,學(xué)習(xí)成本比較高。筆者認(rèn)為最為效率的途徑是學(xué)習(xí)開(kāi)源的程序,從中慢慢體會(huì),慢慢吸收。另外,推薦幾個(gè)資料:

  • 《GNU Autoconf Automake and Libtool》
  •  Autotools Tutorial
  • GNU網(wǎng)站上關(guān)于autoconf automake 和 libtool的手冊(cè) 

筆者還有一些相關(guān)的筆記,后面再另外寫(xiě)一篇文章總結(jié)一下。

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2016-09-28 21:50:29

GNUAutotoolLinux

2019-07-04 09:00:00

Web控制器架構(gòu)

2021-09-04 19:54:40

開(kāi)發(fā)者技術(shù)管理

2019-02-21 13:40:35

Javascript面試前端

2013-09-18 10:19:14

開(kāi)發(fā)者用戶

2016-09-28 22:04:01

GNUAutotoolLinux

2013-07-10 15:29:56

移動(dòng)應(yīng)用開(kāi)發(fā)移動(dòng)應(yīng)用避免產(chǎn)品被刪除

2018-12-17 16:54:50

開(kāi)發(fā)者技能 Firefox

2012-11-09 15:32:28

2012-11-29 10:02:31

移動(dòng)云應(yīng)用BYOD策略移動(dòng)應(yīng)用程序

2013-10-16 14:46:17

移動(dòng)開(kāi)發(fā)技能

2011-11-15 09:10:24

HTML 5

2013-05-20 17:00:34

LinuxLinux兼容

2015-02-26 09:49:16

2011-12-29 17:09:08

開(kāi)發(fā)者沙龍

2010-10-19 11:14:06

2015-08-11 09:13:16

2048WEB開(kāi)發(fā)

2012-03-16 10:19:43

.NET

2017-03-31 22:45:11

iOSiOS 10.3開(kāi)發(fā)者

2012-02-23 09:58:25

手機(jī)MMO游戲手機(jī)游戲MMO
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲国产www| 欧美三级小视频| 国产亚洲人成a在线v网站| 中文字幕一区二区三区乱码在线| 99久久伊人精品影院| 日产精品久久久| 999久久久国产精品| 日本一区二区三区视频| 精品制服美女丁香| 久久精品视频在线观看| 久久性爱视频网站| 成人四虎影院| 亚洲影院在线观看| 水蜜桃亚洲精品| 亚洲欧美另类视频| 美女一区二区久久| 久久久亚洲网站| 午夜成人亚洲理伦片在线观看| 国产精品任我爽爆在线播放| 精品视频免费看| 99爱视频在线| 日韩av激情| 国产精品全国免费观看高清 | 久久亚洲私人国产精品va| 91玉足脚交白嫩脚丫| 91精品网站在线观看| 日韩欧美国产免费播放| 精品国偷自产一区二区三区| 免费人成在线观看播放视频| 久久精品人人爽人人爽| 国产精品视频在线免费观看 | 国内国产精品久久| 国产精品99久久久久久久久久久久 | 久久露脸国产精品| 欧美片一区二区| 国产二区精品| 亚洲欧洲一区二区在线播放| 亚洲精品小视频在线观看| 欧美成人福利在线观看| 暖暖成人免费视频| 欧美日韩中文字幕日韩欧美| 日韩 欧美 视频| 一区二区三区伦理| 亚洲欧美区自拍先锋| 亚洲一区二区三区四区中文| 成人在线观看黄色| 国产亚洲综合在线| 秋霞在线观看一区二区三区| 亚洲人午夜射精精品日韩| av在线综合网| 国产精品亚洲一区| 亚洲欧美国产高清va在线播放| 国产精品影视在线| 成人精品水蜜桃| 韩国中文字幕hd久久精品| 成人av在线电影| 成人自拍偷拍| 偷拍精品一区二区三区| 成人avav影音| 久久免费99精品久久久久久| 五月婷婷深深爱| 91麻豆精品视频| 欧美精品亚洲精品| 成人高清网站| 亚洲欧美在线视频| 久久久无码中文字幕久...| 黄色成年人视频在线观看| 亚洲人成网站精品片在线观看| 天堂av在线中文| 日本三级在线观看网站| 亚洲成人一区二区| 久久久久久久久久久久久久国产| 日韩免费va| 欧美日韩日日夜夜| 极品人妻一区二区| 噜噜噜狠狠夜夜躁精品仙踪林| 狠狠色狠狠色综合系列| 日韩美女在线视频 | 日本一级淫片免费放| 亚洲国产99| 国产精品777| 国产成人av免费看| www.日韩精品| 日韩av电影免费播放| 成人短视频在线| 五月综合激情日本mⅴ| 国产真实乱子伦| 亚洲欧洲一二区| 亚洲精品成人免费| 中文字幕美女视频| 9色国产精品| 国产精品一区二区三区毛片淫片 | av毛片在线免费观看| 九九热在线视频观看这里只有精品| 91亚洲人电影| 日本午夜在线视频| 综合色天天鬼久久鬼色| 日本wwww视频| 亚洲视频一起| 色伦专区97中文字幕| xxxxxx国产| 国内精品免费**视频| 蜜桃导航-精品导航| 在线观看中文| 欧亚洲嫩模精品一区三区| 韩国三级与黑人| 国内精品久久久久久久久电影网 | 免费在线观看国产精品| 青青草精品视频| 精品国产免费人成电影在线观...| 二区在线观看| 午夜精品久久久久久久久久久| 欧美精品一区二区在线观看| 亚洲精品第三页| 精品国内亚洲2022精品成人| www.久久久久久.com| av资源免费观看| 成人免费av在线| 最新黄色av网站| 91p九色成人| 精品亚洲一区二区三区在线播放| 九九热精品免费视频| 麻豆91在线看| 日韩视频专区| 成人美女视频| 亚洲精品久久久久中文字幕二区 | 国产白嫩美女无套久久| 午夜精品免费| 91精品国产综合久久久久久久久| 精品推荐蜜桃传媒| 色综合激情五月| 国产熟女高潮一区二区三区| 精品二区视频| 成人av资源网| 欧美aaaxxxx做受视频| 欧美一三区三区四区免费在线看| 五月综合色婷婷| 美国av一区二区| 一区高清视频| 国产精品黄色片| 国产亚洲视频中文字幕视频| 区一区二在线观看| 久久久久久久久久久电影| av免费播放网址| 免费观看久久av| 日韩av电影在线播放| 蜜芽tv福利在线视频| 色婷婷精品久久二区二区蜜臀av | 91精品国产福利在线观看麻豆| 国产欧美在线视频| 欧美成年黄网站色视频| 欧美精品久久久久久久多人混战| 国产三级黄色片| 久久国产日韩欧美精品| 综合一区中文字幕| 日韩高清一区| 91国产精品91| 国产三区四区在线观看| 欧美视频一区在线| 日韩欧美国产成人精品免费| 狠狠狠色丁香婷婷综合久久五月| 日本免费黄色小视频| 成人av地址| 欧美亚洲成人xxx| 福利视频在线看| 欧美一区二区三区系列电影| 精品午夜福利视频| 91丨porny丨国产| 亚洲成人av免费看| 一本到12不卡视频在线dvd| 国产99在线免费| 亚洲涩涩在线| 日韩在线观看免费全| 国产福利资源在线| 欧美日韩国产一区在线| 国产精品无码无卡无需播放器| 国产制服丝袜一区| 女性女同性aⅴ免费观女性恋| 欧美日韩伦理| 亚洲综合中文字幕在线| 丝袜诱惑一区二区| 色偷偷噜噜噜亚洲男人的天堂| 亚洲成人精品女人久久久| 欧美视频中文字幕在线| 国产真人真事毛片视频| 国产成人激情av| av免费网站观看| 欧美在线高清| 色一情一乱一伦一区二区三区| 国产精品1区在线| 欧美性在线视频| av在线免费网址| 亚洲老头老太hd| 国产高清免费在线观看| 日本福利一区二区| 国产一级在线免费观看| 中文字幕第一页久久| 精品熟女一区二区三区| 九九视频精品免费| 91看片就是不一样| 欧美特黄a级高清免费大片a级| 欧美日韩精品免费看| 2020国产精品极品色在线观看| 国产精品稀缺呦系列在线| 成人在线黄色电影| 欧美日韩国产999| 9191在线| 亚洲欧美国产高清va在线播| 午夜久久久久久久久久| 欧美日韩一区三区四区| 欧美 日韩 精品| 亚洲自拍偷拍麻豆| 国产一区二区三区在线视频观看| 久久精品欧美一区二区三区不卡| 中文字幕在线视频播放| 国产一区二区日韩精品| 无尽裸体动漫2d在线观看| 国产精品久久国产愉拍| 真人抽搐一进一出视频| 天天色天天射综合网| 日本精品一区二区| 色婷婷av一区二区三区丝袜美腿| a级国产乱理论片在线观看99| 九九九精品视频| 国产精品久久久久久av下载红粉| 高清在线视频不卡| 欧美激情女人20p| 新版中文在线官网| 久久久91精品国产| 免费a级人成a大片在线观看| 日韩av在线精品| 五月天激情开心网| 亚洲精品第一国产综合精品| 人妻精品一区二区三区| 精品国产伦一区二区三区观看方式| 国产成人精品a视频| 欧美一区二区三区免费观看视频| 亚洲综合视频在线播放| 欧美日韩一级二级三级| 中文字幕你懂的| 欧美美女视频在线观看| 91av国产精品| 欧美一区二区三区婷婷月色| 99精品视频免费看| 欧美一级生活片| 亚洲第一页视频| 欧美精品一区二| 亚洲三区在线播放| 亚洲美女av在线| 国产粉嫩一区二区三区在线观看| 国产亚洲欧美日韩一区二区| av免费在线一区二区三区| 日韩亚洲国产中文字幕| av免费网站在线| 欧美激情中文网| 咪咪网在线视频| 日本久久久久久久| 国产精品高潮久久| 91中文字幕一区| 9l视频自拍九色9l视频成人| 久久99精品久久久久子伦| 久久不见久久见国语| 亚洲乱码一区二区三区| 中文字幕人成人乱码| 国产乱子伦精品无码专区| 国产精品夜夜夜| 15—17女人毛片| 国产成人在线视频播放| 亚洲精品在线视频免费观看| 久久天堂av综合合色蜜桃网| 亚洲aaa视频| 亚洲精品中文在线观看| 国产情侣在线视频| 欧美在线观看视频在线| av在线免费在线观看| 亚洲成年人在线| 福利视频在线导航| 欧美激情一区二区三区成人| 国产精品专区免费| 成人免费福利视频| 麻豆精品av| 亚洲一区二区三区色| 在线日韩av| 亚洲天堂2018av| 成人av在线一区二区| 日本高清黄色片| 午夜精品福利一区二区蜜股av| 成人免费一级片| 精品黑人一区二区三区久久| 国产永久免费高清在线观看视频| 久久影视免费观看| 在线天堂资源| 91精品久久香蕉国产线看观看| 亚洲精华一区二区三区| 污污污污污污www网站免费| 久久精品二区三区| 成人做爰www看视频软件| 国产精品看片你懂得| 91porny在线| 日韩欧美二区三区| 香蕉视频网站在线观看| 欧美一区在线直播| 伊人久久影院| 国产精品av免费| 视频一区二区三区中文字幕| 日本一卡二卡在线| 亚洲免费看黄网站| 黄色大全在线观看| 日韩精品福利在线| 青草视频在线免费直播| 国产一区香蕉久久| 黄色不卡一区| 欧美日韩在线不卡视频| 成人h动漫精品一区二区| 91人妻一区二区三区蜜臀| 在线免费观看日韩欧美| 日本一级在线观看| 性欧美在线看片a免费观看| 国产视频一区二| 一区二区三视频| 免费高清在线一区| 成人免费网站黄| 欧美日韩亚洲网| 日韩大胆视频| 午夜精品一区二区三区在线视| 136国产福利精品导航网址应用| 黄瓜视频免费观看在线观看www | 五月天亚洲精品| 精品人妻无码一区二区色欲产成人 | 国产在线精品不卡| 久久噜噜色综合一区二区| 欧美伊人精品成人久久综合97| 涩爱av在线播放一区二区| 91国产精品91| 色狼人综合干| 欧美黄色免费影院| 久久亚洲欧美国产精品乐播| 一级免费在线观看| 日韩经典中文字幕| 樱桃视频成人在线观看| 欧美极品日韩| 日韩 欧美一区二区三区| 欧美三级视频网站| 欧美日韩免费不卡视频一区二区三区 | 国内少妇毛片视频| 成人av电影在线观看| 日韩精品在线免费看| 日韩精品在线视频美女| 欧美香蕉视频| 亚洲人成影视在线观看| 久久99精品久久久久久动态图| 成人做爰视频网站| 日韩一区二区在线免费观看| 曰本三级在线| 国产亚洲自拍偷拍| 久久久久看片| 日本猛少妇色xxxxx免费网站| 欧美日本一区二区| 亚洲91av| 韩国一区二区三区美女美女秀 | 成人黄色片在线| 欧美/亚洲一区| 88av在线播放| 91福利在线观看| 超碰免费公开在线| 国产精品免费一区二区三区在线观看| 99精品福利视频| xxx在线播放| 欧美一区二区网站| 草草在线视频| 亚洲视频导航| 国产传媒日韩欧美成人| 日韩欧美亚洲一区二区三区| 亚洲区一区二区| 24小时成人在线视频| 台湾无码一区二区| 国产日产亚洲精品系列| 国产亲伦免费视频播放| 午夜精品一区二区三区在线视| 国产成人一区二区三区影院| 91热视频在线观看| 图片区小说区国产精品视频| 国产在线色视频| 99热99热| 奇米影视在线99精品| 久久久久久久久久91| 国产一区二区三区在线看| 国产在线不卡一区二区三区| www.com毛片| 亚洲丝袜自拍清纯另类| 日本午夜在线视频| 97se亚洲综合| 美日韩一区二区| 国产成人自拍视频在线| 久久久国产精品视频| 亚洲春色h网| 美女露出粉嫩尿囗让男人桶| 欧美在线观看一区二区| 女人让男人操自己视频在线观看| 做爰高潮hd色即是空|