MantisBT - CMake
View Issue Details
0014266CMakeCMakepublic2013-07-03 08:342013-12-02 08:51
ycollet 
Brad King 
normalminoralways
closedfixed 
x86Windows7 46 bits
CMake 2.8.11 
CMake 2.8.12CMake 2.8.12 
0014266: cmake configure step in ExternalProject_Add makes Visual studio stops
I used ExternalProject_Add to configure and compile a thirdparty library (log4cplus-1.1.1).
The configure step call cmake. This cmake performs some configure check (check if some headers exist, check if some library is present). Some of these check fails (this is a normal thing because some headers are not present under windows).

But when a configure check fails, an error counter is incrementer under visual studio. And when this counter reaches 120, Visual Studio 2008 express stops due to a large number of errors.

To overcome this, I needed to activate BUILD_IN_SOURCE and CONFIGURE_LOG. After that, all the messages from the configure step are not displayed anymore in the visual studio console and the error counter is not incremented anymore. After that, the configure step went fine.
The external project which doesn't worked:

ExternalProject_Add(EP_log4cplus
                    PREFIX ${EP_InstallDir}/log4cplus
                    URL http://kent.dl.sourceforge.net/project/log4cplus/log4cplus-stable/1.1.1/log4cplus-1.1.1.tar.bz2 [^]
                    CONFIGURE_COMMAND ${CMAKE_COMMAND} -E make_directory ${EP_InstallDir}/log4cplus/src/EP_log4cplus/build
                                   && ${CMAKE_COMMAND} -E chdir ${EP_InstallDir}/log4cplus/src/EP_log4cplus/build ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${EP_InstallDir}/install ..
                    BUILD_COMMAND ${CMAKE_COMMAND} -E chdir ${EP_InstallDir}/log4cplus/src/EP_log4cplus/build make
                    INSTALL_COMMAND ${CMAKE_COMMAND} -E chdir ${EP_InstallDir}/log4cplus/src/EP_log4cplus/build make install
                    )

The external project command which worked:

ExternalProject_Add(EP_log4cplus
                    PREFIX ${EP_InstallDir}/log4cplus
                    URL http://kent.dl.sourceforge.net/project/log4cplus/log4cplus-stable/1.1.1/log4cplus-1.1.1.tar.bz2 [^]
                    CONFIGURE_COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${EP_InstallDir}/install -DUNICODE=OFF -G "NMake Makefiles" .
                    BUILD_COMMAND ${CMAKE_COMMAND} -E chdir ${EP_InstallDir}/log4cplus/src/EP_log4cplus nmake
                    BUILD_IN_SOURCE 1
                    INSTALL_COMMAND ${CMAKE_COMMAND} -E chdir ${EP_InstallDir}/log4cplus/src/EP_log4cplus nmake install
                    LOG_CONFIGURE 1
            )
No tags attached.
related to 0014265closed Brad King ExternalProject documentation missing for chaining multiple commands in one step 
related to 0014263closed  The relative position of the parameters in ExternalProject_Add is important 
Issue History
2013-07-03 08:34ycolletNew Issue
2013-07-03 16:54Brad KingRelationship addedrelated to 0014265
2013-07-03 16:55Brad KingRelationship addedrelated to 0014263
2013-07-03 17:07Brad KingNote Added: 0033479
2013-07-05 02:31ycolletNote Added: 0033485
2013-07-08 12:18Brad KingNote Added: 0033510
2013-07-08 14:58Brad KingNote Added: 0033511
2013-07-10 08:41Brad KingAssigned To => Brad King
2013-07-10 08:41Brad KingStatusnew => assigned
2013-07-10 08:41Brad KingTarget Version => CMake 2.8.12
2013-07-10 13:26Brad KingNote Added: 0033524
2013-07-10 13:26Brad KingStatusassigned => resolved
2013-07-10 13:26Brad KingResolutionopen => fixed
2013-07-10 13:26Brad KingFixed in Version => CMake 2.8.12
2013-07-16 13:52Brad KingNote Edited: 0033524bug_revision_view_page.php?bugnote_id=33524#r1217
2013-12-02 08:51Robert MaynardNote Added: 0034641
2013-12-02 08:51Robert MaynardStatusresolved => closed

Notes
(0033479)
Brad King   
2013-07-03 17:07   
I cannot reproduce the failure reported for the non-logged example. All the checks run (many fail) and configuration completes.

Through what mechanism is this vs counter incrementing? Do error messages from the checks appear in the VS build output window or build logs?
(0033485)
ycollet   
2013-07-05 02:31   
I met this problem using visual studio 2008 32 bits used under windows 7 64 bits.

Here is the minimal cmakelists.txt file I used:

cmake_minimum_required(VERSION 2.6)

project(desp_test)

# Prevent the "make clean" from cleaning this directory
set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM TRUE)

include(ExternalProject)

set(EP_InstallDir ${CMAKE_BINARY_DIR}/Dependencies)

set(LOG4CPLUS_VERSION "1.1.1")

# This external project does not works
ExternalProject_Add(EP_log4cplus
                    PREFIX ${EP_InstallDir}/log4cplus
                    URL http://kent.dl.sourceforge.net/project/log4cplus/log4cplus-stable/${LOG4CPLUS_VERSION}/log4cplus-${LOG4CPLUS_VERSION}.tar.bz2 [^]
                    CONFIGURE_COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${EP_InstallDir}/install -DUNICODE=OFF -G "NMake Makefiles" .
                    BUILD_COMMAND ${CMAKE_COMMAND} -E chdir ${EP_InstallDir}/log4cplus/src/EP_log4cplus nmake
                    BUILD_IN_SOURCE 1
                    INSTALL_COMMAND ${CMAKE_COMMAND} -E chdir ${EP_InstallDir}/log4cplus/src/EP_log4cplus nmake install
                    )

# This external project works
#ExternalProject_Add(EP_log4cplus
# PREFIX ${EP_InstallDir}/log4cplus
# URL http://kent.dl.sourceforge.net/project/log4cplus/log4cplus-stable/${LOG4CPLUS_VERSION}/log4cplus-${LOG4CPLUS_VERSION}.tar.bz2 [^]
# CONFIGURE_COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${EP_InstallDir}/install -DUNICODE=OFF -G "NMake Makefiles" .
# BUILD_COMMAND ${CMAKE_COMMAND} -E chdir ${EP_InstallDir}/log4cplus/src/EP_log4cplus nmake
# BUILD_IN_SOURCE 1
# INSTALL_COMMAND ${CMAKE_COMMAND} -E chdir ${EP_InstallDir}/log4cplus/src/EP_log4cplus nmake install
# LOG_CONFIGURE 1
# )




And below, here is a part of the log I've got in the visual studio console. The configuration step has been aborted due to the 121 errors met during the configuration step:







CheckFunctionExists.c
CheckFunctionExists.c.obj : error LNK2019: symbole externe non résolu _clock_gettime référencé dans la fonction _main
cmTryCompileExec1053871539.exe : fatal error LNK1120: 1 externes non résolus
-- Looking for clock_gettime - not found
-- Looking for clock_nanosleep
CheckFunctionExists.c
CheckFunctionExists.c.obj : error LNK2019: symbole externe non résolu _clock_nanosleep référencé dans la fonction _main
cmTryCompileExec2856057910.exe : fatal error LNK1120: 1 externes non résolus
-- Looking for clock_nanosleep - not found
-- Looking for nanosleep
CheckFunctionExists.c
CheckFunctionExists.c.obj : error LNK2019: symbole externe non résolu _nanosleep référencé dans la fonction _main
cmTryCompileExec3743990331.exe : fatal error LNK1120: 1 externes non résolus
-- Looking for nanosleep - not found
-- Looking for gethostbyname_r
CheckFunctionExists.c
CheckFunctionExists.c.obj : error LNK2019: symbole externe non résolu _gethostbyname_r référencé dans la fonction _main
cmTryCompileExec3929262572.exe : fatal error LNK1120: 1 externes non résolus
-- Looking for gethostbyname_r - not found
-- Looking for getaddrinfo
CheckFunctionExists.c
CheckFunctionExists.c.obj : error LNK2019: symbole externe non résolu _getaddrinfo référencé dans la fonction _main
cmTryCompileExec4250284368.exe : fatal error LNK1120: 1 externes non résolus
-- Looking for getaddrinfo - not found
-- Performing Test HAVE_ATTRIBUTE_VISIBILITY
src.c
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(5) : error C2143: erreur de syntaxe : absence de ')' avant '('
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(5) : error C2143: erreur de syntaxe : absence de ')' avant '('
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(5) : error C2091: fonction retournée par la fonction
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(5) : error C2143: erreur de syntaxe : absence de ')' avant 'chaîne'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(5) : error C2091: fonction retournée par la fonction
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(5) : error C2143: erreur de syntaxe : absence de '{' avant 'chaîne'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(5) : error C2059: erreur de syntaxe : '<Inconnu>'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(5) : error C2059: erreur de syntaxe : ')'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(5) : error C2059: erreur de syntaxe : ')'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(5) : error C2059: erreur de syntaxe : ')'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(6) : error C2143: erreur de syntaxe : absence de ')' avant '('
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(6) : error C2143: erreur de syntaxe : absence de ')' avant '('
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(6) : error C2091: fonction retournée par la fonction
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(6) : error C2143: erreur de syntaxe : absence de ')' avant 'chaîne'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(6) : error C2091: fonction retournée par la fonction
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(6) : error C2143: erreur de syntaxe : absence de '{' avant 'chaîne'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(6) : error C2059: erreur de syntaxe : '<Inconnu>'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(6) : error C2059: erreur de syntaxe : ')'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(6) : error C2059: erreur de syntaxe : ')'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(6) : error C2059: erreur de syntaxe : ')'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(8) : error C2143: erreur de syntaxe : absence de ')' avant '('
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(8) : error C2143: erreur de syntaxe : absence de ')' avant '('
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(8) : error C2091: fonction retournée par la fonction
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(8) : error C2143: erreur de syntaxe : absence de ')' avant 'chaîne'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(8) : error C2091: fonction retournée par la fonction
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(8) : error C2143: erreur de syntaxe : absence de '{' avant 'chaîne'
-- Performing Test HAVE_ATTRIBUTE_VISIBILITY - Failed
-- Performing Test HAVE_DECLSPEC_DLLEXPORT
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(8) : error C2059: erreur de syntaxe : '<Inconnu>'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(8) : error C2059: erreur de syntaxe : ')'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(8) : error C2059: erreur de syntaxe : ')'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(8) : error C2059: erreur de syntaxe : ')'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(9) : error C2143: erreur de syntaxe : absence de ')' avant '('
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(9) : error C2143: erreur de syntaxe : absence de ')' avant '('
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(9) : error C2091: fonction retournée par la fonction
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(9) : error C2143: erreur de syntaxe : absence de ')' avant 'chaîne'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(9) : error C2091: fonction retournée par la fonction
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(9) : error C2143: erreur de syntaxe : absence de '{' avant 'chaîne'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(9) : error C2059: erreur de syntaxe : '<Inconnu>'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(9) : error C2059: erreur de syntaxe : ')'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(9) : error C2059: erreur de syntaxe : ')'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.c(9) : error C2059: erreur de syntaxe : ')'
src.c
   Création de la bibliothèque cmTryCompileExec2561857527.lib et de l'objet cmTryCompileExec2561857527.exp
-- Performing Test HAVE_DECLSPEC_DLLEXPORT - Success
-- Performing Test HAVE_CXX11_THREAD_LOCAL
src.cxx
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(1) : error C2144: erreur de syntaxe : 'int' doit être précédé de ';'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(1) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(2) : error C2144: erreur de syntaxe : 'int' doit être précédé de ';'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(2) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(4) : error C2144: erreur de syntaxe : 'int' doit être précédé de ';'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(4) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(4) : error C2086: 'int thread_local' : redéfinition
        D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(1) : voir la déclaration de 'thread_local'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(4) : error C2086: 'int x' : redéfinition
        D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(1) : voir la déclaration de 'x'
-- Performing Test HAVE_CXX11_THREAD_LOCAL - Failed
-- Performing Test HAVE_GCC_THREAD_EXTENSION
src.cxx
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(8) : error C2144: erreur de syntaxe : 'int' doit être précédé de ';'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(8) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(9) : error C2144: erreur de syntaxe : 'int' doit être précédé de ';'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(9) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(11) : error C2144: erreur de syntaxe : 'int' doit être précédé de ';'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(11) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(11) : error C2086: 'int __thread' : redéfinition
        D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(8) : voir la déclaration de '__thread'
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(11) : error C2086: 'int x' : redéfinition
        D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(8) : voir la déclaration de 'x'
-- Performing Test HAVE_GCC_THREAD_EXTENSION - Failed
-- Performing Test HAVE_DECLSPEC_THREAD
src.cxx
-- Performing Test HAVE_DECLSPEC_THREAD - Success
-- Performing Test LOG4CPLUS_HAVE_CXX11_ATOMICS
src.cxx
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CMakeTmp\src.cxx(1) : fatal error C1083: Impossible d'ouvrir le fichier include : 'atomic' : No such file or directory
-- Performing Test LOG4CPLUS_HAVE_CXX11_ATOMICS - Failed
-- Looking for sys/types.h
CheckIncludeFile.c
-- Looking for sys/types.h - found
-- Looking for stddef.h
CheckIncludeFile.c
-- Looking for stddef.h - found
-- Check size of socklen_t
_SOCKLEN_SIZE.c
D:\temp\build\Dependencies\log4cplus\src\EP_log4cplus\CMakeFiles\CheckTypeSize\_SOCKLEN_SIZE.c(3) : fatal error C1083: Impossible d'ouvrir le fichier include : 'sys/socket.h' : No such file or directory
-- Check size of socklen_t - failed
-- Threads:
-- Sources: loggingserver.cxx
-- Configuring done
-- Generating done
-- Build files have been written to: D:/temp/build/Dependencies/log4cplus/src/EP_log4cplus
Le journal de génération a été enregistré à l'emplacement "file://d:\temp\build\EP_log4cplus.dir\Debug\BuildLog.htm" [^]
EP_log4cplus - 121 erreur(s), 3 avertissement(s)
------ Génération ignorée : Projet : ALL_BUILD, Configuration : Debug Win32 ------
Projet non sélectionné dans le cadre d'une génération pour cette configuration de solution
========== Génération : 1 a réussi, 1 a échoué, 0 mis à jour, 1 a été ignoré ==========
(0033510)
Brad King   
2013-07-08 12:18   
The build of the outer project inside the visual studio environment is setting the environment variable VS_UNICODE_OUTPUT as a backdoor to hook into error messages from the compiler no matter how many levels of processes and stdout/stderr redirection exist in between. The invocations of the compiler run through nmake inside the try_compile checks are leaking build output through this backdoor. The LOG_CONFIGURE option causes the commands to be wrapped in a script that un-sets VS_UNICODE_OUTPUT which is why that workaround works for you.

Somehow we need to unset VS_UNICODE_OUTPUT but we'll have to think about the right place for that.
(0033511)
Brad King   
2013-07-08 14:58   
For reference, the LOG_* suppression of VS_UNICODE_OUTPUT was added here:

 http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=44aff73d [^]
(0033524)
Brad King   
2013-07-10 13:26   
(edited on: 2013-07-16 13:52)
I've generalized the fix mentioned in 0014266:0033511 to cover all CMake and CTest processes:

 http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=45d2966d [^]

Local testing shows that the "This external project does not works" case described in 0014266:0033485 now works (and didn't before).

(0034641)
Robert Maynard   
2013-12-02 08:51   
Closing resolved issues that have not been updated in more than 4 months.