1. 程式人生 > >busybox中Makefile分析(未完)

busybox中Makefile分析(未完)

一 說明

可以在busybox目錄下,執行“make help”獲取幫助資訊;可以通過README獲取更多資訊。下面是Makefile的主要步驟:

1、讀取工作目錄下的預設makefile檔案(makefile,Makefile) (開始讀我們的寫的makefile主檔案了)
2、依次讀取工作目錄makefile檔案中使用指示符"include"包含的檔案 (makefile主檔案中包含的其他檔案也讀進來了)
3、查詢重建所有已讀取的makefile檔案的規則(如果存在一個目標是當前讀取的某一個makefile檔案,則執行此規則重建此makefile檔案,完成以後從第一步開始重新執行) (makefile主檔案極其包含的makefile檔案有需要動態修改的,先修改在重新讀進來)
4、初始化變數值並展開那些需要立即展開的變數和函式並根據預設條件確定執行分支 (相當於預處理過程吧?)
5、根據"終極目標"以及其他目標的依賴關係建立依賴關係連結串列 (開始整理我們的寫的規則準備執行了,相當於編譯連結過程)
6、執行除"終極目標"以外的所有的目標的規則(規則中如果所依賴的檔案中一個時間戳比目標檔案新,則根據規則所定義的命令重新建立目標) (最後兩步就是執行了)
7、執行"終極目標"所在的規則

二 檔案內容理解

VERSION = 1
PATCHLEVEL = 20
SUBLEVEL = 2
EXTRAVERSION =
NAME = Unnamed

上面關於版本資訊,很容易理解,就不再重複。

不要列印"Entering directory ...",要不然進入每個目錄都會列印該顯示資訊。

MAKEFLAGS += --no-print-directory

操作符“+=”的作用是給變數(“+=”前面的MAKEFLAGS)追加值。在執行make時的命令列選項引數被通過變數 “MAKEFLAGS”傳遞給子目錄下的make程式。對於這個變數除非使用指示符“unexport”對它們進行宣告,否則,它們在整個

make的執行過程中始終被自動的傳遞給所有的子make。還有個特殊變數SHELLMAKEFLAGS一樣,預設情況(沒有用“unexport”宣告)下在整個make的執行過程中被自動的傳遞給所有的子make

我們使用遞迴構建方法,所以我們需要想一下怎樣得到正確的順序。最重要的是:子目錄中的Makefile檔案只能在它們本身的目錄下進行修改。如果在某一個目錄下,與另一個目錄下的檔案有依賴關係(這並不經常發生,但是在將built-in.o 目標檔案連結成busybox的時候,這是不可避免的), 我們將會在別的目錄中,呼叫make命令,這樣我們就能保證那個目錄下的檔案都是最新的。

為了重點關注警告資訊,預設輸出是精簡的。命令'make V=1' 可以看見所有的命令
ifdef V
  ifeq ("$(origin V)", "command line")
    KBUILD_VERBOSE = $(V)
  endif
endif
ifndef KBUILD_VERBOSE
  KBUILD_VERBOSE = 0
endif

函式origin並不操作變數的值,只是告訴你,這個變數是哪裡來的。語法是: $(origin ;)# origin函式的返回值有:"undefined" 從來沒有定義過、“default”是一個預設的定義、"environment"是一個環境變數、 "file"這個變數被定義在Makefile、"command line"這個變數是被命令列定義的、 "override"是被override指示符重新定義的、"automatic"是一個命令執行中的自動化變數。

ifdef C
  ifeq ("$(origin C)", "command line")
    KBUILD_CHECKSRC = $(C)
  endif
endif
ifndef KBUILD_CHECKSRC
  KBUILD_CHECKSRC = 0
endif

對於c檔案的編譯,呼叫sparse核心程式碼靜態分析工具, 使用命令 'make C=1' 使能sparse檢查。

M=目錄 來指定要構建的外部模組;舊語法 make ... SUBDIRS=$PWD仍然被支援;設定環境變數KBUILD_EXTMOD,這種方法優先。
ifdef SUBDIRS
  KBUILD_EXTMOD ?= $(SUBDIRS)
endif
ifdef M
  ifeq ("$(origin M)", "command line")
    KBUILD_EXTMOD := $(M)
  endif
endif 

kbuild 支援儲存輸出檔案到另外一個單獨的目錄下,它支援兩種語法,兩種情況下,工作目錄必須是原始碼的根目錄:(1) O= ,使用 "make O=dir/to/store/output/files/"指定輸出目錄;(2) 設定環境變數 KBUILD_OUTPUT, 使用export KBUILD_OUTPUT=dir/to/store/output/files/。 “O= ”這種方法優先順序高於環境變數 KBUILD_OUTPUT設定這種方法。

在OBJ目錄下呼叫make時,設定KBUILD_SRC;(現在)KBUILD_SRC沒有打算給普通使用者使用。

好了,在原始碼所在的目錄下呼叫Make,下面就是其處理流程。首先,我們是否要將輸出檔案定位到獨立的目錄下?

ifeq ($(KBUILD_SRC),) 
ifdef O
    ifeq ("$(origin O)", "command line")
        KBUILD_OUTPUT := $(O)
    endif
endif

#如果命令列中沒有給出任何編譯選項,那麼下面的_all就是我們的預設編譯目標。
PHONY := _all
_all:

#KBUILD_OUTPUT定義了輸出目錄,記錄要儲存的目錄,判斷這個目錄是否存在,不存在就提示錯誤輸出。
ifneq ($(KBUILD_OUTPUT),)
saved-output := $(KBUILD_OUTPUT)
KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd)
$(if $(KBUILD_OUTPUT),, \ 
    $(error output directory "$(saved-output)" does not exist)) 

# MAKECMDGOALS指定你所需要的最終目標檔案的列表,如果你沒有指定,那麼該值為空值
PHONY += $(MAKECMDGOALS)

$(filter-out _all,$(MAKECMDGOALS)) _all:
    $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \
    KBUILD_SRC=$(CURDIR) \
    KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile [email protected]

skip-makefile := 1
endif # ifneq ($(KBUILD_OUTPUT),)
endif # ifeq ($(KBUILD_SRC),)

$(filter-out , )函式的呼叫,過濾掉$(MAKECMDGOALS)指定的檔案列表中存在的_all檔案。$(KBUILD_VERBOSE:1=),如果KBUILD_VERBOSE為1,則替換為空。如果KBUILD_VERBOSE為空或者KBUILD_VERBOSE = 1,則回顯;否則不回顯提示資訊(@,為不回顯的命令)。在輸出目錄中,再次呼叫make,傳遞相關的變數。然後離開上層目錄下make的呼叫處理過程。

如果這是最終的make呼叫,我們開始處理Makefile中剩餘部分。

ifeq ($(skip-makefile),)     #busybox原始碼中的endif # ifeq($(skip-makefile),)在1316行

如果是編譯一個外部模組,我們不關心all:規則;但是相反,_all依賴於modules;

PHONY += all
ifeq ($(KBUILD_EXTMOD),)
_all: all
else
_all: modules
endif

判斷原始碼目錄是否存在,如果不存在,就設定為當前目錄下。

srctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))
TOPDIR := $(srctree)     # 頂層目錄,頂層目錄變數TOPDIR已經被廢棄,現在使用srctree/objtree
objtree := $(CURDIR)
src := $(srctree)
obj := $(objtree)

 設定依賴檔案的搜尋路徑,

VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
使上面的變數生效,
export srctree objtree VPATH TOPDIR 
指定交叉編譯和選擇不同的gcc/bin-utils工具。當我們為別的架構執行交叉編譯的時候,ARCH應該被設定為目標架構,例如arm。(詳細可以檢視arch/目錄下,能夠支援的目標架構)。呼叫make時,可以設定ARCH變數,像“make ARCH=arm”;另一種方法是在環境變數中設定ARCH。預設ARCH是執行make的主機。

CROSS_COMPILE指定編譯時,所使用所有的執行檔案的字首,像arm-fsl-linux-gnueabi-。CROSS_COMPILE可以在命令列中設定,“make CROSS_COMPILE=arm-fsl-linux-gnueabi-”;另外,也可以通過環境變數進行設定。

注意:有些架構的CROSS_COMPILE指派,在arch/目錄下該架構對應的Makefile中指定。

CROSS_COMPILE ?= 
busybox:可以使用.config檔案中CONFIG_CROSS_COMPILER_PREFIX指定交叉編譯的工具的字首。
ifeq ($(CROSS_COMPILE),)
CROSS_COMPILE := $(shell grep ^CONFIG_CROSS_COMPILER_PREFIX .config 2>/dev/null)
CROSS_COMPILE := $(subst CONFIG_CROSS_COMPILER_PREFIX=,,$(CROSS_COMPILE))
CROSS_COMPILE := $(subst ",,$(CROSS_COMPILE))
#")
endif
SUBARCH表明使用者模式(usermode)構建時,使用的架構型別。當在命令列裡鍵入“ARCH=um”時,就選擇使用了使用者模式,那麼SUBARCH就會覆蓋了下面的ARCH設定。如果是本機構建,ARCH被指定,就會獲得正常值,SUBARCH就會被忽略。說明:cut的用法,-d, –delimiter=DELIM 指定分隔符來代替預設的TAB分隔符;-f, –fields=LIST 依據 -d 指定的分隔符將一段內容分割成為數段,用 -f 取出第幾段的意思。
ifneq ($(CROSS_COMPILE),)
SUBARCH := $(shell echo $(CROSS_COMPILE) | cut -d- -f1)
else
SUBARCH := $(shell uname -m)
endif
SUBARCH := $(shell echo $(SUBARCH) | sed -e s/i.86/i386/     -e s/sun4u/sparc64/ \
                                         -e s/arm.*/arm/     -e s/sa110/arm/ \
                                         -e s/s390x/s390/    -e s/parisc64/parisc/ \
                                         -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )

 如果ARCH為空,指定ARCH,
ARCH ?= $(SUBARCH)
架構被儲存在 compile.h檔案中,
UTS_MACHINE := $(ARCH) 

選擇kbuild使用的shell工具。-x,表明是否具有執行許可權。我的是/bin/bash。

CONFIG_SHELL := $(shell if [ -x "$$BASH"]; then echo $$BASH; \
    else if [ -x /bin/bash ]; then echo /bin/bash; \
    else echo sh; fi ; fi)
決定構建方式是內嵌,模組,或兩者都是。正常情況下,只需選擇內嵌方式。
KBUILD_MODULES :=
KBUILD_BUILTIN := 1

如果我們只“make modules”,則,不編譯內嵌目標。

#   When we're building modules with modversions, we need to consider the built-in objects during the descend as well, in order to make sure the checksums are uptodate before we record them.

ifeq ($(MAKECMDGOALS),modules)
    KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
endif
如果我們使用命令“make <whatever> modules”,編譯模組。在這裡,<whatever>,說明不論我們做什麼,我們都會編譯modules。即使,僅僅使用“make”或“make all”仍將會編譯模組。
ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)
  KBUILD_MODULES := 1
endif

ifeq ($(MAKECMDGOALS),)
  KBUILD_MODULES := 1
endif
使變數生效,
export KBUILD_MODULES KBUILD_BUILTIN
export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD

設定漂亮輸出顯示。

正常情況下,我們在執行命令前會列印整個命令。通過使用echo $($(quiet)$(cmd)),我們就有可能通過設定$(quiet)來選擇更多的輸出格式。例如

#    quiet_cmd_cc_o_c = Compiling $(RELDIR)/[email protected]
#    cmd_cc_o_c       = $(CC) $(c_flags) -c -o [email protected] $<
如果$(quiet)為空,整個命令都會被列印;如果$(quiet)=quiet_,只會列印一小部分;如果$(quiet)=silent_,什麼也不列印,因為$(silent_cmd_cc_o_c)這個變數不存在。一個簡單的變種方法就是,使用字首命令$(Q),這個命令也是使輸出變得簡潔的有效方法。如果KBUILD_VERBOSE=0,上面的命令將會被隱藏;如果KBUILD_VERBOSE=1,上面的命令將會被顯示。
#    $(Q)ln [email protected] :<
ifeq ($(KBUILD_VERBOSE),1)
  quiet =
  Q =
else
  quiet=quiet_
  Q = @
endif

如果使用者正在執行make -s(靜默模式),也會抑制命令的回顯。

ifneq ($(findstring s,$(MAKEFLAGS)),)
  quiet=silent_
endif

export quiet Q KBUILD_VERBOSE    #生效

為make命令尋找原始碼根目錄下的標頭檔案目錄,

MAKEFLAGS += --include-dir=$(srctree)
 指定主機編譯工具,
HOSTCC   = gcc
HOSTCXX   = g++
HOSTCFLAGS :=
HOSTCXXFLAGS :=

我們需要指定一些通用的定義,像通用函式和巨集定義,

include $(srctree)/scripts/Kbuild.include 

HOSTCFLAGS += $(call hostcc-option,-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer,)# 指定-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer為主機編譯選項
HOSTCXXFLAGS += -O2
為了最大的效能,(可能會被隨機打斷,所以,不要註釋掉下面的語句。)
MAKEFLAGS += -rR 

指定Make命令的相關變數(像CC等等)。

AS = $(CROSS_COMPILE)as
CC = $(CROSS_COMPILE)gcc
LD = $(CC) -nostdlib
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
AWK = awk
GENKSYMS = scripts/genksyms/genksyms
DEPMOD = /sbin/depmod
KALLSYMS = scripts/kallsyms
PERL = perl
CHECK = sparse

CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise $(CF)
MODFLAGS = -DMODULE
CFLAGS_MODULE   = $(MODFLAGS)
AFLAGS_MODULE   = $(MODFLAGS)
LDFLAGS_MODULE  = -r
CFLAGS_KERNEL =
AFLAGS_KERNEL =
# Use LINUXINCLUDE when you must reference the include/ directory.

# Needed to be compatible with the O= option

CFLAGS := $(CFLAGS)

只有在busybox的二進位制檔案編譯的最後連結階段被新增。

CFLAGS_busybox := $(CFLAGS_busybox)
CPPFLAGS := $(CPPFLAGS)
AFLAGS := $(AFLAGS)
LDFLAGS := $(LDFLAGS)
LDLIBS :=

# Read KERNELRELEASE from .kernelrelease (if it exists)

KERNELRELEASE = $(shell cat .kernelrelease 2> /dev/null)
KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

使這些變數生效,

export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION \
ARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \
CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK GENKSYMS PERL UTS_MACHINE \
HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS

export CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
export CFLAGS CFLAGS_KERNEL CFLAGS_MODULE
export AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
export FLTFLAGS

當編譯獨立的模組時(out-of-tree),把MODVERDIR變數放到模組檔案目錄樹中,而不是核心原始碼樹中。核心原始碼甚至是隻讀的。

export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_versions
# Files to ignore in find ... statements
RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg -o -name .git \) -prune -o
export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS --exclude .pc --exclude .hg --exclude .git

配置目標和編譯目標之間共享的規則設定。首先,就是把位於../scripts/basic檔案中定義的基本操作包含進來。

PHONY += scripts_basic 
scripts_basic: 
    $(Q)$(MAKE) $(build)=scripts/basic
為了避免隱含規則生效,定義一個空的命令
scripts/basic/%: scripts_basic ;

這個目標從所有*.c檔案中,產生Kbuild和Config.in的構建檔案。

PHONY += gen_build_files
gen_build_files: $(wildcard $(srctree)/*/*.c) $(wildcard $(srctree)/*/*/*.c)
    $(Q)$(srctree)/scripts/gen_build_files.sh $(srctree) $(objtree)
# bbox: we have helpers in applets/

# we depend on scripts_basic, since scripts/basic/fixdep

# must be built before any other host prog

PHONY += applets_dir
applets_dir: scripts_basic gen_build_files
    $(Q)$(MAKE) $(build)=applets

applets/%: applets_dir ;

# 編譯目標outputmakefile在輸出目錄中產生一個Makefile檔案,前提是使用獨立的目錄來儲存編譯後的檔案。
# 這個設定允許在輸出目錄中方便的使用make命令。
PHONY += outputmakefile
outputmakefile:
ifneq ($(KBUILD_SRC),)
    $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
        $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
endif
為了確保我們找到的*config目標不包含.config目標,然後再把它們移交給scripts/kconfig/Makefile。當呼叫make時,它允許指定更多的目標,包括混合*config目標和構建目標。

例如,使用“make oldconfig all”。

no-dot-config-targets := clean mrproper distclean \
    cscope TAGS tags help %docs

#bbox# check% is removed from above

config-targets := 0
mixed-targets  := 0
dot-config     := 1

# 如果指定了.config目標,又指定了混合目標(mixing *config),則指定的.config無效。
ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
    ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
        dot-config := 0
    endif
endif
#如果沒有定為編譯為外部模組,那麼如果在命令列裡設定了相關的配置config目標,則config-targets=1;如果還定義了混合config(除了config和%config,還有其他目標時),則mixed-targets=1.
ifeq ($(KBUILD_EXTMOD),)
    ifneq ($(filter config %config,$(MAKECMDGOALS)),)
        config-targets := 1
        ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
            mixed-targets := 1
        endif
    endif
endif

# 如果使用混合目標(*config和build targets),則一個一個處理。
# %表示所有目標都使用該規則;如果make命令是“make defconfig all”,那麼執行語句展開就是,
# make -C $(srctree) KBUILD_SRC=defconfig;
# make -C $(srctree) KBUILD_SRC=all;
# -C 大寫,切換到指定目錄再執行 make 過程,makefile 在這個指定目錄裡面;
ifeq ($(mixed-targets),1) 
%:: FORCE
$(Q)$(MAKE) -C $(srctree) KBUILD_SRC= [email protected]
else
# 只使用指定的*config配置檔案-確定前提條件都是最新的,且使用降序使用scripts/kconfig中檔案,make *config 目標。
ifeq($(config-targets),1)
# 'make defconfig',生成最小配置,
# 用“-include”來代替“include”,忽略由於包含檔案不存在或者無法建立時的錯誤,“-”的意思是告訴make,忽略此操作的錯誤,make 繼續執行,
# 讀arch目錄下對應架構的預設Makefile檔案,KBUILD_DEFCONFIG指向可選擇的預設配置,
-include $(srctree)/arch/$(ARCH)/Makefile
export KBUILD_DEFCONFIG
config: scripts_basic outputmakefile gen_build_files FORCE
$(Q)mkdir -p include    # 如果需要建立相應的父目錄
$(Q)$(MAKE) $(build)=scripts/kconfig [email protected]
$(Q)$(MAKE) -C $(srctree) KBUILD_SRC= .kernelrelease
 
%config: scripts_basic outputmakefile gen_build_files FORCE
$(Q)mkdir -p include
$(Q)$(MAKE) $(build)=scripts/kconfig [email protected]
$(Q)$(MAKE) -C $(srctree) KBUILD_SRC= .kernelrelease
else    # 構建目標時使用,包括busybox,arch specific targets,clean目標和其它的目標。通常情況下,除了*config配置目標之外的所有目標
ifeq ($(KBUILD_EXTMOD),)
# Additional helpers built in scripts/
# Carefully list dependencies so we do not try to build scripts twice
# in parallel
PHONY += scripts
scripts: gen_build_files scripts_basic include/config/MARKER
        $(Q)$(MAKE) $(build)=$(@)

scripts_basic: include/autoconf.h

# Objects we will link into busybox / subdirs we need to visit
core-y          := \
                applets/ \

libs-y          := \
                archival/ \
                archival/libarchive/ \
                console-tools/ \
                coreutils/ \
                coreutils/libcoreutils/ \
                debianutils/ \
                e2fsprogs/ \
                editors/ \
                findutils/ \
                init/ \
                libbb/ \
                libpwdgrp/ \
                loginutils/ \
                mailutils/ \
                miscutils/ \
                modutils/ \
                networking/ \
                networking/libiproute/ \
                networking/udhcp/ \
                printutils/ \
                procps/ \
                runit/ \
                selinux/ \
                shell/ \
                sysklogd/ \
                util-linux/ \
                util-linux/volume_id/ \

endif # KBUILD_EXTMOD

# 下面就是定義了.config配置的情況,在這一段程式碼中,我們需要.config檔案,所以需要包含進來;讀取所有符合依賴關係的Kconfig*檔案;
# 確保如果發生變化,能夠執行oldconfig配置;
# 如果.config需要更新,那麼根據.config的依賴關係自動完成,依賴描述位於autoconf檔案中;
ifeq ($(dot-config),1)

-include .kconfig.d
-include .config

# 為了避免隱含規則發生作用,定義一個空命令;

.config .kconfig.d: ;

# 現在,根據.config中設定的規則定義CFLAGS等標誌;
include $(srctree)/Makefile.flags

# 如果.config比include/auroconf.h要新,有些人就會修補它,且忘記執行“make oldconfig”;
# 如果我們在一個乾淨的原始碼目錄下(就是沒有編譯後的檔案),kconfig檔案遺失,我們需要執行config步驟,確保獲取更新後的Kconfig檔案;
include/autoconf.h: .kconfig.d .config $(wildcard $(srctree)/*/*.c) $(wildcard $(srctree)/*/*/*.c) | gen_build_files
        $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig

include/usage.h: gen_build_files
else
# 空目標,因為被用作前提條件;
include/autoconf.h
endif # ifeq ($(dot-config),1)



相關推薦

busyboxMakefile分析

一 說明 可以在busybox目錄下,執行“make help”獲取幫助資訊;可以通過README獲取更多資訊。下面是Makefile的主要步驟: 1、讀取工作目錄下的預設makefile檔案(makefile,Makefile) (開始讀我們的寫的makefile主檔案了

關於openwrt+ipv6在H3C教育網環境的研究

網絡 現實 sdn ipv san 關系 協議 慢慢 network 這裏先開個頭,考完試繼續補充。 教育網的IPv6提供了非常好的一些性能,也起到了試驗性的作用,確是所謂Next Generation Network ;於是乎,如何能充分發揮IPv6也成

SeLinux許可權問題分析

檢視當前目錄下的檔案或目錄的許可權:ps -Z u:object_r:system_data_file:s0 system adb shell 之後執行setenforce 0可以暫時去除sepolicy許可權 (不用重啟機器,而且重啟之後許可權又恢復成原來的了) usage:

centos編譯安裝nginx+mysql +php

net conf ftw tar 解壓 ocs org sql nbsp 參考地址:http://www.cnblogs.com/htian/p/5728599.html 去官網找到PCRE,並下載http://www.pcre.org/wget ftp://ftp.csx

已知前序序重建二叉樹

#include<iostream> #include<malloc.h> using namespace std; struct node{ struct node *right,*left; int e; }; const int maxn=30; int p

Mybatis原始碼分析--Executor原始碼分析待續

1 概述  Mybatis中所有的Mapper語句的執行都是通過Executor進行的,Executor是Mybatis的一個核心介面。針對Executor的學習,我們先來說說Executor的生成和Executor的分類,然後再來看看其中某個典型方法的具體執行。 2 E

<Python基礎學習三>例項1:“溫度轉換”問題分析待續

摘要: 本篇部落格僅作為筆記,如有侵權,請聯絡,立即刪除(網上找部落格學習,然後手記筆記,因紙質筆記不便儲存,所以儲存到網路筆記)。   兩種刻畫溫度的不同體系:攝氏度(C)、華氏度(F)。   問題分析:直接將溫度值進行轉換。   --劃分邊界(IPO):     (1)輸入(I):帶華氏度或攝氏度

python讀Json檔案進行資料分析

這是一個不想繼續下去(各種Bug,)。。。。有興趣的小夥伴可以交流一下 import numpy as np import pandas as pd import matplotlib.pyplot as plt df = pd.read_json('data.json',

【Python】正則表達式1

pes mmu get regular rop 則表達式 line out github 1、正則表達式唯一的用途就是在文本中匹配和尋找模式,模式可以簡單,也可以復雜。 2、Regexr 這個網站很個性的就是,有一個community標簽,打開後可以看到評分由高到低

Python基礎day-11[內置函數,遞歸,匿名函數]

oat 讀寫 磁盤 自動 信息 map() instance 冒號 匿名 內置函數: abs() : 返回數字的絕對值。參數可以是整數或浮點數,如果參數是復數,則返回復數的模。 print(abs(0.2)) print(abs(1)) print(abs(-4)) pr

elasticsearch aggregation 過程

elasticsearch aggregation 過程在查詢過程中,ES是將整個查詢分成幾個階段的,大體如下:QueryPhaserescorePhasesuggestPhaseaggregationPhaseFetchPhase對於全文檢索,可能還有DFSPhase。從源代碼QueryPhase 類可以看

Python第四天

刪除 back del -c remove strong 數據類型 切片 ron 一、拾遺 1、在Python中數據又稱為對象,每創建一個對象都會創建三個屬性: (1)身份:id   is 用來比較id,id一樣,type和value肯定一樣 (2)類型:type 

低俗小說

個人 出租車 事情 回來 自己 something 是個 round 提醒 簡單介紹:這個筆記是看低俗小說時候跟著刷的劇情,有事耽擱沒有刷完,整部電影充滿了細節 pulp fiction 低俗小說開場:一對情侶準備搶劫咖啡店,搶劫咖啡店的顧客錢包1.兩個殺手出場,談到大佬馬

導入模塊方式盡量少用from xx import *以及包的定義,跨目錄運行包和模塊

sys.path mod 默認 尋找 spa rom bsp 自己 pan 1 import module_name 2 import module_name,module_name2 3 from module_name import * 4 form module_n

置換群本蒟蒻瞎BB的

元組 個數 置換群 條件 如果 其中 就是 不一定 成了 置換群(本蒟蒻瞎BB的)(未完) 群的定義 給定一個集合\(G=\{a, b, c...\}\)和集合\(G\)上的二元運算*,並滿足: 封閉性:\(\forall a, b \in G, \exists c \i

c# winform 實現打印功能

ble preview raw using ntp review winform setup print 1.打印控件介紹(Document屬性設置為PrintDocument1;ShowDialog()方法顯示對話窗) PrintDialog控件(打印會話):用於選擇打印

第二章 數論基礎

跳過 大數運算 簡單的 nbsp -m 之一 需要 加法 mod 1 整除性和帶余除法 1.1 整除 設$a$,$b$均為正數,若存在整數$m$使得$a=m\times b$成立,則成為非零數$b$整除$a$,換而言之,若$b$除$a$沒有余數,則認為$b$整除$a$.表示

3.3常用知識-索引與排序

聚集索引 主鍵自增 主鍵 建立索引 函數 3.3 存儲 bsp 排序。 1.索引與排序的關系   經過多番嘗試,我發現,直接select * from table 默認是會按聚集索引來排序的。   那如果order by column ,column中有非聚集索引,排序用使

前端HTML 與css 整理

簽名 跳轉 doc emp 分類 for ... 小寫 tar HTML 中的標簽存放於文本文件中 需要按照以下固定的文檔結構組織:<!DOCTYPE HTML><html> <head>頭部相關信息 </head>

主成分分析和因子分析完成

svd分解 主成分分析 http src inf 因子分析 分解 spa span 並且SVD分解也適用於一般的矩陣。 主成分分析和因子分析(未完成)