[CMake] Ninja fails, Make succeeds...
Mikael Lyngvig
mikael at lyngvig.org
Thu Jun 28 07:50:01 EDT 2012
I need the files to be copied at build time, not a compile time: They are
files I am editing and I need the build system to export the files to the
binary directory tree whenever they are changed.
I know it looks stupid and probably is as well :-) The reason is that when
the project is being used by clients, I want them to include each file as
follows (something which I use myself):
#include "Braceless/Frontend/Scanner.hpp"
And the only way I could figure out to get it working was by naming the
build directory "Braceless" and then do that thing I'm doing. The project
is organized like this:
src/AST
src/Driver
src/Frontend
...
And I want to be able to write "Braceless" in front so that it works also
when the header files and libraries have been installed on a system. In
the LLVM system, they solve this problem by storing the headers in another
location than the source files - something I deeply loathe as it makes it
very difficult to search for strings and even to edit a given source file
and its header at the same time.
I'll try out your comments, but I don't see any way of getting rid of that
../.. construct. By the way, I am a CMake newbie so I just did what I
could do to make it work somehow.
Cheers,
Mikael
2012/6/27 Rolf Eike Beer <eike at sf-mail.de>
> > Sigh, now I sent you the code from the wrong directory, but the code for
> > the "Backend" component is virtually identical. I don't know how to use
> > functions with CMake, so I simply made a verbatim copy of the below code
> > in
> > each subfolder and edited it to match the subfolder. So the Backend
> > project looks like this:
> >
> > project(Backend)
> >
> > set(PublicHeaders
> > "Backend.hpp"
> > "Context.hpp"
> > )
> > set(PublishedHeaders "")
> > foreach(Header IN LISTS PublicHeaders)
> > get_filename_component(HeaderFilename "${Header}" NAME)
> > set(Source "${CMAKE_CURRENT_SOURCE_DIR}/${Header}")
> > set(Output "${CMAKE_CURRENT_BINARY_DIR}/${HeaderFilename}")
> > list(APPEND PublishedHeaders "${Output}")
> > add_custom_command(
> > OUTPUT "${Output}"
> > COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${Source}"
> > "${Output}"
> > MAIN_DEPENDENCY "${Source}"
> > COMMENT "Publishing ${HeaderFilename}"
> > VERBATIM
> > )
>
> Why don't you simply use configure_file(... COPYONLY) here?
>
> > endforeach()
> > add_custom_target(
> > publish_backend_headers
> > ALL
> > DEPENDS ${PublishedHeaders}
> > SOURCES ${PublicHeaders}
> > )
> > include_directories("${CMAKE_BINARY_DIR}/../")
>
> This is almost certainly wrong. Guess my build dir is /tmp/foo, why on
> earth do you want to include /tmp? I could understand if it would be
> ${CMAKE_CURRENT_BINARY_DIR}/.. if you are in a subdirectory, but otherwise
> this is likely completely bogus.
>
> > include_directories("$ENV{LLVM}/include")
> >
> > add_definitions(-D__STDC_CONSTANT_MACROS)
> > add_definitions(-D__STDC_LIMIT_MACROS)
> >
> > add_library(Backend
> > "Backend.cpp"
> > )
> >
> > add_dependencies(Backend publish_backend_headers)
>
> I think you can avoid the whole add_custom_target/add_library by just
> writing
>
> add_library(Backend Backend.cpp ${PublishedHeaders})
>
> (Untested. May only reliably work if you use configure_file. ymmv).
>
> Eike
> --
>
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20120628/64aa581b/attachment.htm>
More information about the CMake
mailing list