2017年1月17日 星期二

[Toolchain] Autotools & CMake

  • Autotools
    • autoconf, automake, libtools
      • Note: Mac OSX 自 XCode 4.3之後, 沒有內建這些 autotools了. 可以透過 port install autoconf automake
    • Open source 三部曲
      • ./configure
        • 產生 Makefile 及 config.h (所以程式中盡量少用 config.h)
      • make
      • make install
    • flowchart
      • 利用 autoscan 建立 configure.ac (舊版 autotool叫做 configure.in)
        • autoscan
          mv configure.scan configure.ac
          • 產生範本 configure.scan, 自行更名為 configure.ac供後面 autoconf使用. 同時會產生 autoscan.log (但成功的狀態似乎沒填任何東西, 要看過程反而是要用 autoscan --verbose來看)
          • 從 verbose可以看到這個 autoscan做了些什麼事, 從掃描 source files開始, 會以目前執行的 directory 當作 srcdir, 分別掃描 cfiles, makefiles, shfiles, 以及瀏覽用到的 function, header, install 及相關變數 lists, 如下 samples (可自行以 open source project 驗證, 或如 reference裡用的 LilyTerm來練習)
          • autoscan: srcdir = .
            cfiles: src/console.c src/console.h src/data.h src/dialog.c src/dialog.h src/font.c src/font.h src/lilyterm.h src/main.c src/main.h src/menu.c src/menu.h src/misc.c src/misc.h src/notebook.c src/notebook.h src/pagename.c src/pagename.h src/profile.c src/profile.h src/property.c src/property.h src/window.c src/window.h
            makefiles: data/Makefile po/Makefile
            shfiles: src/unit_test.sh
            
            function:
            bzero: src/main.c:314
            memset: src/menu.c:1995 src/menu.h:29
      • 修改 configure.ac
        • vi configure.ac
          • configure.ac 基本上就是個 script, 只是裡面呼叫非常多 macros以利 m4 (GNU Marco Processor) 處理, e.g. AC_*( ), 其中 [ ] 為區隔字元, 以及 AC prefix代表 AutoConf 相關 marco; AM_*代表 AutoMake相關marco. 另外注意, macro名稱與左括號 ( 中間不要有空格, e.g. AC_PREREQ([2.69]) 而不是 AC_PREREQ ([2.69])
            • #為註解
          • 未更改
          • #                                               -*- Autoconf -*-
            # Process this file with autoconf to produce a configure script.
            
            AC_PREREQ([2.69])
            AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
            AC_CONFIG_SRCDIR([src/console.c])
            AC_CONFIG_HEADERS([config.h])
            
            # Checks for programs.
            AC_PROG_CXX
            AC_PROG_CC
            AC_PROG_INSTALL
            AC_PROG_MAKE_SET
            
            # Checks for libraries.
            
            # Checks for header files.
            AC_PATH_X
            AC_CHECK_HEADERS([fcntl.h locale.h stdlib.h string.h sys/socket.h unistd.h])
            
            # Checks for typedefs, structures, and compiler characteristics.
            AC_TYPE_PID_T
            
            # Checks for library functions.
            AC_FUNC_FORK
            AC_CHECK_FUNCS([bzero memset setenv setlocale socket strcasecmp strstr])
            
            AC_CONFIG_FILES([data/Makefile
                             po/Makefile])
            AC_OUTPUT
            
            
    • Samples for practice
    • Reference:
  • CMake
    • front-end of make
    • CTest
  • MacPorts
    • 目的: 簡化 compile, install linux software to Mac. 可想成 apt-get, 即為 command line based package management
    • 操作: port install, port search, port contents
    • 通常會放在 /opt/local 底下
    • 亦可透過 pkg-config --cflags port, 找到需要的 installed port header與 library
  • pkg-config --cflags
  • port contents installed | grep gdkkeysyms.h

沒有留言:

張貼留言