[cmake-developers] [CMake 0014935]: file(APPEND "message...") writes nulls into file
Mantis Bug Tracker
mantis at public.kitware.com
Mon May 26 04:56:25 EDT 2014
The following issue has been SUBMITTED.
======================================================================
http://public.kitware.com/Bug/view.php?id=14935
======================================================================
Reported By: th.thielemann
Assigned To:
======================================================================
Project: CMake
Issue ID: 14935
Category: CMake
Reproducibility: always
Severity: minor
Priority: normal
Status: new
======================================================================
Date Submitted: 2014-05-26 04:56 EDT
Last Modified: 2014-05-26 04:56 EDT
======================================================================
Summary: file(APPEND "message...") writes nulls into file
Description:
I am using a shared folder between my Win7 and VmWare with Ubuntu 12.04.
Fore some reasons I write out some properties into a file during cmake run.
First line with file(WRITE "key=value"). All others with file(APPEND ...)
Sucessful tested on Windows, Linux using the local file system. But if I share a
folder between Windows and Linux, the result is "00 00 00 00 ... 00 The appended
message".
Steps to Reproduce:
Create the environment Win7 + VmWare + Ubuntu 12.04 LTS + shared folder.
Here is my function
function(write_env_script Mode EnvKey EnvValue)
# Possible option flags
list(FIND ARGN EXTEND IsExtend)
# Resulting script name
if(CMAKE_HOST_WIN32)
file(TO_NATIVE_PATH ${EnvValue} EnvValue)
endif()
set(ScriptName ${PROJECT_BINARY_DIR}/setprojectenv${SSP_SCRIPT_TYPE})
# Reset mode to WRITE if file does not exist
if(("${Mode}" STREQUAL "APPEND") AND (NOT EXISTS ${ScriptName}))
set(Mode "WRITE")
endif()
# overwrite or extend the env variable's value
set(EnvValueAlreadySet -1)
if(NOT IsExtend EQUAL -1)
if(NOT "$ENV{${EnvKey}}" STREQUAL "")
if(CMAKE_HOST_UNIX)
set(CurrentEnvValue "$ENV{${EnvKey}}:")
elseif(CMAKE_HOST_WIN32)
set(CurrentEnvValue "$ENV{${EnvKey}};")
endif()
endif()
# Contains the env variable the value already?
string(FIND "$ENV{${EnvKey}}" "${EnvValue}" EnvValueAlreadySet REVERSE)
endif()
if(EnvValueAlreadySet EQUAL -1)
if(CMAKE_HOST_UNIX)
#### Error! Replace the following line with workaround
file(${Mode} ${ScriptName} "${PreviousScriptContent} export
${EnvKey}=${CurrentEnvValue}${EnvValue}\n" )
execute_process(COMMAND chmod u+x ${ScriptName} WORKING_DIRECTORY
"${PROJECT_BINARY_DIR}")
elseif(CMAKE_HOST_WIN32)
file(${Mode} ${ScriptName} "set
${EnvKey}=${CurrentEnvValue}${EnvValue}\n\r" )
endif()
endif()
endfunction()
The workaround for linux using VmWare share.
if("${Mode}" STREQUAL "APPEND")
file(READ ${ScriptName} PreviousScriptContent)
endif()
file(WRITE ${ScriptName} "${PreviousScriptContent} export
${EnvKey}=${CurrentEnvValue}${EnvValue}\n" )
Usage of the function:
write_env_script(APPEND QT_PLUGIN_PATH "${QtLibs_PATH}/plugins")
write_env_script(APPEND QML2_IMPORT_PATH "${QtLibs_PATH}/qml")
write_env_script(APPEND PATH "${QtLibs_PATH}/bin" EXTEND)
======================================================================
Issue History
Date Modified Username Field Change
======================================================================
2014-05-26 04:56 th.thielemann New Issue
======================================================================
More information about the cmake-developers
mailing list