On 19. Mar, 2010, at 16:27 , Verweij, Arjen wrote:

> Hi,
> 
> This is a bit length, sorry.
> 
>> -----Original Message-----
>> From: Michael Wild [mailto:them...@gmail.com]
> 
> 
>>> What am I missing? I'm trying again with my simple a/liba.c and
>> b/b/libb.c setup, but this time I start out with liba.cr and libb.cr
>> that need to be converted to liba.c and libb.c.
>>> 
>>> function(add_sources target)
>>> # define the <target>_SRCS properties if necessary
>>> get_property(prop_defined GLOBAL PROPERTY ${target}_SRCS DEFINED)
>>> if(NOT prop_defined)
>>>   define_property(GLOBAL PROPERTY ${target}_SRCS
>>>     BRIEF_DOCS "Sources for the ${target} target"
>>>     FULL_DOCS "List of source files for the ${target} target")
>>> endif()
>>> # create list of sources (absolute paths)
>>> set(SRCS)
>>> foreach(src IN LISTS ARGN)
>> 
>> I know I used this syntax, but it is relatively new. Please check that
>> it is supported by the CMake version you use...
> 
> I'm using cmake 2.8.0 on linux. But eventually it should run on a variety of 
> platforms, including windows, altix, ibm and hpux itanium2.
> 
>>>   string (REGEX REPLACE "^(.+)\\.cr$" "\\1" BASECR ${src} )
>>>   string (COMPARE EQUAL ${src} ${BASECR}.cr FILE_IS_C)
>> 
>> You're removing .cr from the file and then add it back again and compare
>> it with the original name? that should always be TRUE, right?
> 
> Yes. But only if the file in ${src} is of the extension .cr. It is a crude 
> way of setting up an identifier for a filetype, then matching if that 
> filetype is set and do a custom command based on that, e.g.:
> 
>    foreach (FILE ${FILE_LIST})
>    string (REGEX REPLACE "^(.+)\\.fr$" "\\1" BASEFR ${FILE})
>    string (REGEX REPLACE "^(.+)\\.f90r$" "\\1" BASEF90R ${FILE})
>    string (REGEX REPLACE "^(.+)\\.cr$" "\\1" BASECR ${FILE})
>    string (REGEX REPLACE "^(.+)\\.cppr$" "\\1" BASECPPR ${FILE})
>    string (REGEX REPLACE "^(.+)\\.hr$" "\\1" BASEHR ${FILE})
>    string (COMPARE EQUAL ${FILE} ${BASEFR}.fr FILE_IS_FORTRAN)
>    string (COMPARE EQUAL ${FILE} ${BASEF90R}.f90r FILE_IS_FORTRAN90)
>    string (COMPARE EQUAL ${FILE} ${BASECR}.cr FILE_IS_C)
>    string (COMPARE EQUAL ${FILE} ${BASECPPR}.cppr FILE_IS_CPP)
>    string (COMPARE EQUAL ${FILE} ${BASEHR}.hr FILE_IS_HEADER)
>    if ($FILE_IS_...)
>      add_custom_command( ... )
>      # append to file list
>      # some macro
>    Elseif ( ... )
> ...
>    Else ( ... )
>    #foreach

Probably simpler:

# don't use FILE, that is a command...
foreach(fname ${FILE_LIST})
  foreach(type f f90 c cpp h) 
    if(fname MATCHES "^(.+)\\.${type}r$")
      string(REGEX REPLACE "r$" "" fbase "${fname}")
      if(type STREQUAL f)
        add_custom_command(...)
        # apend to file list
        # some macro
      elseif(type STREQUAL f90)
        add_custom_command(...)
         # ...
      # ...
      endif()
      break()
    endif()
  endforeach()
endforeach()
    
> [...]
> 
>> You have to call ADD_SOURCES for all your sources BEFORE you do the
>> ADD_LIBRARY call.
> 
> I am already doing this, but since the files I was adding to the library 
> didn't exist, the call failed. I somehow expected cmake to start executing 
> the custom command since there was a previously defined dependency, but 
> apparently cmake wasn't set up for the way I'm mistreating it :)
> 
> What triggers a custom command to be executed? With your help I have arrived 
> at:


You should add a "DEPENDS <input_file1> <input_file2> ..." option to your 
ADD_CUSTOM_COMMAND calls, then CMake will know when to invoke it, otherwise it 
can't know anything about the dependency.

> 
> project(superDuper Fortran)
> enable_language( C )
> cmake_minimum_required(VERSION 2.8)
> #- Add sources for a target
> #
> #  ADD_SOURCES(<target> <source1> [<source2> ...])
> #
> function(add_sources target)
>  # define the <target>_SRCS properties if necessary
>  get_property(prop_defined GLOBAL PROPERTY ${target}_SRCS DEFINED)
>  if(NOT prop_defined)
>    define_property(GLOBAL PROPERTY ${target}_SRCS
>      BRIEF_DOCS "Sources for the ${target} target"
>      FULL_DOCS "List of source files for the ${target} target")
>  endif()
>  # create list of sources (absolute paths)
>  set(SRCS)
>  foreach(src IN LISTS ARGN)
>    string (REGEX REPLACE "^(.+)\\.cr$" "\\1" BASECR ${src} )
>    string (COMPARE EQUAL ${src} ${BASECR}.cr FILE_IS_C)
>    message ( STATUS src=${src} )
>    message ( STATUS basecr=${BASECR} )
>    if(NOT IS_ABSOLUTE "${src}")
>      get_filename_component(src "${src}" ABSOLUTE)
>    endif()
>    get_filename_component(path_to_src "${src}" PATH)    file(RELATIVE_PATH 
> rel_path_to_src "${CMAKE_CURRENT_SOURCE_DIR}" "${path_to_src}")
>    set(out_file "${CMAKE_CURRENT_BINARY_DIR}/${rel_path_to_src}/${BASECR}.c")
>    add_custom_command(
>      OUTPUT "${out_file}"
>      COMMAND ${CMAKE_COMMAND} -E copy "${src}" "${out_file}"
>      message ( STATUS src="${src}" )
>      message ( STATUS out_file="${out_file}" )
>      WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
>      COMMENT "Creating ${out_file}"
>      VERBATIM
>      )
>    list(APPEND SRCS "${out_file}")
>  endforeach()  set_property(GLOBAL APPEND PROPERTY "${target}_SRCS" "${SRCS}")
> endfunction()
> 
> # descend into sub-directories
> add_subdirectory(a)
> add_subdirectory(b)
> 
> get_property(super_SRCS GLOBAL PROPERTY super_SRCS)
> message ( STATUS srcs=${super_SRCS})
> add_library(super STATIC ${super_SRCS})
> 
> 
> The output is:
> 
> sx085_260: cmake ../
> -- src=liba.cr
> -- basecr=liba
> -- src=libb.cr
> -- basecr=libb
> -- 
> srcs=/mnt/usr3/people/verweija/cmake/build/a//liba.c/mnt/usr3/people/verweija/cmake/build/b/b//libb.c
> -- Configuring done
> CMake Error in CMakeLists.txt:
>  Cannot find source file "liba.c".  Tried extensions .c .C .c++ .cc .cpp
>  .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx
> 
> 
> -- Build files have been written to: /mnt/usr3/people/verweija/cmake/build
> 
> So, the messages inside the custom command don't surface which leads me to 
> believe that section is not executed at all. I am starting to worry after 
> rereading the relevant section in the 4th edition of the book, custom 
> commands just add extra lines to the resulting Makefile, but don't get 
> executed while generating them :|
> 
> Regards,
> Arjen

As said above, the missing DEPENDS option is the problem.

HTH

Michael

_______________________________________________
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