2.2 从源代码构建软件

在正式开始验证之前,我们需要在Linux中安装编译工具。


# yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils

接下来,我们分别介绍本机编译和解释编译。

2.2.1 本机编译代码

在编程语言中,C语言是本机编译。我们查看一个源代码文件,如下所示:


# cat cello.c
#include <stdio.h>
int main(void) {
    printf("Hello World, I'm DavidWei!\n");
    return 0;
}

调用C编译器gcc进行编译:


# gcc -o cello cello.c

编译成功后,我们可以执行结果输出。


# ./cello
Hello World, I'm DavidWei!

为了实现自动化构建代码,我们添加Makefile,这是大型软件开发中常用的方法。

首先创建一个Makefile,如下所示:


# cat Makefile
cello:
    gcc -o cello cello.c
clean:
    rm cello

接下来,通过make来完成编译。执行make会自动编译源代码,然后可以成功执行,如图2-1所示。

图2-1 编译并运行代码

执行make clean会删除编译结果,如图2-2所示。

图2-2 删除编译结果

在介绍了本机编译后,我们介绍解释编译。

2.2.2 解释型代码

对于用解释型编程语言编写的软件,如果是Byte Compiled语言,如Python,就需要一个编译步骤,把源代码构建成Python的语言解释器(称为CPython)的可执行文件。

我们查看一个Python的源代码,如下所示。


# cat pello.py
#!/usr/bin/env python
print("Hello World, I'm DavidWei!")

对源代码进行编译:


# python -m compileall pello.py
Compiling pello.py ...

编译成功后运行:


# python pello.pyc
Hello World, I'm DavidWei!

我们看到,对源.py文件进行字节编译后会生成一个.pyc文件,这是Python 2.7字节编译的文件类型,这个文件可以使用Python语言虚拟机运行。

查看文件类型:


# file pello.pyc
pello.pyc: python 2.7 byte-compiled

和Python相对应,无须编译的解释性代码是Raw Interpreted,如我们日常使用的bash shell。

我们看一个shell文件,如下所示。


# cat bello
#!/bin/bash
printf "Hello World, I'm DavidWei!\n"

对于Raw Interpreted源码,我们使文件可执行,然后直接运行即可,如图2-3所示。

图2-3 修改权限运行shell

在介绍了如何从源码构建软件包后,接下来我们介绍如何给软件打补丁。