I think I ran into a bug but I am wondering if anyone has seen it an worked 
around.

I have a source structure like the following (this is a contrived small example 
to illustrate the problem):  

- CMakeLists.txt  
- main.c
- lib
   - CMakeLists.txt
   - x.c
   - x.h
   - alt1
      - x.c
      - x.h
   - alt2
      - x.c
      - x.h

CMakeLists.txt:

   cmake_minimum_required(VERSION 3.5)
   project(example)
   add_subdirectory(lib)
   include_directories(lib)
   add_executable(main main.c $<TARGET_OBJECTS:example>)


main.c:

   #include "x.h"
   
   int main()
   {
      return example_func();
   }

lib/CMakeLists.txt:

   option(ALT1 "ALT1" ON)
   option(ALT2 "ALT2" ON)
   set(SOURCES x.c)
   if ( ALT1 )
      add_definitions(-DALT1)
      list(APPEND SOURCES alt1/x.c)
   elseif ( ALT2 )
      add_definitions(-DALT2)
      list(APPEND SOURCES alt2/x.c)
   else ()
       message(FATAL_ERROR "No alt defined")
   endif()
   add_library(example OBJECT ${SOURCES})

lib/x.h:

   #ifndef X_H
   #define X_H
   int example_func();
   #endif

lib/x.c:

#include "x.h"
#ifdef ALT2
#include "alt2/x.h"
#else
#include "alt1/x.h"
#endif
int example_func()
{
        return call_example_func();
}


lib/alt1/x.h:

   #ifndef ALT1_X_H
   #define ALT1_X_H
   int alt1_example_func();
   #define call_example_func() alt1_example_func()
   #endif


lib/alt1/x.c:

   int alt1_example_func()
   {
      return 1;
   }

lib/alt2/x.h:

   #ifndef ALT2_X_H
   #define ALT2_X_H
   int alt2_example_func();
   #define call_example_func() alt2_example_func()
   #endif


lib/alt2/x.c:

   int alt2_example_func()
   {
      return 2;
   }



Now if I run cmake using the makefile generator and then run make, all is well 
and everything is built and runs as expected. If I use the Xcode generator I 
get the following errors:

clang: error: no such file or directory: ‘<path to build 
directory>/lib/example.build/Debug/example.build/Objects-normal/x86_64/x.o’

Within the directory <path to build 
directory>/lib/example.build/Debug/example.build/Objects-normal/x86_64 there is 
in fact no x.o. Instead there are two files, x-8171277E06B93FB2.o and 
x-FA155118579B6D7E.o. So it looks like for the XCode generators sources 
intermediate object files for a single CMakeLists.txt are stored within a 
single directory. And in this case the sources have the same name so the 
x-<id>.o names are used instead. However the $<TARGET_OBJECTS:…> generator 
expression seems to be referencing an incorrect name. Is there any workaround 
so that for the Xcode generator it will not store all the build artifacts in a 
single directory and not use the object file name with the unique id in it and 
secondly where is the proper place to file a bug for this.

--  
Matthew Keeler


-- 

Powered by www.kitware.com

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

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

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

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake

Reply via email to