Skip to content

Commit d037c2d

Browse files
committed
[build] Modify build script to support a cross-compiling toolchain
Also modified cmake/Modules/GetClangResourceDir.cmake to work around a missing definition for PACKAGE_VERSION when cross-compiling OpenMP libraries.
1 parent 72c7d13 commit d037c2d

File tree

2 files changed

+65
-22
lines changed

2 files changed

+65
-22
lines changed

build-llvm-project.sh

Lines changed: 60 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
TARGET="X86"
55
BUILD_TYPE="Release"
66
INSTALL_PREFIX="/usr/local"
7+
CROSS_TARGETS=""
78
NPROC=1
89
USE_CCACHE="0"
910
DO_INSTALL="0"
1011
USE_SUDO="0"
1112
C_COMPILER_PATH="/usr/bin/gcc"
1213
CXX_COMPILER_PATH="/usr/bin/g++"
13-
LLVM_ENABLE_PROJECTS="clang;openmp"
14+
LLVM_EXTRA_PROJECTS=""
1415
EXTRA_CMAKE_OPTS=""
1516
VERBOSE=""
1617

@@ -19,56 +20,50 @@ set -e # Exit script on first error.
1920
function print_usage {
2021
echo "Usage: ./build-llvm-project.sh [options]";
2122
echo "";
22-
echo "Build and install classic-flang-llvm-project.";
23+
echo "Build and install classic-flang-llvm-project (including clang, lld, and openmp).";
2324
echo "Run this script in a directory with project sources.";
2425
echo "Example:";
2526
echo " $ git clone https://github.com/flang-compiler/classic-flang-llvm-project";
2627
echo " $ cd classic-flang-llvm-project";
27-
echo " $ .github/workflows/build-llvm-project.sh -t X86 -p /install/prefix/ \\";
28-
echo " $ -a /usr/bin/gcc-10 -b /usr/bin/g++-10 -i -s";
28+
echo " $ ./build-llvm-project.sh -t X86 -p /opt/classic-flang/ -i -s";
2929
echo "";
3030
echo "Options:";
3131
echo " -t Target to build for (X86, AArch64, PowerPC). Default: X86";
3232
echo " -d Set the CMake build type. Default: Release";
3333
echo " -p Install prefix. Default: /usr/local";
34+
echo " -X Cross-compile OpenMP for given list of target triples. Default: none";
3435
echo " -n Number of parallel jobs. Default: 1";
3536
echo " -c Use ccache. Default: 0 - do not use ccache";
3637
echo " -i Install the build. Default 0 - just build, do not install";
3738
echo " -s Use sudo to install. Default: 0 - do not use sudo";
3839
echo " -a C compiler path. Default: /usr/bin/gcc";
3940
echo " -b C++ compiler path. Default: /usr/bin/g++";
40-
echo " -e List of the LLVM sub-projects to build. Default: clang;openmp";
41+
echo " -e List of additional LLVM sub-projects to build. Default: none";
4142
echo " -x Extra CMake options. Default: ''";
4243
echo " -v Enable verbose output";
4344
}
4445

45-
while getopts "t:d:p:n:cisa:b:e:x:v?" opt; do
46+
while getopts "t:d:p:X:n:cisa:b:e:x:v?" opt; do
4647
case "$opt" in
4748
t) TARGET=$OPTARG;;
4849
d) BUILD_TYPE=$OPTARG;;
4950
p) INSTALL_PREFIX=$OPTARG;;
51+
X) CROSS_TARGETS=$OPTARG;;
5052
n) NPROC=$OPTARG;;
5153
c) USE_CCACHE="1";;
5254
i) DO_INSTALL="1";;
5355
s) USE_SUDO="1";;
5456
a) C_COMPILER_PATH=$OPTARG;;
5557
b) CXX_COMPILER_PATH=$OPTARG;;
56-
e) LLVM_ENABLE_PROJECTS=$OPTARG;;
58+
e) LLVM_EXTRA_PROJECTS=$OPTARG;;
5759
x) EXTRA_CMAKE_OPTS="$OPTARG";;
5860
v) VERBOSE="1";;
5961
?) print_usage; exit 0;;
6062
esac
6163
done
6264

6365
CMAKE_OPTIONS="-DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \
64-
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
65-
-DCMAKE_C_COMPILER=$C_COMPILER_PATH \
66-
-DCMAKE_CXX_COMPILER=$CXX_COMPILER_PATH \
67-
-DLLVM_TARGETS_TO_BUILD=$TARGET \
68-
-DLLVM_ENABLE_CLASSIC_FLANG=ON \
69-
-DFLANG_BUILD_NEW_DRIVER=OFF"
70-
# Warning: the -DLLVM_ENABLE_PROJECTS option is specified with cmake
71-
# to avoid issues with nested quotation marks
66+
-DCMAKE_BUILD_TYPE=$BUILD_TYPE"
7267

7368
if [ $USE_CCACHE == "1" ]; then
7469
echo "Build using ccache"
@@ -77,16 +72,19 @@ if [ $USE_CCACHE == "1" ]; then
7772
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache"
7873
fi
7974

80-
if [ -n "$EXTRA_CMAKE_OPTS" ]; then
81-
CMAKE_OPTIONS="$CMAKE_OPTIONS $EXTRA_CMAKE_OPTS"
82-
fi
83-
84-
# Build and install
75+
# Build and install.
8576
mkdir -p build && cd build
8677
if [ -n "$VERBOSE" ]; then
8778
set -x
8879
fi
89-
cmake $CMAKE_OPTIONS -DLLVM_ENABLE_PROJECTS=$LLVM_ENABLE_PROJECTS ../llvm
80+
cmake $CMAKE_OPTIONS \
81+
-DCMAKE_C_COMPILER=$C_COMPILER_PATH \
82+
-DCMAKE_CXX_COMPILER=$CXX_COMPILER_PATH \
83+
-DLLVM_ENABLE_CLASSIC_FLANG=ON \
84+
-DLLVM_ENABLE_PROJECTS="clang;lld;openmp;$LLVM_EXTRA_PROJECTS" \
85+
-DLLVM_TARGETS_TO_BUILD="$TARGET" \
86+
$EXTRA_CMAKE_OPTS \
87+
../llvm
9088
set +x
9189
make -j$NPROC VERBOSE=$VERBOSE
9290
if [ $DO_INSTALL == "1" ]; then
@@ -100,3 +98,44 @@ if [ $DO_INSTALL == "1" ]; then
10098
fi
10199
cd ..
102100

101+
# Cross-compile OpenMP libraries if requested.
102+
IFS=';' read -ra CROSS_TARGET_LIST <<< "$CROSS_TARGETS"
103+
for T in ${CROSS_TARGET_LIST[@]}; do
104+
mkdir -p "build/openmp-$T"
105+
pushd "build/openmp-$T"
106+
CMAKE_OPTIONS="$CMAKE_OPTIONS \
107+
-DCMAKE_AR=$INSTALL_PREFIX/bin/llvm-ar \
108+
-DCMAKE_ASM_COMPILER=$INSTALL_PREFIX/bin/clang \
109+
-DCMAKE_ASM_COMPILER_TARGET=$T \
110+
-DCMAKE_C_COMPILER=$INSTALL_PREFIX/bin/clang \
111+
-DCMAKE_C_COMPILER_TARGET=$T \
112+
-DCMAKE_CXX_COMPILER=$INSTALL_PREFIX/bin/clang++ \
113+
-DCMAKE_CXX_COMPILER_TARGET=$T \
114+
-DCMAKE_RANLIB=$INSTALL_PREFIX/bin/llvm-ranlib \
115+
-DCMAKE_SHARED_LINKER_FLAGS=-fuse-ld=lld"
116+
if [ -n "$VERBOSE" ]; then
117+
set -x
118+
fi
119+
cmake $CMAKE_OPTIONS \
120+
-DLLVM_DEFAULT_TARGET_TRIPLE=$T \
121+
-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON \
122+
-DLLVM_ENABLE_RUNTIMES="openmp" \
123+
-DLIBOMP_OMPT_SUPPORT=OFF \
124+
-DOPENMP_ENABLE_LIBOMPTARGET=OFF \
125+
-DOPENMP_ENABLE_OMPT_TOOLS=OFF \
126+
-DOPENMP_LLVM_TOOLS_DIR=$PWD/../bin \
127+
$EXTRA_CMAKE_OPTS \
128+
../../runtimes
129+
set +x
130+
make -j$NPROC VERBOSE=$VERBOSE
131+
if [ $DO_INSTALL -eq 1 ]; then
132+
if [ $USE_SUDO -eq 1 ]; then
133+
echo "Install with sudo"
134+
sudo make install
135+
else
136+
echo "Install without sudo"
137+
make install
138+
fi
139+
fi
140+
popd
141+
done

cmake/Modules/GetClangResourceDir.cmake

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ function(get_clang_resource_dir out_var)
1313
set(ret_dir bin/${CLANG_RESOURCE_DIR})
1414
else()
1515
if (NOT CLANG_VERSION_MAJOR)
16-
string(REGEX MATCH "^[0-9]+" CLANG_VERSION_MAJOR ${PACKAGE_VERSION})
16+
if (NOT PACKAGE_VERSION)
17+
string(REGEX MATCH "^[0-9]+" CLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
18+
else()
19+
string(REGEX MATCH "^[0-9]+" CLANG_VERSION_MAJOR ${PACKAGE_VERSION})
20+
endif()
1721
endif()
1822
set(ret_dir lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR})
1923
endif()

0 commit comments

Comments
 (0)