diff --git a/hpvm/scripts/llvm_installer.sh b/hpvm/scripts/llvm_installer.sh
index f9600b8fc3b83a93585338f6863d7cafcedd8f79..3ed7fd3a951d27dedc9b84adf82835a0eedbd1e2 100755
--- a/hpvm/scripts/llvm_installer.sh
+++ b/hpvm/scripts/llvm_installer.sh
@@ -231,6 +231,8 @@ if [ ! -d $INSTALL_DIR ]; then
   mkdir -p $INSTALL_DIR
 fi
 
+export PATH=$BUILD_DIR/bin:$PATH
+
 cd $BUILD_DIR
 echo cmake ../$LLVM_SRC -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DLLVM_TARGETS_TO_BUILD=$TARGET  -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR
 cmake ../$LLVM_SRC -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DLLVM_TARGETS_TO_BUILD=$TARGET  -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR
diff --git a/hpvm/tools/py-approxhpvm/CMakeLists.txt b/hpvm/tools/py-approxhpvm/CMakeLists.txt
index 0d6a7fe71bd78f987dfcd7e7f5c6831154c065e7..e46c45623f13034e1cb4c5b1ed2434ec40d4c12c 100644
--- a/hpvm/tools/py-approxhpvm/CMakeLists.txt
+++ b/hpvm/tools/py-approxhpvm/CMakeLists.txt
@@ -52,8 +52,8 @@ set(
 )
 add_custom_command(
     OUTPUT ${PROJECT_BINARY_DIR}/bin/approxhpvm.py
-    COMMAND mv ${CMAKE_CURRENT_BINARY_DIR}/main.py ${PROJECT_BINARY_DIR}/bin/approxhpvm.py
+    COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/main.py ${PROJECT_BINARY_DIR}/bin/approxhpvm.py
     COMMAND chmod +x ${PROJECT_BINARY_DIR}/bin/approxhpvm.py
     DEPENDS ${DEPS} ${CMAKE_CURRENT_BINARY_DIR}/main.py
 )
-add_custom_target(approxhpvm.py DEPENDS ${PROJECT_BINARY_DIR}/bin/approxhpvm.py)
+add_custom_target(approxhpvm.py ALL DEPENDS ${PROJECT_BINARY_DIR}/bin/approxhpvm.py)
diff --git a/hpvm/tools/py-approxhpvm/main.py.in b/hpvm/tools/py-approxhpvm/main.py.in
index 9305b8a25a18541f545a1925947b1abe4465a3f8..752a7609ca0831838949b037ac7b8c0323ac8871 100644
--- a/hpvm/tools/py-approxhpvm/main.py.in
+++ b/hpvm/tools/py-approxhpvm/main.py.in
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 import argparse
 import os
 from pathlib import Path
@@ -7,7 +7,7 @@ from typing import List, Union, Optional
 PathLike = Union[Path, str]
 
 HPVM_PROJECT_DIR = Path("@LLVM_PROJECT_DIR@") / "tools/hpvm"
-LLVM_BUILD_DIR = Path("@LLVM_BUILD_DIR@")
+LLVM_BUILD_DIR = Path("@LLVM_BUILD_DIR@") / "bin"
 CUDA_TOOLKIT_ROOT_DIR = Path("@CUDA_TOOLKIT_ROOT_DIR@")
 TENSOR_RUNTIME_LIBS = "@TENSOR_RUNTIME_LIBS@".split(";")
 AVAILABLE_PASSES = "@AVAILABLE_PASSES@".split(";")
@@ -74,7 +74,7 @@ def hpvm_c_to_ll(
     includes = [f"-I{path}" for path in INCLUDE_DIRS + extra_includes]
     flags = [f"-{flg}" for flg in (flags or []) + COMPILE_FLAGS]
     return [
-        "clang++", *includes, *flags, "-emit-llvm", "-S",
+        str(LLVM_BUILD_DIR / "clang++"), *includes, *flags, "-emit-llvm", "-S",
         str(src_file), "-o", str(target_file)
     ]
 
@@ -114,14 +114,14 @@ def opt_codegen_tensor(
 
 
 def link_hpvm_rt(src_file: PathLike, target_file: PathLike) -> List[str]:
-    return ["llvm-link", str(src_file), HPVM_RT_PATH, "-o", str(target_file)]
+    return [str(LLVM_BUILD_DIR / "llvm-link"), str(src_file), HPVM_RT_PATH, "-o", str(target_file)]
 
 
 def link_binary(src_file: PathLike, target_file: PathLike) -> List[str]:
     linker_dir_flags = [f"-L{path}" for path in LINK_DIRS]
     linker_lib_flags = [f"-l{lib}" for lib in LINK_LIBS]
     return [
-        "clang++", str(src_file), *TENSOR_RUNTIME_LIBS, "-o", str(target_file),
+        str(LLVM_BUILD_DIR / "clang++"), str(src_file), *TENSOR_RUNTIME_LIBS, "-o", str(target_file),
         *linker_dir_flags, *linker_lib_flags
     ]
 
@@ -138,7 +138,7 @@ def _run_opt(
     load_passes_strs = [s for pass_ in pass_names for s in ["-load", f"{pass_}.so"]]
     pass_flags_strs = [f"-{flag}" for flag in pass_flags]
     return [
-        "opt", *load_passes_strs, *pass_flags_strs,
+        str(LLVM_BUILD_DIR / "opt"), *load_passes_strs, *pass_flags_strs,
         "-S", str(src_file), "-o", str(target_file)
     ]