[CMake] Make project name a target

Marcel Loose loose at astron.nl
Fri Sep 11 19:07:32 EDT 2009


Hi JeDi,

If you look carefully, you will notice that, when you create a project
through a macro (e.g. myproject), CMake will create a dummy project
named "Project" and assume you're using C and C++ as default languages.

Note that I intentionally chose a non-supported language, CPP, in the
example below. Look at the line printing PROJECT_NAME. But you'll notice
a significant difference in output anyway.

Best regards,
Marcel Loose.


CMakeLists.txt with direct call of project() command:
----------------------------------------------------
$ pwd
/home/loose/work/cmake/build

$ cat ../proj/CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
message(STATUS "PROJECT_NAME = ${PROJECT_NAME}")
project(main CPP)

$ cmake -DCMAKE_MODULE_PATH:PATH=$HOME/work/cmake/proj ../proj
-- PROJECT_NAME = 
CMake Error: Error required internal CMake variable not set, cmake may
be not be built correctly.
Missing variable is:
CMAKE_CPP_COMPILER_ENV_VAR
CMake Error: Error required internal CMake variable not set, cmake may
be not be built correctly.
Missing variable is:
CMAKE_CPP_COMPILER
CMake Error: Could not find cmake module
file:/home/loose/work/cmake/build/CMakeFiles/CMakeCPPCompiler.cmake
CMake Error: Could not find cmake module file:CMakeCPPInformation.cmake
CMake Error: CMAKE_CPP_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!


CMakeLists.txt with call of project() through myproject macro:
-------------------------------------------------------------
$ cat CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
message(STATUS "PROJECT_NAME = ${PROJECT_NAME}")
include(myproject)
myproject(main CPP)

$ cmake -DCMAKE_MODULE_PATH:PATH=$HOME/work/cmake/proj ../proj
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- PROJECT_NAME = Project
CMake Error: Error required internal CMake variable not set, cmake may
be not be built correctly.
Missing variable is:
CMAKE_CPP_COMPILER_ENV_VAR
CMake Error: Error required internal CMake variable not set, cmake may
be not be built correctly.
Missing variable is:
CMAKE_CPP_COMPILER
CMake Error: Could not find cmake module
file:/home/loose/work/cmake/build/CMakeFiles/CMakeCPPCompiler.cmake
CMake Error: Could not find cmake module file:CMakeCPPInformation.cmake
CMake Error: CMAKE_CPP_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!

On Fri, 2009-09-11 at 16:34 +0200, Jeroen Dierckx wrote:
> On Fri, Sep 11, 2009 at 4:22 PM, Marcel Loose <loose at astron.nl> wrote:
> > Hi David,
> >
> > I don't see the exact difference between (1) and (2). And yes, I was
> > thinking of using the project name as a target. You are right, that it
> > might cause clashes with existing projects, though :-(
> >
> > We use the convention that project names are always capitalized, so we
> > usually don't run into problems.
> >
> > Is there a nifty trick to wrap the 'project' command? I never succeeded
> > in doing that.
> 
> I did this once inside a macro, and that should work as expected. The
> code of the macro should behave just as if it was copy-pasted to the
> place where you call the macro, so scope and such will be that of the
> place where you call it.
> 
> Greetings,
> JeDi
> 
> 
> >
> > Best regards,
> > Marcel Loose.
> >
> >
> > On Fri, 2009-09-11 at 07:09 -0400, David Cole wrote:
> >> When you say "make the project name a target" what do you mean by
> >> that?
> >>
> >>
> >> (1) internally create a CMake target with the given name?
> >> (2) create a makefile target with that name that builds all the cmake
> >> targets in that cmake project?
> >> (3) something else?
> >>
> >>
> >> (1) is probably not feasible for most folks -- because many people use
> >> the same name for their PROJECT statement and the main library or
> >> executable for that project.... which is already a cmake target (and a
> >> makefile target) with that name.
> >>
> >>
> >>
> >> On Fri, Sep 11, 2009 at 3:51 AM, Marcel Loose <loose at astron.nl> wrote:
> >>         Hi all,
> >>
> >>         I was wondering whether it's a good idea to make the project
> >>         name (i.e.
> >>         the argument to the 'project' command) a target.
> >>
> >>         Rationale: I have a project that consists of numerous
> >>         sub-projects and I
> >>         would like to be able to build some of these separately.
> >>         Wrapping the
> >>         'project' command in a macro is not a solution, because AFAIK
> >>         CMake
> >>         *must* see a 'project' command in the top-level CMakeLists.txt
> >>         file; a
> >>         'myproject' macro, wrapping the 'project' command, will not
> >>         do.
> >>
> >>         Any comments?
> >>
> >>         Best regards,
> >>         Marcel Loose.
> >>
> >>
> >>         _______________________________________________
> >>         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
> >>
> >>
> >
> > _______________________________________________
> > 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
> >



More information about the CMake mailing list