[CMake] OBJECT Libraries with Xcode Generator

Gregor Jasny gjasny at googlemail.com
Wed Apr 6 15:47:23 EDT 2016


On 06/04/16 20:32, Matthew Keeler wrote:
>  
> 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.

Thank you for the minimal example. Please file a bug in the bug tracker.

Thanks,
Gregor



More information about the CMake mailing list