Linuxオペレーティングシステムのソースコードコンパイルインストールソフトウェア


ソースコードコンパイルインストール
一般的に、linuxでソフトウェアを実行する場合は、まずインストールする必要があります.たとえばPHPソフトウェアを実行する場合は、apt-get install phpコマンドを使用してインストールしたり、phpをインストールするソースコードをコンパイルして実行したりすることができます.ここでは主にソースコードのコンパイルインストールについて話しています.まずphpソースコードはc言語で書かれていますが、C言語は高級言語で、機械はC言語コードを認識できません.今、C言語コードをLinuxで読めるbinary file(バイナリファイル)に翻訳する必要があります.この翻訳作業はコンパイラで翻訳を完了する必要があります.コンパイル中には、いわゆるターゲットファイル(Object file)が生成する.oの添付ファイル名が存在します.Cのソースファイルについては.cを記憶ファイルとする.プログラム内で他の外部サブルーチンを呼び出すか、他のスイートが提供する関数機能を呼び出す必要がある場合があります.ただし、コンパイル中にこの関数ライブラリを追加する必要があります.これにより、コンパイラはすべてのプログラムコードを関数ライブラリに接続(Link)して正しい実行ファイルを生成することができます.(linuxコアには、/usr/include、/lib、/usr/libに配置された多くのコアに関連する関数ライブラリと外部およびパラメータが提供されています.コンパイラ翻訳が完了するとバイナリファイルがあります.もしコンパイルされたプログラムがnginx、apacheなどの大規模なソフトウェアのソースプログラムであれば、gccの1本のコンパイル命令で入力するのは現実的ではありません.makeコマンドを使用すると、makeは現在のディレクトリにMakefile(またはmakefile)を見つけることができます.ファイル、makefileファイルにソースコードがどのようにコンパイルされているかの詳細が記録されていますmakefileファイルは、通常、ソフトウェア開発者が使用者の作業環境を検出するためにシーケンシングを作成し、その作業環境にソフトウェア開発者が必要とする他の機能があるかどうかを検出します.この検出プログラムは、検出が完了すると、このmakefileのルールファイルを自発的に作成します.通常、この検出プログラムファイルの名前はconfigureまたはconfigです.そのため、configure検出ジョブ環境を実行し、makefileを生成してからmakeをコンパイルします.たとえば、次のようになります.
cd php-5.5.10/
./configure --prefix=/usr/local/php --with-config-file-path=/etc/php --enable-fpm --enable-pcntl --enable-mysqlnd --enable-opcache --enable-sockets --enable-sysvmsg --enable-sysvsem  --enable-sysvshm --enable-shmop --enable-zip --enable-ftp --enable-soap --enable-xml --enable-mbstring --disable-rpath --disable-debug --disable-fileinfo --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-pcre-regex --with-iconv --with-zlib --with-mcrypt --with-gd --with-openssl --with-mhash --with-xmlrpc --with-curl --with-imap-ssl
sudo make
sudo make install
sudo cp php.ini-development /etc/php/

makefile.amファイル解析
次はmemcachedのmakefile.amファイルの内容です.
#                  ,                     。PROGRAMS           。client         。bin               。
bin_PROGRAMS = memcached    

pkginclude_HEADERS = protocol_binary.h

#                  ,     ,         
noinst_PROGRAMS = memcached-debug sizes testapp timedrun
BUILT_SOURCES=
testapp_SOURCES = testapp.c util.c util.h
timedrun_SOURCES = timedrun.c

#                  ,  main()   memcached.c 
memcached_SOURCES = memcached.c memcached.h \
                    hash.c hash.h \
                    jenkins_hash.c jenkins_hash.h \
                    murmur3_hash.c murmur3_hash.h \
                    slabs.c slabs.h \
                    items.c items.h \
                    assoc.c assoc.h \
                    thread.c daemon.c \
                    stats.c stats.h \
                    util.c util.h \
                    trace.h cache.h sasl_defs.h \
                    bipbuffer.c bipbuffer.h \
                    logger.c logger.h \
                    crawler.c crawler.h \
                    itoa_ljust.c itoa_ljust.h

# BUILD_CACHE configure.ac    ,             
if BUILD_CACHE
memcached_SOURCES += cache.c
testapp_SOURCES += cache.c
endif

# BUILD_SOLARIS_PRIVS configure.ac    ,             
if BUILD_SOLARIS_PRIVS
memcached_SOURCES += solaris_priv.c
endif

# ENABLE_SASL configure.ac    ,             
if ENABLE_SASL
memcached_SOURCES += sasl_defs.c
endif

# memcached_debug         memcached  
memcached_debug_SOURCES = $(memcached_SOURCES)

#   Makefile     ,  C        ,     DCONFIG_DIR,      ,       CONFIG_DIR,         CFLAGS  ,         
memcached_CPPFLAGS = -DNDEBUG

#           
memcached_debug_LDADD = @PROFILER_LDFLAGS@
memcached_debug_CFLAGS = @PROFILER_FLAGS@

memcached_LDADD =
memcached_DEPENDENCIES =
memcached_debug_DEPENDENCIES =
CLEANFILES=

if BUILD_DTRACE
BUILT_SOURCES += memcached_dtrace.h
CLEANFILES += memcached_dtrace.h
endif

if DTRACE_INSTRUMENT_OBJ
memcached_LDADD += memcached_dtrace.o
memcached_DEPENDENCIES += memcached_dtrace.o
memcached_debug_LDADD += memcached_debug_dtrace.o
memcached_debug_DEPENDENCIES += memcached_debug_dtrace.o
CLEANFILES += memcached_dtrace.o memcached_debug_dtrace.o
endif

memcached_dtrace.h: memcached_dtrace.d
    ${DTRACE} -h -s memcached_dtrace.d
    sed -e 's,void \*,const void \*,g' memcached_dtrace.h | \
            sed -e 's,char \*,const char \*,g' | tr '\t' ' ' > mmc_dtrace.tmp
    mv mmc_dtrace.tmp memcached_dtrace.h

memcached_dtrace.o: $(memcached_OBJECTS)
    $(DTRACE) $(DTRACEFLAGS) -G -o memcached_dtrace.o -s ${srcdir}/memcached_dtrace.d $(memcached_OBJECTS)

memcached_debug_dtrace.o: $(memcached_debug_OBJECTS)
    $(DTRACE) $(DTRACEFLAGS) -G -o memcached_debug_dtrace.o -s ${srcdir}/memcached_dtrace.d $(memcached_debug_OBJECTS)


SUBDIRS = doc
DIST_DIRS = scripts
EXTRA_DIST = doc scripts t memcached.spec memcached_dtrace.d version.m4 README.md LICENSE.bipbuffer

MOSTLYCLEANFILES = *.gcov *.gcno *.gcda *.tcov

test:    memcached-debug sizes testapp
    $(srcdir)/sizes
    $(srcdir)/testapp
    prove $(srcdir)/t
    @if test `basename $(PROFILER)` = "gcov"; then \
      for file in memcached_debug-*.gc??; do \
        mv -f $$file `echo $$file | sed 's/memcached_debug-//'`; \
      done && \
      for file in *.gcda; do \
        srcfile=`echo $$file | sed 's/.gcda/.c/'`; \
        if test -n "`echo $(memcached_debug_SOURCES) | grep $$srcfile`"; then \
          echo `$(PROFILER) $$srcfile` | sed 's/'$$srcfile':.*//'; \
        fi \
      done \
    elif test `basename $(PROFILER)` = "tcov"; then \
      files=`grep SRCFILE memcached-debug.profile/tcovd | sed 's/SRCFILE://' | sort | uniq` && \
      $(PROFILER) -x memcached-debug.profile $$files 2>&1; \
      for file in *.tcov; do \
        srcfile=`echo $$file | sed 's/.tcov//'`; \
        if test -n "`echo $(memcached_debug_SOURCES) | grep $$srcfile`"; then \
          echo $$srcfile : `grep 'Percent of the file executed' $$file`; \
        fi \
      done \
    else :; fi

docs:
    (cat Doxyfile ; echo "PROJECT_NUMBER=`cat version.num`") | doxygen -

dist-hook:
    rm -f $(distdir)/*/*~ $(distdir)/t/lib/*~ $(distdir)/*~

maintainer-clean-local:
    -rm Makefile.in
    -rm aclocal.m4
    -rm config.guess
    -rm config.sub
    -rm depcomp
    -rm install-sh
    -rm ltmain.sh
    -rm missing
    -rm configure
    -rm config.log
    -rm config.status

参考資料:「鳥兄のLinuxプライベートルーム料理」http://blog.csdn.net/zmxiangd...