[CMake] RC compiler on Linux - new problem

Michael Hertling mhertling at online.de
Thu Oct 27 18:13:52 EDT 2011


On 10/25/2011 10:16 AM, pellegrini wrote:
> Hi Michael,
> 
> I tried to adapt the files you gave me to my project. It almost works. 
> As a reminder, there were a CMakeLists.txt with an overloaded 
> add_executable function that created a sym_link for the rc files and a 
> shell  file (rc.sh) used to suit the rc compiler call to my needs.
> 
> I found one problem that I still not have solved. The shell script is 
> declared under the following command:
> 
> set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "bash rc.sh 
> <CMAKE_RC_COMPILER> <SOURCE> <OBJECT>")
> 
> However, this command makes that even my f90 files uses the rc compiler 
> which obvioulsy makes my build crash. I tried to use something like 
> set_property(SOURCE myrcfile.rc PROPERTY RULE_LAUNCH_COMPILE ... in 
> order to apply the patch only when a rc file is under process but 
> unfortunately this property is not a valid source properties.
> 
> Would you see any way to circumvent that problem ?
> 
> thanks
> 
> Eric

The rc.sh script is designed to differentiate between an RC invocation
and something else; this is why it is called with the RC as the first
argument. If the first argument of the actual command line is equal
to <CMAKE_RC_COMPILER>, the command line is modified to adapt to the
winteracter RC; otherwise, it is executed without modification. Watch
out for the lines starting with "Executing ..." in the output of Make.
If it still does not work, could you provide a small self-contained
example which demonstrates the issue for further investigation?

However, I reconsidered your concern in the meantime. Possibly, it's a
more appropriate approach to use a wrapper script for the winteracter
RC to adapt the latter to CMake's expectations. This script should:

- accept parameters according to Modules/CMakeRCInformation.cmake,
- link or copy the source file to a temporary directory the
  winteracter RC can write its output file to thereafter,
- move the output file where it's expected by CMake.

This wrapper can be enabled when WINTERACTER_RC_COMPILER is set at
the initial configuration of the project, so you don't need to re-
implement ADD_EXECUTABLE() et al. - which works only once anyway -
or to rely on the Makefile-specific RULE_LAUNCH_COMPILE property,
and the RC files still don't need to be handled specially, which
has been the idea of ADD_EXECUTABLE()'s reimplementation. However,
the downside is that you can not use CMake anymore to detect the
winteracter RC automatically; you must do it by yourself before
the PROJECT() or ENABLE_LANGUGAE() command, e.g.

IF(WINTERACTER_RC_COMPILER)
  CONFIGURE_FILE(rc.sh.in rc.sh @ONLY)
  SET(CMAKE_RC_COMPILER ${CMAKE_BINARY_DIR}/rc.sh
      CACHE STRING "RC compiler" FORCE)
ENDIF()
PROJECT(... RC)

with a template rc.sh.in for the wrapper script rc.sh, containing
@WINTERACTER_RC_COMPILER@ somewhere. In this way, anything should
work as usual if WINTERACTER_RC_COMPILER is not set at the initial
configuration of the project, but if it is set, the wrapper script
is configured and forced to be used as the RC, and the subsequent
PROJECT() or ENABLE_LANGUGAE() command won't search for an RC by
themselves.

'hope that helps.

Regards,

Michael

> pellegrini a écrit :
>> thanks a lot Michael.
>>
>> Finally, this was not such a trivial problem but I should find my way 
>> with the examples you gave me.
>>
>> Eric
>>
>> Michael Hertling a écrit :
>>> On 10/21/2011 06:49 PM, pellegrini wrote:
>>>  
>>>> Hi all,
>>>>
>>>> after digging and googling some hours I did a first step in the 
>>>> right direction.
>>>>
>>>> I had to add the command:
>>>>
>>>> enable_language(rc)
>>>> set(cmake_rc_compiler_arg1 -cif8)
>>>>
>>>> The resource compiler I (must) use is the one provided by 
>>>> winteracter Fortran library.
>>>>
>>>> This led me to a serie of problems related to the use of this compiler:
>>>>     - it does not accept any output flag so that the output resource 
>>>> object is always created "in-source" in the rc file directory.
>>>>     - on Linux, it produces a .o object file instead of a .res file
>>>>
>>>> Looking at the CMakeRCInformation.cmake I see that by construction 
>>>> CMake will use the following compile command:
>>>> "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> /fo<OBJECT> <SOURCE>"
>>>> with a resource object file with a .res extension.
>>>>     
>>>
>>> You might rewrite this rule variable, e.g. in order to drop
>>> /fo<OBJECT>, but this wouldn't resolve your issues, AFAICS.
>>>
>>>  
>>>> On a Linux machine, this produces a wrong build command line with 
>>>> the path for the output object file being "/foCMakeFiles/...". This 
>>>> problem was raised sometime ago in the mantis bug tracker but 
>>>> unfortunatley the patch proposed apply for mingw using windres but 
>>>> not for Linux.
>>>>
>>>> Is there a fix for this ?
>>>>
>>>> If no, is there a way to inform the linker that:
>>>>     - my resource object file is located "in-source"
>>>>     
>>>
>>> You might create symlinks to the resource files - or copy them - so
>>> that the winteracter RC generates its output files within the build
>>> tree; note that the source tree may be read-only. This could even be
>>> done on the fly with an adapted version of ADD_EXECUTABLE/LIBRARY().
>>>
>>>  
>>>>     - the extension is not .res but .o
>>>>     
>>>
>>> You might use a RULE_LAUNCH_COMPILE property in conjunction with a
>>> shell script which recognizes RC command lines, moves the .o to a
>>> .res in the correct directory and drops the undesired /fo switch.
>>>
>>> The attached CMakeLists.txt and rc.sh files outline these approaches;
>>> check them out with meaningful ${CMAKE_SOURCE_DIR}/{abs,srcdir}.rc
>>> and ${CMAKE_BINARY_DIR}/bindir.rc. However, they are untested as I
>>> currently haven't any RC at hand; moreover, they're restricted to
>>> Makefiles and won't work on Windows.
>>>
>>> Regards,
>>>
>>> Michael
>>>
>>>  
>>>> pellegrini a écrit :
>>>>    
>>>>> Hi all,
>>>>>
>>>>> I use CMake 2.8.5 on Linux and Windows machine to build a Fortran 
>>>>> project.
>>>>>
>>>>> On Windows, no problem, the build and the resulting GUI are OK. On 
>>>>> Linux, the build seems to
>>>>> be OK but the resulting GUI gives an empty screen. Discussing with 
>>>>> Michael a few days ago made
>>>>> me think that it could be related to the use of an inappropriated 
>>>>> motif library.
>>>>>
>>>>> However, looking in more details I see with a make VERBOSE=1 that 
>>>>> my rc file is not built
>>>>> (I do not see the line "Building RC object ..."). even if it is 
>>>>> declared as one of my sources files.
>>>>>
>>>>> Is there some extra commands to specify to make cmake recognize and 
>>>>> compile a rc file ?
>>>>>
>>>>> thanks
>>>>>
>>>>> Eric


More information about the CMake mailing list