diff --git a/Build/libHttpClient.iOS.CMake/CMakeLists.txt b/Build/libHttpClient.iOS.CMake/CMakeLists.txt new file mode 100644 index 00000000..9cd1ebc2 --- /dev/null +++ b/Build/libHttpClient.iOS.CMake/CMakeLists.txt @@ -0,0 +1,114 @@ +cmake_minimum_required(VERSION 3.14) + +get_filename_component(PATH_TO_ROOT "../.." ABSOLUTE) + +project("libHttpClient.iOS") + +set(HC_WEBSOCKETS FALSE) + +add_definitions(-D_NO_ASYNCRTIMP -D_NO_PPLXIMP -D_NO_XSAPIIMP -DXSAPI_BUILD -DHC_LINK_STATIC=1) + +if(HC_WEBSOCKETS) + message(STATUS "websockets usage is on") +else() + message(STATUS "websockets usage is off") + add_definitions(-DHC_NOWEBSOCKETS) +endif() + +########################################### +### Set up paths for source and include ### +########################################### + +include("../libHttpClient.CMake/GetCommonHCSourceFiles.cmake") +get_common_hc_source_files( + PUBLIC_SOURCE_FILES + HC_COMMON_SOURCE_FILES + GLOBAL_SOURCE_FILES + PLATFORM_SOURCE_FILES + WEBSOCKET_SOURCE_FILES + TASK_SOURCE_FILES + MOCK_SOURCE_FILES + HTTP_SOURCE_FILES + LOGGER_SOURCE_FILES + "${PATH_TO_ROOT}" + ) + +set(COMMON_SOURCE_FILES + "${PUBLIC_SOURCE_FILES}" + "${HC_COMMON_SOURCE_FILES}" + "${GLOBAL_SOURCE_FILES}" + "${PLATFORM_SOURCE_FILES}" + "${WEBSOCKET_SOURCE_FILES}" + "${MOCK_SOURCE_FILES}" + "${HTTP_SOURCE_FILES}" + "${LOGGER_SOURCE_FILES}" + "${TASK_SOURCE_FILES}" + ) + +set(IOS_SOURCE_FILES + # Task + "${PATH_TO_ROOT}/Source/Task/ThreadPool_stl.cpp" + "${PATH_TO_ROOT}/Source/Task/WaitTimer_stl.cpp" + "${PATH_TO_ROOT}/Source/Task/iOS/ios_WaitTimer.mm" + "${PATH_TO_ROOT}/Source/Task/iOS/ios_WaitTimer_target.mm" + "${PATH_TO_ROOT}/Source/Task/iOS/ios_WaitTimer_target.h" + "${PATH_TO_ROOT}/Source/Task/iOS/ios_WaitTimerImpl.h" + # HTTP + "${PATH_TO_ROOT}/Source/HTTP/Apple/http_apple.mm" + "${PATH_TO_ROOT}/Source/HTTP/Apple/http_apple.h" + # Common + "${PATH_TO_ROOT}/Source/Common/Apple/utils_apple.mm" + "${PATH_TO_ROOT}/Source/Common/Apple/utils_apple.h" + # Platform + "${PATH_TO_ROOT}/Source/Platform/Apple/PlatformComponents_Apple.cpp" + "${PATH_TO_ROOT}/Source/Platform/Apple/PlatformTrace_Apple.cpp" + ) + +set(COMMON_INCLUDE_DIRS + "${PATH_TO_ROOT}/" + "${PATH_TO_ROOT}/Source/" + "${PATH_TO_ROOT}/Source/Common" + "${PATH_TO_ROOT}/Source/HTTP" + "${PATH_TO_ROOT}/Source/Logger" + "${PATH_TO_ROOT}/Source/Platform" + "${PATH_TO_ROOT}/Source/Task" + "${PATH_TO_ROOT}/Source/WebSocket" + "${PATH_TO_ROOT}/Include" + "${PATH_TO_ROOT}/Include/httpClient" + ) + +######################### +### Set up static lib ### +######################### + +set(ALL_SOURCE_FILES ${COMMON_SOURCE_FILES} ${IOS_SOURCE_FILES}) +list(SORT ALL_SOURCE_FILES) + +add_library( + "${PROJECT_NAME}" + ${ALL_SOURCE_FILES} + ) + +target_include_directories( + "${PROJECT_NAME}" + PRIVATE + "${COMMON_INCLUDE_DIRS}" + ) + +set_target_properties( + "${PROJECT_NAME}" + PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED ON + ) + +set(IOS_MM_SOURCE_FILES + "${PATH_TO_ROOT}/Source/Task/iOS/ios_WaitTimer.mm" + "${PATH_TO_ROOT}/Source/Task/iOS/ios_WaitTimer_target.mm" + "${PATH_TO_ROOT}/Source/HTTP/Apple/http_apple.mm" + "${PATH_TO_ROOT}/Source/Common/Apple/utils_apple.mm" + ) +set_source_files_properties(${IOS_MM_SOURCE_FILES} PROPERTIES COMPILE_FLAGS "-fobjc-arc") + +message(STATUS "CMAKE_SYSTEM_VERSION='${CMAKE_SYSTEM_VERSION}'") +message(STATUS "CMAKE_SYSTEM_NAME='${CMAKE_SYSTEM_NAME}'") diff --git a/Source/Task/iOS/ios_WaitTimer.mm b/Source/Task/iOS/ios_WaitTimer.mm index 8ddc5d19..53257ebe 100644 --- a/Source/Task/iOS/ios_WaitTimer.mm +++ b/Source/Task/iOS/ios_WaitTimer.mm @@ -27,6 +27,9 @@ uint64_t DueTimeFromDeadline(Deadline deadline) noexcept } } +namespace OS +{ + WaitTimerImpl::WaitTimerImpl() : m_context(nullptr), m_callback(nullptr), @@ -97,7 +100,7 @@ uint64_t DueTimeFromDeadline(Deadline deadline) noexcept HRESULT WaitTimer::Initialize(_In_opt_ void* context, _In_ WaitTimerCallback* callback) noexcept { - if (m_impl != nullptr || callback == nullptr) + if (m_impl.load() != nullptr || callback == nullptr) { ASSERT(false); return E_UNEXPECTED; @@ -124,12 +127,12 @@ uint64_t DueTimeFromDeadline(Deadline deadline) noexcept void WaitTimer::Start(_In_ uint64_t dueTime) noexcept { - m_impl->Start(dueTime); + m_impl.load()->Start(dueTime); } void WaitTimer::Cancel() noexcept { - m_impl->Cancel(); + m_impl.load()->Cancel(); } uint64_t WaitTimer::GetCurrentTime() noexcept @@ -142,3 +145,5 @@ uint64_t DueTimeFromDeadline(Deadline deadline) noexcept auto deadline = Clock::now() + std::chrono::milliseconds(msFromNow); return DueTimeFromDeadline(deadline); } + +} // namespace OS diff --git a/Source/Task/iOS/ios_WaitTimerImpl.h b/Source/Task/iOS/ios_WaitTimerImpl.h index 17c255ec..6220143c 100644 --- a/Source/Task/iOS/ios_WaitTimerImpl.h +++ b/Source/Task/iOS/ios_WaitTimerImpl.h @@ -11,6 +11,9 @@ #include "../WaitTimer.h" #include "ios_WaitTimer_target.h" +namespace OS +{ + class WaitTimerImpl { public: @@ -28,6 +31,8 @@ class WaitTimerImpl NSTimer* m_timer; }; +} // namespace OS + #endif /* ios_WaitTimerImpl_h */ diff --git a/Source/Task/iOS/ios_WaitTimer_target.mm b/Source/Task/iOS/ios_WaitTimer_target.mm index 06979cfc..29c23ae6 100644 --- a/Source/Task/iOS/ios_WaitTimer_target.mm +++ b/Source/Task/iOS/ios_WaitTimer_target.mm @@ -13,7 +13,7 @@ @implementation ios_WaitTimer_target - (void)timerFireMethod:(NSTimer*)timer { auto value = (NSValue*)timer.userInfo; - auto impl = static_cast(value.pointerValue); + auto impl = static_cast(value.pointerValue); impl->TimerFired(); } diff --git a/Utilities/Pipelines/Tasks/ios-build.yml b/Utilities/Pipelines/Tasks/ios-build.yml index f57d2c99..d4d8748d 100644 --- a/Utilities/Pipelines/Tasks/ios-build.yml +++ b/Utilities/Pipelines/Tasks/ios-build.yml @@ -4,8 +4,19 @@ parameters: steps: - template: checkout.yml - - - task: Xcode@2 + + # Build the CMake static lib + - script: | + cmake -B Build/libHttpClient.iOS.CMake/build \ + -S Build/libHttpClient.iOS.CMake \ + -DCMAKE_SYSTEM_NAME=iOS \ + -DCMAKE_OSX_ARCHITECTURES=arm64 \ + -DCMAKE_BUILD_TYPE=${{ parameters.configuration }} + cmake --build Build/libHttpClient.iOS.CMake/build --config ${{ parameters.configuration }} + displayName: 'Clean build iOS CMake static lib' + + # Build libHttpClient.Apple.C configurations + - task: Xcode@5 displayName: 'Clean build iOS static lib' inputs: actions: 'clean build' @@ -14,9 +25,8 @@ steps: xcWorkspacePath: Build/libHttpClient.Apple.C/libHttpClient.xcworkspace scheme: 'libHttpClient_iOS' packageApp: false - useXctool: false - - task: Xcode@2 + - task: Xcode@5 displayName: 'Clean build iOS framework' inputs: actions: 'clean build' @@ -25,9 +35,8 @@ steps: xcWorkspacePath: Build/libHttpClient.Apple.C/libHttpClient.xcworkspace scheme: 'libHttpClientFramework_iOS' packageApp: false - useXctool: false - - task: Xcode@2 + - task: Xcode@5 displayName: 'Clean build iOS_NOWEBSOCKETS static lib' inputs: actions: 'clean build' @@ -36,9 +45,8 @@ steps: xcWorkspacePath: Build/libHttpClient.Apple.C/libHttpClient.xcworkspace scheme: 'libHttpClient_NOWEBSOCKETS_iOS' packageApp: false - useXctool: false - - task: Xcode@2 + - task: Xcode@5 displayName: 'Clean build iOS_NOWEBSOCKETS framework' inputs: actions: 'clean build' @@ -47,9 +55,8 @@ steps: xcWorkspacePath: Build/libHttpClient.Apple.C/libHttpClient.xcworkspace scheme: 'libHttpClientFramework_NOWEBSOCKETS_iOS' packageApp: false - useXctool: false - - task: Xcode@2 + - task: Xcode@5 displayName: 'Clean build macOS static lib' inputs: actions: 'clean build' @@ -58,9 +65,8 @@ steps: xcWorkspacePath: Build/libHttpClient.Apple.C/libHttpClient.xcworkspace scheme: 'libHttpClient_macOS' packageApp: false - useXctool: false - - task: Xcode@2 + - task: Xcode@5 displayName: 'Clean build macOS framework' inputs: actions: 'clean build' @@ -69,9 +75,8 @@ steps: xcWorkspacePath: Build/libHttpClient.Apple.C/libHttpClient.xcworkspace scheme: 'libHttpClientFramework_macOS' packageApp: false - useXctool: false - - task: Xcode@2 + - task: Xcode@5 displayName: 'Clean build macOS_NOWEBSOCKETS static lib' inputs: actions: 'clean build' @@ -80,9 +85,8 @@ steps: xcWorkspacePath: Build/libHttpClient.Apple.C/libHttpClient.xcworkspace scheme: 'libHttpClient_NOWEBSOCKETS_macOS' packageApp: false - useXctool: false - - task: Xcode@2 + - task: Xcode@5 displayName: 'Clean build macOS_NOWEBSOCKETS framework' inputs: actions: 'clean build' @@ -91,4 +95,4 @@ steps: xcWorkspacePath: Build/libHttpClient.Apple.C/libHttpClient.xcworkspace scheme: 'libHttpClientFramework_NOWEBSOCKETS_macOS' packageApp: false - useXctool: false +