perf編譯
Ⅰ 如何在linux用戶和內核空間中進行動態跟蹤
你不記得如何在代碼中插入探針點了嗎? 沒問題!了解如何使用uprobe和kprobe來動態插入它們吧。 基本上,程序員需要在源代碼匯編指令的不同位置插入動態探針點。
探針點
探針點是一個調試語句,有助於探索軟體的執行特性(即,執行流程以及當探針語句執行時軟體數據結構的狀態)。printk是探針語句的最簡單形式,也是黑客用於內核攻擊的基礎工具之一。
因為它需要重新編譯源代碼,所以printk插入是靜態的探測方法。內核代碼中重要位置上還有許多其他靜態跟蹤點可以動態啟用或禁用。 Linux內核有一些框架可以幫助程序員探測內核或用戶空間應用程序,而無需重新編譯源代碼。Kprobe是在內核代碼中插入探針點的動態方法之一,並且uprobe在用戶應用程序中執行此操作。
使用uprobe跟蹤用戶空間
可以通過使用thesysfs介面或perf工具將uprobe跟蹤點插入用戶空間代碼。
使用sysfs介面插入uprobe
考慮以下簡單測試代碼,沒有列印語句,我們想在某個指令中插入探針:
[source,c\n.test.c
#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>
編譯代碼並找到要探測的指令地址:
# gcc -o test test.\n# objmp -d test
假設我們在ARM64平台上有以下目標代碼:
0000000000400620 <func_1>: 400620\t90000080\tadr\tx0, 410000 <__FRAME_END__+0xf6f8>
並且我們想在偏移量0x620和0x644之間插入探針。執行以下命令:
# echo 'p:func_2_entry test:0x620' > /sys/kernel/debug/tracing/uprobe_event\n# echo 'p:func_1_entry test:0x644' >> /sys/kernel/debug/tracing/uprobe_event\n# echo 1 > /sys/kernel/debug/tracing/events/uprobes/enable# ./test&
在上面的第一個和第二個echo語句中,p告訴我們這是一個簡單的測試。(探測器可以是簡單的或返回的。)func_n_entry是我們在跟蹤輸出中看到的名稱,名稱是可選欄位,如果沒有提供,我們應該期待像p_test_0x644這樣的名字。test 是我們要插入探針的可執行二進制文件。如果test 不在當前目錄中,則需要指定path_to_test / test。
0x620或0x640是從程序啟動開始的指令偏移量。請注意>>在第二個echo語句中,因為我們要再添加一個探針。所以,當我們在前兩個命令中插入探針點之後,我們啟用uprobe跟蹤,當我們寫入events/ uprobes / enable時,它將啟用所有的uprobe事件。程序員還可以通過寫入在該事件目錄中創建的特定事件文件來啟用單個事件。一旦探針點被插入和啟用,每當執行探測指令時,我們可以看到一個跟蹤條目。
讀取跟蹤文件以查看輸出:
# cat /sys/kernel/debug/tracing/trac\n# tracer: no\n\n# entries-in-buffer/entries-written: 8/8\n#P:\n\n# _-----=> irqs-of\n# / _----=> need-resche\n# | / _---=> hardirq/softir\n# || / _--=> preempt-dept\n# ||| / dela\n# TASK-PID CP\n# |||| TIMESTAMP FUNCTION# | | | |||| | |
我們可以看到哪個CPU完成了什麼任務,什麼時候執行了探測指令。
返回探針也可以插入指令。當返回該指令的函數時,將記錄一個條目:
# echo 0 > /sys/kernel/debug/tracing/events/uprobes/enabl\n# echo 'r:func_2_exit test:0x620' >> /sys/kernel/debug/tracing/uprobe_event\n# echo 'r:func_1_exit test:0x644' >> /sys/kernel/debug/tracing/uprobe_event\n# echo 1 > /sys/kernel/debug/tracing/events/uprobes/enable
這里我們使用r而不是p,所有其他參數是相同的。請注意,如果要插入新的探測點,需要禁用uprobe事件:
test-3009 [002] .... 4813.852674: func_1_entry: (0x400644)
上面的日誌表明,func_1返回到地址0x4006b0,時間戳為4813.852691。
# echo 0 > /sys/kernel/debug/tracing/events/uprobes/enabl\n# echo 'p:func_2_entry test:0x630' > /sys/kernel/debug/tracing/uprobe_events count=%x\n# echo 1 > /sys/kernel/debug/tracing/events/uprobes/enabl\n# echo > /sys/kernel/debug/tracing/trace# ./test&
當執行偏移量0x630的指令時,將列印ARM64 x1寄存器的值作為count =。
輸出如下所示:
test-3095 [003] .... 7918.629728: func_2_entry: (0x400630) count=0x1
使用perf插入uprobe
找到需要插入探針的指令或功能的偏移量很麻煩,而且需要知道分配給局部變數的CPU寄存器的名稱更為復雜。 perf是一個有用的工具,用於幫助引導探針插入源代碼中。
除了perf,還有一些其他工具,如SystemTap,DTrace和LTTng,可用於內核和用戶空間跟蹤;然而,perf與內核配合完美,所以它受到內核程序員的青睞。
# gcc -g -o test test.c# perf probe -x ./test func_2_entry=func_\n# perf probe -x ./test func_2_exit=func_2%retur\n# perf probe -x ./test test_15=test.c:1\n# perf probe -x ./test test_25=test.c:25 numbe\n# perf record -e probe_test:func_2_entry -e\nprobe_test:func_2_exit -e probe_test:test_15\n-e probe_test:test_25 ./test
如上所示,程序員可以將探針點直接插入函數start和return,源文件的特定行號等。可以獲取列印的局部變數,並擁有許多其他選項,例如調用函數的所有實例。 perf探針用於創建探針點事件,那麼在執行./testexecutable時,可以使用perf記錄來探測這些事件。當創建一個perf探測點時,可以使用其他錄音選項,例如perf stat,可以擁有許多後期分析選項,如perf腳本或perf報告。
使用perf腳本,上面的例子輸出如下:
# perf script
使用kprobe跟蹤內核空間
與uprobe一樣,可以使用sysfs介面或perf工具將kprobe跟蹤點插入到內核代碼中。
使用sysfs介面插入kprobe
程序員可以在/proc/kallsyms中的大多數符號中插入kprobe;其他符號已被列入內核的黑名單。還有一些與kprobe插入不兼容的符號,比如kprobe_events文件中的kprobe插入將導致寫入錯誤。 也可以在符號基礎的某個偏移處插入探針,像uprobe一樣,可以使用kretprobe跟蹤函數的返回,局部變數的值也可以列印在跟蹤輸出中。
以下是如何做:
; disable all events, just to insure that we see only kprobe output in trace\n# echo 0 > /sys/kernel/debug/tracing/events/enable; disable kprobe events until probe points are inseted\n# echo 0 > /sys/kernel/debug/tracing/events/kprobes/enable; clear out all the events from kprobe_events\n to insure that we see output for; only those for which we have enabled
[root@pratyush ~\n# more /sys/kernel/debug/tracing/trace# tracer: no\n\n# entries-in-buffer/entries-written: 9037/9037\n#P:8\n# _-----=> irqs-of\n# / _----=> need-resche\n# | / _---=> hardirq/softirq#\n|| / _--=> preempt-depth#\n ||| / delay# TASK-PID CPU#\n |||| TIMESTAMP FUNCTION#\n | | | |||| | |
使用perf插入kprobe
與uprobe一樣,程序員可以使用perf在內核代碼中插入一個kprobe,可以直接將探針點插入到函數start和return中,源文件的特定行號等。程序員可以向-k選項提供vmlinux,也可以為-s選項提供內核源代碼路徑:
# perf probe -k vmlinux kfree_entry=kfre\n# perf probe -k vmlinux kfree_exit=kfree%retur\n# perf probe -s ./ kfree_mid=mm/slub.c:3408 \n# perf record -e probe:kfree_entry -e probe:kfree_exit -e probe:kfree_mid sleep 10
使用perf腳本,以上示例的輸出:
關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html
Ⅱ 求教,在安裝google-perftools,make時報錯,已裝libunwind
刪除了系統原帶的sqlite3 ,到官網上下一個源碼,重新編譯安裝sqlite3。
如:
把sqlite3安裝到 /usr/local/sqlite3
tar zxf sqlite3.xxxx.tar.gz
cd sqlite.3.xxxx
./configura --prefix=/usr/local/sqlite3
make && make install
cd ..
最後在編譯Gearman時帶上 --with-sqlite3=/usr/local/sqlite3,告訴編譯器應該使用這個新的sqlite即可。
Ⅲ 如何選擇一個 Linux Tracer
tracer 是一個高級的性能分析和診斷工具,但是不要讓這名詞唬住你,如果你使用過 strace 和tcpmp,其實你就已經使用過 tracer 了。系統 tracer 可以獲取更多的系統調用和數據包。它們通常能跟蹤任意的內核和應用程序。
有太多的 linux tracer 可以選擇。每一種都有其官方的(或非官方的)的卡通的獨角獸吉祥物,足夠撐起一台"兒童劇"了。
那麼我們應該使用哪個 tracer 呢?
我會為兩類讀者回答這個問題,大部分人和性能/內核工程師。過一段時間這些可能會發生變化,我會持續跟進並補充,大概會一年更新一次。
多數人
多數人 (開發者,系統管理員,開發管理者,運維人員,評測人員,等等) 不關心系統追蹤器的細節。下面是對於追蹤器你應該知道和做的:
1. 使用perf_events分析CPU性能
使用 perf_events 做 CPU 性能分析。性能指標可以使用flame graph 等工具做可視化。
git clone --depth 1 https://github.com/brendangregg/FlameGraph
perf record -F 99 -a -g -- sleep 30
perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > perf.svg
Linux perf_events (又稱 "perf",同命令名) 是 Linux 用戶的官方追蹤器和性能分析器。內置於內核代碼,有很好維護(近來獲得快速增強),通常通過 linux 命令行工具包添加。
perf 有很多功能,如果只能推薦一個,我選擇 CPU 性能分析。盡管這只是采樣,而不是從技術上追蹤事件。最難的部分是獲取完整的棧和信息,我為 java 和 node.js 做的一個演講 Linux Profiling at Netflix中已經說過這個問題
2.了解其他的Tracer
正如我一個朋友說的:「你不需要知道如何操作 X 射線機器,但是一旦你吞了一枚硬幣,你得知道這得去做 X 射線」,你應該了解各種 tracer 都能做什麼,這樣就能在你工作中真正需要 tracer 的時候,你既可以選擇稍後學習使用,也可以雇相應的人來完成。
簡短來說:幾乎所有的東西都可以使用 tracer 來進行分析和跟蹤。如,文件系統,網路處理器,硬體驅動器,全部的應用程序。可以看一下我的個人網站上關於 ftrace的文章,還有我寫的關於perf_events 文檔介紹,可以做為一個追蹤(或者性能分析)的例子。
3. 尋求前端支持工具
如果你正想買一個能支持跟蹤 Linux 的性能分析工具(有許多賣這類工具的公司)。想像一下,只需要直接點擊一下界面就能「洞察」整個系統內核,包括隱藏的不同堆棧位置的熱圖,我在Monitorama talk 中介紹了一個這樣帶圖形界面的工具。
我開源了一些我自己開發的前端工具,盡管只是 CLI (命令行界面)而不是(圖形界面)。這些工具也會讓人們更加快速容易的使用 tracer。比如下面的例子,用我的 perf_tool,跟蹤一個新進程:
# ./execsnoopTracing exec()s. Ctrl-C to end.
PID PPID ARGS
22898 22004 man ls
22905 22898 preconv -e UTF-8
22908 22898 pager -s
22907 22898 nroff -mandoc -rLL=164n -rLT=164n -Tutf8
[...]
在 Netflix 上,我們創建了一個 Vector,一個分析工具的實例同時也是 Linux 上的 tracer 的最終前端。
致性能或內核工程師
我們的工作變的越來越困難,很多的人會問我們怎麼樣去追蹤,哪種路徑可以用!為了正確理解一個路徑,你經常需要花上至少100個小時才能做到。理解所有的 linux 路徑去做出理性的決定是一個浩大的工程。(我可能是唯一一個接近做到這件事情的人)
這里是我的建議,可以二選其一:
A) 選中一個全能的路徑,並且使它標准化,這將涉及花費大量的時間去弄清楚它在測試環境中的細微差別和安全性。我現在推薦 SystemTap 的最新版本(ie,從源代碼構建)。我知道有些公司已經選用 LTTng,而且他們用的很好,盡管它不是非常的強大(雖然它更安全)。Sysdig 可以成為另一個候選如果它可以增加追蹤點或者 kprobes。
B) 遵循我上面提供的流程圖,它將意味著盡可能更多的使用 ftrace 或者 perf_event, eBPF 會得到整合,之後其他的路徑像 SystemTap/LTTng 會去填補這個空白。這就是我目前在 Netflix 做的工作。
tracer 的評論:
1. ftrace
我喜歡用 ftrace,它是內核 hacker 的首選,內置於系統內核,可以使用跟蹤點(靜態檢查點),能調用內核 kprobes 和 uprobes 調試工具。並且提供幾個這樣的功能:帶可選過濾器和參數的事件追蹤功能;在內核中進行統計的事件計數和定時功能;還有函數流程遍歷的功能。可以看一下內核代碼中 ftrace.txt 例子了解一下。ftrace 由 /sys 控制,僅支持單一的 root 用戶使用(但是你可以通過緩沖區實例破解以支持多用戶)。某些時候 Ftrace 的操作界面非常繁瑣,但是的確非常「hack」,而且它有前端界面。Steven Rostedt,ftace 的主要作者,創建了 trace-cmd 命令工具,而我創建了 perf 的工具集。我對這個工具最大的不滿就是它不可編程。舉例來說,你不能保存和獲取時間戳,不能計算延遲,不能把這些計算結果保存成直方圖的形式。你需要轉儲事件至用戶級別,並且花一些時間去處理結果。ftrace 可以通過 eBPF 變成可編程的。
2.perf_events
perf_events 是 Linux 用戶的主要跟蹤工具,它內置在內核源碼中,通常通過 linux-tools-commom 加入。也稱「perf」,同前端工具名稱,通常用來跟蹤和轉儲信息到一個叫做 perf.data 的文件中,perf.data 文件相當於一個動態的緩沖區,用來保存之後需要處理的結果。ftrace 能做到的,perf_events 大都也可以做到,perf-events 不能做函數流程遍歷,少了一點兒「hack」勁兒(但是對於安全/錯誤檢查有更好的支持)。它可以進行 CPU 分析和性能統計,用戶級堆棧解析,也可以使用對於跟蹤每行局部變數產生的調試信息。它也支持多用戶並發操作。和 ftrace 一樣也不支持可編程。如果要我只推薦一款 tracer,那一定是 perf 了。它能解決眾多問題,並且它相對較安全。
3. eBPF
extended Berkeley Packet Filter(eBPF)是一個可以在事件上運行程序的高效內核虛擬機(JIT)。它可能最終會提供 ftrace 和 perf_events 的內核編程,並強化其他的 tracer。這是 Alexei Starovoitov 目前正在開發的,還沒有完全集成,但是從4.1開始已經對一些優秀的工具有足夠的內核支持了,如塊設備I/O的延遲熱圖。可參考其主要作者 Alexei Starovoitov 的BPF slides和eBPF samples。
4. SystemTap
SystemTap 是最強大的tracer。它能做所有事情,如概要分析,跟蹤點,探針,uprobes(來自SystemTap),USDT和內核編程等。它將程序編譯為內核模塊,然後載入,這是一種獲取安全的巧妙做法。它也是從tree發展而來,在過去有很多問題(多的可怕)。很多不是 SystemTap 本身的錯——它常常是第一個使用內核追蹤功能,也是第一個碰到 bug 的。SystemTap 的最新版本好多了(必須由源代碼編譯),但是很多人仍然會被早期版本嚇到。如果你想用它,可先在測試環境中使用,並與irc.freenode.net上 的 #systemtap 開發人員交流。(Netflix 有容錯機制,我們已經使用了 SystemTap,但是可能我們考慮的安全方面的問題比你們少。)我最大的不滿是,它似乎認為你有常常沒有的內核 debug 信息。實際上沒有它也能做很多事情,但是缺少文檔和例子(我必須自己全靠自己開始學習)。
5. LTTng
LTTng 優化了事件採集,這比其他 tracers 做得好。它從 tree 發展而來,它的核心很簡單:通過一組小規模的固定指令集將事件寫入追蹤緩沖區,這種方式使它安全、快速,缺點是它沒有內核編碼的簡單途徑。我一直聽說這不是一個大問題,因為盡管需要後期處理,它也已經優化到可以充分的度量。此外,它還首創了一個不同的分析技術,更多對所有關注事件的黑盒記錄將稍後以 GUI 的方式進行研究。我關心的是前期沒有考慮到要錄制的事件缺失問題如何解決,但我真正要做的是花更多時間來看它在實踐中用的怎麼樣。這是我花的時間最少的一個 tracer(沒有什麼特殊原因)。
6. Ktap
ktap 在過去是一款前景很好的 tracer,它使用內核中的 lua 虛擬機處理,在沒有調試信息的情況下在嵌入式設備上運行的很好。它分為幾個步驟,並在有一段時間似乎超過了 Linux 上所有的追蹤器。然後 eBPF 開始進行內核集成,而 ktap 的集成在它可以使用 eBPF 替代它自己的虛擬機後才開始。因為 eBPF 仍將持續集成幾個月,ktap 開發者要繼續等上一段時間。我希??今年晚些時候它能重新開發。
7. dtrace4linux
dtrace4linux 主要是 Paul Fox 一個人在業余時間完成的,它是 Sun DTrace 的 Linux 版本。它引入矚目,還有一些 provider 可以運行,但是從某種程度上來說還不完整,更多的是一種實驗性的工具(不安全)。我認為,顧忌到許可問題,人們會小心翼翼的為 dtrace4linux 貢獻代碼:由於當年 Sun 開源DTrace 使用的是 CDDL 協議,而 dtrace4linux 也不大可能最終進入 Linux kernel。Paul 的方法很可能會使其成為一個 add-on。我很樂意看到 Linux 平台上的 DTrace 和這個項目的完成,我認為當我加入 Netflix 後將會花些時間來協助完成這個項目。然而,我還是要繼續使用內置的 tracers,如 ftrace 和 perf_events。
8.OL DTrace
Oracle Linux DTrace為了將 DTrace 引入 Linux,特別是 Oracle Linux,做出了很大的努力。這些年來發布的多個版本表明了它的穩定進展。開發者們以一種對這個項目的前景看好的態度談論著改進 DTrace 測試套件。很多有用的 provider 已經完成了,如:syscall, profile, sdt, proc, sched 以及 USDT。我很期待 fbt(function boundary tracing, 用於內核動態跟蹤)的完成,它是 Linux 內核上非常棒的 provider。OL DTrace 最終的成功將取決於人們對運行 Oracle Linux(為技術支持付費)有多大興趣,另一方面取決於它是否完全開源:它的內核元件是開源的,而我沒有看到它的用戶級別代碼。
9. sysdig
sysdig是一個使用類tcpmp語法來操作系統事件的新tracer,它使用lua提交進程。它很優秀,它見證了系統跟蹤領域的變革。它的局限性在於它只在當前進行系統調用,在提交進行時將所有事件轉儲為用戶級別。你可以使用系統調用做很多事情,然而我還是很希望它能支持跟蹤點、kprobe和uprobe。我還期待它能支持eBPF做內核摘要。目前,sysdig開發者正在增加容器支持。留意這些內容。
延伸閱讀
我關於 tracer 的工作包括:
ftrace:我的 perf-tools工具集(參考實例目錄);我在 lwn.net 上的 關於ftrace的文章;LISA14的發言;還有帖子:函數計數, iosnoop,opensnoop,execsnoop,TCP轉發, uprobes 以及USDT。
perf_evenets:我的網頁 perf_events實例;SCALE上的發言Netflix的Linux性能分析;還有帖子CPU采樣,靜態追蹤點,熱點圖,計數,內核行追蹤,off-CPU時間圖。
eBPF:帖子eBPF:邁出一小步,和一些BPF工具(我需要發布更多)。
SystemTap:我很久以前寫了一篇有點過期的帖子使用SystemTap。最近,我發布了一些工具systemtap-lwtools來演示如何在沒有內核診斷信息的情況下使用SystemTap。
LTTng:我只花了一點時間,還不足以發表任何內容。
ktap:我的網頁ktap實例包含一些早期版本的單行小程序和腳本。
dtrace4linux:我在系統性能一書中給出了一些實例,並曾經開發了一些小的修復程序,如timestamps。
OL DTrace:由於它直接由DTrace轉變而來,很多我早期關於DTrace的工作都有相關性(如果在這里給出鏈接的話就太多了,可以在我的主頁上搜索)。當它更完善時,我會開發一些特殊工具。
sysdig:我向 fileslower 和 subsecond offset spectrogram 貢獻了代碼。
其他:我寫了關於strace 的注意事項。
請不要有更多的 tracer!如果你想知道為什麼 Linux 不僅僅只有一個 tracer,或者只用本身的DTrace,你可以在我的演講稿從DTrace到Linux中找到答案,從28張幻燈片開始。
感謝Deirdré Straughan的編輯,以及與 General Zoi 的小馬寶莉創作者一起創作的 tracing 小馬。
Ⅳ vs2022為什麼會在D盤根目錄下生成windows kits文件
你安裝的時候選擇了windows的SKD,就會有這個文件夾,但是目錄是可以修改的
Ⅳ perf 顯示perf.data中symbol顯示函數地址,怎麼能顯示函數名稱
添加下編譯選項
-fno-omit-frame-pointer
Ⅵ 如何編譯帶有extra molesopencv
從opencv官網下載下來的exe文件安裝後只含有opencv自帶的一些moles,有時需要其extra moles的一些功能,就需要手動編譯。
這里詳細的說明了opencv自帶的moles和extra moles
環境說明
Windows10 x64
Opencv 3.1.0
Visual Studio 2015
CMAKE 3.4.1
第一部分:生成OpenCV vs項目
下載opencv源碼和 opencv_contrib源碼 這里的opencv源碼部分用官網的exe安裝包解壓安裝也可以。需要的只是源碼。
!!!注意:這里OpenCV和OpenCV contrib的代碼版本要一致,否則可能後產生不可預知的編譯錯誤!!!
將opencv和opencv_contrib解壓到一個目錄里,並建立一個空文件夾名為VSproject,用來存儲待編譯的vs項目
打開CMAKE,在where is the source code裡面選擇opencv的源代碼目錄,我安裝的是exe包,所以我的目錄是F:/Sunday/opencv/sources
在where to build the binaries選擇F:/Sunday/VSproject
點擊Configure,選擇你的編譯器,如下
點擊Finish
等待出現Configuring done
找到OPENCV_EXTRA_MODULES_PATH項,輸入opencv_contrib下的moles目錄F:/Sunday/opencv_contrib/moles
如下
其他選項根據自己的需要勾選,不懂的話就不要動了。
我取消勾選的有
BUILD_DOCS
BUILD_TESTS
BUILD_PERF_TESTS
BUILD_opencv_python2
BUILD_opencv_python3
WITH_CUDA
WITH_MATLAB
注意:千萬不要勾選BUILD_opencv_contrib_world和BUILD_opencv_world,否則會導致編譯失敗。但是如果
不添加opencv_contrib的話,就可以勾選BUILD_opencv_world,這樣編譯出來的庫文件和dll就只有一個
opencv_world.dll。包含了所有的庫。
再次點擊Configure沒問題的話上面不會有紅色,如下
7. 點擊Generate,開始生成VS項目
導出成功如下,顯示Genereating done
第二部分:編譯
打開VSproject目錄下的OpenCV.sln,我的是F:\Sunday\VSproject\OpenCV.sln
先編譯debug版本的代碼,同時要確保平台正確,在ALL_BUILD項目上右鍵→生成,即開始編譯。這個過程一般較長。
編譯成功後生成CMake Targets下的install項目,這樣所有opencv編譯出來的lib,dll,頭文件都會統一放在install文件夾下。
把編譯改為Release模式,按照1~3步再編譯一下。
最終所有編譯好的文件都會存在VSproject的install目錄下。
Ⅶ 如何確定本次編譯的deconfig文件
之前我們知道deconfig里會定義某個config變數是y還是n,但是kernel里有很多deconfig文件,系統編譯的時候到底用的是哪個呢,我們來看一下:
編譯的命令如下:
. build/envsetup.sh
lunch
8. msm8937_evb-userdebug
./mkimage msm8937_evb boot_image
首先在envsetup.sh
command make --no-print-directory -f build/core/config.mk mpvar-abs-$1) //這里也是線索
function gettop
{
local TOPFILE=build/core/envsetup.mk //這里就是線索
......
}
然後看config.mk
include $(BUILD_SYSTEM)/envsetup.mk //這里是確定引用的
所以看envsetup.mk
board_config_mk := \
$(strip $(wildcard \
$(SRC_TARGET_DI www.hbbz08.com R)/board/$(TARGET_DEVICE)/BoardConfig.mk \
$(shell test -d device && find device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
$(shell test -d vendor && find vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
)) //獲取到對應的BoardConfig.mk文件
TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk))) //獲取對應的路徑
matthew@matthew:/media/matt2/8937-evb-1/build/target/board$ grep -r "TARGET_DEVICE_DIR" ./
./Android.mk:-include $(TARGET_DEVICE_DIR)/AndroidBoard.mk //載入對應的AndroidBoard.mk
然後到對應的/device/asus/msm8937_evb/里的AndroidBoard.mk
如下:
-include device/qcom/msm8937_64/AndroidBoard.mk
LOCAL_PATH := $(call my-dir)
ifeq ($(TARGET_BUILD_VARIANT),user)
KERNEL_DEFCONFIG := msm8937-perf_defconfig
else
KERNEL_DEFCONFIG := msm8937_defconfig //最後用的是這個deconfig文件
endif
Ⅷ 如何 編譯 ngx
一、必要軟體准備
1.安裝pcre
為了支持rewrite功能,我們需要安裝pcre
復制代碼代碼如下:
# yum install pcre* //如過你已經裝了,請跳過這一步
2.安裝openssl
需要ssl的支持,如果不需要ssl支持,請跳過這一步
復制代碼代碼如下:
# yum install openssl*
3.gzip 類庫安裝
復制代碼代碼如下:
yum install zlib zlib-devel
4.安裝wget
下載nginx使用,如果已經安裝,跳過這一步
復制代碼代碼如下:
# yum install wget
二、安裝nginx
1.下載
復制代碼代碼如下:
wget http://nginx.org/download/nginx-1.7.0.tar.gz
2.解壓
復制代碼代碼如下:
tar -zxvf nginx-1.7.0.tar.gz
3.編譯和安裝
執行如下命令:
復制代碼代碼如下:
# cd nginx-1.7.0
# ./configure --prefix=/usr/local/nginx-1.7.0 \
--with-http_ssl_mole --with-http_spdy_mole \
--with-http_stub_status_mole --with-pcre
–with-http_stub_status_mole:支持nginx狀態查詢
–with-http_ssl_mole:支持https
–with-http_spdy_mole:支持google的spdy,想了解請網路spdy,這個必須有ssl的支持
–with-pcre:為了支持rewrite重寫功能,必須制定pcre
最後輸出如下內容,表示configure OK了。
復制代碼代碼如下:
checking for zlib library ... found
creating objs/Makefile
Configuration summary
+ using system PCRE library
+ using system OpenSSL library
+ md5: using OpenSSL library
+ sha1: using OpenSSL library
+ using system zlib library
nginx path prefix: "/usr/local/nginx-1.7.0"
nginx binary file: "/usr/local/nginx-1.7.0/sbin/nginx"
nginx configuration prefix: "/usr/local/nginx-1.7.0/conf"
nginx configuration file: "/usr/local/nginx-1.7.0/conf/nginx.conf"
nginx pid file: "/usr/local/nginx-1.7.0/logs/nginx.pid"
nginx error log file: "/usr/local/nginx-1.7.0/logs/error.log"
nginx http access log file: "/usr/local/nginx-1.7.0/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
# make //確定你的伺服器有安裝make,如果沒有安裝請執行yum install make
# make install
三、啟動、關閉、重置nginx
啟動:直接執行以下命令,nginx就啟動了,不需要改任何配置文件,nginx配置多域名虛擬主機請參考後續文章.
復制代碼代碼如下:
/usr/local/nginx-1.7.0/sbin/nginx
試試訪問:直接使用curl命令來讀取web信息
復制代碼代碼如下:
[root@ns conf]
# curl -s http://localhost | grep nginx.com
nginx.com.
關閉:
復制代碼代碼如下:
/usr/local/nginx-1.7.0/sbin/nginx -s stop
重置:當你有修改配置文件的時候,只需要reload以下即可
復制代碼代碼如下:
/usr/local/nginx-1.7.0/sbin/nginx -s reload
整個nginx的安裝就到這里結束了。
四、nginx編譯參數詳解
復制代碼代碼如下:
–prefix= 指向安裝目錄
–sbin-path 指向(執行)程序文件(nginx)
–conf-path= 指向配置文件(nginx.conf)
–error-log-path= 指向錯誤日誌目錄
–pid-path= 指向pid文件(nginx.pid)
–lock-path= 指向lock文件(nginx.lock)(安裝文件鎖定,防止安裝文件被別人利用,或自己誤操作。)
–user= 指定程序運行時的非特權用戶
–group= 指定程序運行時的非特權用戶組
–builddir= 指向編譯目錄
–with-rtsig_mole 啟用rtsig模塊支持(實時信號)
–with-select_mole 啟用select模塊支持(一種輪詢模式,不推薦在高載環境下使用)禁用:–without-select_mole
–with-poll_mole 啟用poll模塊支持(功能與select相同,與select特性相同,為一種輪詢模式,不推薦在高載環境下使用)
–with-file-aio 啟用file aio支持(一種APL文件傳輸格式)
–with-ipv6 啟用ipv6支持
–with-http_ssl_mole 啟用ngx_http_ssl_mole支持(使支持https請求,需已安裝openssl)
–with-http_realip_mole 啟用ngx_http_realip_mole支持(這個模塊允許從請求標頭更改客戶端的IP地址值,默認為關)
–with-http_addition_mole 啟用ngx_http_addition_mole支持(作為一個輸出過濾器,支持不完全緩沖,分部分響應請求)
–with-http_xslt_mole 啟用ngx_http_xslt_mole支持(過濾轉換XML請求)
–with-http_image_filter_mole 啟用ngx_http_image_filter_mole支持(傳輸JPEG/GIF/PNG 圖片的一個過濾器)(默認為不啟用。gd庫要用到)
–with-http_geoip_mole 啟用ngx_http_geoip_mole支持(該模塊創建基於與MaxMind GeoIP二進制文件相配的客戶端IP地址的ngx_http_geoip_mole變數)
–with-http_sub_mole 啟用ngx_http_sub_mole支持(允許用一些其他文本替換nginx響應中的一些文本)
–with-http_dav_mole 啟用ngx_http_dav_mole支持(增加PUT,DELETE,MKCOL:創建集合,COPY和MOVE方法)默認情況下為關閉,需編譯開啟
–with-http_flv_mole 啟用ngx_http_flv_mole支持(提供尋求內存使用基於時間的偏移量文件)
–with-http_gzip_static_mole 啟用ngx_http_gzip_static_mole支持(在線實時壓縮輸出數據流)
–with-http_random_index_mole 啟用ngx_http_random_index_mole支持(從目錄中隨機挑選一個目錄索引)
–with-http_secure_link_mole 啟用ngx_http_secure_link_mole支持(計算和檢查要求所需的安全鏈接網址)
–with-http_degradation_mole 啟用ngx_http_degradation_mole支持(允許在內存不足的情況下返回204或444碼)
–with-http_stub_status_mole 啟用ngx_http_stub_status_mole支持(獲取nginx自上次啟動以來的工作狀態)
–without-http_charset_mole 禁用ngx_http_charset_mole支持(重新編碼web頁面,但只能是一個方向–伺服器端到客戶端,並且只有一個位元組的編碼可以被重新編碼)
–without-http_gzip_mole 禁用ngx_http_gzip_mole支持(該模塊同-with-http_gzip_static_mole功能一樣)
–without-http_ssi_mole 禁用ngx_http_ssi_mole支持(該模塊提供了一個在輸入端處理處理伺服器包含文件(SSI)的過濾器,目前支持SSI命令的列表是不完整的)
–without-http_userid_mole 禁用ngx_http_userid_mole支持(該模塊用來處理用來確定客戶端後續請求的cookies)
–without-http_access_mole 禁用ngx_http_access_mole支持(該模塊提供了一個簡單的基於主機的訪問控制。允許/拒絕基於ip地址)
–without-http_auth_basic_mole禁用ngx_http_auth_basic_mole(該模塊是可以使用用戶名和密碼基於http基本認證方法來保護你的站點或其部分內容)
–without-http_autoindex_mole 禁用disable ngx_http_autoindex_mole支持(該模塊用於自動生成目錄列表,只在ngx_http_index_mole模塊未找到索引文件時發出請求。)
–without-http_geo_mole 禁用ngx_http_geo_mole支持(創建一些變數,其值依賴於客戶端的IP地址)
–without-http_map_mole 禁用ngx_http_map_mole支持(使用任意的鍵/值對設置配置變數)
–without-http_split_clients_mole 禁用ngx_http_split_clients_mole支持(該模塊用來基於某些條件劃分用戶。條件如:ip地址、報頭、cookies等等)
–without-http_referer_mole 禁用disable ngx_http_referer_mole支持(該模塊用來過濾請求,拒絕報頭中Referer值不正確的請求)
–without-http_rewrite_mole 禁用ngx_http_rewrite_mole支持(該模塊允許使用正則表達式改變URI,並且根據變數來轉向以及選擇配置。如果在server級別設置該選項,那麼他們將在 location之前生效。如果在location還有更進一步的重寫規則,location部分的規則依然會被執行。如果這個URI重寫是因為location部分的規則造成的,那麼 location部分會再次被執行作為新的URI。 這個循環會執行10次,然後Nginx會返回一個500錯誤。)
–without-http_proxy_mole 禁用ngx_http_proxy_mole支持(有關代理伺服器)
–without-http_fastcgi_mole 禁用ngx_http_fastcgi_mole支持(該模塊允許Nginx 與FastCGI 進程交互,並通過傳遞參數來控制FastCGI 進程工作。 )FastCGI一個常駐型的公共網關介面。
–without-http_uwsgi_mole 禁用ngx_http_uwsgi_mole支持(該模塊用來醫用uwsgi協議,uWSGI伺服器相關)
–without-http_scgi_mole 禁用ngx_http_scgi_mole支持(該模塊用來啟用SCGI協議支持,SCGI協議是CGI協議的替代。它是一種應用程序與HTTP服務介面標准。它有些像FastCGI但他的設計 更容易實現。)
–without-http_memcached_mole 禁用ngx_http_memcached_mole支持(該模塊用來提供簡單的緩存,以提高系統效率)
-without-http_limit_zone_mole 禁用ngx_http_limit_zone_mole支持(該模塊可以針對條件,進行會話的並發連接數控制)
–without-http_limit_req_mole 禁用ngx_http_limit_req_mole支持(該模塊允許你對於一個地址進行請求數量的限制用一個給定的session或一個特定的事件)
–without-http_empty_gif_mole 禁用ngx_http_empty_gif_mole支持(該模塊在內存中常駐了一個1*1的透明GIF圖像,可以被非常快速的調用)
–without-http_browser_mole 禁用ngx_http_browser_mole支持(該模塊用來創建依賴於請求報頭的值。如果瀏覽器為modern ,則$modern_browser等於modern_browser_value指令分配的值;如 果瀏覽器為old,則$ancient_browser等於 ancient_browser_value指令分配的值;如果瀏覽器為 MSIE中的任意版本,則 $msie等於1)
–without-http_upstream_ip_hash_mole 禁用ngx_http_upstream_ip_hash_mole支持(該模塊用於簡單的負載均衡)
–with-http_perl_mole 啟用ngx_http_perl_mole支持(該模塊使nginx可以直接使用perl或通過ssi調用perl)
–with-perl_moles_path= 設定perl模塊路徑
–with-perl= 設定perl庫文件路徑
–http-log-path= 設定access log路徑
–http-client-body-temp-path= 設定http客戶端請求臨時文件路徑
–http-proxy-temp-path= 設定http代理臨時文件路徑
–http-fastcgi-temp-path= 設定http fastcgi臨時文件路徑
–http-uwsgi-temp-path= 設定http uwsgi臨時文件路徑
–http-scgi-temp-path= 設定http scgi臨時文件路徑
-without-http 禁用http server功能
–without-http-cache 禁用http cache功能
–with-mail 啟用POP3/IMAP4/SMTP代理模塊支持
–with-mail_ssl_mole 啟用ngx_mail_ssl_mole支持
–without-mail_pop3_mole 禁用pop3協議(POP3即郵局協議的第3個版本,它是規定個人計算機如何連接到互聯網上的郵件伺服器進行收發郵件的協議。是網際網路電子郵件的第一個離線協議標 准,POP3協議允許用戶從伺服器上把郵件存儲到本地主機上,同時根據客戶端的操作刪除或保存在郵件伺服器上的郵件。POP3協議是TCP/IP協議族中的一員,主要用於 支持使用客戶端遠程管理在伺服器上的電子郵件)
–without-mail_imap_mole 禁用imap協議(一種郵件獲取協議。它的主要作用是郵件客戶端可以通過這種協議從郵件伺服器上獲取郵件的信息,下載郵件等。IMAP協議運行在TCP/IP協議之上, 使用的埠是143。它與POP3協議的主要區別是用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對伺服器上的郵件進行操作。)
–without-mail_smtp_mole 禁用smtp協議(SMTP即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。SMTP協議屬於TCP/IP協議族,它幫助每台計算機在發送或中轉信件時找到下一個目的地。)
–with-google_perftools_mole 啟用ngx_google_perftools_mole支持(調試用,剖析程序性能瓶頸)
–with-cpp_test_mole 啟用ngx_cpp_test_mole支持
–add-mole= 啟用外部模塊支持
–with-cc= 指向C編譯器路徑
–with-cpp= 指向C預處理路徑
–with-cc-opt= 設置C編譯器參數(PCRE庫,需要指定–with-cc-opt=」-I /usr/local/include」,如果使用select()函數則需要同時增加文件描述符數量,可以通過–with-cc- opt=」-D FD_SETSIZE=2048」指定。)
–with-ld-opt= 設置連接文件參數。(PCRE庫,需要指定–with-ld-opt=」-L /usr/local/lib」。)
–with-cpu-opt= 指定編譯的CPU,可用的值為: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
–without-pcre 禁用pcre庫
–with-pcre 啟用pcre庫
–with-pcre= 指向pcre庫文件目錄
–with-pcre-opt= 在編譯時為pcre庫設置附加參數
–with-md5= 指向md5庫文件目錄(消息摘要演算法第五版,用以提供消息的完整性保護)
–with-md5-opt= 在編譯時為md5庫設置附加參數
–with-md5-asm 使用md5匯編源
–with-sha1= 指向sha1庫目錄(數字簽名演算法,主要用於數字簽名)
–with-sha1-opt= 在編譯時為sha1庫設置附加參數
–with-sha1-asm 使用sha1匯編源
–with-zlib= 指向zlib庫目錄
–with-zlib-opt= 在編譯時為zlib設置附加參數
–with-zlib-asm= 為指定的CPU使用zlib匯編源進行優化,CPU類型為pentium, pentiumpro
–with-libatomic 為原子內存的更新操作的實現提供一個架構
–with-libatomic= 指向libatomic_ops安裝目錄
–with-openssl= 指向openssl安裝目錄
–with-openssl-opt 在編譯時為openssl設置附加參數
–with-debug 啟用debug日誌
Ⅸ android 源碼 怎麼只編譯 systemui
Google提供的Android包含了原始Android的目標機代碼,主機編譯工具、模擬環境,下載的代碼包經過解壓後(這里是Android2.2的源碼包),源代碼的第一層目錄結構如下: -- Makefile -- bionic (bionic C庫) -- bootable (啟動引導相關代碼) -- build (存放系統編譯規則及generic等基礎開發包配置) -- cts (Android兼容性測試套件標准) -- dalvik (dalvik JAVA虛擬機) -- development (應用程序開發相關) -- external (android使用的一些開源的模組) -- frameworks (核心框架——java及C++語言) -- hardware (主要保護硬解適配層HAL代碼) -- libcore -- ndk -- device -- out (編譯完成後的代碼輸出與此目錄) -- packages (應用程序包) -- prebuilt (x86和arm架構下預編譯的一些資源) -- sdk (sdk及模擬器) -- system (文件系統庫、應用及組件——c語言) `-- vendor (廠商定製代碼) bionic 目錄 -- libc (C庫) -- arch-arm (ARM架構,包含系統調用匯編實現) -- arch-x86 (x86架構,包含系統調用匯編實現) -- bionic (由C實現的功能,架構無關) -- docs (文檔) -- include (頭文件) -- inet -- kernel (Linux內核中的一些頭文件) -- netbsd (?netbsd系統相關,具體作用不明) -- private (?一些私有的頭文件) -- stdio (stdio實現) -- stdlib (stdlib實現) -- string (string函數實現) -- tools (幾個工具) -- tzcode (時區相關代碼) -- unistd (unistd實現) `-- zoneinfo (時區信息) -- libdl (libdl實現,dl是動態鏈接,提供訪問動態鏈接庫的功能) -- libm (libm數學庫的實現,) -- alpha (apaha架構) -- amd64 (amd64架構) -- arm (arm架構) -- bsdsrc (?bsd的源碼) -- i386 (i386架構) -- i387 (i387架構?) -- ia64 (ia64架構) -- include (頭文件) -- man (數學函數,後綴名為.3,一些為freeBSD的庫文件) -- powerpc (powerpc架構) -- sparc64 (sparc64架構) `-- src (源代碼) -- libstdc++ (libstdc++ C++實現庫) -- include (頭文件) `-- src (源碼) -- libthread_db (多線程程序的調試器庫) `-- include (頭文件) `-- linker (動態鏈接器) `-- arch (支持arm和x86兩種架構) bootable 目錄 -- bootloader (適合各種bootloader的通用代碼) `-- legacy (估計不能直接使用,可以參考) -- arch_armv6 (V6架構,幾個簡單的匯編文件) -- arch_msm7k (高通7k處理器架構的幾個基本驅動) -- include (通用頭文件和高通7k架構頭文件) -- libboot (啟動庫,都寫得很簡單) -- libc (一些常用的c函數) -- nandwrite (nandwirte函數實現) `-- usbloader (usbloader實現) -- diskinstaller (android鏡像打包器,x86可生產iso) `-- recovery (系統恢復相關) -- edify (升級腳本使用的edify腳本語言) -- etc (init.rc恢復腳本) -- minui (一個簡單的UI) -- minzip (一個簡單的壓縮工具) -- mttils (mtd工具) -- res (資源) `-- images (一些圖片) -- tools (工具) `-- ota (OTA Over The Air Updates升級工具) `-- updater (升級器) build目錄 -- core (核心編譯規則) -- history (歷史記錄) -- libs `-- host (主機端庫,有android 「cp」功能替換) -- target (目標機編譯對象) -- board (開發平台) -- emulator (模擬器) -- generic (通用) -- idea6410 (自己添加的) `-- sim (最簡單) `-- proct (開發平台對應的編譯規則) `-- security (密鑰相關) `-- tools (編譯中主機使用的工具及腳本) -- acp (Android "acp" Command) -- apicheck (api檢查工具) -- applypatch (補丁工具) -- apriori (預鏈接工具) -- atree (tree工具) -- bin2asm (bin轉換為asm工具) -- check_prereq (檢查編譯時間戳工具) -- dexpreopt (模擬器相關工具,具體功能不明) -- droiddoc (?作用不明,java語言,網上有人說和JDK5有關) -- fs_config (This program takes a list of files and directories) -- fs_get_stats (獲取文件系統狀態) -- iself (判斷是否ELF格式) -- isprelinked (判斷是否prelinked) -- kcm (按鍵相關) -- lsd (List symbol dependencies) -- releasetools (生成鏡像的工具及腳本) -- rgb2565 (rgb轉換為565) -- signapk (apk簽名工具) -- soslim (strip工具) `-- zipalign (zip archive alignment tool) dalvik目錄 dalvik虛擬機 . -- dalvikvm (main.c的目錄) -- dexmp (dex反匯編) -- dexlist (List all methods in all concrete classes in a DEX file.) -- dexopt (預驗證與優化) -- docs (文檔) -- dvz (和zygote相關的一個命令) -- dx (dx工具,將多個java轉換為dex) -- hit (?java語言寫成) -- libcore (核心庫) -- libcore-disabled (?禁用的庫) -- libdex (dex的庫) -- libnativehelper (Support functions for Android's class libraries) -- tests (測試代碼) -- tools (工具) `-- vm (虛擬機實現) development 目錄 (開發者需要的一些常式及工具) -- apps (一些核心應用程序) -- BluetoothDebug (藍牙調試程序) -- CustomLocale (自定義區域設置) -- Development (開發) -- Fallback (和語言相關的一個程序) -- FontLab (字型檔) -- GestureBuilder (手勢動作) -- NinePatchLab (?) -- OBJViewer (OBJ查看器) -- SdkSetup (SDK安裝器) -- SpareParts (高級設置) -- Term (遠程登錄) `-- launchperf (?) -- build (編譯腳本模板) -- cmds (有個monkey工具) -- data (配置數據) -- docs (文檔) -- host (主機端USB驅動等) -- ide (集成開發環境) -- ndk (本地開發套件——c語言開發套件) -- pdk (Plug Development Kit) -- samples (演示程序) -- AliasActivity () -- ApiDemos (API演示程序) -- BluetoothChat (藍牙聊天) -- BrowserPlugin (瀏覽器插件) -- BusinessCard (商業卡) -- Compass (指南針) -- ContactManager (聯系人管理器) -- CubeLiveWall** (動態壁紙的一個簡單常式) -- FixedGridLayout (像是布局) -- GlobalTime (全球時間) -- HelloActivity (Hello) -- Home (Home) -- JetBoy (jetBoy游戲) -- LunarLander (貌似又是一個游戲) -- MailSync (郵件同步) -- MultiResolution (多解析度) -- MySampleRss (RSS) -- NotePad (記事本) -- RSSReader (RSS閱讀器) -- SearchableDictionary (目錄搜索) -- **JNI (JNI常式) -- SkeletonApp (空殼APP) -- Snake (snake程序) -- SoftKeyboard (軟鍵盤) -- Wiktionary (?維基) `-- Wiktionary**(?維基常式) -- scripts (腳本) -- sdk (sdk配置) -- simulator (?模擬器) -- testrunner (?測試用) `-- tools (一些工具)
Ⅹ 如何使用ubuntu編譯arcopter
ArCopter\.gitignore
..........\AP_State.pde
..........\APM_Config.h
..........\APM_Config_mavlink_hil.h
..........\ArCopter.pde
..........\Attitude.pde
..........\command_description.txt
..........\commands.pde
..........\commands_logic.pde
..........\commands_process.pde
..........\compat.h
..........\compat.pde
..........\config.h
..........\config_channels.h
..........\control_modes.pde
..........\defines.h
..........\events.pde
..........\failsafe.pde
..........\fence.pde
..........\flip.pde
..........\GCS.h
..........\GCS_Mavlink.pde
..........\inertia.pde
..........\leds.pde
..........\Log.pde
..........\Makefile
..........\motors.pde
..........\navigation.pde
..........\nocore.inoflag
..........\Parameters.h
..........\Parameters.pde
..........\perf_info.pde
..........\position_vector.pde
..........\radio.pde
..........\read_me.text
..........\ReleaseNotes.txt
..........\sensors.pde
..........\setup.pde
..........\system.pde
..........\test.pde
..........\toy.pde
..........\UserCode.pde
..........\UserVariables.h
libraries\AC_Fence
.........\........\AC_Fence.cpp
.........\........\AC_Fence.h
.........\........\examples
.........\........\........\AC_Fence_test
.........\........\........\.............\AC_Fence_test.pde
.........\........\........\.............\Makefile
.........\........\........\.............\nocore.inoflag
.........\........\keywords.txt
.........\AC_PID
.........\......\AC_PID.cpp
.........\......\AC_PID.h
.........\......\examples
.........\......\........\AC_PID_test
.........\......\........\...........\AC_PID_test.pde
.........\......\........\...........\Makefile
.........\......\........\...........\nocore.inoflag
.........\......\keywords.txt
.........\AC_WPNav
.........\........\AC_WPNav.cpp
.........\........\AC_WPNav.h
.........\........\examples
.........\........\........\AC_WPNav_test
.........\........\........\.............\AC_WPNav_test.pde
.........\........\........\.............\Makefile
.........\........\........\.............\nocore.inoflag
.........\........\keywords.txt
.........\AP_ADC
.........\......\AP_ADC.cpp
.........\......\AP_ADC.h
.........\......\AP_ADC_ADS7844.cpp
.........\......\AP_ADC_ADS7844.h
.........\......\AP_ADC_HIL.cpp
.........\......\AP_ADC_HIL.h
.........\......\examples
.........\......\........\AP_ADC_test
.........\......\........\...........\AP_ADC_test.pde
.........\......\........\...........\Makefile
.........\......\........\...........\nocore.inoflag
.........\......\keywords.txt
.........\AP_ADC_AnalogSource
.........\...................\AP_ADC_AnalogSource.cpp
.........\...................\AP_ADC_AnalogSource.h
.........\AP_AHRS
.........\.......\AP_AHRS.cpp
.........\.......\AP_AHRS.h
.........\.......\AP_AHRS_DCM.cpp
.........\.......\AP_AHRS_DCM.h
.........\.......\AP_AHRS_HIL.cpp
.........\.......\AP_AHRS_HIL.h
.........\.......\AP_AHRS_MPU6000.cpp
.........\.......\AP_AHRS_MPU6000.h
.........\.......\examples
.........\.......\........\AHRS_Test
.........\.......\........\.........\AHRS_Test.pde
.........\.......\........\.........\Makefile
.........\.......\........\.........\nocore.inoflag