阅读提示:

本文已过时。

1 简介

fishie 是一个基于 Kittie.Concept 的远程编译平台。它可以在 Windows 机器上远程调用 Linux 机器上的编译器编译指定工程,并把编译结果返回 Windows 机器。由于 fishie 是一个基于命令行的程序,因此它可以嵌入目前任何一个主流的集成开发环境中工作。目前 fishie 将 gcc 返回的错误信息格式调整为 VC7 格式,因此在 VC7 下使用 fishie 编译出错时可以直接双击跳转到出错行。

fishie 是 Kittie.Concept for Win32 MinGW 套装中的组件,你可以在这里下载到 Kittie for Win32 MinGW 套装。如果你仅需要使用远程编译功能,不需要使用 MinGW 编译 Windows 程序,你可以不安装 MinGW。

fishie 嵌入 Visual Studio .NET 2003 的工作截屏如下:

fishie_vs_remote

2 工作原理

要进行远程编译,我们要完成三项任务。

首先,我们需要将待编译的项目文件上传到 Linux 服务器上。kittie 能够将 VC7 工程中使用到的所有文件名列表导出为一个文本文件,便于其它程序进行处理。fishie 获得 kittie 导出的文件列表后,根据时间戳判断需要上传的文件,并使用指定的协议上传。

其次,将 Windows 工程文件转换为 Linux 工程文件。kittie 是一个支持多种文件格式的工程文件转换程序,我们使用 kittie 将 VC7 下的工程文件转换为 Linux 下的 Makefile,为编译做好准备。

然后,第三项任务是进行编译,并将编译过程与输出实时反馈到客户计算机上。fishie 使用指定协议连接远程计算机,获取编译结果,并将 gcc 的输出格式调整为 VC7 IDE 能够直接识别的格式,使 VC7 能够使用“双击跳转到出错行”的功能,方便了不熟悉 Linux 的程序员进行 Linux 下的开发。

3 需要安装的软件

Windows 下需要安装 Kittie.Concept for Win32 MinGW 套装。顺便安装一份 MinGW 更好,但这不是必须的。Linux 下需要安装 Kittie.Concept for Linux。安装步骤请参看安装包内的说明书。

4 使用方法

4.1 创建编译指令文件 PROJECT

要使用 fishie,首先创建一个 fishie 指令文件 PROJECT,文件格式如下:

; 将本地工程文件上传到远程机器时使用的配置
[Transfer]
; 上传使用的协议。目前支持的协议有 ftp 和 file 两种。
; Protocol = ftp
Protocol = file
; 之后是协议相关的设置,每种协议支持的配置项不同。
; FTP 上传需要提供的配置选项为:
; FTP 服务器的地址、用户名、密码以及端口号等
; Server = user:user@myserver.com:21
; 上传文件所在的目录名
; Path = /code/ftplite/
; FILE 上传需要提供的配置选项为:
; 上传文件所到的路径。
Path = I:\code\ftplite\

; 远程编译 Linux 机器上的工程时使用的配置
[Build]
; 远程编译使用的协议。目前支持的协议有 ssh。
Protocol = ssh
; 之后是协议相关的设置,每种协议支持的配置项不同。
; SSH 远程编译需要提供的配置选项为:
; SSH 服务器的地址、用户名及端口号
Server = edward@myserver.com -p 22
; 待编译文件所在的目录名
Path = ~/ftproot/code/ftplite/

目前上传文件支持的协议有 ftp、file 两种。

FTP 需要的选项有两个:Server 和 Path。Server 配置项中指定了服务器的地址、用户名、密码与端口号,Path 指定上传文件所在的目录名。

File 协议用于使用 Samba 上传文件,上传之前需要将 Linux 机器下的一个目录映射为 Windows 下的网络硬盘。File 协议需要的选项有一个:Path,Path 指定上传文件所到的目录名对应的 Windows 网络磁盘路径。

目前远程编译工程支持的协议有 ssh 一种。

SSH 需要的选项有两个:Server 和 Path。Server 配置项中制定了服务器的地址、用户名与端口号,Path 指定待编译文件所在的目录名。

4.2 设置 SSH 信任

从上文可以看出,远程编译时并没有提供密码配置项,而程序运行时也不会弹出界面让用户输入密码,因此为了能够正常使用 ssh 远程编译,需要将本地计算机设置为远程计算机的信任主机,以便不输入密码进行连接和编译。关于 ssh 自动登录的使用,请参看这里

首先,我们需要生成一个公钥、私钥对。打开 MinGW 控制台,输入“ssh-keygen -t rsa”,然后一路回车,就能够生成一对公钥、私钥对。生成的公钥、私钥对存放在 %HOME%\.ssh 下,公钥叫 id_rsa.pub,私钥叫 id_rsa。

在使用 fishie 之前,请至少使用 ssh 登录目的服务器一次,将服务器加入到本机的 known_hosts 列表中,以便其后正常使用。如果登录时没有提示输入密码,说明配置 SSH 信任成功。

4.3 编写 kmk 工程文件补丁

fishie 在编译时会自动将 vcproj 导出为 kmk 格式,文件名为同名的 .vc 文件,如果你在编写 kmk 文件的时候想复用已有的 vcproj 工程文件,你可以在你的 kmk 中包含 VC 导出的 .vc 文件,然后根据需要修改配置。

以下是一个 kmk 工程文件补丁的例子:

#include "ftplite.vc"

[Debug]
#platform linux
C_PREPROC = -DLINUX -D_DEBUG -D_USE_SIGNAL -D_USE_RELOAD
LIBS = -lpthread
#end platform
#platform freebsd
C_PREPROC = -DUNIX -D_DEBUG -D_USE_SIGNAL -D_USE_RELOAD
LIBS = -lc_r
#end platform
#platform sunos
C_PREPROC = -DUNIX -D_DEBUG -D_USE_SIGNAL -D_USE_RELOAD
LIBS = -lpthread -lsocket
#end platform

[Release]
#platform linux
C_PREPROC = -DLINUX -DNDEBUG -D_USE_SIGNAL -D_USE_RELOAD
LIBS = -lpthread
#end platform
#platform freebsd
C_PREPROC = -DUNIX -DNDEBUG -D_USE_SIGNAL -D_USE_RELOAD
LIBS = -lc_r
#end platform
#platform sunos
C_PREPROC = -DUNIX -DNDEBUG -D_USE_SIGNAL -D_USE_RELOAD
LIBS = -lpthread -lsocket
#end platform

4.4 编译

正确配置了 PROJECT 文件后,并编写了相应的 kmk 补丁后,就可以进行远程编译了。远程编译的命令行与本地编译类似,只需要将所有 kittiemake 替换为 fishie 就可以了,例如:

fishie CFG=Release clean
fishie CFG=Release all

4.5 嵌入 Visual Studio 2003

在 VS 2003 中创建“生成文件”配置项,并在编译的命令行中调用 fishie 进行编译即可。

fishie_vs_configtype

对于 Debug 配置,“生成”使用的命令行如下:

call fishie.bat CFG=Debug
@echo off

“全部重新生成”使用的命令行如下:

call fishie.bat CFG=Debug clean
@echo off
call fishie.bat CFG=Debug
@echo off

“清除”使用的命令行如下:

call fishie.bat CFG=Debug clean
@echo off

对于 Release 配置,只要把上面命令行中的所有 Debug 替换为 Release 就可以了。

fishie_vs_cmdline

fishie 将 gcc 的输出格式进行了调整,使 VS 2003 能够直接识别,因此在编译出错的时候可以直接双击跳转到出错行。

fishie_vs_jump

5 注意事项

Kittie.Concept 目前不支持 VC6 的工程文件,所以暂时还只能嵌入 Visual Studio 2003 使用。VC6 的工程文件描述能力比较低下,作者暂时没有打算支持它的意图。当然如果有足够的需求的话,也许能够让作者改变主意。

由于 Kittie.Concept 使用 VC 工程文件来生成 Makefile,因此如果你往当前工程中添加或删除了文件,或是修改了项目设置的时候,请单击“保存全部”将工程文件也保存到硬盘上,否则可能会导致远程的 Makefile 与 VC 中的工程不同步。

远程编译只是 Kittie.Concept 的一项功能,远程调试也不是 Kittie.Concept 的职责。作者有意向开发能够嵌入 Visual Studio 的远程调试工具,但短期内不可能取得成效,请大家不要抱太大希望。