[CMake] overriding ${PROJECTNAME}_BINARY_DIR before call to project()

Michael Hertling mhertling at online.de
Wed Sep 28 19:12:45 EDT 2011


On 09/28/2011 06:36 PM, Thomas Wolf wrote:
> On 28.09.2011 17:58, Jean-Christophe Fillion-Robin wrote:
>> Hi Thomas,
>>
>> You will find below few points that should help you to address your issues:
>>
>> 1) CTK build system can be build with the option CTK_SUPERBUILD set to
>> OFF, in that case the project will be built as a "regular" cmake project.
>>
>> 2) You could also build CTK normally (default option) providing VTK_DIR,
>> Log4Qt_DIR etc ... the CTK build system will understand these
>> dependencies are available and no project will be downloaded. This is
>> somehow equivalent to build CTK with CTK_SUPERBUILB OFF
>>
>> 3) If you want to make sure all binaries and libs are built in a custom
>> location, make sure you set:
>>
>> CTK_CMAKE_ARCHIVE_OUTPUT_DIRECTORY
>> CTK_CMAKE_LIBRARY_OUTPUT_DIRECTORY
>>
>>
>> CTK_CMAKE_RUNTIME_OUTPUT_DIRECTORY
>>
>> Seehttps://github.com/commontk/CTK/blob/master/CMakeLists.txt#L91
>>
>> Would be great if you could send request regarding CTK to
>> ctk-developers at commontk.org <mailto:ctk-developers at commontk.org>
>> More info here: http://www.commontk.org and
>> http://www.commontk.org/index.php/Getting_Started
>>
>> Thanks
>> Jc
>>
> 
> Hello Jean-Christophe,
> 
> thanks for your reply. Actually, i took CTK just as an example for the 
> problem, but i will also try what you suggested.
> 
> CTK_SUPERBUILD is already off.
> 
> Anyway I wonder why ${PROJ}_BINARY_DIR is not settable for me.

You *can* set a subproject's binary directory by using the binary_dir
parameter of ADD_SUBDIRECTORY(); see the following exemplary project:

# CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(BINDIR C)
SET(CMAKE_VERBOSE_MAKEFILE ON)
ADD_SUBDIRECTORY(subdir1 ${CMAKE_BINARY_DIR}/bindir)
ADD_SUBDIRECTORY(subdir2)

# subdir1/CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(SUBDIR1 C)
SET(CMAKE_VERBOSE_MAKEFILE ON)
FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/f1.c "void f1(void){}\n")
ADD_LIBRARY(f1 SHARED f1.c)
MESSAGE("${PROJECT_NAME}_BINARY_DIR: ${${PROJECT_NAME}_BINARY_DIR}")

# subdir2/CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(SUBDIR2 C)
SET(CMAKE_VERBOSE_MAKEFILE ON)
FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/f2.c "void f2(void){}\n")
ADD_LIBRARY(f2 SHARED f2.c)
MESSAGE("${PROJECT_NAME}_BINARY_DIR: ${${PROJECT_NAME}_BINARY_DIR}")

As you can see during the configuration, the subproject in subdir1 will
be built in ${CMAKE_BINARY_DIR}/bindir while the essentially identical
subproject in subdir2 will be built in ${CMAKE_BINARY_DIR}/subdir2 as
usual. However, CMake doesn't allow two or more subprojects to share
a common build directory, i.e. you can't say

ADD_SUBDIRECTORY(subdir2 ${CMAKE_BINARY_DIR}/bindir)

too, and with regard to CMakeFiles, Makefile, cmake_install.cmake
etc., this would be anyway a recipe for desaster. Thus, each of your
subprojects must be provided with an individual build directory, and
to collect your targets' binaries in the top-level CMAKE_BINARY_DIR,
you may use the diverse *_OUTPUT_DIRECTORY[_<CONFIG>] properties and
the corresponding CMAKE_*_OUTPUT_DIRECTORY variables. Alternatively,
you might add a custom target in the top-level CMakeLists.txt file:

ADD_CUSTOM_TARGET(binaries ALL
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:f1>
                                     ${CMAKE_BINARY_DIR}
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:f2>
                                     ${CMAKE_BINARY_DIR}
    COMMENT "Copying binaries to ${CMAKE_BINARY_DIR}"
)
ADD_DEPENDENCIES(binaries f1 f2)

'hope that helps.

Regards,

Michael

> Regards,
> Thomas
> 
> PS.: i posted also something on ctk-developers, but the posting didn't 
> appear.


More information about the CMake mailing list