|
|
@@ -1,15 +1,15 @@
|
|
|
# 自动源码扫描 {#autoscan-sourcecode}
|
|
|
|
|
|
-对于一份工程源码,可以不用编写makefile,也不用编写各种make相关的工程描述文件(例如:xmake.lua,makefile.am, cmakelist.txt等)
|
|
|
+对于一份工程源码,可以不用编写 makefile,也不用编写各种 make 相关的工程描述文件(例如:xmake.lua、makefile.am、CMakeLists.txt 等)。
|
|
|
|
|
|
-xmake就可以直接编译他们,这是如何做到的呢,简单来说下实现原理:
|
|
|
+xmake 就可以直接编译它们,这是如何做到的呢?简单来说下实现原理:
|
|
|
|
|
|
-1. 首先扫描当前目录下,xmake所以支持的所有源代码文件
|
|
|
-2. 分析代码,检测哪些代码拥有main入口函数
|
|
|
-3. 所有没有main入口的代码编译成静态库
|
|
|
-4. 带有main入口的代码,编译成可执行程序,同时链接其他静态库程序
|
|
|
+1. 首先扫描当前目录下,xmake 所支持的所有源码文件
|
|
|
+2. 分析代码,检测哪些代码拥有 main 入口函数
|
|
|
+3. 所有没有 main 入口的代码编译成静态库
|
|
|
+4. 带有 main 入口的代码,编译成可执行程序,同时链接其他静态库程序
|
|
|
|
|
|
-这种代码扫描和智能编译,非常简单,目前xmake还不支持多级目录扫描,只对单级目录的代码进行扫描编译。。
|
|
|
+这种代码扫描和智能编译,非常简单,目前 xmake 还不支持多级目录扫描,只对单级目录的代码进行扫描编译。。
|
|
|
|
|
|
## 使用场景
|
|
|
|
|
|
@@ -28,7 +28,7 @@ please input: n (y/n)
|
|
|
y
|
|
|
```
|
|
|
|
|
|
-另外, 当存在其他构建系统标识性文件的时候(比如 CMakeLists.txt), 不会触发自动生成 xmake.lua 的流程, 而是首先触发自动探测构建系统并编译。
|
|
|
+另外,当存在其他构建系统标识性文件时(比如 CMakeLists.txt),不会触发自动生成 xmake.lua 的流程,而是首先触发自动探测构建系统并编译。
|
|
|
|
|
|
```sh
|
|
|
$ xmake f -y
|
|
|
@@ -36,11 +36,11 @@ $ xmake f -y
|
|
|
|
|
|
## 开源代码的移植和编译
|
|
|
|
|
|
-虽然这种方式,并不是非常智能,限制也不少,但是对于想临时写些代码进行编译运行,或者临时想交叉编译一些简单的开源库代码
|
|
|
+虽然这种方式并不是非常智能,限制也不少,但是对于想临时写些代码进行编译运行,或者临时想交叉编译一些简单的开源库代码
|
|
|
|
|
|
-这种方式已经足够使用了,下面看下一个实际的例子:
|
|
|
+这种方式已经足够使用了,下面看一个实际的例子:
|
|
|
|
|
|
-我下载了一份zlib-1.2.10的源码,想要编译它,只需要进入zlib的源码目录执行:
|
|
|
+我下载了一份 zlib-1.2.10 的源码,想要编译它,只需要进入 zlib 的源码目录执行:
|
|
|
|
|
|
```sh
|
|
|
$ cd zlib-1.2.10
|
|
|
@@ -50,7 +50,7 @@ please input: n (y/n)
|
|
|
y
|
|
|
```
|
|
|
|
|
|
-就行了,输入y确认后,输出结果如下:
|
|
|
+就行了,输入 y 确认后,输出结果如下:
|
|
|
|
|
|
```
|
|
|
target(zlib-1.2): static
|
|
|
@@ -132,11 +132,11 @@ clean ok!
|
|
|
build ok!👌
|
|
|
```
|
|
|
|
|
|
-通过输出结果,可以看到,xmake会去检测扫描当前目录下的所有.c代码,发现没有main入口,应该是静态库程序,因此执行xmake后,就直接编译成静态库libzlib-1.2.a了
|
|
|
+通过输出结果,可以看到,xmake 会去检测扫描当前目录下的所有 .c 代码,发现没有 main 入口,应该是静态库程序,因此执行 xmake 后,就直接编译成静态库 libzlib-1.2.a 了。
|
|
|
|
|
|
-连xmake.lua都没有编写,其实xmake在扫描完成后,会去自动在当前目录下生成一份xmake.lua,下次编译就不需要重新扫描检测了。
|
|
|
+这些 xmake.lua 都没有编写,其实 xmake 在扫描完成后,会自动在当前目录下生成一份 xmake.lua,下次编译就不需要重新扫描检测了。
|
|
|
|
|
|
-自动生成的xmake.lua内容如下:
|
|
|
+自动生成的 xmake.lua 内容如下:
|
|
|
|
|
|
```lua
|
|
|
-- define target
|
|
|
@@ -163,36 +163,36 @@ target("zlib-1.2")
|
|
|
add_files("./zutil.c")
|
|
|
```
|
|
|
|
|
|
-也许你会说,像这种开源库,直接`configure; make`不就好了吗,他们自己也有提供makefile来直接编译的,的确是这样,我这里只是举个例子而已。。
|
|
|
+也许你会说,像这种开源库,直接 `configure; make` 不就好了吗,他们自己也有提供 makefile 来直接编译的,的确是这样,我这里只是举个例子而已。。
|
|
|
|
|
|
-当然,很多开源库在交叉编译的时候,通过自带的`configure`,处理起来还是很繁琐的,用xmake进行交叉编译会更方便些。。
|
|
|
+当然,很多开源库在交叉编译的时候,通过自带的 `configure`,处理起来还是很繁琐的,用 xmake 进行交叉编译会更方便些。。
|
|
|
|
|
|
## 即时地代码编写和编译运行
|
|
|
|
|
|
-xmake的这个扫描代码编译特性,主要的目的:还是为了让我们在临时想写些测试代码的时候,不用考虑太多东西,直接上手敲代码,然后快速执行`xmake run` 来调试验证结果。。
|
|
|
+xmake 的这个扫描代码编译特性,主要的目的还是为了让我们在临时想写些测试代码的时候,不用考虑太多东西,直接上手敲代码,然后快速执行 `xmake run` 来调试验证结果。
|
|
|
|
|
|
例如:
|
|
|
|
|
|
-我想写了个简单的main.c的测试程序,打印`hello world!`,如果要写makefile或者直接通过gcc命令来,就很繁琐了,你需要:
|
|
|
+我想写一个简单的 main.c 测试程序,打印 `hello world!`,如果要写 makefile 或者直接通过 gcc 命令来,就很繁琐了,你需要:
|
|
|
|
|
|
```sh
|
|
|
gcc ./main.c -o demo
|
|
|
./demo
|
|
|
```
|
|
|
|
|
|
-最快速的方式,也需要执行两行命令,而如果用xmake,只需要执行:
|
|
|
+最快的方式,也需要执行两行命令,而如果用 xmake,只需要执行:
|
|
|
|
|
|
```sh
|
|
|
xmake run
|
|
|
```
|
|
|
|
|
|
-就行了,它会自动检测到代码后,自动生成对应的xmake.lua,自动编译,自动运行,然后输出:
|
|
|
+就行了,它会自动检测到代码后,自动生成对应的 xmake.lua,自动编译,自动运行,然后输出:
|
|
|
|
|
|
```
|
|
|
hello world!
|
|
|
```
|
|
|
|
|
|
-如果你有十几个代码文件,用手敲gcc的方式,或者写makefile的方式,这个差距就更明显了,用xmake还是只需要一行命令:
|
|
|
+如果你有十几个代码文件,用手敲 gcc 的方式,或者写 makefile 的方式,这个差距就更明显了,用 xmake 还是只需要一行命令:
|
|
|
|
|
|
```sh
|
|
|
xmake run
|
|
|
@@ -200,9 +200,9 @@ xmake run
|
|
|
|
|
|
## 多语言支持
|
|
|
|
|
|
-这种代码检测和即时编译,是支持多语言的,不仅支持c/c++,还支持objc/swift,后期还会支持golang(正在开发中)
|
|
|
+这种代码检测和即时编译,是支持多语言的,不仅支持 c/c++,还支持 objc/swift,后期还会支持 golang(正在开发中)
|
|
|
|
|
|
-例如我下载了一份fmdb的ios开源框架代码:
|
|
|
+例如我下载了一份 fmdb 的 ios 开源框架代码:
|
|
|
|
|
|
```
|
|
|
.
|
|
|
@@ -219,7 +219,7 @@ xmake run
|
|
|
└── FMResultSet.m
|
|
|
```
|
|
|
|
|
|
-想要把它编译成ios的静态库,但是又不想写xmake.lua,或者makefile,那么只需要使用xmake的这个新特性,直接执行:
|
|
|
+想要把它编译成 ios 的静态库,但是又不想写 xmake.lua,或者 makefile,那么只需要使用 xmake 的这个新特性,直接执行:
|
|
|
|
|
|
```sh
|
|
|
$ xmake f -p iphoneos; xmake
|
|
|
@@ -288,9 +288,9 @@ build ok!👌
|
|
|
|
|
|
输出结果的开头部分,就是对代码的分析结果,虽然目前只支持单级目录结构的代码扫描,但是还是可以同时支持检测和编译多个可执行文件的
|
|
|
|
|
|
-我们以libjpeg的开源库为例:
|
|
|
+我们以 libjpeg 的开源库为例:
|
|
|
|
|
|
-我们进入jpeg-6b目录后,执行:
|
|
|
+我们进入 jpeg-6b 目录后,执行:
|
|
|
|
|
|
```sh
|
|
|
$ xmake
|
|
|
@@ -503,7 +503,7 @@ clean ok!
|
|
|
build ok!👌
|
|
|
```
|
|
|
|
|
|
-可以看到,处理静态库,xmake还分析出了很多可执行的测试程序,剩下的代码统一编译成一个 libjpeg.a 的静态库,供哪些测试程序链接使用。。
|
|
|
+可以看到,处理静态库,xmake 还分析出了很多可执行的测试程序,剩下的代码统一编译成一个 libjpeg.a 的静态库,供哪些测试程序链接使用。。
|
|
|
|
|
|
```
|
|
|
target(ansi2knr): binary
|
|
|
@@ -524,7 +524,7 @@ target(wrjpgcom): binary
|
|
|
|
|
|
## 遇到的一些问题和限制
|
|
|
|
|
|
-当前xmake的这种自动分析检测还不是非常智能,对于:
|
|
|
+当前 xmake 的这种自动分析检测还不是非常智能,对于:
|
|
|
|
|
|
1. 需要特殊的编译选项
|
|
|
2. 需要依赖其他目录的头文件搜索
|
|
|
@@ -532,7 +532,7 @@ target(wrjpgcom): binary
|
|
|
4. 同目录需要生成多个静态库
|
|
|
5. 需要多级目录支持的源码库
|
|
|
|
|
|
-以上这些情况,xmake暂时还没发自动化的智能处理,其中限制1,2还是可以解决的,通过半手动的方式,例如:
|
|
|
+以上这些情况,xmake 暂时还没发自动化的智能处理,其中限制 1,2 还是可以解决的,通过半手动的方式,例如:
|
|
|
|
|
|
```sh
|
|
|
$ xmake f --cxflags="" --ldflags="" --includedirs="" --linkdirs=""; xmake
|
|
|
@@ -540,12 +540,6 @@ $ xmake f --cxflags="" --ldflags="" --includedirs="" --linkdirs=""; xmake
|
|
|
|
|
|
在自动检测编译的时候,手动配置这个源码工程需要的特殊编译选项,就可以直接通过编译了
|
|
|
|
|
|
-而限制3,暂时只能通过删源代码来解决了,就像刚才编译jpeg的代码,其实它的目录下面同时存在了:
|
|
|
+而限制 3,暂时只能通过删源代码来解决了,就像刚才编译 jpeg 的代码,其实它的目录下面同时存在了:
|
|
|
|
|
|
-```
|
|
|
-jmemdos.c
|
|
|
-jmemmac.c
|
|
|
-jmemansi.c
|
|
|
-```
|
|
|
-
|
|
|
-其中两个是没法编译过的,需要删掉后才行。。
|
|
|
+```
|