chapter 12-02

移植到 OpenWRT

此章節說明如何移植此系統到 OpenWRT 上使用.


主程式部分

這邊說明如何將此系統加入到 OpenWRT 的 package 做編譯和使用.

01.  在 OpenWRT 的 package/system 建立目錄, 結構為 :
主目錄.
mint-cm
放置原始碼的目錄.
mint-cm/src
放置其他檔案的目錄.
mint-cm/files

02.  mint_cm 裡面的檔案複製到 mint-cm/src 目錄內.

03.  參考 #03-04#, 修改 CGI 端用來顯示錯誤訊息或除錯訊息的 console 設備為 /dev/console.

04.  參考 #12-01#01#12-01#02, 把 mint-cm/src 目錄內用到 mcm_lulib_api 和 maam_lulib_api 的部分改為使用動態鏈結.

05.  mint-cm 目錄建立給 OpenWRT 編譯使用的 Makefile, 內容 :
include $(TOPDIR)/rules.mk

PKG_NAME:=mint-cm
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/kernel.mk

define Package/$(PKG_NAME)
	SECTION:=base
	CATEGORY:=Base system
	TITLE:=Mint Configuration Management
	DEPENDS:=+libpthread
endef

define Build/Prepare
	# 複製程式碼到 build_dir 目錄.
	mkdir -p $(PKG_BUILD_DIR)
	$(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Build/Configure
	# 在 PC 上編譯和執行 mcm_build, 分析 mcm_data_profile.xml 產生相關的檔案.
	cd $(PKG_BUILD_DIR); \
	$(MAKE) binary_profile
endef

define Build/Compile
	# 編譯 mcm_lulib_api.
	cd $(PKG_BUILD_DIR); \
	$(MAKE) binary_lulib \
		CROSS="$(TARGET_CROSS)" \
		CFLAGS="$(TARGET_CFLAGS)" \
		LDFLAGS="$(TARGET_LDFLAGS)"

	# 編譯 mcm_lklib_api.
	cd $(PKG_BUILD_DIR); \
	$(MAKE) binary_lklib \
		ARCH="$(LINUX_KARCH)" \
		CROSS="$(TARGET_CROSS)" \
		KERNEL_PATH="$(LINUX_DIR)" \
		EXTRA_CFLAGS="$(EXTRA_CFLAGS)"

	# 編譯 mcm_cgi.
	cd $(PKG_BUILD_DIR); \
	$(MAKE) binary_cgi \
		CROSS="$(TARGET_CROSS)" \
		CFLAGS="$(TARGET_CFLAGS)" \
		LDFLAGS="$(TARGET_LDFLAGS)"

	# 編譯 mini_httpd.
	cd $(PKG_BUILD_DIR); \
	$(MAKE) binary_httpd \
		CROSS="$(TARGET_CROSS)" \
		CFLAGS="$(TARGET_CFLAGS)" \
		LDFLAGS="$(TARGET_LDFLAGS)"

	# 編譯 mcm_daemon.
	cd $(PKG_BUILD_DIR); \
	$(MAKE) binary_daemon \
		CROSS="$(TARGET_CROSS)" \
		CFLAGS="$(TARGET_CFLAGS)" \
		LDFLAGS="$(TARGET_LDFLAGS)"

	# 編譯 mcm_command.
	cd $(PKG_BUILD_DIR); \
	$(MAKE) binary_command \
		CROSS="$(TARGET_CROSS)" \
		CFLAGS="$(TARGET_CFLAGS)" \
		LDFLAGS="$(TARGET_LDFLAGS)"
endef

MCM_LIB_PATH:=$(PKG_BUILD_DIR)/mcm_lib
MCM_LHEADER_PATH:=$(MCM_LIB_PATH)/mcm_lheader
MCM_LULIB_PATH:=$(MCM_LIB_PATH)/mcm_lulib
MCM_LKLIB_PATH:=$(MCM_LIB_PATH)/mcm_lklib
MCM_JSLIB_PATH:=$(MCM_LIB_PATH)/mcm_jslib
MCM_BUILD_PATH:=$(PKG_BUILD_DIR)/mcm_build
MCM_DAEMON_PATH:=$(PKG_BUILD_DIR)/mcm_daemon
MCM_MODULE_PATH:=$(MCM_DAEMON_PATH)/mcm_module
MCM_COMMAND_PATH:=$(PKG_BUILD_DIR)/mcm_command
MCM_CGI_PATH:=$(PKG_BUILD_DIR)/mcm_cgi
MCM_CGI_CONFIG_MODULE_PATH:=$(MCM_CGI_PATH)/mcm_cgi_config_module
MCM_CGI_UPLOAD_MODULE_PATH:=$(MCM_CGI_PATH)/mcm_cgi_upload_module
MINIHTTPD_PATH:=$(PKG_BUILD_DIR)/http_server/mini_httpd/last
MAAM_PATH:=$(MINIHTTPD_PATH)/mint_aam
MAAM_LIB_PATH:=$(MAAM_PATH)/maam_lib
MAAM_LULIB_PATH:=$(MAAM_LIB_PATH)/maam_lulib
MAAM_JSLIB_PATH:=$(MAAM_LIB_PATH)/maam_jslib

# 假設目標平台存放網頁的路徑為 /web,
# 注意則 mini_httpd.conf 內的 [dir=...] 要改為 [dir=/].
TARGET_WEB_PATH:=web

define Package/$(PKG_NAME)/install
	## 安裝 mcm_lulib_api 部分 ##
	# 安裝給其他程式使用的標頭檔.
	rm -rf $(STAGING_DIR)/usr/include/mcm_lib
	$(INSTALL_DIR) $(STAGING_DIR)/usr/include/mcm_lib/mcm_lheader
	$(CP) $(MCM_LHEADER_PATH)/*.h $(STAGING_DIR)/usr/include/mcm_lib/mcm_lheader
	$(INSTALL_DIR) $(STAGING_DIR)/usr/include/mcm_lib/mcm_lulib
	$(CP) $(MCM_LULIB_PATH)/*.h $(STAGING_DIR)/usr/include/mcm_lib/mcm_lulib
	# 安裝 mcm_lulib_api 函式庫.
	$(INSTALL_DIR) $(1)/usr/lib
	$(CP) $(MCM_LULIB_PATH)/*.so $(1)/usr/lib

	## 安裝 mcm_lklib_api 部分 ##
	# 安裝給其他程式使用的標頭檔.
	rm -rf $(LINUX_DIR)/include/mcm_lib
	$(INSTALL_DIR) $(LINUX_DIR)/include/mcm_lib/mcm_lheader
	$(CP) $(MCM_LHEADER_PATH)/*.h $(LINUX_DIR)/include/mcm_lib/mcm_lheader
	$(INSTALL_DIR) $(LINUX_DIR)/include/mcm_lib/mcm_lklib
	$(CP) $(MCM_LKLIB_PATH)/*.h $(LINUX_DIR)/include/mcm_lib/mcm_lklib
	# 安裝 mcm_lklib_api 函式庫.
	$(INSTALL_DIR) $(1)/lib/modules/$(LINUX_VERSION)
	$(CP) $(MCM_LKLIB_PATH)/*.ko $(1)/lib/modules/$(LINUX_VERSION)
	# 設定開機自動載入 mcm_lklib_api.
	$(INSTALL_DIR) $(1)/etc/modules.d
	echo "mcm_lklib_api" > $(1)/etc/modules.d/01-mcm_lklib_api
	chmod 775 $(1)/etc/modules.d/01-mcm_lklib_api

	# 安裝 mcm_daemon, 模組函式, 資料模組, 資料預設值.
	$(INSTALL_DIR) $(1)/sbin
	$(INSTALL_BIN) $(MCM_DAEMON_PATH)/mcm_daemon $(1)/sbin
	$(INSTALL_DIR) $(1)/etc
	$(CP) $(MCM_MODULE_PATH)/mcm_module.lib $(1)/etc
	$(CP) $(MCM_BUILD_PATH)/mcm_model_profile.txt $(1)/etc
	$(INSTALL_DIR) $(1)/etc/config
	$(CP) $(MCM_BUILD_PATH)/mcm_store_profile_default.txt $(1)/etc/config

	# 安裝 mcm command.
	$(INSTALL_DIR) $(1)/sbin
	$(INSTALL_BIN) $(MCM_COMMAND_PATH)/mcm $(1)/sbin

	# 安裝 mini_httpd 和設定檔.
	$(INSTALL_DIR) $(1)/sbin
	$(INSTALL_BIN) $(MINIHTTPD_PATH)/mini_httpd $(1)/sbin
	$(INSTALL_DIR) $(1)/etc
	$(CP) $(MINIHTTPD_PATH)/mini_httpd.conf $(1)/etc

	# 安裝網頁端存取使用的函式.
	$(INSTALL_DIR) $(1)/$(TARGET_WEB_PATH)
	$(CP) $(MCM_JSLIB_PATH)/*.js $(1)/$(TARGET_WEB_PATH)

	# 安裝 mcm_cgi.
	$(INSTALL_DIR) $(1)/$(TARGET_WEB_PATH)/cgi
	$(INSTALL_BIN) $(MCM_CGI_PATH)/mcm_cgi_config.cgi $(1)/$(TARGET_WEB_PATH)/cgi
	$(CP) $(MCM_CGI_CONFIG_MODULE_PATH)/mcm_cgi_config_module.lib $(1)/$(TARGET_WEB_PATH)/cgi
	$(INSTALL_BIN) $(MCM_CGI_PATH)/mcm_cgi_upload.cgi $(1)/$(TARGET_WEB_PATH)/cgi
	$(CP) $(MCM_CGI_UPLOAD_MODULE_PATH)/mcm_cgi_upload_module.lib $(1)/$(TARGET_WEB_PATH)/cgi

	## 安裝 maam_lulib_api 部分 (標頭檔, 函式庫,  網頁函式) ##
	if [ -d "$(MAAM_PATH)" ]; then \
		rm -rf $(STAGING_DIR)/usr/include/maam_lib; \
		$(INSTALL_DIR) $(STAGING_DIR)/usr/include/maam_lib/maam_lulib; \
		$(CP) $(MAAM_LULIB_PATH)/*.h $(STAGING_DIR)/usr/include/maam_lib/maam_lulib; \
		$(INSTALL_DIR) $(1)/usr/lib; \
		$(CP) $(MAAM_LULIB_PATH)/*.so $(1)/usr/lib; \
		$(INSTALL_DIR) $(1)/$(TARGET_WEB_PATH); \
		$(CP) $(MAAM_JSLIB_PATH)/*.js $(1)/$(TARGET_WEB_PATH); \
	fi

	# 安裝開機自動執行 mcm_daemon 和 mini_httpd 的設定檔.
	$(INSTALL_DIR) $(1)/etc/init.d
	$(INSTALL_BIN) ./files/mint-cm.init $(1)/etc/init.d/mint-cm
endef

$(eval $(call BuildPackage,$(PKG_NAME)))

06.  mint-cm/files 目錄內加入開機自動執行 mcm_daemon 和 mini_httpd 的設定檔, 檔名為 mint-cm.init, 內容 :
#!/bin/sh /etc/rc.common

START=1

start() {
	mcm_daemon \
		-l /etc/mcm_module.lib \
		-m /etc/mcm_model_profile.txt \
		-d /etc/config/mcm_store_profile_default.txt \
		-c /etc/config/mcm_store_profile_current.txt &

	mini_httpd \
		-D -C /etc/mini_httpd.conf &
}

07.  在 OpenWRT 根目錄使用 make menuconfig, 啟用 mint-cm 並儲存 :
Base system  --->
  <*> mint-cm

08.  在 OpenWRT 根目錄使用 make V=s 開始編譯.


其他程式使用 MintCM 和 MintAAM

其他用戶端程式使用 MintCM 的注意事項 :

01.  給 OpenWRT 使用的 Makefile 需要加上依賴 mint-cm :
DEPENDS:=+mint-cm

02.  編譯程式的 Makefile 部分參考 #03-02#, 不過因為 mcm_lulib_api 相關的標頭檔和函式庫在編譯 mint-cm 時會複製到 OpenWRT 指定的開發目錄, OpenWRT 編譯其他程式會參考指定的開發目錄, 所以 標頭檔路徑設定 (-I$(MCM_PATH)), 函式庫路徑設定 (-L$(MCM_LULIB_PATH)) 不需要, 只需要加上 設定鏈結 mcm_lulib_api 函式 (-lmcm_lulib_api).

03.  程式需要使用的標頭檔原本是在 #03-02#, 因為 OpenWRT 編譯其他程式會參考指定的開發目錄, 所以要改為 :
#include <mcm_lib/mcm_lheader/mcm_type.h>
#include <mcm_lib/mcm_lheader/mcm_size.h>
#include <mcm_lib/mcm_lheader/mcm_connect.h>
#include <mcm_lib/mcm_lheader/mcm_return.h>
#include <mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h>
#include <mcm_lib/mcm_lulib/mcm_lulib_api.h>


其他核心端程式使用 MintCM 的注意事項 :

01.  給 OpenWRT 使用的 Makefile 需要加上依賴 mint-cm :
DEPENDS:=+mint-cm

02.  編譯程式的 Makefile 部分參考 #03-03#, 不過因為 mcm_lklib_api 相關的標頭檔和函式庫在編譯 mint-cm 時會複製到 OpenWRT 指定的開發目錄, OpenWRT 編譯其他程式會參考指定的開發目錄, 所以 標頭檔路徑設定 (-I$(MCM_PATH)) 不需要.

03.  程式需要使用的標頭檔原本是在 #03-03#, 因為 OpenWRT 編譯其他程式會參考指定的開發目錄, 所以要改為 :
#include <mcm_lib/mcm_lheader/mcm_type.h>
#include <mcm_lib/mcm_lheader/mcm_size.h>
#include <mcm_lib/mcm_lheader/mcm_connect.h>
#include <mcm_lib/mcm_lheader/mcm_return.h>
#include <mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h>
#include <mcm_lib/mcm_lklib/mcm_lklib_api.h>


其他用戶端程式使用 MintAAM 的注意事項 :

01.  給 OpenWRT 使用的 Makefile 需要加上依賴 mint-cm :
DEPENDS:=+mint-cm

02.  編譯程式的 Makefile 部分參考 #10-04#, 不過因為 maam_lulib_api 相關的標頭檔和函式庫在編譯 mint-cm 時會複製到 OpenWRT 指定的開發目錄, OpenWRT 編譯其他程式會參考指定的開發目錄, 所以 標頭檔路徑設定 (-I$(MAAM_PATH)), 函式庫路徑設定 (-L$(MAAM_LULIB_PATH)) 不需要, 只需要加上 設定鏈結 mcm_lulib_api 函式 (-lmcm_lulib_api).

03.  程式需要使用的標頭檔原本是在 #10-04#, 因為 OpenWRT 編譯其他程式會參考指定的開發目錄, 所以要改為 :
#include <maam_lib/maam_lulib/maam_lulib_api.h>