diff --git a/build/jam/HaikuCD b/build/jam/HaikuCD index 30b9afb461..d37d00035b 100644 --- a/build/jam/HaikuCD +++ b/build/jam/HaikuCD @@ -8,6 +8,13 @@ HAIKU_CD = $(HAIKU_CD_NAME) ; HAIKU_CD_LABEL ?= $(HAIKU_DEFAULT_CD_LABEL) ; MakeLocate $(HAIKU_CD) : $(HAIKU_CD_DIR) ; +# Detect a hybrid GCC2/GCC4 image. +local isHybridBuild ; +if $(HAIKU_ADD_ALTERNATIVE_GCC_LIBS) = 1 + && $(HAIKU_ALTERNATIVE_GCC_OUTPUT_DIR) { + isHybridBuild = 1 ; +} + # prepare the script that initializes the shell variables HAIKU_CD_INIT_VARIABLES_SCRIPT = haiku.cd-init-vars ; local script = $(HAIKU_CD_INIT_VARIABLES_SCRIPT) ; @@ -18,6 +25,8 @@ AddVariableToScript $(script) : sourceDir : $(HAIKU_TOP) ; AddVariableToScript $(script) : outputDir : $(HAIKU_OUTPUT_DIR) ; AddVariableToScript $(script) : tmpDir : $(HAIKU_TMP_DIR) ; AddVariableToScript $(script) : isCD : 1 ; +AddVariableToScript $(script) : gccVersion : $(HAIKU_GCC_VERSION[1]) ; +AddVariableToScript $(script) : isHybridBuild : $(isHybridBuild) ; AddVariableToScript $(script) : cdLabel : $(HAIKU_CD_LABEL) ; AddVariableToScript $(script) : addBuildCompatibilityLibDir : $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) ; diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index cc09d4a137..3989decae7 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -723,6 +723,13 @@ HAIKU_INSTALL_DIR ?= $(HAIKU_DEFAULT_INSTALL_DIR) ; # the pseudo target all image contents is attached to NotFile $(HAIKU_IMAGE_CONTAINER_NAME) ; +# Detect a hybrid GCC2/GCC4 image. +local isHybridBuild ; +if $(HAIKU_ADD_ALTERNATIVE_GCC_LIBS) = 1 + && $(HAIKU_ALTERNATIVE_GCC_OUTPUT_DIR) { + isHybridBuild = 1 ; +} + # prepare the script that initializes the shell variables HAIKU_IMAGE_INIT_VARIABLES_SCRIPT = haiku.image-init-vars ; local script = $(HAIKU_IMAGE_INIT_VARIABLES_SCRIPT) ; @@ -734,6 +741,8 @@ AddVariableToScript $(script) : outputDir : $(HAIKU_OUTPUT_DIR) ; AddVariableToScript $(script) : tmpDir : $(HAIKU_TMP_DIR) ; AddVariableToScript $(script) : installDir : $(HAIKU_INSTALL_DIR) ; #AddVariableToScript $(script) : isImage : 1 ; +AddVariableToScript $(script) : gccVersion : $(HAIKU_GCC_VERSION[1]) ; +AddVariableToScript $(script) : isHybridBuild : $(isHybridBuild) ; AddVariableToScript $(script) : imageSize : $(HAIKU_IMAGE_SIZE) ; AddVariableToScript $(script) : imageLabel : $(HAIKU_IMAGE_LABEL) ; AddVariableToScript $(script) : addBuildCompatibilityLibDir diff --git a/build/jam/ImageRules b/build/jam/ImageRules index 8e27d5606c..d7a48a7bc6 100644 --- a/build/jam/ImageRules +++ b/build/jam/ImageRules @@ -283,16 +283,17 @@ rule CopyDirectoryToContainer container : directoryTokens : sourceDirectory } rule ExtractArchiveToContainer container : directoryTokens : archiveFile - : extractedSubDir + : extractedSubDir : isGCCAgnostic { # ExtractArchiveToContainer : : - # : ; + # : : ; local directory = [ AddDirectoryToContainer $(container) : $(directoryTokens) ] ; ARCHIVE_FILES_TO_INSTALL on $(directory) += $(archiveFile) ; ARCHIVE_SUBDIR_TO_INSTALL_FROM on $(archiveFile) = $(extractedSubDir) ; + ARCHIVE_IS_GCC_AGNOSTIC on $(archiveFile) = $(isGCCAgnostic) ; } rule AddDriversToContainer container : relativeDirectoryTokens : targets @@ -604,7 +605,13 @@ rule CreateContainerExtractFilesScript container : script local extractedSubDir = [ on $(archiveFile) return $(ARCHIVE_SUBDIR_TO_INSTALL_FROM) ] ; - NotFile $(extractedSubDir) ; + ARCHIVE_SUBDIR_TO_INSTALL_FROM on $(dummyTarget) = + $(extractedSubDir:E=.) ; + + local isGCCAgnostic = [ on $(archiveFile) + return $(ARCHIVE_IS_GCC_AGNOSTIC) ] ; + ARCHIVE_IS_GCC_AGNOSTIC on $(dummyTarget) = + $(isGCCAgnostic:E=false) ; Depends $(dummyTarget) : $(initScript) $(archiveFile) $(serializationDependency) ; @@ -612,7 +619,7 @@ rule CreateContainerExtractFilesScript container : script serializationDependency = $(dummyTarget) ; AddExtractFileToContainerExtractFilesScript $(dummyTarget) - : $(initScript) $(archiveFile) $(extractedSubDir) ; + : $(initScript) $(archiveFile) ; } } } @@ -620,7 +627,9 @@ rule CreateContainerExtractFilesScript container : script actions AddExtractFileToContainerExtractFilesScript { - echo extractFile "\"$(2[2])\"" "\"$(TARGET_DIR)\"" "\"$(2[3])\"" >> $(2[1]) + echo extractFile "\"$(2[2])\"" "\"$(TARGET_DIR)\"" \ + "\"$(ARCHIVE_SUBDIR_TO_INSTALL_FROM)\"" \ + "\"$(ARCHIVE_IS_GCC_AGNOSTIC)\"" >> $(2[1]) } @@ -725,16 +734,16 @@ rule AddWifiFirmwareToHaikuImage driver : package : archive : extract } rule ExtractArchiveToHaikuImage dirTokens : archiveFile : alwaysUpdate - : extractedSubDir + : extractedSubDir : isGCCAgnostic { # ExtractArchiveToHaikuImage : : - # : ; + # : : ; # If the image shall only be updated, we extract only, if explicitely # requested. if ! [ IsUpdateHaikuImageOnly ] || $(alwaysUpdate) { ExtractArchiveToContainer $(HAIKU_IMAGE_CONTAINER_NAME) : $(dirTokens) - : $(archiveFile) : $(extractedSubDir) ; + : $(archiveFile) : $(extractedSubDir) : $(isGCCAgnostic) ; } } @@ -810,6 +819,7 @@ rule InstallSourceArchive file : url } rule InstallOptionalHaikuImagePackage package : url : dirTokens : isCDPackage + : isGCCAgnostic { # download archive file local archiveFile = [ DownloadFile $(package) : $(url) ] ; @@ -819,9 +829,16 @@ rule InstallOptionalHaikuImagePackage package : url : dirTokens : isCDPackage # image! # copy onto image AddFilesToHaikuImage _packages_ : $(archiveFile) ; + #if $(isGCCAgnostic) { + # TODO: The archives would need to be marked whether they are + # gcc-agnostic (e.g. via attribute). Installer's UnzipEngine would + # also need to be updated, to read this attribute and create the + # alt gcc dir and symlinks as needed. + #} } else { # extract onto image - ExtractArchiveToHaikuImage $(dirTokens) : $(archiveFile) ; + ExtractArchiveToHaikuImage $(dirTokens) : $(archiveFile) : : + : $(isGCCAgnostic) ; } } diff --git a/build/scripts/build_haiku_image b/build/scripts/build_haiku_image index 81cbab7ace..a81d926bf8 100755 --- a/build/scripts/build_haiku_image +++ b/build/scripts/build_haiku_image @@ -6,6 +6,8 @@ set -o errexit # outputDir # tmpDir # addBuildCompatibilityLibDir +# gccVersion +# isHybridBuild # The following are only for image types: # installDir # isImage @@ -94,20 +96,20 @@ else mkindex=mkindex fi - extractFile() { # extractFile archiveFile=$1 targetExtractedDir=$2 extractedSubDir=$3 + isGCCAgnostic=$4 echo "Extracting $archiveFile ..." extractDir=$tmpDir/extract $rmAttrs -rf "$extractDir" mkdir -p "$extractDir" - + case "$archiveFile" in *.zip) $unzip -q -d "$extractDir" "$archiveFile" @@ -120,19 +122,68 @@ extractFile() exit 1 ;; esac - + if [ -f $extractDir/.OptionalPackageDescription ]; then cat $extractDir/.OptionalPackageDescription >> $copyrightsFile echo >> $copyrightsFile rm $extractDir/.OptionalPackageDescription fi + if [ "$isGCCAgnostic" == "true" ] && [ $isHybridBuild ] ; then + #if [ $isGCCAgnostic -eq 1 ] && [ $isHybridBuild ] ; then + extractedLibs=`find "$extractDir/$extractedSubDir/" -name "*.so"` + moreExtractedLibs=`find "$extractDir/$extractedSubDir/" -name "*.so.*"` + createSymlinksForHybrid $extractedLibs $moreExtractedLibs + fi + $cp -r "${sPrefix}$extractDir/$extractedSubDir/." "${tPrefix}$targetExtractedDir" $rmAttrs -rf "$extractDir" } +createSymlinksForHybrid() +{ + # createSymlinksForHybrid + + # Determine the alternative gcc subdir. + if [ $gccVersion -eq 2 ]; then + gccAltDir=gcc4 + else + gccAltDir=gcc2 + fi + + # Iterate over the library file paths that were passed in. + for srcPathLib in $@; do + # determine the relative path of the library + relPathLib=`echo $srcPathLib | \ + sed -e "s:${extractDir}/${extractedSubDir}/::"` + relPath=`dirname $relPathLib` + + # check if that relative path is one of the standard library paths + standardLibPaths="system/lib common/lib home/config/lib" + isStandardPath= + for stdLibPath in $standardLibPaths; do + if [ "$relPath" == "$stdLibPath" ]; then + isStandardPath=true + break + fi + done + + # create alt gcc symlinks for libs inside standard paths + if [ $isStandardPath ]; then + srcPath=`dirname $srcPathLib` + srcLib=`basename $srcPathLib` + destLinkDir="${srcPath}/${gccAltDir}" + destLinkTarget="../$srcLib" + + mkdir -p $destLinkDir + ln -sf -t $destLinkDir $destLinkTarget + fi + done +} + + mkdir -p $tmpDir copyrightsFile=$tmpDir/copyrights $rmAttrs -f $copyrightsFile