cotire icon indicating copy to clipboard operation
cotire copied to clipboard

Problem with precompiled header and generic Qt includes on OSX

Open kapecp opened this issue 7 years ago • 2 comments

Hi

First thank you for this great tool!

After upgrading my large project from Qt4 to Qt5 the following problem occured.

related issue: #69

environment:

  • OSX 10.11.6
  • CMake 3.8.0 (installed via Homebrew)
  • Cotire 1.7.9 (master HEAD, commit 3d63330c99fde1844e3ad63c98025d18d38019f2)
  • Qt 5.8.0_2 (installed via Homebrew)

This is a minimal example that re-produces the error: (using COTIRE_MINIMUM_NUMBER_OF_TARGET_SOURCES=1)

CMakeLists.txt:

project( QtGUI_problem CXX C )
cmake_minimum_required( VERSION 3.6 )
set( CMAKE_MODULE_PATH
	"${CMAKE_CURRENT_SOURCE_DIR}/cmake/cotire/CMake"
	${CMAKE_MODULE_PATH} )
set(CMAKE_CXX_STANDARD 11)
include( cotire )
if( COMMAND cotire )
	set( COTIRE_VERBOSE TRUE )
	set( COTIRE_DEBUG TRUE )
endif()
find_package( Qt5Gui )
add_executable( app main.cpp)
target_link_libraries(app Qt5::Gui)
if( COMMAND cotire )
	set_target_properties( app PROPERTIES COTIRE_UNITY_LINK_LIBRARIES_INIT "COPY_UNITY")
	cotire( app CONFIGURATIONS Debug)
endif()

main.cpp:

#include <QtGui>			// this causes the wrong path
// #include <QtGui/QIcon>	// this works
// #include <QIcon> 		// this works
int main( int argc, char* argv[] )
{
}

When building via make all the precomiled header in _build/cotire/app_CXX_prefix.cxx contains:

#pragma clang system_header
#ifdef __cplusplus
#include "/usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework/QtGui"
#endif

which results in the following compile error: _build/cotire/app_CXX_prefix.cxx:5: /usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework/QtGui:1:1: error: source file is not valid UTF-8 <CF><FA><ED><FE><U+0007> because the /usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework/QtGui is actually a dynamically linked shared library, but the header file #include <QtGui> is actually here /usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework/Headers/QtGui

so the generated path is wrong (missing "Headers"), however using any header like #include <QtGui/QIcon> or #include <QIcon> (QIcon is in /usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework/Headers/QIcon) will produce a correct build/cotire/app_CXX_prefix.cxx like, e.g.

#pragma clang system_header
#ifdef __cplusplus
#include "/usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework/Headers/QIcon"
#endif  

so it seems to be only caused by including "generic" headers of Qt modules

more details: output of cmake -DCOTIRE_DEBUG=TRUE .

cotire 1.7.9 loaded.
Target app compile flags: -g;-fPIC
Filter arch unmatched: -g;-fPIC
C source file extensions: c;m
C ignore extensions: h;H;o;O;obj;OBJ;def;DEF;rc;RC
C exclude extensions: m;mm
Target app compile flags: -g;-fPIC;-std=gnu++11
Filter arch unmatched: -g;-fPIC;-std=gnu++11
CXX source file extensions: C;M;c++;cc;cpp;cxx;mm;CPP
CXX ignore extensions: inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC
CXX exclude extensions: m;mm
Filtered app CXX sources: main.cpp
CXX target app cotired.
CXX source file extensions: C;M;c++;cc;cpp;cxx;mm;CPP
CXX ignore extensions: inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC
CXX exclude extensions: m;mm
Filtered app CXX sources: main.cpp
Target app compile flags: -g;-fPIC;-std=gnu++11
Filter I unmatched: -g;-fPIC;-std=gnu++11
Filter isystem unmatched: -g;-fPIC;-std=gnu++11
Target app include dirs: /usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework;/usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework/Headers;/System/Library/Frameworks/OpenGL.framework/Headers;/usr/local/Cellar/qt/5.8.0_2/lib/QtCore.framework;/usr/local/Cellar/qt/5.8.0_2/lib/QtCore.framework/Headers;/usr/local/Cellar/qt/5.8.0_2/.//mkspecs/macx-clang
Target app compile flags: -g;-fPIC;-std=gnu++11
Filter D unmatched: -g;-fPIC;-std=gnu++11
Target app compile definitions: QT_GUI_LIB;QT_CORE_LIB;$<$<NOT:$<CONFIG:Debug>>:QT_NO_DEBUG>
Target app compile flags: -g;-fPIC;-std=gnu++11
Filter D|I|isystem unmatched: -g;-fPIC;-std=gnu++11
Target app compiler flags: -g;-fPIC;-std=gnu++11
# cotire.cmake 1.7.9 generated file
# /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/app_CXX_cotire.cmake
set (COTIRE_ADDITIONAL_PREFIX_HEADER_IGNORE_EXTENSIONS "inc;inl;ipp")
set (COTIRE_ADDITIONAL_PREFIX_HEADER_IGNORE_PATH "")
set (COTIRE_CLEAN_ALL_TARGET_NAME "clean_cotire")
set (COTIRE_CLEAN_TARGET_SUFFIX "_clean_cotire")
set (COTIRE_CMAKE_MODULE_FILE "/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/cmake/cotire/CMake/cotire.cmake")
set (COTIRE_CMAKE_MODULE_VERSION "1.7.9")
set (COTIRE_DEBUG "TRUE")
set (COTIRE_DEBUG "TRUE")
set (COTIRE_INTDIR "cotire")
set (COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES "0")
set (COTIRE_MINIMUM_NUMBER_OF_TARGET_SOURCES "1")
set (COTIRE_PCH_ALL_TARGET_NAME "all_pch")
set (COTIRE_PCH_TARGET_SUFFIX "_pch")
set (COTIRE_PREFIX_HEADER_FILENAME_SUFFIX "_prefix")
set (COTIRE_TARGETS_FOLDER "cotire")
set (COTIRE_TARGET_COMPILE_DEFINITIONS_DEBUG "QT_GUI_LIB;QT_CORE_LIB;$<$<NOT:$<CONFIG:Debug>>:QT_NO_DEBUG>")
set (COTIRE_TARGET_COMPILE_FLAGS_DEBUG "-g;-fPIC;-std=gnu++11")
set (COTIRE_TARGET_CONFIGURATION_TYPES "Debug")
set (COTIRE_TARGET_CXX_COMPILER_LAUNCHER "COTIRE_TARGET_CXX_COMPILER_LAUNCHER-NOTFOUND")
set (COTIRE_TARGET_IGNORE_PATH "/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem")
set (COTIRE_TARGET_INCLUDE_DIRECTORIES_DEBUG "/usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework;/usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework/Headers;/System/Library/Frameworks/OpenGL.framework/Headers;/usr/local/Cellar/qt/5.8.0_2/lib/QtCore.framework;/usr/local/Cellar/qt/5.8.0_2/lib/QtCore.framework/Headers;/usr/local/Cellar/qt/5.8.0_2/.//mkspecs/macx-clang")
set (COTIRE_TARGET_INCLUDE_PRIORITY_PATH "")
set (COTIRE_TARGET_LANGUAGE "CXX")
set (COTIRE_TARGET_MAXIMUM_NUMBER_OF_INCLUDES "")
set (COTIRE_TARGET_POST_UNDEFS "")
set (COTIRE_TARGET_PRE_UNDEFS "")
set (COTIRE_TARGET_SOURCES "main.cpp")
set (COTIRE_UNITY_BUILD_ALL_TARGET_NAME "all_unity")
set (COTIRE_UNITY_BUILD_TARGET_SUFFIX "_unity")
set (COTIRE_UNITY_OUTPUT_DIRECTORY "")
set (COTIRE_UNITY_SOURCE_EXCLUDE_EXTENSIONS "m;mm")
set (COTIRE_UNITY_SOURCE_FILENAME_SUFFIX "_unity")
set (CMAKE_GENERATOR "Unix Makefiles")
set (CMAKE_BUILD_TYPE "Debug")
set (CMAKE_CXX_COMPILER_ID "Clang")
set (CMAKE_CXX_COMPILER_VERSION "8.0.0.8000042")
set (CMAKE_CXX_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++")
set (CMAKE_CXX_COMPILER_ARG1 "")
set (CMAKE_INCLUDE_FLAG_CXX "-I")
set (CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem ")
set (CMAKE_CXX_FRAMEWORK_SEARCH_FLAG "-F")
set (CMAKE_CXX_SYSTEM_FRAMEWORK_SEARCH_FLAG "-iframework ")
set (CMAKE_CXX_SOURCE_FILE_EXTENSIONS "C;M;c++;cc;cpp;cxx;mm;CPP")

/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/app_CXX_cotire.cmake unchanged
app unity source max includes: 0
unity files: /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_unity.cxx
add_custom_command: OUTPUT /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_unity.cxx COMMAND /Applications/CMake.app/Contents/bin/cmake;--warn-uninitialized;-DCOTIRE_BUILD_TYPE:STRING=$<CONFIGURATION>;-DCOTIRE_VERBOSE:BOOL=ON;-P;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/cmake/cotire/CMake/cotire.cmake;unity;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/app_CXX_$<$<CONFIG:>:None>$<$<NOT:$<CONFIG:>>:$<CONFIGURATION>>_cotire.cmake;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_unity.cxx DEPENDS /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/app_CXX_$<$<CONFIG:>:None>$<$<NOT:$<CONFIG:>>:$<CONFIGURATION>>_cotire.cmake
add_custom_command: OUTPUT /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_prefix.cxx COMMAND /Applications/CMake.app/Contents/bin/cmake;--warn-uninitialized;-DCOTIRE_BUILD_TYPE:STRING=$<CONFIGURATION>;-DCOTIRE_VERBOSE:BOOL=ON;-P;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/cmake/cotire/CMake/cotire.cmake;prefix;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/app_CXX_$<$<CONFIG:>:None>$<$<NOT:$<CONFIG:>>:$<CONFIGURATION>>_cotire.cmake;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_prefix.cxx;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_unity.cxx DEPENDS /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_unity.cxx  /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
add_custom_command: OUTPUT /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_prefix.hxx COMMAND /Applications/CMake.app/Contents/bin/cmake;--warn-uninitialized;-DCOTIRE_BUILD_TYPE:STRING=$<CONFIGURATION>;-DCOTIRE_VERBOSE:BOOL=ON;-P;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/cmake/cotire/CMake/cotire.cmake;combine;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/app_CXX_$<$<CONFIG:>:None>$<$<NOT:$<CONFIG:>>:$<CONFIGURATION>>_cotire.cmake;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_prefix.hxx;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_prefix.cxx DEPENDS /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_prefix.cxx
Target app compile flags: -g;-fPIC;-std=gnu++11
Filter arch unmatched: -g;-fPIC;-std=gnu++11
add_custom_command: OUTPUT /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_prefix.hxx.pch /Applications/CMake.app/Contents/bin/cmake;--warn-uninitialized;-DCOTIRE_BUILD_TYPE:STRING=$<CONFIGURATION>;-DCOTIRE_VERBOSE:BOOL=ON;-P;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/cmake/cotire/CMake/cotire.cmake;precompile;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/app_CXX_$<$<CONFIG:>:None>$<$<NOT:$<CONFIG:>>:$<CONFIGURATION>>_cotire.cmake;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_prefix.hxx;/Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_prefix.hxx.pch;main.cpp DEPENDS /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_prefix.hxx /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ IMPLICIT_DEPENDS CXX /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_prefix.hxx
CXX source file extensions: C;M;c++;cc;cpp;cxx;mm;CPP
CXX ignore extensions: inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC
CXX exclude extensions: m;mm
Filtered app CXX sources: main.cpp
add target EXECUTABLE app_unity  EXCLUDE_FROM_ALL /Users/kapec/Desktop/Dev/Tmp/QtGUI-problem/_build/cotire/app_CXX_unity.cxx
unity target app_unity link strategy: COPY_UNITY
unity target app_unity link libraries: Qt5::Gui
unity target app_unity interface link libraries: Qt5::Gui
Configuring done

possible source of the problem: COTIRE_TARGET_INCLUDE_DIRECTORIES_DEBUG contains /usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework;/usr/local/Cellar/qt/5.8.0_2/lib/QtGui.framework/Headers; (as the result of /usr/local/Cellar/qt/5.8.0_2/lib/cmake/Qt5Gui/Qt5GuiConfig.cmake)

Unity build works OK. My current workaround: do not use #include <QtGui>

kapecp avatar May 21 '17 12:05 kapecp

This may have been fixed with Cotire 1.8.0 - at least I'm not getting this particular problem anymore (I was with 1.7.10). However, I have filed a separate issue #166 against 1.8.0.

macdew avatar Sep 17 '18 11:09 macdew

I was wrong about thinking it was fixed with Cotire 1.8.0. I'm also still seeing this problem. Oddly enough, some includes are ok, but there's still the root file in a Qt framework being pulled in (in my case it's QtWidgets).

macdew avatar Sep 21 '18 08:09 macdew