Предупреждения об устаревании OSX CMake - PullRequest
0 голосов
/ 16 января 2012

Я строю некоторый код, используя CMake, который должен быть скомпилирован с ScriptingBridge.

Я вижу много десятков тысяч строк журнала, таких как:

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

( Полный расширенный вывод здесь )

Файлы компилируются с:

/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 для привязки фреймворка к цели.

Я ищулюбой способ иметь спокойную сборку.У меня также есть (в 4 раза) меньше предупреждений от интерфейса OpenSSL'x EVA, которые я могу обработать ... заранее спасибо.

1 Ответ

1 голос
/ 21 января 2012

Ответом было использование -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)
...