diff --git a/hdc/gn-gen/res/win64/ohos.toolchain.cmake b/hdc/gn-gen/res/win64/ohos.toolchain.cmake index a237bad9a9e42b8410097e2827551a5eb6f24cf3..bfccb34857b93f2f152460a94c325b6008a52c22 100755 --- a/hdc/gn-gen/res/win64/ohos.toolchain.cmake +++ b/hdc/gn-gen/res/win64/ohos.toolchain.cmake @@ -14,16 +14,16 @@ set(CMAKE_TOOLCHAIN_PREFIX llvm-) set(PROJECT_ROOT CC_REPLACE_OHOS_ROOT) #指定c编译工具(确保工具链所在路径已经添加到了PATH环境变量中)和编译标志,使用clang编译时标志中必须指定--target,否则无法交叉编译。 -set(CMAKE_C_COMPILER ${PROJECT_ROOT}/prebuilts/clang/ohos/windows-x86_64/llvm/bin/clang) +set(CMAKE_C_COMPILER ${PROJECT_ROOT}/prebuilts/clang/ohos/windows-x86_64/llvm/bin/clang.exe) set(CMAKE_C_FLAGS "--target=arm-linux-ohosmusl -D__clang__ -march=armv7-a -mfloat-abi=softfp -mfpu=neon-vfpv4 -w") #指定c++编译工具(确保工具链所在路径已经添加到了PATH环境变量中)和编译标志,必须指定--target,否则无法交叉编译。 -set(CMAKE_CXX_COMPILER ${PROJECT_ROOT}/prebuilts/clang/ohos/windows-x86_64/llvm/bin/clang++) +set(CMAKE_CXX_COMPILER ${PROJECT_ROOT}/prebuilts/clang/ohos/windows-x86_64/llvm/bin/clang++.exe) set(CMAKE_CXX_FLAGS "--target=arm-linux-ohosmusl -D__clang__ -march=armv7-a -mfloat-abi=softfp -mfpu=neon-vfpv4 -w") #指定链接工具和链接标志,必须指定--target和--sysroot,其中OHOS_ROOT_PATH可通过cmake命令后缀参数来指定。 set(MY_LINK_FLAGS "--target=arm-linux-ohosmusl --sysroot=${PROJECT_ROOT}/CC_REPLACE_OHOS_TARGET/obj/third_party/musl/") -set(CMAKE_LINKER ${PROJECT_ROOT}/prebuilts/clang/ohos/windows-x86_64/llvm/bin/clang) -set(CMAKE_CXX_LINKER ${PROJECT_ROOT}/prebuilts/clang/ohos/windows-x86_64/llvm/bin/clang++) -set(CMAKE_C_LINKER ${PROJECT_ROOT}/prebuilts/clang/ohos/windows-x86_64/llvm/bin/clang) +set(CMAKE_LINKER ${PROJECT_ROOT}/prebuilts/clang/ohos/windows-x86_64/llvm/bin/clang.exe) +set(CMAKE_CXX_LINKER ${PROJECT_ROOT}/prebuilts/clang/ohos/windows-x86_64/llvm/bin/clang++.exe) +set(CMAKE_C_LINKER ${PROJECT_ROOT}/prebuilts/clang/ohos/windows-x86_64/llvm/bin/clang.exe) #指定链接库的查找路径。 set(CMAKE_SYSROOT ${PROJECT_ROOT}/CC_REPLACE_OHOS_TARGET/obj/third_party/musl/) diff --git a/hdc/gn-gen/src/analyze_cmake.js b/hdc/gn-gen/src/analyze_cmake.js index bbd6a8249790d3dab5b510b62401a6132ffac2de..f2cb8d7801d92c541fde9d1362238f82d83dd54e 100755 --- a/hdc/gn-gen/src/analyze_cmake.js +++ b/hdc/gn-gen/src/analyze_cmake.js @@ -50,13 +50,18 @@ class AnalyzeCMake { ohosToolchainCmake = path.join(buildTmp, "ohos.toolchain.cmake"); fs.writeFileSync(ohosToolchainCmake, ohosToolchainCmakeData); + ohosToolchainCmake=Tool.swapPath(ohosToolchainCmake); let args = ["..", "-DCMAKE_TOOLCHAIN_FILE=%s".format(ohosToolchainCmake), + "-G", + "Unix Makefiles", + "-DCMAKE_MAKE_PROGRAM=%s".format(Tool.swapPath(Tool.getMakeRaw())), ]; if (cmakeArgs.length > 0) { args.push(...cmakeArgs.split(",")); } - let ret = childProcess.spawn("cmake", args); + + let ret = childProcess.spawn(Tool.swapPath(Tool.getCMake()), args); ret.stdout.on('data', (data) => { Logger.info(data.toString()); }); diff --git a/hdc/gn-gen/src/analyze_command.js b/hdc/gn-gen/src/analyze_command.js index 8507f3df0fe38a98a9fb14cfde5d97feacd9c994..23e56290d41a295f302754ae09aacd56479e11f3 100755 --- a/hdc/gn-gen/src/analyze_command.js +++ b/hdc/gn-gen/src/analyze_command.js @@ -41,7 +41,7 @@ class AnalyzeCommand { static getCompileCmdId(cmd) { let cmdName = cmd.split(" ")[0]; for (let c in AnalyzeCommand.COMPILE_CMDS) { - if (cmdName.endsWith(c)) { + if (cmdName.endsWith(c) || cmdName.endsWith(c+".exe")) { return AnalyzeCommand.COMPILE_CMDS[c];//返回命令ID } } @@ -190,7 +190,7 @@ class AnalyzeCommand { static mockTarget(t) { const childProcess = require("child_process"); - childProcess.execSync("touch " + t.target); + childProcess.execSync("echo a >" + t.target); } static clangCheck1(e) { if (e.startsWith("--sysroot=") || @@ -278,6 +278,20 @@ class AnalyzeCommand { } return false; } + + static clangCheck7(local, e) { + if (e.endsWith(".c") || + e.endsWith(".o") || + e.endsWith('.o"') || + e.endsWith(".a") || + e.endsWith(".S") || + e.endsWith(".so")) { + local.ret.inputs.push(e); + return true; + } + return false; + } + static analyzeCcClang(cmd) { let local = { ret: AnalyzeCommand.resultTemplete(), @@ -286,7 +300,7 @@ class AnalyzeCommand { } while (local.p < local.eles.length) { let e = local.eles[local.p++]; - if (e.endsWith("clang")) { + if (e.endsWith("clang") || e.endsWith("clang.exe")) { local.ret.command = e; } else if (AnalyzeCommand.clangCheck1(e)) { } @@ -309,12 +323,7 @@ class AnalyzeCommand { else if (e == "-c") {//编译 local.ret.isLink = false; } - else if (e.endsWith(".c") || - e.endsWith(".o") || - e.endsWith(".a") || - e.endsWith(".so")) { - local.ret.inputs.push(e); - } + else if (AnalyzeCommand.clangCheck7(local, e)) { } else { Logger.err(cmd + "\nclang未解析参数 " + e); process.exit(); @@ -426,6 +435,7 @@ class AnalyzeCommand { e.startsWith("-mfloat-abi=") || e.startsWith("-mfpu=") || e.startsWith("-fsigned-char") || + e.startsWith("-ffast-math") || e.startsWith("-fdiagnostics-show-option")) {//需要记录到flags里面的参数 local.ret.cflags.push(e); return true; @@ -474,6 +484,8 @@ class AnalyzeCommand { e.endsWith(".cxx") || e.endsWith(".cc") || e.endsWith(".o") || + e.endsWith(".z") || + e.endsWith(".so") || e.indexOf(".so.") > 0 || e.endsWith(".a")) { local.ret.inputs.push(e); diff --git a/hdc/gn-gen/src/generate_gn.js b/hdc/gn-gen/src/generate_gn.js index 52b94cc26faa191213cfb6ec0b58fde6d58ce541..8b39c796b6f3aad5d3cdddbcc1cfb6672ab9008c 100755 --- a/hdc/gn-gen/src/generate_gn.js +++ b/hdc/gn-gen/src/generate_gn.js @@ -202,7 +202,7 @@ group("all_targets") { targetStr = `config("%s_config") {%s} %s -removeConfigs = [ +remove_configs = [ %s ] configs = [ ":%s_config" ] `.format(targetName[1], configDetail, targetStr, removeConfigs, targetName[1]); diff --git a/hdc/gn-gen/src/tool.js b/hdc/gn-gen/src/tool.js index a3c03cddae84fbdc447101377173bb9f5687573f..321a4f3b6460f57071b0c8f46f2552e3bb796a28 100755 --- a/hdc/gn-gen/src/tool.js +++ b/hdc/gn-gen/src/tool.js @@ -39,10 +39,21 @@ class Tool { return ""; } } + static getMakeRaw() { + switch (process.platform) { + case 'win32': + return path.join(Tool.CURRENT_TOOL_PATH, "res/win64/bin/make_raw.exe"); + case 'linux': + return path.join(Tool.CURRENT_TOOL_PATH, "res/linux/bin/make_raw"); + default: + Logger.err("不支持 %s 平台".format(process.platform)); + return ""; + } + } static getMake() { switch (process.platform) { case 'win32': - return path.join(Tool.CURRENT_TOOL_PATH, "res/win64/bin/gnumake.exe"); + return path.join(Tool.CURRENT_TOOL_PATH, "res/win64/bin/make.exe"); case 'linux': return path.join(Tool.CURRENT_TOOL_PATH, "res/linux/bin/make"); default: @@ -50,18 +61,21 @@ class Tool { return ""; } } + static getCMake() { + switch (process.platform) { + case 'win32': + return path.join(Tool.OHOS_PROJECT_PATH, "prebuilts/cmake/windows-x86/bin/cmake.exe"); + case 'linux': + return path.join(Tool.OHOS_PROJECT_PATH, "prebuilts/cmake/linux-x86/bin/cmake"); + default: + Logger.err("不支持 %s 平台".format(process.platform)); + return ""; + } + + } static swapPath(p, swapd) { - if (process.platform == 'win32') { - if (swapd) {// 把c:/xxx...转换成/c/xxx... - if (p[1] == ':') { - return "/" + p[0] + p.substring(2); - } - } - else {// 把/c/xxx...转换成c:/xxx... - if (p[0] == '/') { - return p[1] + ":" + p.substring(2); - } - } + while (p.indexOf("\\") >= 0) { + p = p.replace("\\", "/"); } return p; }