Summary: This PR adds support for using SonarKit clients in Swift apps. Fixes #13, fixes #87 1. Swift can't import Obj-C modules which have C++ headers. For this reason, we use SonarKit as an Obj-C++ wrapper around Sonar, which is written in C++. Due to search path misconfiguration, trying to import SonarKit into a Swift project would import `xplat/Sonar/SonarPlugin.h` instead of `iOS/SonarKit/SonarPlugin.h`, which caused `file not found` errors for C++ stdlib imports like #28 because new projects don't have their search paths set up correctly. 2. The network and layout plugins have C++ definitions (struct methods, classes) in some of their headers. This causes the compiler to get confused for Swift projects, because it only supports importing Objective-C files in umbrella headers, meaning that the `SonarKit` won't build. 1. I updated the `HEADER_SEARCH_PATHS` of SonarKit.podspec's build configuration to include `${PODS_ROOT}/Headers/Private/SonarKit/**` first, which alleviates the search path issue. The Obj-C `Sample` project seems to have worked around this by including a hardcoded `${PODS_ROOT}/SonarKit/**` search path in the pbxproj, which is why Sample works but new projects (like those referenced in #28) don't. I removed this since it's no longer necessary. 2. I added a `SampleSwift` app to demonstrate using Sonar with a Swift project. 3. Because the Podfiles for `Sample` and `SampleSwift` referenced podspecs using `:podspec` instead of a concrete version, Cocoapods wouldn't copy local header files (instead, it downloads them from the source). To enable local development of these sample apps using `:path`, I added a symlink to SonarKit.podspec in the root of the directory. 4. I changed SonarKit.podspec to use a tag-based `source`, since v0.0.1 pulls from the master branch of this repo. The layout and network plugins still don't work with Swift - in order to fix this, we'll need to work on extracting the C++ out of their headers and writing Obj-C++ wrappers for them. I decided to push this off to a later PR since this one is quite large already. This means that we need to be able to `import SonarKit` without importing all the network/layout plugin headers. In order to make this work, I made "SonarKit/Core" the spec's `default_subspecs`. priteshrnandgaonkar, let me know if you have any thoughts on this implementation. You can verify that the SampleSwift app works by checking out this branch, `pod install`ing in the SampleSwift directory, and building it :)  Pull Request resolved: https://github.com/facebook/Sonar/pull/106 Reviewed By: jknoxville Differential Revision: D8890010 Pulled By: priteshrnandgaonkar fbshipit-source-id: 449305bcc5cbeb5787c23f51b1ecb80a5cbdad32
118 lines
6.9 KiB
Ruby
118 lines
6.9 KiB
Ruby
folly_compiler_flags = '-DFB_SONARKIT_ENABLED=1 -DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_HAVE_LIBGFLAGS=0 -DFOLLY_HAVE_LIBJEMALLOC=0 -DFOLLY_HAVE_PREADV=0 -DFOLLY_HAVE_PWRITEV=0 -DFOLLY_HAVE_TFO=0 -DFOLLY_USE_SYMBOLIZER=0'
|
|
yoga_version = '~> 1.9'
|
|
yogakit_version = '~>1.8'
|
|
sonarkit_version = '0.6.13'
|
|
Pod::Spec.new do |spec|
|
|
spec.name = 'SonarKit'
|
|
spec.version = sonarkit_version
|
|
spec.license = { :type => 'MIT' }
|
|
spec.homepage = 'https://github.com/facebook/Sonar'
|
|
spec.summary = 'Sonar iOS podspec'
|
|
spec.authors = 'Facebook'
|
|
spec.static_framework = true
|
|
spec.source = { :git => 'https://github.com/facebook/Sonar.git',
|
|
:tag=> "v"+sonarkit_version }
|
|
spec.module_name = 'SonarKit'
|
|
spec.platforms = { :ios => "8.4" }
|
|
spec.default_subspecs = "Core"
|
|
|
|
# This subspec is necessary since FBMacros.h is imported as <FBDefines/FBMacros.h>
|
|
# inside SKMacros.h, which is a public header file. Defining this directory as a
|
|
# subspec with header_dir = 'FBDefines' allows this to work, even though it wouldn't
|
|
# generally (you would need to import <SonarKit/FBDefines/FBMacros.h>)
|
|
spec.subspec 'FBDefines' do |ss|
|
|
ss.header_dir = 'FBDefines'
|
|
ss.compiler_flags = folly_compiler_flags
|
|
ss.source_files = 'iOS/FBDefines/**/*.h'
|
|
ss.public_header_files = 'iOS/FBDefines/**/*.h'
|
|
end
|
|
|
|
spec.subspec 'FBCxxUtils' do |ss|
|
|
ss.header_dir = 'FBCxxUtils'
|
|
ss.compiler_flags = folly_compiler_flags
|
|
ss.source_files = 'iOS/SonarKit/FBCxxUtils/**/*.{h,mm}'
|
|
# We set these files as private headers since they only need to be accessed
|
|
# by other SonarKit source files
|
|
ss.private_header_files = 'iOS/SonarKit/FBCxxUtils/**/*.h'
|
|
end
|
|
|
|
spec.subspec "Core" do |ss|
|
|
ss.dependency 'SonarKit/FBDefines'
|
|
ss.dependency 'SonarKit/FBCxxUtils'
|
|
ss.dependency 'Folly', '~>1.0'
|
|
ss.dependency 'Sonar', '~>'+sonarkit_version
|
|
ss.dependency 'CocoaAsyncSocket', '~> 7.6'
|
|
ss.dependency 'PeerTalk', '~>0.0.2'
|
|
ss.dependency 'OpenSSL-Static', '1.0.2.c1'
|
|
ss.compiler_flags = folly_compiler_flags
|
|
ss.source_files = 'iOS/SonarKit/FBDefines/*.{h,cpp,m,mm}', 'iOS/SonarKit/CppBridge/*.{h,mm}', 'iOS/SonarKit/FBCxxUtils/*.{h,mm}', 'iOS/SonarKit/Utilities/**/*.{h,m}', 'iOS/SonarKit/*.{h,m,mm}'
|
|
ss.public_header_files = 'iOS/SonarKit/**/{SonarClient,SonarPlugin,SonarConnection,SonarResponder,SKMacros}.h'
|
|
header_search_paths = "\"$(PODS_ROOT)/SonarKit/iOS/SonarKit\" \"$(PODS_ROOT)\"/Headers/Private/SonarKit/** \"$(PODS_ROOT)/boost-for-react-native\" \"$(PODS_ROOT)/DoubleConversion\" \"$(PODS_ROOT)/PeerTalkSonar\""
|
|
ss.pod_target_xcconfig = { "USE_HEADERMAP" => "NO",
|
|
"DEFINES_MODULE" => "YES",
|
|
"HEADER_SEARCH_PATHS" => header_search_paths }
|
|
end
|
|
|
|
spec.subspec "SonarKitLayoutPlugin" do |ss|
|
|
ss.header_dir = "SonarKitLayoutPlugin"
|
|
ss.dependency 'SonarKit/Core'
|
|
ss.dependency 'Yoga', yoga_version
|
|
ss.dependency 'YogaKit', yogakit_version
|
|
ss.compiler_flags = folly_compiler_flags
|
|
ss.public_header_files = 'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/SonarKitLayoutPlugin.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/SKTouch.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/SKDescriptorMapper.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/SKNodeDescriptor.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/SKInvalidation.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/SKNamed.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/SKTapListener.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/SKObject.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/SKHighlightOverlay.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/UIColor+SKSonarValueCoder.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/utils/SKObjectHash.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/utils/SKSwizzle.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/utils/SKYogaKitHelper.h'
|
|
ss.source_files = 'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutPlugin/**/*.{h,cpp,m,mm}'
|
|
end
|
|
|
|
spec.subspec "SonarKitLayoutComponentKitSupport" do |ss|
|
|
ss.header_dir = "SonarKitLayoutComponentKitSupport"
|
|
ss.dependency 'SonarKit/Core'
|
|
ss.dependency 'Yoga', yoga_version
|
|
ss.dependency 'ComponentKit'
|
|
ss.dependency 'SonarKit/SonarKitLayoutPlugin'
|
|
ss.compiler_flags = folly_compiler_flags
|
|
ss.dependency 'SonarKit/SonarKitLayoutPlugin'
|
|
ss.public_header_files = 'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutComponentKitSupport/SonarKitLayoutComponentKitSupport.h',
|
|
'iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutComponentKitSupport/SKComponentLayoutWrapper.h'
|
|
|
|
ss.source_files = "iOS/Plugins/SonarKitLayoutPlugin/SonarKitLayoutComponentKitSupport/**/*.{h,cpp,m,mm}"
|
|
ss.pod_target_xcconfig = { "USE_HEADERMAP" => "NO",
|
|
"HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)\"/Headers/Private/SonarKit/**" }
|
|
end
|
|
|
|
spec.subspec "SonarKitNetworkPlugin" do |ss|
|
|
ss.header_dir = "SonarKitNetworkPlugin"
|
|
ss.dependency 'SonarKit/Core'
|
|
ss.compiler_flags = folly_compiler_flags
|
|
ss.public_header_files = 'iOS/Plugins/SonarKitNetworkPlugin/SonarKitNetworkPlugin/SonarKitNetworkPlugin.h',
|
|
'iOS/Plugins/SonarKitNetworkPlugin/SonarKitNetworkPlugin/SKBufferingPlugin.h',
|
|
'iOS/Plugins/SonarKitNetworkPlugin/SonarKitNetworkPlugin/SKDispatchQueue.h',
|
|
'iOS/Plugins/SonarKitNetworkPlugin/SonarKitNetworkPlugin/SKNetworkReporter.h'
|
|
ss.source_files = "iOS/Plugins/SonarKitNetworkPlugin/SonarKitNetworkPlugin/*.{h,cpp,m,mm}"
|
|
ss.pod_target_xcconfig = { "USE_HEADERMAP" => "NO",
|
|
"HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)\"/Headers/Private/SonarKit/**" }
|
|
end
|
|
|
|
spec.subspec "SKIOSNetworkPlugin" do |ss|
|
|
ss.header_dir = "SKIOSNetworkPlugin"
|
|
ss.dependency 'SonarKit/Core'
|
|
ss.dependency 'SonarKit/SonarKitNetworkPlugin'
|
|
ss.compiler_flags = folly_compiler_flags
|
|
ss.public_header_files = 'iOS/Plugins/SonarKitNetworkPlugin/SKIOSNetworkPlugin/SKIOSNetworkAdapter.h'
|
|
ss.source_files = "iOS/Plugins/SonarKitNetworkPlugin/SKIOSNetworkPlugin/**/*.{h,cpp,m,mm}"
|
|
ss.pod_target_xcconfig = { "USE_HEADERMAP" => "NO",
|
|
"HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)\"/Headers/Private/SonarKit/**" }
|
|
end
|
|
end
|