[cmake-developers] [CMake 0013846]: Custom commands not working when comamnd output used in another directory

Mantis Bug Tracker mantis at public.kitware.com
Fri Jan 11 20:23:37 EST 2013


The following issue has been SUBMITTED. 
====================================================================== 
http://public.kitware.com/Bug/view.php?id=13846 
====================================================================== 
Reported By:                szx
Assigned To:                
====================================================================== 
Project:                    CMake
Issue ID:                   13846
Category:                   (No Category)
Reproducibility:            have not tried
Severity:                   minor
Priority:                   normal
Status:                     new
====================================================================== 
Date Submitted:             2013-01-11 20:23 EST
Last Modified:              2013-01-11 20:23 EST
====================================================================== 
Summary:                    Custom commands not working  when comamnd output
used in another directory
Description: 
At least for the Unix Makefile generator (haven't tried others) custom commands
are not called when their output file is specified as a source file for a target
defined in the parent directory. As soon as I move both add_custom_command() and
the target to the same file, everything works fine.

Steps to Reproduce: 
============ Case 1 =============

1. Create CMakeLists.txt with the following contents

cmake_minimum_required(VERSION 2.8.9)
project(test)

add_subdirectory("src")
set_source_files_properties("src/test.c" PROPERTIES GENERATED TRUE)
add_executable(test "src/test.c")

2. Create a directory called "src" and another CMakeLists.txt in it:

add_custom_command(
	OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/test.c"
	COMMAND echo "int main\\(\\) \\{\\}" > "${CMAKE_CURRENT_SOURCE_DIR}/test.c"
	WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)

3. You will get the following error from make:

test1-build$ make
make[2]: *** No rule to make target `src/test.c', needed by
`CMakeFiles/test.dir/src/test.c.o'.  Stop.
make[1]: *** [CMakeFiles/test.dir/all] Error 2
make: *** [all] Error 2

============ Case 2 =============

1. Create a CMakeLists.txt with the following contents:

cmake_minimum_required(VERSION 2.8.9)
project(test)

file(MAKE_DIRECTORY "src")
add_custom_command(
	OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/test.c"
	COMMAND echo "int main\\(\\) \\{\\}" > "${CMAKE_CURRENT_SOURCE_DIR}/src/test.c"
	WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)
set_source_files_properties("src/test.c" PROPERTIES GENERATED TRUE)
add_executable(test "src/test.c")

2. make will complete without errors:

test2-build$ make
[ 50%] Generating /home/asd/Desktop/fuck-cmake/test2/src/test.c
Scanning dependencies of target test
[100%] Building C object CMakeFiles/test.dir/src/test.c.o
Linking C executable test
[100%] Built target test

====================================================================== 

Issue History 
Date Modified    Username       Field                    Change               
====================================================================== 
2013-01-11 20:23 szx            New Issue                                    
2013-01-11 20:23 szx            File Added: test.zip                         
======================================================================




More information about the cmake-developers mailing list