diff --git a/llvm-build/build.py b/llvm-build/build.py index eca3447154f078ca8b9e74e41048f64ad813f1e7..3d9cf09ffc2c6bab15f575e7d524eb3a57c1be4d 100755 --- a/llvm-build/build.py +++ b/llvm-build/build.py @@ -51,10 +51,8 @@ class BuildConfig(): self.no_build_mipsel = args.skip_build or args.no_build_mipsel self.no_build_x86_64 = args.skip_build or args.no_build_x86_64 - self.CURRENT_DIR = os.path.abspath(os.path.dirname(__file__)) - self.REPOROOT_DIR = os.path.abspath(os.path.join(self.CURRENT_DIR, '../../')) - self.LLVM_PROJECT_DIR = os.path.abspath(os.path.join(self.REPOROOT_DIR, 'toolchain', 'llvm-project')) - self.OUT_PATH = os.path.join(self.REPOROOT_DIR, 'out') + self.discover_paths() + self.TARGETS = 'AArch64;ARM;BPF;Mips;RISCV;X86' self.ORIG_ENV = dict(os.environ) self.VERSION = None # autodetected @@ -65,6 +63,20 @@ class BuildConfig(): self.CLANG_VERSION = '10.0.1' logging.basicConfig(level=logging.INFO) + def discover_paths(self): + # Location of llvm-build directory + self.LLVM_BUILD_DIR = os.path.abspath(os.path.dirname(__file__)) + + parent_of_llvm_build = os.path.basename(os.path.dirname(self.LLVM_BUILD_DIR)) + if parent_of_llvm_build == 'toolchain': + self.REPOROOT_DIR = os.path.abspath(os.path.join(self.LLVM_BUILD_DIR, '../..')) + else: + assert parent_of_llvm_build == 'llvm-project' + self.REPOROOT_DIR = os.path.abspath(os.path.join(self.LLVM_BUILD_DIR, '../../..')) + + self.LLVM_PROJECT_DIR = os.path.join(self.REPOROOT_DIR, 'toolchain', 'llvm-project') + self.OUT_PATH = os.path.join(self.REPOROOT_DIR, 'out') + @staticmethod def parse_add_argument(parser): @@ -719,7 +731,7 @@ class SysrootComposer(BuildUtils): ohos_cmake = 'OHOS.cmake' dst_dir = self.merge_out_path( '../prebuilts/cmake/%s/share/cmake-3.16/Modules/Platform' % self.platform_prefix()) - src_file = '%s/%s' % (self.build_config.CURRENT_DIR, ohos_cmake) + src_file = '%s/%s' % (self.build_config.LLVM_BUILD_DIR, ohos_cmake) if os.path.exists(os.path.join(dst_dir, ohos_cmake)): os.remove(os.path.join(dst_dir, ohos_cmake)) shutil.copy2(src_file, dst_dir) @@ -727,10 +739,12 @@ class SysrootComposer(BuildUtils): def build_musl(self, llvm_install, target, *extra_args): cur_dir = os.getcwd() - os.chdir(self.build_config.CURRENT_DIR) + os.chdir(self.build_config.LLVM_BUILD_DIR) self.logger().info('build musl %s', self.merge_out_path('install')) - args = ['./build_musl.sh', '-t', target, '-c', - self.merge_out_path(llvm_install, 'bin'), '-o', self.merge_out_path()] + list(extra_args) + args = ['./build_musl.sh', '-t', target, + '-c', self.merge_out_path(llvm_install, 'bin'), + '-o', self.merge_out_path(), + '-T', self.build_config.REPOROOT_DIR] + list(extra_args) self.check_call(args) os.chdir(cur_dir) @@ -1930,8 +1944,8 @@ class LlvmPackage(BuildUtils): self.check_rm_tree(install_host_dir) self.check_copy_tree(build_dir, install_dir) # copy readme file to install_dir - shutil.copyfile(os.path.join(self.build_config.CURRENT_DIR, "toolchain_readme.md"), - os.path.join(install_dir, "README.md")) + shutil.copyfile(os.path.join(self.build_config.LLVM_BUILD_DIR, "toolchain_readme.md"), + os.path.join(install_dir, "README.md")) # Remove unnecessary binaries. necessary_bin_files = [] diff --git a/llvm-build/build_musl.sh b/llvm-build/build_musl.sh index 9fb8737c032a015587d0a42f46add2c31c7ff372..d6c3a0add8d5c7630cc59951bf3a9559937402c1 100755 --- a/llvm-build/build_musl.sh +++ b/llvm-build/build_musl.sh @@ -18,11 +18,12 @@ set -e #default variables CLANG_BIN_ROOT="${PWD}/../../out/install/linux-x86_64/clang-dev/bin/" TARGET_TRIPLE="" +TOPDIR="${PWD}/../.." OUT="${PWD}/../../out" make_libs=0 #argument parser -while getopts "c:t:o:lh" arg +while getopts "c:t:T:o:lh" arg do case "${arg}" in "c") @@ -31,6 +32,9 @@ do "t") TARGET_TRIPLE=${OPTARG} ;; + "T") + TOPDIR=${OPTARG} + ;; "o") OUT=${OPTARG} ;; @@ -43,6 +47,7 @@ do echo " Options are:" echo " -c Specify clang bin path" echo " -t Specify target tripple" + echo " -T Specify top of repo tree" echo " -o Specify the build output directory" echo " -l Install libs" exit 0 @@ -90,25 +95,25 @@ fi echo "CLANG_BIN_ROOT=${CLANG_BIN_ROOT}" echo "ARCH=${TARGETS_PREFIX}" echo "TARGET=${TARGET_TRIPLE}" -echo "TOPDIR=${PWD}/../.." +echo "TOPDIR=${TOPDIR}" echo "TARGETS=${TARGET_USER}" echo "OUT=${OUT}" echo "SYSROOTDIR=${OUT}/sysroot" # build musl_headers -make musl_header_install_for_${TARGET_USER} CLANG="${CLANG_BIN_ROOT}/clang" TOPDIR=${PWD}/../../\ +make musl_header_install_for_${TARGET_USER} CLANG="${CLANG_BIN_ROOT}/clang" TOPDIR=${TOPDIR} \ SYSROOTDIR=${OUT}/sysroot TARGETS=${TARGET_USER} TARGET=${TARGET_TRIPLE} ARCH=${TARGETS_PREFIX} -f Makefile # build musl_libs if ((make_libs == 1)); then if [ $TARGET_TRIPLE == "aarch64-linux-ohos" ] || [ $TARGET_TRIPLE == "riscv64-linux-ohos" ] || \ [ $TARGET_TRIPLE == "mipsel-linux-ohos" ] || [ $TARGET_TRIPLE == "x86_64-linux-ohos" ]; then - make CLANG="${CLANG_BIN_ROOT}/clang" TOPDIR=${PWD}/../../ SYSROOTDIR=${OUT}/sysroot TARGETS=${TARGET_USER}\ + make CLANG="${CLANG_BIN_ROOT}/clang" TOPDIR=${TOPDIR} SYSROOTDIR=${OUT}/sysroot TARGETS=${TARGET_USER}\ TARGET=${TARGET_TRIPLE} ARCH=${TARGETS_PREFIX} -f Makefile else for ARCH_CFLAG in "${CFLAGS_FOR_TARGET[@]}" do - make CLANG="${CLANG_BIN_ROOT}/clang" TOPDIR=${PWD}/../../ SYSROOTDIR=${OUT}/sysroot TARGETS=${TARGET_USER}\ + make CLANG="${CLANG_BIN_ROOT}/clang" TOPDIR=${TOPDIR} SYSROOTDIR=${OUT}/sysroot TARGETS=${TARGET_USER}\ TARGET=${TARGET_TRIPLE} ARCH=${TARGETS_PREFIX} ARCH_CFLAGS="${ARCH_CFLAG}" -f Makefile done fi diff --git a/llvm-build/mingw.py b/llvm-build/mingw.py index 2ab852afb2cda1753f2eaabfaa5fa31967c8e08b..4eb6464900d3f495eb250d077986f3717609b351 100755 --- a/llvm-build/mingw.py +++ b/llvm-build/mingw.py @@ -26,15 +26,23 @@ class BuildConfig(): def __init__(self): self.CLANG_VERSION = '10.0.1' - self.THIS_DIR = os.path.realpath(os.path.dirname(__file__)) + self.LLVM_BUILD_DIR = os.path.realpath(os.path.dirname(__file__)) + + parent_of_llvm_build = os.path.basename(os.path.dirname(self.LLVM_BUILD_DIR)) + if parent_of_llvm_build == 'toolchain': + self.REPOROOT_DIR = os.path.realpath(os.path.join(self.LLVM_BUILD_DIR, '../..')) + else: + assert parent_of_llvm_build == 'llvm-project' + self.REPOROOT_DIR = os.path.realpath(os.path.join(self.LLVM_BUILD_DIR, '../../..')) + self.OUT_DIR = os.environ.get('OUT_DIR', self.repo_root('out')) self.MINGW_DIR = self.out_root('clang_mingw', 'clang-%s' % self.CLANG_VERSION, 'x86_64-w64-mingw32') def repo_root(self, *args): - return os.path.realpath(os.path.join(self.THIS_DIR, '../../', *args)) + return os.path.join(self.REPOROOT_DIR, *args) def out_root(self, *args): - return os.path.realpath(os.path.join(self.OUT_DIR, *args)) + return os.path.join(self.OUT_DIR, *args) def mingw64_dir(self): if os.path.isdir(self.MINGW_DIR): @@ -43,7 +51,7 @@ class BuildConfig(): return self.MINGW_DIR def llvm_path(self, *args): - return os.path.realpath(os.path.join(self.THIS_DIR, '../llvm-project', *args)) + return os.path.join(self.REPOROOT_DIR, 'toolchain/llvm-project', *args) class LlvmMingw(): @@ -243,7 +251,7 @@ class LlvmMingw(): shutil.rmtree(winpthreads_dir) os.makedirs(winpthreads_dir) os.chdir(winpthreads_dir) - self.env['RC'] = "%s/windres.sh" % self.build_config.THIS_DIR + self.env['RC'] = "%s/windres.sh" % self.build_config.LLVM_BUILD_DIR self.env['EXEEXT'] = ".exe" cmd = ['../configure', '--prefix=%s' % self.prefix, '--host=x86_64-w64-mingw32', diff --git a/llvm-build/windres.sh b/llvm-build/windres.sh index 054bed7b811595104e3a2a54e9f28b4839de8b3c..18375c5c37c166112d465b9b6b234dca676fb400 100755 --- a/llvm-build/windres.sh +++ b/llvm-build/windres.sh @@ -15,8 +15,16 @@ set -e #default variables -MYDIR=$(dirname $0) -CLANG_BIN_ROOT="$MYDIR/../../out/clang_mingw/clang-10.0.1/bin/" + +LLVM_BUILD_DIR=$(dirname $0) +PARENT_OF_LLVM_BUILD=$(basename "$(realpath "$LLVM_BUILD_DIR/..")") +case $PARENT_OF_LLVM_BUILD in + toolchain) TOPDIR="$(realpath "$LLVM_BUILD_DIR/../..")" ;; + llvm-project) TOPDIR="$(realpath "$LLVM_BUILD_DIR/../../..")" ;; + *) echo "Cannot detect TOPDIR" 1>&2 ; exit 1 ;; +esac + +CLANG_BIN_ROOT="$TOPDIR/out/clang_mingw/clang-10.0.1/bin/" CLANG_FLAGS="clang -target x86_64-w64-mingw32 -rtlib=compiler-rt -stdlib=libc++ -fuse-ld=lld -Qunused-arguments -E -xc -DRC_INVOKED=1" LLVM_RC_FLAGS="llvm-rc -I ../src src/.libs/version.o.preproc.rc -c 1252 -fo src/.libs/version.o.out.res" LLVM_CVTRES_FLAGS="llvm-cvtres src/.libs/version.o.out.res -machine:X64 -out:"