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
CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(RC C RC)
SET(CMAKE_VERBOSE_MAKEFILE ON)

FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/rc)

FUNCTION(ADD_EXECUTABLE TARGET)
    UNSET(ARGS)
    FOREACH(i IN LISTS ARGN)
        IF(i MATCHES "\\.rc$")
            IF(IS_ABSOLUTE "${i}")
                GET_FILENAME_COMPONENT(p "${i}" PATH)
                FILE(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/rc${p}")
                EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E create_symlink 
"${i}" "${CMAKE_BINARY_DIR}/rc${i}")
                LIST(APPEND ARGS "${CMAKE_BINARY_DIR}/rc${i}")
            ELSEIF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${i}")
                GET_FILENAME_COMPONENT(p "${CMAKE_CURRENT_SOURCE_DIR}/${i}" 
PATH)
                FILE(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/rc${p}")
                EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E create_symlink 
"${CMAKE_CURRENT_SOURCE_DIR}/${i}" 
"${CMAKE_BINARY_DIR}/rc${CMAKE_CURRENT_SOURCE_DIR}/${i}")
                LIST(APPEND ARGS 
"${CMAKE_BINARY_DIR}/rc${CMAKE_CURRENT_SOURCE_DIR}/${i}")
            ELSE()
                GET_FILENAME_COMPONENT(p "${CMAKE_CURRENT_BINARY_DIR}/${i}" 
PATH)
                FILE(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/rc${p}")
                EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E create_symlink 
"${CMAKE_CURRENT_BINARY_DIR}/${i}" 
"${CMAKE_BINARY_DIR}/rc${CMAKE_CURRENT_BINARY_DIR}/${i}")
                LIST(APPEND ARGS 
"${CMAKE_BINARY_DIR}/rc${CMAKE_CURRENT_BINARY_DIR}/${i}")
            ENDIF()
        ELSE()
            LIST(APPEND ARGS "${i}")
        ENDIF()
    ENDFOREACH()
    _ADD_EXECUTABLE(${TARGET} ${ARGS})
ENDFUNCTION()

SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "bash 
${CMAKE_SOURCE_DIR}/rc.sh <CMAKE_RC_COMPILER> <SOURCE> <OBJECT>")
FILE(WRITE ${CMAKE_BINARY_DIR}/main.c "int main(void){return 0;}\n")
FILE(WRITE ${CMAKE_BINARY_DIR}/bindir.rc "")  # <-- Something meaningful.
ADD_EXECUTABLE(main main.c srcdir.rc bindir.rc "${CMAKE_SOURCE_DIR}/abs.rc")

Attachment: rc.sh
Description: Bourne shell script

--

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to