1 #!/bin/bash 2 3 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 4 # Use of this source code is governed by a BSD-style license that can be 5 # found in the LICENSE file. 6 7 # Running Chromium via this script makes it possible to set Chromium as the 8 # default browser directly out of a compile, without needing to package it. 9 10 DESKTOP="chromium-devel" 11 TITLE="Chromium" 12 13 usage() { 14 echo "$0 [--gdb] [--help] [--man-page] [--] [chrome-options]" 15 echo 16 echo " --gdb Start within gdb" 17 echo " --help This help screen" 18 echo " --man-page Open the man page in the tree" 19 } 20 21 # Check to see if there is a desktop file of the given name. 22 exists_desktop_file() { 23 # Build a search list from $XDG_DATA_HOME and $XDG_DATA_DIRS, the latter 24 # of which can itself be a colon-separated list of directories to search. 25 search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" 26 IFS=: 27 for dir in $search; do 28 unset IFS 29 [ "$dir" -a -d "$dir/applications" ] || continue 30 [ -r "$dir/applications/$DESKTOP.desktop" ] && return 31 done 32 # Didn't find it in the search path. 33 return 1 34 } 35 36 # Checks a file to see if it's a 32 or 64-bit. 37 check_executable() { 38 out=$(file $(readlink -f $1) 2> /dev/null) 39 echo $out | grep -qs "ELF 32-bit LSB" 40 if [ $? = 0 ]; then 41 echo 32 42 return 43 fi 44 echo $out | grep -qs "ELF 64-bit LSB" 45 if [ $? = 0 ]; then 46 echo 64 47 return 48 fi 49 echo neither 50 } 51 52 # Generate a desktop file that will run this script. 53 generate_desktop_file() { 54 apps="${XDG_DATA_HOME:-$HOME/.local/share}/applications" 55 mkdir -p "$apps" 56 cat > "$apps/$DESKTOP.desktop" << EOF 57 [Desktop Entry] 58 Version=1.0 59 Encoding=UTF-8 60 Name=$TITLE 61 Exec=$CHROME_WRAPPER %U 62 Terminal=false 63 Icon=$HERE/product_logo_48.png 64 Type=Application 65 Categories=Application;Network;WebBrowser; 66 MimeType=text/html;text/xml;application/xhtml_xml; 67 EOF 68 } 69 70 # Let the wrapped binary know that it has been run through the wrapper. 71 export CHROME_WRAPPER="`readlink -f "$0"`" 72 export CHROME_DESKTOP="$DESKTOP.desktop" 73 74 HERE="`dirname "$CHROME_WRAPPER"`" 75 76 # We include some xdg utilities next to the binary, and we want to prefer them 77 # over the system versions when we know the system versions are very old. We 78 # detect whether the system xdg utilities are sufficiently new to be likely to 79 # work for us by looking for xdg-settings. If we find it, we leave $PATH alone, 80 # so that the system xdg utilities (including any distro patches) will be used. 81 if ! which xdg-settings &> /dev/null; then 82 # Old xdg utilities. Prepend $HERE to $PATH to use ours instead. 83 export PATH="$HERE:$PATH" 84 else 85 # Use system xdg utilities. But first create mimeapps.list if it doesn't 86 # exist; some systems have bugs in xdg-mime that make it fail without it. 87 xdg_app_dir="${XDG_DATA_HOME:-$HOME/.local/share/applications}" 88 mkdir -p "$xdg_app_dir" 89 [ -f "$xdg_app_dir/mimeapps.list" ] || touch "$xdg_app_dir/mimeapps.list" 90 fi 91 92 # Always use our ffmpeg and other shared libs. 93 export LD_LIBRARY_PATH="$HERE:$HERE/lib:$HERE/lib.target${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" 94 95 MISSING_LIBS=$(ldd "$HERE/chrome" 2> /dev/null |grep "not found$" | cut -d" " -f 1|sed 's/\t//') 96 CHROME_ARCH=$(check_executable "$HERE/chrome") 97 uname -m | grep -qs x86_64 98 if [ $? = 1 ]; then 99 LIBDIRS="/lib /lib32 /usr/lib /usr/lib32" 100 else 101 LIBDIRS="/lib64 /lib /usr/lib64 /usr/lib" 102 fi 103 104 echo $MISSING_LIBS | grep -qs libbz2.so.1.0 105 if [ $? = 0 ]; then 106 for dir in $LIBDIRS 107 do 108 if [ -e "$dir/libbz2.so.1" ]; then 109 LIB_ARCH=$(check_executable "$dir/libbz2.so.1") 110 if [ "$CHROME_ARCH" = "$LIB_ARCH" ]; then 111 ln -snf "$dir/libbz2.so.1" "$HERE/libbz2.so.1.0" 112 break; 113 fi 114 fi 115 done 116 fi 117 118 for lib in libnspr4.so.0d libnss3.so.1d libnssutil3.so.1d libplc4.so.0d libplds4.so.0d libsmime3.so.1d libssl3.so.1d 119 do 120 echo $MISSING_LIBS | grep -qs $lib 121 if [ $? = 0 ]; then 122 reallib=$(echo $lib | sed 's/\.[01]d$//') 123 for dir in $LIBDIRS 124 do 125 if [ -e "$dir/$reallib" ]; then 126 LIB_ARCH=$(check_executable "$dir/$reallib") 127 if [ "$CHROME_ARCH" = "$LIB_ARCH" ]; then 128 ln -snf "$dir/$reallib" "$HERE/$lib" 129 break; 130 fi 131 fi 132 done 133 fi 134 done 135 136 # Custom version string for this release. This can be used to add a downstream 137 # vendor string or release channel information. 138 export CHROME_VERSION_EXTRA="custom" 139 140 exists_desktop_file || generate_desktop_file 141 142 CMD_PREFIX= 143 ARGS=() 144 while [ "$#" -gt 0 ]; do 145 case "$1" in 146 "--") 147 shift 148 break ;; 149 "--gdb") 150 CMD_PREFIX="gdb --args" ;; 151 "--help") 152 usage 153 exit 0 ;; 154 "--man-page") 155 exec man "$HERE/../../chrome/app/resources/manpage.1.in" ;; 156 *) 157 ARGS=( "${ARGS[@]}" "$1" ) ;; 158 esac 159 shift 160 done 161 set -- "${ARGS[@]}" "$@" 162 163 exec $CMD_PREFIX "$HERE/chrome" "$@" 164