mirror of
https://github.com/Relintai/osxcross.git
synced 2025-02-03 22:45:56 +01:00
Merge pull request #254 from rokm/xcode_cmdline_tools
Add scripts for extracting SDKs from Command Line Tools for Xcode
This commit is contained in:
commit
269ed97a6d
33
README.md
33
README.md
@ -159,7 +159,10 @@ use these variants unless you know what you're doing.
|
|||||||
**[Please ensure you have read and understood the Xcode license
|
**[Please ensure you have read and understood the Xcode license
|
||||||
terms before continuing.](https://www.apple.com/legal/sla/docs/xcode.pdf)**
|
terms before continuing.](https://www.apple.com/legal/sla/docs/xcode.pdf)**
|
||||||
|
|
||||||
##### Packaging the SDK on macOS: #####
|
The SDKs can be extracted either from full Xcode or from Command Line
|
||||||
|
Tools for Xcode.
|
||||||
|
|
||||||
|
##### Packaging the SDK on macOS (Xcode): #####
|
||||||
|
|
||||||
1. [Download Xcode: https://developer.apple.com/download/more] \*\*
|
1. [Download Xcode: https://developer.apple.com/download/more] \*\*
|
||||||
2. [Mount Xcode.dmg (Open With -> DiskImageMounter) \*\*\*]
|
2. [Mount Xcode.dmg (Open With -> DiskImageMounter) \*\*\*]
|
||||||
@ -212,6 +215,34 @@ An SSD is recommended for this method.
|
|||||||
6. Copy or move the SDK into the tarballs/ directory
|
6. Copy or move the SDK into the tarballs/ directory
|
||||||
|
|
||||||
|
|
||||||
|
##### Packaging the SDK from Xcode Command Line Tools on macOS: #####
|
||||||
|
|
||||||
|
1. [Download Xcode Command Line Tools: https://developer.apple.com/download/more] \*\*\*\*
|
||||||
|
2. [Mount Command_Line_Tools_for_Xcode.dmg (Open With -> DiskImageMounter)]
|
||||||
|
3. [Install "Command Line Tools.pkg" (Open With -> Installer)]
|
||||||
|
3. Run: `./tools/gen_sdk_package_tools.sh` (from the OSXCross package)
|
||||||
|
4. Copy the packaged SDK (\*.tar.\* or \*.pkg) on a USB Stick
|
||||||
|
5. (On Linux/BSD) Copy or move the SDK into the tarballs/ directory of
|
||||||
|
OSXCross.
|
||||||
|
|
||||||
|
\*\*\*\*
|
||||||
|
-- Xcode command line tools 12.x are known to work.
|
||||||
|
|
||||||
|
Steps 1. to 3. can be skipped if you have Xcode Command line tools
|
||||||
|
already installed (e.g., auto-installed by running `git` or `gcc`
|
||||||
|
command from command-line).
|
||||||
|
|
||||||
|
##### Packing the SDK from from Xcode Command Line Tools on Linux: #####
|
||||||
|
|
||||||
|
This method may require up to 25 GB of free disk space.
|
||||||
|
An SSD is recommended for this method.
|
||||||
|
|
||||||
|
1. Download Xcode Command Line Tools like described in 'Packaging the SDK from Xcode Command Line Tools on macOS'
|
||||||
|
2. Install `clang`, `make`, `libssl-devel`, `lzma-devel` and `libxml2-devel`
|
||||||
|
3. Run `./tools/gen_sdk_package_tools_dmg.sh <command_line_tools_for_xcode>.dmg`
|
||||||
|
4. Copy or move the SDK into the tarballs/ directory
|
||||||
|
|
||||||
|
|
||||||
### USAGE EXAMPLES: ###
|
### USAGE EXAMPLES: ###
|
||||||
|
|
||||||
##### Example. To compile a file called test.cpp, you can run: #####
|
##### Example. To compile a file called test.cpp, you can run: #####
|
||||||
|
164
tools/gen_sdk_package_tools.sh
Executable file
164
tools/gen_sdk_package_tools.sh
Executable file
@ -0,0 +1,164 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Package the macOS SDKs into a tar file to be used by `build.sh`.
|
||||||
|
# As opposed to gen_sdk_package.sh, which is used for extraction of SDKs
|
||||||
|
# from full Xcode version, gen_sdk_tools.sh extracts SDKs from Xcode
|
||||||
|
# Command Line Tools.
|
||||||
|
#
|
||||||
|
# Tested with XCode Command Line Tools 12.x
|
||||||
|
#
|
||||||
|
|
||||||
|
export LC_ALL=C
|
||||||
|
|
||||||
|
|
||||||
|
command -v gnutar &>/dev/null
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
TAR=gnutar
|
||||||
|
else
|
||||||
|
TAR=tar
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ -z "$SDK_COMPRESSOR" ]; then
|
||||||
|
command -v xz &>/dev/null
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
SDK_COMPRESSOR=xz
|
||||||
|
SDK_EXT="tar.xz"
|
||||||
|
else
|
||||||
|
SDK_COMPRESSOR=bzip2
|
||||||
|
SDK_EXT="tar.bz2"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $SDK_COMPRESSOR in
|
||||||
|
"gz")
|
||||||
|
SDK_COMPRESSOR=gzip
|
||||||
|
SDK_EXT=".tar.gz"
|
||||||
|
;;
|
||||||
|
"bzip2")
|
||||||
|
SDK_EXT=".tar.bz2"
|
||||||
|
;;
|
||||||
|
"xz")
|
||||||
|
SDK_EXT=".tar.xz"
|
||||||
|
;;
|
||||||
|
"zip")
|
||||||
|
SDK_EXT=".zip"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "error: unknown compressor \"$SDK_COMPRESSOR\"" >&2
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
|
||||||
|
function compress()
|
||||||
|
{
|
||||||
|
case $SDK_COMPRESSOR in
|
||||||
|
"zip")
|
||||||
|
$SDK_COMPRESSOR -q -5 -r - $1 > $2 ;;
|
||||||
|
*)
|
||||||
|
tar cf - $1 | $SDK_COMPRESSOR -5 - > $2 ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function rreadlink()
|
||||||
|
{
|
||||||
|
if [ ! -h "$1" ]; then
|
||||||
|
echo "$1"
|
||||||
|
else
|
||||||
|
local link="$(expr "$(command ls -ld -- "$1")" : '.*-> \(.*\)$')"
|
||||||
|
cd $(dirname $1)
|
||||||
|
rreadlink "$link" | sed "s|^\([^/].*\)\$|$(dirname $1)/\1|"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if [ $(uname -s) != "Darwin" ]; then
|
||||||
|
if [ -z "$XCODE_TOOLS_DIR" ]; then
|
||||||
|
echo "This script must be run on macOS" 1>&2
|
||||||
|
echo "... Or with XCODE_TOOLS_DIR=... on Linux" 1>&2
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
case "$XCODE_TOOLS_DIR" in
|
||||||
|
/*) ;;
|
||||||
|
*) XCODE_TOOLS_DIR="$PWD/$XCODE_TOOLS_DIR" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
XCODE_TOOLS_DIR="/Library/Developer/CommandLineTools"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$XCODE_TOOLS_DIR" ]; then
|
||||||
|
echo "cannot find Xcode Command Line Tools (XCODE_TOOLS_DIR=$XCODE_TOOLS_DIR)" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "found Xcode Command Line Tools: $XCODE_TOOLS_DIR"
|
||||||
|
|
||||||
|
WDIR=$(pwd)
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
pushd "$XCODE_TOOLS_DIR" &>/dev/null
|
||||||
|
|
||||||
|
if [ -d "SDKs" ]; then
|
||||||
|
pushd "SDKs" &>/dev/null
|
||||||
|
else
|
||||||
|
echo "$XCODE_TOOLS_DIR/SDKs does not exist" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
SDKS=$(ls | grep -E "^MacOSX11.*|^MacOSX10.*" | grep -v "Patch")
|
||||||
|
|
||||||
|
if [ -z "$SDKS" ]; then
|
||||||
|
echo "No SDK found" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# libc++ headers for C++11/C++14
|
||||||
|
LIBCXXDIR="usr/include/c++/v1"
|
||||||
|
|
||||||
|
# Manual directory
|
||||||
|
MANDIR="usr/share/man"
|
||||||
|
|
||||||
|
for SDK in $SDKS; do
|
||||||
|
echo -n "packaging $(echo "$SDK" | sed -E "s/(.sdk|.pkg)//g") SDK "
|
||||||
|
echo "(this may take several minutes) ..."
|
||||||
|
|
||||||
|
if [[ $SDK == *.pkg ]]; then
|
||||||
|
cp $SDK $WDIR
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
TMP=$(mktemp -d /tmp/XXXXXXXXXXX)
|
||||||
|
cp -r $(rreadlink $SDK) $TMP/$SDK &>/dev/null || true
|
||||||
|
|
||||||
|
pushd "$XCODE_TOOLS_DIR" &>/dev/null
|
||||||
|
|
||||||
|
mkdir -p $TMP/$SDK/usr/include/c++
|
||||||
|
|
||||||
|
# libc++ headers for C++11/C++14
|
||||||
|
if [ -d $LIBCXXDIR ]; then
|
||||||
|
cp -rf $LIBCXXDIR "$TMP/$SDK/usr/include/c++"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d $MANDIR ]; then
|
||||||
|
mkdir -p $TMP/$SDK/usr/share/man
|
||||||
|
cp -rf $MANDIR/* $TMP/$SDK/usr/share/man
|
||||||
|
fi
|
||||||
|
|
||||||
|
popd &>/dev/null
|
||||||
|
|
||||||
|
pushd $TMP &>/dev/null
|
||||||
|
compress "*" "$WDIR/$SDK$SDK_EXT"
|
||||||
|
popd &>/dev/null
|
||||||
|
|
||||||
|
rm -rf $TMP
|
||||||
|
done
|
||||||
|
|
||||||
|
popd &>/dev/null
|
||||||
|
popd &>/dev/null
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
ls -lh | grep MacOSX
|
104
tools/gen_sdk_package_tools_dmg.sh
Executable file
104
tools/gen_sdk_package_tools_dmg.sh
Executable file
@ -0,0 +1,104 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Extract Xcode Command Line Tools .dmg, process "Command Line Tools.pkg"
|
||||||
|
# and its sub-archives/packages, and run gen_sdk_package_tools.sh.
|
||||||
|
#
|
||||||
|
# Tested with XCode Command Line Tools 12.x
|
||||||
|
#
|
||||||
|
|
||||||
|
pushd "${0%/*}/.." &>/dev/null
|
||||||
|
source tools/tools.sh
|
||||||
|
|
||||||
|
require cpio
|
||||||
|
|
||||||
|
if [ $PLATFORM == "Darwin" ]; then
|
||||||
|
echo "Use gen_sdk_package_tools.sh on macOS" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
echo "Usage: $0 <Command_Line_Tools_for_Xcode.dmg>" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
XCODE_TOOLS_DMG=$(make_absolute_path "$1" $(get_exec_dir))
|
||||||
|
|
||||||
|
mkdir -p $BUILD_DIR
|
||||||
|
pushd $BUILD_DIR &>/dev/null
|
||||||
|
|
||||||
|
require git
|
||||||
|
require $MAKE
|
||||||
|
require cpio
|
||||||
|
|
||||||
|
[ -n "$CC" ] && require $CC
|
||||||
|
[ -n "$CXX" ] && require $CXX
|
||||||
|
|
||||||
|
# build xar
|
||||||
|
build_xar
|
||||||
|
|
||||||
|
# build pbzx
|
||||||
|
get_sources https://github.com/tpoechtrager/pbzx.git master
|
||||||
|
|
||||||
|
if [ $f_res -eq 1 ]; then
|
||||||
|
pushd $CURRENT_BUILD_PROJECT_NAME &>/dev/null
|
||||||
|
mkdir -p $TARGET_DIR_SDK_TOOLS/bin
|
||||||
|
verbose_cmd $CC -I $TARGET_DIR/include -L $TARGET_DIR/lib pbzx.c \
|
||||||
|
-o $TARGET_DIR_SDK_TOOLS/bin/pbzx -llzma -lxar \
|
||||||
|
-Wl,-rpath,$TARGET_DIR/lib
|
||||||
|
build_success
|
||||||
|
popd &>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# build 7z
|
||||||
|
get_sources https://github.com/tpoechtrager/p7zip.git master
|
||||||
|
|
||||||
|
if [ $f_res -eq 1 ]; then
|
||||||
|
pushd $CURRENT_BUILD_PROJECT_NAME &>/dev/null
|
||||||
|
|
||||||
|
if [ -n "$CC" ] && [ -n "$CXX" ]; then
|
||||||
|
[[ $CC == *clang* ]] && CC="$CC -Qunused-arguments"
|
||||||
|
[[ $CXX == *clang* ]] && CXX="$CXX -Qunused-arguments"
|
||||||
|
$MAKE 7z -j $JOBS CC="$CC" CXX="$CXX -std=gnu++98"
|
||||||
|
else
|
||||||
|
$MAKE 7z -j $JOBS CXX="c++ -std=gnu++98"
|
||||||
|
fi
|
||||||
|
|
||||||
|
$MAKE install DEST_HOME=$TARGET_DIR_SDK_TOOLS
|
||||||
|
find $TARGET_DIR_SDK_TOOLS/share -type f -exec chmod 0664 {} \;
|
||||||
|
find $TARGET_DIR_SDK_TOOLS/share -type d -exec chmod 0775 {} \;
|
||||||
|
popd &>/dev/null
|
||||||
|
build_success
|
||||||
|
fi
|
||||||
|
|
||||||
|
create_tmp_dir
|
||||||
|
|
||||||
|
pushd $TMP_DIR &>/dev/null
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Unpacking $XCODE_TOOLS_DMG ..."
|
||||||
|
XCODE_TOOLS_PKG="Command Line Developer Tools/Command Line Tools.pkg"
|
||||||
|
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TARGET_DIR/lib \
|
||||||
|
verbose_cmd "$TARGET_DIR_SDK_TOOLS/bin/7z x \"$XCODE_TOOLS_DMG\" \"$XCODE_TOOLS_PKG\""
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Unpacking $XCODE_TOOLS_PKG ..."
|
||||||
|
mkdir "$TMP_DIR/pkg_data"
|
||||||
|
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TARGET_DIR/lib \
|
||||||
|
verbose_cmd "$TARGET_DIR/bin/xar -xf \"$XCODE_TOOLS_PKG\" -C $TMP_DIR/pkg_data"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Processing packages ..."
|
||||||
|
mkdir "$TMP_DIR/out"
|
||||||
|
for PKG in $TMP_DIR/pkg_data/*.pkg; do
|
||||||
|
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TARGET_DIR/lib \
|
||||||
|
verbose_cmd "$TARGET_DIR/SDK/tools/bin/pbzx -n \"$PKG/Payload\" | cpio -i -D $TMP_DIR/out"
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
popd &>/dev/null # TMP_DIR
|
||||||
|
popd &>/dev/null # BUILD_DIR
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
XCODE_TOOLS_DIR="$TMP_DIR/out/Library/Developer/CommandLineTools" \
|
||||||
|
./tools/gen_sdk_package_tools.sh
|
Loading…
Reference in New Issue
Block a user