CMake:Bundles And Frameworks: Difference between revisions

From KitwarePublic
Jump to navigationJump to search
No edit summary
(Replace content with link to new CMake community wiki)
 
(38 intermediate revisions by 10 users not shown)
Line 1: Line 1:
==Issue==
{{CMake/Template/Moved}}


(In all examples, the applications are named appl1, appl2, ...,
This page has moved [https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/platform_dependent_issues/Bundles-And-Frameworks here].
libraries are named libr1, libr2, ..., header files are named appl1_header1, appl2_header2, libr1_header1, ...,
and there are auxilary files associated with application and library appl1_aux1, appl2_aux2, libr1_aux1, ....
and some resource files associated with application and library appl1_res1, appl2_res2, libr1_res1, ....
All versions are ver1, ver2, ...)
 
On Mac there are several different cases of combinations of bundles, frameworks, and unix tools.
 
The problem is that CMAKE_INSTALL_PREFIX is not enough. Also, when creating bundles and frameworks, auxilary files should be in the proper subdirectory structure.
 
==Cases==
 
===Unix tools only===
* No issues (just like any other unix)
 
===Bundle only===
* Everything in a same directory:
 
<pre>
/Applications/
            appl1.app/
                      Contents/
                              Info.plist
                              MacOS/
                                  appl1 -> appl1-1
                                  appl1-1
                                  appl1_aux1
                                  appl1_aux2
                              Resources/
                                  appl1_res1
                                  appl1_res2
</pre>
 
* Suggested api:
 
<pre>
ADD_EXECUTABLE(
  appl1
  MACOSX_BUNDLE
  appl1_src1.cxx
  appl1_src2.cxx
  ...
  MACOSX_BUNDLE_CONTENT
  apple1_aux1
  apple1_aux2
  apple1_res1
  apple1_res2
  )
 
SET_SOURCE_FILES_PROPERTIES(
  apple1_aux1
  apple1_aux2
  PROPERTIES
  MACOSX_BUNDLE_LOCATION MacOSX
  )
SET_SOURCE_FILES_PROPERTIES(
  apple1_res1
  apple1_res2
  PROPERTIES
  MACOSX_BUNDLE_LOCATION Resources
  )
</pre>
 
===Framework only===
* Everything in a same directory:
 
<pre>
/Library/
        Frameworks/
                  libr1.framework/
                                libr1    -> Versions/Current/libr1
                                Resources -> Versions/Current/Resources
                                Libraries -> Versions/Current/Libraries
                                Headers  -> Versions/Current/Headers
                                Versions/
                                        Current -> ver2
                                        ver2/
                                            libr1
                                            Resources/
                                                      Info.plist
                                                      version.plist
                                            Libraries/
                                                      libr2.dylib
                                                      libr3.dylib
                                            Headers/
                                                    libr1_header1.h
                                                    libr1_header2.h
                                                    libr1_header3.h
</pre>
 
 
* Suggested api:
 
<pre>
ADD_LIBRARY(
  libr1
  SHARED MACOSX_FRAMEWORK
  appl1_src1.cxx
  appl1_src2.cxx
  libr1_header4.h
  libr1_header5.h
  libr1_header6.h
  ...
  MACOSX_FRAMEWORK_HEADERS
  libr1_header1.h
  libr1_header2.h
  libr1_header3.h
  )
 
TARGET_LINL_LIBRARIES(
  libr1
  libr2 libr3)
</pre>
 
===Bundle + Framework===
* Bundle stuff in one directory, framework stuff in another one
 
<pre>
/Applications/
            appl1.app/
                      Contents/
                              Info.plist
                              MacOS/
                                  appl1 -> appl1-ver1
                                  appl1-ver2
                                  appl1_aux1
                                  appl1_aux2
                              Resources/
                                  appl1_res1
                                  appl1_res2
/Library/
        Frameworks/
                  libr1.framework/
                                libr1    -> Versions/Current/libr1
                                Resources -> Versions/Current/Resources
                                Libraries -> Versions/Current/Libraries
                                Headers  -> Versions/Current/Headers
                                Versions/
                                        Current -> ver2
                                        ver2/
                                            libr1
                                            Resources/
                                                      Info.plist
                                                      version.plist
                                            Libraries/
                                                      libr2.dylib
                                                      libr3.dylib
                                            Headers/
                                                    libr1_header1.h
                                                    libr1_header2.h
                                                    libr1_header3.h
</pre>
 
===Bundle + Unix tools===
* Bundle stuff in one directory, unix tools in typical unix location
 
<pre>
/Applications/
            appl1.app/
                      Contents/
                              Info.plist
                              MacOS/
                                  appl1 -> appl1-ver1
                                  appl1-ver2
                                  appl1_aux1
                                  appl1_aux2
                              Resources/
                                  appl1_res1
                                  appl1_res2
 
/usr/
    bin/
      appl2
    share/
      appl2-version/
                    appl2_aux1
                    appl2_aux2
</pre>
 
===Framework + Unix tools===
* Framework stuff in one directory, unix tools in typical unix location
 
<pre>
/Library/
        Frameworks/
                  libr1.framework/
                                libr1    -> Versions/Current/libr1
                                Resources -> Versions/Current/Resources
                                Libraries -> Versions/Current/Libraries
                                Headers  -> Versions/Current/Headers
                                Commands  -> Versions/Current/Commands
                                Versions/
                                        Current -> ver2
                                        ver2/
                                            libr1
                                            Resources/
                                                      Info.plist
                                                      version.plist
                                            Libraries/
                                                      libr2.dylib
                                                      libr3.dylib
                                            Headers/
                                                    libr1_header1.h
                                                    libr1_header2.h
                                                    libr1_header3.h
                                            Commands/
                                                    appl2
                                            bin/
                                                appl3
/usr/
    bin/
      appl1
      appl2 -> /Library/Frameworks/libr1.framework/Commands/appl2
      appl3 -> /Library/Frameworks/libr1.framework/Version/ver1/bin/appl3
    share/
      appl1-version/
                    appl1_aux1
                    appl1_aux2
</pre>
 
===Bundle + Framework + Unix tools===
* Framework stuff in one directory, unix tools in typical unix location
 
<pre>
/Applications/
            appl1.app/
                      Contents/
                              Info.plist
                              MacOS/
                                  appl1 -> appl1-ver1
                                  appl1-ver2
                                  appl1_aux1
                                  appl1_aux2
                              Resources/
                                  appl1_res1
                                  appl1_res2
/Library/
        Frameworks/
                  libr1.framework/
                                libr1    -> Versions/Current/libr1
                                Resources -> Versions/Current/Resources
                                Libraries -> Versions/Current/Libraries
                                Headers  -> Versions/Current/Headers
                                Commands  -> Versions/Current/Commands
                                Versions/
                                        Current -> ver2
                                        ver2/
                                            libr1
                                            Resources/
                                                      Info.plist
                                                      version.plist
                                            Libraries/
                                                      libr2.dylib
                                                      libr3.dylib
                                            Headers/
                                                    libr1_header1.h
                                                    libr1_header2.h
                                                    libr1_header3.h
                                            Commands/
                                                    appl2
                                            bin/
                                                appl3
/usr/
    bin/
      appl1
      appl2 -> /Library/Frameworks/libr1.framework/Commands/appl2
      appl3 -> /Library/Frameworks/libr1.framework/Version/ver1/bin/appl3
    share/
        appl1-version/
                      appl1_aux1
                      appl1_aux2
</pre>
 
==Related Work==
 
* On mailing list: http://public.kitware.com/pipermail/cmake/2005-December/007725.html
* From apple: http://developer.apple.com/documentation/DeveloperTools/Conceptual/MachOTopics/index.html

Latest revision as of 15:40, 30 April 2018


The CMake community Wiki has moved to the Kitware GitLab Instance.

This page has moved here.