[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[vidalia-svn] r3914: Add vidalia_install_tool, vidalia_install_qt4_framework, and (in vidalia/trunk: cmake pkg/osx)



Author: edmanm
Date: 2009-06-28 22:41:32 -0400 (Sun, 28 Jun 2009)
New Revision: 3914

Added:
   vidalia/trunk/cmake/ParseArgumentsMacro.cmake
Modified:
   vidalia/trunk/cmake/VidaliaMacros.cmake
   vidalia/trunk/pkg/osx/CMakeLists.txt
Log:

Add vidalia_install_tool, vidalia_install_qt4_framework, and
vidalia_install_dylib CMake macros to take care of moving Qt and Marble
libraries into the .app bundle as needed and play the install_name_tool
game on libraries and their dependencies. Also add a dist-osx-libraries
target that does all that for you.


Added: vidalia/trunk/cmake/ParseArgumentsMacro.cmake
===================================================================
--- vidalia/trunk/cmake/ParseArgumentsMacro.cmake	                        (rev 0)
+++ vidalia/trunk/cmake/ParseArgumentsMacro.cmake	2009-06-29 02:41:32 UTC (rev 3914)
@@ -0,0 +1,35 @@
+##
+## From http://www.cmake.org/Wiki/CMakeMacroParseArguments
+##
+
+MACRO(PARSE_ARGUMENTS prefix arg_names option_names)
+  SET(DEFAULT_ARGS)
+  FOREACH(arg_name ${arg_names})    
+    SET(${prefix}_${arg_name})
+  ENDFOREACH(arg_name)
+  FOREACH(option ${option_names})
+    SET(${prefix}_${option} FALSE)
+  ENDFOREACH(option)
+
+  SET(current_arg_name DEFAULT_ARGS)
+  SET(current_arg_list)
+  FOREACH(arg ${ARGN})            
+    SET(larg_names ${arg_names})    
+    LIST(FIND larg_names "${arg}" is_arg_name)                   
+    IF (is_arg_name GREATER -1)
+      SET(${prefix}_${current_arg_name} ${current_arg_list})
+      SET(current_arg_name ${arg})
+      SET(current_arg_list)
+    ELSE (is_arg_name GREATER -1)
+      SET(loption_names ${option_names})    
+      LIST(FIND loption_names "${arg}" is_option)            
+      IF (is_option GREATER -1)
+       SET(${prefix}_${arg} TRUE)
+      ELSE (is_option GREATER -1)
+       SET(current_arg_list ${current_arg_list} ${arg})
+      ENDIF (is_option GREATER -1)
+    ENDIF (is_arg_name GREATER -1)
+  ENDFOREACH(arg)
+  SET(${prefix}_${current_arg_name} ${current_arg_list})
+ENDMACRO(PARSE_ARGUMENTS)
+


Property changes on: vidalia/trunk/cmake/ParseArgumentsMacro.cmake
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: vidalia/trunk/cmake/VidaliaMacros.cmake
===================================================================
--- vidalia/trunk/cmake/VidaliaMacros.cmake	2009-06-29 02:37:35 UTC (rev 3913)
+++ vidalia/trunk/cmake/VidaliaMacros.cmake	2009-06-29 02:41:32 UTC (rev 3914)
@@ -147,7 +147,87 @@
   set(${OUTFILES} ${${OUTFILES}} ${wxl})
 endmacro(VIDALIA_ADD_WXL)
 
+if (APPLE)
+  include(${Vidalia_SOURCE_DIR}/cmake/ParseArgumentsMacro.cmake)
 
+  ## Calls the install_name_tool utility to change the dependent shared
+  ## library or framework install name to the corresponding library or
+  ## framework that was previously installed in the .app bundle using
+  ## VIDALIA_INSTALL_QT4_FRAMEWORK or VIDALIA_INSTALL_DYLIB when the given
+  ## build target is executed.
+  macro(VIDALIA_INSTALL_NAME_TOOL)
+    parse_arguments(INSTALL_NAME_TOOL "TARGET;LIBRARIES;FRAMEWORKS" "" ${ARGN})
+
+    foreach(bin ${INSTALL_NAME_TOOL_DEFAULT_ARGS})
+      foreach(it ${INSTALL_NAME_TOOL_FRAMEWORKS})
+        add_custom_command(TARGET ${INSTALL_NAME_TOOL_TARGET}
+          COMMAND install_name_tool -change
+            ${it} @executable_path/../Frameworks/${it} ${bin}
+        )
+      endforeach(it)
+      foreach(it ${INSTALL_NAME_TOOL_LIBRARIES})
+        get_filename_component(libname ${it} NAME)
+        add_custom_command(TARGET ${INSTALL_NAME_TOOL_TARGET}
+          COMMAND install_name_tool -change
+            ${it} @executable_path/lib/${libname} ${bin}
+        )
+      endforeach(it)
+    endforeach(bin)
+  endmacro(VIDALIA_INSTALL_NAME_TOOL)
+
+  ## Copies the specified Qt4 framework into the .app bundle, updates its
+  ## shared library identification name, and changes any dependent Qt4
+  ## framework or shared library names to reference a framework previously
+  ## installed in the .app bundle using VIDALIA_INSTALL_QT4_FRAMEWORK.
+  macro(VIDALIA_INSTALL_QT4_FRAMEWORK)
+    parse_arguments(INSTALL_QT4_FRAMEWORK
+      "NAME;TARGET;LIBRARY;APP_BUNDLE;DEPENDS_FRAMEWORKS;DEPENDS_LIBRARIES" ""
+      ${ARGN}
+    )
+ 
+    set(framework "${INSTALL_QT4_FRAMEWORK_NAME}.framework/Versions/4")
+    set(outdir "${INSTALL_QT4_FRAMEWORK_APP_BUNDLE}/Contents/Frameworks/${framework}")
+    get_filename_component(libname "${INSTALL_QT4_FRAMEWORK_LIBRARY}" NAME)
+    add_custom_command(TARGET ${INSTALL_QT4_FRAMEWORK_TARGET}
+      COMMAND ${CMAKE_COMMAND} -E make_directory ${outdir}
+      COMMAND ${CMAKE_COMMAND} -E copy ${INSTALL_QT4_FRAMEWORK_LIBRARY} ${outdir}/
+      COMMAND install_name_tool -id
+        @executable_path/../Frameworks/${framework}/${libname} ${outdir}/${libname}
+    )
+    vidalia_install_name_tool(${outdir}/${libname}
+      TARGET     ${INSTALL_QT4_FRAMEWORK_TARGET}
+      LIBRARIES  ${INSTALL_QT4_FRAMEWORK_DEPENDS_LIBRARIES}
+      FRAMEWORKS ${INSTALL_QT4_FRAMEWORK_DEPENDS_FRAMEWORKS}
+    )
+    set(${INSTALL_QT4_FRAMEWORK_DEFAULT_ARGS} ${framework}/${libname})
+  endmacro(VIDALIA_INSTALL_QT4_FRAMEWORK)
+
+  ## Copies the specified .dylib into the .app bundle, updates its shared
+  ## library identification name, and changes any dependent framework or
+  ## shared library names to reference a framework or shared library
+  ## previously installed in the .app bundle.
+  macro(VIDALIA_INSTALL_DYLIB)
+    parse_arguments(INSTALL_DYLIB
+      "TARGET;LIBRARY;APP_BUNDLE;DEPENDS_FRAMEWORKS;DEPENDS_LIBRARIES" ""
+      ${ARGN}
+    )
+
+    set(outdir "${INSTALL_DYLIB_APP_BUNDLE}/Contents/MacOS/lib/")
+    get_filename_component(libname "${INSTALL_DYLIB_LIBRARY}" NAME)
+    add_custom_command(TARGET ${INSTALL_DYLIB_TARGET}
+      COMMAND ${CMAKE_COMMAND} -E make_directory ${outdir}
+      COMMAND ${CMAKE_COMMAND} -E copy ${INSTALL_DYLIB_LIBRARY} ${outdir}/
+      COMMAND install_name_tool -id @executable_path/lib/${libname}
+    )
+    vidalia_install_name_tool(${outir}/${libname}
+      TARGET     ${INSTALL_DYLIB_TARGET}
+      LIBRARIES  ${INSTALL_DYLIB_DEPENDS_LIBRARIES}
+      FRAMEWORKS ${INSTALL_DYLIB_DEPENDS_FRAMEWORKS}
+    )
+   set(${INSTALL_DYLIB_DEFAULT_ARGS} "${libname}")
+  endmacro(VIDALIA_INSTALL_DYLIB)
+endif(APPLE)
+
 if (WIN32)
   ## Wraps the supplied .rc files in windres commands if we're building
   ## with MinGW. Otherwise, it just adds the .rc files directly to the

Modified: vidalia/trunk/pkg/osx/CMakeLists.txt
===================================================================
--- vidalia/trunk/pkg/osx/CMakeLists.txt	2009-06-29 02:37:35 UTC (rev 3913)
+++ vidalia/trunk/pkg/osx/CMakeLists.txt	2009-06-29 02:41:32 UTC (rev 3914)
@@ -16,147 +16,81 @@
   ${CMAKE_CURRENT_BINARY_DIR}/builddmg.sh
 )
 
+set(VIDALIA_APP_BUNDLE_ROOT ${Vidalia_BINARY_DIR}/src/vidalia/Vidalia.app)
+get_target_property(VIDALIA_EXECUTABLE Vidalia LOCATION)
+add_custom_target(dist-osx-libraries DEPENDS Vidalia)
 if (QT_USE_FRAMEWORKS)
-  set(bindir ${Vidalia_BINARY_DIR}/src/vidalia/Vidalia.app/Contents/MacOS)
-  add_custom_target(dist-osx
-    COMMAND cp 
-      ${QT_QTCORE_LIBRARY}/QtCore ${bindir}/
-    COMMAND cp
-      ${QT_QTGUI_LIBRARY}/QtGui ${bindir}/
-    COMMAND cp 
-      ${QT_QTNETWORK_LIBRARY}/QtNetwork ${bindir}/
-    COMMAND cp 
-      ${QT_QTXML_LIBRARY}/QtXml ${bindir}/
-
-    COMMAND install_name_tool
-      -id @executable_path/QtCore ${bindir}/QtCore
-    COMMAND install_name_tool
-      -id @executable_path/QtGui ${bindir}/QtGui
-    COMMAND install_name_tool
-      -id @executable_path/QtNetwork ${bindir}/QtNetwork
-    COMMAND install_name_tool
-      -id @executable_path/QtXml ${bindir}/QtXml
-
-    COMMAND install_name_tool
-      -change QtCore.framework/Versions/4/QtCore
-              @executable_path/QtCore ${bindir}/Vidalia
-    COMMAND install_name_tool
-      -change QtGui.framework/Versions/4/QtGui
-              @executable_path/QtGui ${bindir}/Vidalia
-    COMMAND install_name_tool
-      -change QtNetwork.framework/Versions/4/QtNetwork
-              @executable_path/QtNetwork ${bindir}/Vidalia
-    COMMAND install_name_tool
-      -change QtXml.framework/Versions/4/QtXml
-              @executable_path/QtXml ${bindir}/Vidalia
-
-    COMMAND install_name_tool
-      -change QtCore.framework/Versions/4/QtCore
-              @executable_path/QtCore ${bindir}/QtGui
-    COMMAND install_name_tool
-      -change QtCore.framework/Versions/4/QtCore
-              @executable_path/QtCore ${bindir}/QtNetwork
-    COMMAND install_name_tool
-      -change QtCore.framework/Versions/4/QtCore
-              @executable_path/QtCore ${bindir}/QtXml
-
-    DEPENDS ${bindir}/Vidalia
+  vidalia_install_qt4_framework(QtCore
+    TARGET dist-osx-libraries NAME QtCore
+    LIBRARY ${QT_QTCORE_LIBRARY}/QtCore
+    APP_BUNDLE ${VIDALIA_APP_BUNDLE_ROOT}
   )
+  vidalia_install_qt4_framework(QtGui
+    TARGET dist-osx-libraries NAME QtGui
+    LIBRARY ${QT_QTGUI_LIBRARY}/QtGui
+    APP_BUNDLE ${VIDALIA_APP_BUNDLE_ROOT}
+    DEPENDS_FRAMEWORKS ${QtCore}
+  )
+  vidalia_install_qt4_framework(QtNetwork
+    TARGET dist-osx-libraries NAME QtNetwork
+    LIBRARY ${QT_QTNETWORK_LIBRARY}/QtNetwork
+    APP_BUNDLE ${VIDALIA_APP_BUNDLE_ROOT}
+    DEPENDS_FRAMEWORKS ${QtCore}
+  )
+  vidalia_install_qt4_framework(QtXml
+    TARGET dist-osx-libraries NAME QtXml
+    LIBRARY ${QT_QTXML_LIBRARY}/QtXml
+    APP_BUNDLE ${VIDALIA_APP_BUNDLE_ROOT}
+    DEPENDS_FRAMEWORKS ${QtCore}
+  )
+  vidalia_install_name_tool(${VIDALIA_EXECUTABLE}
+    TARGET dist-osx-libraries
+    FRAMEWORKS ${QtCore} ${QtGui} ${QtNetwork} ${QtXml}
+  )
   if (USE_MARBLE)
-    get_filename_component(marblewidget ${MARBLEWIDGET_LIBRARY} NAME)
-
-    add_custom_command(TARGET dist-osx
-      COMMAND cp
-        ${QT_QTSVG_LIBRARY}/QtSvg ${bindir}/
-      COMMAND cp
-        ${QT_QTWEBKIT_LIBRARY}/QtWebKit ${bindir}/
-      COMMAND cp
-        ${QT_QTSCRIPT_LIBRARY}/QtScript ${bindir}/
-      COMMAND cp
-        ${QT_QTDBUS_LIBRARY}/QtDBus ${bindir}/
-      COMMAND cp
-        ${MARBLEWIDGET_LIBRARY} ${bindir}/
-
-      COMMAND install_name_tool
-        -id @executable_path/QtSvg ${bindir}/QtSvg
-      COMMAND install_name_tool
-        -id @executable_path/QtWebKit ${bindir}/QtWebKit
-      COMMAND install_name_tool
-        -id @executable_path/QtScript ${bindir}/QtScript
-      COMMAND install_name_tool
-        -id @executable_path/QtDBus ${bindir}/QtDBus
-      COMMAND install_name_tool
-        -id @executable_path/${marblewidget} ${bindir}/${marblewidget}
-
-      COMMAND install_name_tool
-        -change QtSvg.framework/Versions/4/QtSvg
-                @executable_path/QtSvg ${bindir}/Vidalia
-      COMMAND install_name_tool
-        -change QtWebKit.framework/Versions/4/QtWebKit
-                @executable_path/QtWebKit ${bindir}/Vidalia
-      COMMAND install_name_tool
-        -change QtScript.framework/Versions/4/QtScript
-                @executable_path/QtScript ${bindir}/Vidalia
-      COMMAND install_name_tool
-        -change QtDBus.framework/Versions/4/QtDBus
-                @executable_path/QtDBus ${bindir}/Vidalia
-      COMMAND install_name_tool
-        -change @executable_path/lib/${marblewidget}
-                @executable_path/${marblewidget} ${bindir}/Vidalia
-      COMMAND install_name_tool
-        -change ${MARBLEWIDGET_LIBRARY}
-                @executable_path/${marblewidget} ${bindir}/Vidalia
-
-      COMMAND install_name_tool
-        -change QtCore.framework/Versions/4/QtCore
-                @executable_path/QtCore ${bindir}/${marblewidget}
-      COMMAND install_name_tool
-        -change QtGui.framework/Versions/4/QtGui
-                @executable_path/QtGui ${bindir}/${marblewidget}
-      COMMAND install_name_tool
-        -change QtNetwork.framework/Versions/4/QtNetwork
-                @executable_path/QtNetwork ${bindir}/${marblewidget}
-      COMMAND install_name_tool
-        -change QtXml.framework/Versions/4/QtXml
-                @executable_path/QtXml ${bindir}/${marblewidget}
-      COMMAND install_name_tool
-        -change QtSvg.framework/Versions/4/QtSvg
-                @executable_path/QtSvg ${bindir}/${marblewidget}
-      COMMAND install_name_tool
-        -change QtScript.framework/Versions/4/QtScript
-                @executable_path/QtScript ${bindir}/${marblewidget}
-      COMMAND install_name_tool
-        -change QtWebKit.framework/Versions/4/QtWebKit
-                @executable_path/QtWebKit ${bindir}/${marblewidget}
-      COMMAND install_name_tool
-        -change QtDBus.framework/Versions/4/QtDBus
-                @executable_path/QtDBus ${bindir}/${marblewidget}
-
-      COMMAND install_name_tool
-        -change QtGui.framework/Versions/4/QtGui
-                @executable_path/QtGui ${bindir}/QtSvg
-      COMMAND install_name_tool
-        -change QtCore.framework/Versions/4/QtCore
-                @executable_path/QtCore ${bindir}/QtSvg
-      COMMAND install_name_tool
-        -change QtGui.framework/Versions/4/QtGui
-                @executable_path/QtGui ${bindir}/QtWebKit
-      COMMAND install_name_tool
-        -change QtNetwork.framework/Versions/4/QtNetwork
-                @executable_path/QtNetwork ${bindir}/QtWebKit
-      COMMAND install_name_tool
-        -change QtCore.framework/Versions/4/QtCore
-                @executable_path/QtCore ${bindir}/QtWebKit
-      COMMAND install_name_tool
-        -change QtCore.framework/Versions/4/QtCore
-                @executable_path/QtCore ${bindir}/QtScript
-      COMMAND install_name_tool
-        -change QtXml.framework/Versions/4/QtXml
-                @executable_path/QtXml ${bindir}/QtDBus
-      COMMAND install_name_tool
-        -change QtCore.framework/Versions/4/QtCore
-                @executable_path/QtCore ${bindir}/QtDBus
+    vidalia_install_qt4_framework(QtSvg
+      TARGET dist-osx-libraries NAME QtSvg
+      LIBRARY ${QT_QTSVG_LIBRARY}/QtSvg
+      APP_BUNDLE ${VIDALIA_APP_BUNDLE_ROOT}
+      DEPENDS_FRAMEWORKS ${QtCore} ${QtGui}
     )
+    vidalia_install_qt4_framework(QtScript
+      TARGET dist-osx-libraries NAME QtScript
+      LIBRARY ${QT_QTSCRIPT_LIBRARY}/QtScript
+      APP_BUNDLE ${VIDALIA_APP_BUNDLE_ROOT}
+      DEPENDS_FRAMEWORKS ${QtCore}
+    )
+    vidalia_install_qt4_framework(QtDBus
+      TARGET dist-osx-libraries NAME QtDBus
+      LIBRARY ${QT_QTDBUS_LIBRARY}/QtDBus
+      APP_BUNDLE ${VIDALIA_APP_BUNDLE_ROOT}
+      DEPENDS_FRAMEWORKS ${QtCore} ${QtXml}
+    )
+    vidalia_install_qt4_framework(QtPhonon
+      TARGET dist-osx-libraries NAME phonon
+      LIBRARY ${QT_PHONON_LIBRARY}/phonon
+      APP_BUNDLE ${VIDALIA_APP_BUNDLE_ROOT}
+      DEPENDS_FRAMEWORKS ${QtCore} ${QtGui} ${QtXml} ${QtDBus}
+    )
+    vidalia_install_qt4_framework(QtWebKit
+      TARGET dist-osx-libraries NAME QtWebKit
+      LIBRARY ${QT_QTWEBKIT_LIBRARY}/QtWebKit
+      APP_BUNDLE ${VIDALIA_APP_BUNDLE_ROOT}
+      DEPENDS_FRAMEWORKS ${QtCore} ${QtGui} ${QtNetwork} ${QtXml} ${QtDBus}
+                         ${QtPhonon}
+    )
+    vidalia_install_dylib(MarbleWidget
+      TARGET dist-osx-libraries
+      LIBRARY ${MARBLEWIDGET_LIBRARY}
+      APP_BUNDLE ${VIDALIA_APP_BUNDLE_ROOT}
+      DEPENDS_FRAMEWORKS ${QtCore} ${QtGui} ${QtNetwork} ${QtXml} ${QtSvg}
+                         ${QtDBus} ${QtScript} ${QtWebKit}
+    )
+    vidalia_install_name_tool(${VIDALIA_EXECUTABLE}
+      TARGET dist-osx-libraries
+      FRAMEWORKS ${QtSvg} ${QtDBus} ${QtScript} ${QtWebKit}
+      LIBRARIES ${MARBLEWIDGET_LIBRARY}
+    )
   endif(USE_MARBLE)
 endif(QT_USE_FRAMEWORKS)