[cmake-developers] [CMake 0014705]: ExternalProject_Add seems to ingores meaning of INTERNAL when passed in as var in -D <var>:<type>=<value>

Mantis Bug Tracker mantis at public.kitware.com
Fri Jan 17 15:02:43 EST 2014


The following issue has been SUBMITTED. 
====================================================================== 
http://public.kitware.com/Bug/view.php?id=14705 
====================================================================== 
Reported By:                Brian J. Davis
Assigned To:                
====================================================================== 
Project:                    CMake
Issue ID:                   14705
Category:                   CMake
Reproducibility:            always
Severity:                   minor
Priority:                   normal
Status:                     new
====================================================================== 
Date Submitted:             2014-01-17 15:02 EST
Last Modified:              2014-01-17 15:02 EST
====================================================================== 
Summary:                    ExternalProject_Add seems to ingores meaning of 
INTERNAL when passed in as var in -D <var>:<type>=<value>
Description: 

ExternalProject_Add seems to ingores meaning of  INTERNAL when passed in as var
in -D <var>:<type>=<value>

see:
http://www.cmake.org/cmake/help/v2.8.12/cmake.html#opt:-Dvar:typevalue

where type is documented in set as one of:

http://www.cmake.org/cmake/help/v2.8.12/cmake.html#command:set

<type> may be one of

  FILEPATH = File chooser dialog.
  PATH     = Directory chooser dialog.
  STRING   = Arbitrary string.
  BOOL     = Boolean ON/OFF checkbox.
  INTERNAL = No GUI entry (used for persistent variables).

and

If <type> is INTERNAL, the cache variable is marked as internal, and will not be
shown to the user in tools like cmake-gui. This is intended for values that
should be persisted in the cache, but which users should not normally change.
INTERNAL implies FORCE.

I was expecting variable spassed with -DVAR:INTERNAL="value" to be forced in sub
project added by using externalproject_add, but it does not seem to.

Should it?

Is this expected behavior?

Is it a bug?



Steps to Reproduce: 
See attached zip file or:

Create a file with contents in a directory referred to here as TOP

# START
# ${TOP}/CMakeList.txt =======================================================

# check required version of CMake
CMAKE_MINIMUM_REQUIRED(VERSION 2.0)
#IF(CMAKE_BACKWARDS_COMPATIBILITY GREATER 2.0.6)
#  SET(CMAKE_BACKWARDS_COMPATIBILITY 2.0.6 CACHE STRING "Latest version of CMake
when this project was released." FORCE)
#ENDIF(CMAKE_BACKWARDS_COMPATIBILITY GREATER 2.0.6)

if(COMMAND cmake_policy)
  cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)

include( ExternalProject )

SET( TOP ${CMAKE_CURRENT_LIST_DIR} )
set( SOURCE_DIR ${TOP}/some_external_project )


	  set( EXTERNAL_PROJECT_GLOBAL_COMPILER_FLAGS
		-DCMAKE_CXX_FLAGS_INIT:INTERNAL="${CMAKE_CXX_FLAGS_INIT}"
		-DCMAKE_CXX_FLAGS_DEBUG:INTERNAL="${CMAKE_CXX_FLAGS_DEBUG}"
		-DCMAKE_CXX_FLAGS_DEBUG_INIT:INTERNAL="${CMAKE_CXX_FLAGS_DEBUG_INIT}"
		-DCMAKE_C_FLAGS_DEBUG:INTERNAL="${CMAKE_C_FLAGS_DEBUG}"
		-DCMAKE_C_FLAGS_DEBUG_INIT:INTERNAL="${CMAKE_C_FLAGS_DEBUG_INIT}"
		CACHE STRING "" FORCE
		)


set( CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_LIST_DIR}/install CACHE STRING ""
FORCE )
set( INSTALL_PREFIX CACHE STRING "" FORCE )

message( "EXTERNAL_PROJECT_GLOBAL_COMPILER_FLAGS
${EXTERNAL_PROJECT_GLOBAL_COMPILER_FLAGS}" )

add_custom_target( 
	bob 
	ALL
	echo "HELLO WORLD
====================================================================================================="
	)


	  ExternalProject_Add(
	  	some_proj
#	    [DEPENDS projects...] 
#	    PREFIX ${SOURCE_DIR}  
#	    [LIST_SEPARATOR sep]      
#	    [TMP_DIR dir]             
#	    [STAMP_DIR dir]           
	   #--Download step--------------
	   DOWNLOAD_COMMAND ""
#	    GIT_REPOSITORY ${URI}
#	    GIT_TAG ${GIT_TAG}
	   #--Update/Patch step----------
#	    UPDATE_COMMAND ""
#	    PATCH_COMMAND "" 
	   #--Configure step-------------
	    SOURCE_DIR ${SOURCE_DIR} 
#	    CONFIGURE_COMMAND ""
#	    [CMAKE_COMMAND /.../cmake]
#	    CMAKE_GENERATOR ${CMAKE_GENERATOR} 
#	    CMAKE_GENERATOR_TOOLSET ${CMAKE_GENERATOR_TOOLSET}
		CMAKE_ARGS 
	    	-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} 
	       	-DINSTALL_PREFIX=${INSTALL_PREFIX} 
		${EXTERNAL_PROJECT_GLOBAL_COMPILER_FLAGS}
#	    [CMAKE_CACHE_ARGS args...]
	   #--Build step-----------------
#	    BINARY_DIR ${BUILD_DIR}
#        BUILD_COMMAND ""
#	    [BUILD_IN_SOURCE 1]
	   #--Install step---------------
#	    INSTALL_DIR ${INSTALL_PREFIX}
	INSTALL_COMMAND ""
	   #--Test step------------------
#	    [TEST_BEFORE_INSTALL 1]
#	    [TEST_AFTER_INSTALL 1]
#	    [TEST_COMMAND cmd...]
	   #--Output logging-------------
#	    [LOG_DOWNLOAD 1]
#	    [LOG_UPDATE 1]
#	    [LOG_CONFIGURE 1]
#	    [LOG_BUILD 1]
#	    [LOG_TEST 1]
#	    [LOG_INSTALL 1]
	   #--Custom targets-------------
#	    [STEP_TARGETS st1 st2 ...]  
#        STEP_TARGETS bob bob bob bob bob 
	    )
	    
	    
# ${TOP}/CMakeList.txt =======================================================
# END


Also create the Following CMakeLists.txt file in ${TOP}/some_external_project
direcotry

# START
# ${TOP}/some_external_project/CMakeList.txt ===================
# check required version of CMake
CMAKE_MINIMUM_REQUIRED(VERSION 2.0)
#IF(CMAKE_BACKWARDS_COMPATIBILITY GREATER 2.0.6)
#  SET(CMAKE_BACKWARDS_COMPATIBILITY 2.0.6 CACHE STRING "Latest version of CMake
when this project was released." FORCE)
#ENDIF(CMAKE_BACKWARDS_COMPATIBILITY GREATER 2.0.6)

if(COMMAND cmake_policy)
  cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)



    # these settings never change even for C or C++
    SET(CMAKE_C_FLAGS_DEBUG "/MTd /Z7 /Od")
    SET(CMAKE_C_FLAGS_RELEASE "/DNDEBUG /MT /O2")
    SET(CMAKE_C_FLAGS_MINSIZEREL "/DNDEBUG /MT /O2")
    SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/DNDEBUG /MTd /Z7 /Od")
    SET(CMAKE_CXX_FLAGS_DEBUG "/MTd /Z7 /Od")
    SET(CMAKE_CXX_FLAGS_RELEASE "/DNDEBUG /MT /O2")
    SET(CMAKE_CXX_FLAGS_MINSIZEREL "/DNDEBUG /MT /O2")
    SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/DNDEBUG /MTd /Z7 /Od")


message( "CMAKE_CXX_FLAGS_INIT:INTERNAL=${CMAKE_CXX_FLAGS_INIT}" )
message( "CMAKE_CXX_FLAGS_DEBUG:INTERNAL=${CMAKE_CXX_FLAGS_DEBUG" )
message( "CMAKE_CXX_FLAGS_DEBUG_INIT:INTERNAL=${CMAKE_CXX_FLAGS_DEBUG_INIT}" )
message( "CMAKE_C_FLAGS_DEBUG:INTERNAL=${CMAKE_C_FLAGS_DEBUG}" )
message( "CMAKE_C_FLAGS_DEBUG_INIT:INTERNAL=${CMAKE_C_FLAGS_DEBUG_INIT}" )
	




set( CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_LIST_DIR}/install CACHE STRING ""
FORCE )


set( CMD echo "CMAKE_C_FLAGS_DEBUG = ${CMAKE_C_FLAGS_DEBUG}" )


add_custom_target( 
	pete
	ALL
	${CMD}
	)



# ${TOP}/some_external_project/CMakeList.txt ===================
# END


The following ouput should be seen in VS output window regarding output pete
where last line CMAKE_C_FLAGS_DEBUG is not as expected (/MTd option specified):

3>  2>  Creating "x64\Debug\pete\pete.unsuccessfulbuild" because "AlwaysCreate"
was specified.
3>  
3>  2>CustomBuild:
3>  
3>  2>  Building Custom Rule
C:/projects/CMakeTesting/external_project_test/some_external_project/CMakeLists.txt
3>  
3>  2>  CMake does not need to re-run because
C:\projects\CMakeTesting\external_project_test\build\some_proj-prefix\src\some_proj-build\CMakeFiles\generate.stamp
is up-to-date.
3>  
3>  2>  "CMAKE_C_FLAGS_DEBUG = /MTd /Z7 /Od"



	    

Additional Information: 

Attached is zipped version of above files.  Any version of VS should do.
====================================================================== 

Issue History 
Date Modified    Username       Field                    Change               
====================================================================== 
2014-01-17 15:02 Brian J. Davis New Issue                                    
2014-01-17 15:02 Brian J. Davis File Added: external_project_test.zip           
        
======================================================================



More information about the cmake-developers mailing list