• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3* Licensed under the Apache License, Version 2.0 (the "License");
4* you may not use this file except in compliance with the License.
5* You may obtain a copy of the License at
6*
7* http://www.apache.org/licenses/LICENSE-2.0
8*
9* Unless required by applicable law or agreed to in writing, software
10* distributed under the License is distributed on an "AS IS" BASIS,
11* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12* See the License for the specific language governing permissions and
13* limitations under the License.
14*/
15const path = require('path');
16const fs = require("fs");
17
18class Tool {
19    constructor() {
20
21    }
22    static CURRENT_TOOL_PATH = null;//生成工具或插件所在路径,用于找到res
23    static OHOS_PROJECT_PATH = "/home/xx/ohos";
24    static OHOS_PORTING_TO = "third_party/opencv";
25    static OHOS_PRODUCT_OUTPUT_PATH = "out/rk3568-khdvk";//输出目录
26    static OHOS_SUBSYSTEM_NAME = "common";
27    static OHOS_PART_NAME = "common";
28    static globalJsonCfg = null; // cfg.json 配置文件
29    static allowedCxx = null; // cxx编译中允许处理的文件后缀列表
30    static allowedC = null; // c编译中允许处理的文件后缀列表
31
32
33    static getResAbsPath(respath) {
34        return path.join(Tool.CURRENT_TOOL_PATH, respath);
35    }
36    static getCMakeToolchain() {
37        switch (process.platform) {
38            case 'win32':
39                return path.join(Tool.CURRENT_TOOL_PATH, "res/win/ohos.toolchain.cmake");
40            case 'linux':
41                return path.join(Tool.CURRENT_TOOL_PATH, "res/linux/ohos.toolchain.cmake");
42            case 'darwin':
43                return path.join(Tool.CURRENT_TOOL_PATH, "res/mac/ohos.toolchain.cmake");
44            default:
45                Logger.err("不支持 %s 平台".format(process.platform));
46                return "";
47        }
48    }
49    static getMakeRaw() {
50        switch (process.platform) {
51            case 'win32':
52                return path.join(Tool.CURRENT_TOOL_PATH, "res/win/bin/make_raw.exe");
53            case 'linux':
54                return path.join(Tool.CURRENT_TOOL_PATH, "res/linux/bin/make_raw");
55            case 'darwin':
56                return path.join(Tool.CURRENT_TOOL_PATH, "res/mac/bin/make_raw");
57            default:
58                Logger.err("不支持 %s 平台".format(process.platform));
59                return "";
60        }
61    }
62    static getMake() {
63        switch (process.platform) {
64            case 'win32':
65                return path.join(Tool.CURRENT_TOOL_PATH, "res/win/bin/make.exe");
66            case 'linux':
67                return path.join(Tool.CURRENT_TOOL_PATH, "res/linux/bin/make");
68            case 'darwin':
69                return path.join(Tool.CURRENT_TOOL_PATH, "res/mac/bin/make");
70            default:
71                Logger.err("不支持 %s 平台".format(process.platform));
72                return "";
73        }
74    }
75    static getCMake() {
76        switch (process.platform) {
77            case 'win32':
78                return path.join(Tool.OHOS_PROJECT_PATH, "prebuilts/cmake/windows-x86/bin/cmake.exe");
79            case 'linux':
80            case 'darwin':
81                return path.join(Tool.OHOS_PROJECT_PATH, "prebuilts/cmake/linux-x86/bin/cmake");
82            default:
83                Logger.err("不支持 %s 平台".format(process.platform));
84                return "";
85        }
86
87    }
88    static swapPath(p, swapd) {
89        while (p.indexOf("\\") >= 0) {
90            p = p.replace("\\", "/");
91        }
92        return p;
93    }
94
95    static DIRECTORY_STACK = [];
96    static CURRENT_DIR = null;
97    static pushd(path) {
98        path = Tool.swapPath(path, false);
99        Tool.DIRECTORY_STACK.push(process.cwd());
100        process.chdir(path);
101        Tool.CURRENT_DIR = path;
102    }
103    static popd() {
104        let d = Tool.DIRECTORY_STACK.pop();
105        if (d) {
106            process.chdir(d);
107            Tool.CURRENT_DIR = d;
108        }
109    }
110    static BACKUP_DIRECTORY = [];
111    static backupd(bkp) {
112        Tool.BACKUP_DIRECTORY[bkp] = Tool.DIRECTORY_STACK.concat([process.cwd()]);
113    }
114    static recoverd(bkp) {
115        Tool.DIRECTORY_STACK = [].concat(Tool.BACKUP_DIRECTORY[bkp])
116        Tool.popd();
117    }
118
119    static TARGET_TYPE = {
120        NONE: 0,
121        MAKE: 1,
122        GN: 2,
123        CMAKE: 3,
124        SCONS: 4,
125        VS: 5,
126    }
127    static GENERATE_TARGET_TYPE = Tool.TARGET_TYPE.GN;
128
129    static setTarget(type) {//设置生成目标
130        Tool.GENERATE_TARGET_TYPE = type;
131    }
132    static generateTarget(projectPath, analyzeResult) {
133        switch (Tool.GENERATE_TARGET_TYPE) {
134            case Tool.TARGET_TYPE.NONE:
135                break;
136            case Tool.TARGET_TYPE.GN:
137                const { GenerateGn } = require('./generate_gn');
138                GenerateGn.generate(projectPath, analyzeResult);
139                break;
140            default:
141                Logger.err("generate target not support");
142                break;
143        }
144    }
145
146    static MOCK_ENUM = {
147        NO_MOCK: 1,
148        MOCK_RECORD: 2,
149        MOCK_RUN: 3,
150    };
151    static MOCK_TYPE = Tool.MOCK_ENUM.NO_MOCK;
152
153    /**
154     * 获取Json配置文件内容
155     * @returns
156     */
157    static getJsonCfg() {
158        if (this.globalJsonCfg == null) {
159            let jsonFilePath = path.join(Tool.CURRENT_TOOL_PATH, "res/cfg.json");
160            let jsonFile = fs.readFileSync(jsonFilePath, { encoding: "utf8" });
161            this.globalJsonCfg = JSON.parse(jsonFile);
162            this.globalJsonCfg.fileSuffix = this.globalJsonCfg.fileSuffix ? "," + this.globalJsonCfg.fileSuffix : "";
163            this.globalJsonCfg.compileflag = this.globalJsonCfg.compileflag ? "," + this.globalJsonCfg.compileflag : "";
164        }
165
166        return this.globalJsonCfg;
167    }
168
169    /**
170     * 获取cxx编译中允许处理的文件后缀名列表
171     * @returns cxx编译中允许处理的文件后缀名列表
172     */
173     static getAllowedCxx() {
174        if (this.allowedCxx == null) {
175            this.allowedCxx = {};
176            let jsonCfg = this.getJsonCfg();
177            let allowedCxxSuffix = ".cpp, .cxx, .cc, .o, .z, .so, .a" + jsonCfg.fileSuffix;
178            this.allowedCxx.fileSuffix =
179                allowedCxxSuffix.split(",").map(item => item.trim()).filter(item => item != "");
180            let allowedFlag = "--target=, -march=, -mfloat-abi=, -mfpu=, -fsigned-char, -ffast-math, -rdynamic, "
181                + "-UNDEBUG, -fno-threadsafe-statics, -fno-common, -fno-strict-aliasing, -fcolor-diagnostics, "
182                + "-fstrict-aliasing, -fdiagnostics-show-option" + jsonCfg.compileflag;
183            this.allowedCxx.compileflag = allowedFlag.split(",").map(item => item.trim()).filter(item => item != "");
184        }
185        return this.allowedCxx;
186    }
187
188    /**
189     * 获取c编译中允许处理的文件后缀名列表
190     * @returns c编译中允许处理的文件后缀名列表
191     */
192     static getAllowedC() {
193        if (this.allowedC == null) {
194            this.allowedC = {};
195            let jsonCfg = this.getJsonCfg();
196            let allowedCSuffix = '.c, .o, .o", .a, .S, .so' + jsonCfg.fileSuffix;
197            this.allowedC.fileSuffix = allowedCSuffix.split(",").map(item => item.trim()).filter(item => item != "");
198            let allowedFlag = "--target=, -march=, -mfloat-abi=, -mfpu=, -fno-common, -fcolor-diagnostics, -ggdb, "
199                + "-fno-strict-aliasing, -ldl, -flto, -fno-builtin, -fno-stack-protector, -fvisibility=default, "
200                + "-fsigned-char, -fstack-protector-strong, -fdiagnostics-show-option"
201                + jsonCfg.compileflag;
202            this.allowedC.compileflag = allowedFlag.split(",").map(item => item.trim()).filter(item => item != "");
203        }
204        return this.allowedC;
205    }
206}
207
208String.prototype.format = function (...args) {
209    var result = this;
210    let reg = new RegExp("%[sd]{1}")
211    for (let i = 0; i < args.length; i++) {
212        let p = result.search(reg)
213        if (p < 0) break;
214        result = result.substring(0, p) + args[i] + result.substring(p + 2, result.length)
215    }
216    return result;
217}
218
219try {
220    Tool.VSCODE_INST = require('vscode');
221}
222catch (err) {
223    Tool.VSCODE_INST = null;
224}
225
226module.exports = {
227    Tool
228}
229
230const Logger = require('./logger');