Re: [CMake] add_executable and extension of source file

2012-02-27 Thread Kris Thielemans
Thanks Michael

The behaviour I was asking about is resolved. At some point in my
CMakeFiles.txt, it didn't work for my user on MacOSX, but apparently it does
work now, so I (or he) must have had another mistake in the files earlier
on. But you have made some helpful suggestions, so my comments are below

 -Original Message-
 From: cmake-boun...@cmake.org [mailto:cmake-boun...@cmake.org] On
 Behalf Of Michael Hertling
 Sent: 24 February 2012 22:15
 To: cmake@cmake.org
 Subject: Re: [CMake] add_executable and extension of source file
 
 On 02/24/2012 06:16 PM, Kris Thielemans wrote:
  Hi
 
  I have a project where I have C++ and C source files. I'm adding
 executables
  for this (via macros) like this
 
  foreach(executable ${SOURCES})
 add_executable(${executable} ${executable} )
 target_link_libraries(${executable} ${STIR_LIBRARIES})
  endforeach()
 
  where ${SOURCES} is a list of sources WITHOUT extension, e.g.
 
  set( SOURCES abs_image  src2)
 
  This relies on the fact that cmake should find .cxx and .c etc source
files
  for add_executable. At least, I think it should (I found this some
tutorial,
  e.g.
  http://www-
 flc.desy.de/ldcoptimization/documents/talks/CMake_Tutorial.pdf),
  but the doc for add_executable does not seem to mention this behaviour.
 
  My current CMake files work fine on Windows and Linux, but I now have a
  MacOSX user who says that it fails. He's running cmake 2.8.7 and when I
  inspect that linking command, it looks like (slightly edited for
brevity)
 
  /usr/bin/c++   -O3 -DNDEBUG -ffast-math -Wl,-search_paths_first
  -Wl,-headerpad_max_install_names
   -o abs_image  a ../buildblock/libbuildblock.a
 
  That is, clearly the abs_image.o file is missing on this command line.
 
  Maybe this adding a list of known extensions feature is no longer
  supported? Or is the list of known extensions platform specific? (that
 would
  be bad)
 
 The gcc manpage states:
 
 cite
 For any given input file, the file name suffix determines what kind of
 compilation is done:
 
 file.c
 C source code which must be preprocessed.
 ...
 other
 An object file to be fed straight into linking.  Any file name with
 no recognized suffix is treated this way.
 ...
 -c  Compile or assemble the source files, but do not link. [...]
 
 Unrecognized input files, not requiring compilation or assembly,
 are ignored.
 /cite
 
 Thus, AFAICS, CMake handles the extension-less sources correctly, but
 gcc freaks out: No extension -- ignore when compiling -- no object
 file. IMO, it's a quite bad idea to provide source files without a
 proper suffix. However, see gcc's -x switch.
 

Seems that I didn't explain myself properly. My files do have an extension,
and I want this to be passed on to the compiler. It seems that CMake
actually does this for add_executable (i.e. you can do add_executable
my_file my_file and it will check if there's a my_file.c etc). (As I
mentioned above, this does after all seem to work on MacOSX as well). 

However, as it isn't documented clearly, and not entirely safe anyway, I
think I'll replace it with your suggestion below.


  I guess I will have to set my SOURCE files with the extension, and then
  strip the extension for the executable-name. maybe with something like
 
  foreach(src ${SOURCES})
STRING(REPLACE \(.*\)\..* \1 executable ${src})
   add_executable(${executable} ${src} )
   ...
  endforeach()
 
 SET(SOURCES abs_image.cxx src2.c)
 ...
 FOREACH(i IN LISTS SOURCES)
 GET_FILENAME_COMPONENT(j ${i} NAME_WE)
 ADD_EXECUTABLE(${j} ${i})
 ENDFOREACH()
 

This sounds good to me! Thanks

  or alternatively find the source file
 
  foreach(executable ${SOURCES})
 FILE(GLOB src *.cxx *.c)
add_executable(${executable} ${src} )
 target_link_libraries(${executable} ${STIR_LIBRARIES})
  endforeach()
 
 Do not use FILE(GLOB ...) in a CMakeLists.txt since this makes the
 latter unaware of additions/removals/renamings among your sources.
 You will most certainly miss a necessary reconfiguration one day.
 

Agreed. I suppose if I don't add the extension, something like the above is
effectively what cmake is doing. But passing extensions to specify the
complete filename seems a better way of doing things.

Thanks again!

Kris


--

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


Re: [CMake] add_executable and extension of source file

2012-02-24 Thread Michael Hertling
On 02/24/2012 06:16 PM, Kris Thielemans wrote:
 Hi
 
 I have a project where I have C++ and C source files. I'm adding executables
 for this (via macros) like this
 
 foreach(executable ${SOURCES})
add_executable(${executable} ${executable} )
target_link_libraries(${executable} ${STIR_LIBRARIES})
 endforeach()
 
 where ${SOURCES} is a list of sources WITHOUT extension, e.g.
 
   set( SOURCES abs_image  src2)  
 
 This relies on the fact that cmake should find .cxx and .c etc source files
 for add_executable. At least, I think it should (I found this some tutorial,
 e.g.
 http://www-flc.desy.de/ldcoptimization/documents/talks/CMake_Tutorial.pdf),
 but the doc for add_executable does not seem to mention this behaviour. 
 
 My current CMake files work fine on Windows and Linux, but I now have a
 MacOSX user who says that it fails. He's running cmake 2.8.7 and when I
 inspect that linking command, it looks like (slightly edited for brevity)
 
   /usr/bin/c++   -O3 -DNDEBUG -ffast-math -Wl,-search_paths_first
 -Wl,-headerpad_max_install_names   
  -o abs_image  a ../buildblock/libbuildblock.a
 
 That is, clearly the abs_image.o file is missing on this command line.
 
 Maybe this adding a list of known extensions feature is no longer
 supported? Or is the list of known extensions platform specific? (that would
 be bad)

The gcc manpage states:

cite
For any given input file, the file name suffix determines what kind of
compilation is done:

file.c
C source code which must be preprocessed.
...
other
An object file to be fed straight into linking.  Any file name with
no recognized suffix is treated this way.
...
-c  Compile or assemble the source files, but do not link. [...]

Unrecognized input files, not requiring compilation or assembly,
are ignored.
/cite

Thus, AFAICS, CMake handles the extension-less sources correctly, but
gcc freaks out: No extension -- ignore when compiling -- no object
file. IMO, it's a quite bad idea to provide source files without a
proper suffix. However, see gcc's -x switch.

 I guess I will have to set my SOURCE files with the extension, and then
 strip the extension for the executable-name. maybe with something like
 
 foreach(src ${SOURCES})
   STRING(REPLACE \(.*\)\..* \1 executable ${src})
  add_executable(${executable} ${src} )
  ...
 endforeach()

SET(SOURCES abs_image.cxx src2.c)
...
FOREACH(i IN LISTS SOURCES)
GET_FILENAME_COMPONENT(j ${i} NAME_WE)
ADD_EXECUTABLE(${j} ${i})
ENDFOREACH()

 or alternatively find the source file
 
 foreach(executable ${SOURCES})
FILE(GLOB src *.cxx *.c)
   add_executable(${executable} ${src} )
target_link_libraries(${executable} ${STIR_LIBRARIES})
 endforeach()

Do not use FILE(GLOB ...) in a CMakeLists.txt since this makes the
latter unaware of additions/removals/renamings among your sources.
You will most certainly miss a necessary reconfiguration one day.

Regards,

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