[CMake] Makefiles and clean target

Pau Garcia i Quiles pgquiles at elpauer.org
Mon Apr 28 09:25:45 EDT 2008


Quoting Stephen Quinney <squinney at inf.ed.ac.uk>:

> I realise that cmake encourages out-of-source builds but occasionally
> I need to do some builds in the source tree. I have a project where I
> want to make use of "make clean" to tidy up afterwards but I am having
> problems. I get:
>
> [kingsbarns]squinney: make clean
> make[1]: *** No rule to make target `clean'.  Stop.
> make: *** [clean] Error 2
>
> there is a clean target in the generated Makefile:
>
> # The main clean target
> clean:
> 	$(MAKE) -f CMakeFiles/Makefile2 clean
> .PHONY : clean
>
> but there isn't a corresponding clean target in the
> CMakeFiles/Makefile2 file. I presume I am missing something obvious
> here. For what it's worth this is with version 2.6.0 RC8 but I had the
> same problem with the latest 2.4 release.

This might help, although I discourage its use

#
#
# Adds a file or directory to the FILES_TO_DELETE var so that it is removed
# when "make distclean" is run
#
# Prototype:
#    ADD_TO_DISTCLEAN(file)
# Parameters:
#    file    A file or dir
#

MACRO(ADD_TO_DISTCLEAN TARGET_TO_DELETE)
     SET( FILES_TO_DELETE ${FILES_TO_DELETE} ${TARGET_TO_DELETE} )
ENDMACRO(ADD_TO_DISTCLEAN)

#
# Create a "make distclean" target
#
# Prototype:
#    GENERATE_DISTCLEAN_TARGET()
# Parameters:
#    (none)
#

MACRO(GENERATE_DISTCLEAN_TARGET)
     IF( EXISTS ${PROJECT_BINARY_DIR}/distclean_manifest.txt )
	FILE( REMOVE ${PROJECT_BINARY_DIR}/distclean_manifest.txt )
     ENDIF( EXISTS ${PROJECT_BINARY_DIR}/distclean_manifest.txt )

     IF(MSVC)
	SET( FILES_TO_DELETE ${FILES_TO_DELETE} ${PROJECT_BINARY_DIR}/*.dir )
	ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/*.vcproj )
	ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/*.vcproj.cmake )
	ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.sln )
     ENDIF(MSVC)
     ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/distclean.dir )
     ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/CMakeCache.txt )
     ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/install_manifest.txt )
     ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/CPackConfig.cmake )
     ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/CPackSourceConfig.cmake )
     ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/_CPack_Packages )
     ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/PACKAGE.dir )
     ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/cmake_install.cmake )

# This code does not work yet. I don't know why CPACK_GENERATOR is null.
     IF(CPACK_GENERATOR)
         FOREACH(gen ${CPACK_GENERATOR})
             MESSAGE("Adding file  
${PROJECT_BINARY_DIR}/${CPACK_SOURCE_PACKAGE_FILE_NAME}.${gen} to  
distclean")
             ADD_TO_DISTCLEAN(  
${PROJECT_BINARY_DIR}/${CPACK_SOURCE_PACKAGE_FILE_NAME}.${gen} )
         ENDFOREACH(gen)
     ELSE(CPACK_GENERATOR)
	MESSAGE("CPACK_GENERATOR was not defined (value: ${CPACK_GENERATOR})")
     ENDIF(CPACK_GENERATOR)



     IF(EXECUTABLE_OUTPUT_PATH)
         ADD_TO_DISTCLEAN( ${EXECUTABLE_OUTPUT_PATH} )
     ENDIF(EXECUTABLE_OUTPUT_PATH)
     IF(LIBRARY_OUTPUT_PATH)
         ADD_TO_DISTCLEAN( ${LIBRARY_OUTPUT_PATH} )
     ENDIF(LIBRARY_OUTPUT_PATH)
     ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY} )
     ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/Makefile )
     ADD_TO_DISTCLEAN( ${PROJECT_BINARY_DIR}/distclean_manifest.txt )

FOREACH(f ${FILES_TO_DELETE})
     FILE(TO_NATIVE_PATH ${f} ff)
     FILE(APPEND ${PROJECT_BINARY_DIR}/distclean_manifest.txt ${ff})
     FILE(APPEND ${PROJECT_BINARY_DIR}/distclean_manifest.txt "\n")
ENDFOREACH(f)

IF(WIN32)
  FILE( TO_NATIVE_PATH ${PROJECT_BINARY_DIR} PROJECT_BINARY_DIR_WIN32 )
  ADD_CUSTOM_TARGET(distclean
	FOR /F \"tokens=1* delims= \" %%f IN  
\(${PROJECT_BINARY_DIR_WIN32}\\distclean_manifest.txt\) DO \(
		 IF EXIST %%f\\nul \(
			rd /q /s %%f
		\) ELSE \(
		    IF EXIST %%f \(
			del /q /f %%f
		    \) ELSE \(
			echo Warning: Problem when removing %%f. - Probable causes: File  
already removed or not enough permissions
		    \)
		\)
	\)
  )
ELSE(WIN32)
     # Unix
     ADD_CUSTOM_TARGET(distclean cat  
"${PROJECT_BINARY_DIR}/distclean_manifest.txt" | while read f \; do if  
[ -e \"\$\${f}\" ]; then rm -rf \"\$\${f}\" \; else echo \"Warning:  
Problem when removing \"\$\${f}\" - Probable causes: File already  
removed or not enough permissions\" \; fi\; done COMMENT Cleaning all  
generated files... )
ENDIF(WIN32)
ENDMACRO(GENERATE_DISTCLEAN_TARGET)




-- 
Pau Garcia i Quiles
http://www.elpauer.org
(Due to my workload, I may need 10 days to answer)



More information about the CMake mailing list