Skip to content

Commit 06c0679

Browse files
tkukielkThomsonTan
andauthored
Fix build scripts and add visionOS support (#1279)
* Fix build scripts and add visionOS support Multiple fixes: - building on Apple Silicon Macs - remove the assumptions that the build machine is always x86_64 - fix badly broken build.sh for Mac, especially with getopts for options & params - extend build-ios.sh to allow building for iOS-derived platforms like visionOS The expected iOS build invocation is: build-ios.sh [clean] [release|debug] ${ARCH} ${PLATFORM} where ARCH = arm64|arm64e|x86_64 PLATFORM = iphoneos|iphonesimulator|xros|xrsimulator * Fix build for older Xcodes The verification pipeline uses older Xcode -Wno-unused-but-set-variable is unknown to older compilers, add -Wno-unknown-warning-option * Set the default arch to the build machine's one if not specified --------- Co-authored-by: Tom Tan <[email protected]>
1 parent e93f260 commit 06c0679

File tree

3 files changed

+146
-79
lines changed

3 files changed

+146
-79
lines changed

CMakeLists.txt

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,21 @@ if(APPLE)
4646
endif()
4747
endif()
4848

49-
if((${IOS_PLAT} STREQUAL "iphoneos") OR (${IOS_PLAT} STREQUAL "iphonesimulator"))
49+
if((${IOS_PLAT} STREQUAL "iphoneos") OR (${IOS_PLAT} STREQUAL "iphonesimulator") OR (${IOS_PLAT} STREQUAL "xros") OR (${IOS_PLAT} STREQUAL "xrsimulator"))
5050
set(IOS_PLATFORM "${IOS_PLAT}")
5151
else()
5252
message(FATAL_ERROR "Unrecognized iOS platform '${IOS_PLAT}'")
5353
endif()
5454

5555
if(${IOS_ARCH} STREQUAL "x86_64")
56-
set(IOS_PLATFORM "iphonesimulator")
56+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch x86_64")
57+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch x86_64")
5758
set(CMAKE_SYSTEM_PROCESSOR x86_64)
5859
elseif(${IOS_ARCH} STREQUAL "arm64")
59-
set(IOS_PLATFORM ${IOS_PLAT})
6060
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch arm64")
6161
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch arm64")
6262
set(CMAKE_SYSTEM_PROCESSOR arm64)
6363
elseif(${IOS_ARCH} STREQUAL "arm64e")
64-
set(IOS_PLATFORM ${IOS_PLAT})
6564
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch arm64e")
6665
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch arm64e")
6766
set(CMAKE_SYSTEM_PROCESSOR arm64e)
@@ -78,11 +77,18 @@ if(APPLE)
7877
message("-- PLATFORM: ${IOS_PLATFORM}")
7978
else()
8079
if(${MAC_ARCH} STREQUAL "x86_64")
80+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch x86_64")
81+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch x86_64")
8182
set(CMAKE_SYSTEM_PROCESSOR x86_64)
83+
set(TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR})
84+
set(CMAKE_OSX_ARCHITECTURES ${MAC_ARCH})
85+
set(APPLE True)
8286
elseif(${MAC_ARCH} STREQUAL "arm64")
8387
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch arm64")
8488
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch arm64")
8589
set(CMAKE_SYSTEM_PROCESSOR arm64)
90+
set(TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR})
91+
set(CMAKE_OSX_ARCHITECTURES ${MAC_ARCH})
8692
set(APPLE True)
8793
else()
8894
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -arch x86_64 -arch arm64")
@@ -107,7 +113,7 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
107113
set(WARN_FLAGS "/W4 /WX")
108114
else()
109115
# No -pedantic -Wno-extra-semi -Wno-gnu-zero-variadic-macro-arguments
110-
set(WARN_FLAGS "-Wall -Werror -Wextra -Wno-unused-parameter")
116+
set(WARN_FLAGS "-Wall -Werror -Wextra -Wno-unused-parameter -Wno-unknown-warning-option -Wno-unused-but-set-variable")
111117
endif()
112118

113119
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
@@ -310,17 +316,17 @@ endif()
310316
################################################################################################
311317

312318
if (BUILD_PACKAGE)
313-
if (${CMAKE_PACKAGE_TYPE} STREQUAL "deb")
319+
if ("${CMAKE_PACKAGE_TYPE}" STREQUAL "deb")
314320
# FIXME: hardcode it for 64-bit Linux for now
315321
set(INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/${CPACK_DEBIAN_ARCHITECTURE}-linux-gnu)
316322
include(tools/MakeDeb.cmake)
317323
endif()
318-
if (${CMAKE_PACKAGE_TYPE} STREQUAL "rpm")
324+
if ("${CMAKE_PACKAGE_TYPE}" STREQUAL "rpm")
319325
# TODO: [MG] - fix path
320326
set(INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu)
321327
include(tools/MakeRpm.cmake)
322328
endif()
323-
if (${CMAKE_PACKAGE_TYPE} STREQUAL "tgz")
329+
if ("${CMAKE_PACKAGE_TYPE}" STREQUAL "tgz")
324330
# TODO: [MG] - fix path... should we simply use /usr/local/lib without CPU?
325331
# TODO: [MG] - Windows path is not ideal -- C:/Program Files (x86)/MSTelemetry/* - what should we use instead?
326332
include(tools/MakeTgz.cmake)

build-ios.sh

Lines changed: 64 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,99 @@
11
#!/bin/sh
22

3+
# The expected iOS build invocation is:
4+
# build-ios.sh [clean] [release|debug] ${ARCH} ${PLATFORM}
5+
# where
6+
# ARCH = arm64|arm64e|x86_64
7+
# PLATFORM = iphoneos|iphonesimulator|xros|xrsimulator
8+
39
if [ "$1" == "clean" ]; then
4-
rm -f CMakeCache.txt *.cmake
5-
rm -rf out
6-
rm -rf .buildtools
7-
# make clean
10+
echo "build-ios.sh: cleaning previous build artifacts"
11+
rm -f CMakeCache.txt *.cmake
12+
rm -rf out
13+
rm -rf .buildtools
14+
# make clean
15+
shift
816
fi
917

10-
if [ "$1" == "release" ] || [ "$2" == "release" ]; then
11-
BUILD_TYPE="Release"
12-
else
1318
BUILD_TYPE="Debug"
19+
if [ "$1" == "release" ]; then
20+
BUILD_TYPE="Release"
21+
shift
22+
elif [ "$1" == "debug" ]; then
23+
BUILD_TYPE="Debug"
24+
shift
1425
fi
1526

1627
# Set Architecture: arm64, arm64e or x86_64
17-
if [ "$2" == "arm64" ] || [ "$3" == "arm64" ]; then
18-
IOS_ARCH="arm64"
19-
elif [ "$2" == "arm64e" ] || [ "$3" == "arm64e" ]; then
20-
IOS_ARCH="arm64e"
21-
else
22-
IOS_ARCH="x86_64"
28+
IOS_ARCH=$(/usr/bin/uname -m)
29+
if [ "$1" == "arm64" ]; then
30+
IOS_ARCH="arm64"
31+
shift
32+
elif [ "$1" == "arm64e" ]; then
33+
IOS_ARCH="arm64e"
34+
shift
35+
elif [ "$1" == "x86_64" ]; then
36+
IOS_ARCH="x86_64"
37+
shift
2338
fi
2439

25-
# Set Platform: device or simulator
26-
if [ "$2" == "device" ] || [ "$3" == "device" ] || [ "$4" == "device" ]; then
27-
IOS_PLAT="iphoneos"
28-
else
40+
# the last param is expected to specify the platform name: iphoneos|iphonesimulator|xros|xrsimulator
41+
# so if it is non-empty and it is not "device", we take it as a valid platform name
42+
# otherwise we fall back to old iOS logic which only supported iphoneos|iphonesimulator
2943
IOS_PLAT="iphonesimulator"
44+
if [ -n "$1" ] && [ "$1" != "device" ]; then
45+
IOS_PLAT="$1"
46+
elif [ "$1" == "device" ]; then
47+
IOS_PLAT="iphoneos"
3048
fi
3149

32-
# Set target iOS minver
33-
default_ios_target=10.0
34-
if [ -z $IOS_DEPLOYMENT_TARGET ]; then
35-
export IOS_DEPLOYMENT_TARGET=${default_ios_target}
36-
export FORCE_RESET_DEPLOYMENT_TARGET=YES
37-
else
38-
export FORCE_RESET_DEPLOYMENT_TARGET=NO
50+
echo "IOS_ARCH = $IOS_ARCH, IOS_PLAT = $IOS_PLAT, BUILD_TYPE = $BUILD_TYPE"
51+
52+
FORCE_RESET_DEPLOYMENT_TARGET=NO
53+
DEPLOYMENT_TARGET=""
54+
55+
if [ "$IOS_PLAT" == "iphoneos" ] || [ "$IOS_PLAT" == "iphonesimulator" ]; then
56+
SYS_NAME="iOS"
57+
DEPLOYMENT_TARGET="$IOS_DEPLOYMENT_TARGET"
58+
if [ -z "$DEPLOYMENT_TARGET" ]; then
59+
DEPLOYMENT_TARGET="10.0"
60+
FORCE_RESET_DEPLOYMENT_TARGET=YES
61+
fi
62+
elif [ "$IOS_PLAT" == "xros" ] || [ "$IOS_PLAT" == "xrsimulator" ]; then
63+
SYS_NAME="visionOS"
64+
DEPLOYMENT_TARGET="$XROS_DEPLOYMENT_TARGET"
65+
if [ -z "$DEPLOYMENT_TARGET" ]; then
66+
DEPLOYMENT_TARGET="1.0"
67+
FORCE_RESET_DEPLOYMENT_TARGET=YES
68+
fi
3969
fi
40-
echo "ios deployment target="$IOS_DEPLOYMENT_TARGET
41-
echo "force reset deployment target="$FORCE_RESET_DEPLOYMENT_TARGET
70+
71+
echo "deployment target = $DEPLOYMENT_TARGET"
72+
echo "force reset deployment target = $FORCE_RESET_DEPLOYMENT_TARGET"
4273

4374
# Install build tools and recent sqlite3
44-
FILE=.buildtools
45-
OS_NAME=`uname -a`
75+
FILE=".buildtools"
4676
if [ ! -f $FILE ]; then
4777
tools/setup-buildtools-apple.sh ios
48-
# Assume that the build tools have been successfully installed
49-
echo > $FILE
78+
# Assume that the build tools have been successfully installed
79+
echo > $FILE
5080
fi
5181

5282
if [ -f /usr/bin/gcc ]; then
53-
echo "gcc version: `gcc --version`"
83+
echo "gcc version: `gcc --version`"
5484
fi
5585

5686
if [ -f /usr/bin/clang ]; then
57-
echo "clang version: `clang --version`"
87+
echo "clang version: `clang --version`"
5888
fi
5989

6090
mkdir -p out
6191
cd out
6292

6393
CMAKE_PACKAGE_TYPE=tgz
6494

65-
cmake_cmd="cmake -DCMAKE_OSX_SYSROOT=$IOS_PLAT -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_IOS_ARCH_ABI=$IOS_ARCH -DCMAKE_OSX_DEPLOYMENT_TARGET=$IOS_DEPLOYMENT_TARGET -DBUILD_IOS=YES -DIOS_ARCH=$IOS_ARCH -DIOS_PLAT=$IOS_PLAT -DIOS_DEPLOYMENT_TARGET=$IOS_DEPLOYMENT_TARGET -DBUILD_UNIT_TESTS=YES -DBUILD_FUNC_TESTS=YES -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_PACKAGE_TYPE=$CMAKE_PACKAGE_TYPE -DFORCE_RESET_DEPLOYMENT_TARGET=$FORCE_RESET_DEPLOYMENT_TARGET $CMAKE_OPTS .."
66-
echo $cmake_cmd
95+
cmake_cmd="cmake -DCMAKE_OSX_SYSROOT=$IOS_PLAT -DCMAKE_SYSTEM_NAME=$SYS_NAME -DCMAKE_IOS_ARCH_ABI=$IOS_ARCH -DCMAKE_OSX_DEPLOYMENT_TARGET=$DEPLOYMENT_TARGET -DBUILD_IOS=YES -DIOS_ARCH=$IOS_ARCH -DIOS_PLAT=$IOS_PLAT -DIOS_DEPLOYMENT_TARGET=$DEPLOYMENT_TARGET -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_PACKAGE_TYPE=$CMAKE_PACKAGE_TYPE -DFORCE_RESET_DEPLOYMENT_TARGET=$FORCE_RESET_DEPLOYMENT_TARGET $CMAKE_OPTS .."
96+
echo "${cmake_cmd}"
6797
eval $cmake_cmd
6898

6999
make

build.sh

Lines changed: 68 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,32 @@
11
#!/bin/bash
22

3+
usage()
4+
{
5+
echo "Usage: build.sh [clean] [arm64|x86_64|universal] [CUSTOM_CMAKE_CXX_FLAGS=x] [noroot] [release] [-h|-?] [-l (static|shared)] [-D CMAKE_OPTION] [-v]"
6+
echo " "
7+
echo "options: "
8+
echo " "
9+
echo "Positional options (1st three arguments): "
10+
echo "[clean] - perform clean build "
11+
echo "[arm64|x86_64|universal] - Apple platform build type. Not applicable to other OS. "
12+
echo "[CUSTOM_CMAKE_CXX_FLAGS] - custom CXX compiler flags "
13+
echo "[noroot] - custom CXX compiler flags "
14+
echo "[release] - build for Release "
15+
echo " "
16+
echo "Additional parameters: "
17+
echo " -h | -? - this help. "
18+
echo " -l [static|shared] - build static (default) or shared library. "
19+
echo " -D [CMAKE_OPTION] - additional options to pass to cmake. Could be multiple. "
20+
echo " -v - increase build verbosity (reserved for future use) "
21+
echo " "
22+
echo "Environment variables: "
23+
echo "CMAKE_OPTS - any additional cmake options. "
24+
echo "GIT_PULL_TOKEN - authorization token for Microsoft-proprietary modules. "
25+
echo "MACOSX_DEPLOYMENT_TARGET - optional parameter for setting macosx deployment target "
26+
echo "Plus any other environment variables respected by CMake build system. "
27+
exit 0
28+
}
29+
330
export PATH=/usr/local/bin:$PATH
431

532
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
@@ -8,87 +35,91 @@ cd $DIR
835

936
export NOROOT=$NOROOT
1037

11-
if [ "$1" == "clean" ]; then
38+
PARAM1="$1"
39+
PARAM2="$2"
40+
PARAM3="$3"
41+
42+
if [ "$PARAM1" == "clean" ]; then
43+
echo "Cleaning previous build artifacts"
1244
rm -f CMakeCache.txt *.cmake
1345
rm -rf out
1446
rm -rf .buildtools
1547
# make clean
48+
shift
1649
fi
1750

18-
if [ "$1" == "noroot" ] || [ "$2" == "noroot" ] || [ "$3" == "noroot" ]; then
51+
if [ "$PARAM1" == "noroot" ] || [ "$PARAM2" == "noroot" ] || [ "$PARAM3" == "noroot" ]; then
1952
export NOROOT=true
53+
echo "NOROOT = true"
54+
shift
2055
fi
2156

22-
if [ "$1" == "release" ] || [ "$2" == "release" ] || [ "$3" == "release" ]; then
57+
if [ "$PARAM1" == "release" ] || [ "$PARAM2" == "release" ] || [ "$PARAM3" == "release" ]; then
2358
BUILD_TYPE="Release"
59+
echo "BUILD_TYPE = Release"
60+
shift
61+
elif [ "$PARAM1" == "debug" ] || [ "$PARAM2" == "debug" ] || [ "$PARAM3" == "debug" ]; then
62+
BUILD_TYPE="Debug"
63+
echo "BUILD_TYPE = Debug"
64+
shift
2465
else
2566
BUILD_TYPE="Debug"
67+
echo "Assuming default BUILD_TYPE = Debug"
2668
fi
2769

28-
if [ "$1" == "arm64" ] || [ "$2" == "arm64" ] || [ "$3" == "arm64" ]; then
70+
if [ "$PARAM1" == "arm64" ] || [ "$PARAM2" == "arm64" ] || [ "$PARAM3" == "arm64" ]; then
2971
MAC_ARCH="arm64"
30-
elif [ "$1" == "universal" ] || [ "$2" == "universal" ] || [ "$3" == "universal" ]; then
72+
echo "MAC_ARCH = arm64"
73+
shift
74+
elif [ "$PARAM1" == "universal" ] || [ "$PARAM2" == "universal" ] || [ "$PARAM3" == "universal" ]; then
3175
MAC_ARCH="universal"
32-
else
76+
echo "MAC_ARCH = universal"
77+
shift
78+
elif [ "$PARAM1" == "x86_64" ] || [ "$PARAM2" == "x86_64" ] || [ "$PARAM3" == "x86_64" ]; then
3379
MAC_ARCH="x86_64"
80+
echo "MAC_ARCH = x86_64"
81+
shift
82+
else
83+
MAC_ARCH=$(/usr/bin/uname -m)
84+
echo "Using current machine MAC_ARCH = $MAC_ARCH"
3485
fi
3586

3687
CUSTOM_CMAKE_CXX_FLAG=""
37-
if [[ $1 == CUSTOM_BUILD_FLAGS* ]] || [[ $2 == CUSTOM_BUILD_FLAGS* ]] || [[ $3 == CUSTOM_BUILD_FLAGS* ]]; then
38-
if [[ $1 == CUSTOM_BUILD_FLAGS* ]]; then
88+
if [[ $PARAM1 == CUSTOM_BUILD_FLAGS* ]] || [[ $PARAM2 == CUSTOM_BUILD_FLAGS* ]] || [[ $PARAM3 == CUSTOM_BUILD_FLAGS* ]]; then
89+
if [[ $PARAM1 == CUSTOM_BUILD_FLAGS* ]]; then
3990
CUSTOM_CMAKE_CXX_FLAG="\"${1:19:999}\""
40-
elif [[ $2 == CUSTOM_BUILD_FLAGS* ]]; then
91+
elif [[ $PARAM2 == CUSTOM_BUILD_FLAGS* ]]; then
4192
CUSTOM_CMAKE_CXX_FLAG="\"${2:19:999}\""
42-
elif [[ $3 == CUSTOM_BUILD_FLAGS* ]]; then
93+
elif [[ $PARAM3 == CUSTOM_BUILD_FLAGS* ]]; then
4394
CUSTOM_CMAKE_CXX_FLAG="\"${3:19:999}\""
4495
fi
45-
echo "custom build flags="$CUSTOM_CMAKE_CXX_FLAG
96+
shift
97+
echo "custom build flags = $CUSTOM_CMAKE_CXX_FLAG"
4698
fi
4799

48100
LINK_TYPE=
49101
CMAKE_OPTS="${CMAKE_OPTS:--DBUILD_SHARED_LIBS=OFF}"
50102
while getopts "h?vl:D:" opt; do
51103
case "$opt" in
52-
h|\?)
53-
echo "Usage: build.sh [clean] [arm64|universal] [CUSTOM_CMAKE_CXX_FLAGS=x] [noroot] [release] [-h|-?] [-l (static|shared)] [-D CMAKE_OPTION] [-v]"
54-
echo " "
55-
echo "options: "
56-
echo " "
57-
echo "Positional options (1st three arguments): "
58-
echo "[clean] - perform clean build "
59-
echo "[arm64|universal] - Apple platform build type. Not applicable to other OS. "
60-
echo "[CUSTOM_CMAKE_CXX_FLAGS] - custom CXX compiler flags "
61-
echo "[noroot] - custom CXX compiler flags "
62-
echo "[release] - build for Release "
63-
echo " "
64-
echo "Additional parameters: "
65-
echo " -h | -? - this help. "
66-
echo " -l [static|shared] - build static (default) or shared library. "
67-
echo " -D [CMAKE_OPTION] - additional options to pass to cmake. Could be multiple. "
68-
echo " -v - increase build verbosity (reserved for future use) "
69-
echo " "
70-
echo "Environment variables: "
71-
echo "CMAKE_OPTS - any additional cmake options. "
72-
echo "GIT_PULL_TOKEN - authorization token for Microsoft-proprietary modules. "
73-
echo "MACOSX_DEPLOYMENT_TARGET - optional parameter for setting macosx deployment target "
74-
echo "Plus any other environment variables respected by CMake build system. "
75-
exit 0
104+
h|\?) usage
76105
;;
77106
:) echo "Invalid option: $OPTARG requires an argument" 1>&2
78107
exit 0
79108
;;
80109
v) verbose=1
81110
;;
82-
D) CMAKE_OPTS="$CMAKE_OPTS -D$OPTARG"
111+
D) CMAKE_OPTS="${CMAKE_OPTS} -D${OPTARG}"
83112
;;
84113
l) LINK_TYPE=$OPTARG
85114
;;
86115
esac
87116
done
88117
shift $((OPTIND -1))
89118

119+
echo "CMAKE_OPTS from caller: $CMAKE_OPTS"
120+
90121
if [ "$LINK_TYPE" == "shared" ]; then
91-
CMAKE_OPTS="$CMAKE_OPTS -DBUILD_SHARED_LIBS=ON"
122+
CMAKE_OPTS="${CMAKE_OPTS} -DBUILD_SHARED_LIBS=ON"
92123
fi
93124

94125
# Set target MacOS minver

0 commit comments

Comments
 (0)