2012-01-15 128 views
0

我正在编写一些使用CMake的代码,这些代码应该根据ScriptingBridge进行编译。OSX弃用警告CMake

我看到的日志行,如许多数以万计:

In file included from /Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Security.framework/Headers/cssmapple.h:30, 
       from /Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Security.framework/Headers/Security.h:25, 
       from /Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSURLCredential.h:9, 
       from /Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:70, 
       from /Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/AppKit.framework/Headers/AppKit.h:10, 
       from /Users/codebeaker/Projects/watchedit-client-code/src/libwhatsplaying/include/apple/itunes.h:5, 
       from /Users/codebeaker/Projects/watchedit-client-code/src/libwhatsplaying/src/osx/itunes_scripting_bridge.m:1: 
/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Security.framework/Headers/cssmtype.h:142: warning: ‘CSSM_GUID’ is deprecated 
/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Security.framework/Headers/cssmtype.h:143: warning: ‘CSSM_VERSION’ is deprecated 
/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Security.framework/Headers/cssmtype.h:156: warning: ‘CSSM_GUID’ is deprecated 
/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Security.framework/Headers/cssmtype.h:197: warning: ‘CSSM_DATA’ is deprecated 
/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Security.framework/Headers/cssmtype.h:217: warning: ‘CSSM_DATA_PTR’ is deprecated 
/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Security.framework/Headers/cssmtype.h:220: warning: ‘CSSM_DATA’ is deprecated 

Full extensive output here

的文件被编译:

/usr/bin/c++ -I/Users/codebeaker/Projects/watchedit-client-code/src/libwhatsplaying/include -I/Users/codebeaker/Projects/watchedit-client-code/src/libwhatsplaying/../libwatchedit/include -x objective-c -o CMakeFiles/whatsplaying.dir/src/osx/itunes_scripting_bridge.m.o -c /Users/codebeaker/Projects/watchedit-client-code/src/libwhatsplaying/src/osx/itunes_scripting_bridge.m 

/usr/bin/gcc -I/Users/codebeaker/Projects/watchedit-client-code/src/libwhatsplaying/include -I/Users/codebeaker/Projects/watchedit-client-code/src/libwhatsplaying/../libwatchedit/include -F/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks -x objective-c -o CMakeFiles/whatsplaying.dir/src/osx/itunes_scripting_bridge.m.o -c /Users/codebeaker/Projects/watchedit-client-code/src/libwhatsplaying/src/osx/itunes_scripting_bridge.m

在审查了人(Clang)gcc在我的Mac上,有这听起来很有趣:

  -Fdir 
      Add the framework directory dir to the head of the list of directories to be searched for header files. These directories are interleaved with those 
      specified by -I options and are scanned in a left-to-right order. 

      A framework directory is a directory with frameworks in it. A framework is a directory with a "Headers" and/or "PrivateHeaders" directory contained 
      directly in it that ends in ".framework". The name of a framework is the name of this directory excluding the ".framework". Headers associated with 
      the framework are found in one of those two directories, with "Headers" being searched first. A subframework is a framework directory that is in a 
      framework's "Frameworks" directory. Includes of subframework headers can only appear in a header of a framework that contains the subframework, or in 
      a sibling subframework header. Two subframeworks are siblings if they occur in the same framework. A subframework should not have the same name as a 
      framework, a warning will be issued if this is violated. Currently a subframework cannot have subframeworks, in the future, the mechanism may be 
      extended to support this. The standard frameworks can be found in "/System/Library/Frameworks" and "/Library/Frameworks". An example include looks 
      like "#include ", where Framework denotes the name of the framework and header.h is found in the "PrivateHeaders" or "Headers" 
      directory. 

     -iframeworkdir 
      Like -F except the directory is a treated as a system directory. The main effect is to not warn about constructs contained within header files found 
      via dir.

也许我应该寻找-iframework。在终端上使用-iframework进行构建时,手动完成时不会有任何弃用警告。

但是CMake不支持使用-framework的选项。从它们的find_library()文档:

CMake将使用-framework A和-F将框架链接到目标。

我正在寻找任何方式有一个安静的构建。我还有来自OpenSSL'x EVA接口的(4x)更小的警告,我可以处理的......先谢谢了。

回答

1

答案是使用-iframework,可能是因为这是为了在您无法解决系统级弃用警告时忽略系统级弃用警告。

取而代之,我能够使用-Wno-deprecated-declarations,这是一个GCC的标志,可以在任何地方记录和使用。它是可靠的,我包括在我的CMake的声明这样:

IF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 
    find_and_add_framework(Foundation watchedit) 
    find_and_add_framework(Cocoa watchedit) 
    find_and_add_framework(AppKit watchedit) 
    find_and_add_framework(ScriptingBridge watchedit) 
    set_source_files_properties(${sources} PROPERTIES COMPILE_FLAGS 
    "-xobjective-c -Wno-deprecated-declarations") 
    set_source_files_properties(${sources} PROPERTIES LANGUAGE C) 
ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")

对于任何人谁获益,这里的find_and_add_framework实施。我不确定我从哪里拆了它,但这不是我自己的工作:

macro(FIND_AND_ADD_FRAMEWORK fwname appname) 
    find_library(FRAMEWORK_${fwname} 
     NAMES ${fwname} 
     PATHS ${CMAKE_OSX_SYSROOT}/System/Library 
     PATH_SUFFIXES Frameworks 
     NO_DEFAULT_PATH) 
    if(${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND) 
     MESSAGE(ERROR ": Framework ${fwname} not found") 
    else() 
     TARGET_LINK_LIBRARIES(${appname} ${FRAMEWORK_${fwname}}) 
     # MESSAGE(STATUS "Framework ${fwname} found at ${FRAMEWORK_${fwname}}") 
    endif() 
endmacro(FIND_AND_ADD_FRAMEWORK)