[CMake] Tag Variable <OBJECTS>

Michael Wild themiwi at gmail.com
Thu Apr 22 02:56:19 EDT 2010


On 22. Apr, 2010, at 7:52 , Matthias Goesswein wrote:

> Am 21.04.2010 18:56, schrieb Alexander Neundorf:
>> On Wednesday 21 April 2010, Matthias Goesswein wrote:
>>> Hello!
>>> 
>>> My libarian-tool needs a flag before each object file:
>>> 
>>> e.g.
>>> 
>>> libarian -a file1.o -a file2.o -a file3.o library.a
>>> 
>>> CMake provides the<OBJECTS>  tag variable for use within the rule
>>> variable of the libarian, but i didn't fond a way to insert the "-a"
>>> flags before each object file.
>>> 
>>> Is there any way for doing that?
>> 
>> AFAIK no.
>> Please put it as feature request in the bug tracker.
>> What kind of toolchain are you using ?
>> 
>> Alex
> 
> I'd like to use the Softune toolchain (for Fujitsu Microcontrollers), and the librarian can only add object files to an library with the "-a" command line option. All object files must have that flag. It could be done with wrapper shell scripts, but shells are platform specific and so it's for me a no go. It's no problem if you use only one build plattform, but if not so, you would have to write several shell scripts, or add the shell executable for each build plattform.
> 
> I've already put it in as a feature request yesterday (http://public.kitware.com/Bug/view.php?id=10588)
> 
> I also want to use Keil Compiler with CMake, but i would also need wrapper scripts for the compiler, librarian and linker, because of the non standard way of command line options. (It uses brackets, something like: cc -o{obj1.o,obj2.o,...})
> 
> It would be nice to have the latter approach of my feature request (with regular expressions), because it would be highly customizable. Someone could even change slashes to backslashes, which could be handy if a windows tool is used within cygwin or msys, which requires backslashes (slashes are standard on cygwin or msys).
> 
> Matthias.

You don't have to use shell wrapper scripts. CMake is a portable (rather quirky) scripting language ;-) I often do something like this:

add_custom_command(OUTPUT something
  COMMAND "${CMAKE_COMMAND}" -DSOME=VALUE -P "${CMAKE_CURRENT_BINARY_DIR}/some_configured_script.cmake"
  DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/some_configured_script.cmake"
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Doing something incredibly smart"
  VERBATIM
  )


You can also modify CMAKE_<LANG>_CREATE_STATIC_LIBRARY to suit your needs, perhaps something like this:

set(CMAKE_C_CREATE_STATIC_LIBRARY
  "${CMAKE_COMMAND} -DOBJECTS=\"<OBJECTS>\" -DLIBRARY=\"<TARGET>\" -P ${CMAKE_BINARY_DIR}/create_archive.cmake")


where create_archive.cmake is configured to contain the full path to the librarian tool (using @ONLY) and perhaps with other things. E.g. create_archive.cmake.in might contain (untested):

set(ARGS)
foreach(o IN LISTS OBJECTS)
  set(ARGS "${ARGS} -a ${o}")
endforeach()
set(ARGS "${ARGS} ${LIBRARY}")

execute_process(
  COMMAND "@LIBRARIAN_EXECUTABLE@" ${ARGS}
  RESULT_VARIABLE RES
  OUTPUT_VARIABLE OUT
  ERROR_VARIABLE OUT)

if(RES)
  message(FATAL_ERROR "@LIBRARIAN_EXECUTABLE@ failed to create archive ${LIBRARY}."
    "The output message was\n"
    "${OUT}")
endif()


HTH

Michael


More information about the CMake mailing list