import os
import sys
import subprocess
import shutil
import argparse
def run_command(command, cwd=None, check=True):
try:
print(f"run command: {' '.join(command)}")
result = subprocess.run(
command,
cwd=cwd,
check=check,
stdout=None,
stderr=None,
text=True
)
return ""
except subprocess.CalledProcessError as e:
print(f"run command failed with return code {e.returncode}")
raise
def build_project(run_mode, soc_version, auto_enable=False, testcase="all"):
original_dir = os.getcwd()
build_dir = "build"
if os.path.exists(build_dir):
print(f"clean build: {build_dir}")
shutil.rmtree(build_dir)
os.makedirs(build_dir, exist_ok=True)
try:
cmake_cmd = [
"cmake",
f"-DRUN_MODE={run_mode}",
f"-DSOC_VERSION={soc_version}",
f"-DTEST_CASE={testcase}",
".."
]
if auto_enable:
cmake_cmd.append("-DAUTO_MODE=ON")
subprocess.run(
cmake_cmd,
cwd=build_dir,
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True
)
make_cmd = ["make"]
cpu_count = os.cpu_count() or 4
make_cmd.extend(["-j", str(cpu_count)])
result = subprocess.Popen(
make_cmd,
cwd=build_dir,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True
)
while result.poll() is None:
line = result.stdout.readline()
line.strip()
if line:
print(line)
if result.returncode == 0:
print("build success")
else:
raise RuntimeError("build failed")
except subprocess.CalledProcessError as e:
print(f"build failed: {e.stdout}")
raise
except RuntimeError as e:
print("build failed")
raise
finally:
os.chdir(original_dir)
def main():
parser = argparse.ArgumentParser(description="执行st脚本")
parser.add_argument("-r", "--run-mode", required=True, help="运行模式(如 sim or npu)")
parser.add_argument("-v", "--soc-version", required=True, help="SOC版本 只支持 a3 / a5 / kirinX90 / kirin9030")
parser.add_argument("-t", "--testcase", required=True, help="需要执行的用例")
parser.add_argument("-g", "--gtest_filter", required=False, help="可选 需要执行的具体case名")
parser.add_argument("-a", "--auto-mode-enable", action='store_true', help="开启auto模式")
args = parser.parse_args()
default_soc_version = "Ascend910B1"
if args.soc_version == "a5":
default_soc_version = "Ascend950PR_9599"
elif args.soc_version == "kirinX90":
default_soc_version = "KirinX90"
elif args.soc_version == "kirin9030":
default_soc_version = "Kirin9030"
default_cases = "all"
if args.gtest_filter != None:
default_cases = args.gtest_filter
original_dir = os.getcwd()
try:
script_path = os.path.abspath(__file__)
target_dir = os.path.dirname(os.path.dirname(script_path))
if args.soc_version == "a3":
target_dir = target_dir + "/npu/a2a3/src/st"
elif args.soc_version == "kirinX90" or args.soc_version == "kirin9030":
target_dir = target_dir + "/npu/kirin9030/src/st"
else :
target_dir = target_dir + "/npu/a5/src/st"
print(f"target_dir: {target_dir}")
os.chdir(target_dir)
build_project(args.run_mode, default_soc_version, args.auto_mode_enable, args.testcase)
except Exception as e:
print(f"run failed: {str(e)}", file=sys.stderr)
sys.exit(1)
os.chdir(original_dir)
if __name__ == "__main__":
main()