[CMake] Framework Installation Directory / Framework copying

Mike Jackson mike.jackson at bluequartz.net
Wed Dec 9 16:50:27 EST 2009


Hmm. I'll have to give that a try. Thanks
_________________________________________________________
Mike Jackson                  mike.jackson at bluequartz.net

On Wed, Dec 9, 2009 at 4:48 PM, Clinton Stimpson <clinton at elemtech.com> wrote:
> On Wednesday 09 December 2009 02:42:13 pm you wrote:
>> _________________________________________________________
>> Mike Jackson                  mike.jackson at bluequartz.net
>> BlueQuartz Software                    www.bluequartz.net
>> Principal Software Engineer                  Dayton, Ohio
>>
>> On Wed, Dec 9, 2009 at 4:33 PM, Clinton Stimpson <clinton at elemtech.com>
> wrote:
>> > On Wednesday 09 December 2009 02:23:34 pm Mike Jackson wrote:
>> >> On Wed, Dec 9, 2009 at 4:05 PM, Glenn Hughes <ghughes02138 at gmail.com>
> wrote:
>> >> > Thanks Mike,
>> >> >
>> >> > I pretty much got my build process on the Mac working. The thing that
>> >> > took me awhile to understand were the different running contexts that
>> >> > bits of the CMake script are processed within. What I want is a little
>> >> > different than the standard way that things are done in the CMake way
>> >> > of handling Frameworks and bundles. I basically always want the
>> >> > Frameworks copied into the app, not just during the install phase.
>> >> >
>> >> > Here's what I'm doing:
>> >> >
>> >> > 1) In my framework CMakeLists.txt file, I have the following:
>> >> >
>> >> > IF (APPLE)
>> >> >        SET_TARGET_PROPERTIES( MyFramework PROPERTIES FRAMEWORK true)
>> >> >        SET_TARGET_PROPERTIES( MyFramework PROPERTIES
>> >> > XCODE_ATTRIBUTE_INSTALL_PATH @executable_path/../Frameworks/  )
>> >> > ENDIF (APPLE)
>> >> >
>> >> > The second "set_target_properties" line configures the framework to
>> >> > always be looked for in the application bundle in the Frameworks
>> >> > sub-folder.
>> >> >
>> >> > 2) In my top-level CMakeLists.txt file, I add setup a unified binary
>> >> > output directory (thanks Mike!):
>> >> >
>> >> > SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Bin)
>> >> > SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Bin )
>> >> > SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Bin )
>> >> >
>> >> > 3) Then, in my applications' CMakeLists.txt file, I have the
>> >> > following:
>> >> >
>> >> > IF (APPLE)
>> >> >        ADD_CUSTOM_COMMAND(
>> >> >                TARGET MyApp
>> >> >                POST_BUILD
>> >> >                COMMAND ${PYTHON_EXECUTABLE}
>> >> >                ARGS ${CMAKE_HOME_DIRECTORY}/CopyFramework.py
>> >> >                --binary ${PROJECT_BINARY_DIR}/Bin
>> >> >                --framework MyFramework.framework
>> >> >                --app MyApp.app
>> >> >
>> >> >     )
>> >> > ENDIF (APPLE)
>> >> >
>> >> > This calls out to my python script, which does the work of assembling
>> >> > the src and dest paths, and actually copying the Framework.
>> >> >
>> >> > The final trick is that since this is a Mac only thing, I can rely on
>> >> > an Xcode environment variable within the Python script:
>> >> >                config= os.environ["CONFIGURATION"]
>> >> >
>> >> > This allows me to assemble the complete path to the actual binary
>> >> > locations of the framework and the app.
>> >> >
>> >> > The one thing I wish was that there was a CMake variable that would
>> >> > expand to the current Config within the context of the
>> >> > ADD_CUSTOM_COMMAND... It'd be nice to not have to resort to using the
>> >> > Xcode environment variable.
>> >> >
>> >> > Thanks again
>> >> > Glenn
>> >>
>> >> Looks like you generally have a handle on things. The subtle thing
>> >> about the Xcode Environment variables is that your CMake Code is run
>> >> at "Cmake Time" which will have no idea about the Xcode variables that
>> >> are set during a "Build Time". Chicken-and-Egg sort of thing. In the
>> >> recent HDF5 Version 1.8 CMake Port/Fork I have the following code that
>> >> runs an executable as soon as it is compiled:
>> >>
>> >> SET (CFG_INIT "/${CMAKE_CFG_INTDIR}")
>> >
>> > Don't you mean "/\${CMAKE_CFG_INTDIR}", so the proper variable
>> > substitution happens later?
>> > If so, is that why you have an IF(XCODE) section?
>> >
>> > Clint
>>
>> Well I tried that and either CMake or Xcode just didn't really know
>> what to do with it.
>>
>> CMake turns the add_custom_command into a shell script. The
>> "CONFIGURATION" is an environment variable that is set by Xcode during
>> the execution of the shell script so during the actual execution the
>> proper value gets substituted and everything works. If there is a
>> better way, I am all ears..
>
> This works for me in XCode/Visual Studio/Makefiles/etc...:
>
> ADD_CUSTOM_COMMAND(
>  OUTPUT ${foo_BINARY_DIR}/allwords.h
>  COMMAND ${foo_BINARY_DIR}/CMake/${CMAKE_CFG_INTDIR}/wordlist
>  ARGS allwords.h ${COMMAND_TABLES}
>  DEPENDS ${COMMAND_TABLES}
>        ${foo_BINARY_DIR}/CMake/${CMAKE_CFG_INTDIR}/wordlist
>       )
>
> Clint
>
>


More information about the CMake mailing list