1#!/bin/sh 2# 3# configure [ <options> ] 4 5# usage 6# 7# Prints usage. 8# 9usage() 10{ 11 cat << EOF 12 13Usage: $0 <options> 14options: 15 --help Prints out this help. 16 --update Re-runs last configure invocation [must be given 17 as first option!] 18 --bootstrap <haikuporter> <HaikuPorts cross repo> <HaikuPorts repo> 19 Prepare for a bootstrap build. No pre-built 20 packages will be used, instead they will be built 21 from the sources (in several phases). 22 <haikuporter> is the path to the haikuporter tool 23 suitable for the host platform. 24 <HaikuPorts cross repo> is the path to a checked 25 out HaikuPorts cross-compilation repository. 26 <HaikuPorts repo> is the path to a checked out 27 HaikuPorts repository. 28 --build-cross-tools <arch> 29 Assume cross compilation. 30 Toolchain will be compiled and placed in the 31 output directory under "cross-tools". The 32 HAIKU_* tools variables will be set accordingly. 33 <arch> specifies the target architecture, either 34 "x86_gcc2", "x86", "x86_64", "ppc", "m68k", 35 "arm", "arm64", "riscv64", "sparc" 36 This option and --cross-tools-prefix can be 37 specified multiple times. The first cross tools 38 specify the primary tools, the subsequent ones the 39 secondary tools (for "hybrid" images). 40 --cross-tools-prefix <prefix> 41 Assume cross compilation. <prefix> should be a 42 path to the directory where the cross 43 compilation tools are located, plus the platform 44 prefix, e.g. "/path/to/tools/i586-pc-haiku-". 45 This overrides the HAIKU_* tool variables. 46 --cross-tools-source <buildtools dir> 47 Toolchain sources for cross compilation. 48 <buildtools dir> defines the location of the 49 buildtools sources. 50 --distro-compatibility <level> 51 The distribution's level of compatibility with 52 the official Haiku distribution. The generated 53 files will contain the respective trademarks 54 accordingly. 55 official -- the official Haiku distribution. 56 compatible -- a Haiku Compatible (tm) distro. 57 default -- any other distro (default value). 58 --host-only Configure for building tools for the build host 59 only. Haiku cannot be built when configured like 60 this. 61 --include-sources Includes the source code of projects that require 62 either an offer of source code or a copy of the 63 patched sources. This is preferable when 64 distributing on physical mediums. 65 --include-3rdparty Include 3rdparty/ in the build system. 66 -j<n> Only relevant for --build-cross-tools. Is passed 67 on to the make building the build tools. 68 --no-downloads Do not download anything. Useful when trying to 69 bootstrap and build Haiku from source only. 70 --sysroot The location of the cross-compiler sysroot, 71 primarily for CI environments or cross-compilers 72 used outside of the Haiku build system. 73 --target-arch <arch> Haiku only: Specify the target architecture to 74 build for. Must be one of the architectures of the 75 host system. The installed build tools for that 76 architecture will be used. 77 This option can be specified multiple times. The 78 first occurrence specifies the primary 79 architecture of the Haiku to build, subsequent 80 ones the secondary architectures. 81 --use-clang <arch> Build with host Clang instead of GCC cross 82 compiler, targeting <arch> 83 --use-gcc-pipe Build with GCC option -pipe. Speeds up the build 84 process, but uses more memory. 85 --use-gcc-graphite Build with GCC Graphite engine for loop 86 optimizations. (Only for GCC 4+.) 87 --use-32bit Use -m32 flag on 64bit host gcc compiler. 88 --no-full-xattr Do not use Linux/*BSD/Darwin's native extended file 89 attributes as Haiku attributes. If they are still 90 available, they will be used to store hashes for 91 the attribute emulation layer. 92 --no-xattr Do not use Linux/*BSD/Darwin's native extended file 93 attributes for Haiku extended attributes at all, 94 even if they are available. 95 --with-gdb <gdb sources dir> 96 specify the path to a GDB source dir, to build 97 GDB for each arch we build the cross-tools for. 98 --use-stack-protector Build with stack protection enabled 99 --efi-signing-key Private keyfile to sign any EFI bootloaders 100 --with-python <python> Specify python to use, instead of system 101 default. 102 103environment variables: 104 CC The host compiler. Defaults to "gcc". 105 HAIKU_AR_<arch> The static library archiver for <arch>. 106 Defaults to "ar". 107 HAIKU_CC_<arch> The compiler for <arch>. Defaults to "gcc". 108 HAIKU_LD_<arch> The <arch> linker. Defaults to "ld". 109 HAIKU_OBJCOPY_<arch> The <arch> objcopy to be used. Defaults to 110 "objcopy". 111 HAIKU_RANLIB_<arch> The static library indexer for <arch>. Defaults 112 to "ranlib". 113 HAIKU_STRIP_<arch> The <arch> strip command. Defaults to "strip". 114 HAIKU_NASM The nasm assembler (x86 and x86_64 only). 115 HAIKU_CPPFLAGS_<arch> The preprocessor flags for target architecture 116 <arch>. Defaults to "". 117 HAIKU_CCFLAGS_<arch> The C flags for target architecture <arch>. 118 Defaults to "". 119 HAIKU_CXXFLAGS_<arch> The C++ flags for target architecture <arch>. 120 Defaults to "". 121 HAIKU_LINKFLAGS_<arch> The flags passed to the compiler when linking for 122 target architecture <arch>. Defaults to "". 123 HAIKU_LDFLAGS_<arch> The linker flags for target architecture <arch>. 124 Defaults to "". 125 HAIKU_ARFLAGS_<arch> The flags passed to HAIKU_AR for target 126 architecture <arch> for archiving. Defaults to 127 "cru". 128 HAIKU_UNARFLAGS_<arch> The flags passed to HAIKU_AR for target 129 architecture <arch> for unarchiving. Defaults to 130 "x". 131 132Non-default output directories: 133 By default all objects, build configuration, and other related files are 134 stored in /path/to/haiku_source/generated. To store objects in a non-default 135 location, run "../../relative/path/to/haiku_source/configure <options>" from 136 within your non-default location. "jam [ options ] targets" can then be run 137 directly inside your non-default location. Another option is to invoke "jam 138 [ options ] targets" from within haiku_source. This can be accomplished by 139 either "export HAIKU_OUTPUT_DIR=your non-default location" before invoking 140 jam or by creating a symlink of haiku_source/generated pointing to your 141 non-default location and running jam. 142 143 144EOF 145} 146 147# assertparam 148# 149# Checks whether at least one parameter is left. 150# 151assertparam() 152{ 153 if [ $2 -lt 2 ]; then 154 echo $0: \`$1\': Parameter expected. 155 exit 1 156 fi 157} 158 159# assertparams 160# 161# Checks whether at least a certain number of parameters is left. 162# 163assertparams() 164{ 165 if [ $3 -le $2 ]; then 166 echo $0: \`$1\': Not enough parameters. 167 exit 1 168 fi 169} 170 171# absolute_path 172# 173# returns the absolute path of a given path. 174# 175absolute_path() 176{ 177 if [ "x$1" != "x${1#/}" ]; then 178 echo "$1" 179 else 180 echo "`pwd`/$1" 181 fi 182} 183 184# check_dir_exists 185# 186# check if a directory exists or not 187# 188check_dir_exists() 189{ 190 if [ -d "$1" ]; then 191 return 0 192 else 193 return 1 194 fi 195} 196 197# check_file_exists 198# 199# check if a file exists or not 200# 201check_file_exists() 202{ 203 if [ -f "$1" ]; then 204 return 0 205 else 206 return 1 207 fi 208} 209 210# real_path 211# 212# returns the realpath of a symbolic link. 213# 214real_path() 215{ 216 perl -MCwd=realpath -e'print realpath($ARGV[0]), "\n"' "$1" 217} 218 219# relative_to 220# 221# returns $1 relative to $2 222# 223relative_to() 224{ 225 perl -e 'use File::Spec; print File::Spec->abs2rel(@ARGV) . "\n"' \ 226 "$1" "$2" 227} 228 229# valid_toolchain 230# 231# check if a toolchain is valid 232# 233valid_toolchain() 234{ 235 TRIPLET="$1" 236 BASE="$2" 237 SOURCE="$3" 238 if [ ! -d "$BASE" ]; then 239 return 1 240 fi 241 if [ -f "$BASE/bin/$TRIPLET-gcc" ]; then 242 [ "$BASE/bin/$TRIPLET-gcc" -nt "$SOURCE/legacy/gcc/configure" ] && \ 243 [ "$BASE/bin/$TRIPLET-gcc" -nt "$SOURCE/gcc/gcc/configure" ] 244 return $? 245 fi 246 return 1 247} 248 249# is_legacy_gcc 250# 251# Determines if the specified GCC version is a "legacy" (i.e. GCC < 4) one. 252# 253is_legacy_gcc() 254{ 255 if [ `echo $1 | cut -d'.' -f1` -lt 4 ]; then 256 echo 1 257 else 258 echo 0 259 fi 260} 261 262# standard_gcc_settings 263# 264# Sets the variables for a GCC platform. 265# 266standard_gcc_settings() 267{ 268 local gcc="$1" 269 270 if which greadlink > /dev/null 2>&1; then 271 readlink="greadlink -e" 272 elif which realpath > /dev/null 2>&1; then 273 readlink=realpath 274 elif readlink -e / > /dev/null 2>&1; then 275 readlink="readlink -e" 276 else 277 readlink=real_path 278 fi 279 280 # PLATFORM_LINKLIBS 281 local gcclib=`$gcc -print-libgcc-file-name` 282 local gccdir=`dirname ${gcclib}` 283 284 local gccRawVersion=`$gcc -dumpversion` 285 local gccMachine=`$gcc -dumpmachine` 286 287 # determine architecture from machine triple 288 case $gccMachine in 289 arm-*) targetCpu=arm;; 290 aarch64-*) targetCpu=arm64;; 291 i?86-*) targetCpu=x86;; 292 m68k-*) targetCpu=m68k;; 293 powerpc-*) targetCpu=ppc;; 294 riscv64-*) targetCpu=riscv64;; 295 sparc64-*) targetCpu=sparc;; 296 x86_64-*) targetCpu=x86_64;; 297 *) 298 echo "Unsupported gcc target machine: $gccMachine" >&2 299 exit 1 300 ;; 301 esac 302 303 local targetArch=$targetCpu 304 305 case $gccRawVersion in 306 2.9*) 307 # check for correct (most up-to-date) legacy compiler and complain 308 # if an older one is installed 309 if [ $gccRawVersion != $haikuRequiredLegacyGCCVersion ]; then 310 echo "GCC version $haikuRequiredLegacyGCCVersion is required!"; 311 echo "Please download it from www.haiku-os.org..."; 312 exit 1; 313 fi 314 315 targetArch=x86_gcc2 316 ;; 317 esac 318 319 local bootLibgcc 320 local bootLibSupCxx 321 local bootCxxHeaders 322 local boot32Libgcc 323 local boot32LibSupCxx 324 local boot32CxxHeaders 325 case $gccMachine in 326 x86_64-*) 327 # Boot loader is 32-bit, need the 32-bit libs and c++ config 328 boot32Libgcc=`$gcc -m32 -print-file-name=libgcc.a` 329 boot32LibSupCxx=`$gcc -m32 -print-file-name=libsupc++.a` 330 bootLibgcc=`$gcc -print-file-name=libgcc.a` 331 bootLibSupCxx=`$gcc -print-file-name=libsupc++.a` 332 333 local headersBase=$gccdir/../../../.. 334 local headers=$headersBase/$gccMachine/include/c++/$gccRawVersion 335 if [ ! -d $headers ]; then 336 headers=$headersBase/include/c++/$gccRawVersion 337 fi 338 boot32CxxHeaders="$headers/$gccMachine/32" 339 bootCxxHeaders="$headers/$gccMachine" 340 ;; 341 esac 342 343 # determine whether graphite loop optimization should/can be used 344 local useGraphite=`get_variable HAIKU_USE_GCC_GRAPHITE_$targetCpu` 345 if [ -z "$useGraphite" ]; then 346 useGraphite=$useGccGraphiteDefault 347 fi 348 349 if [ "$useGraphite" != 0 ]; then 350 UNUSED=`echo "int main() {}" | $gcc -xc -c -floop-block - 2>&1` 351 if [ $? != 0 ]; then 352 echo "GCC Graphite loop optimizations cannot be used on $targetArch" 353 useGraphite=0 354 fi 355 fi 356 357 set_variable HAIKU_CPU_$targetArch $targetCpu 358 359 get_build_tool_path CC_$targetArch "$gcc" 360 set_variable HAIKU_CC_IS_LEGACY_GCC_$targetArch \ 361 `is_legacy_gcc $gccRawVersion` 362 set_variable HAIKU_CC_IS_CLANG_$targetArch $useClang 363 set_variable HAIKU_GCC_MACHINE_$targetArch $gccMachine 364 set_variable HAIKU_GCC_LIB_DIR_$targetArch $gccdir 365 set_variable HAIKU_BOOT_CXX_HEADERS_DIR_$targetArch "$bootCxxHeaders" 366 set_variable HAIKU_BOOT_LIBSUPCXX_$targetArch "$bootLibSupCxx" 367 set_variable HAIKU_BOOT_LIBGCC_$targetArch $bootLibgcc 368 set_variable HAIKU_BOOT_32_CXX_HEADERS_DIR_$targetArch "$boot32CxxHeaders" 369 set_variable HAIKU_BOOT_32_LIBSUPCXX_$targetArch "$boot32LibSupCxx" 370 set_variable HAIKU_BOOT_32_LIBGCC_$targetArch $boot32Libgcc 371 set_variable HAIKU_USE_GCC_GRAPHITE_$targetArch $useGraphite 372 373 standard_gcc_settings_targetArch=$targetArch 374} 375 376# set_variable 377# 378# Set the value of a variable. 379# 380set_variable() 381{ 382 eval "$1=\"$2\"" 383} 384 385# get_variable 386# 387# Echo the value of a variable. 388# 389get_variable() 390{ 391 eval "echo \${$1}" 392} 393 394# set_default_value 395# 396# Set the value for a variable, if no value is set yet. 397# 398set_default_value() 399{ 400 eval "$1=\${$1-$2}" 401} 402 403# get_build_tool_path 404# 405# Gets a usable absolute path of a build tool. 406# 407get_build_tool_path() 408{ 409 local var="HAIKU_$1" 410 local varval="`get_variable $var`" 411 local cmd="$2" 412 413 if [ ! -z "$varval" ]; then 414 # this variable is already set (probably by user) so grab its contents 415 cmd=$varval 416 fi 417 418 local path=${cmd%% *} 419 420 if [ -f "$path" ]; then 421 # get absolute path from relative path 422 local oldPwd="`pwd`" 423 cd "`dirname "$path"`" 424 path="`pwd`/`basename "$path"`" 425 cd $oldPwd 426 else 427 which "$path" > /dev/null 2>&1 || { 428 echo "Build tool \"$path\" not found (maybe specify it in $var?)" >&2 429 exit 1 430 } 431 fi 432 433 if test "${cmd#* }" != "$cmd"; then 434 # $cmd contains arguments, so preserve them (and only them) 435 cmd=${cmd#* } 436 else 437 # $cmd does not contain arguments, so unset it 438 cmd= 439 fi 440 eval "$var=\"$path $cmd\"" 441} 442 443# check_native_xattrs 444# 445# Checks the host platform's support for extended attributes. 446# 0: no support, 1: only enough for xattr-ref, 2: full support 447# 448check_native_xattrs() 449{ 450 local xattr_set= 451 local xattr_set_args= 452 local xattr_get= 453 local xattr_get_args= 454 case $HOST_PLATFORM in 455 haiku_host) 456 xattr_set="addattr"; xattr_set_args="\$NAME \"\$VALUE\"" 457 xattr_get="catattr"; xattr_get_args="\$NAME" 458 ;; 459 darwin) 460 xattr_set="xattr"; xattr_set_args="-w \$NAME \"\$VALUE\"" 461 xattr_get="xattr"; xattr_get_args="-p \$NAME" 462 ;; 463 freebsd) 464 xattr_set="setextattr"; xattr_set_args="user \$NAME \"\$VALUE\"" 465 xattr_get="getextattr"; xattr_get_args="user \$NAME" 466 ;; 467 linux) 468 xattr_set="setfattr"; xattr_set_args="-n user.\$NAME -v \"\$VALUE\"" 469 xattr_get="getfattr"; xattr_get_args="-n user.\$NAME" 470 ;; 471 *) 472 return 0 473 ;; 474 esac 475 if ! type $xattr_set >/dev/null 2>&1; then 476 echo "$0: could not find $xattr_set, assuming host has no extended attributes" 477 return 0 478 elif ! type $xattr_get >/dev/null 2>&1; then 479 echo "$0: could not find $xattr_get, assuming host has no extended attributes" 480 return 0 481 fi 482 483 mkdir -p "$outputDir" 484 echo "xattr test file" >"$outputDir/xattrtest" 485 local i=0 486 # on round 0, we test if we can set 3 attrs of 1K each (enough for xattr-ref) 487 # on round 1, we test if we can set 3 attrs of 45K each (enough for full xattr) 488 while [ $i -lt 2 ]; do 489 local j=0 490 while [ $j -lt 3 ]; do 491 NAME=attr$j 492 VALUE=`printf '%*s' $((1024 + $i * 45056)) "" | tr ' ' x` 493 if [ `echo -n $VALUE | wc -c` -lt $((1024 + $i * 45056)) ]; then 494 echo "$0: warning: could not generate test data for extended attributes" 495 rm "$outputDir/xattrtest" 496 return $i 497 elif ! $xattr_set `eval echo \"$xattr_set_args\"` \ 498 "$outputDir/xattrtest" >/dev/null 2>&1 ; then 499 rm "$outputDir/xattrtest" 500 return $i 501 fi 502 j=$((j+1)) 503 done 504 i=$((i+1)) 505 done 506 rm "$outputDir/xattrtest" 507 return 2 508} 509 510is_in_list() 511{ 512 local element 513 for element in $2; do 514 if [ "$1" = "$element" ]; then 515 return 0 516 fi 517 done 518 return 1 519} 520 521# check for --help or -h and show usage immediately 522if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then 523 usage; exit 0; 524fi 525 526# get cwd and the source directory 527currentDir=`pwd` 528cd `dirname "$0"` 529sourceDir=`pwd` 530cd "$currentDir" 531 532# determine output directory 533if [ "$currentDir" = "$sourceDir" ]; then 534 outputDir=$currentDir/generated 535else 536 outputDir=$currentDir 537fi 538buildOutputDir="$outputDir/build" 539HAIKU_BUILD_ATTRIBUTES_DIR="$outputDir/attributes" 540buildConfigFile="$buildOutputDir/BuildConfig" 541 542# check for update request 543if [ "$1" = "--update" ]; then 544 if ! [ -e "$buildConfigFile" ]; then 545 echo $0 --update: \'$buildConfigFile\' not found - updating not possible. 546 exit 1 547 fi 548 # get last configure invocation and flags from BuildConfig and call ourselves with it 549 lastPwd=`grep "#d " "$buildConfigFile" | cut -c 4-` 550 lastConfig=`grep "#c " "$buildConfigFile" | cut -c 4-` 551 lastEnv=`grep "#e " "$buildConfigFile" | cut -c 4-` 552 lastArgs=`grep "#a " "$buildConfigFile" | cut -c 4-` 553 if [ -z "$lastConfig" ]; then 554 echo "$0 --update: The previous configure invocation was not properly" \ 555 "encoded into '$buildConfigFile' - updating not possible." 556 exit 1 557 fi 558 cd "$lastPwd" 559 if [ -n "$lastEnv" ]; then 560 export $lastEnv 561 fi 562 $lastConfig $lastArgs 563 exit $? 564fi 565 566# backup the passed arguments 567configureArgs="$@" 568configurePath=$0 569configureDir=`dirname $configurePath` 570 571# backup relevant environs 572configureEnvirons= 573for var in `env`; do 574 case "$var" in 575 CC\=*|HAIKU*\=*|JAMSHELL\=*) 576 configureEnvirons="$configureEnvirons $var" 577 ;; 578 esac 579done 580 581# ensure umask is not too restrictive 582if [ `umask` -gt 22 ]; then 583 echo Your umask is too restrictive "(should be <= 0022;" is actually `umask`")" 584 echo 585 echo Additionally, if the source tree was cloned with a too-restrictive umask, 586 echo you will need to run \"git checkout\" again to fix this. 587 exit 1 588fi 589 590# internal default parameter values 591# 592platform=`uname` 593platformMachine=`uname -m` 594targetArchs= 595buildCrossTools= 596buildCrossToolsScript="$sourceDir/build/scripts/build_cross_tools" 597buildCrossToolsJobs= 598useClang=0 599useGccGraphiteDefault=0 600unknownArchIndex=1 601haikuTargetArchs= 602gdbSources= 603 604if [ -z "$CC" ]; then 605 CC=gcc 606fi 607if [ $(is_legacy_gcc $($CC -dumpversion)) -ne 0 ]; then 608 echo The host tools cannot be built with a legacy version of GCC. 609 echo Please specify a more modern compiler in the "CC" environ. 610 exit 1 611fi 612 613# detect the build platform 614case "${platform}" in 615 Darwin) HOST_PLATFORM=darwin ;; 616 FreeBSD) HOST_PLATFORM=freebsd 617 if [ "$HAIKU_HOST_USE_32BIT" = 1 ] ; then 618 echo Unsupported platform: FreeBSD ${platformMachine} 619 exit 1 620 fi ;; 621 Haiku) HOST_PLATFORM=haiku_host ;; 622 Linux) HOST_PLATFORM=linux ;; 623 OpenBSD) HOST_PLATFORM=openbsd ;; 624 *) echo Unsupported platform: ${platform} 625 exit 1 ;; 626esac 627 628case $HOST_PLATFORM in 629 darwin|freebsd|openbsd) statCmd='stat -f' ;; 630 *) statCmd='stat -c' ;; 631esac 632 633# ensure git checkout was not done with a restrictive umask 634if [ `$statCmd '%a' "$sourceDir/data/system/boot/SetupEnvironment"` -lt 644 ]; then 635 echo "The source tree was cloned with a umask > 0022. It seems you" 636 echo have already corrected your umask, but not re-checked-out the 637 echo source tree. Try running: 638 echo " git checkout --force" 639 echo to fix this problem. 640 exit 1 641fi 642 643# exported (BuildSetup) default parameter values 644# 645GIT_DIR=`git -C "$configureDir" rev-parse --git-dir | sed 's/^gitdir: //'` 646HOST_GCC_MACHINE=`$CC -dumpmachine` 647HAIKU_INCLUDE_SOURCES=0 648HAIKU_INCLUDE_3RDPARTY=0 649HAIKU_DISTRO_COMPATIBILITY=default 650TARGET_PLATFORM=haiku 651HAIKU_USE_GCC_PIPE=0 652HAIKU_HOST_USE_32BIT=0 653HAIKU_HOST_USE_XATTR= 654HAIKU_HOST_USE_XATTR_REF= 655HAIKU_HOST_BUILD_ONLY=0 656HOST_EXTENDED_REGEX_SED="sed -r" 657HOST_GCC_LD=`$CC -print-prog-name=ld` 658HOST_GCC_OBJCOPY=`$CC -print-prog-name=objcopy` 659HOST_SHA256= 660HOST_HAIKU_PORTER= 661HAIKU_PORTS= 662HAIKU_PORTS_CROSS= 663HAIKU_IS_BOOTSTRAP=0 664HAIKU_NO_DOWNLOADS=0 665 666HAIKU_PACKAGING_ARCHS= 667 668set_default_value HAIKU_NASM nasm 669 670if sha256sum < /dev/null > /dev/null 2>&1; then 671 HOST_SHA256=sha256sum 672elif sha256 < /dev/null > /dev/null 2>&1; then 673 HOST_SHA256="sha256 -q" 674elif shasum < /dev/null > /dev/null 2>&1; then 675 HOST_SHA256="shasum -a 256" 676else 677 echo "Error: Neither sha256sum nor sha256 seem to be available!" >&2 678 exit 1 679fi 680 681haikuRequiredLegacyGCCVersion="2.95.3-haiku-2017_07_20" 682export haikuRequiredLegacyGCCVersion 683 # version of legacy gcc required to build haiku 684supportedTargetArchs=" 685 arm 686 arm64 687 m68k 688 ppc 689 riscv64 690 sparc 691 x86 692 x86_64 693 x86_gcc2 694 " 695 696# parse parameters 697# 698while [ $# -gt 0 ] ; do 699 case "$1" in 700 --sysroot) 701 assertparam "$1" $# 702 crossToolsSysroot=$2 703 shift 2 704 ;; 705 --bootstrap) 706 assertparams "$1" 3 $# 707 HOST_HAIKU_PORTER="`absolute_path $2`" 708 HAIKU_PORTS_CROSS="`absolute_path $3`" 709 HAIKU_PORTS="`absolute_path $4`" 710 HAIKU_IS_BOOTSTRAP=1 711 HAIKU_NO_DOWNLOADS=1 712 check_file_exists "$HOST_HAIKU_PORTER" || ( 713 echo "Invalid path to haikuporter: $HOST_HAIKU_PORTER" >&2 714 exit 1 715 ) 716 check_dir_exists "$HAIKU_PORTS" || ( 717 echo "Non-existent directory $HAIKU_PORTS" >&2 718 exit 1 719 ) 720 check_dir_exists "$HAIKU_PORTS_CROSS" || ( 721 echo "Non-existent directory $HAIKU_PORTS_CROSS" >&2 722 exit 1 723 ) 724 shift 4 725 ;; 726 --cross-tools-source) 727 assertparam "$1" $# 728 buildCrossTools=$2 729 shift 2 730 ;; 731 --build-cross-tools) 732 assertparam "$1" $# 733 targetArch=$2 734 shift 2 735 case "$targetArch" in 736 x86_gcc2) targetMachine=i586-pc-haiku;; 737 x86) targetMachine=i586-pc-haiku;; 738 x86_64) targetMachine=x86_64-unknown-haiku;; 739 ppc) targetMachine=powerpc-apple-haiku;; 740 m68k) targetMachine=m68k-unknown-haiku;; 741 arm) targetMachine=arm-unknown-haiku;; 742 arm64) targetMachine=aarch64-unknown-haiku;; 743 riscv64) targetMachine=riscv64-unknown-haiku;; 744 sparc) targetMachine=sparc64-unknown-haiku;; 745 *) 746 echo "Unsupported target architecture: $targetArch" >&2 747 exit 1 748 ;; 749 esac 750 set_variable buildCrossToolsMachine_$targetArch $targetMachine 751 targetArchs="$targetArchs $targetArch" 752 ;; 753 --cross-tools-prefix) 754 assertparam "$1" $# 755 targetArch=unknown${unknownArchIndex} 756 set_variable crossToolsPrefix_$targetArch "$2" 757 targetArchs="$targetArchs $targetArch" 758 unknownArchIndex=$(($unknownArchIndex + 1)) 759 shift 2 760 ;; 761 --distro-compatibility) 762 assertparam "$1" $# 763 HAIKU_DISTRO_COMPATIBILITY=$2 764 case "$HAIKU_DISTRO_COMPATIBILITY" in 765 official) ;; 766 compatible) ;; 767 default) ;; 768 *) echo "Invalid distro compatibility" \ 769 "level: $HAIKU_DISTRO_COMPATIBILITY" 770 exit 1;; 771 esac 772 shift 2 773 ;; 774 --host-only) HAIKU_HOST_BUILD_ONLY=1; shift 1;; 775 --include-sources) HAIKU_INCLUDE_SOURCES=1; shift 1;; 776 --include-3rdparty) HAIKU_INCLUDE_3RDPARTY=1; shift 1;; 777 -j*) buildCrossToolsJobs="$1"; shift 1;; 778 --no-downloads) HAIKU_NO_DOWNLOADS=1; shift 1;; 779 --target-arch) 780 assertparam "$1" $# 781 targetArch=$2 782 shift 2 783 if [ ! "$platform" = Haiku ]; then 784 echo "--target-arch can only be specified on Haiku." >&2 785 exit 1 786 fi 787 is_in_list "$targetArch" "$supportedTargetArchs" || ( 788 echo "Unsupported target architecture: \"$targetArch\"" >&2 789 exit 1 790 ) 791 haikuTargetArchs="$haikuTargetArchs $targetArch" 792 ;; 793 --use-clang) 794 assertparam "$1" $# 795 targetArch=$2 796 useClang=1 797 case "$targetArch" in 798 x86) targetMachine=i586-pc-haiku;; 799 x86_64) targetMachine=x86_64-unknown-haiku;; 800 ppc) targetMachine=powerpc-apple-haiku;; 801 arm) targetMachine=arm-unknown-haiku;; 802 arm64) targetMachine=aarch64-unknown-haiku;; 803 riscv64) targetMachine=riscv64-unknown-haiku;; 804 sparc) targetMachine=sparc64-unknown-haiku;; 805 *) 806 echo "Unsupported target architecture: $2" >&2 807 exit 1 808 ;; 809 esac 810 get_build_tool_path clang clang 811 if [ -z `get_variable "crossToolsPrefix_$targetArch"` ] \ 812 && [ -z `get_variable buildCrossToolsMachine_$targetArch` ]; then 813 set_variable crossToolsPrefix_$targetArch llvm- 814 fi 815 clangVersion=`$HAIKU_clang -v 2>&1 | head -1 | cut -d " " -f3` 816 if [ `echo $clangVersion | cut -d'.' -f1` -lt 7 ]; then 817 echo "Haiku requires Clang 7 or better to build, but you have $clangVersion." 818 echo "Please install a newer version." 819 exit 1 820 fi 821 targetArchs="$targetArchs $targetArch" 822 shift 2 823 ;; 824 --use-gcc-pipe) HAIKU_USE_GCC_PIPE=1; shift 1;; 825 --use-gcc-graphite) useGccGraphiteDefault=1; shift 1;; 826 --use-32bit) HAIKU_HOST_USE_32BIT=1; shift 1;; 827 --no-full-xattr)HAIKU_HOST_USE_XATTR=0; shift 1;; 828 --no-xattr) HAIKU_HOST_USE_XATTR_REF=0; shift 1;; 829 --with-gdb) gdbSources=$2; shift 2;; 830 --use-stack-protector) HAIKU_USE_STACK_PROTECTOR=1; shift 1;; 831 --efi-signing-key) 832 assertparam "$1" $# 833 HAIKU_EFI_SIGNING_KEY="$2" 834 shift 2 835 ;; 836 --with-python) pythonPath=$2; shift 2;; 837 *) echo Invalid argument: \`$1\'; exit 1;; 838 esac 839done 840 841# check for case-sensitive filesystem 842mkdir haikuCaseTest 2>/dev/null 843mkdir haikucasetest 2>/dev/null 844caseInsensitive=$? 845rmdir haikuCaseTest haikucasetest 2>/dev/null 846if [ $caseInsensitive != 0 ]; then 847 echo "You need a case-sensitive file-system to build Haiku." 848 if [ $HOST_PLATFORM = "darwin" ]; then 849 echo "You can create a case-sensitive disk image using Disk Utility." 850 fi 851 exit 1 852fi 853 854# check xattr support 855if [ -z $HAIKU_HOST_USE_XATTR_REF ]; then 856 check_native_xattrs 857 attrSupport=$? 858 if [ $attrSupport = 2 ] && [ -z $HAIKU_HOST_USE_XATTR ]; then 859 HAIKU_HOST_USE_XATTR=1 860 elif [ $attrSupport = 1 ]; then 861 HAIKU_HOST_USE_XATTR_REF=1 862 fi 863fi 864if [ -z $HAIKU_HOST_USE_XATTR ]; then HAIKU_HOST_USE_XATTR=0; fi 865if [ -z $HAIKU_HOST_USE_XATTR_REF ]; then HAIKU_HOST_USE_XATTR_REF=0; fi 866 867# determine how to invoke sed with extended regexp support for non-GNU sed 868if [ $HOST_PLATFORM = "darwin" ]; then 869 HOST_EXTENDED_REGEX_SED="sed -E" 870fi 871 872# pick a JAMSHELL 873if [ "$JAMSHELL" = "" ]; then 874 if check_file_exists /bin/dash; then 875 JAMSHELL=/bin/dash 876 else 877 JAMSHELL=/bin/sh 878 fi 879fi 880if ! $JAMSHELL -c true; then 881 echo "$JAMSHELL does not work! Please specify a working JAMSHELL." 882 exit 1 883fi 884 885# locate python 886if [ -n "$pythonPath" ] && "$pythonPath" --version < /dev/null > /dev/null 2>&1; then 887 HOST_PYTHON="$pythonPath" 888elif python3 --version < /dev/null > /dev/null 2>&1; then 889 HOST_PYTHON="python3" 890elif python --version < /dev/null > /dev/null 2>&1; then 891 HOST_PYTHON="python" 892else 893 echo "a python interpreter is required" 894 exit 1 895fi 896 897# check is python is new enough 898# usage of python by HDS requires at least 3.9 899PYTHON_VERSION=$("$HOST_PYTHON" --version | sed -e 's/Python //') 900 901case $PYTHON_VERSION in 902 2.* | 3.[1-8].*) 903 echo "Python $PYTHON_VERSION is too old, need at least Python 3.9" 904 exit 1 905 ;; 906 *) 907 ;; 908esac 909 910# check if nasm can actually output ELF files 911# (the stock version in OSX can't) 912# XXX: should probably only test for x86* arch 913if [ "$("$HAIKU_NASM" -hf | grep -c elf'[36][24] ')" -ne "2" ]; then 914 echo "$HAIKU_NASM cannot generate ELF files. Please install a working version." 915 if [ $HOST_PLATFORM = "darwin" ]; then 916 echo "You can install it from Mac Ports." 917 echo "Mac Ports is available at: http://www.macports.org/" 918 fi 919 exit 1 920fi 921 922# create output directory 923mkdir -p "$buildOutputDir" || exit 1 924 925if [ "$HAIKU_HOST_BUILD_ONLY" = 1 ]; then 926 invalidCommand=$sourceDir/build/scripts/host_build_only 927 HAIKU_AR=$invalidCommand 928 HAIKU_CC=$invalidCommand 929 HAIKU_LD=$invalidCommand 930 HAIKU_OBJCOPY=$invalidCommand 931 HAIKU_RANLIB=$invalidCommand 932 HAIKU_ELFEDIT=$invalidCommand 933 HAIKU_NASM=$invalidCommand 934 HAIKU_STRIP=$invalidCommand 935else 936 # On Haiku determine target architectures and tools automatically. 937 if [ -z "$targetArchs" ]; then 938 if [ $HOST_PLATFORM != haiku_host ]; then 939 echo "Please specify the build tools to use or build (via" \ 940 "--cross-tools-prefix or --build-cross-tools) or specify a" \ 941 "host-only build (--host-only)." >&2 942 echo "For more info, invoke $0 --help" 943 exit 1 944 fi 945 946 # determine primary architecture 947 targetArch=`package list -i /system/packages/haiku-*.hpkg \ 948 | sed '/^\s*architecture:/!d; s,^\s*architecture:\s*,,'` 949 is_in_list "$targetArch" "$supportedTargetArchs" || ( 950 echo "Unsupported target architecture: \"$targetArch\"" >&2 951 exit 1 952 ) 953 targetArchs=$targetArch 954 955 set_default_value HAIKU_AR_$targetArch ar 956 set_default_value HAIKU_CC_$targetArch gcc 957 set_default_value HAIKU_LD_$targetArch ld 958 set_default_value HAIKU_OBJCOPY_$targetArch objcopy 959 set_default_value HAIKU_RANLIB_$targetArch ranlib 960 set_default_value HAIKU_ELFEDIT_$targetArch elfedit 961 set_default_value HAIKU_STRIP_$targetArch strip 962 963 # determine secondary architectures 964 for targetArch in $supportedTargetArchs; do 965 if [ -e /system/packages/haiku_$targetArch-*.hpkg ]; then 966 targetArchs="$targetArchs $targetArch" 967 set_default_value HAIKU_AR_$targetArch ar-$targetArch 968 set_default_value HAIKU_CC_$targetArch gcc-$targetArch 969 set_default_value HAIKU_LD_$targetArch ld-$targetArch 970 set_default_value HAIKU_OBJCOPY_$targetArch objcopy-$targetArch 971 set_default_value HAIKU_RANLIB_$targetArch ranlib-$targetArch 972 set_default_value HAIKU_ELFEDIT_$targetArch elfedit-$targetArch 973 set_default_value HAIKU_STRIP_$targetArch strip-$targetArch 974 fi 975 done 976 977 # The target architectures might have been specified explicitly. 978 if [ -n "$haikuTargetArchs" ]; then 979 for targetArch in $haikuTargetArchs; do 980 is_in_list "$targetArch" "$targetArchs" || ( 981 echo "Unsupported target architecture: \"$targetArch\"." \ 982 "Only native architectures of the host platform can" \ 983 "be specified." >&2 984 exit 1 985 ) 986 done 987 targetArchs="$haikuTargetArchs" 988 fi 989 fi 990 991 if [ "$targetArchs" = " x86_gcc2" ]; then 992 echo "Building a GCC2-only Haiku is no longer supported." 993 echo "Please configure the secondary architecture." 994 exit 1 995 fi 996 997 isPrimaryArch=1 998 for targetArch in $targetArchs; do 999 # Note: targetArch is "unknown<n>" at this point if a cross-tools 1000 # prefix was specified. The standard_gcc_settings call below will get 1001 # the actual architecture. 1002 1003 for existingArch in $HAIKU_PACKAGING_ARCHS; do 1004 if [ $existingArch = $targetArch ]; then 1005 # somehow we wound up with a duplicate arch; skip this one 1006 targetArch= 1007 break 1008 fi 1009 done 1010 if [ -z "$targetArch" ]; then 1011 continue 1012 fi 1013 1014 crossToolsPrefix=`get_variable crossToolsPrefix_$targetArch` 1015 1016 # build cross tools from sources 1017 if [ -n "$buildCrossTools" -a -z "$crossToolsPrefix" ]; then 1018 crossToolsDir="$outputDir/cross-tools-$targetArch" 1019 targetMachine=`get_variable buildCrossToolsMachine_$targetArch` 1020 script="$buildCrossToolsScript" 1021 scriptArgs= 1022 if [ $targetArch != x86_gcc2 ]; then 1023 script="${script}_gcc4" 1024 scriptArgs="$targetMachine" 1025 set_default_value HAIKU_USE_GCC_GRAPHITE_$targetArch \ 1026 $useGccGraphiteDefault 1027 fi 1028 secondaryArch= 1029 if [ -z "$isPrimaryArch" ]; then 1030 secondaryArch=$targetArch 1031 fi 1032 1033 case $HOST_PLATFORM in 1034 freebsd|openbsd) MAKE=gmake;; 1035 *) MAKE=make;; 1036 esac 1037 1038 if ! valid_toolchain "${targetMachine}" "${crossToolsDir}" "${buildCrossTools}"; then 1039 MAKE=$MAKE \ 1040 SECONDARY_ARCH=$secondaryArch \ 1041 HAIKU_USE_GCC_GRAPHITE=`get_variable \ 1042 HAIKU_USE_GCC_GRAPHITE_$targetArch` \ 1043 HAIKU_USE_GCC_PIPE=$HAIKU_USE_GCC_PIPE \ 1044 HAIKU_USE_GDB="$gdbSources" \ 1045 HAIKU_USE_SYSROOT="$crossToolsSysroot" \ 1046 "$script" $scriptArgs "$sourceDir" "$buildCrossTools" \ 1047 "$crossToolsDir" $buildCrossToolsJobs || exit 1 1048 else 1049 echo "$targetArch crosstools already exist in $crossToolsDir; skipping build" 1050 fi 1051 crossToolsPrefix="$crossToolsDir/bin/${targetMachine}-" 1052 fi 1053 1054 # prepare gcc settings and get the actual target architecture 1055 if [ $useClang = 1 ]; then 1056 gcc="$HAIKU_clang -target ${targetMachine}" 1057 if [ ! -z "${crossToolsPrefix}" ]; then 1058 gcc="$gcc -B ${crossToolsPrefix}" 1059 fi 1060 1061 # Clang's compiler intrinsics are not compatible with GCC's or even 1062 # across versions of Clang, so we must collect them for use in the build. 1063 mkdir -p "$outputDir/clang_headers" || exit 1 1064 clangHeadersDir=`$gcc -print-resource-dir`/include/ 1065 case $targetArch in 1066 x86*) cp $clangHeadersDir/*intrin* $clangHeadersDir/mm3* "$outputDir/clang_headers" || exit 1 ;; 1067 ppc*) cp $clangHeadersDir/*altivec* "$outputDir/clang_headers" || exit 1 ;; 1068 arm*) cp $clangHeadersDir/*arm* "$outputDir/clang_headers" || exit 1 ;; 1069 esac 1070 elif [ -z "${crossToolsPrefix}" ]; then 1071 gcc=`get_variable HAIKU_CC_$targetArch` 1072 else 1073 gcc="${crossToolsPrefix}gcc" 1074 fi 1075 1076 if [ -z "$gcc" ]; then 1077 echo "Please specify the build tools to use or build (via" \ 1078 "--cross-tools-prefix or --build-cross-tools)." >&2 1079 echo "For more info, invoke $0 --help" 1080 exit 1 1081 fi 1082 standard_gcc_settings "$gcc" 1083 targetArch=$standard_gcc_settings_targetArch 1084 1085 # set default values for flags 1086 set_default_value HAIKU_CPPFLAGS_$targetArch "" 1087 set_default_value HAIKU_CCFLAGS_$targetArch "" 1088 set_default_value HAIKU_CXXFLAGS_$targetArch "" 1089 set_default_value HAIKU_LINKFLAGS_$targetArch "" 1090 set_default_value HAIKU_LDFLAGS_$targetArch "" 1091 set_default_value HAIKU_ARFLAGS_$targetArch cru 1092 set_default_value HAIKU_UNARFLAGS_$targetArch x 1093 1094 # Override the cross tools variables, if the tools were built or a 1095 # prefix was specified. 1096 if [ -n "$crossToolsPrefix" ]; then 1097 get_build_tool_path AR_$targetArch ${crossToolsPrefix}ar 1098 get_build_tool_path OBJCOPY_$targetArch ${crossToolsPrefix}objcopy 1099 get_build_tool_path RANLIB_$targetArch ${crossToolsPrefix}ranlib 1100 get_build_tool_path STRIP_$targetArch ${crossToolsPrefix}strip 1101 1102 get_build_tool_path LD_$targetArch ${crossToolsPrefix}ld 1103 if [ `get_variable HAIKU_CC_IS_LEGACY_GCC_$targetArch` -eq 0 ]; then 1104 get_build_tool_path ELFEDIT_$targetArch ${crossToolsPrefix}elfedit 1105 fi 1106 fi 1107 1108 # check whether the Haiku compiler really targets Haiku 1109 targetMachine=`get_variable HAIKU_GCC_MACHINE_$targetArch` 1110 case "$targetMachine" in 1111 *-*-haiku) ;; 1112 *) 1113 echo The compiler specified as Haiku target compiler is not a \ 1114 valid Haiku cross-compiler. Please see ReadMe.cross-compile. >&2 1115 echo compiler: $HAIKU_CC 1116 echo compiler is configured for target: $targetMachine 1117 exit 1 ;; 1118 esac 1119 1120 HAIKU_PACKAGING_ARCHS="$HAIKU_PACKAGING_ARCHS $targetArch" 1121 isPrimaryArch= 1122 done 1123fi 1124 1125# Generate BuildConfig 1126cat << EOF > "$buildConfigFile" 1127# -- WARNING -- 1128# This file was AUTOMATICALLY GENERATED by configure, and will be completely 1129# overwritten the next time configure is run. 1130# 1131#d ${currentDir} 1132#c ${configurePath} 1133#e ${configureEnvirons} 1134#a ${configureArgs} 1135 1136GIT_DIR ?= "${GIT_DIR}" ; 1137 1138HOST_PLATFORM ?= "${HOST_PLATFORM}" ; 1139TARGET_PLATFORM ?= "${TARGET_PLATFORM}" ; 1140HAIKU_PACKAGING_ARCHS ?= ${HAIKU_PACKAGING_ARCHS} ; 1141 1142HAIKU_NO_DOWNLOADS ?= "${HAIKU_NO_DOWNLOADS}" ; 1143HAIKU_INCLUDE_SOURCES ?= "${HAIKU_INCLUDE_SOURCES}" ; 1144HAIKU_INCLUDE_3RDPARTY ?= "${HAIKU_INCLUDE_3RDPARTY}" ; 1145HAIKU_DISTRO_COMPATIBILITY ?= "${HAIKU_DISTRO_COMPATIBILITY}" ; 1146 1147HAIKU_USE_GCC_PIPE ?= "${HAIKU_USE_GCC_PIPE}" ; 1148HAIKU_HOST_USE_32BIT ?= "${HAIKU_HOST_USE_32BIT}" ; 1149HAIKU_HOST_USE_XATTR ?= "${HAIKU_HOST_USE_XATTR}" ; 1150HAIKU_HOST_USE_XATTR_REF ?= "${HAIKU_HOST_USE_XATTR_REF}" ; 1151HAIKU_HOST_BUILD_ONLY ?= "${HAIKU_HOST_BUILD_ONLY}" ; 1152 1153JAMSHELL ?= ${JAMSHELL} -e -c ; 1154 1155HOST_CC ?= ${CC} ; 1156HOST_GCC_MACHINE ?= ${HOST_GCC_MACHINE} ; 1157HOST_LD ?= ${HOST_GCC_LD} ; 1158HOST_OBJCOPY ?= ${HOST_GCC_OBJCOPY} ; 1159HOST_EXTENDED_REGEX_SED ?= ${HOST_EXTENDED_REGEX_SED} ; 1160HOST_SHA256 ?= ${HOST_SHA256} ; 1161HOST_PYTHON ?= ${HOST_PYTHON} ; 1162HAIKU_NASM ?= ${HAIKU_NASM} ; 1163 1164HAIKU_BUILD_ATTRIBUTES_DIR ?= "${HAIKU_BUILD_ATTRIBUTES_DIR}" ; 1165 1166HOST_HAIKU_PORTER ?= ${HOST_HAIKU_PORTER} ; 1167HAIKU_PORTS ?= ${HAIKU_PORTS} ; 1168HAIKU_PORTS_CROSS ?= ${HAIKU_PORTS_CROSS} ; 1169HAIKU_IS_BOOTSTRAP ?= ${HAIKU_IS_BOOTSTRAP} ; 1170 1171HAIKU_BOOT_EFI_PRIVATE_KEYFILE ?= ${HAIKU_EFI_SIGNING_KEY} ; 1172EOF 1173 1174for targetArch in $HAIKU_PACKAGING_ARCHS; do 1175 variables=" 1176 HAIKU_CC HAIKU_CC 1177 HAIKU_CC_IS_LEGACY_GCC HAIKU_CC_IS_LEGACY_GCC 1178 HAIKU_CC_IS_CLANG HAIKU_CC_IS_CLANG 1179 HAIKU_USE_GCC_GRAPHITE HAIKU_USE_GCC_GRAPHITE 1180 HAIKU_CPU HAIKU_CPU 1181 HAIKU_GCC_MACHINE HAIKU_GCC_MACHINE 1182 HAIKU_GCC_LIB_DIR HAIKU_GCC_LIB_DIR 1183 HAIKU_BOOT_LIBGCC HAIKU_BOOT_LIBGCC 1184 HAIKU_BOOT_LIBSUPC++ HAIKU_BOOT_LIBSUPCXX 1185 HAIKU_BOOT_32_LIBGCC HAIKU_BOOT_32_LIBGCC 1186 HAIKU_BOOT_32_LIBSUPC++ HAIKU_BOOT_32_LIBSUPCXX 1187 HAIKU_AR HAIKU_AR 1188 HAIKU_LD HAIKU_LD 1189 HAIKU_OBJCOPY HAIKU_OBJCOPY 1190 HAIKU_RANLIB HAIKU_RANLIB 1191 HAIKU_ELFEDIT HAIKU_ELFEDIT 1192 HAIKU_STRIP HAIKU_STRIP 1193 HAIKU_CPPFLAGS HAIKU_CPPFLAGS 1194 HAIKU_CCFLAGS HAIKU_CCFLAGS 1195 HAIKU_C++FLAGS HAIKU_CXXFLAGS 1196 HAIKU_LINKFLAGS HAIKU_LINKFLAGS 1197 HAIKU_LDFLAGS HAIKU_LDFLAGS 1198 HAIKU_ARFLAGS HAIKU_ARFLAGS 1199 HAIKU_UNARFLAGS HAIKU_UNARFLAGS 1200 " 1201 set -- $variables 1202 while [ $# -ge 2 ]; do 1203 value=`get_variable ${2}_$targetArch` 1204 echo "${1}_${targetArch} ?= $value ;" >> "$buildConfigFile" 1205 shift 2 1206 done 1207 1208 # For variables that may have long values, distribute them over multiple 1209 # lines so that jam doesn't hit the maximum line length. 1210 variables=" 1211 HAIKU_BOOT_C++_HEADERS_DIR HAIKU_BOOT_CXX_HEADERS_DIR 1212 HAIKU_BOOT_32_C++_HEADERS_DIR HAIKU_BOOT_32_CXX_HEADERS_DIR 1213 " 1214 set -- $variables 1215 while [ $# -ge 2 ]; do 1216 echo "${1}_${targetArch} ?= " >> "$buildConfigFile" 1217 get_variable ${2}_$targetArch | xargs -n 1 echo " " \ 1218 >> "$buildConfigFile" 1219 echo " ;" >> "$buildConfigFile" 1220 shift 2 1221 done 1222done 1223 1224 1225# Generate a Jamfile in the output directory. 1226 1227cat << EOF > $outputDir/Jamfile 1228# -- WARNING -- 1229# This file was AUTOMATICALLY GENERATED by configure, and will be completely 1230# overwritten the next time configure is run. 1231 1232HAIKU_TOP = $(relative_to "${sourceDir}" "${outputDir}") ; 1233HAIKU_OUTPUT_DIR = . ; 1234 1235include [ FDirName \$(HAIKU_TOP) Jamfile ] ; 1236 1237EOF 1238 1239echo "Configured successfully!" 1240