Apps QT4 Bundle packen auf Mac OSX

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Antworten
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Apps QT4 Bundle packen auf Mac OSX

Beitrag von patrik08 »

Ich werde oft gefragt wie man die QT programme auf mac packt..
es gibt ein script auf http://qtnode.net/wiki/Distributing_Mac_Qt_applications aber je nach version geht es nicht ... un schon gar nicht wenn man plugin hat wie image oder sql plugin...
  • 1de- QT von der quelle builden nicht die DMG von trolltech benutzen ( die haben andere configuration)
    1en- Dont use QT4 .dmg package from trolltech on target to distritibuiting apps. Build from source
    2de- Wo immer moeglich kurze ordner namen bentuzen und keinen leerschlag wie window.
    2en- use shortly dir name! (no space) prefix and set the envoirment $PATH && $QTDIR on ~/.profile
    3de- Jede externe lib wenn moeglich immer mit XCODE builden und universal clicken im letzen reiter... ansonsten lauf die libs nur auf dem entsprechenden prozessor.
    3en- Each external lib build on XCODE universal. Otherwise you can not use to build Universal PPC & INTEL
Grab source - Source holen:
curl -O ftp://ftp.trolltech.com/qt/source/qt-ma ... eta.tar.gz

Tif support & other fix like Dirmodel all ok....


Configure beispiel UNIVERSAL PPC & INTEL:
Sample configure UNIVERSAL PPC & INTEL:

./configure -prefix /opt/qt -qt-zlib -qt-sql-sqlite -qt-gif -qt-tif -qt-libpng -qt-libjpeg -universal -sdk /Developer/SDKs/MacOSX10.4u.sdk


make
sudo make install

Wichtig wenn man static buildet wie von mir beschrieben auf http://wiki.qtcentre.org/index.php?titl ... n_Mac_OS_X muss man nichts packen man kann hoechstens noch die locale dir reinmachen. und mit rechstclick dazu stellen.

If You build -static ( my how to on http://wiki.qtcentre.org/index.php?titl ... n_Mac_OS_X )the bundle package having all libs, you can only append locale on bundle right click...



Dieses script macht dass bundle mit dem locale on plugin dir..
This script append to bundle plugin and locale dir....


In der main muss man angeben wo was ist un wo suchen:
Append on main.cpp to tell path to search plugin or locale...

On main tell setLibraryPaths() to find plugin & locale...

Code: Alles auswählen

#  on main.cpp
#if defined Q_WS_MAC
#QStringList path;
#path.append(QApplication::applicationDirPath());
#QDir dir(QApplication::applicationDirPath());
#dir.cdUp();
#path.append(dir.absolutePath());
#dir.cd("plugins");
#path.append(dir.absolutePath());
#dir.cdUp();
#path.append(dir.absolutePath());
#QApplication::setLibraryPaths(path);
#QDir::setCurrent(dir.absolutePath());   /* here down -> Frameworks */
#endif




Nun wen die base bundle da ist kann man dieses script anpassen und packen..
Now if you have your base bundle tell all path on this script and run it..





Code: Alles auswählen


#!/bin/bash
#
# Configuration start
#

# relative path to the directory which contains the created app bundle
BIN_DIR="bin"
# name of the binary
BINARY_NAME="edithtml"
# Qt libraries you've linked against on apps remove not needed libs 
declare -a NEEDED_LIBS=( "QtCore" "QtGui" "QtXml" "QtSql" "QtNetwork" "QtOpenGL" "QtSvg")
# additional files you'd like to get copied to the final dmg inside DMG not bundle!
declare -a ADD_FILES=("bin/ticket.pdf" "bin/copying.txt")

#
# Configuration end, nothing should be edited from here on
#
#  on main.cpp
#if defined Q_WS_MAC
#QStringList path;
#path.append(QApplication::applicationDirPath());
#QDir dir(QApplication::applicationDirPath());
#dir.cdUp();
#path.append(dir.absolutePath());
#dir.cd("plugins");
#path.append(dir.absolutePath());
#dir.cdUp();
#path.append(dir.absolutePath());
#QApplication::setLibraryPaths(path);
#QDir::setCurrent(dir.absolutePath());   /* here down -> Frameworks */
#endif

bundle_dir="$BIN_DIR/$BINARY_NAME.app"
bundle_bin="$bundle_dir/Contents/MacOS/$BINARY_NAME"
framework_dir="$bundle_dir/Contents/Frameworks"

#### make plugin && locale dir after the before the 2° run oft this script copy image sql 
#### plugin inside...  or at end right click apps and info apps select locale to activate...

plugin_dir="$bundle_dir/Contents/plugins"
locale_dir="$bundle_dir/Contents/locale"

if [ -z $QTDIR ]; then
   echo "\$QTDIR environment variable not found... exiting."
   exit 1
fi

# canonicalize QtDir, unfortunately this bash has no realpath() implementation
# so we need to use perl for this
QTDIR=`perl -e "use Cwd 'realpath'; print realpath('$QTDIR');"`

if [ ! -d "$bundle_dir" ]; then
   echo "Application bundle not found in bin... exiting."
   exit 1
fi

echo "Creating Frameworks directory in application bundle..."
mkdir -p "$framework_dir"
mkdir -p $plugin_dir
mkdir -p $locale_dir

libcount=${#NEEDED_LIBS[@]}
for (( i = 0 ; i < libcount ; i++ ))
do
    lib=${NEEDED_LIBS[$i]}
    echo "Processing $lib..."
    
    if [ ! -d "$QTDIR/lib/$lib.framework" ]; then
        echo "Couldn't find $lib.framework in $QTDIR."
        exit 1
    fi

    rm -rf "$framework_dir/$lib.framework"
    cp -fR "$QTDIR/lib/$lib.framework" "$framework_dir"
    echo "...$lib copied."
    
    install_name_tool \
        -id "@executable_path/../Frameworks/$lib.framework/Versions/4/$lib" \
        "$framework_dir/$lib.framework/Versions/4/$lib"
	
    # other Qt libs depend at least on QtCore
    if [ "$lib" != "QtCore" ]; then
        install_name_tool -change "$QTDIR/lib/QtCore.framework/Versions/4/QtCore" \
            "@executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore" \
            "$framework_dir/$lib.framework/Versions/Current/$lib"
    fi
    
    install_name_tool -change "$QTDIR/lib/$lib.framework/Versions/4/$lib" \
        "@executable_path/../Frameworks/$lib.framework/Versions/4/$lib" \
        "$bundle_bin"
        
    echo "...$lib done."
done


echo "Removing any debug libraries and headers..."
find "$framework_dir" | egrep "debug|Headers" | xargs rm -rf

echo "Preparing image directory..."
tempdir="/tmp/`basename $0`.$$"
mkdir $tempdir
cp -R $bundle_dir $tempdir
echo "...Bundle copied"
fcount=${#ADD_FILES[@]}
for (( i = 0 ; i < fcount ; i++ )) do
    file=${ADD_FILES[$i]}   
    if [ ! -f "$file" ]; then
        echo "WARNING: $file not found!"
    else
        cp "$file" $tempdir
        echo "...$file copied" 
    fi
done
echo "Creating disk image..."
rm -f "$BIN_DIR/$BINARY_NAME.dmg"
# format UDBZ: bzip2 compressed (10.4+),  UDZ0: zlib compressed (default) 
hdiutil create -srcfolder $tempdir -format UDBZ -volname "$BINARY_NAME" "$BIN_DIR/$BINARY_NAME.dmg"
rm -rf $tempdir




Sample main..


Code: Alles auswählen



static inline QString UserLanguage()
{
     /////////////QSettings setter;
     QString languser,languagesistem,langqt; 
	QLocale loci = QLocale::system();
             languser = getenv("LANG");
             languser = languser.toLower();
             languagesistem = loci.name();
             languagesistem = languagesistem.toLower();
	     languagesistem = languagesistem.left(2);
     /* Window XP Prof MUI Multiuser == stay only "c" language && user setting setenv !!! */
     if (languagesistem == "c") { 
         if (languser.size() > 2 && languser.contains("_")) {
             languagesistem = languser.left(2);
         }
     }
     ////////////setter.setValue("userlanguage",languagesistem);
     ///////////qDebug() << "### save to qsetting " << languagesistem;
    ///////// qDebug() << "### QT grep language " << QLocale::languageToString( QLocale::system().language());
     /////////qDebug() << "### User setenv " << getenv("LANG"); 
     return languagesistem;
}




int main(int argc, char *argv[]) {
     QApplication a( argc, argv );
    
        QCoreApplication::setOrganizationName(_ORGANIZATION_NAME_);
        QCoreApplication::setOrganizationDomain(_PROGRAM_NAME_DOMAINE_);
        QCoreApplication::setApplicationName(_PROGRAM_NAME_);

#if defined Q_WS_MAC
QStringList path;
path.append(QApplication::applicationDirPath());
QDir dir(QApplication::applicationDirPath());
dir.cdUp();
path.append(dir.absolutePath());
dir.cd("plugins");
path.append(dir.absolutePath());
dir.cdUp();
path.append(dir.absolutePath());
QApplication::setLibraryPaths(path);
QDir::setCurrent(dir.absolutePath());   /* here down -> Frameworks */
#endif
    
    
      
     QString localedirfile,openfile;
    
    
#if defined Q_WS_MAC
localedirfile = QString("%1/locale/edit_%2.qm").arg(QDir::currentPath()).arg(UserLanguage()); 
#endif
#if defined Q_WS_WIN
localedirfile = QString("%1/locale/edit_%2.qm").arg(QCoreApplication::applicationDirPath()).arg(UserLanguage());
#endif
#if defined Q_WS_X11
localedirfile = QString("%1/locale/edit_%2.qm").arg(WORK_CACHEDIR).arg(UserLanguage()); 
#endif
    

    QTranslator translator;
    translator.load(localedirfile);
    a.installTranslator(&translator);
  
    QStringList command = a.arguments();  
    int wat = command.size();
    
    Edit_html w;
    QMainWindow mainWin;
    mainWin.setWindowTitle(_PROGRAM_TITLE_);
    
    
    QMenu *menu = mainWin.menuBar()->addMenu(QObject::tr("&File"));
    menu->addAction(QObject::tr("Open File"), &w, SLOT(OpenNewDoc()));
    menu->addSeparator();
    menu->addAction(QObject::tr("&Quit"), &a, SLOT(quit()));
    
    
    mainWin.setCentralWidget(&w);
    
    w.set_Cache(IMM_BUILD);
    
    if (wat > 1 ) {
     w.SetFileBase(command.at(2));  
    }
    
	mainWin.show();
    
     a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
    return a.exec();
}


.........................
speack português italiano deutsch english castellà qt
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Zu mac thema.... habe ich habe eine neue how-to geschrieben

http://wiki.qtcentre.org/index.php?titl ... OSX_Finder

wie man file vom finder zur dock applikations zieht und automatisch oeffnet...
Oder vom finder mit doppelckich oeffnet... mit applikationen file assosation.

Schoen währe wenn auch window OS so pflegeleicht ist...
.........................
speack português italiano deutsch english castellà qt
Antworten