Files
2024-03-16 16:08:51 +08:00
..
2022-09-16 11:48:59 +08:00
2022-09-16 11:48:59 +08:00
2020-12-31 15:28:51 +08:00
2022-09-16 11:48:59 +08:00
2022-09-16 11:48:59 +08:00
2020-12-31 15:28:51 +08:00
2020-12-31 15:28:51 +08:00
2024-03-16 16:08:51 +08:00
2020-12-31 15:28:51 +08:00
2021-09-24 10:06:20 +08:00

####################################################################
## pljava的编译说明
###################################################################

### pljava编译步骤
1. pljava编译必须在执行configure和make install之后,因为里面需要使用configure生成的Makefile和utils/errcodes.h文件(注意,make install编译失败也没有关系,只需要保证utils/errcodes.h等文件生成了即可)
2. 执行git clean -xdf保证干净的源代码目录
3. 然后执行./build.sh -m all完成编译

### pljava编译策略
1. libpljava.so和pljava.jar是PLJAVA必须的两个组件,在完成gaussdb的编译以后,libpljava.so将存放于$GAUSSHOME/lib/libpljava.so,pljava.jar将存放于$GAUSSHOME/lib/postgresql/java/pljava.jar
2. udstools.py是针对云上DWS,使用gs_extend_library上传OBS中的jar包时必须使用的,因一般不会变更,因此udstools.py会预先编译好,存放在Code/binarylibs/xxxxx(当前平台)/pljava/下,同时通过git跟踪修改。
3. 因考虑到PLJAVA中的JAVA代码一般不会变更,且仅依赖于JDK构建工具,同时.jar也是跨平台的,因此pljava.jar会预先编译好,而不是每次编译gaussdb时都进行编译。预先编译好的pljava.jar会存放在Code/binarylibs/xxxxx(当前平台)/pljava/下,同时通过git跟踪修改。
4. 因考虑到PLJAVA中的C代码的编译依赖于内核代码,而内核代码会高频率改动,因此libpljava.so会随着gaussdb的编译每次进行编译

####################################################################
## pljava build.sh编译选项详解
####################################################################

### ./build.sh -m all
该命令等价于顺序执行如下命令:
 ./build.sh -m build
 ./build.sh -m shrink
 ./build.sh -m dist
 ./build.sh -m clean

### ./build.sh -m build
该命令主要用于从一个干净的库(源代码还处于压缩包状态)去编译pljava.jar和pljava.so,该命令的执行过程为:
1. 对源文件pljava_1.5.2_src.zip中的pljava-1_5_2.tar.gz进行解压
2. 使用huawei_pljava.patch对源打上patch,此时会得到udstools.py、patch后用于编译的pljava代码,以及用于编译的Makefile,
   并在打完patch以后进入到代码目录plajva-1.5.2中
3. 执行make -sj pljava,此时会按照如下步骤进行编译
-3.1 编译pljava-api.jar
-3.2 编译pljava.jar,pljava.jar依赖pljava-api.jar,必须pljava-api.jar编译完成才能够对pljava.jar进行编译,因为编译时需要使用pljava-api.jar中的函数,最后会将编译出来的jar包跟pljava-api.jar压缩在一起形成新的最终的pljava.jar
-3.3 然后利用javah命令对pljava.jar生成的.h文件,javah依赖3.2编译出的pljava/target/class目录下的.class文件
4. 执行make -sj all, 此时会按照如下步骤进行编译
-4.1 重复步骤3,但是没关系,Makefile会发现并没有新增修改,因此不会重复编译
-4.2 执行make pljava_so生成libpljava.so,libpljava.so依赖javah,即3.3所生成的.h头文件
-4.3 将编译出的libpljava.so放在pljava/target/libpljava.so下,然后放到lib目录中
5. 执行make,make跟make all是等价的,相当于也是重复执行,但是没关系,Makefile会发现没有新增修改,因此不会重复编译
   最后得到的有用文件为:
   ./pljava-1_5_2/udstools.py
   ./pljava-1_5_2/lib/libpljava.so
   ./pljava-1_5_2/pljava/target/pljava.jar

### ./build.sh -m shrink
该命令的作用是将有用的文件复制出来。
每个开源软件完成编译后,其有效文件都是存储在这自己目录下的install_comm_dist和install_llt_dist两个目录中。
其中install_llt_dist是用来支撑蝴蝶工具扫描的,install_comm_dist内则是最终使用的文件。
两者的编译选项可能存在不同。但是对PLJAVA来说,并未进行区分。
该命令的具体执行过程为:
1. 复制./pljava-1_5_2/lib/libpljava.so到install_comm_dist/lib和install_llt_dist/lib下
2. 复制./pljava-1_5_2/udstools.py和./pljava-1_5_2/pljava/target/pljava.jar到install_comm_dist/java和install_llt_dist/java下

### ./build.sh -m dist
该命令将install_comm_dist和install_llt_dist复制到当前平台的Code/binarylibs/xxxxx(当前平台)/pljava/下。
只有复制到Code/binarylibs/xxxxx(当前平台)/pljava/下,在编译gaussdb时才能使用上。

### ./build.sh -m clean
该命令用于清理。
将删除open_source/pljava下编译(包括临时)文件及log等,但不会清理放在Code/binarylibs/xxxxx(当前平台)/pljava/下的文件。

### ./build.sh -m only_so
该命令将只编译libpljava.so文件,并将其复制到Code/binarylibs/xxxxx(当前平台)/pljava/目录下。
它依赖于pljava-so/目录下源码文件,和pljava/target/javah-include下利用javah预先生成的.h文件。
它的具体执行步骤是:
1. 根据patch-mds5值判断是否需要重新打patch,如果需要则解压源文件并对源代码打patch
-1.1 判断是否存在tmp_id.dat文件,一旦编译过,那么就会存在tmp_id.dat文件,记录最后一次编译的patch的md5值
-1.2 如果1.1不存在,表示从未编译过;或文件存在,但里面的值与patch_ids.dat对比失败,则表示不是最新的patch,则重新打patch
2. 执行make pljava_so生成libpljava.so
3. 将libpljava.so复制到install_comm_dist/lib和install_llt_dist/lib
4. 将libpljava.so复制到Code/binarylibs/xxxxx(当前平台)/pljava/目录下

### ./build.sh -m patch_md5
该命令对huawei_pljava.patch生成md5并写入patch_ids.dat中

####################################################################
## 如何正确使用编译选项
####################################################################

### 何时使用./build.sh -m build
1. 首次编译PLJAVA,并希望保留patch后的代码进行再开发时
2. 修改了huawei_pljava.patch或升级替换JDK版本时,确保该命令可以正确编译并得到预期结果

### 何时使用./build.sh -m only_so
1. gaussdb在编译时会调用该命令去编译libpljava.so,用来保证如果内核代码变化,libpljava.so能够被正确的编译
2. 开发人员在对PLJAVA源码中的C代码进行开发过程中,需要多次对libpljava.so进行调试。
   此时我们假设我们已经执行过./build.sh -m build,并在编译后的C源码上进行修改,那么此时只需要对libpljava.so进行编译即可。
   编译后将libpljava.so拷贝到$GAUSSHOME/lib/libpljava.so下,重启集群即可测试新的libpljava.so了

### 何时使用./build.sh -m patch_md5
1. huawei_pljava.patch文件产生修改时(注意,PLJAVA代码变动时,需重新生成huawei_pljava.patch)

####################################################################
## 如何对PLJAVA进行开发
####################################################################
1. 执行git clean -xdf保证干净的源代码目录
2. 执行./build.sh -m build获取到打完patch后的最新的PLJAVA代码
3. 对最新的PLJAVA代码基础上进行开发
4. 开发完成后,应根据修改情况对代码仓中PLJAVA相关组件进行更新,请参考#哪些场景需要考虑PLJAVA编译问题

####################################################################
## 哪些场景需要考虑重新编译PLJAVA
####################################################################
### JDK升级
如果JDK版本进行了升级,则需要对PLJAVA进行重新编译。
目前编译pljava.jar所使用的是Code/buildtools/xxxxx(当前平台)/huaweijdk8/jdk1.8.0_262来进行编译,
为了保证pljava-so,pljava-api,pljava都可以单独编译,因此JAVA_HOME是硬编码到以下Makefile中(后续可以考虑改进):
./pljava-1_5_2/Makefile
./pljava-1_5_2/pljava-so/Makefile
./pljava-1_5_2/pljava-api/Makefile
./pljava-1_5_2/pljava/Makefile

因此如果JDK版本进行了升级,则需要对PLJAVA进行重新编译。重新编译分为两种情况:

#### JDK为小版本升级,目录仍然为Code/buildtools/xxxxx(当前平台)/huaweijdk8/jdk1.8.0_262没变化
1. 执行git clean -xdf保证干净的源代码目录
2. 执行./build.sh -m all得到./install_comm_dist/java/pljava.jar
3. 将./install_comm_dist/java/pljava.jar拷贝到binarylibs的每个平台下
   即:Code/binarylibs/xxxxx(所有平台)/pljava/comm/java/pljava.jar
4. 将./install_llt_dist/java/pljava.jar拷贝到binarylibs的每个平台下
   即:Code/binarylibs/xxxxx(所有平台)/pljava/llt/java/pljava.jar
5. git add Code/binarylibs/xxxxx(所有平台)/pljava/*
6. git commit

#### JDK为大版本升级,目录已经变更为其他目录了
1. vi huawei_pljava.patch,搜索所有的JAVA_HOME,并将里面的路径(huaweijdk8/jdk1.8.0_262)修改为正确的路径,之后保存
2. 执行./build.sh -m patch_md5更新patch的md5值
3. 执行**JDK小版本升级**中的步骤1-4
4. git add Code/binarylibs/xxxxx(所有平台)/pljava/* huawei_pljava.patch patch_ids.dat
5. git commit

####################################################################
### PLJAVA中JAVA代码需变更
例如JDK进行大版本升级时,有可能PLJAVA中的JAVA代码存在兼容性问题需要适配,或者是因为版本上的某些整改等,
导致PLJAVA中的JAVA代码变化时,必须对PLJAVA进行重新编译
1. 如果开发过程中执行过编译,请清理掉所有的.class,.o以及javah编译出来的.h文件,它们一般会存放在各级的target目录下
2. 对修改后的pljava-1_5_2重命名为pljava-1_5_2-new(建议在其他目录也备份,因为很容易编译时误删)
3. 解压源文件,unzip pljava_1.5.2_src.zip && tar -xf pljava_1.5.2_src/pljava-1_5_2.tar.gz
4. 执行diff -ruN pljava-1_5_2 pljava-1_5_2-new > huawei_pljava.patch 生成新的patch文件
5. 执行./build.sh -m patch_md5更新patch的md5值
6. 执行**JDK小版本升级**中的步骤1-4
7. git add Code/binarylibs/xxxxx(所有平台)/pljava/* huawei_pljava.patch patch_ids.dat
8. git commit

### PLJAVA中C代码需变更
完成对pljava-so目录下的C代码的开发后,需要更新PLJAVA中的patch,以保证gaussdb编译时能够获得最新的libpljava.so
1. 执行**PLJAVA中JAVA代码需变更**的步骤1-5
2. git add huawei_pljava.patch patch_ids.dat
3. git commit

####################################################################
### PLJAVA中udstools.py变更
例如安全告警需要对udstools.py进行变更时,需要重新处理
1. 如果新的udstools.py的总行数未变化,则仅需要修改huawei_pljava.patch。
   vi huawei_pljava.patch,搜索udstools.py,在其中进行修改
2. 如果改动带来行数变化,则使用 diff -ruN udstools.py udstools.py-new,并将内容在huawei_pljava.patch中对应位置进行替换
3. 执行./build.sh -m patch_md5更新patch的md5值
4. 重命名新的udstools.py-new为udstools.py放置于binarylibs的每个平台下
   即:Code/binarylibs/xxxxx(所有平台)/pljava/comm/udstools.py和Code/binarylibs/xxxxx(所有平台)/pljava/llt/udstools.py
5. git add Code/binarylibs/xxxxx(所有平台)/pljava/* huawei_pljava.patch patch_ids.dat
6. git commit

####################################################################
### PLJAVA中Makefile变更
1. 如果新的Makefile的总行数未变化,则仅需要修改huawei_pljava.patch
   vi huawei_pljava.patch,搜索对应的Makefile,在其中进行修改
2. 如果改动带来行数变化,则使用 diff -ruN Makefile Makefile-new,并将内容在huawei_pljava.patch中对应位置进行替换
3. 执行./build.sh -m patch_md5更新patch的md5值
4. git add huawei_pljava.patch patch_ids.dat
5. git commit