Wednesday, December 09, 2009

常用的 Makefile 建置目標

3.3 The most useful Makefile targets / 常用的 Makefile 建置目標

By now `configure' has generated the output files such as a `Makefile'. Most projects include a `Makefile' with a basic set of well-known targets (see section 4.1 Targets and dependencies). A target is a name of a task that you want make to perform -- usually it is to build all of the programs belonging to your package (commonly known as the all target). From your build directory, the following commands are likely to work for a configured package:

截至目前為止,我們已經提到 `configure' 會產生一些輸出檔,比如 `Makefile' 檔案。大部分的專案會準備一個內建有常見建置目標的 `Makefile' 檔案 (請見 4.1 建置目標與相依性)。一個建置目標是一個你希望 make 幫你完成的工作的名稱 -- 比如,建置所有套件中的程式 (常見的 all 建置目標)。在已經完成套件組態的建置資料夾中,通常可以使用以下的指令:

make all

Builds all derived files sufficient to declare the package built.

建置出所有足使這個套件發揮功能的必要檔案。

make check

Runs any self-tests that the package may have.

執行在套件內所準備的自我測試程式。

make install

Installs the package in a predetermined location.

將套件檔案安裝到預先設定好的路徑中。

make clean

Removes all derived files.

刪除所有在建置過程中所產生的檔案。

There are other less commonly used targets which are likely to be recognized, particularly if the package includes a `Makefile' which conforms to the GNU `Makefile' standard or is generated by automake. You may wish to inspect the generated `Makefile' to see what other targets have been included.

還有一些比較少用到但是通常有支援的建置目標,特別是那些遵守了 GNU `Makefile' 標準或是由 automake 所產生的 `Makefile' 檔案。要知道所產生的 `Makefile' 支援了哪些建置目標,你可能需要看看所產生出來的 `Makefile' 檔案的內容。

Friday, May 29, 2009

從 Universal Binary 中移除非本機平台機械碼

以我的情況來說,在 PowerPC 平台上,執行檔中的 IA32/EM64T 的機械碼基本上是不需要的。在一些比較巨大的程式上,可以省下不少空間。

可以使用 ditto 這個內建的指令來從 Application Bundle 中移除非 PowerPC 機械碼:

ditto --rsrc --arch ppc /Applications/Camino.app /Applications/Camino-PPC.app

另一個相關的工具是 lipo 這個內建指令,不過他是用在 Mach-O binary 檔上的,不能直接給他 Application Bundle 資料夾去處理。

Wednesday, April 22, 2009

Git 的 push

之前是用 Subversion 來作版本控制,可是不是總是可以連到中央伺服器上,所以最近移轉到 Git 上。

Git 的 push 不會去改變 work copy 的內容,而且 HEAD 也不會前進到最新的 commit 上,一整個跟 Subversion 線性的歷史記錄不太一樣。

如果發生了 push 進附有 work copy 的 repository 的事情,更新 work copy 就得要先用 git log 先把最近一個 remote commit 的 commit ID 找出來,然後再用 git reset %COMMIT-ID% 來把 HEAD 設定過去,最後用 git checkout . 來把 work copy 更新。

看來還是要準備一個 bare repository 才行,也就是每個人要有 public repository 跟 private repository 兩個 repository ... 感覺實在挺浪費的。

建立 bare repository:

$ mkdir project.git
$ cd project.git
$ git init --bare

將現有位於 /home/me/project 的 repository 複製成位於 /home/me/repo/project.git 的 bare repository:

$ cd /home/me/repo
$ git clone --bare /home/me/project

把 remote repository 設定補進 private repository 中:

$ git remote add origin /home/me/repo/project.git
$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

Friday, January 02, 2009

在 OS X 上編譯 Subversion

因為 OpenCollabNet 提供的 OS X 映像檔在我的 10.4 PPC 上老是有名稱空間污染的毛病,單純用指令是沒問題,可是用 subclipse 就會有很大的問題,所以只好自己試試看重編一份,最差的情況就是下去 debug 看看到底是怎樣。

比想像中的順利的多,重新編譯就好了... 不用去改程式。

先把舊的 OpenCollabNet 版的資料夾改名,以避免編譯時去用到 OpenCollabNet 的 binary code 而造成相容性的問題。

sudo mv /opt/subversion /opt/subversion-154

要下載的是 subversion-1.5.5.tar.bz2 與 subversion-deps-1.5.5.tar.bz2 這兩個,後者提供了所需的第三方函示庫的原始碼,直接在同一個目錄下解壓兩者就可以了,檔案都會被解到 subversion-1.5.5 這個目錄之下。

tar -jxf subversion-1.5.5.tar.bz2
tar -jxf subversion-deps-1.5.5.tar.bz2
cd subversion-1.5.5/

這篇提到可能會跑去找 jikes 這個比較老舊的東西來當 Java 編譯器,然後會因此編不出東西,所以要下 --with-jikes=no 把他關了,才會去用 javac 來編譯。

export CFLAGS="-g -O3"
export CXXFLAGS="-g -O3"
./configure --prefix=/opt/subversion --enable-javahl --with-jikes=no
make
make javahl
sudomake install
sudo make install-javahl

之前 OpenCollabNet 留下來的 symbolic link 之類的東西大致上都不需要動,可以沿用下來。所以就算是全新安裝,先裝看看 OpenCollabNet 版碰碰運氣也是不錯。

Perl binding 的部份則是要透過 SWIG 來編,也是要另外編譯與安裝。

make swig-pl
sudo make install-swig-pl

不過這邊安裝會裝到系統資料夾裡去,要自己把他們搬出來。

sudo mkdir /opt/subversion/lib/svn-perl
sudo mkdir /opt/subversion/lib/svn-perl/auto
sudo mv /Library/Perl/5.8.6/darwin-thread-multi-2level/SVN /opt/subversion/lib/svn-perl
sudo mv /Library/Perl/5.8.6/darwin-thread-multi-2level/auto/SVN /opt/subversion/lib/svn-perl/auto
sudo mv /usr/local/man/man3/SVN\:\:* /opt/subversion/share/man/man3/

修改 .profile 把 Perl Module 的目錄加到 PERL5LIB 這個環境變數裡,就可以讓 perl 找到。

export PERL5LIB=$PERL5LIB:/opt/subversion/lib/svn-perl/

Thursday, January 01, 2009

Mac OS X 上更新 locate database

在 OS X 上要更新 locate 的 database 有兩個方法,一個是直接執行 /usr/libexec/locate.updatedb 這個更新用的指令稿,另一個是執行 /etc/periodic/weekly/500.weekly 或是長像類似的東西,後者是用來每週定期執行用的指令稿,有比較好的權限處理。

在 man locate 裡頭是說 /etc/periodic/weekly/310.locate 是定期執行用的指令稿,不過在我的機器上沒有這個檔案。

不管是執行哪個,可能都要利用 sudo 去執行,除非把資料庫檔案的權限改掉。

sudo /etc/periodic/weekly/500.weekly