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 --bootstrap <haikuporter> <HaikuPorts cross repo> <HaikuPorts repo> 16 Prepare for a bootstrap build. No pre-built 17 packages will be used, instead they will be built 18 from the sources (in several phases). 19 <haikuporter> is the path to the haikuporter tool 20 suitable for the host platform. 21 <HaikuPorts cross repo> is the path to a checked 22 out HaikuPorts cross-compilation repository. 23 <HaikuPorts repo> is the path to a checked out 24 HaikuPorts repository. 25 --build-cross-tools <arch> [ <build tools dir> ] 26 Assume cross compilation. <build tools dir> 27 defines the location of the build tools sources. 28 They will be compiled and placed in the output 29 directory under "cross-tools". The HAIKU_* tools 30 variables will be set accordingly. 31 <arch> specifies the target architecture, either 32 "x86_gcc2", "x86", "x86_64", "ppc", "m68k", "arm" 33 This option and --cross-tools-prefix can be 34 specified multiple times. The first cross tools 35 specify the primary tools, the subsequent ones the 36 secondary tools (for "hybrid" images). 37 For the first --build-cross-tools the 38 <build tools dir> argument must be specified and 39 for the subsequent ones it must be omitted. 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 --distro-compatibility <level> 47 The distribution's level of compatibility with 48 the official Haiku distribution. The generated 49 files will contain the respective trademarks 50 accordingly. 51 official -- the official Haiku distribution. 52 compatible -- a Haiku Compatible (tm) distro. 53 default -- any other distro (default value). 54 --enable-multiuser Enable experimental multiuser support. 55 --help Prints out this help. 56 --host-only Configure for building tools for the build host 57 only. Haiku cannot be built when configured like 58 this. 59 --include-patented-code Enable code that is known to implemented patented 60 ideas and techniques. If this option is not 61 specified, the resulting distribution may still 62 implement patented ideas and techniques. This 63 option only disables code that is currently known 64 to be problematic. 65 --include-sources Includes the source code of projects that require 66 either an offer of source code or a copy of the 67 patched sources. This is preferable when 68 distributing on physical mediums. 69 --include-3rdparty Include 3rdparty/ in the build system. 70 -j<n> Only relevant for --build-cross-tools. Is passed 71 on to the make building the build tools. 72 --no-downloads Do not download anything. Useful when trying to 73 bootstrap and build Haiku from source only. 74 --target=TARGET Select build target platform. 75 [default=${TARGET_PLATFORM}] 76 valid targets=r5,bone,dano,haiku 77 --target-arch <arch> Haiku only: Specify the target architecture to 78 build for. Must be one of the architectures of the 79 host system. The installed build tools for that 80 architecture will be used. 81 This option can be specified multiple times. The 82 first occurrence specifies the primary 83 architecture of the Haiku to build, subsequent 84 ones the secondary architectures. 85 --update re-runs last configure invocation [must be given 86 as first option!] 87 --use-clang <arch> Build with host Clang instead of GCC cross 88 compiler, targeting <arch> 89 --use-gcc-pipe Build with GCC option -pipe. Speeds up the build 90 process, but uses more memory. 91 --use-gcc-graphite Build with GCC Graphite engine for loop 92 optimizations. Only for gcc 4. 93 --use-32bit Use -m32 flag on 64bit host gcc compiler. 94 --use-xattr Use Linux xattr respectively *BSD extattr support 95 for BeOS attribute emulation. Warning: Make sure 96 your file system supports sufficient attribute 97 sizes (4 KB per file for all attributes won't 98 suffice). 99 --use-xattr-ref Use the generic BeOS attribute emulation, but use 100 Linux xattr respectively *BSD extattr support to 101 make it more robust (i.e. attribute mix-ups become 102 less likely). 103 --with-gdb <gdb sources dir> 104 specify the path to a GDB source dir, to build 105 GDB for each arch we build the cross-tools for. 106 107environment variables: 108 CC The host compiler. Defaults to "gcc". 109 HAIKU_AR_x86_gcc2 The static library archiver for x86_gcc2. 110 Defaults to "ar". 111 HAIKU_CC_x86_gcc2 The x86_gcc2 compiler. Defaults to "gcc". 112 HAIKU_LD_x86_gcc2 The x86_gcc2 linker. Defaults to "ld". 113 HAIKU_OBJCOPY_x86_gcc2 The x86_gcc2 objcopy to be used. Defaults to 114 "objcopy". 115 HAIKU_RANLIB_x86_gcc2 The static library indexer for x86_gcc2. Defaults 116 to "ranlib". 117 HAIKU_STRIP_x86_gcc2 The x86_gcc2 strip command. Defaults to "strip". 118 HAIKU_NASM The nasm assembler (x86 and x86_64 only). 119 HAIKU_CPPFLAGS_<arch> The preprocessor flags for target architecture 120 <arch>. Defaults to "". 121 HAIKU_CCFLAGS_<arch> The C flags for target architecture <arch>. 122 Defaults to "". 123 HAIKU_CXXFLAGS_<arch> The C++ flags for target architecture <arch>. 124 Defaults to "". 125 HAIKU_LDFLAGS_<arch> The linker flags for target architecture <arch>. 126 Defaults to "". 127 HAIKU_ARFLAGS_<arch> The flags passed to HAIKU_AR for target 128 architecture <arch> for archiving. Defaults to 129 "cru". 130 HAIKU_UNARFLAGS_<arch> The flags passed to HAIKU_AR for target 131 architecture <arch> for unarchiving. Defaults to 132 "x". 133 134Non-default output directories: 135 By default all objects, build configuration, and other related files are 136 stored in /path/to/haiku_source/generated. To store objects in a non-default 137 location, run "../../relative/path/to/haiku_source/configure <options>" from 138 within your non-default location. "jam [ options ] targets" can then be run 139 directly inside your non-default location. Another option is to invoke "jam 140 [ options ] targets" from within haiku_source. This can be accomplished by 141 either "export HAIKU_OUTPUT_DIR=your non-default location" before invoking 142 jam or by creating a symlink of haiku_source/generated pointing to your 143 non-default location and running jam. 144 145 146EOF 147} 148 149# assertparam 150# 151# Checks whether at least one parameter is left. 152# 153assertparam() 154{ 155 if [ $2 -lt 2 ]; then 156 echo $0: \`$1\': Parameter expected. 157 exit 1 158 fi 159} 160 161# assertparams 162# 163# Checks whether at least a certain number of parameters is left. 164# 165assertparams() 166{ 167 if [ $3 -le $2 ]; then 168 echo $0: \`$1\': Not enough parameters. 169 exit 1 170 fi 171} 172 173# absolute_path 174# 175# returns the absolute path of a given path. 176# 177absolute_path() 178{ 179 if [ "x$1" != "x${1#/}" ]; then 180 echo "$1" 181 else 182 echo "`pwd`/$1" 183 fi 184} 185 186# check_dir_exists 187# 188# check if a directory exists or not 189# 190check_dir_exists() 191{ 192 if [ -d "$1" ]; then 193 return 0 194 else 195 return 1 196 fi 197} 198 199# check_file_exists 200# 201# check if a file exists or not 202# 203check_file_exists() 204{ 205 if [ -f "$1" ]; then 206 return 0 207 else 208 return 1 209 fi 210} 211 212# real_path 213# 214# returns the realpath of a symbolic link. 215# 216real_path() 217{ 218 perl -MCwd=realpath -e'print realpath($ARGV[0]), "\n"' "$1" 219} 220 221# standard_gcc_settings 222# 223# Sets the variables for a GCC platform. 224# 225standard_gcc_settings() 226{ 227 local gcc=$1 228 229 if which greadlink > /dev/null 2>&1; then 230 readlink="greadlink -e" 231 elif which realpath > /dev/null 2>&1; then 232 readlink=realpath 233 elif readlink -e / > /dev/null 2>&1; then 234 readlink="readlink -e" 235 else 236 readlink=real_path 237 fi 238 239 # PLATFORM_LINKLIBS 240 local gcclib=`$gcc -print-libgcc-file-name` 241 local gccdir=`dirname ${gcclib}` 242 243 local gccRawVersion=`$gcc -dumpversion` 244 local gccMachine=`$gcc -dumpmachine` 245 246 # determine architecture from machine triple 247 case $gccMachine in 248 arm-*) targetCpu=arm;; 249 i?86-*) targetCpu=x86;; 250 m68k-*) targetCpu=m68k;; 251 powerpc-*) targetCpu=ppc;; 252 x86_64-*) targetCpu=x86_64;; 253 *) 254 echo "Unsupported gcc target machine: $gccMachine" >&2 255 exit 1 256 ;; 257 esac 258 259 local targetArch=$targetCpu 260 261 case $gccRawVersion in 262 2.9*) 263 # check for correct (most up-to-date) legacy compiler and complain 264 # if an older one is installed 265 if [ $gccRawVersion != $haikuRequiredLegacyGCCVersion ]; then 266 echo "GCC version $haikuRequiredLegacyGCCVersion is required!"; 267 echo "Please download it from www.haiku-os.org..."; 268 exit 1; 269 fi 270 271 targetArch=x86_gcc2 272 ;; 273 esac 274 275 local bootLibgcc 276 local bootLibSupCxx 277 local bootCxxHeaders 278 case $gccMachine in 279 x86_64-*) 280 # Boot loader is 32-bit, need the 32-bit libs and c++ config 281 bootLibgcc=`$gcc -m32 -print-file-name=libgcc.a` 282 bootLibSupCxx=`$gcc -m32 -print-file-name=libsupc++.a` 283 284 local headersBase=$gccdir/../../../.. 285 local headers=$headersBase/$gccMachine/include/c++/$gccRawVersion 286 if [ ! -d $headers ]; then 287 headers=$headersBase/include/c++/$gccRawVersion 288 fi 289 bootCxxHeaders="$headers/$gccMachine/32" 290 ;; 291 esac 292 293 # determine whether graphite loop optimization should/can be used 294 local useGraphite=`get_variable HAIKU_USE_GCC_GRAPHITE_$targetCpu` 295 if [ -z "$useGraphite" ]; then 296 useGraphite=$useGccGraphiteDefault 297 fi 298 299 if [ "$useGraphite" != 0 ]; then 300 UNUSED=`echo "int main() {}" | $gcc -xc -c -floop-block - 2>&1` 301 if [ $? != 0 ]; then 302 echo "GCC Graphite loop optimizations cannot be used on $targetArch" 303 useGraphite=0 304 fi 305 fi 306 307 set_variable HAIKU_CPU_$targetArch $targetCpu 308 309 get_build_tool_path CC_$targetArch "$gcc" 310 set_variable HAIKU_CC_IS_CLANG_$targetArch $useClang 311 set_variable HAIKU_GCC_RAW_VERSION_$targetArch $gccRawVersion 312 set_variable HAIKU_GCC_MACHINE_$targetArch $gccMachine 313 set_variable HAIKU_GCC_LIB_DIR_$targetArch $gccdir 314 set_variable HAIKU_BOOT_CXX_HEADERS_DIR_$targetArch "$bootCxxHeaders" 315 set_variable HAIKU_BOOT_LIBSUPCXX_$targetArch "$bootLibSupCxx" 316 set_variable HAIKU_BOOT_LIBGCC_$targetArch $bootLibgcc 317 set_variable HAIKU_USE_GCC_GRAPHITE_$targetArch $useGraphite 318 319 standard_gcc_settings_targetArch=$targetArch 320} 321 322# set_variable 323# 324# Set the value of a variable. 325# 326set_variable() 327{ 328 eval "$1=\"$2\"" 329} 330 331# get_variable 332# 333# Echo the value of a variable. 334# 335get_variable() 336{ 337 eval "echo \${$1}" 338} 339 340# set_default_value 341# 342# Set the value for a variable, if no value is set yet. 343# 344set_default_value() 345{ 346 eval "$1=\${$1-$2}" 347} 348 349# get_build_tool_path 350# 351# Gets a usable absolute path of a build tool. 352# 353get_build_tool_path() 354{ 355 local var="HAIKU_$1" 356 local varval=`get_variable $var` 357 local cmd=$2 358 359 if [ ! -z "$varval" ]; then 360 # this variable is already set (probably by user) so grab its contents 361 cmd=$varval 362 fi 363 364 local path=${cmd%% *} 365 366 if [ -f "$path" ]; then 367 # get absolute path 368 local oldPwd="`pwd`" 369 cd "`dirname "$path"`" 370 path="`pwd`/`basename "$path"`" 371 cd $oldPwd 372 else 373 which "$path" > /dev/null 2>&1 || { 374 echo "Build tool \"$path\" not found (maybe specify it in $var?)" >&2 375 exit 1 376 } 377 fi 378 379 eval "$var=\"$path ${cmd#${2%% *}}\"" 380} 381 382is_in_list() 383{ 384 local element 385 for element in $2; do 386 if [ "$1" = "$element" ]; then 387 return 0 388 fi 389 done 390 return 1 391} 392 393# check for --help or -h and show usage immediately 394if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then 395 usage; exit 0; 396fi 397 398# ensure umask is not too restrictive 399if [ $(umask) -gt 22 ]; then 400 echo "Your umask is too restrictive (should be: <= 0022; is actually:" $(umask)")" 401 exit 1 402fi 403 404# get cwd and the source directory 405currentDir=`pwd` 406cd `dirname "$0"` 407sourceDir=`pwd` 408cd "$currentDir" 409 410# backup the passed arguments 411configureArgs="$@" 412 413# internal default parameter values 414# 415platform=`uname` 416platformMachine=`uname -m` 417targetArchs= 418buildCrossTools= 419buildCrossToolsScript="$sourceDir/build/scripts/build_cross_tools" 420buildCrossToolsJobs= 421useClang=0 422useGccGraphiteDefault=0 423unknownArchIndex=1 424haikuTargetArchs= 425gdbSources= 426 427if [ -z "$CC" ]; then 428 CC=gcc 429fi 430 431# exported (BuildSetup) default parameter values 432# 433HOST_GCC_RAW_VERSION=`$CC -dumpversion` 434HOST_GCC_MACHINE=`$CC -dumpmachine` 435HAIKU_INCLUDE_PATENTED_CODE=0 436HAIKU_INCLUDE_SOURCES=0 437HAIKU_INCLUDE_3RDPARTY=0 438HAIKU_ENABLE_MULTIUSER=0 439HAIKU_DISTRO_COMPATIBILITY=default 440TARGET_PLATFORM=haiku 441HAIKU_USE_GCC_PIPE=0 442HAIKU_HOST_USE_32BIT=0 443HAIKU_HOST_USE_XATTR=0 444HAIKU_HOST_USE_XATTR_REF=0 445HAIKU_HOST_BUILD_ONLY=0 446HOST_EXTENDED_REGEX_SED="sed -r" 447HOST_GCC_LD=`$CC -print-prog-name=ld` 448HOST_GCC_OBJCOPY=`$CC -print-prog-name=objcopy` 449HOST_SHA256= 450HOST_HAIKU_PORTER= 451HAIKU_PORTS= 452HAIKU_PORTS_CROSS= 453HAIKU_IS_BOOTSTRAP=0 454HAIKU_BOOT_BOARD= 455HAIKU_NO_DOWNLOADS=0 456 457HAIKU_PACKAGING_ARCHS= 458 459set_default_value HAIKU_NASM nasm 460 461if sha256sum < /dev/null > /dev/null 2>&1; then 462 HOST_SHA256=sha256sum 463elif sha256 < /dev/null > /dev/null 2>&1; then 464 HOST_SHA256="sha256 -q" 465elif shasum < /dev/null > /dev/null 2>&1; then 466 HOST_SHA256="shasum -a 256" 467else 468 echo "Error: Neither sha256sum nor sha256 seem to be available!" >&2 469 exit 1 470fi 471 472haikuRequiredLegacyGCCVersion="2.95.3-haiku-2017_07_20" 473export haikuRequiredLegacyGCCVersion 474 # version of legacy gcc required to build haiku 475supportedTargetArchs=" 476 arm 477 m68k 478 ppc 479 x86 480 x86_64 481 x86_gcc2 482 " 483 484# determine output directory 485if [ "$currentDir" = "$sourceDir" ]; then 486 outputDir=$currentDir/generated 487else 488 outputDir=$currentDir 489fi 490buildOutputDir="$outputDir/build" 491HAIKU_BUILD_ATTRIBUTES_DIR="$outputDir/attributes" 492buildConfigFile="$buildOutputDir/BuildConfig" 493 494# check for update request 495if [ "$1" = "--update" ]; then 496 if ! [ -e "$buildConfigFile" ]; then 497 echo $0 --update: \'$buildConfigFile\' not found - updating not possible. 498 exit 1 499 fi 500 if ! type perl >/dev/null 2>&1; then 501 echo $0 --update: \'perl\' not found - updating not possible. 502 exit 1 503 fi 504 # convert BuildConfig from jam format to shell format and evaluate it 505 shellConfigFile="${buildConfigFile}.shell" 506 perl "$sourceDir/build/scripts/convert_build_config_to_shell_format.pl" \ 507 <"$buildConfigFile" >"$shellConfigFile" 508 . "$shellConfigFile" 509 rm "$shellConfigFile" 510 shift 511fi 512 513# parse parameters 514# 515while [ $# -gt 0 ] ; do 516 case "$1" in 517 --bootstrap) 518 assertparams "$1" 3 $# 519 HOST_HAIKU_PORTER="`absolute_path $2`" 520 HAIKU_PORTS_CROSS="`absolute_path $3`" 521 HAIKU_PORTS="`absolute_path $4`" 522 HAIKU_IS_BOOTSTRAP=1 523 HAIKU_NO_DOWNLOADS=1 524 check_file_exists "$HOST_HAIKU_PORTER" || ( 525 echo "Invalid path to haikuporter: $HOST_HAIKU_PORTER" >&2 526 exit 1 527 ) 528 check_dir_exists "$HAIKU_PORTS" || ( 529 echo "Non-existent directory $HAIKU_PORTS" >&2 530 exit 1 531 ) 532 check_dir_exists "$HAIKU_PORTS_CROSS" || ( 533 echo "Non-existent directory $HAIKU_PORTS_CROSS" >&2 534 exit 1 535 ) 536 shift 4 537 ;; 538 --build-cross-tools) 539 if [ -z "$buildCrossTools" ]; then 540 assertparams "$1" 2 $# 541 targetArch=$2 542 buildCrossTools=$3 543 shift 3 544 else 545 assertparam "$1" $# 546 targetArch=$2 547 shift 2 548 fi 549 case "$targetArch" in 550 x86_gcc2) targetMachine=i586-pc-haiku;; 551 x86) targetMachine=i586-pc-haiku;; 552 x86_64) targetMachine=x86_64-unknown-haiku;; 553 ppc) targetMachine=powerpc-apple-haiku;; 554 m68k) targetMachine=m68k-unknown-haiku;; 555 arm) targetMachine=arm-unknown-haiku;; 556 *) 557 echo "Unsupported target architecture: $2" >&2 558 exit 1 559 ;; 560 esac 561 set_variable buildCrossToolsMachine_$targetArch $targetMachine 562 targetArchs="$targetArchs $targetArch" 563 HAIKU_PACKAGING_ARCHS= 564 ;; 565 --cross-tools-prefix) 566 assertparam "$1" $# 567 targetArch=unknown${unknownArchIndex} 568 set_variable crossToolsPrefix_$targetArch "$2" 569 targetArchs="$targetArchs $targetArch" 570 HAIKU_PACKAGING_ARCHS= 571 unknownArchIndex=$(($unknownArchIndex + 1)) 572 shift 2 573 ;; 574 --distro-compatibility) 575 assertparam "$1" $# 576 HAIKU_DISTRO_COMPATIBILITY=$2 577 case "$HAIKU_DISTRO_COMPATIBILITY" in 578 official) ;; 579 compatible) ;; 580 default) ;; 581 *) echo "Invalid distro compatibility" \ 582 "level: $HAIKU_DISTRO_COMPATIBILITY" 583 exit 1;; 584 esac 585 shift 2 586 ;; 587 --enable-multiuser) HAIKU_ENABLE_MULTIUSER=1; shift 1;; 588 --host-only) HAIKU_HOST_BUILD_ONLY=1; shift 1;; 589 --include-patented-code) HAIKU_INCLUDE_PATENTED_CODE=1; shift 1;; 590 --include-sources) HAIKU_INCLUDE_SOURCES=1; shift 1;; 591 --include-3rdparty) HAIKU_INCLUDE_3RDPARTY=1; shift 1;; 592 -j*) buildCrossToolsJobs="$1"; shift 1;; 593 --no-downloads) HAIKU_NO_DOWNLOADS=1; shift 1;; 594 --target=*) TARGET_PLATFORM=`echo $1 | cut -d'=' -f2-`; shift 1;; 595 --target-arch) 596 assertparam "$1" $# 597 targetArch=$2 598 shift 2 599 if [ ! "$platform" = Haiku ]; then 600 echo "--target-arch can only be specified on Haiku." >&2 601 exit 1 602 fi 603 is_in_list "$targetArch" "$supportedTargetArchs" || ( 604 echo "Unsupported target architecture: \"$targetArch\"" >&2 605 exit 1 606 ) 607 haikuTargetArchs="$haikuTargetArchs $targetArch" 608 ;; 609 --use-clang) 610 assertparam "$1" $# 611 targetArch=$2 612 useClang=1 613 case "$targetArch" in 614 x86) targetMachine=i586-pc-haiku;; 615 x86_64) targetMachine=x86_64-unknown-haiku;; 616 *) 617 echo "Unsupported target architecture: $2" >&2 618 exit 1 619 ;; 620 esac 621 targetArchs="$targetArchs $targetArch" 622 HAIKU_PACKAGING_ARCHS= 623 shift 2 624 ;; 625 --use-gcc-pipe) HAIKU_USE_GCC_PIPE=1; shift 1;; 626 --use-gcc-graphite) useGccGraphiteDefault=1; shift 1;; 627 --use-32bit) HAIKU_HOST_USE_32BIT=1; shift 1;; 628 --use-xattr) HAIKU_HOST_USE_XATTR=1; shift 1;; 629 --use-xattr-ref) HAIKU_HOST_USE_XATTR_REF=1; shift 1;; 630 --with-gdb) gdbSources=$2; shift 2;; 631 *) echo Invalid argument: \`$1\'; exit 1;; 632 esac 633done 634 635# detect the build platform 636case "${platform}" in 637 Darwin) HOST_PLATFORM=darwin ;; 638 FreeBSD) HOST_PLATFORM=freebsd 639 if [ "$HAIKU_HOST_USE_32BIT" = 1 ] ; then 640 echo Unsupported platform: FreeBSD ${platformMachine} 641 exit 1 642 fi ;; 643 Haiku) HOST_PLATFORM=haiku_host ;; 644 Linux) HOST_PLATFORM=linux ;; 645 OpenBSD) HOST_PLATFORM=openbsd ;; 646 SunOS) HOST_PLATFORM=sunos ;; 647 CYGWIN_NT-*) HOST_PLATFORM=cygwin ;; 648 *) echo Unsupported platform: ${platform} 649 exit 1 ;; 650esac 651 652# check for case-sensitive filesystem 653mkdir haikuCaseTest 2>/dev/null 654mkdir haikucasetest 2>/dev/null 655caseInsensitive=$? 656rmdir haikuCaseTest haikucasetest 2>/dev/null 657if [ $caseInsensitive != 0 ]; then 658 echo "You need a case-sensitive file-system to build Haiku." 659 if [ $HOST_PLATFORM = "darwin" ]; then 660 echo "You can create a case-sensitive disk image using Disk Utility." 661 fi 662 exit 1 663fi 664 665# determine how to invoke sed with extended regexp support for non-GNU sed 666if [ $HOST_PLATFORM = "darwin" ]; then 667 HOST_EXTENDED_REGEX_SED="sed -E" 668fi 669 670# check if nasm can actually output ELF files 671# (the stock version in OSX can't) 672# XXX: should probably only test for x86* arch 673if [ "$("$HAIKU_NASM" -hf | grep -c elf'[36][24] ')" -ne "2" ]; then 674 echo "$HAIKU_NASM cannot generate ELF files. Please install a working version." 675 if [ $HOST_PLATFORM = "darwin" ]; then 676 echo "You can install it from Mac Ports." 677 echo "Mac Ports is available at: http://www.macports.org/" 678 fi 679 exit 1 680fi 681 682# create output directory 683mkdir -p "$buildOutputDir" || exit 1 684 685if [ "$HAIKU_HOST_BUILD_ONLY" = 1 ]; then 686 invalidCommand=$sourceDir/build/scripts/host_build_only 687 HAIKU_AR=$invalidCommand 688 HAIKU_CC=$invalidCommand 689 HAIKU_LD=$invalidCommand 690 HAIKU_OBJCOPY=$invalidCommand 691 HAIKU_RANLIB=$invalidCommand 692 HAIKU_ELFEDIT=$invalidCommand 693 HAIKU_NASM=$invalidCommand 694 HAIKU_STRIP=$invalidCommand 695else 696 if [ -n "$HAIKU_PACKAGING_ARCHS" ]; then 697 targetArchs="$HAIKU_PACKAGING_ARCHS" 698 fi 699 HAIKU_PACKAGING_ARCHS= 700 701 # On Haiku determine target architectures and tools automatically. 702 if [ -z "$targetArchs" ]; then 703 if [ $HOST_PLATFORM != haiku_host ]; then 704 echo "Please specify the build tools to use or build (via" \ 705 "--cross-tools-prefix or --build-cross-tools) or specify a" \ 706 "host-only build (--host-only)." >&2 707 echo "For more info, invoke $0 --help" 708 exit 1 709 fi 710 711 # determine primary architecture 712 targetArch=`package list -i /system/packages/haiku-*.hpkg \ 713 | sed '/^\s*architecture:/!d; s,^\s*architecture:\s*,,'` 714 is_in_list "$targetArch" "$supportedTargetArchs" || ( 715 echo "Unsupported target architecture: \"$targetArch\"" >&2 716 exit 1 717 ) 718 targetArchs=$targetArch 719 720 set_default_value HAIKU_AR_$targetArch ar 721 set_default_value HAIKU_CC_$targetArch gcc 722 set_default_value HAIKU_LD_$targetArch ld 723 set_default_value HAIKU_OBJCOPY_$targetArch objcopy 724 set_default_value HAIKU_RANLIB_$targetArch ranlib 725 set_default_value HAIKU_ELFEDIT_$targetArch elfedit 726 set_default_value HAIKU_STRIP_$targetArch strip 727 728 # determine secondary architectures 729 for targetArch in $supportedTargetArchs; do 730 if [ -e /system/packages/haiku_$targetArch-*.hpkg ]; then 731 targetArchs="$targetArchs $targetArch" 732 set_default_value HAIKU_AR_$targetArch ar-$targetArch 733 set_default_value HAIKU_CC_$targetArch gcc-$targetArch 734 set_default_value HAIKU_LD_$targetArch ld-$targetArch 735 set_default_value HAIKU_OBJCOPY_$targetArch objcopy-$targetArch 736 set_default_value HAIKU_RANLIB_$targetArch ranlib-$targetArch 737 set_default_value HAIKU_ELFEDIT_$targetArch elfedit-$targetArch 738 set_default_value HAIKU_STRIP_$targetArch strip-$targetArch 739 fi 740 done 741 742 # The target architectures might have been specified explicitly. 743 if [ -n "$haikuTargetArchs" ]; then 744 for targetArch in $haikuTargetArchs; do 745 is_in_list "$targetArch" "$targetArchs" || ( 746 echo "Unsupported target architecture: \"$targetArch\"." \ 747 "Only native architectures of the host platform can" \ 748 "be specified." >&2 749 exit 1 750 ) 751 done 752 targetArchs="$haikuTargetArchs" 753 fi 754 fi 755 756 isPrimaryArch=1 757 for targetArch in $targetArchs; do 758 # Note: targetArch is "unknown<n>" at this point, if a cross-tools 759 # prefix was specified. The standard_gcc_settings call below will get 760 # the actual architecture. 761 762 crossToolsPrefix=`get_variable crossToolsPrefix_$targetArch` 763 764 # build cross tools from sources 765 if [ -n "$buildCrossTools" -a -z "$crossToolsPrefix" ]; then 766 crossToolsDir="$outputDir/cross-tools-$targetArch" 767 targetMachine=`get_variable buildCrossToolsMachine_$targetArch` 768 script="$buildCrossToolsScript" 769 scriptArgs= 770 if [ $targetArch != x86_gcc2 ]; then 771 script="${script}_gcc4" 772 scriptArgs="$targetMachine" 773 set_default_value HAIKU_USE_GCC_GRAPHITE_$targetArch \ 774 $useGccGraphiteDefault 775 fi 776 secondaryArch= 777 if [ -z "$isPrimaryArch" ]; then 778 secondaryArch=$targetArch 779 fi 780 781 case $HOST_PLATFORM in 782 freebsd|openbsd) MAKE=gmake;; 783 *) MAKE=make;; 784 esac 785 786 MAKE=$MAKE \ 787 SECONDARY_ARCH=$secondaryArch \ 788 HAIKU_USE_GCC_GRAPHITE=`get_variable \ 789 HAIKU_USE_GCC_GRAPHITE_$targetArch` \ 790 HAIKU_USE_GCC_PIPE=$HAIKU_USE_GCC_PIPE \ 791 HAIKU_USE_GDB="$gdbSources" \ 792 "$script" $scriptArgs "$sourceDir" "$buildCrossTools" \ 793 "$crossToolsDir" $buildCrossToolsJobs || exit 1 794 crossToolsPrefix="$crossToolsDir/bin/${targetMachine}-" 795 fi 796 797 # prepare gcc settings and get the actual target architecture 798 if [ $useClang = 1 ]; then 799 gcc="clang -target ${targetMachine} -no-integrated-as" 800 elif [ -z "${crossToolsPrefix}" ]; then 801 gcc=`get_variable HAIKU_CC_$targetArch` 802 else 803 gcc="${crossToolsPrefix}gcc" 804 fi 805 standard_gcc_settings "$gcc" 806 targetArch=$standard_gcc_settings_targetArch 807 808 # set default values for flags 809 set_default_value HAIKU_CPPFLAGS_$targetArch "" 810 set_default_value HAIKU_CCFLAGS_$targetArch "" 811 set_default_value HAIKU_CXXFLAGS_$targetArch "" 812 set_default_value HAIKU_LDFLAGS_$targetArch "" 813 set_default_value HAIKU_ARFLAGS_$targetArch cru 814 set_default_value HAIKU_UNARFLAGS_$targetArch x 815 816 # Override the cross tools variables, if the tools were built or a 817 # prefix was specified. 818 if [ -n "$crossToolsPrefix" ]; then 819 get_build_tool_path AR_$targetArch ${crossToolsPrefix}ar 820 get_build_tool_path LD_$targetArch ${crossToolsPrefix}ld 821 get_build_tool_path OBJCOPY_$targetArch ${crossToolsPrefix}objcopy 822 get_build_tool_path RANLIB_$targetArch ${crossToolsPrefix}ranlib 823 get_build_tool_path STRIP_$targetArch ${crossToolsPrefix}strip 824 825 case `get_variable HAIKU_GCC_RAW_VERSION_$targetArch` in 826 4.*|5.*|6.*|7.*|8.*) 827 get_build_tool_path ELFEDIT_$targetArch \ 828 ${crossToolsPrefix}elfedit 829 ;; 830 esac 831 fi 832 833 # check whether the Haiku compiler really targets Haiku 834 targetMachine=`get_variable HAIKU_GCC_MACHINE_$targetArch` 835 case "$targetMachine" in 836 *-*-haiku) ;; 837 *) 838 echo The compiler specified as Haiku target compiler is not a \ 839 valid Haiku cross-compiler. Please see ReadMe.cross-compile. >&2 840 echo compiler: $HAIKU_CC 841 echo compiler is configured for target: $targetMachine 842 exit 1 ;; 843 esac 844 845 HAIKU_PACKAGING_ARCHS="$HAIKU_PACKAGING_ARCHS $targetArch" 846 isPrimaryArch= 847 done 848fi 849 850# Generate BuildConfig 851cat << EOF > "$buildConfigFile" 852# BuildConfig 853# Note: This file has been automatically generated by configure with the 854# following arguments: 855# ${configureArgs} 856 857TARGET_PLATFORM ?= "${TARGET_PLATFORM}" ; 858HOST_PLATFORM ?= "${HOST_PLATFORM}" ; 859 860HAIKU_INCLUDE_PATENTED_CODE ?= "${HAIKU_INCLUDE_PATENTED_CODE}" ; 861HAIKU_INCLUDE_SOURCES ?= "${HAIKU_INCLUDE_SOURCES}" ; 862HAIKU_INCLUDE_3RDPARTY ?= "${HAIKU_INCLUDE_3RDPARTY}" ; 863HAIKU_ENABLE_MULTIUSER ?= "${HAIKU_ENABLE_MULTIUSER}" ; 864HAIKU_DISTRO_COMPATIBILITY ?= "${HAIKU_DISTRO_COMPATIBILITY}" ; 865HAIKU_USE_GCC_PIPE ?= "${HAIKU_USE_GCC_PIPE}" ; 866HAIKU_HOST_USE_32BIT ?= "${HAIKU_HOST_USE_32BIT}" ; 867HAIKU_HOST_USE_XATTR ?= "${HAIKU_HOST_USE_XATTR}" ; 868HAIKU_HOST_USE_XATTR_REF ?= "${HAIKU_HOST_USE_XATTR_REF}" ; 869HAIKU_HOST_BUILD_ONLY ?= "${HAIKU_HOST_BUILD_ONLY}" ; 870 871HAIKU_PACKAGING_ARCHS ?= ${HAIKU_PACKAGING_ARCHS} ; 872 873HAIKU_NO_DOWNLOADS ?= "${HAIKU_NO_DOWNLOADS}" ; 874 875HAIKU_BUILD_ATTRIBUTES_DIR ?= ${HAIKU_BUILD_ATTRIBUTES_DIR} ; 876 877HAIKU_NASM ?= ${HAIKU_NASM} ; 878HAIKU_BOOT_BOARD ?= ${HAIKU_BOOT_BOARD} ; 879 880HOST_EXTENDED_REGEX_SED ?= ${HOST_EXTENDED_REGEX_SED} ; 881HOST_GCC_RAW_VERSION ?= ${HOST_GCC_RAW_VERSION} ; 882HOST_GCC_MACHINE ?= ${HOST_GCC_MACHINE} ; 883HOST_LD ?= ${HOST_GCC_LD} ; 884HOST_OBJCOPY ?= ${HOST_GCC_OBJCOPY} ; 885HOST_SHA256 ?= ${HOST_SHA256} ; 886 887HOST_HAIKU_PORTER ?= ${HOST_HAIKU_PORTER} ; 888HAIKU_PORTS ?= ${HAIKU_PORTS} ; 889HAIKU_PORTS_CROSS ?= ${HAIKU_PORTS_CROSS} ; 890HAIKU_IS_BOOTSTRAP ?= ${HAIKU_IS_BOOTSTRAP} ; 891 892EOF 893 894for targetArch in $HAIKU_PACKAGING_ARCHS; do 895 variables=" 896 HAIKU_GCC_RAW_VERSION HAIKU_GCC_RAW_VERSION 897 HAIKU_GCC_MACHINE HAIKU_GCC_MACHINE 898 HAIKU_GCC_LIB_DIR HAIKU_GCC_LIB_DIR 899 HAIKU_CPU HAIKU_CPU 900 HAIKU_BOOT_LIBGCC HAIKU_BOOT_LIBGCC 901 HAIKU_BOOT_LIBSUPC++ HAIKU_BOOT_LIBSUPCXX 902 HAIKU_AR HAIKU_AR 903 HAIKU_CC HAIKU_CC 904 HAIKU_CC_IS_CLANG HAIKU_CC_IS_CLANG 905 HAIKU_LD HAIKU_LD 906 HAIKU_OBJCOPY HAIKU_OBJCOPY 907 HAIKU_RANLIB HAIKU_RANLIB 908 HAIKU_ELFEDIT HAIKU_ELFEDIT 909 HAIKU_STRIP HAIKU_STRIP 910 HAIKU_CPPFLAGS HAIKU_CPPFLAGS 911 HAIKU_CCFLAGS HAIKU_CCFLAGS 912 HAIKU_C++FLAGS HAIKU_CXXFLAGS 913 HAIKU_LDFLAGS HAIKU_LDFLAGS 914 HAIKU_ARFLAGS HAIKU_ARFLAGS 915 HAIKU_UNARFLAGS HAIKU_UNARFLAGS 916 HAIKU_USE_GCC_GRAPHITE HAIKU_USE_GCC_GRAPHITE 917 " 918 set -- $variables 919 while [ $# -ge 2 ]; do 920 value=`get_variable ${2}_$targetArch` 921 echo "${1}_${targetArch} ?= $value ;" >> "$buildConfigFile" 922 shift 2 923 done 924 925 # For variables that may have long values, distribute them over multiple 926 # lines so that jam doesn't hit the maximum line length. 927 variables=" 928 HAIKU_BOOT_C++_HEADERS_DIR HAIKU_BOOT_CXX_HEADERS_DIR 929 " 930 set -- $variables 931 while [ $# -ge 2 ]; do 932 echo "${1}_${targetArch} ?= " >> "$buildConfigFile" 933 get_variable ${2}_$targetArch | xargs -n 1 echo " " \ 934 >> "$buildConfigFile" 935 echo " ;" >> "$buildConfigFile" 936 shift 2 937 done 938done 939 940 941# Generate a boot strap Jamfile in the output directory. 942 943cat << EOF > $outputDir/Jamfile 944# automatically generated Jamfile 945 946HAIKU_TOP = ${sourceDir} ; 947HAIKU_OUTPUT_DIR = ${outputDir} ; 948 949include [ FDirName \$(HAIKU_TOP) Jamfile ] ; 950 951EOF 952 953echo "Configured successfully!" 954