From b4fd612122f1c3cb27b42752f9c8aaaa8c7992af Mon Sep 17 00:00:00 2001 From: abigt Date: Fri, 28 Apr 2017 13:13:27 +0800 Subject: [PATCH 01/56] add iOS Lib --- CMakeCache.txt | 320 ++++++++++ CMakeFiles/3.7.2/CMakeCCompiler.cmake | 68 +++ CMakeFiles/3.7.2/CMakeCXXCompiler.cmake | 69 +++ .../3.7.2/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 4304 bytes .../3.7.2/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 4288 bytes CMakeFiles/3.7.2/CMakeSystem.cmake | 15 + .../3.7.2/CompilerIdC/CMakeCCompilerId.c | 561 +++++++++++++++++ CMakeFiles/3.7.2/CompilerIdC/a.out | Bin 0 -> 8616 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 533 ++++++++++++++++ CMakeFiles/3.7.2/CompilerIdCXX/a.out | Bin 0 -> 8600 bytes CMakeFiles/CMakeDirectoryInformation.cmake | 16 + CMakeFiles/CMakeOutput.log | 461 ++++++++++++++ CMakeFiles/Makefile.cmake | 121 ++++ CMakeFiles/Makefile2 | 145 +++++ CMakeFiles/TargetDirectories.txt | 4 + CMakeFiles/cmake.check_cache | 1 + CMakeFiles/feature_tests.bin | Bin 0 -> 8376 bytes CMakeFiles/feature_tests.c | 34 ++ CMakeFiles/feature_tests.cxx | 405 +++++++++++++ CMakeFiles/fec_test.dir/C.includecache | 42 ++ CMakeFiles/fec_test.dir/CXX.includecache | 156 +++++ CMakeFiles/fec_test.dir/DependInfo.cmake | 37 ++ CMakeFiles/fec_test.dir/build.make | 356 +++++++++++ CMakeFiles/fec_test.dir/cmake_clean.cmake | 19 + CMakeFiles/fec_test.dir/depend.internal | 60 ++ CMakeFiles/fec_test.dir/depend.make | 60 ++ CMakeFiles/fec_test.dir/flags.make | 17 + CMakeFiles/fec_test.dir/link.txt | 1 + CMakeFiles/fec_test.dir/progress.make | 12 + CMakeFiles/kcp_test.dir/C.includecache | 42 ++ CMakeFiles/kcp_test.dir/CXX.includecache | 160 +++++ CMakeFiles/kcp_test.dir/DependInfo.cmake | 37 ++ CMakeFiles/kcp_test.dir/build.make | 356 +++++++++++ CMakeFiles/kcp_test.dir/cmake_clean.cmake | 19 + CMakeFiles/kcp_test.dir/depend.internal | 62 ++ CMakeFiles/kcp_test.dir/depend.make | 62 ++ CMakeFiles/kcp_test.dir/flags.make | 17 + CMakeFiles/kcp_test.dir/link.txt | 1 + CMakeFiles/kcp_test.dir/progress.make | 12 + CMakeFiles/progress.marks | 1 + Makefile | 519 ++++++++++++++++ cmake_install.cmake | 39 ++ fec_test | Bin 0 -> 275524 bytes iOSLib/libkcp/kcptest/AppDelegate.h | 17 + iOSLib/libkcp/kcptest/AppDelegate.mm | 51 ++ .../AppIcon.appiconset/Contents.json | 38 ++ .../Base.lproj/LaunchScreen.storyboard | 27 + .../libkcp/kcptest/Base.lproj/Main.storyboard | 66 ++ iOSLib/libkcp/kcptest/Info.plist | 38 ++ iOSLib/libkcp/kcptest/ViewController.h | 15 + iOSLib/libkcp/kcptest/ViewController.mm | 38 ++ iOSLib/libkcp/kcptest/main.m | 16 + iOSLib/libkcp/kcptest/test.h | 13 + .../libkcp/libkcp.xcodeproj/project.pbxproj | 573 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 22718 bytes .../xcschemes/libkcp.xcscheme | 80 +++ .../xcschemes/xcschememanagement.plist | 32 + iOSLib/libkcp/libkcp/Info.plist | 24 + iOSLib/libkcp/libkcp/libkcp.h | 19 + kcp_test | Bin 0 -> 252020 bytes kcp_test.cpp => kcp_test.mm | 5 +- 62 files changed, 5897 insertions(+), 2 deletions(-) create mode 100644 CMakeCache.txt create mode 100644 CMakeFiles/3.7.2/CMakeCCompiler.cmake create mode 100644 CMakeFiles/3.7.2/CMakeCXXCompiler.cmake create mode 100755 CMakeFiles/3.7.2/CMakeDetermineCompilerABI_C.bin create mode 100755 CMakeFiles/3.7.2/CMakeDetermineCompilerABI_CXX.bin create mode 100644 CMakeFiles/3.7.2/CMakeSystem.cmake create mode 100644 CMakeFiles/3.7.2/CompilerIdC/CMakeCCompilerId.c create mode 100755 CMakeFiles/3.7.2/CompilerIdC/a.out create mode 100644 CMakeFiles/3.7.2/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 CMakeFiles/3.7.2/CompilerIdCXX/a.out create mode 100644 CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 CMakeFiles/CMakeOutput.log create mode 100644 CMakeFiles/Makefile.cmake create mode 100644 CMakeFiles/Makefile2 create mode 100644 CMakeFiles/TargetDirectories.txt create mode 100644 CMakeFiles/cmake.check_cache create mode 100755 CMakeFiles/feature_tests.bin create mode 100644 CMakeFiles/feature_tests.c create mode 100644 CMakeFiles/feature_tests.cxx create mode 100644 CMakeFiles/fec_test.dir/C.includecache create mode 100644 CMakeFiles/fec_test.dir/CXX.includecache create mode 100644 CMakeFiles/fec_test.dir/DependInfo.cmake create mode 100644 CMakeFiles/fec_test.dir/build.make create mode 100644 CMakeFiles/fec_test.dir/cmake_clean.cmake create mode 100644 CMakeFiles/fec_test.dir/depend.internal create mode 100644 CMakeFiles/fec_test.dir/depend.make create mode 100644 CMakeFiles/fec_test.dir/flags.make create mode 100644 CMakeFiles/fec_test.dir/link.txt create mode 100644 CMakeFiles/fec_test.dir/progress.make create mode 100644 CMakeFiles/kcp_test.dir/C.includecache create mode 100644 CMakeFiles/kcp_test.dir/CXX.includecache create mode 100644 CMakeFiles/kcp_test.dir/DependInfo.cmake create mode 100644 CMakeFiles/kcp_test.dir/build.make create mode 100644 CMakeFiles/kcp_test.dir/cmake_clean.cmake create mode 100644 CMakeFiles/kcp_test.dir/depend.internal create mode 100644 CMakeFiles/kcp_test.dir/depend.make create mode 100644 CMakeFiles/kcp_test.dir/flags.make create mode 100644 CMakeFiles/kcp_test.dir/link.txt create mode 100644 CMakeFiles/kcp_test.dir/progress.make create mode 100644 CMakeFiles/progress.marks create mode 100644 Makefile create mode 100644 cmake_install.cmake create mode 100755 fec_test create mode 100644 iOSLib/libkcp/kcptest/AppDelegate.h create mode 100644 iOSLib/libkcp/kcptest/AppDelegate.mm create mode 100644 iOSLib/libkcp/kcptest/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 iOSLib/libkcp/kcptest/Base.lproj/LaunchScreen.storyboard create mode 100644 iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard create mode 100644 iOSLib/libkcp/kcptest/Info.plist create mode 100644 iOSLib/libkcp/kcptest/ViewController.h create mode 100644 iOSLib/libkcp/kcptest/ViewController.mm create mode 100644 iOSLib/libkcp/kcptest/main.m create mode 100644 iOSLib/libkcp/kcptest/test.h create mode 100644 iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj create mode 100644 iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/libkcp.xcscheme create mode 100644 iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 iOSLib/libkcp/libkcp/Info.plist create mode 100644 iOSLib/libkcp/libkcp/libkcp.h create mode 100755 kcp_test rename kcp_test.cpp => kcp_test.mm (91%) diff --git a/CMakeCache.txt b/CMakeCache.txt new file mode 100644 index 0000000..e65ed1f --- /dev/null +++ b/CMakeCache.txt @@ -0,0 +1,320 @@ +# This is the CMakeCache file. +# For build in directory: /Users/yarshure/github/libkcp +# It was generated by CMake: /usr/local/Cellar/cmake/3.7.2/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_AR:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar + +//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or +// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. +CMAKE_BUILD_TYPE:STRING= + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release builds for minimum +// size. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during release builds with debug info. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release builds for minimum +// size. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during release builds with debug info. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//Path to a program. +CMAKE_INSTALL_NAME_TOOL:FILEPATH=/usr/bin/install_name_tool + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=CMAKE_OBJCOPY-NOTFOUND + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/objdump + +//Build architectures for OSX +CMAKE_OSX_ARCHITECTURES:STRING= + +//Minimum OS X version to target for deployment (at runtime); newer +// APIs weak linked. Set to empty string for default value. +CMAKE_OSX_DEPLOYMENT_TARGET:STRING= + +//The product will be built against the headers and libraries located +// inside the indicated SDK. +CMAKE_OSX_SYSROOT:STRING= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=kcp + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +kcp_BINARY_DIR:STATIC=/Users/yarshure/github/libkcp + +//Value Computed by CMake +kcp_SOURCE_DIR:STATIC=/Users/yarshure/github/libkcp + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/yarshure/github/libkcp +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=7 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.7.2/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.7.2/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.7.2/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.7.2/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=Unknown +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/yarshure/github/libkcp +//ADVANCED property for variable: CMAKE_INSTALL_NAME_TOOL +CMAKE_INSTALL_NAME_TOOL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/local/Cellar/cmake/3.7.2/share/cmake +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 + diff --git a/CMakeFiles/3.7.2/CMakeCCompiler.cmake b/CMakeFiles/3.7.2/CMakeCCompiler.cmake new file mode 100644 index 0000000..2752e33 --- /dev/null +++ b/CMakeFiles/3.7.2/CMakeCCompiler.cmake @@ -0,0 +1,68 @@ +set(CMAKE_C_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "AppleClang") +set(CMAKE_C_COMPILER_VERSION "8.1.0.8020042") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") +set(CMAKE_C_COMPILE_FEATURES "c_function_prototypes;c_restrict;c_variadic_macros;c_static_assert") +set(CMAKE_C90_COMPILE_FEATURES "c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_static_assert") + +set(CMAKE_C_PLATFORM_ID "Darwin") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_SIMULATE_VERSION "") + +set(CMAKE_AR "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar") +set(CMAKE_RANLIB "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib") +set(CMAKE_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "") +set(CMAKE_C_LIBRARY_ARCHITECTURE "") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "to_library") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib;/usr/local/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "/Library/Frameworks;/System/Library/Frameworks") diff --git a/CMakeFiles/3.7.2/CMakeCXXCompiler.cmake b/CMakeFiles/3.7.2/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..e43dde9 --- /dev/null +++ b/CMakeFiles/3.7.2/CMakeCXXCompiler.cmake @@ -0,0 +1,69 @@ +set(CMAKE_CXX_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "AppleClang") +set(CMAKE_CXX_COMPILER_VERSION "8.1.0.8020042") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "98") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_template_template_parameters;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") + +set(CMAKE_CXX_PLATFORM_ID "Darwin") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_SIMULATE_VERSION "") + +set(CMAKE_AR "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar") +set(CMAKE_RANLIB "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib") +set(CMAKE_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "to_library;c++") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib;/usr/local/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "/Library/Frameworks;/System/Library/Frameworks") diff --git a/CMakeFiles/3.7.2/CMakeDetermineCompilerABI_C.bin b/CMakeFiles/3.7.2/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..1db4a23d7e5b27d1cfb342ce7a3791f081f3cea2 GIT binary patch literal 4304 zcmeHK&ubGw6rME}MT@BitKzR9BGp3@h}E?8pyKKVr7c>aC}rAYw{)S|NV1Eq5GbOD zAVLrR0sS*Pc@gPRPoDMQErJ)JsEFS;osijT{R`&7w{N~TGjHB}vzPb&$JgKcgm5xK ztnCp(90Eo_o{JntLL3J?K+5TBx7-Kr-6=-X=A`LA8S|8}P|6v1b|$?2Dtbv|lJBd6}WSzrG~D=#$b->-9k=qHbzl^Rsy0;%Ep z^X2bP^JAmW#t$F;IX3(59AYR58xJU4>~Y3mBe*a3@%>HXIc0!zyrWb4i0e81vvK~t z)m9wT^VjpJBdlT(>^#8pJbd=UU(lTTShEUP1*`&A0jq#jz$#!BunJfOtO8WvzSsHU zy&M?DaMS(8NT!wvEZ%&Q3!Y4svQTmVK z=EGunj{Deao#X&!diFHzc`m^duXO*zF?+N@>>N_NL72vo=&v)fz9fT{pq9jeTnZNa zpeaiAg)kCV*vCqv05QQMGUC%|d^XOgEck#b<7C#^Zi-mrFgb#~J{o-)=C^C)d>(-3 fP+1Ng^xw6pZaP(kRMoLjl&v_a$|`zp6fOP$MvIg) literal 0 HcmV?d00001 diff --git a/CMakeFiles/3.7.2/CMakeDetermineCompilerABI_CXX.bin b/CMakeFiles/3.7.2/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..668e09ec93ff64a450ae86cc03b406f9da400167 GIT binary patch literal 4288 zcmeHKO=}ZT6n&E#6fI3RilRsq6}6ZTq7tMV#nA*yTeL!{lxver=|GccGJ|O$P!JbE z1Q-4QH~t1)6+tCScdp&IDG^*25%HXt7c$eTxR$wa=Dzdh-uv!5Z*@O@|N3*UQr3u4 z8!@F+0+**2yDKWX_(S3y0|Z@$jB99KESH zfR?n0cuvbR1a4=&`?vt>>$T>v;Ldt4O}&FAi9A#DXO=;xR{ZBU3f2ufr%f4P5Xa{{lx*5IRnnKh~|2O<3-Zx{`e|4zC zIQDcH$b<8~EqL~P0GI`6tWPkO?-M)^^q*`DQAuDFNc+u3detqZD{HG2aN1FTeM~-% zsSgjc-B+(=ee?a+)+y|vB_!_GI6vUrgPp~FnaB4J8qdi9{HJw~=g_t_JR9eiCni$a z6q;~Ly03g7-pYM~9O3voYfaCormmS3L@RX$V1F5W_Q9VsoO(tUDG(_TDG(_TDG(_T zDG(_TDG({}e=2ad(D_n$7Qcksb?qO#W2e1c==k5dc8{!3_O}z8lbMlruhZ^5wR?;2 zo(HWsePiZI(_MG!%TjsZHST5di_GJ!b&LyG&~v8Y%ySW*cwy!rt~sNPB6D14gRqPx zn6G0}T@k0{lzq>U6=$j9G}MXel3P=!`@`Mm<2qca!Quk=82%0BV}>QH{&2(I4r$)+ pWzZ`;!?YzaDepd0^qCz0r0Mx3DPfXED$ literal 0 HcmV?d00001 diff --git a/CMakeFiles/3.7.2/CMakeSystem.cmake b/CMakeFiles/3.7.2/CMakeSystem.cmake new file mode 100644 index 0000000..b6273c9 --- /dev/null +++ b/CMakeFiles/3.7.2/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-16.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "16.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Darwin-16.5.0") +set(CMAKE_SYSTEM_NAME "Darwin") +set(CMAKE_SYSTEM_VERSION "16.5.0") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/CMakeFiles/3.7.2/CompilerIdC/CMakeCCompilerId.c b/CMakeFiles/3.7.2/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..512e360 --- /dev/null +++ b/CMakeFiles/3.7.2/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,561 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +#elif defined(__ARMCC_VERSION) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(SDCC) +# define COMPILER_ID "SDCC" + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +#if !defined(__STDC__) +# if defined(_MSC_VER) && !defined(__clang__) +# define C_DIALECT "90" +# else +# define C_DIALECT +# endif +#elif __STDC_VERSION__ >= 201000L +# define C_DIALECT "11" +#elif __STDC_VERSION__ >= 199901L +# define C_DIALECT "99" +#else +# define C_DIALECT "90" +#endif +const char* info_language_dialect_default = + "INFO" ":" "dialect_default[" C_DIALECT "]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/CMakeFiles/3.7.2/CompilerIdC/a.out b/CMakeFiles/3.7.2/CompilerIdC/a.out new file mode 100755 index 0000000000000000000000000000000000000000..8f4b949454a3b7a59ff926504372b9f4158751d9 GIT binary patch literal 8616 zcmeHNO-vI(6rQyZ8bqiU#rTs#jKQBki!+XJ ze>X9vg&12tz!+CQwaOM!qmW)<&bDNPZeCp%Faq-eY~R} zgyK!gal*AioYe~A<+6opg7xw8GTv3`L^zONZ7}pXFJ|YhY?@oynVi5u{@%!Vv_~X_ z>vQr(yeI9$I+XLlfr){d5%3+@2Y)|m_5o+an<@5DKdQ7_6^SXlOcgfU*m5OLKGeF;qSqa8S>Xb(ci zptVA4)vs4O{rHJ?TX|4NP(zN_lL4cz5~B{p;z~AI)EzR$je5 z4I8L~W3$k6J|-Ka3-3#Qbk1vq*6D}R7`>x*aTCW(tFDdp#}^B(nd!dKjXbPrOoE(& z(t7JrkB_qw6F*861BwB~fMP%~pcqgLCbP5*nrf8mVO|MLS z93HtfdL@<1FyJaWtcVgYK{#b7;*4GPnq{&W*D8ZI~-_!5^ zKD4Cm_y#1QK7Dhwz%wGe$y)6Y@V{^4@;h=!w&Sv;IZ6}*iUGxdVn8vV7*Gr-1{4E| z0mXn~Krx^g_`exA+{wI3tHx1h5An<#Hy6xQ(KY#;X{1eub!7}I%Pvs;nX@?EHH29C zB&zcA@`5@3bq1UF??u=Xx(i`XHM%n?8nY&^yANT{@sES8QwX&j#bcEoWqMHEk%U$t zq4nA{Q2`Yf7e@%=4*?OF=su)FVk%k^j!E1u@u>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +#elif defined(__ARMCC_VERSION) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if __cplusplus >= 201402L + "14" +#elif __cplusplus >= 201103L + "11" +#else + "98" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} diff --git a/CMakeFiles/3.7.2/CompilerIdCXX/a.out b/CMakeFiles/3.7.2/CompilerIdCXX/a.out new file mode 100755 index 0000000000000000000000000000000000000000..ef0a248268f3fb0643430b9956610b2f10528912 GIT binary patch literal 8600 zcmeHN&ubG=5S|#TrPj9oL{VWCk!mGPT7~)pw6)O$wJlmf4E3>1w(Y`Z6F0kR4~6s~ zw20ubNB;m1f_E<>o>aW}ABdMK9*c(_W8$V zqC}FYzJZ8(pyxLdJs<-!qP@@@REUY;OW9l5YvXKfmP9lBBjP+ua1>%PdvmhcMaJ`m zj=^WeMgg!F9Wcp?!e!YA~n@cC6R2#9ZxxJ~l%Co`cw@z+0dbP!`V5 zx(V8PJ(&JVunoB+>V)K)QzI$_-b6>BT;Gxr@^@5W=2MGiKr^5j&Gy|Fe&46a$Um3WOTmG1P z)beS2p*v0YF#Y(wqJC;`%u2voEf@8X~QzTcaj_J=-ymDdG^zdP( ztfp6-E2w$NHXW+_k)#U2zNPP=-=!l8GkiRC*{qkWQZ% zKn~PO`&FL!$nW?3{(k}^>kfPavhbY0xjGTqBcs{cm@tUGZ;z|*$PqP;sgZrOXa+O` zngPv#W*$PxW}`C^a`+sC?(lI*V9r{i99^Jwuw_KC7 zVubv0MwS5Dg+q&|PtMotPRI_ZJh<4+7=H-pfr-yU4l2w|NXBV}_b5EBaJ#~{8N)I9 zp8)q?0cDF6Q!>yQ|D6NbeHZfP!s)Mj58=8u94`OjM@TNY?JH`2FfFFh*$2f!+`5t( KkPNF6A^Hh<6cfS# literal 0 HcmV?d00001 diff --git a/CMakeFiles/CMakeDirectoryInformation.cmake b/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..8cf784e --- /dev/null +++ b/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/yarshure/github/libkcp") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/yarshure/github/libkcp") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/CMakeFiles/CMakeOutput.log b/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000..96c37ee --- /dev/null +++ b/CMakeFiles/CMakeOutput.log @@ -0,0 +1,461 @@ +The system is: Darwin - 16.5.0 - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + +The C compiler identification is AppleClang, found in "/Users/yarshure/github/libkcp/CMakeFiles/3.7.2/CompilerIdC/a.out" + +Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. +Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + +The CXX compiler identification is AppleClang, found in "/Users/yarshure/github/libkcp/CMakeFiles/3.7.2/CompilerIdCXX/a.out" + +Determining if the C compiler works passed with the following output: +Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_9cba1/fast" +/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_9cba1.dir/build.make CMakeFiles/cmTC_9cba1.dir/build +Building C object CMakeFiles/cmTC_9cba1.dir/testCCompiler.c.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -o CMakeFiles/cmTC_9cba1.dir/testCCompiler.c.o -c /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp/testCCompiler.c +Linking C executable cmTC_9cba1 +/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_9cba1.dir/link.txt --verbose=1 +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_9cba1.dir/testCCompiler.c.o -o cmTC_9cba1 + + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_f90ea/fast" +/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_f90ea.dir/build.make CMakeFiles/cmTC_f90ea.dir/build +Building C object CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -o CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -c /usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCCompilerABI.c +Linking C executable cmTC_f90ea +/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_f90ea.dir/link.txt --verbose=1 +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -o cmTC_f90ea +Apple LLVM version 8.1.0 (clang-802.0.42) +Target: x86_64-apple-darwin16.5.0 +Thread model: posix +InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o cmTC_f90ea -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a +@(#)PROGRAM:ld PROJECT:ld64-278.4 +configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS) +Library search paths: + /usr/lib + /usr/local/lib +Framework search paths: + /Library/Frameworks/ + /System/Library/Frameworks/ + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:"/usr/bin/make" "cmTC_f90ea/fast"] + ignore line: [/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_f90ea.dir/build.make CMakeFiles/cmTC_f90ea.dir/build] + ignore line: [Building C object CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o] + ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -o CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -c /usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCCompilerABI.c] + ignore line: [Linking C executable cmTC_f90ea] + ignore line: [/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_f90ea.dir/link.txt --verbose=1] + ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -o cmTC_f90ea ] + ignore line: [Apple LLVM version 8.1.0 (clang-802.0.42)] + ignore line: [Target: x86_64-apple-darwin16.5.0] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] + link line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o cmTC_f90ea -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld] ==> ignore + arg [-demangle] ==> ignore + arg [-lto_library] ==> lib [to_library] + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib] ==> ignore + arg [-dynamic] ==> ignore + arg [-arch] ==> ignore + arg [x86_64] ==> ignore + arg [-macosx_version_min] ==> ignore + arg [10.12.0] ==> ignore + arg [-o] ==> ignore + arg [cmTC_f90ea] ==> ignore + arg [-search_paths_first] ==> ignore + arg [-headerpad_max_install_names] ==> ignore + arg [-v] ==> ignore + arg [CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lSystem] ==> lib [System] + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] ==> lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] + Library search paths: [;/usr/lib;/usr/local/lib] + Framework search paths: [;/Library/Frameworks/;/System/Library/Frameworks/] + remove lib [System] + remove lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] + collapse library dir [/usr/lib] ==> [/usr/lib] + collapse library dir [/usr/local/lib] ==> [/usr/local/lib] + collapse framework dir [/Library/Frameworks/] ==> [/Library/Frameworks] + collapse framework dir [/System/Library/Frameworks/] ==> [/System/Library/Frameworks] + implicit libs: [to_library] + implicit dirs: [/usr/lib;/usr/local/lib] + implicit fwks: [/Library/Frameworks;/System/Library/Frameworks] + + + + +Detecting C [-std=c11] compiler features compiled with the following output: +Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_b4dde/fast" +/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_b4dde.dir/build.make CMakeFiles/cmTC_b4dde.dir/build +Building C object CMakeFiles/cmTC_b4dde.dir/feature_tests.c.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -std=c11 -o CMakeFiles/cmTC_b4dde.dir/feature_tests.c.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.c +Linking C executable cmTC_b4dde +/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b4dde.dir/link.txt --verbose=1 +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_b4dde.dir/feature_tests.c.o -o cmTC_b4dde + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:1c_restrict + Feature record: C_FEATURE:1c_static_assert + Feature record: C_FEATURE:1c_variadic_macros + + +Detecting C [-std=c99] compiler features compiled with the following output: +Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_e0b19/fast" +/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_e0b19.dir/build.make CMakeFiles/cmTC_e0b19.dir/build +Building C object CMakeFiles/cmTC_e0b19.dir/feature_tests.c.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -std=c99 -o CMakeFiles/cmTC_e0b19.dir/feature_tests.c.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.c +Linking C executable cmTC_e0b19 +/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_e0b19.dir/link.txt --verbose=1 +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_e0b19.dir/feature_tests.c.o -o cmTC_e0b19 + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:1c_restrict + Feature record: C_FEATURE:0c_static_assert + Feature record: C_FEATURE:1c_variadic_macros + + +Detecting C [-std=c90] compiler features compiled with the following output: +Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_b8bf4/fast" +/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_b8bf4.dir/build.make CMakeFiles/cmTC_b8bf4.dir/build +Building C object CMakeFiles/cmTC_b8bf4.dir/feature_tests.c.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -std=c90 -o CMakeFiles/cmTC_b8bf4.dir/feature_tests.c.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.c +Linking C executable cmTC_b8bf4 +/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b8bf4.dir/link.txt --verbose=1 +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_b8bf4.dir/feature_tests.c.o -o cmTC_b8bf4 + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:0c_restrict + Feature record: C_FEATURE:0c_static_assert + Feature record: C_FEATURE:0c_variadic_macros +Determining if the CXX compiler works passed with the following output: +Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_c9ce8/fast" +/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_c9ce8.dir/build.make CMakeFiles/cmTC_c9ce8.dir/build +Building CXX object CMakeFiles/cmTC_c9ce8.dir/testCXXCompiler.cxx.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -o CMakeFiles/cmTC_c9ce8.dir/testCXXCompiler.cxx.o -c /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp/testCXXCompiler.cxx +Linking CXX executable cmTC_c9ce8 +/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_c9ce8.dir/link.txt --verbose=1 +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_c9ce8.dir/testCXXCompiler.cxx.o -o cmTC_c9ce8 + + +Detecting CXX compiler ABI info compiled with the following output: +Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_1365c/fast" +/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_1365c.dir/build.make CMakeFiles/cmTC_1365c.dir/build +Building CXX object CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -o CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -c /usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCXXCompilerABI.cpp +Linking CXX executable cmTC_1365c +/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_1365c.dir/link.txt --verbose=1 +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_1365c +Apple LLVM version 8.1.0 (clang-802.0.42) +Target: x86_64-apple-darwin16.5.0 +Thread model: posix +InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o cmTC_1365c -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a +@(#)PROGRAM:ld PROJECT:ld64-278.4 +configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS) +Library search paths: + /usr/lib + /usr/local/lib +Framework search paths: + /Library/Frameworks/ + /System/Library/Frameworks/ + + +Parsed CXX implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:"/usr/bin/make" "cmTC_1365c/fast"] + ignore line: [/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_1365c.dir/build.make CMakeFiles/cmTC_1365c.dir/build] + ignore line: [Building CXX object CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -o CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -c /usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Linking CXX executable cmTC_1365c] + ignore line: [/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_1365c.dir/link.txt --verbose=1] + ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_1365c ] + ignore line: [Apple LLVM version 8.1.0 (clang-802.0.42)] + ignore line: [Target: x86_64-apple-darwin16.5.0] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] + link line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o cmTC_1365c -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld] ==> ignore + arg [-demangle] ==> ignore + arg [-lto_library] ==> lib [to_library] + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib] ==> ignore + arg [-dynamic] ==> ignore + arg [-arch] ==> ignore + arg [x86_64] ==> ignore + arg [-macosx_version_min] ==> ignore + arg [10.12.0] ==> ignore + arg [-o] ==> ignore + arg [cmTC_1365c] ==> ignore + arg [-search_paths_first] ==> ignore + arg [-headerpad_max_install_names] ==> ignore + arg [-v] ==> ignore + arg [CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lc++] ==> lib [c++] + arg [-lSystem] ==> lib [System] + arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] ==> lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] + Library search paths: [;/usr/lib;/usr/local/lib] + Framework search paths: [;/Library/Frameworks/;/System/Library/Frameworks/] + remove lib [System] + remove lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] + collapse library dir [/usr/lib] ==> [/usr/lib] + collapse library dir [/usr/local/lib] ==> [/usr/local/lib] + collapse framework dir [/Library/Frameworks/] ==> [/Library/Frameworks] + collapse framework dir [/System/Library/Frameworks/] ==> [/System/Library/Frameworks] + implicit libs: [to_library;c++] + implicit dirs: [/usr/lib;/usr/local/lib] + implicit fwks: [/Library/Frameworks;/System/Library/Frameworks] + + + + +Detecting CXX [-std=c++14] compiler features compiled with the following output: +Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_6dabf/fast" +/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_6dabf.dir/build.make CMakeFiles/cmTC_6dabf.dir/build +Building CXX object CMakeFiles/cmTC_6dabf.dir/feature_tests.cxx.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -std=c++14 -o CMakeFiles/cmTC_6dabf.dir/feature_tests.cxx.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_6dabf +/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_6dabf.dir/link.txt --verbose=1 +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_6dabf.dir/feature_tests.cxx.o -o cmTC_6dabf + + + Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:1cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:1cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:1cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:1cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:1cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:1cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:1cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:1cxx_relaxed_constexpr + Feature record: CXX_FEATURE:1cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:1cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++11] compiler features compiled with the following output: +Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_e392e/fast" +/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_e392e.dir/build.make CMakeFiles/cmTC_e392e.dir/build +Building CXX object CMakeFiles/cmTC_e392e.dir/feature_tests.cxx.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -std=c++11 -o CMakeFiles/cmTC_e392e.dir/feature_tests.cxx.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_e392e +/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_e392e.dir/link.txt --verbose=1 +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_e392e.dir/feature_tests.cxx.o -o cmTC_e392e + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++98] compiler features compiled with the following output: +Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_d3a6b/fast" +/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_d3a6b.dir/build.make CMakeFiles/cmTC_d3a6b.dir/build +Building CXX object CMakeFiles/cmTC_d3a6b.dir/feature_tests.cxx.o +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -std=c++98 -o CMakeFiles/cmTC_d3a6b.dir/feature_tests.cxx.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_d3a6b +/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d3a6b.dir/link.txt --verbose=1 +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_d3a6b.dir/feature_tests.cxx.o -o cmTC_d3a6b + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:0cxx_alias_templates + Feature record: CXX_FEATURE:0cxx_alignas + Feature record: CXX_FEATURE:0cxx_alignof + Feature record: CXX_FEATURE:0cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:0cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:0cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:0cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:0cxx_default_function_template_args + Feature record: CXX_FEATURE:0cxx_defaulted_functions + Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:0cxx_delegating_constructors + Feature record: CXX_FEATURE:0cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:0cxx_enum_forward_declarations + Feature record: CXX_FEATURE:0cxx_explicit_conversions + Feature record: CXX_FEATURE:0cxx_extended_friend_declarations + Feature record: CXX_FEATURE:0cxx_extern_templates + Feature record: CXX_FEATURE:0cxx_final + Feature record: CXX_FEATURE:0cxx_func_identifier + Feature record: CXX_FEATURE:0cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:0cxx_inheriting_constructors + Feature record: CXX_FEATURE:0cxx_inline_namespaces + Feature record: CXX_FEATURE:0cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:0cxx_local_type_template_args + Feature record: CXX_FEATURE:0cxx_long_long_type + Feature record: CXX_FEATURE:0cxx_noexcept + Feature record: CXX_FEATURE:0cxx_nonstatic_member_init + Feature record: CXX_FEATURE:0cxx_nullptr + Feature record: CXX_FEATURE:0cxx_override + Feature record: CXX_FEATURE:0cxx_range_for + Feature record: CXX_FEATURE:0cxx_raw_string_literals + Feature record: CXX_FEATURE:0cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:0cxx_right_angle_brackets + Feature record: CXX_FEATURE:0cxx_rvalue_references + Feature record: CXX_FEATURE:0cxx_sizeof_member + Feature record: CXX_FEATURE:0cxx_static_assert + Feature record: CXX_FEATURE:0cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:0cxx_thread_local + Feature record: CXX_FEATURE:0cxx_trailing_return_types + Feature record: CXX_FEATURE:0cxx_unicode_literals + Feature record: CXX_FEATURE:0cxx_uniform_initialization + Feature record: CXX_FEATURE:0cxx_unrestricted_unions + Feature record: CXX_FEATURE:0cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:0cxx_variadic_macros + Feature record: CXX_FEATURE:0cxx_variadic_templates diff --git a/CMakeFiles/Makefile.cmake b/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000..16e2544 --- /dev/null +++ b/CMakeFiles/Makefile.cmake @@ -0,0 +1,121 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +# The generator used is: +set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +set(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "CMakeFiles/3.7.2/CMakeCCompiler.cmake" + "CMakeFiles/3.7.2/CMakeCXXCompiler.cmake" + "CMakeFiles/3.7.2/CMakeSystem.cmake" + "CMakeFiles/feature_tests.c" + "CMakeFiles/feature_tests.cxx" + "CMakeLists.txt" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCCompiler.cmake.in" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCCompilerABI.c" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCInformation.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCXXCompiler.cmake.in" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCXXCompilerABI.cpp" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCXXInformation.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCompilerIdDetection.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCompileFeatures.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCompilerABI.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCompilerId.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineSystem.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeFindBinUtils.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeGenericSystem.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeLanguageInformation.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeParseArguments.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeParseImplicitLinkInfo.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeSystem.cmake.in" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeTestCCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeTestCXXCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeTestCompilerCommon.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeUnixFindMake.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/ADSP-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/AppleClang-C-FeatureTests.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/AppleClang-C.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/AppleClang-CXX-FeatureTests.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/AppleClang-CXX.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Borland-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Clang-CXX-TestableFeatures.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Clang-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Clang.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Cray-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/GHS-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/GNU-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/GNU.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/HP-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/IAR-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Intel-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/MIPSpro-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/MSVC-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/PGI-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/PathScale-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/SCO-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/TI-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Watcom-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/XL-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Internal/FeatureTesting.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-AppleClang-C.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-AppleClang-CXX.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-Clang-C.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-Clang-CXX.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-Clang.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-Determine-CXX.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-Initialize.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin.cmake" + "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/UnixPaths.cmake" + ) + +# The corresponding makefile is: +set(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +set(CMAKE_MAKEFILE_PRODUCTS + "CMakeFiles/3.7.2/CMakeSystem.cmake" + "CMakeFiles/3.7.2/CMakeCCompiler.cmake" + "CMakeFiles/3.7.2/CMakeCXXCompiler.cmake" + "CMakeFiles/3.7.2/CMakeCCompiler.cmake" + "CMakeFiles/3.7.2/CMakeCXXCompiler.cmake" + "CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +set(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/fec_test.dir/DependInfo.cmake" + "CMakeFiles/kcp_test.dir/DependInfo.cmake" + ) diff --git a/CMakeFiles/Makefile2 b/CMakeFiles/Makefile2 new file mode 100644 index 0000000..ad2b48e --- /dev/null +++ b/CMakeFiles/Makefile2 @@ -0,0 +1,145 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# The main recursive all target +all: + +.PHONY : all + +# The main recursive preinstall target +preinstall: + +.PHONY : preinstall + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.7.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.7.2/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/yarshure/github/libkcp + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/yarshure/github/libkcp + +#============================================================================= +# Target rules for target CMakeFiles/fec_test.dir + +# All Build rule for target. +CMakeFiles/fec_test.dir/all: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/depend + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=1,2,3,4,5,6,7,8,9,10,11 "Built target fec_test" +.PHONY : CMakeFiles/fec_test.dir/all + +# Include target in all. +all: CMakeFiles/fec_test.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +CMakeFiles/fec_test.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles 11 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/fec_test.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles 0 +.PHONY : CMakeFiles/fec_test.dir/rule + +# Convenience name for target. +fec_test: CMakeFiles/fec_test.dir/rule + +.PHONY : fec_test + +# clean rule for target. +CMakeFiles/fec_test.dir/clean: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/clean +.PHONY : CMakeFiles/fec_test.dir/clean + +# clean rule for target. +clean: CMakeFiles/fec_test.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/kcp_test.dir + +# All Build rule for target. +CMakeFiles/kcp_test.dir/all: + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/depend + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=12,13,14,15,16,17,18,19,20,21,22 "Built target kcp_test" +.PHONY : CMakeFiles/kcp_test.dir/all + +# Include target in all. +all: CMakeFiles/kcp_test.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +CMakeFiles/kcp_test.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles 11 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/kcp_test.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles 0 +.PHONY : CMakeFiles/kcp_test.dir/rule + +# Convenience name for target. +kcp_test: CMakeFiles/kcp_test.dir/rule + +.PHONY : kcp_test + +# clean rule for target. +CMakeFiles/kcp_test.dir/clean: + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/clean +.PHONY : CMakeFiles/kcp_test.dir/clean + +# clean rule for target. +clean: CMakeFiles/kcp_test.dir/clean + +.PHONY : clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/CMakeFiles/TargetDirectories.txt b/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..0bd4392 --- /dev/null +++ b/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,4 @@ +/Users/yarshure/github/libkcp/CMakeFiles/rebuild_cache.dir +/Users/yarshure/github/libkcp/CMakeFiles/edit_cache.dir +/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir +/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir diff --git a/CMakeFiles/cmake.check_cache b/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/CMakeFiles/feature_tests.bin b/CMakeFiles/feature_tests.bin new file mode 100755 index 0000000000000000000000000000000000000000..e0fe3cbbcbb26f8e964b338a2ea1b67593c73273 GIT binary patch literal 8376 zcmeHM&5ImG6t9U{lyymR@&g6Oj|4TiyJ0;no{T!W(V!u2U=U)THU-+NUB^M3p1 zuZNEd(RxgX+oyyOXEAobd?VU;65?5mEet8IUH+hRvvd6uemhOAX*SBSolOWzx!u{> zo)!uE?df;5dx6-*5(YvFB&DZ;uNh3o?cIGEAA|QV*CNcH9*Z+`dy7q%Q5JZ|rg z+TH^W1jPK5z2WOezfx9q-`GSN+bi()xV?KX4C7-=nV4tX=g}Ddt5-h$sPo>H5q9mN z9dWMK1kZGDI0f7St~LJ>^1EI?FPz#!upGzq48|sS{@wxRw=qA7aSels?ekz+&d;Pj zu>XtBK&p+gg0WVWZY?w2wd5d6z%xCE!Et=`~Kizrw{VRAEK7C~w z%FE*Q5s#VaReUe&asDTX{qXnk8pkb`HV}4e>>K{|#fz(#RuP2hhPXB-dwBrU(Y zvm@W{T;9HMz4O+(9t@;PQ%9-tBopeXD)acO+IXWf^98vwBA*#m;$Qc?pFt@ukXkiw zq3A_SdhblPid!44A-ujL4WCKGLgfqT5BfB_)HPPQ1DP35PGym>!XN%L=(|~6EOC3G zQW>`e_JD^$cVJd7A)Up&k5;5Yg!2`Fxh{YxAq|dvsjr-h8zEcevRAl$`U@8uk|E3i%|Pa9GaZ;Y6D#n=!}{?0TrLY&NruwloP@Z+eCzwUv_Pg2XQ4 z=Fp-Y7bK0AnaaCKY-1U_OAZ!J%!sj>u_Ud^sq8Bq+r4w03>QMEQmZ~{G^$=`Y!==N zClzK^Al&d1-#NCRfu_Enh1PP14n?44PI;GHh$$jgWm(@xkVlC-ht$lfIAv4fYKtxH z%M!;F2R-*FanvJ6R+Ic3X9g#JVf8!8)Bqw2PN0dy0F|0xtD*KI(V2ADOGKZM>^h}C zBOfVMx2Lj-512a2h)9WgEP6GtvwmvaRaugYWCj3nR(a1(+rGp%&FIb;Kk&BCaYn>W z55Mb3C8!V-)NCN$DT7*0PdF_rYjly&f|Nl5`Oe2%Fq|&44l9d#NB%XRXi$pY0~KId z;A>Agqq<1Z2#INs!gU;E60U8fU9m`DYy`JH_gbIl>mM{Zb5E0do^N92@q69>&V70#fc{(qtgT|EE* literal 0 HcmV?d00001 diff --git a/CMakeFiles/feature_tests.c b/CMakeFiles/feature_tests.c new file mode 100644 index 0000000..afbc86d --- /dev/null +++ b/CMakeFiles/feature_tests.c @@ -0,0 +1,34 @@ + + const char features[] = {"\n" +"C_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 +"1" +#else +"0" +#endif +"c_function_prototypes\n" +"C_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +"1" +#else +"0" +#endif +"c_restrict\n" +"C_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +"1" +#else +"0" +#endif +"c_static_assert\n" +"C_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +"1" +#else +"0" +#endif +"c_variadic_macros\n" + +}; + +int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/CMakeFiles/feature_tests.cxx b/CMakeFiles/feature_tests.cxx new file mode 100644 index 0000000..34d2e8c --- /dev/null +++ b/CMakeFiles/feature_tests.cxx @@ -0,0 +1,405 @@ + + const char features[] = {"\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_aggregate_nsdmi) +"1" +#else +"0" +#endif +"cxx_aggregate_default_initializers\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_alias_templates) +"1" +#else +"0" +#endif +"cxx_alias_templates\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_alignas) +"1" +#else +"0" +#endif +"cxx_alignas\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_alignas) +"1" +#else +"0" +#endif +"cxx_alignof\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_attributes) +"1" +#else +"0" +#endif +"cxx_attributes\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 501 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_attribute_deprecated\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_auto_type) +"1" +#else +"0" +#endif +"cxx_auto_type\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_binary_literals) +"1" +#else +"0" +#endif +"cxx_binary_literals\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_constexpr) +"1" +#else +"0" +#endif +"cxx_constexpr\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_contextual_conversions) +"1" +#else +"0" +#endif +"cxx_contextual_conversions\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_decltype) +"1" +#else +"0" +#endif +"cxx_decltype\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 501 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_decltype_auto\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_decltype_incomplete_return_types) +"1" +#else +"0" +#endif +"cxx_decltype_incomplete_return_types\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_default_function_template_args) +"1" +#else +"0" +#endif +"cxx_default_function_template_args\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_defaulted_functions) +"1" +#else +"0" +#endif +"cxx_defaulted_functions\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_defaulted_functions) +"1" +#else +"0" +#endif +"cxx_defaulted_move_initializers\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_delegating_constructors) +"1" +#else +"0" +#endif +"cxx_delegating_constructors\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_deleted_functions) +"1" +#else +"0" +#endif +"cxx_deleted_functions\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 501 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_digit_separators\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_enum_forward_declarations\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_explicit_conversions) +"1" +#else +"0" +#endif +"cxx_explicit_conversions\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_extended_friend_declarations\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_extern_templates\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_override_control) +"1" +#else +"0" +#endif +"cxx_final\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_func_identifier\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_generalized_initializers) +"1" +#else +"0" +#endif +"cxx_generalized_initializers\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 501 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_generic_lambdas\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_inheriting_constructors) +"1" +#else +"0" +#endif +"cxx_inheriting_constructors\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_inline_namespaces\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_lambdas) +"1" +#else +"0" +#endif +"cxx_lambdas\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_init_captures) +"1" +#else +"0" +#endif +"cxx_lambda_init_captures\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_local_type_template_args) +"1" +#else +"0" +#endif +"cxx_local_type_template_args\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_long_long_type\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_noexcept) +"1" +#else +"0" +#endif +"cxx_noexcept\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_nonstatic_member_init) +"1" +#else +"0" +#endif +"cxx_nonstatic_member_init\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_nullptr) +"1" +#else +"0" +#endif +"cxx_nullptr\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_override_control) +"1" +#else +"0" +#endif +"cxx_override\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_range_for) +"1" +#else +"0" +#endif +"cxx_range_for\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_raw_string_literals) +"1" +#else +"0" +#endif +"cxx_raw_string_literals\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_reference_qualified_functions) +"1" +#else +"0" +#endif +"cxx_reference_qualified_functions\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_relaxed_constexpr) +"1" +#else +"0" +#endif +"cxx_relaxed_constexpr\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_return_type_deduction) +"1" +#else +"0" +#endif +"cxx_return_type_deduction\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_right_angle_brackets\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_rvalue_references) +"1" +#else +"0" +#endif +"cxx_rvalue_references\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_sizeof_member\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_static_assert) +"1" +#else +"0" +#endif +"cxx_static_assert\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_strong_enums) +"1" +#else +"0" +#endif +"cxx_strong_enums\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 199711L +"1" +#else +"0" +#endif +"cxx_template_template_parameters\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_thread_local) +"1" +#else +"0" +#endif +"cxx_thread_local\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_trailing_return) +"1" +#else +"0" +#endif +"cxx_trailing_return_types\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_unicode_literals) +"1" +#else +"0" +#endif +"cxx_unicode_literals\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_generalized_initializers) +"1" +#else +"0" +#endif +"cxx_uniform_initialization\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_unrestricted_unions) +"1" +#else +"0" +#endif +"cxx_unrestricted_unions\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_user_literals) +"1" +#else +"0" +#endif +"cxx_user_literals\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_variable_templates) +"1" +#else +"0" +#endif +"cxx_variable_templates\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_variadic_macros\n" +"CXX_FEATURE:" +#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_variadic_templates) +"1" +#else +"0" +#endif +"cxx_variadic_templates\n" + +}; + +int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/CMakeFiles/fec_test.dir/C.includecache b/CMakeFiles/fec_test.dir/C.includecache new file mode 100644 index 0000000..a5dadc2 --- /dev/null +++ b/CMakeFiles/fec_test.dir/C.includecache @@ -0,0 +1,42 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/galois_table.c +galois.h +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/ikcp.c +ikcp.h +/Users/yarshure/github/libkcp/ikcp.h +stddef.h +- +stdlib.h +- +string.h +- +stdarg.h +- +stdio.h +- + +/Users/yarshure/github/libkcp/ikcp.h +stddef.h +- +stdlib.h +- +assert.h +- +sys/types.h +- +sys/inttypes.h +- +stdint.h +- + diff --git a/CMakeFiles/fec_test.dir/CXX.includecache b/CMakeFiles/fec_test.dir/CXX.includecache new file mode 100644 index 0000000..87bcc61 --- /dev/null +++ b/CMakeFiles/fec_test.dir/CXX.includecache @@ -0,0 +1,156 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +/Users/yarshure/github/libkcp/encoding.h +stdint.h +- + +/Users/yarshure/github/libkcp/fec.cpp +err.h +- +sys/time.h +- +iostream +- +stdexcept +- +fec.h +/Users/yarshure/github/libkcp/fec.h +sess.h +/Users/yarshure/github/libkcp/sess.h +encoding.h +/Users/yarshure/github/libkcp/encoding.h + +/Users/yarshure/github/libkcp/fec.h +vector +- +stdint.h +- +memory +- +reedsolomon.h +/Users/yarshure/github/libkcp/reedsolomon.h + +/Users/yarshure/github/libkcp/fec_test.cpp +iostream +- +sys/time.h +- +fec.h +/Users/yarshure/github/libkcp/fec.h + +/Users/yarshure/github/libkcp/galois.cpp +stdexcept +- +galois.h +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/galois_noasm.cpp +galois_noasm.h +/Users/yarshure/github/libkcp/galois_noasm.h +matrix.h +/Users/yarshure/github/libkcp/matrix.h + +/Users/yarshure/github/libkcp/galois_noasm.h +galois.h +/Users/yarshure/github/libkcp/galois.h +matrix.h +/Users/yarshure/github/libkcp/matrix.h + +/Users/yarshure/github/libkcp/ikcp.h +stddef.h +- +stdlib.h +- +assert.h +- +sys/types.h +- +sys/inttypes.h +- +stdint.h +- + +/Users/yarshure/github/libkcp/inversion_tree.cpp +iostream +- +inversion_tree.h +/Users/yarshure/github/libkcp/inversion_tree.h + +/Users/yarshure/github/libkcp/inversion_tree.h +vector +- +matrix.h +/Users/yarshure/github/libkcp/matrix.h + +/Users/yarshure/github/libkcp/matrix.cpp +galois.h +/Users/yarshure/github/libkcp/galois.h +matrix.h +/Users/yarshure/github/libkcp/matrix.h +stdexcept +- + +/Users/yarshure/github/libkcp/matrix.h +vector +- +memory +- +galois.h +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/reedsolomon.cpp +vector +- +stdexcept +- +iostream +- +reedsolomon.h +/Users/yarshure/github/libkcp/reedsolomon.h +galois_noasm.h +/Users/yarshure/github/libkcp/galois_noasm.h + +/Users/yarshure/github/libkcp/reedsolomon.h +matrix.h +/Users/yarshure/github/libkcp/matrix.h +inversion_tree.h +/Users/yarshure/github/libkcp/inversion_tree.h +galois.h +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/sess.cpp +sess.h +/Users/yarshure/github/libkcp/sess.h +encoding.h +/Users/yarshure/github/libkcp/encoding.h +iostream +- +sys/socket.h +- +sys/fcntl.h +- +arpa/inet.h +- +unistd.h +- +cstring +- + +/Users/yarshure/github/libkcp/sess.h +ikcp.h +/Users/yarshure/github/libkcp/ikcp.h +fec.h +/Users/yarshure/github/libkcp/fec.h +sys/types.h +- +sys/time.h +- + diff --git a/CMakeFiles/fec_test.dir/DependInfo.cmake b/CMakeFiles/fec_test.dir/DependInfo.cmake new file mode 100644 index 0000000..3eea39c --- /dev/null +++ b/CMakeFiles/fec_test.dir/DependInfo.cmake @@ -0,0 +1,37 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "C" + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_C + "/Users/yarshure/github/libkcp/galois_table.c" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/galois_table.c.o" + "/Users/yarshure/github/libkcp/ikcp.c" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/ikcp.c.o" + ) +set(CMAKE_C_COMPILER_ID "Clang") + +# The include file search paths: +set(CMAKE_C_TARGET_INCLUDE_PATH + ) +set(CMAKE_DEPENDS_CHECK_CXX + "/Users/yarshure/github/libkcp/fec.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/fec.cpp.o" + "/Users/yarshure/github/libkcp/fec_test.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/fec_test.cpp.o" + "/Users/yarshure/github/libkcp/galois.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/galois.cpp.o" + "/Users/yarshure/github/libkcp/galois_noasm.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/galois_noasm.cpp.o" + "/Users/yarshure/github/libkcp/inversion_tree.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/inversion_tree.cpp.o" + "/Users/yarshure/github/libkcp/matrix.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/matrix.cpp.o" + "/Users/yarshure/github/libkcp/reedsolomon.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/reedsolomon.cpp.o" + "/Users/yarshure/github/libkcp/sess.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/sess.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "Clang") + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/CMakeFiles/fec_test.dir/build.make b/CMakeFiles/fec_test.dir/build.make new file mode 100644 index 0000000..31539de --- /dev/null +++ b/CMakeFiles/fec_test.dir/build.make @@ -0,0 +1,356 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.7.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.7.2/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/yarshure/github/libkcp + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/yarshure/github/libkcp + +# Include any dependencies generated for this target. +include CMakeFiles/fec_test.dir/depend.make + +# Include the progress variables for this target. +include CMakeFiles/fec_test.dir/progress.make + +# Include the compile flags for this target's objects. +include CMakeFiles/fec_test.dir/flags.make + +CMakeFiles/fec_test.dir/ikcp.c.o: CMakeFiles/fec_test.dir/flags.make +CMakeFiles/fec_test.dir/ikcp.c.o: ikcp.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object CMakeFiles/fec_test.dir/ikcp.c.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/fec_test.dir/ikcp.c.o -c /Users/yarshure/github/libkcp/ikcp.c + +CMakeFiles/fec_test.dir/ikcp.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/fec_test.dir/ikcp.c.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /Users/yarshure/github/libkcp/ikcp.c > CMakeFiles/fec_test.dir/ikcp.c.i + +CMakeFiles/fec_test.dir/ikcp.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/fec_test.dir/ikcp.c.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /Users/yarshure/github/libkcp/ikcp.c -o CMakeFiles/fec_test.dir/ikcp.c.s + +CMakeFiles/fec_test.dir/ikcp.c.o.requires: + +.PHONY : CMakeFiles/fec_test.dir/ikcp.c.o.requires + +CMakeFiles/fec_test.dir/ikcp.c.o.provides: CMakeFiles/fec_test.dir/ikcp.c.o.requires + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/ikcp.c.o.provides.build +.PHONY : CMakeFiles/fec_test.dir/ikcp.c.o.provides + +CMakeFiles/fec_test.dir/ikcp.c.o.provides.build: CMakeFiles/fec_test.dir/ikcp.c.o + + +CMakeFiles/fec_test.dir/sess.cpp.o: CMakeFiles/fec_test.dir/flags.make +CMakeFiles/fec_test.dir/sess.cpp.o: sess.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/fec_test.dir/sess.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/sess.cpp.o -c /Users/yarshure/github/libkcp/sess.cpp + +CMakeFiles/fec_test.dir/sess.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/sess.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/sess.cpp > CMakeFiles/fec_test.dir/sess.cpp.i + +CMakeFiles/fec_test.dir/sess.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/sess.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/sess.cpp -o CMakeFiles/fec_test.dir/sess.cpp.s + +CMakeFiles/fec_test.dir/sess.cpp.o.requires: + +.PHONY : CMakeFiles/fec_test.dir/sess.cpp.o.requires + +CMakeFiles/fec_test.dir/sess.cpp.o.provides: CMakeFiles/fec_test.dir/sess.cpp.o.requires + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/sess.cpp.o.provides.build +.PHONY : CMakeFiles/fec_test.dir/sess.cpp.o.provides + +CMakeFiles/fec_test.dir/sess.cpp.o.provides.build: CMakeFiles/fec_test.dir/sess.cpp.o + + +CMakeFiles/fec_test.dir/galois.cpp.o: CMakeFiles/fec_test.dir/flags.make +CMakeFiles/fec_test.dir/galois.cpp.o: galois.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/fec_test.dir/galois.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/galois.cpp.o -c /Users/yarshure/github/libkcp/galois.cpp + +CMakeFiles/fec_test.dir/galois.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/galois.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/galois.cpp > CMakeFiles/fec_test.dir/galois.cpp.i + +CMakeFiles/fec_test.dir/galois.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/galois.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/galois.cpp -o CMakeFiles/fec_test.dir/galois.cpp.s + +CMakeFiles/fec_test.dir/galois.cpp.o.requires: + +.PHONY : CMakeFiles/fec_test.dir/galois.cpp.o.requires + +CMakeFiles/fec_test.dir/galois.cpp.o.provides: CMakeFiles/fec_test.dir/galois.cpp.o.requires + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois.cpp.o.provides.build +.PHONY : CMakeFiles/fec_test.dir/galois.cpp.o.provides + +CMakeFiles/fec_test.dir/galois.cpp.o.provides.build: CMakeFiles/fec_test.dir/galois.cpp.o + + +CMakeFiles/fec_test.dir/galois_noasm.cpp.o: CMakeFiles/fec_test.dir/flags.make +CMakeFiles/fec_test.dir/galois_noasm.cpp.o: galois_noasm.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/fec_test.dir/galois_noasm.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/galois_noasm.cpp.o -c /Users/yarshure/github/libkcp/galois_noasm.cpp + +CMakeFiles/fec_test.dir/galois_noasm.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/galois_noasm.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/galois_noasm.cpp > CMakeFiles/fec_test.dir/galois_noasm.cpp.i + +CMakeFiles/fec_test.dir/galois_noasm.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/galois_noasm.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/galois_noasm.cpp -o CMakeFiles/fec_test.dir/galois_noasm.cpp.s + +CMakeFiles/fec_test.dir/galois_noasm.cpp.o.requires: + +.PHONY : CMakeFiles/fec_test.dir/galois_noasm.cpp.o.requires + +CMakeFiles/fec_test.dir/galois_noasm.cpp.o.provides: CMakeFiles/fec_test.dir/galois_noasm.cpp.o.requires + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_noasm.cpp.o.provides.build +.PHONY : CMakeFiles/fec_test.dir/galois_noasm.cpp.o.provides + +CMakeFiles/fec_test.dir/galois_noasm.cpp.o.provides.build: CMakeFiles/fec_test.dir/galois_noasm.cpp.o + + +CMakeFiles/fec_test.dir/matrix.cpp.o: CMakeFiles/fec_test.dir/flags.make +CMakeFiles/fec_test.dir/matrix.cpp.o: matrix.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object CMakeFiles/fec_test.dir/matrix.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/matrix.cpp.o -c /Users/yarshure/github/libkcp/matrix.cpp + +CMakeFiles/fec_test.dir/matrix.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/matrix.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/matrix.cpp > CMakeFiles/fec_test.dir/matrix.cpp.i + +CMakeFiles/fec_test.dir/matrix.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/matrix.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/matrix.cpp -o CMakeFiles/fec_test.dir/matrix.cpp.s + +CMakeFiles/fec_test.dir/matrix.cpp.o.requires: + +.PHONY : CMakeFiles/fec_test.dir/matrix.cpp.o.requires + +CMakeFiles/fec_test.dir/matrix.cpp.o.provides: CMakeFiles/fec_test.dir/matrix.cpp.o.requires + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/matrix.cpp.o.provides.build +.PHONY : CMakeFiles/fec_test.dir/matrix.cpp.o.provides + +CMakeFiles/fec_test.dir/matrix.cpp.o.provides.build: CMakeFiles/fec_test.dir/matrix.cpp.o + + +CMakeFiles/fec_test.dir/inversion_tree.cpp.o: CMakeFiles/fec_test.dir/flags.make +CMakeFiles/fec_test.dir/inversion_tree.cpp.o: inversion_tree.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object CMakeFiles/fec_test.dir/inversion_tree.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/inversion_tree.cpp.o -c /Users/yarshure/github/libkcp/inversion_tree.cpp + +CMakeFiles/fec_test.dir/inversion_tree.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/inversion_tree.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/inversion_tree.cpp > CMakeFiles/fec_test.dir/inversion_tree.cpp.i + +CMakeFiles/fec_test.dir/inversion_tree.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/inversion_tree.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/inversion_tree.cpp -o CMakeFiles/fec_test.dir/inversion_tree.cpp.s + +CMakeFiles/fec_test.dir/inversion_tree.cpp.o.requires: + +.PHONY : CMakeFiles/fec_test.dir/inversion_tree.cpp.o.requires + +CMakeFiles/fec_test.dir/inversion_tree.cpp.o.provides: CMakeFiles/fec_test.dir/inversion_tree.cpp.o.requires + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/inversion_tree.cpp.o.provides.build +.PHONY : CMakeFiles/fec_test.dir/inversion_tree.cpp.o.provides + +CMakeFiles/fec_test.dir/inversion_tree.cpp.o.provides.build: CMakeFiles/fec_test.dir/inversion_tree.cpp.o + + +CMakeFiles/fec_test.dir/reedsolomon.cpp.o: CMakeFiles/fec_test.dir/flags.make +CMakeFiles/fec_test.dir/reedsolomon.cpp.o: reedsolomon.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object CMakeFiles/fec_test.dir/reedsolomon.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/reedsolomon.cpp.o -c /Users/yarshure/github/libkcp/reedsolomon.cpp + +CMakeFiles/fec_test.dir/reedsolomon.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/reedsolomon.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/reedsolomon.cpp > CMakeFiles/fec_test.dir/reedsolomon.cpp.i + +CMakeFiles/fec_test.dir/reedsolomon.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/reedsolomon.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/reedsolomon.cpp -o CMakeFiles/fec_test.dir/reedsolomon.cpp.s + +CMakeFiles/fec_test.dir/reedsolomon.cpp.o.requires: + +.PHONY : CMakeFiles/fec_test.dir/reedsolomon.cpp.o.requires + +CMakeFiles/fec_test.dir/reedsolomon.cpp.o.provides: CMakeFiles/fec_test.dir/reedsolomon.cpp.o.requires + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/reedsolomon.cpp.o.provides.build +.PHONY : CMakeFiles/fec_test.dir/reedsolomon.cpp.o.provides + +CMakeFiles/fec_test.dir/reedsolomon.cpp.o.provides.build: CMakeFiles/fec_test.dir/reedsolomon.cpp.o + + +CMakeFiles/fec_test.dir/fec.cpp.o: CMakeFiles/fec_test.dir/flags.make +CMakeFiles/fec_test.dir/fec.cpp.o: fec.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object CMakeFiles/fec_test.dir/fec.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/fec.cpp.o -c /Users/yarshure/github/libkcp/fec.cpp + +CMakeFiles/fec_test.dir/fec.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/fec.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/fec.cpp > CMakeFiles/fec_test.dir/fec.cpp.i + +CMakeFiles/fec_test.dir/fec.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/fec.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/fec.cpp -o CMakeFiles/fec_test.dir/fec.cpp.s + +CMakeFiles/fec_test.dir/fec.cpp.o.requires: + +.PHONY : CMakeFiles/fec_test.dir/fec.cpp.o.requires + +CMakeFiles/fec_test.dir/fec.cpp.o.provides: CMakeFiles/fec_test.dir/fec.cpp.o.requires + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec.cpp.o.provides.build +.PHONY : CMakeFiles/fec_test.dir/fec.cpp.o.provides + +CMakeFiles/fec_test.dir/fec.cpp.o.provides.build: CMakeFiles/fec_test.dir/fec.cpp.o + + +CMakeFiles/fec_test.dir/galois_table.c.o: CMakeFiles/fec_test.dir/flags.make +CMakeFiles/fec_test.dir/galois_table.c.o: galois_table.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building C object CMakeFiles/fec_test.dir/galois_table.c.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/fec_test.dir/galois_table.c.o -c /Users/yarshure/github/libkcp/galois_table.c + +CMakeFiles/fec_test.dir/galois_table.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/fec_test.dir/galois_table.c.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /Users/yarshure/github/libkcp/galois_table.c > CMakeFiles/fec_test.dir/galois_table.c.i + +CMakeFiles/fec_test.dir/galois_table.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/fec_test.dir/galois_table.c.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /Users/yarshure/github/libkcp/galois_table.c -o CMakeFiles/fec_test.dir/galois_table.c.s + +CMakeFiles/fec_test.dir/galois_table.c.o.requires: + +.PHONY : CMakeFiles/fec_test.dir/galois_table.c.o.requires + +CMakeFiles/fec_test.dir/galois_table.c.o.provides: CMakeFiles/fec_test.dir/galois_table.c.o.requires + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_table.c.o.provides.build +.PHONY : CMakeFiles/fec_test.dir/galois_table.c.o.provides + +CMakeFiles/fec_test.dir/galois_table.c.o.provides.build: CMakeFiles/fec_test.dir/galois_table.c.o + + +CMakeFiles/fec_test.dir/fec_test.cpp.o: CMakeFiles/fec_test.dir/flags.make +CMakeFiles/fec_test.dir/fec_test.cpp.o: fec_test.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object CMakeFiles/fec_test.dir/fec_test.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/fec_test.cpp.o -c /Users/yarshure/github/libkcp/fec_test.cpp + +CMakeFiles/fec_test.dir/fec_test.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/fec_test.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/fec_test.cpp > CMakeFiles/fec_test.dir/fec_test.cpp.i + +CMakeFiles/fec_test.dir/fec_test.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/fec_test.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/fec_test.cpp -o CMakeFiles/fec_test.dir/fec_test.cpp.s + +CMakeFiles/fec_test.dir/fec_test.cpp.o.requires: + +.PHONY : CMakeFiles/fec_test.dir/fec_test.cpp.o.requires + +CMakeFiles/fec_test.dir/fec_test.cpp.o.provides: CMakeFiles/fec_test.dir/fec_test.cpp.o.requires + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec_test.cpp.o.provides.build +.PHONY : CMakeFiles/fec_test.dir/fec_test.cpp.o.provides + +CMakeFiles/fec_test.dir/fec_test.cpp.o.provides.build: CMakeFiles/fec_test.dir/fec_test.cpp.o + + +# Object files for target fec_test +fec_test_OBJECTS = \ +"CMakeFiles/fec_test.dir/ikcp.c.o" \ +"CMakeFiles/fec_test.dir/sess.cpp.o" \ +"CMakeFiles/fec_test.dir/galois.cpp.o" \ +"CMakeFiles/fec_test.dir/galois_noasm.cpp.o" \ +"CMakeFiles/fec_test.dir/matrix.cpp.o" \ +"CMakeFiles/fec_test.dir/inversion_tree.cpp.o" \ +"CMakeFiles/fec_test.dir/reedsolomon.cpp.o" \ +"CMakeFiles/fec_test.dir/fec.cpp.o" \ +"CMakeFiles/fec_test.dir/galois_table.c.o" \ +"CMakeFiles/fec_test.dir/fec_test.cpp.o" + +# External object files for target fec_test +fec_test_EXTERNAL_OBJECTS = + +fec_test: CMakeFiles/fec_test.dir/ikcp.c.o +fec_test: CMakeFiles/fec_test.dir/sess.cpp.o +fec_test: CMakeFiles/fec_test.dir/galois.cpp.o +fec_test: CMakeFiles/fec_test.dir/galois_noasm.cpp.o +fec_test: CMakeFiles/fec_test.dir/matrix.cpp.o +fec_test: CMakeFiles/fec_test.dir/inversion_tree.cpp.o +fec_test: CMakeFiles/fec_test.dir/reedsolomon.cpp.o +fec_test: CMakeFiles/fec_test.dir/fec.cpp.o +fec_test: CMakeFiles/fec_test.dir/galois_table.c.o +fec_test: CMakeFiles/fec_test.dir/fec_test.cpp.o +fec_test: CMakeFiles/fec_test.dir/build.make +fec_test: CMakeFiles/fec_test.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Linking CXX executable fec_test" + $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/fec_test.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +CMakeFiles/fec_test.dir/build: fec_test + +.PHONY : CMakeFiles/fec_test.dir/build + +CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/ikcp.c.o.requires +CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/sess.cpp.o.requires +CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/galois.cpp.o.requires +CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/galois_noasm.cpp.o.requires +CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/matrix.cpp.o.requires +CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/inversion_tree.cpp.o.requires +CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/reedsolomon.cpp.o.requires +CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/fec.cpp.o.requires +CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/galois_table.c.o.requires +CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/fec_test.cpp.o.requires + +.PHONY : CMakeFiles/fec_test.dir/requires + +CMakeFiles/fec_test.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/fec_test.dir/cmake_clean.cmake +.PHONY : CMakeFiles/fec_test.dir/clean + +CMakeFiles/fec_test.dir/depend: + cd /Users/yarshure/github/libkcp && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/fec_test.dir/depend + diff --git a/CMakeFiles/fec_test.dir/cmake_clean.cmake b/CMakeFiles/fec_test.dir/cmake_clean.cmake new file mode 100644 index 0000000..a75c27f --- /dev/null +++ b/CMakeFiles/fec_test.dir/cmake_clean.cmake @@ -0,0 +1,19 @@ +file(REMOVE_RECURSE + "CMakeFiles/fec_test.dir/ikcp.c.o" + "CMakeFiles/fec_test.dir/sess.cpp.o" + "CMakeFiles/fec_test.dir/galois.cpp.o" + "CMakeFiles/fec_test.dir/galois_noasm.cpp.o" + "CMakeFiles/fec_test.dir/matrix.cpp.o" + "CMakeFiles/fec_test.dir/inversion_tree.cpp.o" + "CMakeFiles/fec_test.dir/reedsolomon.cpp.o" + "CMakeFiles/fec_test.dir/fec.cpp.o" + "CMakeFiles/fec_test.dir/galois_table.c.o" + "CMakeFiles/fec_test.dir/fec_test.cpp.o" + "fec_test.pdb" + "fec_test" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C CXX) + include(CMakeFiles/fec_test.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/CMakeFiles/fec_test.dir/depend.internal b/CMakeFiles/fec_test.dir/depend.internal new file mode 100644 index 0000000..16788fa --- /dev/null +++ b/CMakeFiles/fec_test.dir/depend.internal @@ -0,0 +1,60 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +CMakeFiles/fec_test.dir/galois_table.c.o + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/galois_table.c +CMakeFiles/fec_test.dir/ikcp.c.o + /Users/yarshure/github/libkcp/ikcp.c + /Users/yarshure/github/libkcp/ikcp.h +CMakeFiles/fec_test.dir/fec.cpp.o + /Users/yarshure/github/libkcp/encoding.h + /Users/yarshure/github/libkcp/fec.cpp + /Users/yarshure/github/libkcp/fec.h + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/ikcp.h + /Users/yarshure/github/libkcp/inversion_tree.h + /Users/yarshure/github/libkcp/matrix.h + /Users/yarshure/github/libkcp/reedsolomon.h + /Users/yarshure/github/libkcp/sess.h +CMakeFiles/fec_test.dir/fec_test.cpp.o + /Users/yarshure/github/libkcp/fec.h + /Users/yarshure/github/libkcp/fec_test.cpp + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/inversion_tree.h + /Users/yarshure/github/libkcp/matrix.h + /Users/yarshure/github/libkcp/reedsolomon.h +CMakeFiles/fec_test.dir/galois.cpp.o + /Users/yarshure/github/libkcp/galois.cpp + /Users/yarshure/github/libkcp/galois.h +CMakeFiles/fec_test.dir/galois_noasm.cpp.o + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/galois_noasm.cpp + /Users/yarshure/github/libkcp/galois_noasm.h + /Users/yarshure/github/libkcp/matrix.h +CMakeFiles/fec_test.dir/inversion_tree.cpp.o + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/inversion_tree.cpp + /Users/yarshure/github/libkcp/inversion_tree.h + /Users/yarshure/github/libkcp/matrix.h +CMakeFiles/fec_test.dir/matrix.cpp.o + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/matrix.cpp + /Users/yarshure/github/libkcp/matrix.h +CMakeFiles/fec_test.dir/reedsolomon.cpp.o + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/galois_noasm.h + /Users/yarshure/github/libkcp/inversion_tree.h + /Users/yarshure/github/libkcp/matrix.h + /Users/yarshure/github/libkcp/reedsolomon.cpp + /Users/yarshure/github/libkcp/reedsolomon.h +CMakeFiles/fec_test.dir/sess.cpp.o + /Users/yarshure/github/libkcp/encoding.h + /Users/yarshure/github/libkcp/fec.h + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/ikcp.h + /Users/yarshure/github/libkcp/inversion_tree.h + /Users/yarshure/github/libkcp/matrix.h + /Users/yarshure/github/libkcp/reedsolomon.h + /Users/yarshure/github/libkcp/sess.cpp + /Users/yarshure/github/libkcp/sess.h diff --git a/CMakeFiles/fec_test.dir/depend.make b/CMakeFiles/fec_test.dir/depend.make new file mode 100644 index 0000000..0601982 --- /dev/null +++ b/CMakeFiles/fec_test.dir/depend.make @@ -0,0 +1,60 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +CMakeFiles/fec_test.dir/galois_table.c.o: galois.h +CMakeFiles/fec_test.dir/galois_table.c.o: galois_table.c + +CMakeFiles/fec_test.dir/ikcp.c.o: ikcp.c +CMakeFiles/fec_test.dir/ikcp.c.o: ikcp.h + +CMakeFiles/fec_test.dir/fec.cpp.o: encoding.h +CMakeFiles/fec_test.dir/fec.cpp.o: fec.cpp +CMakeFiles/fec_test.dir/fec.cpp.o: fec.h +CMakeFiles/fec_test.dir/fec.cpp.o: galois.h +CMakeFiles/fec_test.dir/fec.cpp.o: ikcp.h +CMakeFiles/fec_test.dir/fec.cpp.o: inversion_tree.h +CMakeFiles/fec_test.dir/fec.cpp.o: matrix.h +CMakeFiles/fec_test.dir/fec.cpp.o: reedsolomon.h +CMakeFiles/fec_test.dir/fec.cpp.o: sess.h + +CMakeFiles/fec_test.dir/fec_test.cpp.o: fec.h +CMakeFiles/fec_test.dir/fec_test.cpp.o: fec_test.cpp +CMakeFiles/fec_test.dir/fec_test.cpp.o: galois.h +CMakeFiles/fec_test.dir/fec_test.cpp.o: inversion_tree.h +CMakeFiles/fec_test.dir/fec_test.cpp.o: matrix.h +CMakeFiles/fec_test.dir/fec_test.cpp.o: reedsolomon.h + +CMakeFiles/fec_test.dir/galois.cpp.o: galois.cpp +CMakeFiles/fec_test.dir/galois.cpp.o: galois.h + +CMakeFiles/fec_test.dir/galois_noasm.cpp.o: galois.h +CMakeFiles/fec_test.dir/galois_noasm.cpp.o: galois_noasm.cpp +CMakeFiles/fec_test.dir/galois_noasm.cpp.o: galois_noasm.h +CMakeFiles/fec_test.dir/galois_noasm.cpp.o: matrix.h + +CMakeFiles/fec_test.dir/inversion_tree.cpp.o: galois.h +CMakeFiles/fec_test.dir/inversion_tree.cpp.o: inversion_tree.cpp +CMakeFiles/fec_test.dir/inversion_tree.cpp.o: inversion_tree.h +CMakeFiles/fec_test.dir/inversion_tree.cpp.o: matrix.h + +CMakeFiles/fec_test.dir/matrix.cpp.o: galois.h +CMakeFiles/fec_test.dir/matrix.cpp.o: matrix.cpp +CMakeFiles/fec_test.dir/matrix.cpp.o: matrix.h + +CMakeFiles/fec_test.dir/reedsolomon.cpp.o: galois.h +CMakeFiles/fec_test.dir/reedsolomon.cpp.o: galois_noasm.h +CMakeFiles/fec_test.dir/reedsolomon.cpp.o: inversion_tree.h +CMakeFiles/fec_test.dir/reedsolomon.cpp.o: matrix.h +CMakeFiles/fec_test.dir/reedsolomon.cpp.o: reedsolomon.cpp +CMakeFiles/fec_test.dir/reedsolomon.cpp.o: reedsolomon.h + +CMakeFiles/fec_test.dir/sess.cpp.o: encoding.h +CMakeFiles/fec_test.dir/sess.cpp.o: fec.h +CMakeFiles/fec_test.dir/sess.cpp.o: galois.h +CMakeFiles/fec_test.dir/sess.cpp.o: ikcp.h +CMakeFiles/fec_test.dir/sess.cpp.o: inversion_tree.h +CMakeFiles/fec_test.dir/sess.cpp.o: matrix.h +CMakeFiles/fec_test.dir/sess.cpp.o: reedsolomon.h +CMakeFiles/fec_test.dir/sess.cpp.o: sess.cpp +CMakeFiles/fec_test.dir/sess.cpp.o: sess.h + diff --git a/CMakeFiles/fec_test.dir/flags.make b/CMakeFiles/fec_test.dir/flags.make new file mode 100644 index 0000000..c6af713 --- /dev/null +++ b/CMakeFiles/fec_test.dir/flags.make @@ -0,0 +1,17 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +# compile C with /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc +# compile CXX with /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ +C_FLAGS = + +C_DEFINES = + +C_INCLUDES = + +CXX_FLAGS = -std=c++11 + +CXX_DEFINES = + +CXX_INCLUDES = + diff --git a/CMakeFiles/fec_test.dir/link.txt b/CMakeFiles/fec_test.dir/link.txt new file mode 100644 index 0000000..b035442 --- /dev/null +++ b/CMakeFiles/fec_test.dir/link.txt @@ -0,0 +1 @@ +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -std=c++11 -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/fec_test.dir/ikcp.c.o CMakeFiles/fec_test.dir/sess.cpp.o CMakeFiles/fec_test.dir/galois.cpp.o CMakeFiles/fec_test.dir/galois_noasm.cpp.o CMakeFiles/fec_test.dir/matrix.cpp.o CMakeFiles/fec_test.dir/inversion_tree.cpp.o CMakeFiles/fec_test.dir/reedsolomon.cpp.o CMakeFiles/fec_test.dir/fec.cpp.o CMakeFiles/fec_test.dir/galois_table.c.o CMakeFiles/fec_test.dir/fec_test.cpp.o -o fec_test diff --git a/CMakeFiles/fec_test.dir/progress.make b/CMakeFiles/fec_test.dir/progress.make new file mode 100644 index 0000000..eeadf29 --- /dev/null +++ b/CMakeFiles/fec_test.dir/progress.make @@ -0,0 +1,12 @@ +CMAKE_PROGRESS_1 = 1 +CMAKE_PROGRESS_2 = 2 +CMAKE_PROGRESS_3 = 3 +CMAKE_PROGRESS_4 = 4 +CMAKE_PROGRESS_5 = 5 +CMAKE_PROGRESS_6 = 6 +CMAKE_PROGRESS_7 = 7 +CMAKE_PROGRESS_8 = 8 +CMAKE_PROGRESS_9 = 9 +CMAKE_PROGRESS_10 = 10 +CMAKE_PROGRESS_11 = 11 + diff --git a/CMakeFiles/kcp_test.dir/C.includecache b/CMakeFiles/kcp_test.dir/C.includecache new file mode 100644 index 0000000..a5dadc2 --- /dev/null +++ b/CMakeFiles/kcp_test.dir/C.includecache @@ -0,0 +1,42 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/galois_table.c +galois.h +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/ikcp.c +ikcp.h +/Users/yarshure/github/libkcp/ikcp.h +stddef.h +- +stdlib.h +- +string.h +- +stdarg.h +- +stdio.h +- + +/Users/yarshure/github/libkcp/ikcp.h +stddef.h +- +stdlib.h +- +assert.h +- +sys/types.h +- +sys/inttypes.h +- +stdint.h +- + diff --git a/CMakeFiles/kcp_test.dir/CXX.includecache b/CMakeFiles/kcp_test.dir/CXX.includecache new file mode 100644 index 0000000..0d956f6 --- /dev/null +++ b/CMakeFiles/kcp_test.dir/CXX.includecache @@ -0,0 +1,160 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +/Users/yarshure/github/libkcp/encoding.h +stdint.h +- + +/Users/yarshure/github/libkcp/fec.cpp +err.h +- +sys/time.h +- +iostream +- +stdexcept +- +fec.h +/Users/yarshure/github/libkcp/fec.h +sess.h +/Users/yarshure/github/libkcp/sess.h +encoding.h +/Users/yarshure/github/libkcp/encoding.h + +/Users/yarshure/github/libkcp/fec.h +vector +- +stdint.h +- +memory +- +reedsolomon.h +/Users/yarshure/github/libkcp/reedsolomon.h + +/Users/yarshure/github/libkcp/galois.cpp +stdexcept +- +galois.h +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/galois_noasm.cpp +galois_noasm.h +/Users/yarshure/github/libkcp/galois_noasm.h +matrix.h +/Users/yarshure/github/libkcp/matrix.h + +/Users/yarshure/github/libkcp/galois_noasm.h +galois.h +/Users/yarshure/github/libkcp/galois.h +matrix.h +/Users/yarshure/github/libkcp/matrix.h + +/Users/yarshure/github/libkcp/ikcp.h +stddef.h +- +stdlib.h +- +assert.h +- +sys/types.h +- +sys/inttypes.h +- +stdint.h +- + +/Users/yarshure/github/libkcp/inversion_tree.cpp +iostream +- +inversion_tree.h +/Users/yarshure/github/libkcp/inversion_tree.h + +/Users/yarshure/github/libkcp/inversion_tree.h +vector +- +matrix.h +/Users/yarshure/github/libkcp/matrix.h + +/Users/yarshure/github/libkcp/kcp_test.cpp +unistd.h +- +sys/time.h +- +cstring +- +cstdio +- +sess.h +/Users/yarshure/github/libkcp/sess.h + +/Users/yarshure/github/libkcp/matrix.cpp +galois.h +/Users/yarshure/github/libkcp/galois.h +matrix.h +/Users/yarshure/github/libkcp/matrix.h +stdexcept +- + +/Users/yarshure/github/libkcp/matrix.h +vector +- +memory +- +galois.h +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/reedsolomon.cpp +vector +- +stdexcept +- +iostream +- +reedsolomon.h +/Users/yarshure/github/libkcp/reedsolomon.h +galois_noasm.h +/Users/yarshure/github/libkcp/galois_noasm.h + +/Users/yarshure/github/libkcp/reedsolomon.h +matrix.h +/Users/yarshure/github/libkcp/matrix.h +inversion_tree.h +/Users/yarshure/github/libkcp/inversion_tree.h +galois.h +/Users/yarshure/github/libkcp/galois.h + +/Users/yarshure/github/libkcp/sess.cpp +sess.h +/Users/yarshure/github/libkcp/sess.h +encoding.h +/Users/yarshure/github/libkcp/encoding.h +iostream +- +sys/socket.h +- +sys/fcntl.h +- +arpa/inet.h +- +unistd.h +- +cstring +- + +/Users/yarshure/github/libkcp/sess.h +ikcp.h +/Users/yarshure/github/libkcp/ikcp.h +fec.h +/Users/yarshure/github/libkcp/fec.h +sys/types.h +- +sys/time.h +- + diff --git a/CMakeFiles/kcp_test.dir/DependInfo.cmake b/CMakeFiles/kcp_test.dir/DependInfo.cmake new file mode 100644 index 0000000..38fff1e --- /dev/null +++ b/CMakeFiles/kcp_test.dir/DependInfo.cmake @@ -0,0 +1,37 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "C" + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_C + "/Users/yarshure/github/libkcp/galois_table.c" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/galois_table.c.o" + "/Users/yarshure/github/libkcp/ikcp.c" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/ikcp.c.o" + ) +set(CMAKE_C_COMPILER_ID "Clang") + +# The include file search paths: +set(CMAKE_C_TARGET_INCLUDE_PATH + ) +set(CMAKE_DEPENDS_CHECK_CXX + "/Users/yarshure/github/libkcp/fec.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/fec.cpp.o" + "/Users/yarshure/github/libkcp/galois.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/galois.cpp.o" + "/Users/yarshure/github/libkcp/galois_noasm.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/galois_noasm.cpp.o" + "/Users/yarshure/github/libkcp/inversion_tree.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/inversion_tree.cpp.o" + "/Users/yarshure/github/libkcp/kcp_test.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/kcp_test.cpp.o" + "/Users/yarshure/github/libkcp/matrix.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/matrix.cpp.o" + "/Users/yarshure/github/libkcp/reedsolomon.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/reedsolomon.cpp.o" + "/Users/yarshure/github/libkcp/sess.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/sess.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "Clang") + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/CMakeFiles/kcp_test.dir/build.make b/CMakeFiles/kcp_test.dir/build.make new file mode 100644 index 0000000..4225cf0 --- /dev/null +++ b/CMakeFiles/kcp_test.dir/build.make @@ -0,0 +1,356 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.7.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.7.2/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/yarshure/github/libkcp + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/yarshure/github/libkcp + +# Include any dependencies generated for this target. +include CMakeFiles/kcp_test.dir/depend.make + +# Include the progress variables for this target. +include CMakeFiles/kcp_test.dir/progress.make + +# Include the compile flags for this target's objects. +include CMakeFiles/kcp_test.dir/flags.make + +CMakeFiles/kcp_test.dir/ikcp.c.o: CMakeFiles/kcp_test.dir/flags.make +CMakeFiles/kcp_test.dir/ikcp.c.o: ikcp.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object CMakeFiles/kcp_test.dir/ikcp.c.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/kcp_test.dir/ikcp.c.o -c /Users/yarshure/github/libkcp/ikcp.c + +CMakeFiles/kcp_test.dir/ikcp.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/kcp_test.dir/ikcp.c.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /Users/yarshure/github/libkcp/ikcp.c > CMakeFiles/kcp_test.dir/ikcp.c.i + +CMakeFiles/kcp_test.dir/ikcp.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/kcp_test.dir/ikcp.c.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /Users/yarshure/github/libkcp/ikcp.c -o CMakeFiles/kcp_test.dir/ikcp.c.s + +CMakeFiles/kcp_test.dir/ikcp.c.o.requires: + +.PHONY : CMakeFiles/kcp_test.dir/ikcp.c.o.requires + +CMakeFiles/kcp_test.dir/ikcp.c.o.provides: CMakeFiles/kcp_test.dir/ikcp.c.o.requires + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/ikcp.c.o.provides.build +.PHONY : CMakeFiles/kcp_test.dir/ikcp.c.o.provides + +CMakeFiles/kcp_test.dir/ikcp.c.o.provides.build: CMakeFiles/kcp_test.dir/ikcp.c.o + + +CMakeFiles/kcp_test.dir/sess.cpp.o: CMakeFiles/kcp_test.dir/flags.make +CMakeFiles/kcp_test.dir/sess.cpp.o: sess.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/kcp_test.dir/sess.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/sess.cpp.o -c /Users/yarshure/github/libkcp/sess.cpp + +CMakeFiles/kcp_test.dir/sess.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/sess.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/sess.cpp > CMakeFiles/kcp_test.dir/sess.cpp.i + +CMakeFiles/kcp_test.dir/sess.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/sess.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/sess.cpp -o CMakeFiles/kcp_test.dir/sess.cpp.s + +CMakeFiles/kcp_test.dir/sess.cpp.o.requires: + +.PHONY : CMakeFiles/kcp_test.dir/sess.cpp.o.requires + +CMakeFiles/kcp_test.dir/sess.cpp.o.provides: CMakeFiles/kcp_test.dir/sess.cpp.o.requires + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/sess.cpp.o.provides.build +.PHONY : CMakeFiles/kcp_test.dir/sess.cpp.o.provides + +CMakeFiles/kcp_test.dir/sess.cpp.o.provides.build: CMakeFiles/kcp_test.dir/sess.cpp.o + + +CMakeFiles/kcp_test.dir/galois.cpp.o: CMakeFiles/kcp_test.dir/flags.make +CMakeFiles/kcp_test.dir/galois.cpp.o: galois.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/kcp_test.dir/galois.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/galois.cpp.o -c /Users/yarshure/github/libkcp/galois.cpp + +CMakeFiles/kcp_test.dir/galois.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/galois.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/galois.cpp > CMakeFiles/kcp_test.dir/galois.cpp.i + +CMakeFiles/kcp_test.dir/galois.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/galois.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/galois.cpp -o CMakeFiles/kcp_test.dir/galois.cpp.s + +CMakeFiles/kcp_test.dir/galois.cpp.o.requires: + +.PHONY : CMakeFiles/kcp_test.dir/galois.cpp.o.requires + +CMakeFiles/kcp_test.dir/galois.cpp.o.provides: CMakeFiles/kcp_test.dir/galois.cpp.o.requires + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois.cpp.o.provides.build +.PHONY : CMakeFiles/kcp_test.dir/galois.cpp.o.provides + +CMakeFiles/kcp_test.dir/galois.cpp.o.provides.build: CMakeFiles/kcp_test.dir/galois.cpp.o + + +CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: CMakeFiles/kcp_test.dir/flags.make +CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: galois_noasm.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/kcp_test.dir/galois_noasm.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/galois_noasm.cpp.o -c /Users/yarshure/github/libkcp/galois_noasm.cpp + +CMakeFiles/kcp_test.dir/galois_noasm.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/galois_noasm.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/galois_noasm.cpp > CMakeFiles/kcp_test.dir/galois_noasm.cpp.i + +CMakeFiles/kcp_test.dir/galois_noasm.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/galois_noasm.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/galois_noasm.cpp -o CMakeFiles/kcp_test.dir/galois_noasm.cpp.s + +CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.requires: + +.PHONY : CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.requires + +CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.provides: CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.requires + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.provides.build +.PHONY : CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.provides + +CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.provides.build: CMakeFiles/kcp_test.dir/galois_noasm.cpp.o + + +CMakeFiles/kcp_test.dir/matrix.cpp.o: CMakeFiles/kcp_test.dir/flags.make +CMakeFiles/kcp_test.dir/matrix.cpp.o: matrix.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object CMakeFiles/kcp_test.dir/matrix.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/matrix.cpp.o -c /Users/yarshure/github/libkcp/matrix.cpp + +CMakeFiles/kcp_test.dir/matrix.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/matrix.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/matrix.cpp > CMakeFiles/kcp_test.dir/matrix.cpp.i + +CMakeFiles/kcp_test.dir/matrix.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/matrix.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/matrix.cpp -o CMakeFiles/kcp_test.dir/matrix.cpp.s + +CMakeFiles/kcp_test.dir/matrix.cpp.o.requires: + +.PHONY : CMakeFiles/kcp_test.dir/matrix.cpp.o.requires + +CMakeFiles/kcp_test.dir/matrix.cpp.o.provides: CMakeFiles/kcp_test.dir/matrix.cpp.o.requires + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/matrix.cpp.o.provides.build +.PHONY : CMakeFiles/kcp_test.dir/matrix.cpp.o.provides + +CMakeFiles/kcp_test.dir/matrix.cpp.o.provides.build: CMakeFiles/kcp_test.dir/matrix.cpp.o + + +CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: CMakeFiles/kcp_test.dir/flags.make +CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: inversion_tree.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object CMakeFiles/kcp_test.dir/inversion_tree.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/inversion_tree.cpp.o -c /Users/yarshure/github/libkcp/inversion_tree.cpp + +CMakeFiles/kcp_test.dir/inversion_tree.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/inversion_tree.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/inversion_tree.cpp > CMakeFiles/kcp_test.dir/inversion_tree.cpp.i + +CMakeFiles/kcp_test.dir/inversion_tree.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/inversion_tree.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/inversion_tree.cpp -o CMakeFiles/kcp_test.dir/inversion_tree.cpp.s + +CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.requires: + +.PHONY : CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.requires + +CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.provides: CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.requires + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.provides.build +.PHONY : CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.provides + +CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.provides.build: CMakeFiles/kcp_test.dir/inversion_tree.cpp.o + + +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: CMakeFiles/kcp_test.dir/flags.make +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: reedsolomon.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object CMakeFiles/kcp_test.dir/reedsolomon.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/reedsolomon.cpp.o -c /Users/yarshure/github/libkcp/reedsolomon.cpp + +CMakeFiles/kcp_test.dir/reedsolomon.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/reedsolomon.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/reedsolomon.cpp > CMakeFiles/kcp_test.dir/reedsolomon.cpp.i + +CMakeFiles/kcp_test.dir/reedsolomon.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/reedsolomon.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/reedsolomon.cpp -o CMakeFiles/kcp_test.dir/reedsolomon.cpp.s + +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.requires: + +.PHONY : CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.requires + +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.provides: CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.requires + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.provides.build +.PHONY : CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.provides + +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.provides.build: CMakeFiles/kcp_test.dir/reedsolomon.cpp.o + + +CMakeFiles/kcp_test.dir/fec.cpp.o: CMakeFiles/kcp_test.dir/flags.make +CMakeFiles/kcp_test.dir/fec.cpp.o: fec.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object CMakeFiles/kcp_test.dir/fec.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/fec.cpp.o -c /Users/yarshure/github/libkcp/fec.cpp + +CMakeFiles/kcp_test.dir/fec.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/fec.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/fec.cpp > CMakeFiles/kcp_test.dir/fec.cpp.i + +CMakeFiles/kcp_test.dir/fec.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/fec.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/fec.cpp -o CMakeFiles/kcp_test.dir/fec.cpp.s + +CMakeFiles/kcp_test.dir/fec.cpp.o.requires: + +.PHONY : CMakeFiles/kcp_test.dir/fec.cpp.o.requires + +CMakeFiles/kcp_test.dir/fec.cpp.o.provides: CMakeFiles/kcp_test.dir/fec.cpp.o.requires + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/fec.cpp.o.provides.build +.PHONY : CMakeFiles/kcp_test.dir/fec.cpp.o.provides + +CMakeFiles/kcp_test.dir/fec.cpp.o.provides.build: CMakeFiles/kcp_test.dir/fec.cpp.o + + +CMakeFiles/kcp_test.dir/galois_table.c.o: CMakeFiles/kcp_test.dir/flags.make +CMakeFiles/kcp_test.dir/galois_table.c.o: galois_table.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building C object CMakeFiles/kcp_test.dir/galois_table.c.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/kcp_test.dir/galois_table.c.o -c /Users/yarshure/github/libkcp/galois_table.c + +CMakeFiles/kcp_test.dir/galois_table.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/kcp_test.dir/galois_table.c.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /Users/yarshure/github/libkcp/galois_table.c > CMakeFiles/kcp_test.dir/galois_table.c.i + +CMakeFiles/kcp_test.dir/galois_table.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/kcp_test.dir/galois_table.c.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /Users/yarshure/github/libkcp/galois_table.c -o CMakeFiles/kcp_test.dir/galois_table.c.s + +CMakeFiles/kcp_test.dir/galois_table.c.o.requires: + +.PHONY : CMakeFiles/kcp_test.dir/galois_table.c.o.requires + +CMakeFiles/kcp_test.dir/galois_table.c.o.provides: CMakeFiles/kcp_test.dir/galois_table.c.o.requires + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_table.c.o.provides.build +.PHONY : CMakeFiles/kcp_test.dir/galois_table.c.o.provides + +CMakeFiles/kcp_test.dir/galois_table.c.o.provides.build: CMakeFiles/kcp_test.dir/galois_table.c.o + + +CMakeFiles/kcp_test.dir/kcp_test.cpp.o: CMakeFiles/kcp_test.dir/flags.make +CMakeFiles/kcp_test.dir/kcp_test.cpp.o: kcp_test.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object CMakeFiles/kcp_test.dir/kcp_test.cpp.o" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/kcp_test.cpp.o -c /Users/yarshure/github/libkcp/kcp_test.cpp + +CMakeFiles/kcp_test.dir/kcp_test.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/kcp_test.cpp.i" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/kcp_test.cpp > CMakeFiles/kcp_test.dir/kcp_test.cpp.i + +CMakeFiles/kcp_test.dir/kcp_test.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/kcp_test.cpp.s" + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/kcp_test.cpp -o CMakeFiles/kcp_test.dir/kcp_test.cpp.s + +CMakeFiles/kcp_test.dir/kcp_test.cpp.o.requires: + +.PHONY : CMakeFiles/kcp_test.dir/kcp_test.cpp.o.requires + +CMakeFiles/kcp_test.dir/kcp_test.cpp.o.provides: CMakeFiles/kcp_test.dir/kcp_test.cpp.o.requires + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/kcp_test.cpp.o.provides.build +.PHONY : CMakeFiles/kcp_test.dir/kcp_test.cpp.o.provides + +CMakeFiles/kcp_test.dir/kcp_test.cpp.o.provides.build: CMakeFiles/kcp_test.dir/kcp_test.cpp.o + + +# Object files for target kcp_test +kcp_test_OBJECTS = \ +"CMakeFiles/kcp_test.dir/ikcp.c.o" \ +"CMakeFiles/kcp_test.dir/sess.cpp.o" \ +"CMakeFiles/kcp_test.dir/galois.cpp.o" \ +"CMakeFiles/kcp_test.dir/galois_noasm.cpp.o" \ +"CMakeFiles/kcp_test.dir/matrix.cpp.o" \ +"CMakeFiles/kcp_test.dir/inversion_tree.cpp.o" \ +"CMakeFiles/kcp_test.dir/reedsolomon.cpp.o" \ +"CMakeFiles/kcp_test.dir/fec.cpp.o" \ +"CMakeFiles/kcp_test.dir/galois_table.c.o" \ +"CMakeFiles/kcp_test.dir/kcp_test.cpp.o" + +# External object files for target kcp_test +kcp_test_EXTERNAL_OBJECTS = + +kcp_test: CMakeFiles/kcp_test.dir/ikcp.c.o +kcp_test: CMakeFiles/kcp_test.dir/sess.cpp.o +kcp_test: CMakeFiles/kcp_test.dir/galois.cpp.o +kcp_test: CMakeFiles/kcp_test.dir/galois_noasm.cpp.o +kcp_test: CMakeFiles/kcp_test.dir/matrix.cpp.o +kcp_test: CMakeFiles/kcp_test.dir/inversion_tree.cpp.o +kcp_test: CMakeFiles/kcp_test.dir/reedsolomon.cpp.o +kcp_test: CMakeFiles/kcp_test.dir/fec.cpp.o +kcp_test: CMakeFiles/kcp_test.dir/galois_table.c.o +kcp_test: CMakeFiles/kcp_test.dir/kcp_test.cpp.o +kcp_test: CMakeFiles/kcp_test.dir/build.make +kcp_test: CMakeFiles/kcp_test.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Linking CXX executable kcp_test" + $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/kcp_test.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +CMakeFiles/kcp_test.dir/build: kcp_test + +.PHONY : CMakeFiles/kcp_test.dir/build + +CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/ikcp.c.o.requires +CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/sess.cpp.o.requires +CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/galois.cpp.o.requires +CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.requires +CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/matrix.cpp.o.requires +CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.requires +CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.requires +CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/fec.cpp.o.requires +CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/galois_table.c.o.requires +CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/kcp_test.cpp.o.requires + +.PHONY : CMakeFiles/kcp_test.dir/requires + +CMakeFiles/kcp_test.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/kcp_test.dir/cmake_clean.cmake +.PHONY : CMakeFiles/kcp_test.dir/clean + +CMakeFiles/kcp_test.dir/depend: + cd /Users/yarshure/github/libkcp && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/kcp_test.dir/depend + diff --git a/CMakeFiles/kcp_test.dir/cmake_clean.cmake b/CMakeFiles/kcp_test.dir/cmake_clean.cmake new file mode 100644 index 0000000..11e0e93 --- /dev/null +++ b/CMakeFiles/kcp_test.dir/cmake_clean.cmake @@ -0,0 +1,19 @@ +file(REMOVE_RECURSE + "CMakeFiles/kcp_test.dir/ikcp.c.o" + "CMakeFiles/kcp_test.dir/sess.cpp.o" + "CMakeFiles/kcp_test.dir/galois.cpp.o" + "CMakeFiles/kcp_test.dir/galois_noasm.cpp.o" + "CMakeFiles/kcp_test.dir/matrix.cpp.o" + "CMakeFiles/kcp_test.dir/inversion_tree.cpp.o" + "CMakeFiles/kcp_test.dir/reedsolomon.cpp.o" + "CMakeFiles/kcp_test.dir/fec.cpp.o" + "CMakeFiles/kcp_test.dir/galois_table.c.o" + "CMakeFiles/kcp_test.dir/kcp_test.cpp.o" + "kcp_test.pdb" + "kcp_test" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C CXX) + include(CMakeFiles/kcp_test.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/CMakeFiles/kcp_test.dir/depend.internal b/CMakeFiles/kcp_test.dir/depend.internal new file mode 100644 index 0000000..6c00505 --- /dev/null +++ b/CMakeFiles/kcp_test.dir/depend.internal @@ -0,0 +1,62 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +CMakeFiles/kcp_test.dir/galois_table.c.o + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/galois_table.c +CMakeFiles/kcp_test.dir/ikcp.c.o + /Users/yarshure/github/libkcp/ikcp.c + /Users/yarshure/github/libkcp/ikcp.h +CMakeFiles/kcp_test.dir/fec.cpp.o + /Users/yarshure/github/libkcp/encoding.h + /Users/yarshure/github/libkcp/fec.cpp + /Users/yarshure/github/libkcp/fec.h + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/ikcp.h + /Users/yarshure/github/libkcp/inversion_tree.h + /Users/yarshure/github/libkcp/matrix.h + /Users/yarshure/github/libkcp/reedsolomon.h + /Users/yarshure/github/libkcp/sess.h +CMakeFiles/kcp_test.dir/galois.cpp.o + /Users/yarshure/github/libkcp/galois.cpp + /Users/yarshure/github/libkcp/galois.h +CMakeFiles/kcp_test.dir/galois_noasm.cpp.o + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/galois_noasm.cpp + /Users/yarshure/github/libkcp/galois_noasm.h + /Users/yarshure/github/libkcp/matrix.h +CMakeFiles/kcp_test.dir/inversion_tree.cpp.o + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/inversion_tree.cpp + /Users/yarshure/github/libkcp/inversion_tree.h + /Users/yarshure/github/libkcp/matrix.h +CMakeFiles/kcp_test.dir/kcp_test.cpp.o + /Users/yarshure/github/libkcp/fec.h + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/ikcp.h + /Users/yarshure/github/libkcp/inversion_tree.h + /Users/yarshure/github/libkcp/kcp_test.cpp + /Users/yarshure/github/libkcp/matrix.h + /Users/yarshure/github/libkcp/reedsolomon.h + /Users/yarshure/github/libkcp/sess.h +CMakeFiles/kcp_test.dir/matrix.cpp.o + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/matrix.cpp + /Users/yarshure/github/libkcp/matrix.h +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/galois_noasm.h + /Users/yarshure/github/libkcp/inversion_tree.h + /Users/yarshure/github/libkcp/matrix.h + /Users/yarshure/github/libkcp/reedsolomon.cpp + /Users/yarshure/github/libkcp/reedsolomon.h +CMakeFiles/kcp_test.dir/sess.cpp.o + /Users/yarshure/github/libkcp/encoding.h + /Users/yarshure/github/libkcp/fec.h + /Users/yarshure/github/libkcp/galois.h + /Users/yarshure/github/libkcp/ikcp.h + /Users/yarshure/github/libkcp/inversion_tree.h + /Users/yarshure/github/libkcp/matrix.h + /Users/yarshure/github/libkcp/reedsolomon.h + /Users/yarshure/github/libkcp/sess.cpp + /Users/yarshure/github/libkcp/sess.h diff --git a/CMakeFiles/kcp_test.dir/depend.make b/CMakeFiles/kcp_test.dir/depend.make new file mode 100644 index 0000000..8ff065d --- /dev/null +++ b/CMakeFiles/kcp_test.dir/depend.make @@ -0,0 +1,62 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +CMakeFiles/kcp_test.dir/galois_table.c.o: galois.h +CMakeFiles/kcp_test.dir/galois_table.c.o: galois_table.c + +CMakeFiles/kcp_test.dir/ikcp.c.o: ikcp.c +CMakeFiles/kcp_test.dir/ikcp.c.o: ikcp.h + +CMakeFiles/kcp_test.dir/fec.cpp.o: encoding.h +CMakeFiles/kcp_test.dir/fec.cpp.o: fec.cpp +CMakeFiles/kcp_test.dir/fec.cpp.o: fec.h +CMakeFiles/kcp_test.dir/fec.cpp.o: galois.h +CMakeFiles/kcp_test.dir/fec.cpp.o: ikcp.h +CMakeFiles/kcp_test.dir/fec.cpp.o: inversion_tree.h +CMakeFiles/kcp_test.dir/fec.cpp.o: matrix.h +CMakeFiles/kcp_test.dir/fec.cpp.o: reedsolomon.h +CMakeFiles/kcp_test.dir/fec.cpp.o: sess.h + +CMakeFiles/kcp_test.dir/galois.cpp.o: galois.cpp +CMakeFiles/kcp_test.dir/galois.cpp.o: galois.h + +CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: galois.h +CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: galois_noasm.cpp +CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: galois_noasm.h +CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: matrix.h + +CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: galois.h +CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: inversion_tree.cpp +CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: inversion_tree.h +CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: matrix.h + +CMakeFiles/kcp_test.dir/kcp_test.cpp.o: fec.h +CMakeFiles/kcp_test.dir/kcp_test.cpp.o: galois.h +CMakeFiles/kcp_test.dir/kcp_test.cpp.o: ikcp.h +CMakeFiles/kcp_test.dir/kcp_test.cpp.o: inversion_tree.h +CMakeFiles/kcp_test.dir/kcp_test.cpp.o: kcp_test.cpp +CMakeFiles/kcp_test.dir/kcp_test.cpp.o: matrix.h +CMakeFiles/kcp_test.dir/kcp_test.cpp.o: reedsolomon.h +CMakeFiles/kcp_test.dir/kcp_test.cpp.o: sess.h + +CMakeFiles/kcp_test.dir/matrix.cpp.o: galois.h +CMakeFiles/kcp_test.dir/matrix.cpp.o: matrix.cpp +CMakeFiles/kcp_test.dir/matrix.cpp.o: matrix.h + +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: galois.h +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: galois_noasm.h +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: inversion_tree.h +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: matrix.h +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: reedsolomon.cpp +CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: reedsolomon.h + +CMakeFiles/kcp_test.dir/sess.cpp.o: encoding.h +CMakeFiles/kcp_test.dir/sess.cpp.o: fec.h +CMakeFiles/kcp_test.dir/sess.cpp.o: galois.h +CMakeFiles/kcp_test.dir/sess.cpp.o: ikcp.h +CMakeFiles/kcp_test.dir/sess.cpp.o: inversion_tree.h +CMakeFiles/kcp_test.dir/sess.cpp.o: matrix.h +CMakeFiles/kcp_test.dir/sess.cpp.o: reedsolomon.h +CMakeFiles/kcp_test.dir/sess.cpp.o: sess.cpp +CMakeFiles/kcp_test.dir/sess.cpp.o: sess.h + diff --git a/CMakeFiles/kcp_test.dir/flags.make b/CMakeFiles/kcp_test.dir/flags.make new file mode 100644 index 0000000..c6af713 --- /dev/null +++ b/CMakeFiles/kcp_test.dir/flags.make @@ -0,0 +1,17 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +# compile C with /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc +# compile CXX with /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ +C_FLAGS = + +C_DEFINES = + +C_INCLUDES = + +CXX_FLAGS = -std=c++11 + +CXX_DEFINES = + +CXX_INCLUDES = + diff --git a/CMakeFiles/kcp_test.dir/link.txt b/CMakeFiles/kcp_test.dir/link.txt new file mode 100644 index 0000000..9af9385 --- /dev/null +++ b/CMakeFiles/kcp_test.dir/link.txt @@ -0,0 +1 @@ +/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -std=c++11 -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/kcp_test.dir/ikcp.c.o CMakeFiles/kcp_test.dir/sess.cpp.o CMakeFiles/kcp_test.dir/galois.cpp.o CMakeFiles/kcp_test.dir/galois_noasm.cpp.o CMakeFiles/kcp_test.dir/matrix.cpp.o CMakeFiles/kcp_test.dir/inversion_tree.cpp.o CMakeFiles/kcp_test.dir/reedsolomon.cpp.o CMakeFiles/kcp_test.dir/fec.cpp.o CMakeFiles/kcp_test.dir/galois_table.c.o CMakeFiles/kcp_test.dir/kcp_test.cpp.o -o kcp_test diff --git a/CMakeFiles/kcp_test.dir/progress.make b/CMakeFiles/kcp_test.dir/progress.make new file mode 100644 index 0000000..4a1edec --- /dev/null +++ b/CMakeFiles/kcp_test.dir/progress.make @@ -0,0 +1,12 @@ +CMAKE_PROGRESS_1 = 12 +CMAKE_PROGRESS_2 = 13 +CMAKE_PROGRESS_3 = 14 +CMAKE_PROGRESS_4 = 15 +CMAKE_PROGRESS_5 = 16 +CMAKE_PROGRESS_6 = 17 +CMAKE_PROGRESS_7 = 18 +CMAKE_PROGRESS_8 = 19 +CMAKE_PROGRESS_9 = 20 +CMAKE_PROGRESS_10 = 21 +CMAKE_PROGRESS_11 = 22 + diff --git a/CMakeFiles/progress.marks b/CMakeFiles/progress.marks new file mode 100644 index 0000000..2bd5a0a --- /dev/null +++ b/CMakeFiles/progress.marks @@ -0,0 +1 @@ +22 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..85e7ea2 --- /dev/null +++ b/Makefile @@ -0,0 +1,519 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.7 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/local/Cellar/cmake/3.7.2/bin/cmake + +# The command to remove a file. +RM = /usr/local/Cellar/cmake/3.7.2/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/yarshure/github/libkcp + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/yarshure/github/libkcp + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/local/Cellar/cmake/3.7.2/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." + /usr/local/Cellar/cmake/3.7.2/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles /Users/yarshure/github/libkcp/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named fec_test + +# Build rule for target. +fec_test: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 fec_test +.PHONY : fec_test + +# fast build rule for target. +fec_test/fast: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/build +.PHONY : fec_test/fast + +#============================================================================= +# Target rules for targets named kcp_test + +# Build rule for target. +kcp_test: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 kcp_test +.PHONY : kcp_test + +# fast build rule for target. +kcp_test/fast: + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/build +.PHONY : kcp_test/fast + +fec.o: fec.cpp.o + +.PHONY : fec.o + +# target to build an object file +fec.cpp.o: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec.cpp.o + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/fec.cpp.o +.PHONY : fec.cpp.o + +fec.i: fec.cpp.i + +.PHONY : fec.i + +# target to preprocess a source file +fec.cpp.i: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec.cpp.i + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/fec.cpp.i +.PHONY : fec.cpp.i + +fec.s: fec.cpp.s + +.PHONY : fec.s + +# target to generate assembly for a file +fec.cpp.s: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec.cpp.s + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/fec.cpp.s +.PHONY : fec.cpp.s + +fec_test.o: fec_test.cpp.o + +.PHONY : fec_test.o + +# target to build an object file +fec_test.cpp.o: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec_test.cpp.o +.PHONY : fec_test.cpp.o + +fec_test.i: fec_test.cpp.i + +.PHONY : fec_test.i + +# target to preprocess a source file +fec_test.cpp.i: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec_test.cpp.i +.PHONY : fec_test.cpp.i + +fec_test.s: fec_test.cpp.s + +.PHONY : fec_test.s + +# target to generate assembly for a file +fec_test.cpp.s: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec_test.cpp.s +.PHONY : fec_test.cpp.s + +galois.o: galois.cpp.o + +.PHONY : galois.o + +# target to build an object file +galois.cpp.o: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois.cpp.o + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois.cpp.o +.PHONY : galois.cpp.o + +galois.i: galois.cpp.i + +.PHONY : galois.i + +# target to preprocess a source file +galois.cpp.i: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois.cpp.i + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois.cpp.i +.PHONY : galois.cpp.i + +galois.s: galois.cpp.s + +.PHONY : galois.s + +# target to generate assembly for a file +galois.cpp.s: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois.cpp.s + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois.cpp.s +.PHONY : galois.cpp.s + +galois_noasm.o: galois_noasm.cpp.o + +.PHONY : galois_noasm.o + +# target to build an object file +galois_noasm.cpp.o: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_noasm.cpp.o + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_noasm.cpp.o +.PHONY : galois_noasm.cpp.o + +galois_noasm.i: galois_noasm.cpp.i + +.PHONY : galois_noasm.i + +# target to preprocess a source file +galois_noasm.cpp.i: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_noasm.cpp.i + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_noasm.cpp.i +.PHONY : galois_noasm.cpp.i + +galois_noasm.s: galois_noasm.cpp.s + +.PHONY : galois_noasm.s + +# target to generate assembly for a file +galois_noasm.cpp.s: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_noasm.cpp.s + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_noasm.cpp.s +.PHONY : galois_noasm.cpp.s + +galois_table.o: galois_table.c.o + +.PHONY : galois_table.o + +# target to build an object file +galois_table.c.o: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_table.c.o + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_table.c.o +.PHONY : galois_table.c.o + +galois_table.i: galois_table.c.i + +.PHONY : galois_table.i + +# target to preprocess a source file +galois_table.c.i: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_table.c.i + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_table.c.i +.PHONY : galois_table.c.i + +galois_table.s: galois_table.c.s + +.PHONY : galois_table.s + +# target to generate assembly for a file +galois_table.c.s: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_table.c.s + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_table.c.s +.PHONY : galois_table.c.s + +ikcp.o: ikcp.c.o + +.PHONY : ikcp.o + +# target to build an object file +ikcp.c.o: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/ikcp.c.o + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/ikcp.c.o +.PHONY : ikcp.c.o + +ikcp.i: ikcp.c.i + +.PHONY : ikcp.i + +# target to preprocess a source file +ikcp.c.i: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/ikcp.c.i + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/ikcp.c.i +.PHONY : ikcp.c.i + +ikcp.s: ikcp.c.s + +.PHONY : ikcp.s + +# target to generate assembly for a file +ikcp.c.s: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/ikcp.c.s + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/ikcp.c.s +.PHONY : ikcp.c.s + +inversion_tree.o: inversion_tree.cpp.o + +.PHONY : inversion_tree.o + +# target to build an object file +inversion_tree.cpp.o: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/inversion_tree.cpp.o + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/inversion_tree.cpp.o +.PHONY : inversion_tree.cpp.o + +inversion_tree.i: inversion_tree.cpp.i + +.PHONY : inversion_tree.i + +# target to preprocess a source file +inversion_tree.cpp.i: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/inversion_tree.cpp.i + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/inversion_tree.cpp.i +.PHONY : inversion_tree.cpp.i + +inversion_tree.s: inversion_tree.cpp.s + +.PHONY : inversion_tree.s + +# target to generate assembly for a file +inversion_tree.cpp.s: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/inversion_tree.cpp.s + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/inversion_tree.cpp.s +.PHONY : inversion_tree.cpp.s + +kcp_test.o: kcp_test.cpp.o + +.PHONY : kcp_test.o + +# target to build an object file +kcp_test.cpp.o: + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/kcp_test.cpp.o +.PHONY : kcp_test.cpp.o + +kcp_test.i: kcp_test.cpp.i + +.PHONY : kcp_test.i + +# target to preprocess a source file +kcp_test.cpp.i: + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/kcp_test.cpp.i +.PHONY : kcp_test.cpp.i + +kcp_test.s: kcp_test.cpp.s + +.PHONY : kcp_test.s + +# target to generate assembly for a file +kcp_test.cpp.s: + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/kcp_test.cpp.s +.PHONY : kcp_test.cpp.s + +matrix.o: matrix.cpp.o + +.PHONY : matrix.o + +# target to build an object file +matrix.cpp.o: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/matrix.cpp.o + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/matrix.cpp.o +.PHONY : matrix.cpp.o + +matrix.i: matrix.cpp.i + +.PHONY : matrix.i + +# target to preprocess a source file +matrix.cpp.i: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/matrix.cpp.i + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/matrix.cpp.i +.PHONY : matrix.cpp.i + +matrix.s: matrix.cpp.s + +.PHONY : matrix.s + +# target to generate assembly for a file +matrix.cpp.s: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/matrix.cpp.s + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/matrix.cpp.s +.PHONY : matrix.cpp.s + +reedsolomon.o: reedsolomon.cpp.o + +.PHONY : reedsolomon.o + +# target to build an object file +reedsolomon.cpp.o: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/reedsolomon.cpp.o + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/reedsolomon.cpp.o +.PHONY : reedsolomon.cpp.o + +reedsolomon.i: reedsolomon.cpp.i + +.PHONY : reedsolomon.i + +# target to preprocess a source file +reedsolomon.cpp.i: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/reedsolomon.cpp.i + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/reedsolomon.cpp.i +.PHONY : reedsolomon.cpp.i + +reedsolomon.s: reedsolomon.cpp.s + +.PHONY : reedsolomon.s + +# target to generate assembly for a file +reedsolomon.cpp.s: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/reedsolomon.cpp.s + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/reedsolomon.cpp.s +.PHONY : reedsolomon.cpp.s + +sess.o: sess.cpp.o + +.PHONY : sess.o + +# target to build an object file +sess.cpp.o: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/sess.cpp.o + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/sess.cpp.o +.PHONY : sess.cpp.o + +sess.i: sess.cpp.i + +.PHONY : sess.i + +# target to preprocess a source file +sess.cpp.i: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/sess.cpp.i + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/sess.cpp.i +.PHONY : sess.cpp.i + +sess.s: sess.cpp.s + +.PHONY : sess.s + +# target to generate assembly for a file +sess.cpp.s: + $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/sess.cpp.s + $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/sess.cpp.s +.PHONY : sess.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... rebuild_cache" + @echo "... edit_cache" + @echo "... fec_test" + @echo "... kcp_test" + @echo "... fec.o" + @echo "... fec.i" + @echo "... fec.s" + @echo "... fec_test.o" + @echo "... fec_test.i" + @echo "... fec_test.s" + @echo "... galois.o" + @echo "... galois.i" + @echo "... galois.s" + @echo "... galois_noasm.o" + @echo "... galois_noasm.i" + @echo "... galois_noasm.s" + @echo "... galois_table.o" + @echo "... galois_table.i" + @echo "... galois_table.s" + @echo "... ikcp.o" + @echo "... ikcp.i" + @echo "... ikcp.s" + @echo "... inversion_tree.o" + @echo "... inversion_tree.i" + @echo "... inversion_tree.s" + @echo "... kcp_test.o" + @echo "... kcp_test.i" + @echo "... kcp_test.s" + @echo "... matrix.o" + @echo "... matrix.i" + @echo "... matrix.s" + @echo "... reedsolomon.o" + @echo "... reedsolomon.i" + @echo "... reedsolomon.s" + @echo "... sess.o" + @echo "... sess.i" + @echo "... sess.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/cmake_install.cmake b/cmake_install.cmake new file mode 100644 index 0000000..25a6f0c --- /dev/null +++ b/cmake_install.cmake @@ -0,0 +1,39 @@ +# Install script for directory: /Users/yarshure/github/libkcp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/Users/yarshure/github/libkcp/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/fec_test b/fec_test new file mode 100755 index 0000000000000000000000000000000000000000..e7eb1e7bf0f201fa1df1f6c15413cd0e8fe60b74 GIT binary patch literal 275524 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�x-rQE$>SKJI|9zceqNnLGu@~3XH&U16h<8-Z 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 SuQNBzE7UiLh#h|kM#82--*|sEJ8lXP> zqk>DEFY95Q%M}En~K2p1x&-3+f^oA9;N4Ucdx+@2FvBHUqe*;z|S)3H~XkP z*d_O=zOC|ES;o&)%JE~};k(X?EQU!;nT<{RdB%>;Dc>mdWf6KV7G>*hnKCNt7DkPm zZbr=a-F=0!GvTy)r7i0_PZ_&Z*w61u2YSj@R7`uuXnQGnLQ|A4bWOwHP|GUNAzHp{ zBQu2w!P8i@jMiTB=k10ex|r3oE`nUZ>6-R?K*)%tC7T*oU8eogV`ruf(09ZU>Y z>-|gpLKipFA9BjIpj4G4-3rp=LXu?0$xNiWyp$x#{(2%(-AG=yGL_^m1-%lyWh+RL zD#@slrBzZ&Ag|`FKD`kn$z5hsgpzH3DS1z2#w%IgOo}cON#>Q5Q)?I5=#^~sD_NZ@ zDf>*82yfYW8%s*j=$ArOQi6$;U?RuDMDn_nZLIXywbEG1RH`nObjoNeX^E*!G?O)& z$r{aWNgsaj)@lvsZ|G3JC~6ln>|20Qo?Yy+T@bjlD;~RB0Uu+mWX-MW&%2#Bfim`K GCj5U4Me2J1 literal 0 HcmV?d00001 diff --git a/iOSLib/libkcp/kcptest/AppDelegate.h b/iOSLib/libkcp/kcptest/AppDelegate.h new file mode 100644 index 0000000..343adf7 --- /dev/null +++ b/iOSLib/libkcp/kcptest/AppDelegate.h @@ -0,0 +1,17 @@ +// +// AppDelegate.h +// kcptest +// +// Created by 孔祥波 on 28/04/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + + +@end + diff --git a/iOSLib/libkcp/kcptest/AppDelegate.mm b/iOSLib/libkcp/kcptest/AppDelegate.mm new file mode 100644 index 0000000..2f07d95 --- /dev/null +++ b/iOSLib/libkcp/kcptest/AppDelegate.mm @@ -0,0 +1,51 @@ +// +// AppDelegate.m +// kcptest +// +// Created by 孔祥波 on 28/04/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + return YES; +} + + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. +} + + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. +} + + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + + +@end diff --git a/iOSLib/libkcp/kcptest/Assets.xcassets/AppIcon.appiconset/Contents.json b/iOSLib/libkcp/kcptest/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..118c98f --- /dev/null +++ b/iOSLib/libkcp/kcptest/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/iOSLib/libkcp/kcptest/Base.lproj/LaunchScreen.storyboard b/iOSLib/libkcp/kcptest/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..fdf3f97 --- /dev/null +++ b/iOSLib/libkcp/kcptest/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard b/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f0322d6 --- /dev/null +++ b/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOSLib/libkcp/kcptest/Info.plist b/iOSLib/libkcp/kcptest/Info.plist new file mode 100644 index 0000000..38e98af --- /dev/null +++ b/iOSLib/libkcp/kcptest/Info.plist @@ -0,0 +1,38 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/iOSLib/libkcp/kcptest/ViewController.h b/iOSLib/libkcp/kcptest/ViewController.h new file mode 100644 index 0000000..91ba784 --- /dev/null +++ b/iOSLib/libkcp/kcptest/ViewController.h @@ -0,0 +1,15 @@ +// +// ViewController.h +// kcptest +// +// Created by 孔祥波 on 28/04/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#import +#import "test.h" +@interface ViewController : UIViewController + + +@end + diff --git a/iOSLib/libkcp/kcptest/ViewController.mm b/iOSLib/libkcp/kcptest/ViewController.mm new file mode 100644 index 0000000..a34a876 --- /dev/null +++ b/iOSLib/libkcp/kcptest/ViewController.mm @@ -0,0 +1,38 @@ +// +// ViewController.m +// kcptest +// +// Created by 孔祥波 on 28/04/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#import "ViewController.h" + +@interface ViewController () +@property (weak, nonatomic) IBOutlet UITextField *addr; +@property (weak, nonatomic) IBOutlet UITextField *port; + +@end + +@implementation ViewController + +- (void)viewDidLoad { + + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. +} +- (IBAction)go:(id)sender { + //kcptest(, ); + const char *addr = [self.addr.text UTF8String]; + int port = [self.port.text integerValue]; + kcptest(addr,port ); +} + + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + + +@end diff --git a/iOSLib/libkcp/kcptest/main.m b/iOSLib/libkcp/kcptest/main.m new file mode 100644 index 0000000..d34d434 --- /dev/null +++ b/iOSLib/libkcp/kcptest/main.m @@ -0,0 +1,16 @@ +// +// main.m +// kcptest +// +// Created by 孔祥波 on 28/04/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/iOSLib/libkcp/kcptest/test.h b/iOSLib/libkcp/kcptest/test.h new file mode 100644 index 0000000..ceb5d00 --- /dev/null +++ b/iOSLib/libkcp/kcptest/test.h @@ -0,0 +1,13 @@ +// +// test.h +// libkcp +// +// Created by 孔祥波 on 28/04/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#ifndef test_h +#define test_h +int kcptest(const char *addr,int port); + +#endif /* test_h */ diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6802778 --- /dev/null +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -0,0 +1,573 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 692AE3261EB2EE59006A4B9D /* libkcp.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3241EB2EE59006A4B9D /* libkcp.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 692AE32D1EB2EE98006A4B9D /* fec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE32C1EB2EE98006A4B9D /* fec.cpp */; }; + 692AE32F1EB2EEB0006A4B9D /* ikcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 692AE32E1EB2EEB0006A4B9D /* ikcp.c */; }; + 692AE3311EB2EEBD006A4B9D /* sess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3301EB2EEBD006A4B9D /* sess.cpp */; }; + 692AE3331EB2EEE6006A4B9D /* sess.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3321EB2EEE6006A4B9D /* sess.h */; }; + 692AE3361EB2EEEF006A4B9D /* reedsolomon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3341EB2EEEF006A4B9D /* reedsolomon.cpp */; }; + 692AE3371EB2EEEF006A4B9D /* reedsolomon.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3351EB2EEEF006A4B9D /* reedsolomon.h */; }; + 692AE33A1EB2EEF9006A4B9D /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3381EB2EEF9006A4B9D /* matrix.cpp */; }; + 692AE33B1EB2EEF9006A4B9D /* matrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3391EB2EEF9006A4B9D /* matrix.h */; }; + 692AE33E1EB2EF0B006A4B9D /* inversion_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE33C1EB2EF0B006A4B9D /* inversion_tree.cpp */; }; + 692AE33F1EB2EF0B006A4B9D /* inversion_tree.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE33D1EB2EF0B006A4B9D /* inversion_tree.h */; }; + 692AE3411EB2EF11006A4B9D /* ikcp.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3401EB2EF11006A4B9D /* ikcp.h */; }; + 692AE3481EB2EF1C006A4B9D /* fec.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3421EB2EF1C006A4B9D /* fec.h */; }; + 692AE3491EB2EF1C006A4B9D /* galois_noasm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3431EB2EF1C006A4B9D /* galois_noasm.cpp */; }; + 692AE34A1EB2EF1C006A4B9D /* galois_noasm.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3441EB2EF1C006A4B9D /* galois_noasm.h */; }; + 692AE34B1EB2EF1C006A4B9D /* galois_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3451EB2EF1C006A4B9D /* galois_table.c */; }; + 692AE34C1EB2EF1C006A4B9D /* galois.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3461EB2EF1C006A4B9D /* galois.cpp */; }; + 692AE34D1EB2EF1C006A4B9D /* galois.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3471EB2EF1C006A4B9D /* galois.h */; }; + 692AE34F1EB2EF25006A4B9D /* encoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE34E1EB2EF25006A4B9D /* encoding.h */; }; + 692AE3581EB2EF83006A4B9D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3571EB2EF83006A4B9D /* main.m */; }; + 692AE35B1EB2EF83006A4B9D /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 692AE35A1EB2EF83006A4B9D /* AppDelegate.mm */; }; + 692AE35E1EB2EF83006A4B9D /* ViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 692AE35D1EB2EF83006A4B9D /* ViewController.mm */; }; + 692AE3611EB2EF83006A4B9D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 692AE35F1EB2EF83006A4B9D /* Main.storyboard */; }; + 692AE3631EB2EF83006A4B9D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 692AE3621EB2EF83006A4B9D /* Assets.xcassets */; }; + 692AE3661EB2EF83006A4B9D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 692AE3641EB2EF83006A4B9D /* LaunchScreen.storyboard */; }; + 692AE36C1EB2EF91006A4B9D /* kcp_test.mm in Sources */ = {isa = PBXBuildFile; fileRef = 692AE36B1EB2EF91006A4B9D /* kcp_test.mm */; }; + 692AE36D1EB2EF9C006A4B9D /* libkcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; }; + 692AE3711EB2F191006A4B9D /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3701EB2F191006A4B9D /* libc++.tbd */; }; + 69C757811EB2F96D00139321 /* libkcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; }; + 69C757821EB2F96D00139321 /* libkcp.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 69C757831EB2F96D00139321 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 692AE3181EB2EE59006A4B9D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 692AE3201EB2EE59006A4B9D; + remoteInfo = libkcp; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 69C757851EB2F96D00139321 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 69C757821EB2F96D00139321 /* libkcp.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 692AE3211EB2EE59006A4B9D /* libkcp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libkcp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 692AE3241EB2EE59006A4B9D /* libkcp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libkcp.h; sourceTree = ""; }; + 692AE3251EB2EE59006A4B9D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 692AE32C1EB2EE98006A4B9D /* fec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fec.cpp; path = ../../../fec.cpp; sourceTree = ""; }; + 692AE32E1EB2EEB0006A4B9D /* ikcp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ikcp.c; path = ../../../ikcp.c; sourceTree = ""; }; + 692AE3301EB2EEBD006A4B9D /* sess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sess.cpp; path = ../../../sess.cpp; sourceTree = ""; }; + 692AE3321EB2EEE6006A4B9D /* sess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sess.h; path = ../../../sess.h; sourceTree = ""; }; + 692AE3341EB2EEEF006A4B9D /* reedsolomon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = reedsolomon.cpp; path = ../../../reedsolomon.cpp; sourceTree = ""; }; + 692AE3351EB2EEEF006A4B9D /* reedsolomon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = reedsolomon.h; path = ../../../reedsolomon.h; sourceTree = ""; }; + 692AE3381EB2EEF9006A4B9D /* matrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = matrix.cpp; path = ../../../matrix.cpp; sourceTree = ""; }; + 692AE3391EB2EEF9006A4B9D /* matrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = matrix.h; path = ../../../matrix.h; sourceTree = ""; }; + 692AE33C1EB2EF0B006A4B9D /* inversion_tree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = inversion_tree.cpp; path = ../../../inversion_tree.cpp; sourceTree = ""; }; + 692AE33D1EB2EF0B006A4B9D /* inversion_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = inversion_tree.h; path = ../../../inversion_tree.h; sourceTree = ""; }; + 692AE3401EB2EF11006A4B9D /* ikcp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ikcp.h; path = ../../../ikcp.h; sourceTree = ""; }; + 692AE3421EB2EF1C006A4B9D /* fec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fec.h; path = ../../../fec.h; sourceTree = ""; }; + 692AE3431EB2EF1C006A4B9D /* galois_noasm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = galois_noasm.cpp; path = ../../../galois_noasm.cpp; sourceTree = ""; }; + 692AE3441EB2EF1C006A4B9D /* galois_noasm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = galois_noasm.h; path = ../../../galois_noasm.h; sourceTree = ""; }; + 692AE3451EB2EF1C006A4B9D /* galois_table.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = galois_table.c; path = ../../../galois_table.c; sourceTree = ""; }; + 692AE3461EB2EF1C006A4B9D /* galois.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = galois.cpp; path = ../../../galois.cpp; sourceTree = ""; }; + 692AE3471EB2EF1C006A4B9D /* galois.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = galois.h; path = ../../../galois.h; sourceTree = ""; }; + 692AE34E1EB2EF25006A4B9D /* encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding.h; path = ../../../encoding.h; sourceTree = ""; }; + 692AE3541EB2EF83006A4B9D /* kcptest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = kcptest.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 692AE3571EB2EF83006A4B9D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 692AE3591EB2EF83006A4B9D /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 692AE35A1EB2EF83006A4B9D /* AppDelegate.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegate.mm; sourceTree = ""; }; + 692AE35C1EB2EF83006A4B9D /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 692AE35D1EB2EF83006A4B9D /* ViewController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ViewController.mm; sourceTree = ""; }; + 692AE3601EB2EF83006A4B9D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 692AE3621EB2EF83006A4B9D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 692AE3651EB2EF83006A4B9D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 692AE3671EB2EF83006A4B9D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 692AE36B1EB2EF91006A4B9D /* kcp_test.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = kcp_test.mm; path = ../../../kcp_test.mm; sourceTree = ""; }; + 692AE36E1EB2F07B006A4B9D /* test.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = test.h; sourceTree = ""; }; + 692AE3701EB2F191006A4B9D /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 692AE31D1EB2EE59006A4B9D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 692AE3511EB2EF83006A4B9D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 692AE3711EB2F191006A4B9D /* libc++.tbd in Frameworks */, + 69C757811EB2F96D00139321 /* libkcp.framework in Frameworks */, + 692AE36D1EB2EF9C006A4B9D /* libkcp.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 692AE3171EB2EE59006A4B9D = { + isa = PBXGroup; + children = ( + 692AE3231EB2EE59006A4B9D /* libkcp */, + 692AE3551EB2EF83006A4B9D /* kcptest */, + 692AE3221EB2EE59006A4B9D /* Products */, + 692AE36F1EB2F191006A4B9D /* Frameworks */, + ); + sourceTree = ""; + }; + 692AE3221EB2EE59006A4B9D /* Products */ = { + isa = PBXGroup; + children = ( + 692AE3211EB2EE59006A4B9D /* libkcp.framework */, + 692AE3541EB2EF83006A4B9D /* kcptest.app */, + ); + name = Products; + sourceTree = ""; + }; + 692AE3231EB2EE59006A4B9D /* libkcp */ = { + isa = PBXGroup; + children = ( + 692AE34E1EB2EF25006A4B9D /* encoding.h */, + 692AE3421EB2EF1C006A4B9D /* fec.h */, + 692AE3431EB2EF1C006A4B9D /* galois_noasm.cpp */, + 692AE3441EB2EF1C006A4B9D /* galois_noasm.h */, + 692AE3451EB2EF1C006A4B9D /* galois_table.c */, + 692AE3461EB2EF1C006A4B9D /* galois.cpp */, + 692AE3471EB2EF1C006A4B9D /* galois.h */, + 692AE33C1EB2EF0B006A4B9D /* inversion_tree.cpp */, + 692AE33D1EB2EF0B006A4B9D /* inversion_tree.h */, + 692AE3381EB2EEF9006A4B9D /* matrix.cpp */, + 692AE3401EB2EF11006A4B9D /* ikcp.h */, + 692AE3391EB2EEF9006A4B9D /* matrix.h */, + 692AE3341EB2EEEF006A4B9D /* reedsolomon.cpp */, + 692AE3351EB2EEEF006A4B9D /* reedsolomon.h */, + 692AE3321EB2EEE6006A4B9D /* sess.h */, + 692AE3301EB2EEBD006A4B9D /* sess.cpp */, + 692AE32E1EB2EEB0006A4B9D /* ikcp.c */, + 692AE32C1EB2EE98006A4B9D /* fec.cpp */, + 692AE3241EB2EE59006A4B9D /* libkcp.h */, + 692AE3251EB2EE59006A4B9D /* Info.plist */, + ); + path = libkcp; + sourceTree = ""; + }; + 692AE3551EB2EF83006A4B9D /* kcptest */ = { + isa = PBXGroup; + children = ( + 692AE36B1EB2EF91006A4B9D /* kcp_test.mm */, + 692AE36E1EB2F07B006A4B9D /* test.h */, + 692AE3591EB2EF83006A4B9D /* AppDelegate.h */, + 692AE35A1EB2EF83006A4B9D /* AppDelegate.mm */, + 692AE35C1EB2EF83006A4B9D /* ViewController.h */, + 692AE35D1EB2EF83006A4B9D /* ViewController.mm */, + 692AE35F1EB2EF83006A4B9D /* Main.storyboard */, + 692AE3621EB2EF83006A4B9D /* Assets.xcassets */, + 692AE3641EB2EF83006A4B9D /* LaunchScreen.storyboard */, + 692AE3671EB2EF83006A4B9D /* Info.plist */, + 692AE3561EB2EF83006A4B9D /* Supporting Files */, + ); + path = kcptest; + sourceTree = ""; + }; + 692AE3561EB2EF83006A4B9D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 692AE3571EB2EF83006A4B9D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 692AE36F1EB2F191006A4B9D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 692AE3701EB2F191006A4B9D /* libc++.tbd */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 692AE31E1EB2EE59006A4B9D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 692AE34A1EB2EF1C006A4B9D /* galois_noasm.h in Headers */, + 692AE34F1EB2EF25006A4B9D /* encoding.h in Headers */, + 692AE33F1EB2EF0B006A4B9D /* inversion_tree.h in Headers */, + 692AE3371EB2EEEF006A4B9D /* reedsolomon.h in Headers */, + 692AE3481EB2EF1C006A4B9D /* fec.h in Headers */, + 692AE3331EB2EEE6006A4B9D /* sess.h in Headers */, + 692AE3261EB2EE59006A4B9D /* libkcp.h in Headers */, + 692AE33B1EB2EEF9006A4B9D /* matrix.h in Headers */, + 692AE3411EB2EF11006A4B9D /* ikcp.h in Headers */, + 692AE34D1EB2EF1C006A4B9D /* galois.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 692AE3201EB2EE59006A4B9D /* libkcp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 692AE3291EB2EE59006A4B9D /* Build configuration list for PBXNativeTarget "libkcp" */; + buildPhases = ( + 692AE31C1EB2EE59006A4B9D /* Sources */, + 692AE31D1EB2EE59006A4B9D /* Frameworks */, + 692AE31E1EB2EE59006A4B9D /* Headers */, + 692AE31F1EB2EE59006A4B9D /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = libkcp; + productName = libkcp; + productReference = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; + productType = "com.apple.product-type.framework"; + }; + 692AE3531EB2EF83006A4B9D /* kcptest */ = { + isa = PBXNativeTarget; + buildConfigurationList = 692AE3681EB2EF83006A4B9D /* Build configuration list for PBXNativeTarget "kcptest" */; + buildPhases = ( + 692AE3501EB2EF83006A4B9D /* Sources */, + 692AE3511EB2EF83006A4B9D /* Frameworks */, + 692AE3521EB2EF83006A4B9D /* Resources */, + 69C757851EB2F96D00139321 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 69C757841EB2F96D00139321 /* PBXTargetDependency */, + ); + name = kcptest; + productName = kcptest; + productReference = 692AE3541EB2EF83006A4B9D /* kcptest.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 692AE3181EB2EE59006A4B9D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = "Kong XiangBo"; + TargetAttributes = { + 692AE3201EB2EE59006A4B9D = { + CreatedOnToolsVersion = 8.3.2; + DevelopmentTeam = 745WQDK4L7; + ProvisioningStyle = Automatic; + }; + 692AE3531EB2EF83006A4B9D = { + CreatedOnToolsVersion = 8.3.2; + DevelopmentTeam = 745WQDK4L7; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 692AE31B1EB2EE59006A4B9D /* Build configuration list for PBXProject "libkcp" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 692AE3171EB2EE59006A4B9D; + productRefGroup = 692AE3221EB2EE59006A4B9D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 692AE3201EB2EE59006A4B9D /* libkcp */, + 692AE3531EB2EF83006A4B9D /* kcptest */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 692AE31F1EB2EE59006A4B9D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 692AE3521EB2EF83006A4B9D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 692AE3661EB2EF83006A4B9D /* LaunchScreen.storyboard in Resources */, + 692AE3631EB2EF83006A4B9D /* Assets.xcassets in Resources */, + 692AE3611EB2EF83006A4B9D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 692AE31C1EB2EE59006A4B9D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 692AE3491EB2EF1C006A4B9D /* galois_noasm.cpp in Sources */, + 692AE33A1EB2EEF9006A4B9D /* matrix.cpp in Sources */, + 692AE33E1EB2EF0B006A4B9D /* inversion_tree.cpp in Sources */, + 692AE32F1EB2EEB0006A4B9D /* ikcp.c in Sources */, + 692AE34C1EB2EF1C006A4B9D /* galois.cpp in Sources */, + 692AE32D1EB2EE98006A4B9D /* fec.cpp in Sources */, + 692AE34B1EB2EF1C006A4B9D /* galois_table.c in Sources */, + 692AE3311EB2EEBD006A4B9D /* sess.cpp in Sources */, + 692AE3361EB2EEEF006A4B9D /* reedsolomon.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 692AE3501EB2EF83006A4B9D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 692AE35E1EB2EF83006A4B9D /* ViewController.mm in Sources */, + 692AE35B1EB2EF83006A4B9D /* AppDelegate.mm in Sources */, + 692AE36C1EB2EF91006A4B9D /* kcp_test.mm in Sources */, + 692AE3581EB2EF83006A4B9D /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 69C757841EB2F96D00139321 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 692AE3201EB2EE59006A4B9D /* libkcp */; + targetProxy = 69C757831EB2F96D00139321 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 692AE35F1EB2EF83006A4B9D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 692AE3601EB2EF83006A4B9D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 692AE3641EB2EF83006A4B9D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 692AE3651EB2EF83006A4B9D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 692AE3271EB2EE59006A4B9D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 692AE3281EB2EE59006A4B9D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 692AE32A1EB2EE59006A4B9D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 745WQDK4L7; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = libkcp/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.squash.libkcp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 692AE32B1EB2EE59006A4B9D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 745WQDK4L7; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = libkcp/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.squash.libkcp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 692AE3691EB2EF83006A4B9D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = 745WQDK4L7; + INFOPLIST_FILE = kcptest/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcptest; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 692AE36A1EB2EF83006A4B9D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = 745WQDK4L7; + INFOPLIST_FILE = kcptest/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcptest; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 692AE31B1EB2EE59006A4B9D /* Build configuration list for PBXProject "libkcp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 692AE3271EB2EE59006A4B9D /* Debug */, + 692AE3281EB2EE59006A4B9D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 692AE3291EB2EE59006A4B9D /* Build configuration list for PBXNativeTarget "libkcp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 692AE32A1EB2EE59006A4B9D /* Debug */, + 692AE32B1EB2EE59006A4B9D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 692AE3681EB2EF83006A4B9D /* Build configuration list for PBXNativeTarget "kcptest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 692AE3691EB2EF83006A4B9D /* Debug */, + 692AE36A1EB2EF83006A4B9D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 692AE3181EB2EE59006A4B9D /* Project object */; +} diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..909aebb --- /dev/null +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..73506c847e75a4ef497051091916348b5618c5a3 GIT binary patch literal 22718 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 literal 0 HcmV?d00001 diff --git a/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/libkcp.xcscheme b/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/libkcp.xcscheme new file mode 100644 index 0000000..74eca3a --- /dev/null +++ b/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/libkcp.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/xcschememanagement.plist b/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..4d3d20f --- /dev/null +++ b/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,32 @@ + + + + + SchemeUserState + + kcptest.xcscheme + + orderHint + 1 + + libkcp.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 692AE3201EB2EE59006A4B9D + + primary + + + 692AE3531EB2EF83006A4B9D + + primary + + + + + diff --git a/iOSLib/libkcp/libkcp/Info.plist b/iOSLib/libkcp/libkcp/Info.plist new file mode 100644 index 0000000..fbe1e6b --- /dev/null +++ b/iOSLib/libkcp/libkcp/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/iOSLib/libkcp/libkcp/libkcp.h b/iOSLib/libkcp/libkcp/libkcp.h new file mode 100644 index 0000000..b4c7a3d --- /dev/null +++ b/iOSLib/libkcp/libkcp/libkcp.h @@ -0,0 +1,19 @@ +// +// libkcp.h +// libkcp +// +// Created by 孔祥波 on 28/04/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#import + +//! Project version number for libkcp. +FOUNDATION_EXPORT double libkcpVersionNumber; + +//! Project version string for libkcp. +FOUNDATION_EXPORT const unsigned char libkcpVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/kcp_test b/kcp_test new file mode 100755 index 0000000000000000000000000000000000000000..648e36cd4649a2fcedd7d0399b5de0577f794239 GIT binary patch literal 252020 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
WfL)ZWun77W?4@G1GN3M0CB$X(E;dwQcHH#?@ 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 z
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 {V||V`vG?Y|*w}K3YtV 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ξ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
C^5w%?;C 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 From 534cb104ff273280a75e01a5b5e37bcbc8dc4d53 Mon Sep 17 00:00:00 2001 From: abigt Date: Wed, 3 May 2017 17:06:14 +0800 Subject: [PATCH 11/56] kcp tun input Date update ,support large data --- iOSLib/libkcp/kcptest/ViewController.h | 2 +- .../libkcp/libkcp.xcodeproj/project.pbxproj | 42 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 40535 -> 38710 bytes .../xcshareddata/xcschemes/libkcp.xcscheme | 12 ++--- iOSLib/libkcp/libkcp/SFKcpTun.mm | 19 ++++++-- iOSLib/libkcp/libkcp/{libkcp.h => kcp.h} | 4 +- 6 files changed, 46 insertions(+), 33 deletions(-) rename iOSLib/libkcp/libkcp/{libkcp.h => kcp.h} (88%) diff --git a/iOSLib/libkcp/kcptest/ViewController.h b/iOSLib/libkcp/kcptest/ViewController.h index 453a1e5..a08162a 100644 --- a/iOSLib/libkcp/kcptest/ViewController.h +++ b/iOSLib/libkcp/kcptest/ViewController.h @@ -7,7 +7,7 @@ // #import -#import "libkcp.h" +#import "kcp.h" @interface ViewController : UIViewController diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 9e2f4c8..415c31f 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 692AE3261EB2EE59006A4B9D /* libkcp.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3241EB2EE59006A4B9D /* libkcp.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 692AE3261EB2EE59006A4B9D /* kcp.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3241EB2EE59006A4B9D /* kcp.h */; settings = {ATTRIBUTES = (Public, ); }; }; 692AE32D1EB2EE98006A4B9D /* fec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE32C1EB2EE98006A4B9D /* fec.cpp */; }; 692AE32F1EB2EEB0006A4B9D /* ikcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 692AE32E1EB2EEB0006A4B9D /* ikcp.c */; }; 692AE3311EB2EEBD006A4B9D /* sess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3301EB2EEBD006A4B9D /* sess.cpp */; }; @@ -32,10 +32,10 @@ 692AE3611EB2EF83006A4B9D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 692AE35F1EB2EF83006A4B9D /* Main.storyboard */; }; 692AE3631EB2EF83006A4B9D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 692AE3621EB2EF83006A4B9D /* Assets.xcassets */; }; 692AE3661EB2EF83006A4B9D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 692AE3641EB2EF83006A4B9D /* LaunchScreen.storyboard */; }; - 692AE36D1EB2EF9C006A4B9D /* libkcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; }; + 692AE36D1EB2EF9C006A4B9D /* kcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; }; 692AE3711EB2F191006A4B9D /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3701EB2F191006A4B9D /* libc++.tbd */; }; - 69C757811EB2F96D00139321 /* libkcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; }; - 69C757821EB2F96D00139321 /* libkcp.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 69C757811EB2F96D00139321 /* kcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; }; + 69C757821EB2F96D00139321 /* kcp.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 69FFC6A01EB30985008A030D /* SFKcpTun.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC69E1EB30985008A030D /* SFKcpTun.h */; settings = {ATTRIBUTES = (Public, ); }; }; 69FFC6A11EB30985008A030D /* SFKcpTun.mm in Sources */ = {isa = PBXBuildFile; fileRef = 69FFC69F1EB30985008A030D /* SFKcpTun.mm */; }; 69FFC6A51EB309E8008A030D /* TunConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC6A31EB309E8008A030D /* TunConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -59,7 +59,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 69C757821EB2F96D00139321 /* libkcp.framework in Embed Frameworks */, + 69C757821EB2F96D00139321 /* kcp.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -67,8 +67,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 692AE3211EB2EE59006A4B9D /* libkcp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libkcp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 692AE3241EB2EE59006A4B9D /* libkcp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libkcp.h; sourceTree = ""; }; + 692AE3211EB2EE59006A4B9D /* kcp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = kcp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 692AE3241EB2EE59006A4B9D /* kcp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = kcp.h; sourceTree = ""; }; 692AE3251EB2EE59006A4B9D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 692AE32C1EB2EE98006A4B9D /* fec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fec.cpp; path = ../../../fec.cpp; sourceTree = ""; }; 692AE32E1EB2EEB0006A4B9D /* ikcp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ikcp.c; path = ../../../ikcp.c; sourceTree = ""; }; @@ -119,8 +119,8 @@ buildActionMask = 2147483647; files = ( 692AE3711EB2F191006A4B9D /* libc++.tbd in Frameworks */, - 69C757811EB2F96D00139321 /* libkcp.framework in Frameworks */, - 692AE36D1EB2EF9C006A4B9D /* libkcp.framework in Frameworks */, + 69C757811EB2F96D00139321 /* kcp.framework in Frameworks */, + 692AE36D1EB2EF9C006A4B9D /* kcp.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -141,7 +141,7 @@ 692AE3221EB2EE59006A4B9D /* Products */ = { isa = PBXGroup; children = ( - 692AE3211EB2EE59006A4B9D /* libkcp.framework */, + 692AE3211EB2EE59006A4B9D /* kcp.framework */, 692AE3541EB2EF83006A4B9D /* kcptest.app */, ); name = Products; @@ -168,7 +168,7 @@ 692AE3301EB2EEBD006A4B9D /* sess.cpp */, 692AE32E1EB2EEB0006A4B9D /* ikcp.c */, 692AE32C1EB2EE98006A4B9D /* fec.cpp */, - 692AE3241EB2EE59006A4B9D /* libkcp.h */, + 692AE3241EB2EE59006A4B9D /* kcp.h */, 692AE3251EB2EE59006A4B9D /* Info.plist */, ); path = libkcp; @@ -233,7 +233,7 @@ 692AE3371EB2EEEF006A4B9D /* reedsolomon.h in Headers */, 692AE3481EB2EF1C006A4B9D /* fec.h in Headers */, 692AE3331EB2EEE6006A4B9D /* sess.h in Headers */, - 692AE3261EB2EE59006A4B9D /* libkcp.h in Headers */, + 692AE3261EB2EE59006A4B9D /* kcp.h in Headers */, 692AE33B1EB2EEF9006A4B9D /* matrix.h in Headers */, 692AE3411EB2EF11006A4B9D /* ikcp.h in Headers */, 692AE34D1EB2EF1C006A4B9D /* galois.h in Headers */, @@ -243,9 +243,9 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 692AE3201EB2EE59006A4B9D /* libkcp */ = { + 692AE3201EB2EE59006A4B9D /* kcp */ = { isa = PBXNativeTarget; - buildConfigurationList = 692AE3291EB2EE59006A4B9D /* Build configuration list for PBXNativeTarget "libkcp" */; + buildConfigurationList = 692AE3291EB2EE59006A4B9D /* Build configuration list for PBXNativeTarget "kcp" */; buildPhases = ( 692AE31C1EB2EE59006A4B9D /* Sources */, 692AE31D1EB2EE59006A4B9D /* Frameworks */, @@ -256,9 +256,9 @@ ); dependencies = ( ); - name = libkcp; + name = kcp; productName = libkcp; - productReference = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; + productReference = 692AE3211EB2EE59006A4B9D /* kcp.framework */; productType = "com.apple.product-type.framework"; }; 692AE3531EB2EF83006A4B9D /* kcptest */ = { @@ -314,7 +314,7 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 692AE3201EB2EE59006A4B9D /* libkcp */, + 692AE3201EB2EE59006A4B9D /* kcp */, 692AE3531EB2EF83006A4B9D /* kcptest */, ); }; @@ -374,7 +374,7 @@ /* Begin PBXTargetDependency section */ 69C757841EB2F96D00139321 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 692AE3201EB2EE59006A4B9D /* libkcp */; + target = 692AE3201EB2EE59006A4B9D /* kcp */; targetProxy = 69C757831EB2F96D00139321 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -509,7 +509,7 @@ INFOPLIST_FILE = libkcp/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.squash.libkcp; + PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; @@ -527,7 +527,7 @@ INFOPLIST_FILE = libkcp/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.squash.libkcp; + PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; @@ -569,7 +569,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 692AE3291EB2EE59006A4B9D /* Build configuration list for PBXNativeTarget "libkcp" */ = { + 692AE3291EB2EE59006A4B9D /* Build configuration list for PBXNativeTarget "kcp" */ = { isa = XCConfigurationList; buildConfigurations = ( 692AE32A1EB2EE59006A4B9D /* Debug */, diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate index 814af55c69dd77a93ef0575323fde4aac29f7041..ca7a210cfded23788343815a89463bb8d6ed41b8 100644 GIT binary patch literal 38710 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 U8f?|3&40JsssHZ(Uwzwu0GzqE6aWAK diff --git a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme index 74eca3a..6316bae 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme +++ b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme @@ -15,8 +15,8 @@ @@ -46,8 +46,8 @@ @@ -64,8 +64,8 @@ diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 9fa0207..28beecd 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -49,6 +49,7 @@ -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port self.config = c; self.server = ip; self.port = port; + queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); [self startUDPSession]; } return self; @@ -89,15 +90,27 @@ -(void)input:(NSData*)data{ assert(sess != nullptr); - sess->Write((char *)data.bytes, data.length); - sess->Update(iclock()); + size_t tosend = data.length; + size_t sended = 0 ; + char *ptr = (char *)data.bytes; + while (sended < tosend) { + + + size_t sendt = sess->Write(ptr, data.length - sended); + sended += sendt ; + ptr += sended; + NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); + sess->Update(iclock()); + } + NSLog(@"KCPTun sent %zu",sended); + } -(void)run{ // // // Create a dispatch source that'll act as a timer on the concurrent queue // You'll need to store this somewhere so you can suspend and remove it later on - dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + // dispatch_source_t dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) diff --git a/iOSLib/libkcp/libkcp/libkcp.h b/iOSLib/libkcp/libkcp/kcp.h similarity index 88% rename from iOSLib/libkcp/libkcp/libkcp.h rename to iOSLib/libkcp/libkcp/kcp.h index ea51c33..45514bb 100644 --- a/iOSLib/libkcp/libkcp/libkcp.h +++ b/iOSLib/libkcp/libkcp/kcp.h @@ -15,7 +15,7 @@ FOUNDATION_EXPORT double libkcpVersionNumber; FOUNDATION_EXPORT const unsigned char libkcpVersionString[]; // In this header, you should import all the public headers of your framework using statements like -#import -#import +#import +#import From e2e15267cfb7ead438c77f08555ac8f532f68227 Mon Sep 17 00:00:00 2001 From: abigt Date: Thu, 4 May 2017 18:00:12 +0800 Subject: [PATCH 12/56] add crypt for Darwin platform --- .../libkcp/libkcp.xcodeproj/project.pbxproj | 26 +++++- iOSLib/libkcp/libkcp/BlockCrypt.cpp | 82 +++++++++++++++++++ iOSLib/libkcp/libkcp/BlockCrypt.h | 28 +++++++ iOSLib/libkcp/libkcp/Crypt.h | 18 ++++ iOSLib/libkcp/libkcp/Crypt.mm | 70 ++++++++++++++++ iOSLib/libkcp/libkcp/SFKcpTun.mm | 23 +++++- iOSLib/libkcp/libkcp/TunConfig.h | 5 ++ sess.cpp | 11 ++- sess.h | 5 +- 9 files changed, 261 insertions(+), 7 deletions(-) create mode 100644 iOSLib/libkcp/libkcp/BlockCrypt.cpp create mode 100644 iOSLib/libkcp/libkcp/BlockCrypt.h create mode 100644 iOSLib/libkcp/libkcp/Crypt.h create mode 100644 iOSLib/libkcp/libkcp/Crypt.mm diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 415c31f..41d7dcd 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -34,6 +34,9 @@ 692AE3661EB2EF83006A4B9D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 692AE3641EB2EF83006A4B9D /* LaunchScreen.storyboard */; }; 692AE36D1EB2EF9C006A4B9D /* kcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; }; 692AE3711EB2F191006A4B9D /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3701EB2F191006A4B9D /* libc++.tbd */; }; + 695165F51EBB2663008DCF66 /* BlockCrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 695165F31EBB2663008DCF66 /* BlockCrypt.cpp */; }; + 695165F61EBB2663008DCF66 /* BlockCrypt.h in Headers */ = {isa = PBXBuildFile; fileRef = 695165F41EBB2663008DCF66 /* BlockCrypt.h */; }; + 695165F91EBB32D2008DCF66 /* Crypt.mm in Sources */ = {isa = PBXBuildFile; fileRef = 695165F81EBB32D2008DCF66 /* Crypt.mm */; }; 69C757811EB2F96D00139321 /* kcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; }; 69C757821EB2F96D00139321 /* kcp.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 69FFC6A01EB30985008A030D /* SFKcpTun.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC69E1EB30985008A030D /* SFKcpTun.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -100,6 +103,10 @@ 692AE3671EB2EF83006A4B9D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 692AE36B1EB2EF91006A4B9D /* kcp_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = kcp_test.cpp; path = ../../../kcp_test.cpp; sourceTree = ""; }; 692AE3701EB2F191006A4B9D /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; + 695165F31EBB2663008DCF66 /* BlockCrypt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BlockCrypt.cpp; sourceTree = ""; }; + 695165F41EBB2663008DCF66 /* BlockCrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockCrypt.h; sourceTree = ""; }; + 695165F71EBB32D2008DCF66 /* Crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Crypt.h; path = libkcp/Crypt.h; sourceTree = SOURCE_ROOT; }; + 695165F81EBB32D2008DCF66 /* Crypt.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Crypt.mm; path = libkcp/Crypt.mm; sourceTree = SOURCE_ROOT; }; 69FFC69E1EB30985008A030D /* SFKcpTun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFKcpTun.h; path = libkcp/SFKcpTun.h; sourceTree = SOURCE_ROOT; }; 69FFC69F1EB30985008A030D /* SFKcpTun.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SFKcpTun.mm; path = libkcp/SFKcpTun.mm; sourceTree = SOURCE_ROOT; }; 69FFC6A31EB309E8008A030D /* TunConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TunConfig.h; path = libkcp/TunConfig.h; sourceTree = ""; }; @@ -130,7 +137,7 @@ 692AE3171EB2EE59006A4B9D = { isa = PBXGroup; children = ( - 69FFC6A21EB3098C008A030D /* tun_smux */, + 69FFC6A21EB3098C008A030D /* tun */, 692AE3231EB2EE59006A4B9D /* libkcp */, 692AE3551EB2EF83006A4B9D /* kcptest */, 692AE3221EB2EE59006A4B9D /* Products */, @@ -170,6 +177,8 @@ 692AE32C1EB2EE98006A4B9D /* fec.cpp */, 692AE3241EB2EE59006A4B9D /* kcp.h */, 692AE3251EB2EE59006A4B9D /* Info.plist */, + 695165F31EBB2663008DCF66 /* BlockCrypt.cpp */, + 695165F41EBB2663008DCF66 /* BlockCrypt.h */, ); path = libkcp; sourceTree = ""; @@ -177,6 +186,8 @@ 692AE3551EB2EF83006A4B9D /* kcptest */ = { isa = PBXGroup; children = ( + 695165F71EBB32D2008DCF66 /* Crypt.h */, + 695165F81EBB32D2008DCF66 /* Crypt.mm */, 692AE36B1EB2EF91006A4B9D /* kcp_test.cpp */, 692AE3591EB2EF83006A4B9D /* AppDelegate.h */, 692AE35A1EB2EF83006A4B9D /* AppDelegate.mm */, @@ -207,7 +218,7 @@ name = Frameworks; sourceTree = ""; }; - 69FFC6A21EB3098C008A030D /* tun_smux */ = { + 69FFC6A21EB3098C008A030D /* tun */ = { isa = PBXGroup; children = ( 69FFC69E1EB30985008A030D /* SFKcpTun.h */, @@ -215,7 +226,7 @@ 69FFC6A31EB309E8008A030D /* TunConfig.h */, 69FFC6A41EB309E8008A030D /* TunConfig.m */, ); - name = tun_smux; + name = tun; sourceTree = ""; }; /* End PBXGroup section */ @@ -237,6 +248,7 @@ 692AE33B1EB2EEF9006A4B9D /* matrix.h in Headers */, 692AE3411EB2EF11006A4B9D /* ikcp.h in Headers */, 692AE34D1EB2EF1C006A4B9D /* galois.h in Headers */, + 695165F61EBB2663008DCF66 /* BlockCrypt.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -292,6 +304,7 @@ 692AE3201EB2EE59006A4B9D = { CreatedOnToolsVersion = 8.3.2; DevelopmentTeam = 745WQDK4L7; + LastSwiftMigration = 0830; ProvisioningStyle = Automatic; }; 692AE3531EB2EF83006A4B9D = { @@ -354,6 +367,7 @@ 692AE32D1EB2EE98006A4B9D /* fec.cpp in Sources */, 692AE34B1EB2EF1C006A4B9D /* galois_table.c in Sources */, 69FFC6A11EB30985008A030D /* SFKcpTun.mm in Sources */, + 695165F51EBB2663008DCF66 /* BlockCrypt.cpp in Sources */, 692AE3311EB2EEBD006A4B9D /* sess.cpp in Sources */, 692AE3361EB2EEEF006A4B9D /* reedsolomon.cpp in Sources */, ); @@ -365,6 +379,7 @@ files = ( 692AE35E1EB2EF83006A4B9D /* ViewController.mm in Sources */, 692AE35B1EB2EF83006A4B9D /* AppDelegate.mm in Sources */, + 695165F91EBB32D2008DCF66 /* Crypt.mm in Sources */, 692AE3581EB2EF83006A4B9D /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -500,6 +515,7 @@ 692AE32A1EB2EE59006A4B9D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 745WQDK4L7; @@ -512,12 +528,15 @@ PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; }; name = Debug; }; 692AE32B1EB2EE59006A4B9D /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 745WQDK4L7; @@ -530,6 +549,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/iOSLib/libkcp/libkcp/BlockCrypt.cpp b/iOSLib/libkcp/libkcp/BlockCrypt.cpp new file mode 100644 index 0000000..0d51575 --- /dev/null +++ b/iOSLib/libkcp/libkcp/BlockCrypt.cpp @@ -0,0 +1,82 @@ +// +// BlockCrypt.cpp +// libkcp +// +// Created by 孔祥波 on 04/05/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#include "BlockCrypt.h" +const uint8_t iv[] = {167, 115, 79, 156, 18, 172, 27, 1, 164, 21, 242, 193, 252, 120, 230, 107}; +BlockCrypt* +BlockCrypt::blockWith(const void* key,const char* crypto){ + BlockCrypt *block = new (BlockCrypt); + + const void *ckey = key; + const void *ivPtr = iv; + size_t keyLen = 0; + if (strcmp(crypto,"aes") == 0){ + keyLen = 32; + }else if (strcmp(crypto,"aes-128") == 0){ + keyLen = 16; + }else { + keyLen = 24; + } + + CCCryptorStatus st = CCCryptorCreate(kCCEncrypt, kCCAlgorithmDES, 0, ckey, keyLen, ivPtr, block->send_ctx); + if (st != kCCSuccess){ + printf("send_ctx create error\n"); + } + st = CCCryptorCreate(kCCDecrypt, kCCAlgorithmDES, 0, ckey, keyLen, ivPtr, block->recv_ctx); + if (st != kCCSuccess){ + printf("recv_ctx create error \n"); + } + + return block; + +} +// output udp packet +char * +BlockCrypt::encrypt(const void *buffer, size_t length,size_t *outlen) +{ + + size_t len = length + kCCBlockSizeAES128; + + void *dataOut = malloc(len); + + CCCryptorStatus st = CCCryptorUpdate(*send_ctx, buffer, length, dataOut, len, outlen); + if (st != kCCSuccess){ + printf("encrypt data error"); + return (char*)dataOut; + }else { + ; + return (char*)dataOut; + } + +} +char * +BlockCrypt::decrypt(const void *buffer, size_t length,size_t *outlen) +{ + size_t len = length + kCCBlockSizeAES128; + + void *dataOut = malloc(len); + + CCCryptorStatus st = CCCryptorUpdate(*recv_ctx, buffer, length, dataOut, len, outlen); + if (st != kCCSuccess){ + printf("encrypt data error"); + return (char*)dataOut; + }else { + ; + return (char*)dataOut; + } +} +void +BlockCrypt::Destroy(BlockCrypt *block) { + if (block->send_ctx != NULL) { + CCCryptorRelease(*block->send_ctx); + } + if (block->recv_ctx != NULL) { + CCCryptorRelease(*block->recv_ctx); + } + delete block; +} diff --git a/iOSLib/libkcp/libkcp/BlockCrypt.h b/iOSLib/libkcp/libkcp/BlockCrypt.h new file mode 100644 index 0000000..04c1617 --- /dev/null +++ b/iOSLib/libkcp/libkcp/BlockCrypt.h @@ -0,0 +1,28 @@ +// +// BlockCrypt.hpp +// libkcp +// +// Created by 孔祥波 on 04/05/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#ifndef BlockCrypt_hpp +#define BlockCrypt_hpp +#import +#include +class BlockCrypt { +private: + CCCryptorRef *send_ctx; + CCCryptorRef *recv_ctx; +public: + static BlockCrypt* blockWith(const void* key,const char* crypt); + // output udp packet + char *encrypt(const void *buffer, size_t length,size_t *outlen); + char *decrypt(const void *buffer, size_t length,size_t *outlen); +private: + BlockCrypt() = default; + + ~BlockCrypt() = default; + static void Destroy(BlockCrypt *block); +}; +#endif /* BlockCrypt_hpp */ diff --git a/iOSLib/libkcp/libkcp/Crypt.h b/iOSLib/libkcp/libkcp/Crypt.h new file mode 100644 index 0000000..a5258ee --- /dev/null +++ b/iOSLib/libkcp/libkcp/Crypt.h @@ -0,0 +1,18 @@ +// +// BlockCrypt.h +// libkcp +// +// Created by 孔祥波 on 04/05/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#import +#import +@interface Crypt : NSObject +@property (strong,nonatomic) NSData *initialVector; +@property (nonatomic) CCCryptorRef *send_ctx; +@property (nonatomic) CCCryptorRef *recv_ctx; +-(instancetype)initWithKey:(NSData*)key crypto:(NSString*)crypto; +-(NSData*)encrypt:(NSData*)data; +-(NSData*)decrypt:(NSData*)data; +@end diff --git a/iOSLib/libkcp/libkcp/Crypt.mm b/iOSLib/libkcp/libkcp/Crypt.mm new file mode 100644 index 0000000..428130e --- /dev/null +++ b/iOSLib/libkcp/libkcp/Crypt.mm @@ -0,0 +1,70 @@ +// +// BlockCrypt.m +// libkcp +// +// Created by 孔祥波 on 04/05/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#import "Crypt.h" + +static NSString *saltxor = @"sH3CIVoF#rWLtJo6"; +@implementation Crypt +-(instancetype)initWithKey:(NSData*)key crypto:(NSString*)crypto{ + if (self = [super init]){ + uint8_t iv[] = {167, 115, 79, 156, 18, 172, 27, 1, 164, 21, 242, 193, 252, 120, 230, 107}; + self.initialVector = [NSData dataWithBytes:iv length:16]; + const void *ckey = key.bytes; + const void *ivPtr = iv; + size_t keyLen = 0; + if ([crypto isEqualToString:@"aes"]){ + keyLen = 32; + }else if ([crypto isEqualToString:@"aes-128"]){ + keyLen = 16; + }else { + keyLen = 24; + } + CCCryptorStatus st = CCCryptorCreate(kCCEncrypt, kCCAlgorithmDES, 0, ckey, keyLen, ivPtr, self.send_ctx); + if (st != kCCSuccess){ + NSLog(@"send_ctx create error"); + } + st = CCCryptorCreate(kCCDecrypt, kCCAlgorithmDES, 0, ckey, keyLen, ivPtr, self.recv_ctx); + if (st != kCCSuccess){ + NSLog(@"recv_ctx create error"); + } + } + return self; +} +-(NSData*)encrypt:(NSData*)data +{ + const void *dataIn = data.bytes; + size_t len = data.length + kCCBlockSizeAES128; + int outLen = 0; + NSMutableData *o = [NSMutableData dataWithLength:len]; + void *dataOut =(void *) o.bytes; + CCCryptorStatus st = CCCryptorUpdate(*(self.send_ctx), dataIn, data.length, dataOut, len, &len); + if (st != kCCSuccess){ + NSLog(@"encrypt data error"); + return nil; + }else { + o.length = outLen; + return o; + } +} +-(NSData*)decrypt:(NSData*)data +{ + const void *dataIn = data.bytes; + size_t len = data.length + kCCBlockSizeAES128; + int outLen = 0; + NSMutableData *o = [NSMutableData dataWithLength:len]; + void *dataOut =(void *) o.bytes; + CCCryptorStatus st = CCCryptorUpdate(*(self.recv_ctx), dataIn, data.length, dataOut, len, &len); + if (st != kCCSuccess){ + NSLog(@"encrypt data error"); + return nil; + }else { + o.length = outLen; + return o; + } +} +@end diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 28beecd..2054029 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -56,7 +56,14 @@ -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port } -(void)startUDPSession { - sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards); + if (self.config.key.length > 0){ + + BlockCrypt *block = BlockCrypt::blockWith(self.config.key.bytes, self.config.crypt.UTF8String); + sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards,block); + }else { + sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards); + } + sess->NoDelay(self.config.nodelay, self.config.interval, self.config.resend, self.config.nc); sess->WndSize(self.config.sndwnd, self.config.rcvwnd); sess->SetMtu(self.config.mtu); @@ -71,7 +78,15 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port if (sess != nil) { UDPSession::Destroy(sess); } - sess = UDPSession::DialWithOptions(ip.UTF8String, port, self.config.dataShards,self.config.parityShards); + if (self.config.key.length > 0){ + + BlockCrypt *block = BlockCrypt::blockWith(self.config.key.bytes, self.config.crypt.UTF8String); + sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards,block); + }else { + sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards); + } + + sess->NoDelay(self.config.nodelay, self.config.interval, self.config.resend, self.config.nc); sess->WndSize(self.config.sndwnd, self.config.rcvwnd); sess->SetMtu(self.config.mtu); @@ -86,6 +101,10 @@ -(void)shutdownUDPSession UDPSession::Destroy(sess); } +-(void)keepAlive{ + //kcptun need + //s.writeFrame(newFrame(cmdNOP, 0)) +} -(void)input:(NSData*)data{ assert(sess != nullptr); diff --git a/iOSLib/libkcp/libkcp/TunConfig.h b/iOSLib/libkcp/libkcp/TunConfig.h index db89d87..9d51a56 100644 --- a/iOSLib/libkcp/libkcp/TunConfig.h +++ b/iOSLib/libkcp/libkcp/TunConfig.h @@ -25,4 +25,9 @@ @property (nonatomic) int iptos; +@property (nonatomic) int keepAliveInterval; +@property (nonatomic) int keepAliveTimeout; +@property (strong,nonatomic) NSData *key; //pkbdf2Key driven +//"aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none", +@property (strong,nonatomic) NSString *crypt; @end diff --git a/sess.cpp b/sess.cpp index f5230f2..903ad18 100644 --- a/sess.cpp +++ b/sess.cpp @@ -49,7 +49,16 @@ UDPSession::DialWithOptions(const char *ip, uint16_t port, size_t dataShards, si } return sess; }; - +// DialWithOptions connects to the remote address "raddr" on the network "udp" with packet encryption with block +UDPSession* +UDPSession::DialWithOptions(const char *ip, uint16_t port, size_t dataShards, size_t parityShards,BlockCrypt *block){ + auto sess = UDPSession::DialWithOptions(ip, port, dataShards, parityShards); + if (sess == nullptr) { + return nullptr; + } + sess->block = block; + return sess; +} UDPSession * UDPSession::dialIPv6(const char *ip, uint16_t port) { diff --git a/sess.h b/sess.h index f856fce..bd23aa7 100644 --- a/sess.h +++ b/sess.h @@ -5,7 +5,7 @@ #include "fec.h" #include #include - +#import "BlockCrypt.h" class UDPSession { private: int m_sockfd{0}; @@ -19,6 +19,7 @@ class UDPSession { std::vector shards; size_t dataShards{0}; size_t parityShards{0}; + BlockCrypt *block; public: UDPSession(const UDPSession &) = delete; @@ -30,6 +31,8 @@ class UDPSession { // DialWithOptions connects to the remote address "raddr" on the network "udp" with packet encryption static UDPSession *DialWithOptions(const char *ip, uint16_t port, size_t dataShards, size_t parityShards); + // DialWithOptions connects to the remote address "raddr" on the network "udp" with packet encryption with block + static UDPSession *DialWithOptions(const char *ip, uint16_t port, size_t dataShards, size_t parityShards,BlockCrypt *block); // Update will try reading/writing udp packet, pass current unix millisecond void Update(uint32_t current) noexcept; From 3f7d75ba9ae3bd3a7be5ded43438f1660875fa64 Mon Sep 17 00:00:00 2001 From: abigt Date: Fri, 5 May 2017 02:26:55 +0800 Subject: [PATCH 13/56] UDPSession out_wrapper/Update support crypto , todo test crypto and review code? --- fec.h | 1 + iOSLib/libkcp/kcptest/ViewController.mm | 17 +- .../libkcp/libkcp.xcodeproj/project.pbxproj | 12 + .../UserInterfaceState.xcuserstate | Bin 38710 -> 72508 bytes iOSLib/libkcp/libkcp/BlockCrypt.cpp | 65 +++-- iOSLib/libkcp/libkcp/BlockCrypt.h | 10 +- iOSLib/libkcp/libkcp/CRC32.cpp | 36 +++ iOSLib/libkcp/libkcp/CRC32.h | 17 ++ sess.cpp | 265 +++++++++++++----- sess.h | 3 + 10 files changed, 340 insertions(+), 86 deletions(-) create mode 100644 iOSLib/libkcp/libkcp/CRC32.cpp create mode 100644 iOSLib/libkcp/libkcp/CRC32.h diff --git a/fec.h b/fec.h index 361d4fe..d7c3a98 100644 --- a/fec.h +++ b/fec.h @@ -12,6 +12,7 @@ #include "reedsolomon.h" const size_t fecHeaderSize = 6; +//const size_t cryptHeaderSize = 20;//nonce 16 crc 4 const size_t fecHeaderSizePlus2{fecHeaderSize + 2}; const uint16_t typeData = 0xf1; const uint16_t typeFEC = 0xf2; diff --git a/iOSLib/libkcp/kcptest/ViewController.mm b/iOSLib/libkcp/kcptest/ViewController.mm index 3f574b9..c86a3a6 100644 --- a/iOSLib/libkcp/kcptest/ViewController.mm +++ b/iOSLib/libkcp/kcptest/ViewController.mm @@ -7,7 +7,7 @@ // #import "ViewController.h" - +#import "BlockCrypt.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *addr; @property (weak, nonatomic) IBOutlet UITextField *port; @@ -19,7 +19,22 @@ @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; + [self testCrypto]; // Do any additional setup after loading the view, typically from a nib. +} +- (void)testCrypto{ + NSData *s = [@"0123456789ABCDEF0123456789ABCDEF" dataUsingEncoding:NSUTF8StringEncoding]; + BlockCrypt *block = BlockCrypt::blockWith(s.bytes, "aes"); +// size_t outlen = 0; +// block->encrypt(s.bytes, 32, &outlen); +// NSData *outData = [NSData dataWithBytes:outbuffer length:outlen]; +// NSLog(@"%@",outData); +// +// size_t xlen = 0; +// char *xx = block->decrypt(outbuffer, outlen, &xlen); +// NSData *org = [NSData dataWithBytes:xx length:xlen]; +// NSLog(@"%@ \n %@",org,s); + } - (IBAction)go:(id)sender { //kcptest(, ); diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 41d7dcd..8ce5750 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -37,6 +37,9 @@ 695165F51EBB2663008DCF66 /* BlockCrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 695165F31EBB2663008DCF66 /* BlockCrypt.cpp */; }; 695165F61EBB2663008DCF66 /* BlockCrypt.h in Headers */ = {isa = PBXBuildFile; fileRef = 695165F41EBB2663008DCF66 /* BlockCrypt.h */; }; 695165F91EBB32D2008DCF66 /* Crypt.mm in Sources */ = {isa = PBXBuildFile; fileRef = 695165F81EBB32D2008DCF66 /* Crypt.mm */; }; + 6959B7471EBB7DEC00B0BC58 /* CRC32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6959B7451EBB7DEC00B0BC58 /* CRC32.cpp */; }; + 6959B7481EBB7DEC00B0BC58 /* CRC32.h in Headers */ = {isa = PBXBuildFile; fileRef = 6959B7461EBB7DEC00B0BC58 /* CRC32.h */; }; + 6959B74A1EBB8B0C00B0BC58 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6959B7491EBB8B0C00B0BC58 /* Security.framework */; }; 69C757811EB2F96D00139321 /* kcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; }; 69C757821EB2F96D00139321 /* kcp.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 69FFC6A01EB30985008A030D /* SFKcpTun.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC69E1EB30985008A030D /* SFKcpTun.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -107,6 +110,9 @@ 695165F41EBB2663008DCF66 /* BlockCrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockCrypt.h; sourceTree = ""; }; 695165F71EBB32D2008DCF66 /* Crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Crypt.h; path = libkcp/Crypt.h; sourceTree = SOURCE_ROOT; }; 695165F81EBB32D2008DCF66 /* Crypt.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Crypt.mm; path = libkcp/Crypt.mm; sourceTree = SOURCE_ROOT; }; + 6959B7451EBB7DEC00B0BC58 /* CRC32.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CRC32.cpp; sourceTree = ""; }; + 6959B7461EBB7DEC00B0BC58 /* CRC32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRC32.h; sourceTree = ""; }; + 6959B7491EBB8B0C00B0BC58 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 69FFC69E1EB30985008A030D /* SFKcpTun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFKcpTun.h; path = libkcp/SFKcpTun.h; sourceTree = SOURCE_ROOT; }; 69FFC69F1EB30985008A030D /* SFKcpTun.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SFKcpTun.mm; path = libkcp/SFKcpTun.mm; sourceTree = SOURCE_ROOT; }; 69FFC6A31EB309E8008A030D /* TunConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TunConfig.h; path = libkcp/TunConfig.h; sourceTree = ""; }; @@ -118,6 +124,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6959B74A1EBB8B0C00B0BC58 /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -179,6 +186,8 @@ 692AE3251EB2EE59006A4B9D /* Info.plist */, 695165F31EBB2663008DCF66 /* BlockCrypt.cpp */, 695165F41EBB2663008DCF66 /* BlockCrypt.h */, + 6959B7451EBB7DEC00B0BC58 /* CRC32.cpp */, + 6959B7461EBB7DEC00B0BC58 /* CRC32.h */, ); path = libkcp; sourceTree = ""; @@ -213,6 +222,7 @@ 692AE36F1EB2F191006A4B9D /* Frameworks */ = { isa = PBXGroup; children = ( + 6959B7491EBB8B0C00B0BC58 /* Security.framework */, 692AE3701EB2F191006A4B9D /* libc++.tbd */, ); name = Frameworks; @@ -240,6 +250,7 @@ 69FFC6A01EB30985008A030D /* SFKcpTun.h in Headers */, 69FFC6A51EB309E8008A030D /* TunConfig.h in Headers */, 692AE34F1EB2EF25006A4B9D /* encoding.h in Headers */, + 6959B7481EBB7DEC00B0BC58 /* CRC32.h in Headers */, 692AE33F1EB2EF0B006A4B9D /* inversion_tree.h in Headers */, 692AE3371EB2EEEF006A4B9D /* reedsolomon.h in Headers */, 692AE3481EB2EF1C006A4B9D /* fec.h in Headers */, @@ -361,6 +372,7 @@ 692AE3491EB2EF1C006A4B9D /* galois_noasm.cpp in Sources */, 692AE33A1EB2EEF9006A4B9D /* matrix.cpp in Sources */, 692AE33E1EB2EF0B006A4B9D /* inversion_tree.cpp in Sources */, + 6959B7471EBB7DEC00B0BC58 /* CRC32.cpp in Sources */, 69FFC6A61EB309E8008A030D /* TunConfig.m in Sources */, 692AE32F1EB2EEB0006A4B9D /* ikcp.c in Sources */, 692AE34C1EB2EF1C006A4B9D /* galois.cpp in Sources */, diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate index ca7a210cfded23788343815a89463bb8d6ed41b8..4b807dbae3c334e68ca943e199e9e4e1640844f5 100644 GIT binary patch literal 72508 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 literal 38710 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 h@A7~2_xlI^^ZpgT +#include const uint8_t iv[] = {167, 115, 79, 156, 18, 172, 27, 1, 164, 21, 242, 193, 252, 120, 230, 107}; BlockCrypt* BlockCrypt::blockWith(const void* key,const char* crypto){ BlockCrypt *block = new (BlockCrypt); - const void *ckey = key; + const void *ivPtr = iv; size_t keyLen = 0; if (strcmp(crypto,"aes") == 0){ @@ -23,11 +25,27 @@ BlockCrypt::blockWith(const void* key,const char* crypto){ keyLen = 24; } - CCCryptorStatus st = CCCryptorCreate(kCCEncrypt, kCCAlgorithmDES, 0, ckey, keyLen, ivPtr, block->send_ctx); + + CCCryptorStatus st = CCCryptorCreateWithMode( + kCCEncrypt, + kCCModeCFB, + kCCAlgorithmAES, + ccNoPadding, + ivPtr, key, keyLen, + NULL, 0, 0, 0, + &(block->send_ctx)); + if (st != kCCSuccess){ printf("send_ctx create error\n"); } - st = CCCryptorCreate(kCCDecrypt, kCCAlgorithmDES, 0, ckey, keyLen, ivPtr, block->recv_ctx); + st = CCCryptorCreateWithMode( + kCCDecrypt, + kCCModeCFB, + kCCAlgorithmAES, + ccNoPadding, + ivPtr, key, keyLen, + NULL, 0, 0, 0, + &(block->recv_ctx)); if (st != kCCSuccess){ printf("recv_ctx create error \n"); } @@ -36,47 +54,58 @@ BlockCrypt::blockWith(const void* key,const char* crypto){ } // output udp packet -char * -BlockCrypt::encrypt(const void *buffer, size_t length,size_t *outlen) +void +BlockCrypt::encrypt(void *buffer, size_t length,size_t *outlen) { size_t len = length + kCCBlockSizeAES128; void *dataOut = malloc(len); - CCCryptorStatus st = CCCryptorUpdate(*send_ctx, buffer, length, dataOut, len, outlen); + CCCryptorStatus st = CCCryptorUpdate(send_ctx, buffer, length, dataOut, len, outlen); if (st != kCCSuccess){ printf("encrypt data error"); - return (char*)dataOut; + }else { - ; - return (char*)dataOut; + memcpy(buffer, dataOut, *outlen); + } - + free(dataOut); } -char * -BlockCrypt::decrypt(const void *buffer, size_t length,size_t *outlen) +void +BlockCrypt::decrypt(void *buffer, size_t length,size_t *outlen) { size_t len = length + kCCBlockSizeAES128; void *dataOut = malloc(len); - CCCryptorStatus st = CCCryptorUpdate(*recv_ctx, buffer, length, dataOut, len, outlen); + CCCryptorStatus st = CCCryptorUpdate(recv_ctx, buffer, length, dataOut, len, outlen); if (st != kCCSuccess){ printf("encrypt data error"); - return (char*)dataOut; + }else { - ; - return (char*)dataOut; + memcpy(buffer, dataOut, *outlen); } + free(dataOut); } void BlockCrypt::Destroy(BlockCrypt *block) { if (block->send_ctx != NULL) { - CCCryptorRelease(*block->send_ctx); + CCCryptorRelease(block->send_ctx); } if (block->recv_ctx != NULL) { - CCCryptorRelease(*block->recv_ctx); + CCCryptorRelease(block->recv_ctx); } delete block; } +uint8_t * +BlockCrypt::ramdonBytes(size_t len){ + + uint8_t *ptr = (uint8_t *)malloc(len); + // Gen random bytes + if (SecRandomCopyBytes(kSecRandomDefault, len, (uint8_t *)ptr) == 0){ + return ptr; + } + free(ptr); + return nil; +} diff --git a/iOSLib/libkcp/libkcp/BlockCrypt.h b/iOSLib/libkcp/libkcp/BlockCrypt.h index 04c1617..3591c09 100644 --- a/iOSLib/libkcp/libkcp/BlockCrypt.h +++ b/iOSLib/libkcp/libkcp/BlockCrypt.h @@ -9,16 +9,18 @@ #ifndef BlockCrypt_hpp #define BlockCrypt_hpp #import + #include class BlockCrypt { private: - CCCryptorRef *send_ctx; - CCCryptorRef *recv_ctx; + CCCryptorRef send_ctx; + CCCryptorRef recv_ctx; public: static BlockCrypt* blockWith(const void* key,const char* crypt); // output udp packet - char *encrypt(const void *buffer, size_t length,size_t *outlen); - char *decrypt(const void *buffer, size_t length,size_t *outlen); + void encrypt(void *buffer, size_t length,size_t *outlen); + void decrypt(void *buffer, size_t length,size_t *outlen); + uint8_t *ramdonBytes(size_t len); private: BlockCrypt() = default; diff --git a/iOSLib/libkcp/libkcp/CRC32.cpp b/iOSLib/libkcp/libkcp/CRC32.cpp new file mode 100644 index 0000000..45f74a6 --- /dev/null +++ b/iOSLib/libkcp/libkcp/CRC32.cpp @@ -0,0 +1,36 @@ +// +// CRC32.c +// libkcp +// +// Created by 孔祥波 on 04/05/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#include "CRC32.h" + +int32_t crc32(uint8_t *bytes, size_t len) +{ + uint32_t *table = (uint32_t *)malloc(sizeof(uint32_t) * 256); + uint32_t crc = 0xffffffff; + + uint8_t *ptr = bytes; + for (uint32_t i=0; i<256; i++) { + table[i] = i; + for (int j=0; j<8; j++) { + if (table[i] & 1) { + table[i] = (table[i] >>= 1) ^ 0xedb88320; + } else { + table[i] >>= 1; + } + } + } + + for (int i=0; i< len; i++) { + crc = (crc >> 8) ^ table[(crc & 0xff) ^ *ptr]; + ptr++; + } + crc ^= 0xffffffff; + + free(table); + return crc; +} diff --git a/iOSLib/libkcp/libkcp/CRC32.h b/iOSLib/libkcp/libkcp/CRC32.h new file mode 100644 index 0000000..a0d545d --- /dev/null +++ b/iOSLib/libkcp/libkcp/CRC32.h @@ -0,0 +1,17 @@ +// +// CRC32.h +// libkcp +// +// Created by 孔祥波 on 04/05/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#ifndef CRC32_h +#define CRC32_h + +#include +#include +int32_t crc32(uint8_t *bytes, size_t len); + + +#endif /* CRC32_h */ diff --git a/sess.cpp b/sess.cpp index 903ad18..483b95f 100644 --- a/sess.cpp +++ b/sess.cpp @@ -6,6 +6,22 @@ #include #include #include +#include "CRC32.h" +// 16-bytes magic number for each packet +const size_t nonceSize = 16; + +// 4-bytes packet checksum +const size_t crcSize = 4; + +// overall crypto header size +const size_t cryptHeaderSize = nonceSize + crcSize; + +// maximum packet size +const size_t mtuLimit = 1500; + +// FEC keeps rxFECMulti* (dataShard+parityShard) ordered packets in memory +const size_t rxFECMulti = 3; + UDPSession * UDPSession::Dial(const char *ip, uint16_t port) { @@ -56,6 +72,7 @@ UDPSession::DialWithOptions(const char *ip, uint16_t port, size_t dataShards, si if (sess == nullptr) { return nullptr; } + sess->block = block; return sess; } @@ -97,50 +114,42 @@ UDPSession::createSession(int sockfd) { sess->m_sockfd = sockfd; sess->m_kcp = ikcp_create(IUINT32(rand()), sess); sess->m_kcp->output = sess->out_wrapper; + return sess; } - +//recv data from udp socket +/// void UDPSession::Update(uint32_t current) noexcept { for (;;) { ssize_t n = recv(m_sockfd, m_buf, sizeof(m_buf), 0); if (n > 0) { - if (fec.isEnabled()) { - // decode FEC packet - auto pkt = fec.Decode(m_buf, static_cast(n)); - if (pkt.flag == typeData) { - auto ptr = pkt.data->data(); - // we have 2B size, ignore for typeData - ikcp_input(m_kcp, (char *) (ptr + 2), pkt.data->size() - 2); + //change by abigt + //bool dataValid = false; + + if (block != NULL) { + size_t outlen = 0; + block->decrypt(m_buf, n, &outlen); + char *out = (char *)m_buf; + //nonceSize = 16 + outlen -= nonceSize; + out += nonceSize; + + uint32_t sum = 0; + memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); + out += crcSize; + int32_t checksum = crc32((uint8_t *)out, crcSize); + if (checksum == sum){ + + KcpInPut((char *)m_buf, n - nonceSize - crcSize); + } - - // allow FEC packet processing with correct flags. - if (pkt.flag == typeData || pkt.flag == typeFEC) { - // input to FEC, and see if we can recover data. - auto recovered = fec.Input(pkt); - - // we have some data recovered. - for (auto &r : recovered) { - // recovered data has at least 2B size. - if (r->size() > 2) { - auto ptr = r->data(); - // decode packet size, which is also recovered. - uint16_t sz; - decode16u(ptr, &sz); - - // the recovered packet size must be in the correct range. - if (sz >= 2 && sz <= r->size()) { - // input proper data to kcp - ikcp_input(m_kcp, (char *) (ptr + 2), sz - 2); - // std::cout << "sz:" << sz << std::endl; - } - } - } - } - } else { // fec disabled - ikcp_input(m_kcp, (char *) (m_buf), n); + }else { + KcpInPut((char *)m_buf, n); } + + } else { break; } @@ -148,7 +157,44 @@ UDPSession::Update(uint32_t current) noexcept { m_kcp->current = current; ikcp_flush(m_kcp); } - +void +UDPSession::KcpInPut(char *buffer,size_t len) noexcept { + if (fec.isEnabled()) { + // decode FEC packet + auto pkt = fec.Decode(m_buf, static_cast(len)); + if (pkt.flag == typeData) { + auto ptr = pkt.data->data(); + // we have 2B size, ignore for typeData + ikcp_input(m_kcp, (char *) (ptr + 2), pkt.data->size() - 2); + } + + // allow FEC packet processing with correct flags. + if (pkt.flag == typeData || pkt.flag == typeFEC) { + // input to FEC, and see if we can recover data. + auto recovered = fec.Input(pkt); + + // we have some data recovered. + for (auto &r : recovered) { + // recovered data has at least 2B size. + if (r->size() > 2) { + auto ptr = r->data(); + // decode packet size, which is also recovered. + uint16_t sz; + decode16u(ptr, &sz); + + // the recovered packet size must be in the correct range. + if (sz >= 2 && sz <= r->size()) { + // input proper data to kcp + ikcp_input(m_kcp, (char *) (ptr + 2), sz - 2); + // std::cout << "sz:" << sz << std::endl; + } + } + } + } + } else { // fec disabled + ikcp_input(m_kcp, (char *) (m_buf), len); + } +} void UDPSession::Destroy(UDPSession *sess) { if (nullptr == sess) return; @@ -211,42 +257,135 @@ UDPSession::SetStreamMode(bool enable) noexcept { this->m_kcp->stream = 0; } } - +// output pipeline entry +// steps for output data processing: +// 0. Header extends +// 1. FEC +// 2. CRC32 +// 3. Encryption +// 4. WriteTo kernel int UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { assert(user != nullptr); UDPSession *sess = static_cast(user); - + //test no cover if (sess->fec.isEnabled()) { // append FEC header - // extend to len + fecHeaderSizePlus2 - // i.e. 4B seqid + 2B flag + 2B size - memcpy(sess->m_buf + fecHeaderSizePlus2, buf, static_cast(len)); - sess->fec.MarkData(sess->m_buf, static_cast(len)); - sess->output(sess->m_buf, len + fecHeaderSizePlus2); - - // FEC calculation - // copy "2B size + data" to shards - auto slen = len + 2; - sess->shards[sess->pkt_idx] = - std::make_shared>(&sess->m_buf[fecHeaderSize], &sess->m_buf[fecHeaderSize + slen]); - - // count number of data shards - sess->pkt_idx++; - if (sess->pkt_idx == sess->dataShards) { // we've collected enough data shards - sess->fec.Encode(sess->shards); - // send parity shards - for (size_t i = sess->dataShards; i < sess->dataShards + sess->parityShards; i++) { - // append header to parity shards - // i.e. fecHeaderSize + data(2B size included) - memcpy(sess->m_buf + fecHeaderSize, sess->shards[i]->data(), sess->shards[i]->size()); - sess->fec.MarkFEC(sess->m_buf); - sess->output(sess->m_buf, sess->shards[i]->size() + fecHeaderSize); + BlockCrypt *block = sess->block; + if ( block != NULL){ + size_t headerSize = cryptHeaderSize + fecHeaderSizePlus2; + + + memcpy(sess->m_buf + headerSize, buf, static_cast(len)); + sess->fec.MarkData(sess->m_buf + cryptHeaderSize, static_cast(len)); + + //sess->m_buf reset after write? + //send ecc? + // extend to len + fecHeaderSizePlus2 + // i.e. 4B seqid + 2B flag + 2B size + + // FEC calculation + // copy "2B size + data" to shards + auto slen = len + 2; + size_t newfecHeaderSize = fecHeaderSize + cryptHeaderSize; + sess->shards[sess->pkt_idx] = + std::make_shared>(&sess->m_buf[newfecHeaderSize], &sess->m_buf[newfecHeaderSize + slen]); + + // count number of data shards + sess->pkt_idx++; + byte *ecc[128]; + size_t ecclenArray[128]; + int index = 0 ; + //create ecc? + if (sess->pkt_idx == sess->dataShards) { // we've collected enough data shards + sess->fec.Encode(sess->shards); + // send parity shards + for (size_t i = sess->dataShards; i < sess->dataShards + sess->parityShards; i++) { + // append header to parity shards + // i.e. fecHeaderSize + data(2B size included) + memcpy(sess->m_buf + newfecHeaderSize, sess->shards[i]->data(), sess->shards[i]->size()); + sess->fec.MarkFEC(sess->m_buf); + //go version write ecc to remote? + //sess->output(sess->m_buf+cryptHeaderSize, sess->shards[i]->size() + newfecHeaderSize); + // + + size_t ecclen = sess->shards[i]->size() + fecHeaderSize ; + + byte *ptr = (byte *)malloc(ecclen + cryptHeaderSize); + + + uint8_t *nonce = block->ramdonBytes(nonceSize); + memcpy(ptr, nonce, nonceSize); + + int32_t sum = crc32(ptr + cryptHeaderSize , ecclen ); + memcpy(ptr + nonceSize, &sum, nonceSize); + memcpy(ptr + cryptHeaderSize, sess->m_buf+cryptHeaderSize, ecclen); + ecclenArray[index] = ecclen + cryptHeaderSize; + ecc[index] = ptr; + index++; + } + + // reset indexing + sess->pkt_idx = 0; + } + + + uint8_t *nonce = block->ramdonBytes(nonceSize); + memcpy(sess->m_buf, nonce, nonceSize); + int32_t sum = crc32(sess->m_buf + cryptHeaderSize ,len + fecHeaderSizePlus2); + memcpy(sess->m_buf + nonceSize, &sum, nonceSize); + size_t outlen = 0; + block->encrypt(sess->m_buf , len + headerSize, &outlen); + sess->output(sess->m_buf, outlen); + + //flush ecc + for (int i = 0 ;i< index;i++){ + byte *ptr = ecc[i]; + block->encrypt(ptr , ecclenArray[index], &outlen); + sess->output(ptr, outlen); + free(ptr); + //need add nonce and crc? + } + + + + }else { + + // extend to len + fecHeaderSizePlus2 + // i.e. 4B seqid + 2B flag + 2B size + + memcpy(sess->m_buf + fecHeaderSizePlus2, buf, static_cast(len)); + sess->fec.MarkData(sess->m_buf, static_cast(len)); + sess->output(sess->m_buf, len + fecHeaderSizePlus2); + + // FEC calculation + // copy "2B size + data" to shards + auto slen = len + 2; + sess->shards[sess->pkt_idx] = + std::make_shared>(&sess->m_buf[fecHeaderSize], &sess->m_buf[fecHeaderSize + slen]); + + // count number of data shards + sess->pkt_idx++; + if (sess->pkt_idx == sess->dataShards) { // we've collected enough data shards + sess->fec.Encode(sess->shards); + // send parity shards + for (size_t i = sess->dataShards; i < sess->dataShards + sess->parityShards; i++) { + // append header to parity shards + // i.e. fecHeaderSize + data(2B size included) + memcpy(sess->m_buf + fecHeaderSize, sess->shards[i]->data(), sess->shards[i]->size()); + sess->fec.MarkFEC(sess->m_buf); + //go version write ecc to remote? + sess->output(sess->m_buf, sess->shards[i]->size() + fecHeaderSize); + } + + // reset indexing + sess->pkt_idx = 0; } - - // reset indexing - sess->pkt_idx = 0; } + + + } else { // No FEC, just send raw bytes, + //kcp-tun no use this sess->output(buf, static_cast(len)); } return 0; diff --git a/sess.h b/sess.h index bd23aa7..7ae43c2 100644 --- a/sess.h +++ b/sess.h @@ -20,6 +20,7 @@ class UDPSession { size_t dataShards{0}; size_t parityShards{0}; BlockCrypt *block; + public: UDPSession(const UDPSession &) = delete; @@ -36,6 +37,8 @@ class UDPSession { // Update will try reading/writing udp packet, pass current unix millisecond void Update(uint32_t current) noexcept; + //kcpInput go UDPpsession + void KcpInPut(char *buffer, size_t len) noexcept; // Destroy release all resource related. static void Destroy(UDPSession *sess); From 8d0462b2d5844e27c4731db1359cb823eb6ceb66 Mon Sep 17 00:00:00 2001 From: abigt Date: Mon, 8 May 2017 23:42:19 +0800 Subject: [PATCH 14/56] todo test --- iOSLib/libkcp/kcptest/ViewController.mm | 36 +++++++++++++----- .../libkcp/libkcp.xcodeproj/project.pbxproj | 6 +-- .../UserInterfaceState.xcuserstate | Bin 72508 -> 62386 bytes iOSLib/libkcp/libkcp/Crypt.h | 4 +- iOSLib/libkcp/libkcp/Crypt.mm | 16 ++++++-- iOSLib/libkcp/libkcp/SFKcpTun.mm | 6 +-- sess.h | 1 + 7 files changed, 45 insertions(+), 24 deletions(-) diff --git a/iOSLib/libkcp/kcptest/ViewController.mm b/iOSLib/libkcp/kcptest/ViewController.mm index c86a3a6..cb286b8 100644 --- a/iOSLib/libkcp/kcptest/ViewController.mm +++ b/iOSLib/libkcp/kcptest/ViewController.mm @@ -8,6 +8,7 @@ #import "ViewController.h" #import "BlockCrypt.h" +#import "Crypt.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *addr; @property (weak, nonatomic) IBOutlet UITextField *port; @@ -24,17 +25,32 @@ - (void)viewDidLoad { } - (void)testCrypto{ NSData *s = [@"0123456789ABCDEF0123456789ABCDEF" dataUsingEncoding:NSUTF8StringEncoding]; - BlockCrypt *block = BlockCrypt::blockWith(s.bytes, "aes"); -// size_t outlen = 0; -// block->encrypt(s.bytes, 32, &outlen); -// NSData *outData = [NSData dataWithBytes:outbuffer length:outlen]; -// NSLog(@"%@",outData); -// -// size_t xlen = 0; -// char *xx = block->decrypt(outbuffer, outlen, &xlen); -// NSData *org = [NSData dataWithBytes:xx length:xlen]; -// NSLog(@"%@ \n %@",org,s); + NSLog(@"org %@",s); + Crypt *block = [[Crypt alloc] initWithKey:s crypto:@"aes"]; //blockWith(s.bytes, "aes"); + size_t outlen = 0; + [block encrypt:s] ;//encrypt(s.bytes, 32, &outlen); + //NSData *outData = [NSData dataWithBytes:outbuffer length:outlen]; + NSLog(@"en %@",s); + [block decrypt:s]; + NSLog(@"de %@",s); + [self testB]; + +} +-(void)testB{ + NSData *s = [@"0123456789ABCDEF0123456789ABCDEF" dataUsingEncoding:NSUTF8StringEncoding]; + NSLog(@"org %@",s); + BlockCrypt *block = BlockCrypt::blockWith(s.bytes, "aes"); //blockWith(s.bytes, "aes"); + size_t outlen = 0; + block->encrypt((void *)s.bytes, 32, &outlen); + NSData *outData = [NSData dataWithBytes:s.bytes length:outlen]; + NSLog(@"en %@",s); + + block->decrypt((void*)s.bytes, s.length, &outlen); + + NSLog(@"en %@",s); + free(block); + } - (IBAction)go:(id)sender { //kcptest(, ); diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 8ce5750..07a79ff 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -165,7 +165,6 @@ isa = PBXGroup; children = ( 692AE34E1EB2EF25006A4B9D /* encoding.h */, - 692AE3421EB2EF1C006A4B9D /* fec.h */, 692AE3431EB2EF1C006A4B9D /* galois_noasm.cpp */, 692AE3441EB2EF1C006A4B9D /* galois_noasm.h */, 692AE3451EB2EF1C006A4B9D /* galois_table.c */, @@ -174,15 +173,16 @@ 692AE33C1EB2EF0B006A4B9D /* inversion_tree.cpp */, 692AE33D1EB2EF0B006A4B9D /* inversion_tree.h */, 692AE3381EB2EEF9006A4B9D /* matrix.cpp */, - 692AE3401EB2EF11006A4B9D /* ikcp.h */, 692AE3391EB2EEF9006A4B9D /* matrix.h */, 692AE3341EB2EEEF006A4B9D /* reedsolomon.cpp */, 692AE3351EB2EEEF006A4B9D /* reedsolomon.h */, 692AE3321EB2EEE6006A4B9D /* sess.h */, 692AE3301EB2EEBD006A4B9D /* sess.cpp */, + 692AE3401EB2EF11006A4B9D /* ikcp.h */, 692AE32E1EB2EEB0006A4B9D /* ikcp.c */, - 692AE32C1EB2EE98006A4B9D /* fec.cpp */, 692AE3241EB2EE59006A4B9D /* kcp.h */, + 692AE3421EB2EF1C006A4B9D /* fec.h */, + 692AE32C1EB2EE98006A4B9D /* fec.cpp */, 692AE3251EB2EE59006A4B9D /* Info.plist */, 695165F31EBB2663008DCF66 /* BlockCrypt.cpp */, 695165F41EBB2663008DCF66 /* BlockCrypt.h */, diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate index 4b807dbae3c334e68ca943e199e9e4e1640844f5..ddf404c1d20a15256648fb6ae6c8a6c4d9383279 100644 GIT binary patch literal 62386 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 P`WxQ!_4l`*YncB9zZ6w8 literal 72508 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 diff --git a/iOSLib/libkcp/libkcp/Crypt.h b/iOSLib/libkcp/libkcp/Crypt.h index a5258ee..a4bc479 100644 --- a/iOSLib/libkcp/libkcp/Crypt.h +++ b/iOSLib/libkcp/libkcp/Crypt.h @@ -10,8 +10,8 @@ #import @interface Crypt : NSObject @property (strong,nonatomic) NSData *initialVector; -@property (nonatomic) CCCryptorRef *send_ctx; -@property (nonatomic) CCCryptorRef *recv_ctx; +@property (nonatomic) CCCryptorRef send_ctx; +@property (nonatomic) CCCryptorRef recv_ctx; -(instancetype)initWithKey:(NSData*)key crypto:(NSString*)crypto; -(NSData*)encrypt:(NSData*)data; -(NSData*)decrypt:(NSData*)data; diff --git a/iOSLib/libkcp/libkcp/Crypt.mm b/iOSLib/libkcp/libkcp/Crypt.mm index 428130e..35f2d96 100644 --- a/iOSLib/libkcp/libkcp/Crypt.mm +++ b/iOSLib/libkcp/libkcp/Crypt.mm @@ -24,11 +24,13 @@ -(instancetype)initWithKey:(NSData*)key crypto:(NSString*)crypto{ }else { keyLen = 24; } - CCCryptorStatus st = CCCryptorCreate(kCCEncrypt, kCCAlgorithmDES, 0, ckey, keyLen, ivPtr, self.send_ctx); + CCCryptorRef s = self.send_ctx; + CCCryptorStatus st = CCCryptorCreate(kCCEncrypt, kCCAlgorithmDES, 0, ckey, keyLen, ivPtr, &s); if (st != kCCSuccess){ NSLog(@"send_ctx create error"); } - st = CCCryptorCreate(kCCDecrypt, kCCAlgorithmDES, 0, ckey, keyLen, ivPtr, self.recv_ctx); + CCCryptorRef r = self.send_ctx; + st = CCCryptorCreate(kCCDecrypt, kCCAlgorithmDES, 0, ckey, keyLen, ivPtr, &r); if (st != kCCSuccess){ NSLog(@"recv_ctx create error"); } @@ -42,7 +44,7 @@ -(NSData*)encrypt:(NSData*)data int outLen = 0; NSMutableData *o = [NSMutableData dataWithLength:len]; void *dataOut =(void *) o.bytes; - CCCryptorStatus st = CCCryptorUpdate(*(self.send_ctx), dataIn, data.length, dataOut, len, &len); + CCCryptorStatus st = CCCryptorUpdate(self.send_ctx, dataIn, data.length, dataOut, len, &len); if (st != kCCSuccess){ NSLog(@"encrypt data error"); return nil; @@ -58,7 +60,7 @@ -(NSData*)decrypt:(NSData*)data int outLen = 0; NSMutableData *o = [NSMutableData dataWithLength:len]; void *dataOut =(void *) o.bytes; - CCCryptorStatus st = CCCryptorUpdate(*(self.recv_ctx), dataIn, data.length, dataOut, len, &len); + CCCryptorStatus st = CCCryptorUpdate(self.recv_ctx, dataIn, data.length, dataOut, len, &len); if (st != kCCSuccess){ NSLog(@"encrypt data error"); return nil; @@ -67,4 +69,10 @@ -(NSData*)decrypt:(NSData*)data return o; } } +-(void)dealloc +{ + CCCryptorRelease(self.send_ctx); + CCCryptorRelease(self.recv_ctx); + //super.dealloc(); +} @end diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 2054029..23302da 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -69,7 +69,6 @@ -(void)startUDPSession sess->SetMtu(self.config.mtu); sess->SetStreamMode(true); sess->SetDSCP(self.config.iptos); - assert(sess != nullptr); [self run]; } @@ -101,10 +100,7 @@ -(void)shutdownUDPSession UDPSession::Destroy(sess); } --(void)keepAlive{ - //kcptun need - //s.writeFrame(newFrame(cmdNOP, 0)) -} + -(void)input:(NSData*)data{ assert(sess != nullptr); diff --git a/sess.h b/sess.h index 7ae43c2..ad8e012 100644 --- a/sess.h +++ b/sess.h @@ -51,6 +51,7 @@ class UDPSession { // Set DSCP value int SetDSCP(int dscp) noexcept; + // SetStreamMode toggles the stream mode on/off void SetStreamMode(bool enable) noexcept; From dcb7b4924346c6064779e3b18be377d218339e74 Mon Sep 17 00:00:00 2001 From: abigt Date: Tue, 9 May 2017 01:41:18 +0800 Subject: [PATCH 15/56] update protocol imp --- .../UserInterfaceState.xcuserstate | Bin 62386 -> 63167 bytes iOSLib/libkcp/libkcp/BlockCrypt.h | 2 +- sess.cpp | 25 +++++++++++++++--- sess.h | 2 ++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate index ddf404c1d20a15256648fb6ae6c8a6c4d9383279..d3820cffa5a19b44454ed50b8b5738131175180f 100644 GIT binary patch literal 63167 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 T*ZTEqzY*8ge*gHn^z{D#H`0~n literal 62386 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 P`WxQ!_4l`*YncB9zZ6w8 diff --git a/iOSLib/libkcp/libkcp/BlockCrypt.h b/iOSLib/libkcp/libkcp/BlockCrypt.h index 3591c09..2d86d05 100644 --- a/iOSLib/libkcp/libkcp/BlockCrypt.h +++ b/iOSLib/libkcp/libkcp/BlockCrypt.h @@ -20,7 +20,7 @@ class BlockCrypt { // output udp packet void encrypt(void *buffer, size_t length,size_t *outlen); void decrypt(void *buffer, size_t length,size_t *outlen); - uint8_t *ramdonBytes(size_t len); + static uint8_t *ramdonBytes(size_t len); private: BlockCrypt() = default; diff --git a/sess.cpp b/sess.cpp index 483b95f..a1c01db 100644 --- a/sess.cpp +++ b/sess.cpp @@ -21,7 +21,15 @@ const size_t mtuLimit = 1500; // FEC keeps rxFECMulti* (dataShard+parityShard) ordered packets in memory const size_t rxFECMulti = 3; - +void +dump(char *tag, char *text, int len) +{ + int i; + printf("%s: ", tag); + for (i = 0; i < len; i++) + printf("0x%02x ", (uint8_t)text[i]); + printf("\n"); +} UDPSession * UDPSession::Dial(const char *ip, uint16_t port) { @@ -269,6 +277,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { assert(user != nullptr); UDPSession *sess = static_cast(user); //test no cover + dump("UDPSession", (char *)buf, len); if (sess->fec.isEnabled()) { // append FEC header BlockCrypt *block = sess->block; if ( block != NULL){ @@ -313,7 +322,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { byte *ptr = (byte *)malloc(ecclen + cryptHeaderSize); - uint8_t *nonce = block->ramdonBytes(nonceSize); + uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); memcpy(ptr, nonce, nonceSize); int32_t sum = crc32(ptr + cryptHeaderSize , ecclen ); @@ -329,7 +338,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { } - uint8_t *nonce = block->ramdonBytes(nonceSize); + uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); memcpy(sess->m_buf, nonce, nonceSize); int32_t sum = crc32(sess->m_buf + cryptHeaderSize ,len + fecHeaderSizePlus2); memcpy(sess->m_buf + nonceSize, &sum, nonceSize); @@ -352,9 +361,19 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { // extend to len + fecHeaderSizePlus2 // i.e. 4B seqid + 2B flag + 2B size + char header[20]; + memset(header, 0, 20); + + uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); + memcpy(header, nonce, nonceSize); + // sess->output(nonce, nonceSize); memcpy(sess->m_buf + fecHeaderSizePlus2, buf, static_cast(len)); sess->fec.MarkData(sess->m_buf, static_cast(len)); + + int32_t sum = crc32(sess->m_buf ,len + fecHeaderSizePlus2); + memcpy(header + nonceSize, &sum, 4); + sess->output(header, nonceSize + crcSize ); sess->output(sess->m_buf, len + fecHeaderSizePlus2); // FEC calculation diff --git a/sess.h b/sess.h index ad8e012..6c64f47 100644 --- a/sess.h +++ b/sess.h @@ -6,6 +6,8 @@ #include #include #import "BlockCrypt.h" +void +dump(char *tag, char *text, int len); class UDPSession { private: int m_sockfd{0}; From 037c27d5b72427bfcbb807e77f2136dc660e2510 Mon Sep 17 00:00:00 2001 From: abigt Date: Tue, 9 May 2017 11:34:42 +0800 Subject: [PATCH 16/56] kcptun crypto none also add nonce and crc --- sess.cpp | 49 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/sess.cpp b/sess.cpp index a1c01db..95e7992 100644 --- a/sess.cpp +++ b/sess.cpp @@ -27,7 +27,7 @@ dump(char *tag, char *text, int len) int i; printf("%s: ", tag); for (i = 0; i < len; i++) - printf("0x%02x ", (uint8_t)text[i]); + printf("%02x ", (uint8_t)text[i]); printf("\n"); } @@ -361,39 +361,54 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { // extend to len + fecHeaderSizePlus2 // i.e. 4B seqid + 2B flag + 2B size - char header[20]; - memset(header, 0, 20); + //crypto none also add nonce and crc uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); - memcpy(header, nonce, nonceSize); - // sess->output(nonce, nonceSize); - memcpy(sess->m_buf + fecHeaderSizePlus2, buf, static_cast(len)); - sess->fec.MarkData(sess->m_buf, static_cast(len)); + memcpy(sess->m_buf, nonce, nonceSize); + + byte *ptr = sess->m_buf + cryptHeaderSize; + + memcpy(ptr + fecHeaderSizePlus2, buf, static_cast(len)); + sess->fec.MarkData(ptr, static_cast(len)); + + int32_t sum = crc32(ptr ,len + fecHeaderSizePlus2); + memcpy(sess->m_buf + nonceSize, &sum, 4); + //dump("UDPSession header", (char *)header, nonceSize + crcSize); + //sess->output(header, nonceSize + crcSize ); + sess->output(sess->m_buf, len + fecHeaderSizePlus2 + cryptHeaderSize); - int32_t sum = crc32(sess->m_buf ,len + fecHeaderSizePlus2); - memcpy(header + nonceSize, &sum, 4); - sess->output(header, nonceSize + crcSize ); - sess->output(sess->m_buf, len + fecHeaderSizePlus2); // FEC calculation // copy "2B size + data" to shards auto slen = len + 2; sess->shards[sess->pkt_idx] = - std::make_shared>(&sess->m_buf[fecHeaderSize], &sess->m_buf[fecHeaderSize + slen]); + std::make_shared>(&sess->m_buf[fecHeaderSize + cryptHeaderSize], &sess->m_buf[fecHeaderSize + cryptHeaderSize + slen]); // count number of data shards sess->pkt_idx++; if (sess->pkt_idx == sess->dataShards) { // we've collected enough data shards sess->fec.Encode(sess->shards); // send parity shards + //should add nonce and crc? + for (size_t i = sess->dataShards; i < sess->dataShards + sess->parityShards; i++) { // append header to parity shards // i.e. fecHeaderSize + data(2B size included) - memcpy(sess->m_buf + fecHeaderSize, sess->shards[i]->data(), sess->shards[i]->size()); - sess->fec.MarkFEC(sess->m_buf); + // add nonce and crc + uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); + + memcpy(sess->m_buf, nonce, nonceSize); + + + memcpy(ptr + fecHeaderSize, sess->shards[i]->data(), sess->shards[i]->size()); + sess->fec.MarkFEC(ptr); + + int32_t sum = crc32(ptr ,sess->shards[i]->size() + fecHeaderSize); + memcpy(sess->m_buf + nonceSize, &sum, 4); + //go version write ecc to remote? - sess->output(sess->m_buf, sess->shards[i]->size() + fecHeaderSize); + sess->output(sess->m_buf, sess->shards[i]->size() + fecHeaderSize + cryptHeaderSize); } // reset indexing @@ -412,6 +427,10 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { ssize_t UDPSession::output(const void *buffer, size_t length) { + dump("UDPSession", (char *)buffer, length); ssize_t n = send(m_sockfd, buffer, length, 0); + if (n != length) { + printf("not full send\n"); + } return n; } From 0f057fa6a4eb5cee655cad2d0c5c054a581b8e6f Mon Sep 17 00:00:00 2001 From: abigt Date: Tue, 9 May 2017 12:13:44 +0800 Subject: [PATCH 17/56] crypto none support --- iOSLib/libkcp/libkcp/BlockCrypt.cpp | 3 + sess.cpp | 189 ++++++++++------------------ 2 files changed, 66 insertions(+), 126 deletions(-) diff --git a/iOSLib/libkcp/libkcp/BlockCrypt.cpp b/iOSLib/libkcp/libkcp/BlockCrypt.cpp index 7506f1c..d97b35b 100644 --- a/iOSLib/libkcp/libkcp/BlockCrypt.cpp +++ b/iOSLib/libkcp/libkcp/BlockCrypt.cpp @@ -12,6 +12,9 @@ const uint8_t iv[] = {167, 115, 79, 156, 18, 172, 27, 1, 164, 21, 242, 193, 252, 120, 230, 107}; BlockCrypt* BlockCrypt::blockWith(const void* key,const char* crypto){ + if (strcmp(crypto, "none")) { + return NULL; + } BlockCrypt *block = new (BlockCrypt); diff --git a/sess.cpp b/sess.cpp index 95e7992..23d49ab 100644 --- a/sess.cpp +++ b/sess.cpp @@ -280,142 +280,79 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { dump("UDPSession", (char *)buf, len); if (sess->fec.isEnabled()) { // append FEC header BlockCrypt *block = sess->block; - if ( block != NULL){ - size_t headerSize = cryptHeaderSize + fecHeaderSizePlus2; - - - memcpy(sess->m_buf + headerSize, buf, static_cast(len)); - sess->fec.MarkData(sess->m_buf + cryptHeaderSize, static_cast(len)); - - //sess->m_buf reset after write? - //send ecc? - // extend to len + fecHeaderSizePlus2 - // i.e. 4B seqid + 2B flag + 2B size - - // FEC calculation - // copy "2B size + data" to shards - auto slen = len + 2; - size_t newfecHeaderSize = fecHeaderSize + cryptHeaderSize; - sess->shards[sess->pkt_idx] = - std::make_shared>(&sess->m_buf[newfecHeaderSize], &sess->m_buf[newfecHeaderSize + slen]); - - // count number of data shards - sess->pkt_idx++; - byte *ecc[128]; - size_t ecclenArray[128]; - int index = 0 ; - //create ecc? - if (sess->pkt_idx == sess->dataShards) { // we've collected enough data shards - sess->fec.Encode(sess->shards); - // send parity shards - for (size_t i = sess->dataShards; i < sess->dataShards + sess->parityShards; i++) { - // append header to parity shards - // i.e. fecHeaderSize + data(2B size included) - memcpy(sess->m_buf + newfecHeaderSize, sess->shards[i]->data(), sess->shards[i]->size()); - sess->fec.MarkFEC(sess->m_buf); - //go version write ecc to remote? - //sess->output(sess->m_buf+cryptHeaderSize, sess->shards[i]->size() + newfecHeaderSize); - // - - size_t ecclen = sess->shards[i]->size() + fecHeaderSize ; - - byte *ptr = (byte *)malloc(ecclen + cryptHeaderSize); - - - uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); - memcpy(ptr, nonce, nonceSize); - - int32_t sum = crc32(ptr + cryptHeaderSize , ecclen ); - memcpy(ptr + nonceSize, &sum, nonceSize); - memcpy(ptr + cryptHeaderSize, sess->m_buf+cryptHeaderSize, ecclen); - ecclenArray[index] = ecclen + cryptHeaderSize; - ecc[index] = ptr; - index++; - } - - // reset indexing - sess->pkt_idx = 0; - } - - - uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); - memcpy(sess->m_buf, nonce, nonceSize); - int32_t sum = crc32(sess->m_buf + cryptHeaderSize ,len + fecHeaderSizePlus2); - memcpy(sess->m_buf + nonceSize, &sum, nonceSize); - size_t outlen = 0; - block->encrypt(sess->m_buf , len + headerSize, &outlen); + + + // extend to len + fecHeaderSizePlus2 + // i.e. 4B seqid + 2B flag + 2B size + //crypto none also add nonce and crc + + uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); + + memcpy(sess->m_buf, nonce, nonceSize); + + byte *ptr = sess->m_buf + cryptHeaderSize; + + memcpy(ptr + fecHeaderSizePlus2, buf, static_cast(len)); + sess->fec.MarkData(ptr, static_cast(len)); + + int32_t sum = crc32(ptr ,len + fecHeaderSizePlus2); + memcpy(sess->m_buf + nonceSize, &sum, 4); + //dump("UDPSession header", (char *)header, nonceSize + crcSize); + //sess->output(header, nonceSize + crcSize ); + + + + // FEC calculation + // copy "2B size + data" to shards + auto slen = len + 2; + sess->shards[sess->pkt_idx] = + std::make_shared>(&sess->m_buf[fecHeaderSize + cryptHeaderSize], &sess->m_buf[fecHeaderSize + cryptHeaderSize + slen]); + size_t outlen = 0; + if (block != NULL) { + block->encrypt(sess->m_buf, len + fecHeaderSizePlus2 + cryptHeaderSize, &outlen); sess->output(sess->m_buf, outlen); - - //flush ecc - for (int i = 0 ;i< index;i++){ - byte *ptr = ecc[i]; - block->encrypt(ptr , ecclenArray[index], &outlen); - sess->output(ptr, outlen); - free(ptr); - //need add nonce and crc? - } - - - }else { - - // extend to len + fecHeaderSizePlus2 - // i.e. 4B seqid + 2B flag + 2B size - //crypto none also add nonce and crc - - uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); - - memcpy(sess->m_buf, nonce, nonceSize); - - byte *ptr = sess->m_buf + cryptHeaderSize; - - memcpy(ptr + fecHeaderSizePlus2, buf, static_cast(len)); - sess->fec.MarkData(ptr, static_cast(len)); - - int32_t sum = crc32(ptr ,len + fecHeaderSizePlus2); - memcpy(sess->m_buf + nonceSize, &sum, 4); - //dump("UDPSession header", (char *)header, nonceSize + crcSize); - //sess->output(header, nonceSize + crcSize ); sess->output(sess->m_buf, len + fecHeaderSizePlus2 + cryptHeaderSize); + } + + + // count number of data shards + sess->pkt_idx++; + if (sess->pkt_idx == sess->dataShards) { // we've collected enough data shards + sess->fec.Encode(sess->shards); + // send parity shards + //should add nonce and crc? - - // FEC calculation - // copy "2B size + data" to shards - auto slen = len + 2; - sess->shards[sess->pkt_idx] = - std::make_shared>(&sess->m_buf[fecHeaderSize + cryptHeaderSize], &sess->m_buf[fecHeaderSize + cryptHeaderSize + slen]); - - // count number of data shards - sess->pkt_idx++; - if (sess->pkt_idx == sess->dataShards) { // we've collected enough data shards - sess->fec.Encode(sess->shards); - // send parity shards - //should add nonce and crc? + for (size_t i = sess->dataShards; i < sess->dataShards + sess->parityShards; i++) { + // append header to parity shards + // i.e. fecHeaderSize + data(2B size included) + // add nonce and crc + uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); - for (size_t i = sess->dataShards; i < sess->dataShards + sess->parityShards; i++) { - // append header to parity shards - // i.e. fecHeaderSize + data(2B size included) - // add nonce and crc - uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); - - memcpy(sess->m_buf, nonce, nonceSize); - - - memcpy(ptr + fecHeaderSize, sess->shards[i]->data(), sess->shards[i]->size()); - sess->fec.MarkFEC(ptr); - - int32_t sum = crc32(ptr ,sess->shards[i]->size() + fecHeaderSize); - memcpy(sess->m_buf + nonceSize, &sum, 4); - - //go version write ecc to remote? + memcpy(sess->m_buf, nonce, nonceSize); + + + memcpy(ptr + fecHeaderSize, sess->shards[i]->data(), sess->shards[i]->size()); + sess->fec.MarkFEC(ptr); + + int32_t sum = crc32(ptr ,sess->shards[i]->size() + fecHeaderSize); + memcpy(sess->m_buf + nonceSize, &sum, 4); + + //go version write ecc to remote? + if (block != NULL) { + block->encrypt(sess->m_buf, sess->shards[i]->size() + fecHeaderSize + cryptHeaderSize, &outlen); + sess->output(sess->m_buf,outlen); + }else { sess->output(sess->m_buf, sess->shards[i]->size() + fecHeaderSize + cryptHeaderSize); } - // reset indexing - sess->pkt_idx = 0; } + + // reset indexing + sess->pkt_idx = 0; } - + + } else { // No FEC, just send raw bytes, From fa80fd88b2296a10237a1b9668793b4ed454c680 Mon Sep 17 00:00:00 2001 From: abigt Date: Tue, 9 May 2017 13:28:12 +0800 Subject: [PATCH 18/56] update udp session read from socket --- sess.cpp | 38 +++++++++++++++++++++++++------------- sess.h | 2 +- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/sess.cpp b/sess.cpp index 23d49ab..989d509 100644 --- a/sess.cpp +++ b/sess.cpp @@ -134,29 +134,41 @@ UDPSession::Update(uint32_t current) noexcept { ssize_t n = recv(m_sockfd, m_buf, sizeof(m_buf), 0); if (n > 0) { //change by abigt - //bool dataValid = false; - + bool dataValid = false; + size_t outlen = n; + char *out = (char *)m_buf; + //nonceSize = 16 + outlen -= nonceSize; + out += nonceSize; + uint32_t sum = 0; if (block != NULL) { - size_t outlen = 0; + block->decrypt(m_buf, n, &outlen); - char *out = (char *)m_buf; - //nonceSize = 16 - outlen -= nonceSize; - out += nonceSize; - uint32_t sum = 0; memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); out += crcSize; int32_t checksum = crc32((uint8_t *)out, crcSize); if (checksum == sum){ - - KcpInPut((char *)m_buf, n - nonceSize - crcSize); + dataValid = true; } }else { - KcpInPut((char *)m_buf, n); + + memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); + out += crcSize; + int32_t checksum = crc32((uint8_t *)out, crcSize); + if (checksum == sum){ + dataValid = true; + } + + } + if (outlen != n) { + printf("decrypt error"); + } + if (dataValid == true) { + memmove(m_buf, m_buf + cryptHeaderSize, cryptHeaderSize); + KcpInPut(n - cryptHeaderSize); } - } else { break; @@ -166,7 +178,7 @@ UDPSession::Update(uint32_t current) noexcept { ikcp_flush(m_kcp); } void -UDPSession::KcpInPut(char *buffer,size_t len) noexcept { +UDPSession::KcpInPut(size_t len) noexcept { if (fec.isEnabled()) { // decode FEC packet auto pkt = fec.Decode(m_buf, static_cast(len)); diff --git a/sess.h b/sess.h index 6c64f47..02b7290 100644 --- a/sess.h +++ b/sess.h @@ -40,7 +40,7 @@ class UDPSession { void Update(uint32_t current) noexcept; //kcpInput go UDPpsession - void KcpInPut(char *buffer, size_t len) noexcept; + void KcpInPut(size_t len) noexcept; // Destroy release all resource related. static void Destroy(UDPSession *sess); From 58a51d20465a9c9a9de8745a1e7ffe8611e5c7fa Mon Sep 17 00:00:00 2001 From: abigt Date: Tue, 9 May 2017 15:42:06 +0800 Subject: [PATCH 19/56] update udp recv --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 1 + sess.cpp | 29 +++++++++++++++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 23302da..4e4fe00 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -145,6 +145,7 @@ -(void)run{ sess->Update(iclock()); if (n > 0 ){ NSData *d = [NSData dataWithBytes:buf length:n]; + NSLog(@"##### kcp recv %@",d); [self.delegate didRecevied:d]; } free(buf); diff --git a/sess.cpp b/sess.cpp index 989d509..6708c66 100644 --- a/sess.cpp +++ b/sess.cpp @@ -25,9 +25,19 @@ void dump(char *tag, char *text, int len) { int i; - printf("%s: ", tag); - for (i = 0; i < len; i++) - printf("%02x ", (uint8_t)text[i]); + printf("%s: \n", tag); + for (i = 0; i < len; i++){ + if ((i % 16) == 0 && i != 0){ + printf("\n"); + } + if ((i % 4) == 0 && ((i%16) != 0)){ + printf(" "); + + } + printf("%02x", (uint8_t)text[i]); + + + } printf("\n"); } @@ -132,13 +142,16 @@ void UDPSession::Update(uint32_t current) noexcept { for (;;) { ssize_t n = recv(m_sockfd, m_buf, sizeof(m_buf), 0); + if (n > 0) { + dump("UDP Update", (char*)m_buf, n); //change by abigt bool dataValid = false; size_t outlen = n; + //size_t orgsize = n; char *out = (char *)m_buf; //nonceSize = 16 - outlen -= nonceSize; + //outlen -= nonceSize; out += nonceSize; uint32_t sum = 0; if (block != NULL) { @@ -163,10 +176,10 @@ UDPSession::Update(uint32_t current) noexcept { } if (outlen != n) { - printf("decrypt error"); + printf("decrypt error outlen= %lu n = %lu\n",outlen,n); } if (dataValid == true) { - memmove(m_buf, m_buf + cryptHeaderSize, cryptHeaderSize); + memmove(m_buf, m_buf + cryptHeaderSize, n-cryptHeaderSize); KcpInPut(n - cryptHeaderSize); } @@ -289,7 +302,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { assert(user != nullptr); UDPSession *sess = static_cast(user); //test no cover - dump("UDPSession", (char *)buf, len); + dump("UDPSession kcp packet", (char *)buf, len); if (sess->fec.isEnabled()) { // append FEC header BlockCrypt *block = sess->block; @@ -376,7 +389,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { ssize_t UDPSession::output(const void *buffer, size_t length) { - dump("UDPSession", (char *)buffer, length); + dump("UDPSession write socket", (char *)buffer, length); ssize_t n = send(m_sockfd, buffer, length, 0); if (n != length) { printf("not full send\n"); From c26865c3929f5832a5f14a81b7191fe96b51990a Mon Sep 17 00:00:00 2001 From: abigt Date: Fri, 12 May 2017 23:10:28 +0800 Subject: [PATCH 20/56] fix crc sum buffer data length bug --- iOSLib/libkcp/kcptest/ViewController.mm | 3 +- .../libkcp/libkcp.xcodeproj/project.pbxproj | 2 + iOSLib/libkcp/libkcp/SFKcpTun.h | 3 +- iOSLib/libkcp/libkcp/SFKcpTun.mm | 67 ++++++++++++------- iOSLib/libkcp/libkcp/TunConfig.m | 10 +-- sess.cpp | 22 +++--- 6 files changed, 68 insertions(+), 39 deletions(-) diff --git a/iOSLib/libkcp/kcptest/ViewController.mm b/iOSLib/libkcp/kcptest/ViewController.mm index cb286b8..5ebf1a9 100644 --- a/iOSLib/libkcp/kcptest/ViewController.mm +++ b/iOSLib/libkcp/kcptest/ViewController.mm @@ -58,7 +58,8 @@ - (IBAction)go:(id)sender { int port = [self.port.text integerValue]; if (self.tun == nil) { TunConfig *c = [[TunConfig alloc] init]; - self.tun = [[SFKcpTun alloc] initWithConfig:c ipaddr:self.addr.text port:port]; + dispatch_queue_t queue = dispatch_queue_create("test", 0); + self.tun = [[SFKcpTun alloc] initWithConfig:c ipaddr:self.addr.text port:port queue:queue]; self.tun.delegate = self; } diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 07a79ff..e0c8e2a 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -536,6 +536,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = libkcp/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -557,6 +558,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = libkcp/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.h b/iOSLib/libkcp/libkcp/SFKcpTun.h index e7d157d..642e66c 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.h +++ b/iOSLib/libkcp/libkcp/SFKcpTun.h @@ -21,7 +21,8 @@ @property (weak,nonatomic) NSObject *delegate; @property (nonatomic) int port; @property (nonatomic) BOOL connected; --(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port; +@property (nonatomic) dispatch_queue_t dispatchqueue ; +-(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue; -(void)startUDPSession; -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port; diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 4e4fe00..7b19db6 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -43,12 +43,13 @@ @implementation SFKcpTun dispatch_source_t _timer; dispatch_queue_t queue ; } --(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port +-(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue { if (self = [super init]){ self.config = c; self.server = ip; self.port = port; + self.dispatchqueue = dqueue; queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); [self startUDPSession]; } @@ -105,19 +106,24 @@ -(void)input:(NSData*)data{ assert(sess != nullptr); - size_t tosend = data.length; - size_t sended = 0 ; - char *ptr = (char *)data.bytes; - while (sended < tosend) { - - - size_t sendt = sess->Write(ptr, data.length - sended); - sended += sendt ; - ptr += sended; - NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); - sess->Update(iclock()); - } - NSLog(@"KCPTun sent %zu",sended); + + dispatch_async(queue, ^{ + size_t tosend = data.length; + size_t sended = 0 ; + char *ptr = (char *)data.bytes; + + while (sended < tosend) { + + + size_t sendt = sess->Write(ptr, data.length - sended); + sended += sendt ; + ptr += sended; + NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); + sess->Update(iclock()); + } + }); + + //NSLog(@"KCPTun sent %zu",sended); } -(void)run{ @@ -136,20 +142,33 @@ -(void)run{ dispatch_source_set_timer(dispatchSource, startTime, intervalTime, 0); // Attach the block you want to run on the timer fire + __weak SFKcpTun *weakSelf = self; dispatch_source_set_event_handler(dispatchSource, ^{ // Your code here - if (sess != nil) { - char *buf = (char *) malloc(4096); - memset(buf, 0, 4096); - ssize_t n = sess->Read(buf, 4096); - sess->Update(iclock()); - if (n > 0 ){ - NSData *d = [NSData dataWithBytes:buf length:n]; - NSLog(@"##### kcp recv %@",d); - [self.delegate didRecevied:d]; + SFKcpTun* strongSelf = weakSelf; + if (strongSelf) { + if (sess != nil) { + + char *buf = (char *) malloc(4096); + + memset(buf, 0, 4096); + ssize_t n = sess->Read(buf, 4096); + sess->Update(iclock()); + if (n > 0 ){ + NSData *d = [NSData dataWithBytes:buf length:n]; + NSLog(@"##### kcp recv %@\n",d); + + dispatch_async(strongSelf.dispatchqueue, ^{ + [strongSelf.delegate didRecevied:d]; + }); + + }else { + NSLog(@"##### kcp recv null\n"); + } + free(buf); } - free(buf); } + }); diff --git a/iOSLib/libkcp/libkcp/TunConfig.m b/iOSLib/libkcp/libkcp/TunConfig.m index dda7672..6827c7e 100644 --- a/iOSLib/libkcp/libkcp/TunConfig.m +++ b/iOSLib/libkcp/libkcp/TunConfig.m @@ -12,17 +12,17 @@ @implementation TunConfig - (instancetype)init{ if (self = [super init]){ - self.dataShards = 2; - self.parityShards = 2; + self.dataShards = 10; + self.parityShards = 3; - self.nodelay = 1; - self.interval = 20; + self.nodelay = 0; + self.interval = 30; self.resend = 2; self.nc = 1; self.resend = 128; self.rcvwnd = 128; - self.mtu = 1400 ; + self.mtu = 1350 ; self.iptos = 46; } diff --git a/sess.cpp b/sess.cpp index 6708c66..a752101 100644 --- a/sess.cpp +++ b/sess.cpp @@ -17,12 +17,12 @@ const size_t crcSize = 4; const size_t cryptHeaderSize = nonceSize + crcSize; // maximum packet size -const size_t mtuLimit = 1500; +//const size_t mtuLimit = 1500; // FEC keeps rxFECMulti* (dataShard+parityShard) ordered packets in memory const size_t rxFECMulti = 3; void -dump(char *tag, char *text, int len) +dump(char *tag, byte *text, size_t len) { int i; printf("%s: \n", tag); @@ -76,7 +76,7 @@ UDPSession::DialWithOptions(const char *ip, uint16_t port, size_t dataShards, si } if (dataShards > 0 && parityShards > 0) { - sess->fec = FEC::New(3 * (dataShards + parityShards), dataShards, parityShards); + sess->fec = FEC::New(rxFECMulti * (dataShards + parityShards), dataShards, parityShards); sess->shards.resize(dataShards + parityShards, nullptr); sess->dataShards = dataShards; sess->parityShards = parityShards; @@ -144,7 +144,7 @@ UDPSession::Update(uint32_t current) noexcept { ssize_t n = recv(m_sockfd, m_buf, sizeof(m_buf), 0); if (n > 0) { - dump("UDP Update", (char*)m_buf, n); + dump((char*)"UDP Update", m_buf, n); //change by abigt bool dataValid = false; size_t outlen = n; @@ -160,7 +160,7 @@ UDPSession::Update(uint32_t current) noexcept { memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); out += crcSize; - int32_t checksum = crc32((uint8_t *)out, crcSize); + int32_t checksum = crc32((uint8_t *)out, cryptHeaderSize); if (checksum == sum){ dataValid = true; @@ -169,7 +169,7 @@ UDPSession::Update(uint32_t current) noexcept { memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); out += crcSize; - int32_t checksum = crc32((uint8_t *)out, crcSize); + int32_t checksum = crc32((uint8_t *)out, n - cryptHeaderSize); if (checksum == sum){ dataValid = true; } @@ -184,6 +184,9 @@ UDPSession::Update(uint32_t current) noexcept { } } else { + if (n == 0){ + printf("UDPSession recv nil"); + } break; } } @@ -198,6 +201,7 @@ UDPSession::KcpInPut(size_t len) noexcept { if (pkt.flag == typeData) { auto ptr = pkt.data->data(); // we have 2B size, ignore for typeData + dump((char*)"ikcp input data:", (byte *) (ptr + 2), pkt.data->size() - 2); ikcp_input(m_kcp, (char *) (ptr + 2), pkt.data->size() - 2); } @@ -218,7 +222,9 @@ UDPSession::KcpInPut(size_t len) noexcept { // the recovered packet size must be in the correct range. if (sz >= 2 && sz <= r->size()) { // input proper data to kcp + dump((char*)"ikcp input data2:", (byte *) (ptr + 2), sz - 2); ikcp_input(m_kcp, (char *) (ptr + 2), sz - 2); + // std::cout << "sz:" << sz << std::endl; } } @@ -302,7 +308,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { assert(user != nullptr); UDPSession *sess = static_cast(user); //test no cover - dump("UDPSession kcp packet", (char *)buf, len); + dump((char*)"UDPSession kcp packet", (byte*)buf, (size_t)len); if (sess->fec.isEnabled()) { // append FEC header BlockCrypt *block = sess->block; @@ -389,7 +395,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { ssize_t UDPSession::output(const void *buffer, size_t length) { - dump("UDPSession write socket", (char *)buffer, length); + dump((char*)"UDPSession write socket", (byte *)buffer, length); ssize_t n = send(m_sockfd, buffer, length, 0); if (n != length) { printf("not full send\n"); From c968827aa01f085c06ba19d5ae94a245daf2e6f3 Mon Sep 17 00:00:00 2001 From: abigt Date: Sat, 13 May 2017 00:23:02 +0800 Subject: [PATCH 21/56] fix c str cmp value --- iOSLib/libkcp/libkcp/BlockCrypt.cpp | 2 +- iOSLib/libkcp/libkcp/SFKcpTun.mm | 2 +- sess.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iOSLib/libkcp/libkcp/BlockCrypt.cpp b/iOSLib/libkcp/libkcp/BlockCrypt.cpp index d97b35b..553b4b2 100644 --- a/iOSLib/libkcp/libkcp/BlockCrypt.cpp +++ b/iOSLib/libkcp/libkcp/BlockCrypt.cpp @@ -12,7 +12,7 @@ const uint8_t iv[] = {167, 115, 79, 156, 18, 172, 27, 1, 164, 21, 242, 193, 252, 120, 230, 107}; BlockCrypt* BlockCrypt::blockWith(const void* key,const char* crypto){ - if (strcmp(crypto, "none")) { + if (strcmp(crypto, "none") == 0) { return NULL; } BlockCrypt *block = new (BlockCrypt); diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 7b19db6..1e87a29 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -163,7 +163,7 @@ -(void)run{ }); }else { - NSLog(@"##### kcp recv null\n"); + //NSLog(@"##### kcp recv null\n"); } free(buf); } diff --git a/sess.cpp b/sess.cpp index a752101..2b2ec52 100644 --- a/sess.cpp +++ b/sess.cpp @@ -160,7 +160,7 @@ UDPSession::Update(uint32_t current) noexcept { memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); out += crcSize; - int32_t checksum = crc32((uint8_t *)out, cryptHeaderSize); + int32_t checksum = crc32((uint8_t *)out, n-cryptHeaderSize); if (checksum == sum){ dataValid = true; From 108c846ecdcb181479e430563d9c79074a046d66 Mon Sep 17 00:00:00 2001 From: abigt Date: Sat, 13 May 2017 00:58:57 +0800 Subject: [PATCH 22/56] fix cpu load to height use while loop add connected flag --- iOSLib/libkcp/libkcp/SFKcpTun.h | 1 + iOSLib/libkcp/libkcp/SFKcpTun.mm | 46 +++++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.h b/iOSLib/libkcp/libkcp/SFKcpTun.h index 642e66c..a76a877 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.h +++ b/iOSLib/libkcp/libkcp/SFKcpTun.h @@ -21,6 +21,7 @@ @property (weak,nonatomic) NSObject *delegate; @property (nonatomic) int port; @property (nonatomic) BOOL connected; + @property (nonatomic) dispatch_queue_t dispatchqueue ; -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue; diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 1e87a29..1701874 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -71,7 +71,8 @@ -(void)startUDPSession sess->SetStreamMode(true); sess->SetDSCP(self.config.iptos); assert(sess != nullptr); - [self run]; + self.connected = true; + [self runTest]; } -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port { @@ -92,12 +93,13 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port sess->SetMtu(self.config.mtu); sess->SetStreamMode(true); sess->SetDSCP(self.config.iptos); - + self.connected = true; assert(sess != nullptr); - [self run]; + [self runTest]; } -(void)shutdownUDPSession { + self.connected = false; UDPSession::Destroy(sess); } @@ -183,4 +185,42 @@ -(void)run{ // If on iOS5 and/or using MRC, you'll need to release the source too //dispatch_release(dispatchSource); } +-(void)runTest +{ __weak SFKcpTun *weakSelf = self; + dispatch_async(self.dispatchqueue, ^{ + SFKcpTun* strongSelf = weakSelf; + while (strongSelf.connected) { + + + if (strongSelf) { + if (sess != nil) { + + + char *buf = (char *) malloc(4096); + + memset(buf, 0, 4096); + ssize_t n = sess->Read(buf, 4096); + sess->Update(iclock()); + + if (n > 0 ){ + NSData *d = [NSData dataWithBytes:buf length:n]; + NSLog(@"##### kcp recv %@\n",d); + + dispatch_async(strongSelf.dispatchqueue, ^{ + [strongSelf.delegate didRecevied:d]; + }); + + }else { + //NSLog(@"##### kcp recv null\n"); + } + free(buf); + usleep(33000); + }else { + break; + } + } + + } + }); +} @end From 641a0182cafdca5345be2a6ac10a828099865047 Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Mon, 22 May 2017 17:04:38 +0800 Subject: [PATCH 23/56] thread recv data --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 1701874..05089cc 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -160,9 +160,9 @@ -(void)run{ NSData *d = [NSData dataWithBytes:buf length:n]; NSLog(@"##### kcp recv %@\n",d); - dispatch_async(strongSelf.dispatchqueue, ^{ + //dispatch_async(strongSelf.dispatchqueue, ^{ [strongSelf.delegate didRecevied:d]; - }); + //}); }else { //NSLog(@"##### kcp recv null\n"); @@ -206,12 +206,12 @@ -(void)runTest NSData *d = [NSData dataWithBytes:buf length:n]; NSLog(@"##### kcp recv %@\n",d); - dispatch_async(strongSelf.dispatchqueue, ^{ + //dispatch_async(strongSelf.dispatchqueue, ^{ [strongSelf.delegate didRecevied:d]; - }); + //}); }else { - //NSLog(@"##### kcp recv null\n"); + NSLog(@"##### kcp recv null\n"); } free(buf); usleep(33000); From d775a9affb2d5163117b03def31da2c781e2ff39 Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Mon, 22 May 2017 23:16:45 +0800 Subject: [PATCH 24/56] bug fix --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 05089cc..207faa1 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -187,7 +187,7 @@ -(void)run{ } -(void)runTest { __weak SFKcpTun *weakSelf = self; - dispatch_async(self.dispatchqueue, ^{ + dispatch_async(self->queue, ^{ SFKcpTun* strongSelf = weakSelf; while (strongSelf.connected) { @@ -203,12 +203,15 @@ -(void)runTest sess->Update(iclock()); if (n > 0 ){ - NSData *d = [NSData dataWithBytes:buf length:n]; - NSLog(@"##### kcp recv %@\n",d); + //NSData *d = [NSData dataWithBytes:buf length:n]; + NSMutableData *dx = [NSMutableData dataWithLength:n]; + char *ptr = (char*)dx.bytes; + memcpy(ptr, buf, n); + NSLog(@"##### kcp recv %@\n",dx); - //dispatch_async(strongSelf.dispatchqueue, ^{ - [strongSelf.delegate didRecevied:d]; - //}); + dispatch_async(strongSelf.dispatchqueue, ^{ + [strongSelf.delegate didRecevied:dx]; + }); }else { NSLog(@"##### kcp recv null\n"); From a4aef341e8b08613e35bcd94d0e4a7b55c37d493 Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Mon, 22 May 2017 23:17:43 +0800 Subject: [PATCH 25/56] remove personal data --- .../UserInterfaceState.xcuserstate | Bin 63167 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index d3820cffa5a19b44454ed50b8b5738131175180f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63167 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 T*ZTEqzY*8ge*gHn^z{D#H`0~n From ea6034767699a96c20969ba50b55572e3c9b4eb4 Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Tue, 23 May 2017 00:36:40 +0800 Subject: [PATCH 26/56] add a write dispatch queue --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 207faa1..c80b084 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -42,6 +42,7 @@ @implementation SFKcpTun { dispatch_source_t _timer; dispatch_queue_t queue ; + dispatch_queue_t writequeue ; } -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue { @@ -51,6 +52,7 @@ -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port self.port = port; self.dispatchqueue = dqueue; queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + writequeue = dispatch_queue_create("com.abigt.kcpwrite", DISPATCH_QUEUE_SERIAL); [self startUDPSession]; } return self; @@ -109,7 +111,7 @@ -(void)input:(NSData*)data{ assert(sess != nullptr); - dispatch_async(queue, ^{ + dispatch_async(writequeue, ^{ size_t tosend = data.length; size_t sended = 0 ; char *ptr = (char *)data.bytes; @@ -151,6 +153,33 @@ -(void)run{ if (strongSelf) { if (sess != nil) { +// @synchronized (self) { +// while ([self.sendqueue count] > 0){ +// NSData *data = [self.sendqueue firstObject]; +// size_t tosend = data.length; +// size_t sended = 0 ; +// char *ptr = (char *)data.bytes; +// +// while (sended < tosend) { +// +// +// size_t sendt = sess->Write(ptr, data.length - sended); +// sended += sendt ; +// ptr += sended; +// NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); +// sess->Update(iclock()); +// } +// [self.sendqueue removeObjectAtIndex:0]; +// } +// +// } + + + + + + + char *buf = (char *) malloc(4096); memset(buf, 0, 4096); From f717ed56d98ccbf9096079ff1a6df3b8e0c02f0c Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Tue, 23 May 2017 13:02:09 +0800 Subject: [PATCH 27/56] set target 9.0 --- iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj | 6 ++++-- iOSLib/libkcp/libkcp/SFKcpTun.mm | 8 ++++---- iOSLib/libkcp/libkcp/kcp.h | 4 ++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index e0c8e2a..7ee4ff5 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -527,6 +527,7 @@ 692AE32A1EB2EE59006A4B9D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; DEFINES_MODULE = YES; @@ -536,7 +537,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = libkcp/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -549,6 +550,7 @@ 692AE32B1EB2EE59006A4B9D /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; DEFINES_MODULE = YES; @@ -558,7 +560,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = libkcp/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index c80b084..082f34f 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -122,8 +122,8 @@ -(void)input:(NSData*)data{ size_t sendt = sess->Write(ptr, data.length - sended); sended += sendt ; ptr += sended; - NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); - sess->Update(iclock()); + //NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); + //sess->Update(iclock()); } }); @@ -236,14 +236,14 @@ -(void)runTest NSMutableData *dx = [NSMutableData dataWithLength:n]; char *ptr = (char*)dx.bytes; memcpy(ptr, buf, n); - NSLog(@"##### kcp recv %@\n",dx); + //NSLog(@"##### kcp recv %@\n",dx); dispatch_async(strongSelf.dispatchqueue, ^{ [strongSelf.delegate didRecevied:dx]; }); }else { - NSLog(@"##### kcp recv null\n"); + //NSLog(@"##### kcp recv null\n"); } free(buf); usleep(33000); diff --git a/iOSLib/libkcp/libkcp/kcp.h b/iOSLib/libkcp/libkcp/kcp.h index 45514bb..82ae30b 100644 --- a/iOSLib/libkcp/libkcp/kcp.h +++ b/iOSLib/libkcp/libkcp/kcp.h @@ -9,10 +9,10 @@ #import //! Project version number for libkcp. -FOUNDATION_EXPORT double libkcpVersionNumber; +FOUNDATION_EXPORT double kcpVersionNumber; //! Project version string for libkcp. -FOUNDATION_EXPORT const unsigned char libkcpVersionString[]; +FOUNDATION_EXPORT const unsigned char kcpVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import From 09bcd0ec05db87319354519215d10b63bd57f1e0 Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Wed, 24 May 2017 23:36:12 +0800 Subject: [PATCH 28/56] resolve memory issue --- .../libkcp/libkcp.xcodeproj/project.pbxproj | 4 +- iOSLib/libkcp/libkcp/SFKcpTun.h | 4 +- iOSLib/libkcp/libkcp/SFKcpTun.mm | 113 +++--------------- sess.cpp | 15 ++- 4 files changed, 28 insertions(+), 108 deletions(-) diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 7ee4ff5..4c90160 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -537,7 +537,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = libkcp/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -560,7 +560,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = libkcp/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.h b/iOSLib/libkcp/libkcp/SFKcpTun.h index a76a877..69fe2da 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.h +++ b/iOSLib/libkcp/libkcp/SFKcpTun.h @@ -21,7 +21,7 @@ @property (weak,nonatomic) NSObject *delegate; @property (nonatomic) int port; @property (nonatomic) BOOL connected; - +//callback queue @property (nonatomic) dispatch_queue_t dispatchqueue ; -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue; @@ -29,5 +29,5 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port; -(void)shutdownUDPSession; -(void)input:(NSData*)data; - +-(void)upDate; @end diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 082f34f..194eb79 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -42,7 +42,8 @@ @implementation SFKcpTun { dispatch_source_t _timer; dispatch_queue_t queue ; - dispatch_queue_t writequeue ; + dispatch_queue_t socketqueue ; + } -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue { @@ -52,7 +53,7 @@ -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port self.port = port; self.dispatchqueue = dqueue; queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - writequeue = dispatch_queue_create("com.abigt.kcpwrite", DISPATCH_QUEUE_SERIAL); + socketqueue = dispatch_queue_create("com.abigt.kcpwrite", DISPATCH_QUEUE_SERIAL); [self startUDPSession]; } return self; @@ -75,6 +76,7 @@ -(void)startUDPSession assert(sess != nullptr); self.connected = true; [self runTest]; + } -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port { @@ -111,7 +113,7 @@ -(void)input:(NSData*)data{ assert(sess != nullptr); - dispatch_async(writequeue, ^{ + dispatch_async(socketqueue, ^{ size_t tosend = data.length; size_t sended = 0 ; char *ptr = (char *)data.bytes; @@ -123,6 +125,7 @@ -(void)input:(NSData*)data{ sended += sendt ; ptr += sended; //NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); + //不能并行,效率有折扣 //sess->Update(iclock()); } }); @@ -130,90 +133,7 @@ -(void)input:(NSData*)data{ //NSLog(@"KCPTun sent %zu",sended); } --(void)run{ - // - // - // Create a dispatch source that'll act as a timer on the concurrent queue - // You'll need to store this somewhere so you can suspend and remove it later on - // - dispatch_source_t dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, - queue);//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) - - // Setup params for creation of a recurring timer - double interval = 33.0; - dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 0); - uint64_t intervalTime = (int64_t)(interval * NSEC_PER_MSEC); - dispatch_source_set_timer(dispatchSource, startTime, intervalTime, 0); - - // Attach the block you want to run on the timer fire - __weak SFKcpTun *weakSelf = self; - dispatch_source_set_event_handler(dispatchSource, ^{ - // Your code here - SFKcpTun* strongSelf = weakSelf; - if (strongSelf) { - if (sess != nil) { - -// @synchronized (self) { -// while ([self.sendqueue count] > 0){ -// NSData *data = [self.sendqueue firstObject]; -// size_t tosend = data.length; -// size_t sended = 0 ; -// char *ptr = (char *)data.bytes; -// -// while (sended < tosend) { -// -// -// size_t sendt = sess->Write(ptr, data.length - sended); -// sended += sendt ; -// ptr += sended; -// NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); -// sess->Update(iclock()); -// } -// [self.sendqueue removeObjectAtIndex:0]; -// } -// -// } - - - - - - - - char *buf = (char *) malloc(4096); - - memset(buf, 0, 4096); - ssize_t n = sess->Read(buf, 4096); - sess->Update(iclock()); - if (n > 0 ){ - NSData *d = [NSData dataWithBytes:buf length:n]; - NSLog(@"##### kcp recv %@\n",d); - - //dispatch_async(strongSelf.dispatchqueue, ^{ - [strongSelf.delegate didRecevied:d]; - //}); - - }else { - //NSLog(@"##### kcp recv null\n"); - } - free(buf); - } - } - - - }); - - // Start the timer - dispatch_resume(dispatchSource); - _timer = dispatchSource; - // ---- - - // When you want to stop the timer, you need to suspend the source - //dispatch_suspend(dispatchSource); - - // If on iOS5 and/or using MRC, you'll need to release the source too - //dispatch_release(dispatchSource); -} + -(void)runTest { __weak SFKcpTun *weakSelf = self; dispatch_async(self->queue, ^{ @@ -232,26 +152,23 @@ -(void)runTest sess->Update(iclock()); if (n > 0 ){ - //NSData *d = [NSData dataWithBytes:buf length:n]; - NSMutableData *dx = [NSMutableData dataWithLength:n]; - char *ptr = (char*)dx.bytes; - memcpy(ptr, buf, n); - //NSLog(@"##### kcp recv %@\n",dx); + @autoreleasepool { + NSData *d = [NSData dataWithBytes:buf length:n]; + + dispatch_async(strongSelf.dispatchqueue, ^{ + [strongSelf.delegate didRecevied:d]; + }); + } - dispatch_async(strongSelf.dispatchqueue, ^{ - [strongSelf.delegate didRecevied:dx]; - }); }else { //NSLog(@"##### kcp recv null\n"); } free(buf); usleep(33000); - }else { - break; } } - + } }); } diff --git a/sess.cpp b/sess.cpp index 2b2ec52..36058b4 100644 --- a/sess.cpp +++ b/sess.cpp @@ -21,9 +21,11 @@ const size_t cryptHeaderSize = nonceSize + crcSize; // FEC keeps rxFECMulti* (dataShard+parityShard) ordered packets in memory const size_t rxFECMulti = 3; +#define KCP_DEBUG 0 void dump(char *tag, byte *text, size_t len) { +#if KCP_DEBUG int i; printf("%s: \n", tag); for (i = 0; i < len; i++){ @@ -39,8 +41,9 @@ dump(char *tag, byte *text, size_t len) } printf("\n"); +#endif } - +#define debug_print(args ...) if (KCP_DEBUG) fprintf(stderr, args) UDPSession * UDPSession::Dial(const char *ip, uint16_t port) { struct sockaddr_in saddr; @@ -176,7 +179,7 @@ UDPSession::Update(uint32_t current) noexcept { } if (outlen != n) { - printf("decrypt error outlen= %lu n = %lu\n",outlen,n); + debug_print("decrypt error outlen= %lu n = %lu\n",outlen,n); } if (dataValid == true) { memmove(m_buf, m_buf + cryptHeaderSize, n-cryptHeaderSize); @@ -185,7 +188,7 @@ UDPSession::Update(uint32_t current) noexcept { } else { if (n == 0){ - printf("UDPSession recv nil"); + debug_print("UDPSession recv nil"); } break; } @@ -320,7 +323,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { uint8_t *nonce = BlockCrypt::ramdonBytes(nonceSize); memcpy(sess->m_buf, nonce, nonceSize); - + free(nonce); byte *ptr = sess->m_buf + cryptHeaderSize; memcpy(ptr + fecHeaderSizePlus2, buf, static_cast(len)); @@ -362,7 +365,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { memcpy(sess->m_buf, nonce, nonceSize); - + free(nonce); memcpy(ptr + fecHeaderSize, sess->shards[i]->data(), sess->shards[i]->size()); sess->fec.MarkFEC(ptr); @@ -398,7 +401,7 @@ UDPSession::output(const void *buffer, size_t length) { dump((char*)"UDPSession write socket", (byte *)buffer, length); ssize_t n = send(m_sockfd, buffer, length, 0); if (n != length) { - printf("not full send\n"); + debug_print("not full send\n"); } return n; } From 1ebd5ef6acdf03975e0bc484cede88a50b9adb83 Mon Sep 17 00:00:00 2001 From: yarshure Date: Fri, 26 May 2017 14:03:23 +0800 Subject: [PATCH 29/56] packet full ,continue read --- .../libkcp/kcptest/Base.lproj/Main.storyboard | 20 +++++- iOSLib/libkcp/kcptest/ViewController.mm | 36 ++++++++-- iOSLib/libkcp/libkcp/SFKcpTun.mm | 67 ++++++++++++++++++- iOSLib/libkcp/libkcp/TunConfig.m | 2 +- kcpserver.go | 19 +++++- 5 files changed, 129 insertions(+), 15 deletions(-) diff --git a/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard b/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard index 0a27b66..5fdb34a 100644 --- a/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard +++ b/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard @@ -1,5 +1,5 @@ - + @@ -28,7 +28,7 @@ - + @@ -59,6 +59,22 @@ + + diff --git a/iOSLib/libkcp/kcptest/ViewController.mm b/iOSLib/libkcp/kcptest/ViewController.mm index 5ebf1a9..4885c91 100644 --- a/iOSLib/libkcp/kcptest/ViewController.mm +++ b/iOSLib/libkcp/kcptest/ViewController.mm @@ -13,6 +13,8 @@ @interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *addr; @property (weak, nonatomic) IBOutlet UITextField *port; @property (strong,nonatomic) SFKcpTun *tun; +@property (strong,nonatomic) dispatch_queue_t dispatchqueue; +@property (nonatomic,strong) NSTimer *t; @end @implementation ViewController @@ -20,6 +22,7 @@ @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; + self.dispatchqueue = dispatch_queue_create("test", NULL); [self testCrypto]; // Do any additional setup after loading the view, typically from a nib. } @@ -55,11 +58,15 @@ -(void)testB{ - (IBAction)go:(id)sender { //kcptest(, ); const char *addr = [self.addr.text UTF8String]; - int port = [self.port.text integerValue]; + NSInteger port = [self.port.text integerValue]; if (self.tun == nil) { TunConfig *c = [[TunConfig alloc] init]; - dispatch_queue_t queue = dispatch_queue_create("test", 0); - self.tun = [[SFKcpTun alloc] initWithConfig:c ipaddr:self.addr.text port:port queue:queue]; + c.dataShards = 2; + c.parityShards = 2; + c.iptos = 46; + + //c.key = [@"1234567890123456789012345678901234567890" dataUsingEncoding:NSUTF8StringEncoding]; + self.tun = [[SFKcpTun alloc] initWithConfig:c ipaddr:self.addr.text port:port queue:self.dispatchqueue]; self.tun.delegate = self; } @@ -69,14 +76,29 @@ - (IBAction)send:(id)sender { if ( self.tun == nil ){ return; } - for (int i = 0; i < 10; i++) { - NSString *msg = [NSString stringWithFormat:@"message %d",i]; - NSData *d = [msg dataUsingEncoding:NSUTF8StringEncoding]; + self.t = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(sendtest) userInfo:nil repeats:true]; +} +- (IBAction)stop:(id)sender { + [self.t invalidate]; +} +-(void)sendtest +{ + for (int i = 0; i < 1000; i++) { + char *ptr = (char *)BlockCrypt::ramdonBytes(40960); + NSData *d = [NSData dataWithBytes:(void*)ptr length:40960]; + free(ptr); [self.tun input:d]; } } +-(IBAction)shutdown:(id)sender +{ + if (self.tun != nil){ + [self.tun shutdownUDPSession]; + self.tun = nil; + } +} -(void)didRecevied:(NSData*)data{ - NSLog(@"recv %@",data); + NSLog(@"recv: %lu",(unsigned long)data.length); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 194eb79..5887f8f 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -125,12 +125,18 @@ -(void)input:(NSData*)data{ sended += sendt ; ptr += sended; //NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); - //不能并行,效率有折扣 + //不能并行接收网络数据,效率有折扣 //sess->Update(iclock()); } + if (sended == [data length]) { + NSLog(@"KCPTun sent %zu",sended); + }else { + exit(-1); + } + }); - //NSLog(@"KCPTun sent %zu",sended); + } @@ -165,11 +171,66 @@ -(void)runTest //NSLog(@"##### kcp recv null\n"); } free(buf); - usleep(33000); + if (n != 1298){ + usleep(33000); + } + } } } }); } +-(void)testPorformce +{ + __weak SFKcpTun *weakSelf = self; + dispatch_async(self->queue, ^{ + SFKcpTun* strongSelf = weakSelf; + while (strongSelf.connected) { + + + if (strongSelf) { + if (sess != nil) { + + + @autoreleasepool { + char *ptr = (char *)BlockCrypt::ramdonBytes(1326); + + size_t sendt = sess->Write(ptr, 1326); + free(ptr); + + } + + + char *buf = (char *) malloc(4096); + + memset(buf, 0, 4096); + ssize_t n = sess->Read(buf, 4096); + sess->Update(iclock()); + + if (n > 0 ){ + @autoreleasepool { + NSData *d = [NSData dataWithBytes:buf length:n]; + + dispatch_async(strongSelf.dispatchqueue, ^{ + [strongSelf.delegate didRecevied:d]; + }); + } + + + }else { + //NSLog(@"##### kcp recv null\n"); + } + free(buf); + if (n != 1326) { + usleep(330); + } + + } + } + + } + }); + +} @end diff --git a/iOSLib/libkcp/libkcp/TunConfig.m b/iOSLib/libkcp/libkcp/TunConfig.m index 6827c7e..503624b 100644 --- a/iOSLib/libkcp/libkcp/TunConfig.m +++ b/iOSLib/libkcp/libkcp/TunConfig.m @@ -24,7 +24,7 @@ - (instancetype)init{ self.rcvwnd = 128; self.mtu = 1350 ; self.iptos = 46; - + self.crypt = @"none"; } return self; } diff --git a/kcpserver.go b/kcpserver.go index 7802525..bba3195 100644 --- a/kcpserver.go +++ b/kcpserver.go @@ -2,14 +2,26 @@ package main import ( "fmt" + "crypto/sha1" "github.com/xtaci/kcp-go" + "golang.org/x/crypto/pbkdf2" + "time" ) const port = ":9999" +var ( + // VERSION is injected by buildflags + VERSION = "SELFBUILD" + // SALT is use for pbkdf2 key expansion + SALT = "kcp-go" +) func ListenTest() (*kcp.Listener, error) { - return kcp.ListenWithOptions(port, nil, 2, 2) + var block kcp.BlockCrypt + pass := pbkdf2.Key([]byte("testkey"), []byte(SALT), 4096, 32, sha1.New) + block, _ = kcp.NewNoneBlockCrypt(pass) + return kcp.ListenWithOptions(port, block, 2, 2) } func server() { @@ -40,11 +52,14 @@ func handle_client(conn *kcp.UDPSession) { panic(err) } count++ - fmt.Println("received:", string(buf[:n])) + + //fmt.Println("received :" ,time.Now().Format("2006-01-02 15:04:05"),n) + //fmt.Println("received:", string(buf[:n])) conn.Write(buf[:n]) } } func main() { + fmt.Println("start :" ,time.Now().Format("2006-01-02 15:04:05")) server() } From c93809208d2d8b10169fe558a9afd164e272927d Mon Sep 17 00:00:00 2001 From: yarshure Date: Fri, 26 May 2017 18:36:55 +0800 Subject: [PATCH 30/56] disable debug --- kcpserver.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/kcpserver.go b/kcpserver.go index bba3195..04b7906 100644 --- a/kcpserver.go +++ b/kcpserver.go @@ -19,8 +19,9 @@ var ( func ListenTest() (*kcp.Listener, error) { var block kcp.BlockCrypt - pass := pbkdf2.Key([]byte("testkey"), []byte(SALT), 4096, 32, sha1.New) - block, _ = kcp.NewNoneBlockCrypt(pass) + pass := pbkdf2.Key([]byte("1234567890123456789012345678901234567890"), []byte(SALT), 4096, 32, sha1.New) + fmt.Println(pass) + block, _ = kcp.NewAESBlockCrypt([]byte("1234567890123456789012345678901234567890")) return kcp.ListenWithOptions(port, block, 2, 2) } @@ -54,7 +55,7 @@ func handle_client(conn *kcp.UDPSession) { count++ //fmt.Println("received :" ,time.Now().Format("2006-01-02 15:04:05"),n) - //fmt.Println("received:", string(buf[:n])) + fmt.Println("received:", string(buf[:n])) conn.Write(buf[:n]) } } From 14c20c8d333680b2e79546f4f3b826b47a41681f Mon Sep 17 00:00:00 2001 From: yarshure Date: Sat, 27 May 2017 15:06:55 +0800 Subject: [PATCH 31/56] update recv --- iOSLib/libkcp/kcptest/ViewController.mm | 19 +++++++++++-------- iOSLib/libkcp/libkcp/SFKcpTun.mm | 2 +- kcpserver.go | 4 ++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/iOSLib/libkcp/kcptest/ViewController.mm b/iOSLib/libkcp/kcptest/ViewController.mm index 4885c91..df03011 100644 --- a/iOSLib/libkcp/kcptest/ViewController.mm +++ b/iOSLib/libkcp/kcptest/ViewController.mm @@ -64,8 +64,8 @@ - (IBAction)go:(id)sender { c.dataShards = 2; c.parityShards = 2; c.iptos = 46; - - //c.key = [@"1234567890123456789012345678901234567890" dataUsingEncoding:NSUTF8StringEncoding]; + c.crypt = @"aes"; + c.key = [@"1234567890123456789012345678901234567890" dataUsingEncoding:NSUTF8StringEncoding]; self.tun = [[SFKcpTun alloc] initWithConfig:c ipaddr:self.addr.text port:port queue:self.dispatchqueue]; self.tun.delegate = self; } @@ -76,17 +76,20 @@ - (IBAction)send:(id)sender { if ( self.tun == nil ){ return; } - self.t = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(sendtest) userInfo:nil repeats:true]; + [self sendtest]; + //self.t = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(sendtest) userInfo:nil repeats:true]; } - (IBAction)stop:(id)sender { [self.t invalidate]; } -(void)sendtest { - for (int i = 0; i < 1000; i++) { - char *ptr = (char *)BlockCrypt::ramdonBytes(40960); - NSData *d = [NSData dataWithBytes:(void*)ptr length:40960]; - free(ptr); + for (int i = 0; i < 2; i++) { + NSString *msg = [NSString stringWithFormat:@"message %d",i]; + NSData *d = [msg dataUsingEncoding:NSUTF8StringEncoding]; + //char *ptr = (char *)BlockCrypt::ramdonBytes(40960); + //NSData *d = [NSData dataWithBytes:(void*)ptr length:40960]; + //free(ptr); [self.tun input:d]; } } @@ -98,7 +101,7 @@ -(IBAction)shutdown:(id)sender } } -(void)didRecevied:(NSData*)data{ - NSLog(@"recv: %lu",(unsigned long)data.length); + NSLog(@"recv: %@",data); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 5887f8f..384e76b 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -171,7 +171,7 @@ -(void)runTest //NSLog(@"##### kcp recv null\n"); } free(buf); - if (n != 1298){ + if (n == 0 ){ usleep(33000); } diff --git a/kcpserver.go b/kcpserver.go index 04b7906..782fdf7 100644 --- a/kcpserver.go +++ b/kcpserver.go @@ -19,8 +19,8 @@ var ( func ListenTest() (*kcp.Listener, error) { var block kcp.BlockCrypt - pass := pbkdf2.Key([]byte("1234567890123456789012345678901234567890"), []byte(SALT), 4096, 32, sha1.New) - fmt.Println(pass) + pass := pbkdf2.Key([]byte("it's a secrect"), []byte(SALT), 4096, 32, sha1.New) + fmt.Println("key",pass) block, _ = kcp.NewAESBlockCrypt([]byte("1234567890123456789012345678901234567890")) return kcp.ListenWithOptions(port, block, 2, 2) } From 3c27be5b8d153e842c6ef7c7c18c0e4366ffd395 Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Sat, 27 May 2017 23:02:56 +0800 Subject: [PATCH 32/56] turn speed and memory use, because kcp too fast --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 40 +++++++++++++++++++------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 384e76b..34561c4 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -112,28 +112,33 @@ -(void)input:(NSData*)data{ assert(sess != nullptr); - + __weak SFKcpTun *weakSelf = self; dispatch_async(socketqueue, ^{ + SFKcpTun* strongSelf = weakSelf; + size_t tosend = data.length; size_t sended = 0 ; char *ptr = (char *)data.bytes; - while (sended < tosend) { - - - size_t sendt = sess->Write(ptr, data.length - sended); - sended += sendt ; - ptr += sended; - //NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); - //不能并行接收网络数据,效率有折扣 - //sess->Update(iclock()); - } - if (sended == [data length]) { - NSLog(@"KCPTun sent %zu",sended); - }else { - exit(-1); + if (strongSelf.connected) { + while (sended < tosend) { + + + size_t sendt = sess->Write(ptr, data.length - sended); + sended += sendt ; + ptr += sended; + //NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); + //不能并行接收网络数据,效率有折扣 + //sess->Update(iclock()); + } + if (sended == [data length]) { + NSLog(@"KCPTun sent %zu",sended); + }else { + exit(-1); + } } + }); @@ -171,7 +176,10 @@ -(void)runTest //NSLog(@"##### kcp recv null\n"); } free(buf); - if (n == 0 ){ + if (n > 0 ){ + //usleep(33000); + usleep(5500); + }else { usleep(33000); } From f78ce88ceacf0f5cfe06e2a486b81661cb3aac0b Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Sun, 28 May 2017 00:31:20 +0800 Subject: [PATCH 33/56] policy sleep --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 34561c4..2d9361b 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -148,10 +148,14 @@ -(void)input:(NSData*)data{ -(void)runTest { __weak SFKcpTun *weakSelf = self; dispatch_async(self->queue, ^{ + size_t total = 0; + NSDate *start = [NSDate date]; SFKcpTun* strongSelf = weakSelf; while (strongSelf.connected) { - + if (total == 0) { + start = [NSDate date]; + } if (strongSelf) { if (sess != nil) { @@ -169,19 +173,27 @@ -(void)runTest dispatch_async(strongSelf.dispatchqueue, ^{ [strongSelf.delegate didRecevied:d]; }); + + total += n ; + NSDate *now = [NSDate date]; + + //size_t speed = (NSTimeInterval)total/inter; + if(( [now timeIntervalSinceDate:start]> 3.0 )&&( total > 1024*1000*10)) { + total = 0; + usleep(1100); + }else { + usleep(800); + } + } }else { - //NSLog(@"##### kcp recv null\n"); + usleep(33000); } free(buf); - if (n > 0 ){ - //usleep(33000); - usleep(5500); - }else { - usleep(33000); - } + + } } From 3987353039883a78c7d3f9bc53932d02222d96e5 Mon Sep 17 00:00:00 2001 From: yarshure Date: Thu, 1 Jun 2017 08:49:39 +0800 Subject: [PATCH 34/56] update policy --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 2d9361b..c54f59e 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -178,18 +178,21 @@ -(void)runTest NSDate *now = [NSDate date]; //size_t speed = (NSTimeInterval)total/inter; - if(( [now timeIntervalSinceDate:start]> 3.0 )&&( total > 1024*1000*10)) { - total = 0; - usleep(1100); - }else { - usleep(800); - } +// if(( [now timeIntervalSinceDate:start]> 3.0 )&&( total > 1024*1000*10)) { +// total = 0; +// usleep(3300); +// }else { +// if ( [now timeIntervalSinceDate:start]> 3.0 ){ +// total = 0 ; +// } +// usleep(800); +// } } }else { - usleep(33000); + usleep(11000); } free(buf); From b7590875cfe14de9ddc1f225ee234614e9bf11c7 Mon Sep 17 00:00:00 2001 From: yarshure Date: Thu, 1 Jun 2017 16:59:28 +0800 Subject: [PATCH 35/56] add local ip --- iOSLib/libkcp/libkcp/SFKcpTun.h | 1 + iOSLib/libkcp/libkcp/SFKcpTun.mm | 9 +++++++++ sess.cpp | 23 ++++++++++++++++++++++- sess.h | 1 + 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.h b/iOSLib/libkcp/libkcp/SFKcpTun.h index 69fe2da..4957aa6 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.h +++ b/iOSLib/libkcp/libkcp/SFKcpTun.h @@ -30,4 +30,5 @@ -(void)shutdownUDPSession; -(void)input:(NSData*)data; -(void)upDate; +-(NSString*)localAddress; @end diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index c54f59e..c74ea40 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -256,4 +256,13 @@ -(void)testPorformce }); } +-(NSString*)localAddress{ + if (sess != nil) { + char *addr = sess->getLocalIPAddr(); + NSString *addrs = [NSString stringWithUTF8String:addr]; + return addrs; + }else { + return @""; + } +} @end diff --git a/sess.cpp b/sess.cpp index 36058b4..1600df6 100644 --- a/sess.cpp +++ b/sess.cpp @@ -60,6 +60,10 @@ UDPSession::Dial(const char *ip, uint16_t port) { } int sockfd = socket(PF_INET, SOCK_DGRAM, 0); + + + + if (sockfd == -1) { return nullptr; } @@ -68,6 +72,14 @@ UDPSession::Dial(const char *ip, uint16_t port) { return nullptr; } + struct sockaddr_in localAddress; + //socklen_t addressLength; + socklen_t addressLength = sizeof(localAddress); + getsockname(sockfd, (struct sockaddr*)&localAddress, \ + &addressLength); + printf("local address: %s\n", inet_ntoa( localAddress.sin_addr)); + printf("local port: %d\n", (int) ntohs(localAddress.sin_port)); + return UDPSession::createSession(sockfd); } @@ -290,7 +302,16 @@ UDPSession::SetDSCP(int iptos) noexcept { iptos = (iptos << 2) & 0xFF; return setsockopt(this->m_sockfd, IPPROTO_IP, IP_TOS, &iptos, sizeof(iptos)); } - +char * UDPSession::getLocalIPAddr() noexcept{ + struct sockaddr_in localAddress; + //socklen_t addressLength; + socklen_t addressLength = sizeof(localAddress); + getsockname(this->m_sockfd, (struct sockaddr*)&localAddress, \ + &addressLength); + printf("local address: %s\n", inet_ntoa( localAddress.sin_addr)); + printf("local port: %d\n", (int) ntohs(localAddress.sin_port)); + return inet_ntoa( localAddress.sin_addr); +} void UDPSession::SetStreamMode(bool enable) noexcept { if (enable) { diff --git a/sess.h b/sess.h index 02b7290..9ec9e6f 100644 --- a/sess.h +++ b/sess.h @@ -53,6 +53,7 @@ class UDPSession { // Set DSCP value int SetDSCP(int dscp) noexcept; + char *getLocalIPAddr() noexcept; // SetStreamMode toggles the stream mode on/off void SetStreamMode(bool enable) noexcept; From fb6b5e3d66a746ca19ae7eddfa5ce9ced84652b9 Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Fri, 2 Jun 2017 16:59:22 +0800 Subject: [PATCH 36/56] short 3300 --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 2d9361b..8a8b709 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -178,18 +178,18 @@ -(void)runTest NSDate *now = [NSDate date]; //size_t speed = (NSTimeInterval)total/inter; - if(( [now timeIntervalSinceDate:start]> 3.0 )&&( total > 1024*1000*10)) { - total = 0; - usleep(1100); - }else { - usleep(800); - } +// if(( [now timeIntervalSinceDate:start]> 3.0 )&&( total > 1024*1000*10)) { +// total = 0; +// usleep(1100); +// }else { +// usleep(800); +// } } }else { - usleep(33000); + usleep(3300); } free(buf); From 22317bec597282ab96ca0f33c124b658e740c591 Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Fri, 2 Jun 2017 18:32:57 +0800 Subject: [PATCH 37/56] cell data test --- iOSLib/libkcp/libkcp/SFKcpTun.h | 1 + iOSLib/libkcp/libkcp/SFKcpTun.mm | 61 ++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.h b/iOSLib/libkcp/libkcp/SFKcpTun.h index 4957aa6..9547c3e 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.h +++ b/iOSLib/libkcp/libkcp/SFKcpTun.h @@ -31,4 +31,5 @@ -(void)input:(NSData*)data; -(void)upDate; -(NSString*)localAddress; +-(BOOL)useCell; @end diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 263bbd4..72a3ffb 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -11,6 +11,12 @@ #include #include "sess.h" #import "SFKcpTun.h" + +#include + +#include + +#include UDPSession *sess; void @@ -271,4 +277,59 @@ -(NSString*)localAddress{ return @""; } } +-(BOOL)useCell +{ + NSString *ipaddr = [self localAddress]; + NSDictionary *infos = [self address]; + for (NSString *key in infos.allKeys) { + if ([ipaddr isEqualToString:infos[key]]) { + if ([key isEqualToString:@"en0"]) { + return false; + } + } + } + return true; +} +-(NSDictionary *)address +{ + // On iPhone, 3G is "pdp_ipX", where X is usually 0, but may possibly be 0-3 (i'm guessing...) + + NSData *result = nil; + + struct ifaddrs *addrs; + const struct ifaddrs *cursor; + NSMutableDictionary *info = [NSMutableDictionary dictionary]; + if ((getifaddrs(&addrs) == 0)) + { + cursor = addrs; + while (cursor != NULL) + { + NSLog(@"cursor->ifa_name = %s", cursor->ifa_name); + + // if (strncmp(cursor->ifa_name, "pdp_ip", 6) == 0) + // { + // + // } + if (cursor->ifa_addr->sa_family == AF_INET) + { + struct sockaddr_in *addr = (struct sockaddr_in *)cursor->ifa_addr; + NSLog(@"cursor->ifa_addr = %s", inet_ntoa(addr->sin_addr)); + + result = [NSData dataWithBytes:addr length:sizeof(struct sockaddr_in)]; + + NSString *ifname = [NSString stringWithUTF8String:cursor->ifa_name]; + [info setObject:[NSString stringWithUTF8String:inet_ntoa(addr->sin_addr)] forKey:ifname]; + cursor = cursor->ifa_next; + } + else + { + cursor = cursor->ifa_next; + } + + } + freeifaddrs(addrs); + } + + return info; +} @end From a87206d68f058c401a44f39769730538b66bff28 Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Fri, 2 Jun 2017 22:27:34 +0800 Subject: [PATCH 38/56] add OSX target --- fec.cpp | 4 +- fec.h | 2 +- iOSLib/libkcp/kcpOSX/Info.plist | 26 +++ iOSLib/libkcp/kcpOSX/kcpOSX.h | 19 ++ .../libkcp/libkcp.xcodeproj/project.pbxproj | 180 ++++++++++++++++++ sess.cpp | 4 +- 6 files changed, 230 insertions(+), 5 deletions(-) create mode 100644 iOSLib/libkcp/kcpOSX/Info.plist create mode 100644 iOSLib/libkcp/kcpOSX/kcpOSX.h diff --git a/fec.cpp b/fec.cpp index 47c3577..231d9b2 100644 --- a/fec.cpp +++ b/fec.cpp @@ -47,7 +47,7 @@ FEC::Decode(byte *data, size_t sz) { void FEC::MarkData(byte *data, uint16_t sz) { data = encode32u(data,this->next); - data = encode16u(data,typeData); + data = encode16u(data,kcptypeData); encode16u(data,static_cast(sz + 2)); // including size itself this->next++; } @@ -125,7 +125,7 @@ FEC::Input(fecPacket &pkt) { shardVec[seqid%totalShards] = rx[i].data; shardflag[seqid%totalShards] = true; numshard++; - if (rx[i].flag == typeData) { + if (rx[i].flag == kcptypeData) { numDataShard++; } if (numshard == 1) { diff --git a/fec.h b/fec.h index d7c3a98..f9a722f 100644 --- a/fec.h +++ b/fec.h @@ -14,7 +14,7 @@ const size_t fecHeaderSize = 6; //const size_t cryptHeaderSize = 20;//nonce 16 crc 4 const size_t fecHeaderSizePlus2{fecHeaderSize + 2}; -const uint16_t typeData = 0xf1; +const uint16_t kcptypeData = 0xf1; const uint16_t typeFEC = 0xf2; const int fecExpire = 30000; diff --git a/iOSLib/libkcp/kcpOSX/Info.plist b/iOSLib/libkcp/kcpOSX/Info.plist new file mode 100644 index 0000000..7f86576 --- /dev/null +++ b/iOSLib/libkcp/kcpOSX/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSHumanReadableCopyright + Copyright © 2017 Kong XiangBo. All rights reserved. + NSPrincipalClass + + + diff --git a/iOSLib/libkcp/kcpOSX/kcpOSX.h b/iOSLib/libkcp/kcpOSX/kcpOSX.h new file mode 100644 index 0000000..c0b394f --- /dev/null +++ b/iOSLib/libkcp/kcpOSX/kcpOSX.h @@ -0,0 +1,19 @@ +// +// kcpOSX.h +// kcpOSX +// +// Created by 孔祥波 on 02/06/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#import + +//! Project version number for kcpOSX. +FOUNDATION_EXPORT double kcpOSXVersionNumber; + +//! Project version string for kcpOSX. +FOUNDATION_EXPORT const unsigned char kcpOSXVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 4c90160..fa38f23 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -40,6 +40,35 @@ 6959B7471EBB7DEC00B0BC58 /* CRC32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6959B7451EBB7DEC00B0BC58 /* CRC32.cpp */; }; 6959B7481EBB7DEC00B0BC58 /* CRC32.h in Headers */ = {isa = PBXBuildFile; fileRef = 6959B7461EBB7DEC00B0BC58 /* CRC32.h */; }; 6959B74A1EBB8B0C00B0BC58 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6959B7491EBB8B0C00B0BC58 /* Security.framework */; }; + 69639BD91EE1AAC100893D18 /* kcpOSX.h in Headers */ = {isa = PBXBuildFile; fileRef = 69639BD71EE1AAC100893D18 /* kcpOSX.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69639BDD1EE1AAD700893D18 /* SFKcpTun.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC69E1EB30985008A030D /* SFKcpTun.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69639BDE1EE1AAE000893D18 /* SFKcpTun.mm in Sources */ = {isa = PBXBuildFile; fileRef = 69FFC69F1EB30985008A030D /* SFKcpTun.mm */; }; + 69639BDF1EE1AAE400893D18 /* TunConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC6A31EB309E8008A030D /* TunConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69639BE01EE1AAEC00893D18 /* TunConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 69FFC6A41EB309E8008A030D /* TunConfig.m */; }; + 69639BE11EE1AAF500893D18 /* encoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE34E1EB2EF25006A4B9D /* encoding.h */; }; + 69639BE21EE1AAF900893D18 /* galois_noasm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3431EB2EF1C006A4B9D /* galois_noasm.cpp */; }; + 69639BE31EE1AAFD00893D18 /* galois_noasm.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3441EB2EF1C006A4B9D /* galois_noasm.h */; }; + 69639BE41EE1AB0100893D18 /* galois_table.c in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3451EB2EF1C006A4B9D /* galois_table.c */; }; + 69639BE51EE1AB0900893D18 /* galois.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3461EB2EF1C006A4B9D /* galois.cpp */; }; + 69639BE61EE1AB0D00893D18 /* galois.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3471EB2EF1C006A4B9D /* galois.h */; }; + 69639BE71EE1AB1300893D18 /* inversion_tree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE33C1EB2EF0B006A4B9D /* inversion_tree.cpp */; }; + 69639BE81EE1AB1700893D18 /* inversion_tree.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE33D1EB2EF0B006A4B9D /* inversion_tree.h */; }; + 69639BE91EE1AB1B00893D18 /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3381EB2EEF9006A4B9D /* matrix.cpp */; }; + 69639BEA1EE1AB1E00893D18 /* matrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3391EB2EEF9006A4B9D /* matrix.h */; }; + 69639BEB1EE1AB2200893D18 /* reedsolomon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3341EB2EEEF006A4B9D /* reedsolomon.cpp */; }; + 69639BEC1EE1AB2800893D18 /* reedsolomon.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3351EB2EEEF006A4B9D /* reedsolomon.h */; }; + 69639BED1EE1AB2D00893D18 /* sess.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3321EB2EEE6006A4B9D /* sess.h */; }; + 69639BEE1EE1AB3100893D18 /* sess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3301EB2EEBD006A4B9D /* sess.cpp */; }; + 69639BEF1EE1AB3500893D18 /* ikcp.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3401EB2EF11006A4B9D /* ikcp.h */; }; + 69639BF01EE1AB3900893D18 /* ikcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 692AE32E1EB2EEB0006A4B9D /* ikcp.c */; }; + 69639BF11EE1AB3D00893D18 /* kcp.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3241EB2EE59006A4B9D /* kcp.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69639BF21EE1AB4C00893D18 /* fec.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3421EB2EF1C006A4B9D /* fec.h */; }; + 69639BF31EE1AB5000893D18 /* fec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE32C1EB2EE98006A4B9D /* fec.cpp */; }; + 69639BF41EE1AB5500893D18 /* BlockCrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 695165F31EBB2663008DCF66 /* BlockCrypt.cpp */; }; + 69639BF51EE1AB5900893D18 /* BlockCrypt.h in Headers */ = {isa = PBXBuildFile; fileRef = 695165F41EBB2663008DCF66 /* BlockCrypt.h */; }; + 69639BF61EE1AB5D00893D18 /* CRC32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6959B7451EBB7DEC00B0BC58 /* CRC32.cpp */; }; + 69639BF71EE1AB6100893D18 /* CRC32.h in Headers */ = {isa = PBXBuildFile; fileRef = 6959B7461EBB7DEC00B0BC58 /* CRC32.h */; }; + 69639BF91EE1ABA200893D18 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69639BF81EE1ABA200893D18 /* Security.framework */; }; 69C757811EB2F96D00139321 /* kcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; }; 69C757821EB2F96D00139321 /* kcp.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 69FFC6A01EB30985008A030D /* SFKcpTun.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC69E1EB30985008A030D /* SFKcpTun.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -113,6 +142,10 @@ 6959B7451EBB7DEC00B0BC58 /* CRC32.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CRC32.cpp; sourceTree = ""; }; 6959B7461EBB7DEC00B0BC58 /* CRC32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRC32.h; sourceTree = ""; }; 6959B7491EBB8B0C00B0BC58 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; + 69639BD51EE1AAC100893D18 /* kcp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = kcp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 69639BD71EE1AAC100893D18 /* kcpOSX.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = kcpOSX.h; sourceTree = ""; }; + 69639BD81EE1AAC100893D18 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 69639BF81EE1ABA200893D18 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; 69FFC69E1EB30985008A030D /* SFKcpTun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFKcpTun.h; path = libkcp/SFKcpTun.h; sourceTree = SOURCE_ROOT; }; 69FFC69F1EB30985008A030D /* SFKcpTun.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SFKcpTun.mm; path = libkcp/SFKcpTun.mm; sourceTree = SOURCE_ROOT; }; 69FFC6A31EB309E8008A030D /* TunConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TunConfig.h; path = libkcp/TunConfig.h; sourceTree = ""; }; @@ -138,6 +171,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 69639BD11EE1AAC100893D18 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 69639BF91EE1ABA200893D18 /* Security.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -147,6 +188,7 @@ 69FFC6A21EB3098C008A030D /* tun */, 692AE3231EB2EE59006A4B9D /* libkcp */, 692AE3551EB2EF83006A4B9D /* kcptest */, + 69639BD61EE1AAC100893D18 /* kcpOSX */, 692AE3221EB2EE59006A4B9D /* Products */, 692AE36F1EB2F191006A4B9D /* Frameworks */, ); @@ -157,6 +199,7 @@ children = ( 692AE3211EB2EE59006A4B9D /* kcp.framework */, 692AE3541EB2EF83006A4B9D /* kcptest.app */, + 69639BD51EE1AAC100893D18 /* kcp.framework */, ); name = Products; sourceTree = ""; @@ -222,12 +265,22 @@ 692AE36F1EB2F191006A4B9D /* Frameworks */ = { isa = PBXGroup; children = ( + 69639BF81EE1ABA200893D18 /* Security.framework */, 6959B7491EBB8B0C00B0BC58 /* Security.framework */, 692AE3701EB2F191006A4B9D /* libc++.tbd */, ); name = Frameworks; sourceTree = ""; }; + 69639BD61EE1AAC100893D18 /* kcpOSX */ = { + isa = PBXGroup; + children = ( + 69639BD71EE1AAC100893D18 /* kcpOSX.h */, + 69639BD81EE1AAC100893D18 /* Info.plist */, + ); + path = kcpOSX; + sourceTree = ""; + }; 69FFC6A21EB3098C008A030D /* tun */ = { isa = PBXGroup; children = ( @@ -263,6 +316,28 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 69639BD21EE1AAC100893D18 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 69639BED1EE1AB2D00893D18 /* sess.h in Headers */, + 69639BEC1EE1AB2800893D18 /* reedsolomon.h in Headers */, + 69639BDD1EE1AAD700893D18 /* SFKcpTun.h in Headers */, + 69639BD91EE1AAC100893D18 /* kcpOSX.h in Headers */, + 69639BF21EE1AB4C00893D18 /* fec.h in Headers */, + 69639BDF1EE1AAE400893D18 /* TunConfig.h in Headers */, + 69639BEA1EE1AB1E00893D18 /* matrix.h in Headers */, + 69639BE11EE1AAF500893D18 /* encoding.h in Headers */, + 69639BE81EE1AB1700893D18 /* inversion_tree.h in Headers */, + 69639BE31EE1AAFD00893D18 /* galois_noasm.h in Headers */, + 69639BF11EE1AB3D00893D18 /* kcp.h in Headers */, + 69639BE61EE1AB0D00893D18 /* galois.h in Headers */, + 69639BF71EE1AB6100893D18 /* CRC32.h in Headers */, + 69639BEF1EE1AB3500893D18 /* ikcp.h in Headers */, + 69639BF51EE1AB5900893D18 /* BlockCrypt.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ @@ -303,6 +378,24 @@ productReference = 692AE3541EB2EF83006A4B9D /* kcptest.app */; productType = "com.apple.product-type.application"; }; + 69639BD41EE1AAC100893D18 /* kcpOSX */ = { + isa = PBXNativeTarget; + buildConfigurationList = 69639BDC1EE1AAC100893D18 /* Build configuration list for PBXNativeTarget "kcpOSX" */; + buildPhases = ( + 69639BD01EE1AAC100893D18 /* Sources */, + 69639BD11EE1AAC100893D18 /* Frameworks */, + 69639BD21EE1AAC100893D18 /* Headers */, + 69639BD31EE1AAC100893D18 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = kcpOSX; + productName = kcpOSX; + productReference = 69639BD51EE1AAC100893D18 /* kcp.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -323,6 +416,11 @@ DevelopmentTeam = 745WQDK4L7; ProvisioningStyle = Automatic; }; + 69639BD41EE1AAC100893D18 = { + CreatedOnToolsVersion = 8.3.2; + DevelopmentTeam = 745WQDK4L7; + ProvisioningStyle = Automatic; + }; }; }; buildConfigurationList = 692AE31B1EB2EE59006A4B9D /* Build configuration list for PBXProject "libkcp" */; @@ -340,6 +438,7 @@ targets = ( 692AE3201EB2EE59006A4B9D /* kcp */, 692AE3531EB2EF83006A4B9D /* kcptest */, + 69639BD41EE1AAC100893D18 /* kcpOSX */, ); }; /* End PBXProject section */ @@ -362,6 +461,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 69639BD31EE1AAC100893D18 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -396,6 +502,26 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 69639BD01EE1AAC100893D18 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 69639BF41EE1AB5500893D18 /* BlockCrypt.cpp in Sources */, + 69639BF01EE1AB3900893D18 /* ikcp.c in Sources */, + 69639BDE1EE1AAE000893D18 /* SFKcpTun.mm in Sources */, + 69639BE71EE1AB1300893D18 /* inversion_tree.cpp in Sources */, + 69639BEE1EE1AB3100893D18 /* sess.cpp in Sources */, + 69639BE41EE1AB0100893D18 /* galois_table.c in Sources */, + 69639BE91EE1AB1B00893D18 /* matrix.cpp in Sources */, + 69639BE21EE1AAF900893D18 /* galois_noasm.cpp in Sources */, + 69639BE51EE1AB0900893D18 /* galois.cpp in Sources */, + 69639BF31EE1AB5000893D18 /* fec.cpp in Sources */, + 69639BF61EE1AB5D00893D18 /* CRC32.cpp in Sources */, + 69639BE01EE1AAEC00893D18 /* TunConfig.m in Sources */, + 69639BEB1EE1AB2200893D18 /* reedsolomon.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -593,6 +719,52 @@ }; name = Release; }; + 69639BDA1EE1AAC100893D18 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 745WQDK4L7; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = kcpOSX/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; + PRODUCT_MODULE_NAME = kcp; + PRODUCT_NAME = kcp; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 69639BDB1EE1AAC100893D18 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 745WQDK4L7; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = kcpOSX/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcp; + PRODUCT_MODULE_NAME = kcp; + PRODUCT_NAME = kcp; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -623,6 +795,14 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 69639BDC1EE1AAC100893D18 /* Build configuration list for PBXNativeTarget "kcpOSX" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 69639BDA1EE1AAC100893D18 /* Debug */, + 69639BDB1EE1AAC100893D18 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; /* End XCConfigurationList section */ }; rootObject = 692AE3181EB2EE59006A4B9D /* Project object */; diff --git a/sess.cpp b/sess.cpp index 1600df6..8a5e643 100644 --- a/sess.cpp +++ b/sess.cpp @@ -213,7 +213,7 @@ UDPSession::KcpInPut(size_t len) noexcept { if (fec.isEnabled()) { // decode FEC packet auto pkt = fec.Decode(m_buf, static_cast(len)); - if (pkt.flag == typeData) { + if (pkt.flag == kcptypeData) { auto ptr = pkt.data->data(); // we have 2B size, ignore for typeData dump((char*)"ikcp input data:", (byte *) (ptr + 2), pkt.data->size() - 2); @@ -221,7 +221,7 @@ UDPSession::KcpInPut(size_t len) noexcept { } // allow FEC packet processing with correct flags. - if (pkt.flag == typeData || pkt.flag == typeFEC) { + if (pkt.flag == kcptypeData || pkt.flag == typeFEC) { // input to FEC, and see if we can recover data. auto recovered = fec.Input(pkt); From 273bbb749a536feccf7d1e3bf949c2260f279222 Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Fri, 2 Jun 2017 22:28:28 +0800 Subject: [PATCH 39/56] add xcscheme file --- .../xcshareddata/xcschemes/kcpOSX.xcscheme | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme diff --git a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme new file mode 100644 index 0000000..1451343 --- /dev/null +++ b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From cc9e950a5ec413fed9bbef11ca72010300e1749f Mon Sep 17 00:00:00 2001 From: Kong XiangBo Date: Fri, 2 Jun 2017 23:15:38 +0800 Subject: [PATCH 40/56] update macOS target --- iOSLib/libkcp/kcpOSX/{kcpOSX.h => kcp.h} | 2 ++ iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj | 11 +++++------ .../xcshareddata/xcschemes/kcpOSX.xcscheme | 6 +++--- 3 files changed, 10 insertions(+), 9 deletions(-) rename iOSLib/libkcp/kcpOSX/{kcpOSX.h => kcp.h} (90%) diff --git a/iOSLib/libkcp/kcpOSX/kcpOSX.h b/iOSLib/libkcp/kcpOSX/kcp.h similarity index 90% rename from iOSLib/libkcp/kcpOSX/kcpOSX.h rename to iOSLib/libkcp/kcpOSX/kcp.h index c0b394f..a3d9065 100644 --- a/iOSLib/libkcp/kcpOSX/kcpOSX.h +++ b/iOSLib/libkcp/kcpOSX/kcp.h @@ -17,3 +17,5 @@ FOUNDATION_EXPORT const unsigned char kcpOSXVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import +#import +#import diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index fa38f23..7623182 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -40,7 +40,7 @@ 6959B7471EBB7DEC00B0BC58 /* CRC32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6959B7451EBB7DEC00B0BC58 /* CRC32.cpp */; }; 6959B7481EBB7DEC00B0BC58 /* CRC32.h in Headers */ = {isa = PBXBuildFile; fileRef = 6959B7461EBB7DEC00B0BC58 /* CRC32.h */; }; 6959B74A1EBB8B0C00B0BC58 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6959B7491EBB8B0C00B0BC58 /* Security.framework */; }; - 69639BD91EE1AAC100893D18 /* kcpOSX.h in Headers */ = {isa = PBXBuildFile; fileRef = 69639BD71EE1AAC100893D18 /* kcpOSX.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69639BD91EE1AAC100893D18 /* kcp.h in Headers */ = {isa = PBXBuildFile; fileRef = 69639BD71EE1AAC100893D18 /* kcp.h */; settings = {ATTRIBUTES = (Public, ); }; }; 69639BDD1EE1AAD700893D18 /* SFKcpTun.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC69E1EB30985008A030D /* SFKcpTun.h */; settings = {ATTRIBUTES = (Public, ); }; }; 69639BDE1EE1AAE000893D18 /* SFKcpTun.mm in Sources */ = {isa = PBXBuildFile; fileRef = 69FFC69F1EB30985008A030D /* SFKcpTun.mm */; }; 69639BDF1EE1AAE400893D18 /* TunConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC6A31EB309E8008A030D /* TunConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -61,7 +61,6 @@ 69639BEE1EE1AB3100893D18 /* sess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE3301EB2EEBD006A4B9D /* sess.cpp */; }; 69639BEF1EE1AB3500893D18 /* ikcp.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3401EB2EF11006A4B9D /* ikcp.h */; }; 69639BF01EE1AB3900893D18 /* ikcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 692AE32E1EB2EEB0006A4B9D /* ikcp.c */; }; - 69639BF11EE1AB3D00893D18 /* kcp.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3241EB2EE59006A4B9D /* kcp.h */; settings = {ATTRIBUTES = (Public, ); }; }; 69639BF21EE1AB4C00893D18 /* fec.h in Headers */ = {isa = PBXBuildFile; fileRef = 692AE3421EB2EF1C006A4B9D /* fec.h */; }; 69639BF31EE1AB5000893D18 /* fec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 692AE32C1EB2EE98006A4B9D /* fec.cpp */; }; 69639BF41EE1AB5500893D18 /* BlockCrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 695165F31EBB2663008DCF66 /* BlockCrypt.cpp */; }; @@ -143,7 +142,7 @@ 6959B7461EBB7DEC00B0BC58 /* CRC32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRC32.h; sourceTree = ""; }; 6959B7491EBB8B0C00B0BC58 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 69639BD51EE1AAC100893D18 /* kcp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = kcp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 69639BD71EE1AAC100893D18 /* kcpOSX.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = kcpOSX.h; sourceTree = ""; }; + 69639BD71EE1AAC100893D18 /* kcp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = kcp.h; sourceTree = ""; }; 69639BD81EE1AAC100893D18 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 69639BF81EE1ABA200893D18 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; 69FFC69E1EB30985008A030D /* SFKcpTun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFKcpTun.h; path = libkcp/SFKcpTun.h; sourceTree = SOURCE_ROOT; }; @@ -275,7 +274,7 @@ 69639BD61EE1AAC100893D18 /* kcpOSX */ = { isa = PBXGroup; children = ( - 69639BD71EE1AAC100893D18 /* kcpOSX.h */, + 69639BD71EE1AAC100893D18 /* kcp.h */, 69639BD81EE1AAC100893D18 /* Info.plist */, ); path = kcpOSX; @@ -323,14 +322,13 @@ 69639BED1EE1AB2D00893D18 /* sess.h in Headers */, 69639BEC1EE1AB2800893D18 /* reedsolomon.h in Headers */, 69639BDD1EE1AAD700893D18 /* SFKcpTun.h in Headers */, - 69639BD91EE1AAC100893D18 /* kcpOSX.h in Headers */, + 69639BD91EE1AAC100893D18 /* kcp.h in Headers */, 69639BF21EE1AB4C00893D18 /* fec.h in Headers */, 69639BDF1EE1AAE400893D18 /* TunConfig.h in Headers */, 69639BEA1EE1AB1E00893D18 /* matrix.h in Headers */, 69639BE11EE1AAF500893D18 /* encoding.h in Headers */, 69639BE81EE1AB1700893D18 /* inversion_tree.h in Headers */, 69639BE31EE1AAFD00893D18 /* galois_noasm.h in Headers */, - 69639BF11EE1AB3D00893D18 /* kcp.h in Headers */, 69639BE61EE1AB0D00893D18 /* galois.h in Headers */, 69639BF71EE1AB6100893D18 /* CRC32.h in Headers */, 69639BEF1EE1AB3500893D18 /* ikcp.h in Headers */, @@ -802,6 +800,7 @@ 69639BDB1EE1AAC100893D18 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme index 1451343..a674be5 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme +++ b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme @@ -15,7 +15,7 @@ @@ -46,7 +46,7 @@ @@ -64,7 +64,7 @@ From 7d5ab06ce9914272c079a7b0b1db7809160de0ad Mon Sep 17 00:00:00 2001 From: abigt Date: Wed, 21 Jun 2017 14:41:45 +0800 Subject: [PATCH 41/56] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2f1cb10..6b306cf 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ FEC enhanced KCP client session library for iOS/Android, compatible with [kcp-go 1. Optimized for ***Online Games***. 1. Stream based interface, you can easily switch from your TCP based protocol to libkcp or dualstack. 1. [FEC(Forward Error Correction)](https://en.wikipedia.org/wiki/Forward_error_correction) Support with [Reed-Solomon Codes](https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction) -1. Add iOS Framework and Test target - +1. Add iOS/macOs Framework and Test target +1. MAS app https://itunes.apple.com/us/app/a-big-t/id1114040100?l=zh&ls=1&mt=12 support kcptun use this lib ## ***Usage*** libkcp has been designed as a ***Frame-Driven*** library, the main loop was supposed as: ``` From ddc6a9ce99ae821494eb9975f5a248cfc8b36dee Mon Sep 17 00:00:00 2001 From: abigt Date: Wed, 21 Jun 2017 14:44:13 +0800 Subject: [PATCH 42/56] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6b306cf..25808b8 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ $go run kcpserver.go compile and run libkcp(Best with CLion), and watch output. ## ***Caveats*** -1. Packet level encryption has not been implemented yet. +1. Packet level encryption use CommonCrypto, dose not pass test,need test and debug ## ***Troubleshooting*** 1. C++11 is required for compiling. From c0cfb12e3d576788ecae2c2be14e2517169e5628 Mon Sep 17 00:00:00 2001 From: yarshure Date: Thu, 3 Aug 2017 17:42:49 +0800 Subject: [PATCH 43/56] update crc32 ,copy from darwin kernel --- iOSLib/libkcp/kcptest/ViewController.h | 1 + iOSLib/libkcp/kcptest/ViewController.mm | 10 +++ .../libkcp/libkcp.xcodeproj/project.pbxproj | 14 ++++ iOSLib/libkcp/libkcp/BlockCrypt.h | 2 + iOSLib/libkcp/libkcp/CRC32.cpp | 75 +++++++++++++++++++ iOSLib/libkcp/libkcp/CRC32.h | 4 +- iOSLib/libkcp/libkcp/SFKcpTun.h | 2 +- iOSLib/libkcp/libkcp/SFKcpTun.mm | 4 +- sess.cpp | 18 +++-- 9 files changed, 121 insertions(+), 9 deletions(-) diff --git a/iOSLib/libkcp/kcptest/ViewController.h b/iOSLib/libkcp/kcptest/ViewController.h index a08162a..f539c99 100644 --- a/iOSLib/libkcp/kcptest/ViewController.h +++ b/iOSLib/libkcp/kcptest/ViewController.h @@ -8,6 +8,7 @@ #import #import "kcp.h" +#include "sodium.h" @interface ViewController : UIViewController diff --git a/iOSLib/libkcp/kcptest/ViewController.mm b/iOSLib/libkcp/kcptest/ViewController.mm index df03011..cca0f76 100644 --- a/iOSLib/libkcp/kcptest/ViewController.mm +++ b/iOSLib/libkcp/kcptest/ViewController.mm @@ -24,8 +24,18 @@ - (void)viewDidLoad { [super viewDidLoad]; self.dispatchqueue = dispatch_queue_create("test", NULL); [self testCrypto]; + [self testSodium]; // Do any additional setup after loading the view, typically from a nib. } +-(void)testCrypto2 +{ + +} +- (void)testSodium +{ + //sodium_init(); + //NSData *s = [@"0123456789ABCDEF0123456789ABCDEF" dataUsingEncoding:NSUTF8StringEncoding]; +} - (void)testCrypto{ NSData *s = [@"0123456789ABCDEF0123456789ABCDEF" dataUsingEncoding:NSUTF8StringEncoding]; NSLog(@"org %@",s); diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 7623182..36b3307 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -145,6 +145,7 @@ 69639BD71EE1AAC100893D18 /* kcp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = kcp.h; sourceTree = ""; }; 69639BD81EE1AAC100893D18 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 69639BF81EE1ABA200893D18 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 698D5CFB1F0A0E6B008C2335 /* Sodium.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sodium.framework; sourceTree = ""; }; 69FFC69E1EB30985008A030D /* SFKcpTun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFKcpTun.h; path = libkcp/SFKcpTun.h; sourceTree = SOURCE_ROOT; }; 69FFC69F1EB30985008A030D /* SFKcpTun.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SFKcpTun.mm; path = libkcp/SFKcpTun.mm; sourceTree = SOURCE_ROOT; }; 69FFC6A31EB309E8008A030D /* TunConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TunConfig.h; path = libkcp/TunConfig.h; sourceTree = ""; }; @@ -264,6 +265,7 @@ 692AE36F1EB2F191006A4B9D /* Frameworks */ = { isa = PBXGroup; children = ( + 698D5CFB1F0A0E6B008C2335 /* Sodium.framework */, 69639BF81EE1ABA200893D18 /* Security.framework */, 6959B7491EBB8B0C00B0BC58 /* Security.framework */, 692AE3701EB2F191006A4B9D /* libc++.tbd */, @@ -659,6 +661,10 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); INFOPLIST_FILE = libkcp/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 10.0; @@ -668,6 +674,7 @@ SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; + USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/include"; }; name = Debug; }; @@ -682,6 +689,10 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); INFOPLIST_FILE = libkcp/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 10.0; @@ -690,6 +701,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_VERSION = 3.0; + USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/include"; }; name = Release; }; @@ -702,6 +714,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcptest; PRODUCT_NAME = "$(TARGET_NAME)"; + USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/include"; }; name = Debug; }; @@ -714,6 +727,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.squash.kcptest; PRODUCT_NAME = "$(TARGET_NAME)"; + USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/include"; }; name = Release; }; diff --git a/iOSLib/libkcp/libkcp/BlockCrypt.h b/iOSLib/libkcp/libkcp/BlockCrypt.h index 2d86d05..c311fd1 100644 --- a/iOSLib/libkcp/libkcp/BlockCrypt.h +++ b/iOSLib/libkcp/libkcp/BlockCrypt.h @@ -11,6 +11,7 @@ #import #include +//#include "sodium.h" class BlockCrypt { private: CCCryptorRef send_ctx; @@ -27,4 +28,5 @@ class BlockCrypt { ~BlockCrypt() = default; static void Destroy(BlockCrypt *block); }; + #endif /* BlockCrypt_hpp */ diff --git a/iOSLib/libkcp/libkcp/CRC32.cpp b/iOSLib/libkcp/libkcp/CRC32.cpp index 45f74a6..4f984cd 100644 --- a/iOSLib/libkcp/libkcp/CRC32.cpp +++ b/iOSLib/libkcp/libkcp/CRC32.cpp @@ -34,3 +34,78 @@ int32_t crc32(uint8_t *bytes, size_t len) free(table); return crc; } +unsigned int cal_crc(unsigned char *ptr, unsigned char len) { + unsigned char i; + unsigned int crc=0; + while(len--!=0) { + for(i=0x80; i!=0; i/=2) { + if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;} /* 余式 CRC 乘以 2 再求 CRC */ + else crc*=2; + if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的 CRC */ + } + ptr++; + } + return(crc); +} +#include +//#include + +static uint32_t crc32_tab[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +uint32_t +crc32_kr(uint32_t crc, const uint8_t *buf, size_t size) +{ + const uint8_t *p; + + p = buf; + crc = crc ^ ~0U; + + while (size--) + crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); + + return crc ^ ~0U; +} diff --git a/iOSLib/libkcp/libkcp/CRC32.h b/iOSLib/libkcp/libkcp/CRC32.h index a0d545d..b07dcd3 100644 --- a/iOSLib/libkcp/libkcp/CRC32.h +++ b/iOSLib/libkcp/libkcp/CRC32.h @@ -13,5 +13,7 @@ #include int32_t crc32(uint8_t *bytes, size_t len); - +unsigned int cal_crc(unsigned char *ptr, unsigned char len); +uint32_t +crc32_kr(uint32_t crc, const uint8_t *buf, size_t size); #endif /* CRC32_h */ diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.h b/iOSLib/libkcp/libkcp/SFKcpTun.h index 9547c3e..5d638de 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.h +++ b/iOSLib/libkcp/libkcp/SFKcpTun.h @@ -29,7 +29,7 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port; -(void)shutdownUDPSession; -(void)input:(NSData*)data; --(void)upDate; +//-(void)upDate; -(NSString*)localAddress; -(BOOL)useCell; @end diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 72a3ffb..1652492 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -200,10 +200,10 @@ -(void)runTest } - + usleep(2200); }else { - usleep(3300); + usleep(33000); } free(buf); diff --git a/sess.cpp b/sess.cpp index 8a5e643..cd0e312 100644 --- a/sess.cpp +++ b/sess.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include "CRC32.h" // 16-bytes magic number for each packet @@ -157,7 +158,10 @@ void UDPSession::Update(uint32_t current) noexcept { for (;;) { ssize_t n = recv(m_sockfd, m_buf, sizeof(m_buf), 0); - + if (n < 0) { + perror("fopen( \"nulltest.txt\", \"r\" )"); + debug_print("kcp udp socket read error"); + } if (n > 0) { dump((char*)"UDP Update", m_buf, n); //change by abigt @@ -175,7 +179,7 @@ UDPSession::Update(uint32_t current) noexcept { memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); out += crcSize; - int32_t checksum = crc32((uint8_t *)out, n-cryptHeaderSize); + int32_t checksum = crc32_kr(0,(uint8_t *)out, n-cryptHeaderSize); if (checksum == sum){ dataValid = true; @@ -184,7 +188,7 @@ UDPSession::Update(uint32_t current) noexcept { memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); out += crcSize; - int32_t checksum = crc32((uint8_t *)out, n - cryptHeaderSize); + int32_t checksum = crc32_kr(0,(uint8_t *)out, n - cryptHeaderSize); if (checksum == sum){ dataValid = true; } @@ -350,7 +354,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { memcpy(ptr + fecHeaderSizePlus2, buf, static_cast(len)); sess->fec.MarkData(ptr, static_cast(len)); - int32_t sum = crc32(ptr ,len + fecHeaderSizePlus2); + int32_t sum = crc32_kr(0,ptr ,len + fecHeaderSizePlus2); memcpy(sess->m_buf + nonceSize, &sum, 4); //dump("UDPSession header", (char *)header, nonceSize + crcSize); //sess->output(header, nonceSize + crcSize ); @@ -390,7 +394,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { memcpy(ptr + fecHeaderSize, sess->shards[i]->data(), sess->shards[i]->size()); sess->fec.MarkFEC(ptr); - int32_t sum = crc32(ptr ,sess->shards[i]->size() + fecHeaderSize); + int32_t sum = crc32_kr(0,ptr ,sess->shards[i]->size() + fecHeaderSize); memcpy(sess->m_buf + nonceSize, &sum, 4); //go version write ecc to remote? @@ -424,5 +428,9 @@ UDPSession::output(const void *buffer, size_t length) { if (n != length) { debug_print("not full send\n"); } + if (n==-1) { + perror("fopen( \"nulltest.txt\", \"r\" )"); + + } return n; } From 138aefc25959f55f36cb9814c7361731dc9ee98a Mon Sep 17 00:00:00 2001 From: yarshure Date: Fri, 4 Aug 2017 15:02:10 +0800 Subject: [PATCH 44/56] turning cpu usage --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 117 ++++++++++++++++++++++++++----- 1 file changed, 99 insertions(+), 18 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 1652492..9babf35 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -105,8 +105,68 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port sess->SetDSCP(self.config.iptos); self.connected = true; assert(sess != nullptr); + [self runTest]; } +-(void)runDispatchTimer +{ + // Create a dispatch source that'll act as a timer on the concurrent queue + // You'll need to store this somewhere so you can suspend and remove it later on + dispatch_source_t dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,self->queue); + + // Setup params for creation of a recurring timer + double interval = 3300.0; + dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 0); + uint64_t intervalTime = (int64_t)(interval * NSEC_PER_MSEC); + dispatch_source_set_timer(dispatchSource, startTime, intervalTime, 0); + + // Attach the block you want to run on the timer fire + dispatch_source_set_event_handler(dispatchSource, ^{ + // Your code here + + + if (sess != nil) { + + + char *buf = (char *) malloc(4096); + + memset(buf, 0, 4096); + ssize_t n = sess->Read(buf, 4096); + sess->Update(iclock()); + + if (n > 0 ){ + @autoreleasepool { + NSData *d = [NSData dataWithBytes:buf length:n]; + + dispatch_async(self.dispatchqueue, ^{ + [self.delegate didRecevied:d]; + }); + + // total += n ; + //NSDate *now = [NSDate date]; + + + + } + } + free(buf); + + + + } + }); + + // Start the timer + dispatch_resume(dispatchSource); + + // ---- + + // When you want to stop the timer, you need to suspend the source + //dispatch_suspend(dispatchSource); + + // If on iOS5 and/or using MRC, you'll need to release the source too + +} -(void)shutdownUDPSession { self.connected = false; @@ -162,6 +222,8 @@ -(void)runTest if (total == 0) { start = [NSDate date]; } + int zeroCount = 0; + int valueCont = 0 ; if (strongSelf) { if (sess != nil) { @@ -181,30 +243,49 @@ -(void)runTest }); total += n ; - NSDate *now = [NSDate date]; - - //size_t speed = (NSTimeInterval)total/inter; -// if(( [now timeIntervalSinceDate:start]> 3.0 )&&( total > 1024*1000*10)) { -// total = 0; + //NSDate *now = [NSDate date]; -// usleep(1100); -// }else { - -// usleep(3300); -// }else { -// if ( [now timeIntervalSinceDate:start]> 3.0 ){ -// total = 0 ; -// } -// usleep(800); -// } + } +#include "TargetConditionals.h" +#if TARGET_IPHONE_SIMULATOR + // iOS Simulator +#elif TARGET_OS_IPHONE + if (valueCont > 10) { + valueCont = 0; + usleep(10000); + }else { + usleep(1000); } - usleep(2200); + valueCont++; // iOS device +#elif TARGET_OS_MAC + // Other kinds of Mac OS +#else +# error "Unknown Apple platform" +#endif + + }else { +#if TARGET_IPHONE_SIMULATOR + // iOS Simulator +#elif TARGET_OS_IPHONE + if (zeroCount > 3) { + zeroCount = 0; + usleep(3300); + }else { + usleep(1000); + } + zeroCount++; - usleep(33000); - + // iOS device +#elif TARGET_OS_MAC + usleep(3000); + // Other kinds of Mac OS +#else +# error "Unknown Apple platform" +#endif + } free(buf); From 48532e3d0fcbf70c6b1ac071f7ac951c35b49b07 Mon Sep 17 00:00:00 2001 From: networkextension Date: Mon, 21 Aug 2017 11:02:30 +0800 Subject: [PATCH 45/56] socket tunnel work now --- .../libkcp/kcptest/Base.lproj/Main.storyboard | 20 ++++++- iOSLib/libkcp/kcptest/ViewController.mm | 55 +++++++++++++++++-- kcpserver.go | 3 +- 3 files changed, 70 insertions(+), 8 deletions(-) diff --git a/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard b/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard index 5fdb34a..c6ea327 100644 --- a/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard +++ b/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard @@ -1,11 +1,11 @@ - + - + @@ -75,6 +75,22 @@ + + diff --git a/iOSLib/libkcp/kcptest/ViewController.mm b/iOSLib/libkcp/kcptest/ViewController.mm index cca0f76..0b64334 100644 --- a/iOSLib/libkcp/kcptest/ViewController.mm +++ b/iOSLib/libkcp/kcptest/ViewController.mm @@ -15,17 +15,64 @@ @interface ViewController () @property (strong,nonatomic) SFKcpTun *tun; @property (strong,nonatomic) dispatch_queue_t dispatchqueue; @property (nonatomic,strong) NSTimer *t; + @end @implementation ViewController - +{ + NSDate *last; + dispatch_source_t dispatchSource; + dispatch_queue_t tqueue ; + dispatch_queue_t socketqueue ; + +} - (void)viewDidLoad { [super viewDidLoad]; - self.dispatchqueue = dispatch_queue_create("test", NULL); - [self testCrypto]; - [self testSodium]; +// self.dispatchqueue = dispatch_queue_create("test", NULL); +// [self testCrypto]; +// [self testSodium]; + tqueue = dispatch_queue_create("test.yarshure", DISPATCH_QUEUE_SERIAL); // Do any additional setup after loading the view, typically from a nib. +} +-(IBAction)tThread:(id)sender{ + last = [NSDate date]; + [NSThread detachNewThreadWithBlock:^{ + for (; ; ) { + NSDate *n = [NSDate date]; + //NSLog(@"timer come %0.6f",[n timeIntervalSinceDate:last]); + last = n; + [NSThread sleepForTimeInterval:0.003]; + } + }]; +} +-(IBAction)testTimer:(id)sender{ + + // Create a dispatch source that'll act as a timer on the concurrent queue + // You'll need to store this somewhere so you can suspend and remove it later on + NSLog(@"go"); + dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,tqueue); + last = [NSDate date]; + // Setup params for creation of a recurring timer + double interval = 3.0; + dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 0); + uint64_t intervalTime = (int64_t)(interval * NSEC_PER_MSEC); + dispatch_source_set_timer(dispatchSource, startTime, intervalTime, 0); + + // Attach the block you want to run on the timer fire + dispatch_source_set_event_handler(dispatchSource, ^{ + // Your code here + NSDate *n = [NSDate date]; + //NSLog(@"timer come %0.6f",[n timeIntervalSinceDate:last]); + last = n; + }); + + + dispatch_resume(dispatchSource); + + + + } -(void)testCrypto2 { diff --git a/kcpserver.go b/kcpserver.go index 782fdf7..60d6715 100644 --- a/kcpserver.go +++ b/kcpserver.go @@ -1,8 +1,7 @@ package main import ( - "fmt" - "crypto/sha1" + "crypto/sha1" "github.com/xtaci/kcp-go" "golang.org/x/crypto/pbkdf2" From 8ef1e5fe23adc2e8659b4b3bb80d1764c7a8e767 Mon Sep 17 00:00:00 2001 From: yarshure Date: Tue, 16 Jan 2018 19:19:41 +0800 Subject: [PATCH 46/56] update API --- .../libkcp/libkcp.xcodeproj/project.pbxproj | 16 +++++++++++--- .../xcshareddata/xcschemes/kcpOSX.xcscheme | 4 +++- .../xcshareddata/xcschemes/libkcp.xcscheme | 4 +++- .../xcschemes/kcptest.xcscheme | 4 +++- iOSLib/libkcp/libkcp/SFKcpTun.h | 3 +-- iOSLib/libkcp/libkcp/SFKcpTun.mm | 22 ++++++++++++++----- ikcp.c | 2 +- sess.cpp | 6 +++-- 8 files changed, 44 insertions(+), 17 deletions(-) diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 36b3307..081014e 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -32,7 +32,6 @@ 692AE3611EB2EF83006A4B9D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 692AE35F1EB2EF83006A4B9D /* Main.storyboard */; }; 692AE3631EB2EF83006A4B9D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 692AE3621EB2EF83006A4B9D /* Assets.xcassets */; }; 692AE3661EB2EF83006A4B9D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 692AE3641EB2EF83006A4B9D /* LaunchScreen.storyboard */; }; - 692AE36D1EB2EF9C006A4B9D /* kcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; }; 692AE3711EB2F191006A4B9D /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3701EB2F191006A4B9D /* libc++.tbd */; }; 695165F51EBB2663008DCF66 /* BlockCrypt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 695165F31EBB2663008DCF66 /* BlockCrypt.cpp */; }; 695165F61EBB2663008DCF66 /* BlockCrypt.h in Headers */ = {isa = PBXBuildFile; fileRef = 695165F41EBB2663008DCF66 /* BlockCrypt.h */; }; @@ -167,7 +166,6 @@ files = ( 692AE3711EB2F191006A4B9D /* libc++.tbd in Frameworks */, 69C757811EB2F96D00139321 /* kcp.framework in Frameworks */, - 692AE36D1EB2EF9C006A4B9D /* kcp.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -402,7 +400,7 @@ 692AE3181EB2EE59006A4B9D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 0910; ORGANIZATIONNAME = "Kong XiangBo"; TargetAttributes = { 692AE3201EB2EE59006A4B9D = { @@ -562,7 +560,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -570,7 +570,11 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -614,7 +618,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -622,7 +628,11 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; diff --git a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme index a674be5..44ea40b 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme +++ b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme @@ -1,6 +1,6 @@ @@ -36,6 +37,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme index 6316bae..94fe7ec 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme +++ b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme @@ -1,6 +1,6 @@ @@ -36,6 +37,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/kcptest.xcscheme b/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/kcptest.xcscheme index bf8dd92..ce43b9a 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/kcptest.xcscheme +++ b/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/kcptest.xcscheme @@ -1,6 +1,6 @@ @@ -45,6 +46,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.h b/iOSLib/libkcp/libkcp/SFKcpTun.h index 5d638de..f5cacd5 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.h +++ b/iOSLib/libkcp/libkcp/SFKcpTun.h @@ -23,8 +23,7 @@ @property (nonatomic) BOOL connected; //callback queue @property (nonatomic) dispatch_queue_t dispatchqueue ; --(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue; - +-(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue delegate:(NSObject*)delegate; -(void)startUDPSession; -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port; -(void)shutdownUDPSession; diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 9babf35..c6e823a 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -51,12 +51,13 @@ @implementation SFKcpTun dispatch_queue_t socketqueue ; } --(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue +-(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue delegate:(NSObject*)delegate { if (self = [super init]){ self.config = c; self.server = ip; self.port = port; + self.delegate = delegate; self.dispatchqueue = dqueue; queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); socketqueue = dispatch_queue_create("com.abigt.kcpwrite", DISPATCH_QUEUE_SERIAL); @@ -66,23 +67,28 @@ -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port } -(void)startUDPSession { - if (self.config.key.length > 0){ + if (self.config.key.length > 0 && ![self.config.crypt isEqualToString:@"none"]){ BlockCrypt *block = BlockCrypt::blockWith(self.config.key.bytes, self.config.crypt.UTF8String); sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards,block); }else { sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards); } + assert(sess != nullptr); sess->NoDelay(self.config.nodelay, self.config.interval, self.config.resend, self.config.nc); sess->WndSize(self.config.sndwnd, self.config.rcvwnd); sess->SetMtu(self.config.mtu); sess->SetStreamMode(true); sess->SetDSCP(self.config.iptos); - assert(sess != nullptr); + self.connected = true; [self runTest]; - + __weak SFKcpTun *weakSelf = self; + dispatch_async(self.dispatchqueue, ^{ + [weakSelf.delegate connected:weakSelf]; + }); + } -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port { @@ -97,16 +103,20 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards); } - + assert(sess != nullptr); sess->NoDelay(self.config.nodelay, self.config.interval, self.config.resend, self.config.nc); sess->WndSize(self.config.sndwnd, self.config.rcvwnd); sess->SetMtu(self.config.mtu); sess->SetStreamMode(true); sess->SetDSCP(self.config.iptos); self.connected = true; - assert(sess != nullptr); + [self runTest]; + __weak SFKcpTun *weakSelf = self; + dispatch_async(self.dispatchqueue, ^{ + [weakSelf.delegate connected:weakSelf]; + }); } -(void)runDispatchTimer { diff --git a/ikcp.c b/ikcp.c index 6d564f7..bcc5550 100644 --- a/ikcp.c +++ b/ikcp.c @@ -545,7 +545,7 @@ static void ikcp_update_ack(ikcpcb *kcp, IINT32 rtt) kcp->rx_srtt = rtt; kcp->rx_rttval = rtt / 2; } else { - long delta = rtt - kcp->rx_srtt; + IINT32 delta = rtt - kcp->rx_srtt; if (delta < 0) delta = -delta; kcp->rx_rttval = (3 * kcp->rx_rttval + delta) / 4; kcp->rx_srtt = (7 * kcp->rx_srtt + rtt) / 8; diff --git a/sess.cpp b/sess.cpp index cd0e312..5899c7e 100644 --- a/sess.cpp +++ b/sess.cpp @@ -159,8 +159,10 @@ UDPSession::Update(uint32_t current) noexcept { for (;;) { ssize_t n = recv(m_sockfd, m_buf, sizeof(m_buf), 0); if (n < 0) { - perror("fopen( \"nulltest.txt\", \"r\" )"); + //perror("read fopen( \"nulltest.txt\", \"r\" )"); + debug_print("kcp udp socket read error"); + break; } if (n > 0) { dump((char*)"UDP Update", m_buf, n); @@ -429,7 +431,7 @@ UDPSession::output(const void *buffer, size_t length) { debug_print("not full send\n"); } if (n==-1) { - perror("fopen( \"nulltest.txt\", \"r\" )"); + perror("send error fopen( \"nulltest.txt\", \"r\" )"); } return n; From f059f21cf0a912f0f851e3d65310c4e66c978044 Mon Sep 17 00:00:00 2001 From: yarshure Date: Tue, 16 Jan 2018 19:50:05 +0800 Subject: [PATCH 47/56] change to block style API --- iOSLib/libkcp/libkcp/SFKcpTun.h | 33 +++++++++++++++------------ iOSLib/libkcp/libkcp/SFKcpTun.mm | 39 ++++++++++++++++++++------------ 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.h b/iOSLib/libkcp/libkcp/SFKcpTun.h index f5cacd5..3555373 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.h +++ b/iOSLib/libkcp/libkcp/SFKcpTun.h @@ -9,26 +9,31 @@ #import #import "TunConfig.h" @class SFKcpTun; -@protocol SFKcpTunDelegate --(void)connected:(SFKcpTun*)tun; --(void)disConnected:(SFKcpTun*)tun; --(void)tunError:(SFKcpTun*)tun error:(NSError*)error; --(void)didRecevied:(NSData*)data; -@end + +typedef void (^tunConnected)(SFKcpTun * _Nonnull tun); +typedef void (^tunDisConnected)(SFKcpTun * _Nonnull tun); +typedef void (^tundidFoundError)(SFKcpTun * _Nonnull tun ,NSError * _Nonnull e); +typedef void (^didRecvData)(SFKcpTun * _Nonnull tun,NSData * _Nonnull d); + @interface SFKcpTun : NSObject -@property (strong,nonatomic) TunConfig *config; -@property (strong,nonatomic) NSString *server; -@property (weak,nonatomic) NSObject *delegate; + @property (strong,nonatomic) TunConfig * _Nonnull config; + @property (strong,nonatomic) NSString * _Nonnull server; + @property (nonatomic) int port; @property (nonatomic) BOOL connected; + +@property (nonatomic,copy) didRecvData _Nonnull recvData; +@property (nonatomic,copy) tunDisConnected _Nonnull disConnected; +@property (nonatomic,copy) tunConnected _Nonnull tunConnected; //callback queue -@property (nonatomic) dispatch_queue_t dispatchqueue ; --(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue delegate:(NSObject*)delegate; + @property (nonatomic) dispatch_queue_t _Nonnull dispatchqueue ; +-(instancetype _Nonnull )initWithConfig:(TunConfig *_Nonnull)c ipaddr:(NSString*_Nonnull)ip port:(int)port queue:(dispatch_queue_t _Nonnull )dqueue; +-(void)startWith:(tunConnected _Nonnull )connectd recv:(didRecvData _Nonnull )recv disConnect:(tunConnected _Nonnull )disConnect; -(void)startUDPSession; --(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port; +-(void)restartUDPSessionWithIpaddr:(NSString*_Nonnull)ip port:(int)port; -(void)shutdownUDPSession; --(void)input:(NSData*)data; +-(void)input:(NSData*_Nonnull)data; //-(void)upDate; --(NSString*)localAddress; +-(NSString*_Nonnull)localAddress; -(BOOL)useCell; @end diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index c6e823a..3ab59bf 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -51,13 +51,13 @@ @implementation SFKcpTun dispatch_queue_t socketqueue ; } --(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue delegate:(NSObject*)delegate +-(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue { if (self = [super init]){ self.config = c; self.server = ip; self.port = port; - self.delegate = delegate; + self.dispatchqueue = dqueue; queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); socketqueue = dispatch_queue_create("com.abigt.kcpwrite", DISPATCH_QUEUE_SERIAL); @@ -83,13 +83,23 @@ -(void)startUDPSession sess->SetDSCP(self.config.iptos); self.connected = true; - [self runTest]; - __weak SFKcpTun *weakSelf = self; - dispatch_async(self.dispatchqueue, ^{ - [weakSelf.delegate connected:weakSelf]; - }); + } +-(void)startWith:(tunConnected)connectd recv:(didRecvData)recv disConnect:(tunConnected)disConnect + { + self.tunConnected = connectd; + self.recvData = recv; + self.disConnected = disConnect; + [self runTest]; + __weak SFKcpTun *weakSelf = self; + if ( self.connected ) { + dispatch_async(self.dispatchqueue, ^{ + weakSelf.tunConnected(weakSelf); + }); + } + + } -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port { if (sess != nil) { @@ -113,10 +123,7 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port [self runTest]; - __weak SFKcpTun *weakSelf = self; - dispatch_async(self.dispatchqueue, ^{ - [weakSelf.delegate connected:weakSelf]; - }); + } -(void)runDispatchTimer { @@ -131,6 +138,7 @@ -(void)runDispatchTimer dispatch_source_set_timer(dispatchSource, startTime, intervalTime, 0); // Attach the block you want to run on the timer fire + __weak SFKcpTun *weakSelf = self; dispatch_source_set_event_handler(dispatchSource, ^{ // Your code here @@ -149,7 +157,8 @@ -(void)runDispatchTimer NSData *d = [NSData dataWithBytes:buf length:n]; dispatch_async(self.dispatchqueue, ^{ - [self.delegate didRecevied:d]; + weakSelf.recvData(weakSelf, d); + }); // total += n ; @@ -249,7 +258,8 @@ -(void)runTest NSData *d = [NSData dataWithBytes:buf length:n]; dispatch_async(strongSelf.dispatchqueue, ^{ - [strongSelf.delegate didRecevied:d]; + weakSelf.recvData(self, d); + }); total += n ; @@ -339,7 +349,8 @@ -(void)testPorformce NSData *d = [NSData dataWithBytes:buf length:n]; dispatch_async(strongSelf.dispatchqueue, ^{ - [strongSelf.delegate didRecevied:d]; + weakSelf.recvData(weakSelf, d); + }); } From 7cfd1828b0d476dc057fcd64a3fc18de5867bf4d Mon Sep 17 00:00:00 2001 From: yarshure Date: Tue, 16 Jan 2018 20:09:31 +0800 Subject: [PATCH 48/56] change didRecvData to didRecvdata,Swift imported will Good --- iOSLib/libkcp/libkcp/SFKcpTun.h | 6 +++--- iOSLib/libkcp/libkcp/SFKcpTun.mm | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.h b/iOSLib/libkcp/libkcp/SFKcpTun.h index 3555373..23ab298 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.h +++ b/iOSLib/libkcp/libkcp/SFKcpTun.h @@ -13,7 +13,7 @@ typedef void (^tunConnected)(SFKcpTun * _Nonnull tun); typedef void (^tunDisConnected)(SFKcpTun * _Nonnull tun); typedef void (^tundidFoundError)(SFKcpTun * _Nonnull tun ,NSError * _Nonnull e); -typedef void (^didRecvData)(SFKcpTun * _Nonnull tun,NSData * _Nonnull d); +typedef void (^didRecvdata)(SFKcpTun * _Nonnull tun,NSData * _Nonnull d); @interface SFKcpTun : NSObject @property (strong,nonatomic) TunConfig * _Nonnull config; @@ -22,13 +22,13 @@ typedef void (^didRecvData)(SFKcpTun * _Nonnull tun,NSData * _Nonnull d); @property (nonatomic) int port; @property (nonatomic) BOOL connected; -@property (nonatomic,copy) didRecvData _Nonnull recvData; +@property (nonatomic,copy) didRecvdata _Nonnull recvData; @property (nonatomic,copy) tunDisConnected _Nonnull disConnected; @property (nonatomic,copy) tunConnected _Nonnull tunConnected; //callback queue @property (nonatomic) dispatch_queue_t _Nonnull dispatchqueue ; -(instancetype _Nonnull )initWithConfig:(TunConfig *_Nonnull)c ipaddr:(NSString*_Nonnull)ip port:(int)port queue:(dispatch_queue_t _Nonnull )dqueue; --(void)startWith:(tunConnected _Nonnull )connectd recv:(didRecvData _Nonnull )recv disConnect:(tunConnected _Nonnull )disConnect; +-(void)startWith:(tunConnected _Nonnull )connectd recv:(didRecvdata _Nonnull )recv disConnect:(tunConnected _Nonnull )disConnect; -(void)startUDPSession; -(void)restartUDPSessionWithIpaddr:(NSString*_Nonnull)ip port:(int)port; -(void)shutdownUDPSession; diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 3ab59bf..66082de 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -86,7 +86,7 @@ -(void)startUDPSession } --(void)startWith:(tunConnected)connectd recv:(didRecvData)recv disConnect:(tunConnected)disConnect +-(void)startWith:(tunConnected)connectd recv:(didRecvdata)recv disConnect:(tunConnected)disConnect { self.tunConnected = connectd; self.recvData = recv; From 1f3b4b5252deb115018e98bf5eae21a8447f4e1e Mon Sep 17 00:00:00 2001 From: yarshure Date: Thu, 8 Feb 2018 14:59:40 +0800 Subject: [PATCH 49/56] fixed session Block 0xaaaaaaaaaaaaaaaa issue --- iOSLib/libkcp/libkcp/BlockCrypt.cpp | 8 ++++++-- iOSLib/libkcp/libkcp/SFKcpTun.mm | 6 +++--- sess.cpp | 7 +++++-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/iOSLib/libkcp/libkcp/BlockCrypt.cpp b/iOSLib/libkcp/libkcp/BlockCrypt.cpp index 553b4b2..a1685a4 100644 --- a/iOSLib/libkcp/libkcp/BlockCrypt.cpp +++ b/iOSLib/libkcp/libkcp/BlockCrypt.cpp @@ -60,7 +60,9 @@ BlockCrypt::blockWith(const void* key,const char* crypto){ void BlockCrypt::encrypt(void *buffer, size_t length,size_t *outlen) { - + if (send_ctx == NULL ){ + return; + } size_t len = length + kCCBlockSizeAES128; void *dataOut = malloc(len); @@ -79,7 +81,9 @@ void BlockCrypt::decrypt(void *buffer, size_t length,size_t *outlen) { size_t len = length + kCCBlockSizeAES128; - + if (recv_ctx == NULL ){ + return; + } void *dataOut = malloc(len); CCCryptorStatus st = CCCryptorUpdate(recv_ctx, buffer, length, dataOut, len, outlen); diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 66082de..225396c 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -59,7 +59,7 @@ -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port self.port = port; self.dispatchqueue = dqueue; - queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + queue = dispatch_queue_create("com.abigt.read", DISPATCH_QUEUE_SERIAL);//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); socketqueue = dispatch_queue_create("com.abigt.kcpwrite", DISPATCH_QUEUE_SERIAL); [self startUDPSession]; } @@ -81,7 +81,7 @@ -(void)startUDPSession sess->SetMtu(self.config.mtu); sess->SetStreamMode(true); sess->SetDSCP(self.config.iptos); - + self.connected = true; @@ -105,7 +105,7 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port if (sess != nil) { UDPSession::Destroy(sess); } - if (self.config.key.length > 0){ + if (self.config.key.length > 0 && ![self.config.crypt isEqualToString:@"none"]){ BlockCrypt *block = BlockCrypt::blockWith(self.config.key.bytes, self.config.crypt.UTF8String); sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards,block); diff --git a/sess.cpp b/sess.cpp index 5899c7e..88a0f51 100644 --- a/sess.cpp +++ b/sess.cpp @@ -97,6 +97,9 @@ UDPSession::DialWithOptions(const char *ip, uint16_t port, size_t dataShards, si sess->dataShards = dataShards; sess->parityShards = parityShards; } + + sess->block = NULL; + printf("sess->block:%p",sess->block); return sess; }; // DialWithOptions connects to the remote address "raddr" on the network "udp" with packet encryption with block @@ -162,7 +165,7 @@ UDPSession::Update(uint32_t current) noexcept { //perror("read fopen( \"nulltest.txt\", \"r\" )"); debug_print("kcp udp socket read error"); - break; + //break; } if (n > 0) { dump((char*)"UDP Update", m_buf, n); @@ -369,7 +372,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { sess->shards[sess->pkt_idx] = std::make_shared>(&sess->m_buf[fecHeaderSize + cryptHeaderSize], &sess->m_buf[fecHeaderSize + cryptHeaderSize + slen]); size_t outlen = 0; - if (block != NULL) { + if (block != NULL ) { block->encrypt(sess->m_buf, len + fecHeaderSizePlus2 + cryptHeaderSize, &outlen); sess->output(sess->m_buf, outlen); }else { From 4254dbe4d891cb985785038f0e9ae428c61178ba Mon Sep 17 00:00:00 2001 From: yarshure Date: Thu, 8 Feb 2018 15:33:02 +0800 Subject: [PATCH 50/56] add get local port api --- iOSLib/libkcp/libkcp/SFKcpTun.h | 1 + iOSLib/libkcp/libkcp/SFKcpTun.mm | 13 ++++++++++++- sess.cpp | 10 ++++++++++ sess.h | 2 +- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.h b/iOSLib/libkcp/libkcp/SFKcpTun.h index 23ab298..b514da9 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.h +++ b/iOSLib/libkcp/libkcp/SFKcpTun.h @@ -35,5 +35,6 @@ typedef void (^didRecvdata)(SFKcpTun * _Nonnull tun,NSData * _Nonnull d); -(void)input:(NSData*_Nonnull)data; //-(void)upDate; -(NSString*_Nonnull)localAddress; +-(NSInteger)localPort; -(BOOL)useCell; @end diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 225396c..3c0c533 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -373,19 +373,30 @@ -(void)testPorformce -(NSString*)localAddress{ if (sess != nil) { char *addr = sess->getLocalIPAddr(); + NSString *addrs = [NSString stringWithUTF8String:addr]; return addrs; }else { return @""; } } +-(NSInteger)localPort{ + if (sess != nil) { + + NSInteger port = sess->getLocalPort(); + + return port; + }else { + return 0; + } +} -(BOOL)useCell { NSString *ipaddr = [self localAddress]; NSDictionary *infos = [self address]; for (NSString *key in infos.allKeys) { if ([ipaddr isEqualToString:infos[key]]) { - if ([key isEqualToString:@"en0"]) { + if ([key isEqualToString:@"en"]) { return false; } } diff --git a/sess.cpp b/sess.cpp index 88a0f51..6f0a641 100644 --- a/sess.cpp +++ b/sess.cpp @@ -321,6 +321,16 @@ char * UDPSession::getLocalIPAddr() noexcept{ printf("local port: %d\n", (int) ntohs(localAddress.sin_port)); return inet_ntoa( localAddress.sin_addr); } +int UDPSession::getLocalPort() noexcept{ + struct sockaddr_in localAddress; + //socklen_t addressLength; + socklen_t addressLength = sizeof(localAddress); + getsockname(this->m_sockfd, (struct sockaddr*)&localAddress, \ + &addressLength); + printf("local address: %s\n", inet_ntoa( localAddress.sin_addr)); + printf("local port: %d\n", (int) ntohs(localAddress.sin_port)); + return (int) ntohs(localAddress.sin_port); +} void UDPSession::SetStreamMode(bool enable) noexcept { if (enable) { diff --git a/sess.h b/sess.h index 9ec9e6f..2646533 100644 --- a/sess.h +++ b/sess.h @@ -54,7 +54,7 @@ class UDPSession { int SetDSCP(int dscp) noexcept; char *getLocalIPAddr() noexcept; - + int getLocalPort() noexcept; // SetStreamMode toggles the stream mode on/off void SetStreamMode(bool enable) noexcept; From c27009a0de0b36682d8028975c0ec3550931a9b9 Mon Sep 17 00:00:00 2001 From: yarshure Date: Fri, 9 Feb 2018 11:27:36 +0800 Subject: [PATCH 51/56] speed up recv data --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 39 +++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 3c0c533..195ad64 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -59,8 +59,8 @@ -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port self.port = port; self.dispatchqueue = dqueue; - queue = dispatch_queue_create("com.abigt.read", DISPATCH_QUEUE_SERIAL);//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - socketqueue = dispatch_queue_create("com.abigt.kcpwrite", DISPATCH_QUEUE_SERIAL); + queue = dispatch_queue_create("com.abigt.kcpread", DISPATCH_QUEUE_SERIAL);//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + socketqueue = dispatch_queue_create("com.abigt.kcpwrite", DISPATCH_QUEUE_SERIAL);//input data [self startUDPSession]; } return self; @@ -243,6 +243,7 @@ -(void)runTest } int zeroCount = 0; int valueCont = 0 ; + if (strongSelf) { if (sess != nil) { @@ -256,9 +257,9 @@ -(void)runTest if (n > 0 ){ @autoreleasepool { NSData *d = [NSData dataWithBytes:buf length:n]; - + //NSData *d= [NSData dataWithBytesNoCopy:buf length:n]; dispatch_async(strongSelf.dispatchqueue, ^{ - weakSelf.recvData(self, d); + weakSelf.recvData(weakSelf, d); }); @@ -271,15 +272,26 @@ -(void)runTest #if TARGET_IPHONE_SIMULATOR // iOS Simulator #elif TARGET_OS_IPHONE - if (valueCont > 10) { - valueCont = 0; - usleep(10000); - }else { - usleep(1000); - } - - valueCont++; // iOS device +// if (valueCont > 10) { +// valueCont = 0; +// usleep(10000); +// }else { +// usleep(1000); +// } +// +// valueCont++; + // iOS device #elif TARGET_OS_MAC +// if (zeroCount > 3) { +// zeroCount = 0; +// usleep(3300); +// }else { +// usleep(1000); +// } +// +// zeroCount++; + + //usleep(1000); // Other kinds of Mac OS #else # error "Unknown Apple platform" @@ -300,7 +312,8 @@ -(void)runTest // iOS device #elif TARGET_OS_MAC - usleep(3000); + NSLog(@"session Update"); + usleep(1000); // Other kinds of Mac OS #else # error "Unknown Apple platform" From bef4a86e2e0020f7254f1dd4f3484585a9acbb91 Mon Sep 17 00:00:00 2001 From: yarshure Date: Fri, 9 Feb 2018 12:21:11 +0800 Subject: [PATCH 52/56] when send suspend recv queue --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 4 +++- ikcp.c | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 195ad64..6c4d393 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -206,6 +206,7 @@ -(void)input:(NSData*)data{ char *ptr = (char *)data.bytes; if (strongSelf.connected) { + dispatch_suspend(strongSelf->queue); while (sended < tosend) { @@ -221,6 +222,7 @@ -(void)input:(NSData*)data{ }else { exit(-1); } + dispatch_resume(strongSelf->queue); } @@ -278,7 +280,7 @@ -(void)runTest // }else { // usleep(1000); // } -// +// // valueCont++; // iOS device #elif TARGET_OS_MAC diff --git a/ikcp.c b/ikcp.c index bcc5550..61b9a11 100644 --- a/ikcp.c +++ b/ikcp.c @@ -1029,7 +1029,8 @@ void ikcp_flush(ikcpcb *kcp) // flush data segments for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = p->next) { IKCPSEG *segment = iqueue_entry(p, IKCPSEG, node); - int needsend = 0; + int needsend = 0; + //EXC_BAD_ACCESS (code=1, address=0xf00000000000003c) if (segment->xmit == 0) { needsend = 1; segment->xmit++; From ee86ccfca222040cc57a4619d509682ebc27e336 Mon Sep 17 00:00:00 2001 From: yarshure Date: Thu, 18 Oct 2018 15:17:27 +0800 Subject: [PATCH 53/56] Under iOS12 or macOS 10.14 change to use Network.framework event base recv/send --- .../libkcp/libkcp.xcodeproj/project.pbxproj | 14 +- .../xcshareddata/xcschemes/kcpOSX.xcscheme | 4 +- .../xcshareddata/xcschemes/libkcp.xcscheme | 4 +- iOSLib/libkcp/libkcp/SFKcpTun.h | 6 +- iOSLib/libkcp/libkcp/SFKcpTun.mm | 38 +- sess.cpp | 328 +++++++++++++++++- sess.h | 19 +- 7 files changed, 375 insertions(+), 38 deletions(-) diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 081014e..8e5c52c 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -67,6 +67,8 @@ 69639BF61EE1AB5D00893D18 /* CRC32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6959B7451EBB7DEC00B0BC58 /* CRC32.cpp */; }; 69639BF71EE1AB6100893D18 /* CRC32.h in Headers */ = {isa = PBXBuildFile; fileRef = 6959B7461EBB7DEC00B0BC58 /* CRC32.h */; }; 69639BF91EE1ABA200893D18 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69639BF81EE1ABA200893D18 /* Security.framework */; }; + 69B917C221785876004CC106 /* Network.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69B917C121785876004CC106 /* Network.framework */; }; + 69B917C42178587F004CC106 /* Network.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69B917C32178587F004CC106 /* Network.framework */; }; 69C757811EB2F96D00139321 /* kcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; }; 69C757821EB2F96D00139321 /* kcp.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* kcp.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 69FFC6A01EB30985008A030D /* SFKcpTun.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC69E1EB30985008A030D /* SFKcpTun.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -145,6 +147,8 @@ 69639BD81EE1AAC100893D18 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 69639BF81EE1ABA200893D18 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; 698D5CFB1F0A0E6B008C2335 /* Sodium.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sodium.framework; sourceTree = ""; }; + 69B917C121785876004CC106 /* Network.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Network.framework; path = System/Library/Frameworks/Network.framework; sourceTree = SDKROOT; }; + 69B917C32178587F004CC106 /* Network.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Network.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Network.framework; sourceTree = DEVELOPER_DIR; }; 69FFC69E1EB30985008A030D /* SFKcpTun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFKcpTun.h; path = libkcp/SFKcpTun.h; sourceTree = SOURCE_ROOT; }; 69FFC69F1EB30985008A030D /* SFKcpTun.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SFKcpTun.mm; path = libkcp/SFKcpTun.mm; sourceTree = SOURCE_ROOT; }; 69FFC6A31EB309E8008A030D /* TunConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TunConfig.h; path = libkcp/TunConfig.h; sourceTree = ""; }; @@ -156,6 +160,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 69B917C221785876004CC106 /* Network.framework in Frameworks */, 6959B74A1EBB8B0C00B0BC58 /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -173,6 +178,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 69B917C42178587F004CC106 /* Network.framework in Frameworks */, 69639BF91EE1ABA200893D18 /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -263,6 +269,8 @@ 692AE36F1EB2F191006A4B9D /* Frameworks */ = { isa = PBXGroup; children = ( + 69B917C121785876004CC106 /* Network.framework */, + 69B917C32178587F004CC106 /* Network.framework */, 698D5CFB1F0A0E6B008C2335 /* Sodium.framework */, 69639BF81EE1ABA200893D18 /* Security.framework */, 6959B7491EBB8B0C00B0BC58 /* Security.framework */, @@ -400,7 +408,7 @@ 692AE3181EB2EE59006A4B9D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0910; + LastUpgradeCheck = 1000; ORGANIZATIONNAME = "Kong XiangBo"; TargetAttributes = { 692AE3201EB2EE59006A4B9D = { @@ -564,6 +572,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -571,6 +580,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -622,6 +632,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -629,6 +640,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; diff --git a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme index 44ea40b..35813c0 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme +++ b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/kcpOSX.xcscheme @@ -1,6 +1,6 @@ @@ -37,7 +36,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme index 94fe7ec..cba17c6 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme +++ b/iOSLib/libkcp/libkcp.xcodeproj/xcshareddata/xcschemes/libkcp.xcscheme @@ -1,6 +1,6 @@ @@ -37,7 +36,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.h b/iOSLib/libkcp/libkcp/SFKcpTun.h index b514da9..3f9d43c 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.h +++ b/iOSLib/libkcp/libkcp/SFKcpTun.h @@ -19,7 +19,7 @@ typedef void (^didRecvdata)(SFKcpTun * _Nonnull tun,NSData * _Nonnull d); @property (strong,nonatomic) TunConfig * _Nonnull config; @property (strong,nonatomic) NSString * _Nonnull server; -@property (nonatomic) int port; +@property (nonatomic) NSString * _Nonnull port; @property (nonatomic) BOOL connected; @property (nonatomic,copy) didRecvdata _Nonnull recvData; @@ -27,10 +27,10 @@ typedef void (^didRecvdata)(SFKcpTun * _Nonnull tun,NSData * _Nonnull d); @property (nonatomic,copy) tunConnected _Nonnull tunConnected; //callback queue @property (nonatomic) dispatch_queue_t _Nonnull dispatchqueue ; --(instancetype _Nonnull )initWithConfig:(TunConfig *_Nonnull)c ipaddr:(NSString*_Nonnull)ip port:(int)port queue:(dispatch_queue_t _Nonnull )dqueue; +-(instancetype _Nonnull )initWithConfig:(TunConfig *_Nonnull)c ipaddr:(NSString*_Nonnull)ip port:(NSString*_Nonnull)port queue:(dispatch_queue_t _Nonnull )dqueue; -(void)startWith:(tunConnected _Nonnull )connectd recv:(didRecvdata _Nonnull )recv disConnect:(tunConnected _Nonnull )disConnect; -(void)startUDPSession; --(void)restartUDPSessionWithIpaddr:(NSString*_Nonnull)ip port:(int)port; +-(void)restartUDPSessionWithIpaddr:(NSString*_Nonnull)ip port:(NSString *_Nonnull)port; -(void)shutdownUDPSession; -(void)input:(NSData*_Nonnull)data; //-(void)upDate; diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 6c4d393..655e6e5 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -51,7 +51,7 @@ @implementation SFKcpTun dispatch_queue_t socketqueue ; } --(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port queue:(dispatch_queue_t)dqueue +-(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(NSString* )port queue:(dispatch_queue_t)dqueue { if (self = [super init]){ self.config = c; @@ -70,9 +70,9 @@ -(void)startUDPSession if (self.config.key.length > 0 && ![self.config.crypt isEqualToString:@"none"]){ BlockCrypt *block = BlockCrypt::blockWith(self.config.key.bytes, self.config.crypt.UTF8String); - sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards,block); + sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port.UTF8String, self.config.dataShards,self.config.parityShards,block); }else { - sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards); + sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port.UTF8String, self.config.dataShards,self.config.parityShards); } assert(sess != nullptr); @@ -91,6 +91,7 @@ -(void)startWith:(tunConnected)connectd recv:(didRecvdata)recv disConnect:(tunCo self.tunConnected = connectd; self.recvData = recv; self.disConnected = disConnect; + sess->start_send_receive_loop(); [self runTest]; __weak SFKcpTun *weakSelf = self; if ( self.connected ) { @@ -100,7 +101,7 @@ -(void)startWith:(tunConnected)connectd recv:(didRecvdata)recv disConnect:(tunCo } } --(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port +-(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(NSString*)port { if (sess != nil) { UDPSession::Destroy(sess); @@ -108,9 +109,9 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port if (self.config.key.length > 0 && ![self.config.crypt isEqualToString:@"none"]){ BlockCrypt *block = BlockCrypt::blockWith(self.config.key.bytes, self.config.crypt.UTF8String); - sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards,block); + sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port.UTF8String, self.config.dataShards,self.config.parityShards,block); }else { - sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards); + sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port.UTF8String, self.config.dataShards,self.config.parityShards); } assert(sess != nullptr); @@ -121,7 +122,7 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port sess->SetDSCP(self.config.iptos); self.connected = true; - + sess->start_send_receive_loop(); [self runTest]; } @@ -150,7 +151,14 @@ -(void)runDispatchTimer memset(buf, 0, 4096); ssize_t n = sess->Read(buf, 4096); - sess->Update(iclock()); + + if (__builtin_available(iOS 12, macOS 10.14,*)) { + + }else { + sess->Update(iclock()); + } + + if (n > 0 ){ @autoreleasepool { @@ -254,7 +262,12 @@ -(void)runTest memset(buf, 0, 4096); ssize_t n = sess->Read(buf, 4096); - sess->Update(iclock()); + + if (__builtin_available(iOS 12, macOS 10.14,*)) { + }else { + sess->Update(iclock()); + } + if (n > 0 ){ @autoreleasepool { @@ -357,8 +370,11 @@ -(void)testPorformce memset(buf, 0, 4096); ssize_t n = sess->Read(buf, 4096); - sess->Update(iclock()); - + //sess->Update(iclock()); + if (__builtin_available(iOS 12, macOS 10.14,*)) { + }else { + sess->Update(iclock()); + } if (n > 0 ){ @autoreleasepool { NSData *d = [NSData dataWithBytes:buf length:n]; diff --git a/sess.cpp b/sess.cpp index 6f0a641..fa5a41b 100644 --- a/sess.cpp +++ b/sess.cpp @@ -8,6 +8,31 @@ #include #include #include "CRC32.h" +#include + +// Global Options nw +char *g_psk = NULL; // TLS PSK +char *g_local_port = NULL; // Local port flag +char *g_local_addr = NULL; // Source Address +bool g_use_bonjour = false; // Use Bonjour rather than hostnames +bool g_detached = true; // Ignore stdin +bool g_listener = false; // Create a listener +bool g_use_tls = false; // Use TLS or DTLS +bool g_use_udp = true; // Use UDP instead of TCP +bool g_verbose = false; // Verbose +int g_family = AF_UNSPEC; // Required address family +#define NWCAT_BONJOUR_SERVICE_TCP_TYPE "_nwcat._tcp" +#define NWCAT_BONJOUR_SERVICE_UDP_TYPE "_nwcat._udp" +#define NWCAT_BONJOUR_SERVICE_DOMAIN "local" + +//end +void +_itimeofday(long *sec, long *usec) { + struct timeval time; + gettimeofday(&time, NULL); + if (sec) *sec = time.tv_sec; + if (usec) *usec = time.tv_usec; +} // 16-bytes magic number for each packet const size_t nonceSize = 16; @@ -85,11 +110,30 @@ UDPSession::Dial(const char *ip, uint16_t port) { } UDPSession * -UDPSession::DialWithOptions(const char *ip, uint16_t port, size_t dataShards, size_t parityShards) { - auto sess = UDPSession::Dial(ip, port); - if (sess == nullptr) { - return nullptr; +UDPSession::DialWithOptions(const char *ip, const char *port, size_t dataShards, size_t parityShards) { + UDPSession *sess; + if (__builtin_available(iOS 12,macOS 10.14, *)) { + + + nw_connection_t connection = create_outbound_connection(ip , port); + if (connection == NULL) { + err(1, NULL); + } + sess = UDPSession::createSession(connection); + sess->start_connection(connection); + // + + }else { + uint16_t arrToInt = 0; + for(int i=0;i<=1;i++) + arrToInt =(arrToInt<<8) | port[i]; + sess = UDPSession::Dial(ip, arrToInt); + if (sess == nullptr) { + return nullptr; + } } + + if (dataShards > 0 && parityShards > 0) { sess->fec = FEC::New(rxFECMulti * (dataShards + parityShards), dataShards, parityShards); @@ -104,7 +148,7 @@ UDPSession::DialWithOptions(const char *ip, uint16_t port, size_t dataShards, si }; // DialWithOptions connects to the remote address "raddr" on the network "udp" with packet encryption with block UDPSession* -UDPSession::DialWithOptions(const char *ip, uint16_t port, size_t dataShards, size_t parityShards,BlockCrypt *block){ +UDPSession::DialWithOptions(const char *ip, const char *port, size_t dataShards, size_t parityShards,BlockCrypt *block){ auto sess = UDPSession::DialWithOptions(ip, port, dataShards, parityShards); if (sess == nullptr) { return nullptr; @@ -154,7 +198,15 @@ UDPSession::createSession(int sockfd) { return sess; } - +UDPSession * +UDPSession::createSession(nw_connection_t sockfd) { + UDPSession *sess = new(UDPSession); + sess->outbound_connection = sockfd; + sess->m_kcp = ikcp_create(IUINT32(rand()), sess); + sess->m_kcp->output = sess->out_wrapper; + + return sess; +} //recv data from udp socket /// void @@ -439,13 +491,265 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { ssize_t UDPSession::output(const void *buffer, size_t length) { dump((char*)"UDPSession write socket", (byte *)buffer, length); - ssize_t n = send(m_sockfd, buffer, length, 0); - if (n != length) { - debug_print("not full send\n"); + if (__builtin_available(iOS 12, *)) { + //send error check + this->send_loop(this->outbound_connection, dispatch_data_create(buffer,length,nil,DISPATCH_DATA_DESTRUCTOR_DEFAULT)); + return length; + }else { + + ssize_t n = send(m_sockfd, buffer, length, 0); + if (n != length) { + debug_print("not full send\n"); + } + if (n==-1) { + perror("send error fopen( \"nulltest.txt\", \"r\" )"); + } + return n; } - if (n==-1) { - perror("send error fopen( \"nulltest.txt\", \"r\" )"); + + +} +/* + * create_outbound_connection() + * Returns a retained connection to a remote hostname and port. + * Sets up TLS and local address/port as necessary. + */ +nw_connection_t +UDPSession::create_outbound_connection(const char *name, const char *port) +{ + // If we are using bonjour to connect, treat the name as a bonjour name + // Otherwise, treat the name as a hostname + if (__builtin_available(iOS 12, *)) { + nw_endpoint_t endpoint = (g_use_bonjour ? + nw_endpoint_create_bonjour_service(name, + (g_use_udp ? NWCAT_BONJOUR_SERVICE_UDP_TYPE : NWCAT_BONJOUR_SERVICE_TCP_TYPE), + NWCAT_BONJOUR_SERVICE_DOMAIN) : + nw_endpoint_create_host(name, port)); + + nw_parameters_t parameters = NULL; + nw_parameters_configure_protocol_block_t configure_tls = NW_PARAMETERS_DISABLE_PROTOCOL; + if (g_use_tls) { + if (g_psk) { + configure_tls = ^(nw_protocol_options_t tls_options) { + sec_protocol_options_t sec_options = nw_tls_copy_sec_protocol_options(tls_options); + dispatch_data_t psk = dispatch_data_create(g_psk, strlen(g_psk), nil, DISPATCH_DATA_DESTRUCTOR_DEFAULT); + sec_protocol_options_add_pre_shared_key(sec_options, psk, psk); + dispatch_release(psk); + sec_protocol_options_add_tls_ciphersuite(sec_options, (SSLCipherSuite)TLS_PSK_WITH_AES_128_GCM_SHA256); + nw_release(sec_options); + }; + } else { + configure_tls = NW_PARAMETERS_DEFAULT_CONFIGURATION; + } + } + if (g_use_udp) { + // Create a UDP connection + parameters = nw_parameters_create_secure_udp(configure_tls, + NW_PARAMETERS_DEFAULT_CONFIGURATION); + } else { + // Create a TCP connection + parameters = nw_parameters_create_secure_tcp(configure_tls, + NW_PARAMETERS_DEFAULT_CONFIGURATION); + } + + nw_protocol_stack_t protocol_stack = nw_parameters_copy_default_protocol_stack(parameters); + if (g_family == AF_INET || g_family == AF_INET6) { + nw_protocol_options_t ip_options = nw_protocol_stack_copy_internet_protocol(protocol_stack); + if (g_family == AF_INET) { + // Force IPv4 + nw_ip_options_set_version(ip_options, nw_ip_version_4); + } else if (g_family == AF_INET6) { + // Force IPv6 + nw_ip_options_set_version(ip_options, nw_ip_version_6); + } + nw_release(ip_options); + } + nw_release(protocol_stack); + + // Bind to local address and port + if (g_local_addr || g_local_port) { + nw_endpoint_t local_endpoint = nw_endpoint_create_host(g_local_addr ? g_local_addr : "::", g_local_port ? g_local_port : "0"); + nw_parameters_set_local_endpoint(parameters, local_endpoint); + nw_release(local_endpoint); + } + + nw_connection_t connection = nw_connection_create(endpoint, parameters); + nw_release(endpoint); + nw_release(parameters); + + return connection; + } else { + return nil; } - return n; + + +} +void UDPSession::start_connection(nw_connection_t connection) +{ + if (__builtin_available(iOS 12, macOS 10.14,*)) { + nw_connection_set_queue(connection, dispatch_get_main_queue()); + + nw_retain(connection); // Hold a reference until cancelled + nw_connection_set_state_changed_handler(connection, ^(nw_connection_state_t state, nw_error_t error) { + nw_endpoint_t remote = nw_connection_copy_endpoint(connection); + errno = error ? nw_error_get_error_code(error) : 0; + if (state == nw_connection_state_waiting) { + warn("connect to %s port %u (%s) failed, is waiting", + nw_endpoint_get_hostname(remote), + nw_endpoint_get_port(remote), + g_use_udp ? "udp" : "tcp"); + } else if (state == nw_connection_state_failed) { + warn("connect to %s port %u (%s) failed", + nw_endpoint_get_hostname(remote), + nw_endpoint_get_port(remote), + g_use_udp ? "udp" : "tcp"); + } else if (state == nw_connection_state_ready) { + if (g_verbose) { + fprintf(stderr, "Connection to %s port %u (%s) succeeded!\n", + nw_endpoint_get_hostname(remote), + nw_endpoint_get_port(remote), + g_use_udp ? "udp" : "tcp"); + } + } else if (state == nw_connection_state_cancelled) { + // Release the primary reference on the connection + // that was taken at creation time + nw_release(connection); + } + nw_release(remote); + }); + + nw_connection_start(connection); + } + +} +/* + * start_send_receive_loop() + * Start reading from stdin (when not detached) and from the given connection. + * Every read on stdin becomes a send on the connection, and every receive on the + * connection becomes a write on stdout. + */ +void UDPSession::start_send_receive_loop() +{ + // Start reading from stdin + //this->send_loop(connection); + + // Start reading from connection + this->receive_loop(); +} +/* + * receive_loop() + * Perform a single read on the supplied connection, and write data to + * stdout as it is received. + * If no error is encountered, schedule another read on the same connection. + */ +void +UDPSession::receive_loop() +{ + nw_connection_t connection = this->outbound_connection; + if (__builtin_available(iOS 12, macOS 10.14,*)) { + nw_connection_receive(connection, 1, UINT32_MAX, ^(dispatch_data_t content, nw_content_context_t context, bool is_complete, nw_error_t receive_error) { + + dispatch_block_t schedule_next_receive = ^{ + // If the context is marked as complete, and is the final context, + // we're read-closed. + if (is_complete && + context != NULL && nw_content_context_get_is_final(context)) { + exit(0); + } + + // If there was no error in receiving, request more data + if (receive_error == NULL) { + receive_loop(); + } + }; + + if (content != NULL) { + // If there is content, write it to stdout asynchronously + schedule_next_receive = Block_copy(schedule_next_receive); + + //dump((char*)"UDP Update", m_buf, n); + //change by abigt + bool dataValid = false; + size_t outlen = 0; + size_t n = dispatch_data_get_size(content); + //size_t orgsize = n; + memcpy(m_buf, content, n); + char *out = (char *)m_buf; + //nonceSize = 16 + //outlen -= nonceSize; + out += nonceSize; + uint32_t sum = 0; + if (block != NULL) { + + block->decrypt(m_buf, n, &outlen); + + memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); + out += crcSize; + int32_t checksum = crc32_kr(0,(uint8_t *)out, n-cryptHeaderSize); + if (checksum == sum){ + dataValid = true; + + } + }else { + + memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); + out += crcSize; + int32_t checksum = crc32_kr(0,(uint8_t *)out, n - cryptHeaderSize); + if (checksum == sum){ + dataValid = true; + } + + } + if (outlen != n) { + debug_print("decrypt error outlen= %lu n = %lu\n",outlen,n); + } + if (dataValid == true) { + memmove(m_buf, m_buf + cryptHeaderSize, n-cryptHeaderSize); + KcpInPut(n - cryptHeaderSize); + } + long s, u; + IUINT64 value; + + struct timeval time; + gettimeofday(&time, NULL); + _itimeofday(&s, &u); + value = ((IUINT64) s) * 1000 + (u / 1000); + + + m_kcp->current = value & 0xfffffffful; + ikcp_flush(m_kcp); + + dispatch_async( dispatch_get_main_queue(), ^{ + schedule_next_receive(); + Block_release(schedule_next_receive); + }); + } else { + // Content was NULL, so directly schedule the next receive + schedule_next_receive(); + } + }); + } + +} +/* + * send_loop() + * Start reading from stdin on a dispatch source, and send any bytes on the given connection. + */ +void +UDPSession::send_loop(nw_connection_t connection, dispatch_data_t _Nonnull read_data){ + // Every send is marked as complete. This has no effect with the default message context for TCP, + // but is required for UDP to indicate the end of a packet. + if (__builtin_available(iOS 12,macOS 10.14, *)) { + nw_connection_send(connection, read_data, NW_CONNECTION_DEFAULT_MESSAGE_CONTEXT, true, ^(nw_error_t _Nullable error) { + if (error != NULL) { + errno = nw_error_get_error_code(error); + warn("send error"); + } else { + // Continue reading from stdin + //send_loop(connection); + } + }); + } + } diff --git a/sess.h b/sess.h index 2646533..bf71a68 100644 --- a/sess.h +++ b/sess.h @@ -5,12 +5,15 @@ #include "fec.h" #include #include +#include +#include #import "BlockCrypt.h" void dump(char *tag, char *text, int len); class UDPSession { private: int m_sockfd{0}; + nw_connection_t outbound_connection = NULL; ikcpcb *m_kcp{nullptr}; byte m_buf[2048]; byte m_streambuf[65535]; @@ -32,10 +35,10 @@ class UDPSession { static UDPSession *Dial(const char *ip, uint16_t port); // DialWithOptions connects to the remote address "raddr" on the network "udp" with packet encryption - static UDPSession *DialWithOptions(const char *ip, uint16_t port, size_t dataShards, size_t parityShards); + static UDPSession *DialWithOptions(const char *ip, const char *port, size_t dataShards, size_t parityShards); // DialWithOptions connects to the remote address "raddr" on the network "udp" with packet encryption with block - static UDPSession *DialWithOptions(const char *ip, uint16_t port, size_t dataShards, size_t parityShards,BlockCrypt *block); + static UDPSession *DialWithOptions(const char *ip, const char *port, size_t dataShards, size_t parityShards,BlockCrypt *block); // Update will try reading/writing udp packet, pass current unix millisecond void Update(uint32_t current) noexcept; @@ -66,7 +69,8 @@ class UDPSession { inline int WndSize(int sndwnd, int rcvwnd) { return ikcp_wndsize(m_kcp, sndwnd, rcvwnd); } inline int SetMtu(int mtu) { return ikcp_setmtu(m_kcp, mtu); } - + void receive_loop(); + void start_send_receive_loop(); private: UDPSession() = default; @@ -82,8 +86,13 @@ class UDPSession { ssize_t output(const void *buffer, size_t length); static UDPSession *createSession(int sockfd); - - + static UDPSession *createSession(nw_connection_t sockfd); + //new + static nw_connection_t create_outbound_connection(const char *, const char *); + void start_connection(nw_connection_t connection); + + void send_loop(nw_connection_t connection,dispatch_data_t _Nonnull read_data); + }; inline uint32_t currentMs() { From b48bf9f7f44455a48608962395ad5411ade1b397 Mon Sep 17 00:00:00 2001 From: yarshure Date: Mon, 22 Oct 2018 09:31:27 +0800 Subject: [PATCH 54/56] nw after first read ,then crash --- iOSLib/libkcp/libkcp/SFKcpTun.mm | 11 +++++++++-- sess.cpp | 20 +++++++++++++++----- sess.h | 2 +- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 655e6e5..c07e619 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -83,11 +83,15 @@ -(void)startUDPSession sess->SetDSCP(self.config.iptos); self.connected = true; - + } -(void)startWith:(tunConnected)connectd recv:(didRecvdata)recv disConnect:(tunConnected)disConnect { + if (__builtin_available(iOS 12, macOS 10.14,*)) { + sess->start_send_receive_loop(); + } + self.tunConnected = connectd; self.recvData = recv; self.disConnected = disConnect; @@ -122,7 +126,9 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(NSString*)port sess->SetDSCP(self.config.iptos); self.connected = true; - sess->start_send_receive_loop(); + if (__builtin_available(iOS 12, macOS 10.14,*)) { + sess->start_send_receive_loop(); + } [self runTest]; } @@ -264,6 +270,7 @@ -(void)runTest ssize_t n = sess->Read(buf, 4096); if (__builtin_available(iOS 12, macOS 10.14,*)) { + sess->NWUpdate(iclock()); }else { sess->Update(iclock()); } diff --git a/sess.cpp b/sess.cpp index fa5a41b..7d676b9 100644 --- a/sess.cpp +++ b/sess.cpp @@ -21,6 +21,7 @@ bool g_use_tls = false; // Use TLS or DTLS bool g_use_udp = true; // Use UDP instead of TCP bool g_verbose = false; // Verbose int g_family = AF_UNSPEC; // Required address family +dispatch_queue_t q = dispatch_queue_create("nw.socket.queue",NULL); #define NWCAT_BONJOUR_SERVICE_TCP_TYPE "_nwcat._tcp" #define NWCAT_BONJOUR_SERVICE_UDP_TYPE "_nwcat._udp" #define NWCAT_BONJOUR_SERVICE_DOMAIN "local" @@ -113,7 +114,7 @@ UDPSession * UDPSession::DialWithOptions(const char *ip, const char *port, size_t dataShards, size_t parityShards) { UDPSession *sess; if (__builtin_available(iOS 12,macOS 10.14, *)) { - + printf("nw event base udp socket"); nw_connection_t connection = create_outbound_connection(ip , port); if (connection == NULL) { @@ -270,6 +271,11 @@ UDPSession::Update(uint32_t current) noexcept { ikcp_flush(m_kcp); } void +UDPSession::NWUpdate(uint32_t current) noexcept { + m_kcp->current = current; + ikcp_flush(m_kcp); +} +void UDPSession::KcpInPut(size_t len) noexcept { if (fec.isEnabled()) { // decode FEC packet @@ -491,7 +497,7 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { ssize_t UDPSession::output(const void *buffer, size_t length) { dump((char*)"UDPSession write socket", (byte *)buffer, length); - if (__builtin_available(iOS 12, *)) { + if (__builtin_available(iOS 12,macOS 10.14, *)) { //send error check this->send_loop(this->outbound_connection, dispatch_data_create(buffer,length,nil,DISPATCH_DATA_DESTRUCTOR_DEFAULT)); return length; @@ -519,7 +525,7 @@ UDPSession::create_outbound_connection(const char *name, const char *port) { // If we are using bonjour to connect, treat the name as a bonjour name // Otherwise, treat the name as a hostname - if (__builtin_available(iOS 12, *)) { + if (__builtin_available(iOS 12,macOS 10.14, *)) { nw_endpoint_t endpoint = (g_use_bonjour ? nw_endpoint_create_bonjour_service(name, (g_use_udp ? NWCAT_BONJOUR_SERVICE_UDP_TYPE : NWCAT_BONJOUR_SERVICE_TCP_TYPE), @@ -588,7 +594,7 @@ UDPSession::create_outbound_connection(const char *name, const char *port) void UDPSession::start_connection(nw_connection_t connection) { if (__builtin_available(iOS 12, macOS 10.14,*)) { - nw_connection_set_queue(connection, dispatch_get_main_queue()); + nw_connection_set_queue(connection,q); nw_retain(connection); // Hold a reference until cancelled nw_connection_set_state_changed_handler(connection, ^(nw_connection_state_t state, nw_error_t error) { @@ -647,12 +653,14 @@ void UDPSession::receive_loop() { nw_connection_t connection = this->outbound_connection; + printf("nw start recvloop"); if (__builtin_available(iOS 12, macOS 10.14,*)) { nw_connection_receive(connection, 1, UINT32_MAX, ^(dispatch_data_t content, nw_content_context_t context, bool is_complete, nw_error_t receive_error) { dispatch_block_t schedule_next_receive = ^{ // If the context is marked as complete, and is the final context, // we're read-closed. +#pragma mark todo fixme ,crash here if (is_complete && context != NULL && nw_content_context_get_is_final(context)) { exit(0); @@ -720,7 +728,8 @@ UDPSession::receive_loop() m_kcp->current = value & 0xfffffffful; ikcp_flush(m_kcp); - dispatch_async( dispatch_get_main_queue(), ^{ + dispatch_async( q, ^{ + // Block_retain(schedule_next_receive); schedule_next_receive(); Block_release(schedule_next_receive); }); @@ -740,6 +749,7 @@ void UDPSession::send_loop(nw_connection_t connection, dispatch_data_t _Nonnull read_data){ // Every send is marked as complete. This has no effect with the default message context for TCP, // but is required for UDP to indicate the end of a packet. + printf("nw send data!\n"); if (__builtin_available(iOS 12,macOS 10.14, *)) { nw_connection_send(connection, read_data, NW_CONNECTION_DEFAULT_MESSAGE_CONTEXT, true, ^(nw_error_t _Nullable error) { if (error != NULL) { diff --git a/sess.h b/sess.h index bf71a68..734fbaa 100644 --- a/sess.h +++ b/sess.h @@ -41,7 +41,7 @@ class UDPSession { static UDPSession *DialWithOptions(const char *ip, const char *port, size_t dataShards, size_t parityShards,BlockCrypt *block); // Update will try reading/writing udp packet, pass current unix millisecond void Update(uint32_t current) noexcept; - + void NWUpdate(uint32_t current) noexcept; //kcpInput go UDPpsession void KcpInPut(size_t len) noexcept; // Destroy release all resource related. From a555240973f7544e48e29e0099cbb9119f2a1db1 Mon Sep 17 00:00:00 2001 From: yarshure Date: Mon, 29 Oct 2018 09:53:59 +0800 Subject: [PATCH 55/56] fix nw_content_context_t release issue todo test --- sess.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sess.cpp b/sess.cpp index 7d676b9..57d7e36 100644 --- a/sess.cpp +++ b/sess.cpp @@ -657,12 +657,14 @@ UDPSession::receive_loop() if (__builtin_available(iOS 12, macOS 10.14,*)) { nw_connection_receive(connection, 1, UINT32_MAX, ^(dispatch_data_t content, nw_content_context_t context, bool is_complete, nw_error_t receive_error) { + CFRetain(context); dispatch_block_t schedule_next_receive = ^{ // If the context is marked as complete, and is the final context, // we're read-closed. -#pragma mark todo fixme ,crash here if (is_complete && + context != NULL && nw_content_context_get_is_final(context)) { + CFRelease(context); exit(0); } @@ -670,6 +672,7 @@ UDPSession::receive_loop() if (receive_error == NULL) { receive_loop(); } + CFRelease(context); }; if (content != NULL) { From db8576840d7d948634ef2f6ee81e9ad2bbf40ae8 Mon Sep 17 00:00:00 2001 From: yarshure Date: Tue, 8 Jan 2019 11:19:22 +0800 Subject: [PATCH 56/56] nw base socket work now --- .../libkcp/kcptest/Base.lproj/Main.storyboard | 78 +++++--- iOSLib/libkcp/kcptest/ViewController.h | 4 +- iOSLib/libkcp/kcptest/ViewController.mm | 19 +- iOSLib/libkcp/libkcp/SFKcpTun.mm | 90 ++++----- ikcp.c | 4 +- sess.cpp | 173 ++++++++++-------- sess.h | 5 +- 7 files changed, 208 insertions(+), 165 deletions(-) diff --git a/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard b/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard index c6ea327..f1f2b3b 100644 --- a/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard +++ b/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard @@ -1,11 +1,11 @@ - + - + @@ -21,78 +21,102 @@ - + + + + + + + + + + + + + + + + + + + + + diff --git a/iOSLib/libkcp/kcptest/ViewController.h b/iOSLib/libkcp/kcptest/ViewController.h index f539c99..6b77835 100644 --- a/iOSLib/libkcp/kcptest/ViewController.h +++ b/iOSLib/libkcp/kcptest/ViewController.h @@ -8,8 +8,8 @@ #import #import "kcp.h" -#include "sodium.h" -@interface ViewController : UIViewController +//#include "sodium.h" +@interface ViewController : UIViewController @end diff --git a/iOSLib/libkcp/kcptest/ViewController.mm b/iOSLib/libkcp/kcptest/ViewController.mm index 0b64334..ebae1d5 100644 --- a/iOSLib/libkcp/kcptest/ViewController.mm +++ b/iOSLib/libkcp/kcptest/ViewController.mm @@ -115,16 +115,25 @@ -(void)testB{ - (IBAction)go:(id)sender { //kcptest(, ); const char *addr = [self.addr.text UTF8String]; - NSInteger port = [self.port.text integerValue]; + NSString *port= self.port.text; + if (self.dispatchqueue == nil) { + self.dispatchqueue = dispatch_queue_create("tun", nil); + } if (self.tun == nil) { TunConfig *c = [[TunConfig alloc] init]; c.dataShards = 2; c.parityShards = 2; c.iptos = 46; - c.crypt = @"aes"; - c.key = [@"1234567890123456789012345678901234567890" dataUsingEncoding:NSUTF8StringEncoding]; + c.crypt = @"none"; + c.key = [@"" dataUsingEncoding:NSUTF8StringEncoding]; self.tun = [[SFKcpTun alloc] initWithConfig:c ipaddr:self.addr.text port:port queue:self.dispatchqueue]; - self.tun.delegate = self; + [self.tun startWith:^(SFKcpTun * _Nonnull tun) { + printf("connected"); + } recv:^(SFKcpTun * _Nonnull tun, NSData * _Nonnull d) { + NSLog(@"recv:%@",d); + } disConnect:^(SFKcpTun * _Nonnull tun) { + printf("disConnect"); + }]; } } @@ -141,7 +150,7 @@ - (IBAction)stop:(id)sender { } -(void)sendtest { - for (int i = 0; i < 2; i++) { + for (int i = 0; i < 1; i++) { NSString *msg = [NSString stringWithFormat:@"message %d",i]; NSData *d = [msg dataUsingEncoding:NSUTF8StringEncoding]; //char *ptr = (char *)BlockCrypt::ramdonBytes(40960); diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index c07e619..734c26e 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -68,7 +68,7 @@ -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(NSString -(void)startUDPSession { if (self.config.key.length > 0 && ![self.config.crypt isEqualToString:@"none"]){ - + NSLog(@"tun config crypt %@,key:%@",self.config.crypt,self.config.key); BlockCrypt *block = BlockCrypt::blockWith(self.config.key.bytes, self.config.crypt.UTF8String); sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port.UTF8String, self.config.dataShards,self.config.parityShards,block); }else { @@ -88,15 +88,6 @@ -(void)startUDPSession } -(void)startWith:(tunConnected)connectd recv:(didRecvdata)recv disConnect:(tunConnected)disConnect { - if (__builtin_available(iOS 12, macOS 10.14,*)) { - sess->start_send_receive_loop(); - } - - self.tunConnected = connectd; - self.recvData = recv; - self.disConnected = disConnect; - sess->start_send_receive_loop(); - [self runTest]; __weak SFKcpTun *weakSelf = self; if ( self.connected ) { dispatch_async(self.dispatchqueue, ^{ @@ -104,6 +95,23 @@ -(void)startWith:(tunConnected)connectd recv:(didRecvdata)recv disConnect:(tunCo }); } + self.tunConnected = connectd; + self.recvData = recv; + self.disConnected = disConnect; + + if (__builtin_available(iOS 12, macOS 10.14,*)) { + sess->start_send_receive_loop(^(char *buffer, size_t len) { + NSData *d = [NSData dataWithBytes:buffer length:len]; + + dispatch_async(self.dispatchqueue, ^{ + weakSelf.recvData(weakSelf, d); + + }); + + }); + }else { + [self checkLoop]; + } } -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(NSString*)port { @@ -126,10 +134,8 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(NSString*)port sess->SetDSCP(self.config.iptos); self.connected = true; - if (__builtin_available(iOS 12, macOS 10.14,*)) { - sess->start_send_receive_loop(); - } - [self runTest]; + + [self checkLoop]; } -(void)runDispatchTimer @@ -229,7 +235,12 @@ -(void)input:(NSData*)data{ ptr += sended; //NSLog(@"KCPTun sended:%zu, totoal:= %zu",sended,tosend); //不能并行接收网络数据,效率有折扣 - //sess->Update(iclock()); + if (__builtin_available(iOS 12,macOS 10.14, *)) { + sess->NWUpdate(iclock()); + }else { + sess->Update(iclock()); + } + } if (sended == [data length]) { NSLog(@"KCPTun sent %zu",sended); @@ -246,7 +257,7 @@ -(void)input:(NSData*)data{ } --(void)runTest +-(void)checkLoop { __weak SFKcpTun *weakSelf = self; dispatch_async(self->queue, ^{ size_t total = 0; @@ -267,15 +278,11 @@ -(void)runTest char *buf = (char *) malloc(4096); memset(buf, 0, 4096); - ssize_t n = sess->Read(buf, 4096); - - if (__builtin_available(iOS 12, macOS 10.14,*)) { - sess->NWUpdate(iclock()); - }else { - sess->Update(iclock()); - } - + ssize_t n = 0; + n = sess->Read(buf, 4096); + sess->Update(iclock()); + if (n > 0 ){ @autoreleasepool { NSData *d = [NSData dataWithBytes:buf length:n]; @@ -292,33 +299,13 @@ -(void)runTest #include "TargetConditionals.h" #if TARGET_IPHONE_SIMULATOR - // iOS Simulator + #elif TARGET_OS_IPHONE -// if (valueCont > 10) { -// valueCont = 0; -// usleep(10000); -// }else { -// usleep(1000); -// } -// -// valueCont++; - // iOS device + #elif TARGET_OS_MAC -// if (zeroCount > 3) { -// zeroCount = 0; -// usleep(3300); -// }else { -// usleep(1000); -// } -// -// zeroCount++; - - //usleep(1000); - // Other kinds of Mac OS #else # error "Unknown Apple platform" #endif - }else { #if TARGET_IPHONE_SIMULATOR @@ -334,18 +321,14 @@ -(void)runTest // iOS device #elif TARGET_OS_MAC - NSLog(@"session Update"); + //NSLog(@"session Update"); usleep(1000); // Other kinds of Mac OS #else # error "Unknown Apple platform" #endif - } free(buf); - - - } } @@ -456,11 +439,6 @@ -(NSDictionary *)address while (cursor != NULL) { NSLog(@"cursor->ifa_name = %s", cursor->ifa_name); - - // if (strncmp(cursor->ifa_name, "pdp_ip", 6) == 0) - // { - // - // } if (cursor->ifa_addr->sa_family == AF_INET) { struct sockaddr_in *addr = (struct sockaddr_in *)cursor->ifa_addr; diff --git a/ikcp.c b/ikcp.c index 61b9a11..9f12b0d 100644 --- a/ikcp.c +++ b/ikcp.c @@ -772,7 +772,7 @@ int ikcp_input(ikcpcb *kcp, const char *data, long size) size -= IKCP_OVERHEAD; - if ((long)size < (long)len) return -2; + if ((long)size < (long)len || (int)len < 0) return -2; if (cmd != IKCP_CMD_PUSH && cmd != IKCP_CMD_ACK && cmd != IKCP_CMD_WASK && cmd != IKCP_CMD_WINS) @@ -1029,7 +1029,7 @@ void ikcp_flush(ikcpcb *kcp) // flush data segments for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = p->next) { IKCPSEG *segment = iqueue_entry(p, IKCPSEG, node); - int needsend = 0; + int needsend = 0; //EXC_BAD_ACCESS (code=1, address=0xf00000000000003c) if (segment->xmit == 0) { needsend = 1; diff --git a/sess.cpp b/sess.cpp index 57d7e36..e873f38 100644 --- a/sess.cpp +++ b/sess.cpp @@ -21,6 +21,7 @@ bool g_use_tls = false; // Use TLS or DTLS bool g_use_udp = true; // Use UDP instead of TCP bool g_verbose = false; // Verbose int g_family = AF_UNSPEC; // Required address family + dispatch_queue_t q = dispatch_queue_create("nw.socket.queue",NULL); #define NWCAT_BONJOUR_SERVICE_TCP_TYPE "_nwcat._tcp" #define NWCAT_BONJOUR_SERVICE_UDP_TYPE "_nwcat._udp" @@ -48,7 +49,7 @@ const size_t cryptHeaderSize = nonceSize + crcSize; // FEC keeps rxFECMulti* (dataShard+parityShard) ordered packets in memory const size_t rxFECMulti = 3; -#define KCP_DEBUG 0 +#define KCP_DEBUG 1 void dump(char *tag, byte *text, size_t len) { @@ -87,10 +88,6 @@ UDPSession::Dial(const char *ip, uint16_t port) { } int sockfd = socket(PF_INET, SOCK_DGRAM, 0); - - - - if (sockfd == -1) { return nullptr; } @@ -205,7 +202,7 @@ UDPSession::createSession(nw_connection_t sockfd) { sess->outbound_connection = sockfd; sess->m_kcp = ikcp_create(IUINT32(rand()), sess); sess->m_kcp->output = sess->out_wrapper; - + //sess->buffer_used = 0; return sess; } //recv data from udp socket @@ -215,7 +212,7 @@ UDPSession::Update(uint32_t current) noexcept { for (;;) { ssize_t n = recv(m_sockfd, m_buf, sizeof(m_buf), 0); if (n < 0) { - //perror("read fopen( \"nulltest.txt\", \"r\" )"); + //perror("read fopen( \"null test.txt\", \"r\" )"); debug_print("kcp udp socket read error"); //break; @@ -227,7 +224,6 @@ UDPSession::Update(uint32_t current) noexcept { size_t outlen = n; //size_t orgsize = n; char *out = (char *)m_buf; - //nonceSize = 16 //outlen -= nonceSize; out += nonceSize; uint32_t sum = 0; @@ -267,8 +263,7 @@ UDPSession::Update(uint32_t current) noexcept { break; } } - m_kcp->current = current; - ikcp_flush(m_kcp); + this->NWUpdate(current); } void UDPSession::NWUpdate(uint32_t current) noexcept { @@ -483,10 +478,6 @@ UDPSession::out_wrapper(const char *buf, int len, struct IKCPCB *, void *user) { // reset indexing sess->pkt_idx = 0; } - - - - } else { // No FEC, just send raw bytes, //kcp-tun no use this sess->output(buf, static_cast(len)); @@ -526,11 +517,7 @@ UDPSession::create_outbound_connection(const char *name, const char *port) // If we are using bonjour to connect, treat the name as a bonjour name // Otherwise, treat the name as a hostname if (__builtin_available(iOS 12,macOS 10.14, *)) { - nw_endpoint_t endpoint = (g_use_bonjour ? - nw_endpoint_create_bonjour_service(name, - (g_use_udp ? NWCAT_BONJOUR_SERVICE_UDP_TYPE : NWCAT_BONJOUR_SERVICE_TCP_TYPE), - NWCAT_BONJOUR_SERVICE_DOMAIN) : - nw_endpoint_create_host(name, port)); + nw_endpoint_t endpoint = nw_endpoint_create_host(name, port); nw_parameters_t parameters = NULL; nw_parameters_configure_protocol_block_t configure_tls = NW_PARAMETERS_DISABLE_PROTOCOL; @@ -635,12 +622,10 @@ void UDPSession::start_connection(nw_connection_t connection) * Every read on stdin becomes a send on the connection, and every receive on the * connection becomes a write on stdout. */ -void UDPSession::start_send_receive_loop() +void UDPSession::start_send_receive_loop(recvBlock didRecv) { - // Start reading from stdin - //this->send_loop(connection); - // Start reading from connection + this->didRecv = Block_copy(didRecv); this->receive_loop(); } /* @@ -653,9 +638,9 @@ void UDPSession::receive_loop() { nw_connection_t connection = this->outbound_connection; - printf("nw start recvloop"); + printf("nw start recvloop\n"); if (__builtin_available(iOS 12, macOS 10.14,*)) { - nw_connection_receive(connection, 1, UINT32_MAX, ^(dispatch_data_t content, nw_content_context_t context, bool is_complete, nw_error_t receive_error) { + nw_connection_receive(connection, 1, 2048, ^(dispatch_data_t content, nw_content_context_t context, bool is_complete, nw_error_t receive_error) { CFRetain(context); dispatch_block_t schedule_next_receive = ^{ @@ -669,8 +654,28 @@ UDPSession::receive_loop() } // If there was no error in receiving, request more data + + + + if (is_complete) { + + long s, u; + IUINT64 value; + struct timeval time; + gettimeofday(&time, NULL); + _itimeofday(&s, &u); + value = ((IUINT64) s) * 1000 + (u / 1000); + this->NWUpdate(value & 0xfffffffful); + // this->buffer_used = 0 ; + }else { + printf("is_complete false \n"); + } + + if (receive_error == NULL) { + receive_loop(); + } CFRelease(context); }; @@ -679,57 +684,79 @@ UDPSession::receive_loop() // If there is content, write it to stdout asynchronously schedule_next_receive = Block_copy(schedule_next_receive); - //dump((char*)"UDP Update", m_buf, n); - //change by abigt - bool dataValid = false; - size_t outlen = 0; - size_t n = dispatch_data_get_size(content); - //size_t orgsize = n; - memcpy(m_buf, content, n); - char *out = (char *)m_buf; - //nonceSize = 16 - //outlen -= nonceSize; - out += nonceSize; - uint32_t sum = 0; - if (block != NULL) { + if (is_complete) { + - block->decrypt(m_buf, n, &outlen); + //change by abigt + bool dataValid = false; - memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); - out += crcSize; - int32_t checksum = crc32_kr(0,(uint8_t *)out, n-cryptHeaderSize); - if (checksum == sum){ - dataValid = true; + size_t n = dispatch_data_get_size(content); + printf("current read complete new data:%ld\n",n); + __block size_t buffer_used = 0; + dispatch_data_apply(content, ^bool(dispatch_data_t region, size_t offset, const void *buffer, size_t size) { + fprintf(stderr, "region with offset %zu, size %zu\n", offset, size); + memcpy(m_buf+buffer_used, (char*)buffer + offset, size); + buffer_used += size; + return true; + }); + + dump((char*)"UDP Update", m_buf, n); + size_t outlen = n; + char *out = (char *)m_buf; + + + //outlen -= nonceSize; + out += nonceSize; + uint32_t sum = 0; + if (block != NULL) { + + block->decrypt(m_buf, n, &outlen); + memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); + out += crcSize; + int32_t checksum = crc32_kr(0,(uint8_t *)out, n-cryptHeaderSize); + if (checksum == sum){ + dataValid = true; + + } + }else { + //dump((char*)"check sum", out, n - (size_t)nonceSize); + memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); + out += crcSize; + int32_t checksum = crc32_kr(0,(uint8_t *)out, n - cryptHeaderSize); + if (checksum == sum){ + dataValid = true; + } } - }else { - memcpy(&sum, (uint8_t *)out, sizeof(uint32_t)); - out += crcSize; - int32_t checksum = crc32_kr(0,(uint8_t *)out, n - cryptHeaderSize); - if (checksum == sum){ - dataValid = true; + if (dataValid == true) { + memmove(m_buf, m_buf + cryptHeaderSize, n-cryptHeaderSize); + + KcpInPut( n-cryptHeaderSize); + char *buf = (char *) malloc(4096); + memset(buf, 0, 4096); + ssize_t nn = 0; + nn = this->Read(buf, 4096); + if(nn > 0 && this->didRecv != nil){ + this->didRecv(buf,nn); + }else { + printf("no date recv!\n"); + } + free(buf); + }else { + fprintf(stderr," dataValid failure\n"); } + + + + }else { + //don't go here + fprintf(stderr," don't go here\n"); +// size_t n = dispatch_data_get_size(content); +// memcpy(m_buf+this->buffer_used, content, n); +// this->buffer_used += n; } - if (outlen != n) { - debug_print("decrypt error outlen= %lu n = %lu\n",outlen,n); - } - if (dataValid == true) { - memmove(m_buf, m_buf + cryptHeaderSize, n-cryptHeaderSize); - KcpInPut(n - cryptHeaderSize); - } - long s, u; - IUINT64 value; - - struct timeval time; - gettimeofday(&time, NULL); - _itimeofday(&s, &u); - value = ((IUINT64) s) * 1000 + (u / 1000); - - - m_kcp->current = value & 0xfffffffful; - ikcp_flush(m_kcp); dispatch_async( q, ^{ // Block_retain(schedule_next_receive); @@ -738,6 +765,8 @@ UDPSession::receive_loop() }); } else { // Content was NULL, so directly schedule the next receive + //update kcp + schedule_next_receive(); } }); @@ -749,18 +778,18 @@ UDPSession::receive_loop() * Start reading from stdin on a dispatch source, and send any bytes on the given connection. */ void -UDPSession::send_loop(nw_connection_t connection, dispatch_data_t _Nonnull read_data){ +UDPSession::send_loop(nw_connection_t connection, dispatch_data_t _Nonnull write_data){ // Every send is marked as complete. This has no effect with the default message context for TCP, // but is required for UDP to indicate the end of a packet. printf("nw send data!\n"); if (__builtin_available(iOS 12,macOS 10.14, *)) { - nw_connection_send(connection, read_data, NW_CONNECTION_DEFAULT_MESSAGE_CONTEXT, true, ^(nw_error_t _Nullable error) { + nw_connection_send(connection, write_data, NW_CONNECTION_DEFAULT_MESSAGE_CONTEXT, true, ^(nw_error_t _Nullable error) { if (error != NULL) { errno = nw_error_get_error_code(error); - warn("send error"); + warn("send error %d",errno); } else { - // Continue reading from stdin //send_loop(connection); + printf("send fin\n"); } }); } diff --git a/sess.h b/sess.h index 734fbaa..e20d73b 100644 --- a/sess.h +++ b/sess.h @@ -8,11 +8,13 @@ #include #include #import "BlockCrypt.h" +typedef void (^recvBlock)(char* buffer,size_t len); void dump(char *tag, char *text, int len); class UDPSession { private: int m_sockfd{0}; + //size_t buffer_used; nw_connection_t outbound_connection = NULL; ikcpcb *m_kcp{nullptr}; byte m_buf[2048]; @@ -57,6 +59,7 @@ class UDPSession { int SetDSCP(int dscp) noexcept; char *getLocalIPAddr() noexcept; + recvBlock didRecv; int getLocalPort() noexcept; // SetStreamMode toggles the stream mode on/off void SetStreamMode(bool enable) noexcept; @@ -70,7 +73,7 @@ class UDPSession { inline int SetMtu(int mtu) { return ikcp_setmtu(m_kcp, mtu); } void receive_loop(); - void start_send_receive_loop(); + void start_send_receive_loop(recvBlock didRecv); private: UDPSession() = default;
WfL)ZWun77W?4@G1GN3M0CB$X(E;dwQcHH#?@ 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 z
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 {V||V`vG?Y|*w}K3YtV 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ξ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
C^5w%?;C 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 literal 0 HcmV?d00001 diff --git a/kcp_test.cpp b/kcp_test.mm similarity index 91% rename from kcp_test.cpp rename to kcp_test.mm index c513bd2..0a36e69 100644 --- a/kcp_test.cpp +++ b/kcp_test.mm @@ -6,12 +6,12 @@ IUINT32 iclock(); -int main() { +int kcptest(const char *addr,int port) { struct timeval time; gettimeofday(&time, NULL); srand((time.tv_sec * 1000) + (time.tv_usec / 1000)); - UDPSession *sess = UDPSession::DialWithOptions("127.0.0.1", 9999, 2,2); + UDPSession *sess = UDPSession::DialWithOptions(addr, port, 2,2); sess->NoDelay(1, 20, 2, 1); sess->WndSize(128, 128); sess->SetMtu(1400); @@ -39,6 +39,7 @@ int main() { } UDPSession::Destroy(sess); + return 0 ; } From f9315ea49ec4a5e298d21f6a5286c0d8e9712c0d Mon Sep 17 00:00:00 2001 From: abigt Date: Fri, 28 Apr 2017 13:14:41 +0800 Subject: [PATCH 02/56] test target --- .../UserInterfaceState.xcuserstate | Bin 22718 -> 22718 bytes .../xcschemes/kcptest.xcscheme | 91 ++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/kcptest.xcscheme diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate index 73506c847e75a4ef497051091916348b5618c5a3..2eadf80f01efdf988fb25213a523eb17431bf7d8 100644 GIT binary patch delta 29 kcmdnDk#XNf#tojLEPrQPPv7h-Y9s|@MNQk>tZ%Ie0KUEq6951J delta 29 kcmdnDk#XNf#tojLEbo0pUTpRiHIf3djEgom>sxCA0JXpiH~;_u diff --git a/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/kcptest.xcscheme b/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/kcptest.xcscheme new file mode 100644 index 0000000..bf8dd92 --- /dev/null +++ b/iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/kcptest.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 227432949bf57fc341b4e2bb689ff6f100cec58d Mon Sep 17 00:00:00 2001 From: abigt Date: Fri, 28 Apr 2017 14:21:46 +0800 Subject: [PATCH 03/56] add object bridge --- .../libkcp/libkcp.xcodeproj/project.pbxproj | 28 ++++- .../UserInterfaceState.xcuserstate | Bin 22718 -> 35518 bytes iOSLib/libkcp/libkcp/SFKcpTun.h | 31 ++++++ iOSLib/libkcp/libkcp/SFKcpTun.mm | 97 ++++++++++++++++++ iOSLib/libkcp/libkcp/TunConfig.h | 28 +++++ iOSLib/libkcp/libkcp/TunConfig.m | 31 ++++++ kcp_test.mm | 19 ---- 7 files changed, 213 insertions(+), 21 deletions(-) create mode 100644 iOSLib/libkcp/libkcp/SFKcpTun.h create mode 100644 iOSLib/libkcp/libkcp/SFKcpTun.mm create mode 100644 iOSLib/libkcp/libkcp/TunConfig.h create mode 100644 iOSLib/libkcp/libkcp/TunConfig.m diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 6802778..954992e 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -32,11 +32,15 @@ 692AE3611EB2EF83006A4B9D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 692AE35F1EB2EF83006A4B9D /* Main.storyboard */; }; 692AE3631EB2EF83006A4B9D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 692AE3621EB2EF83006A4B9D /* Assets.xcassets */; }; 692AE3661EB2EF83006A4B9D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 692AE3641EB2EF83006A4B9D /* LaunchScreen.storyboard */; }; - 692AE36C1EB2EF91006A4B9D /* kcp_test.mm in Sources */ = {isa = PBXBuildFile; fileRef = 692AE36B1EB2EF91006A4B9D /* kcp_test.mm */; }; 692AE36D1EB2EF9C006A4B9D /* libkcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; }; 692AE3711EB2F191006A4B9D /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3701EB2F191006A4B9D /* libc++.tbd */; }; 69C757811EB2F96D00139321 /* libkcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; }; 69C757821EB2F96D00139321 /* libkcp.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 69FFC6A01EB30985008A030D /* SFKcpTun.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC69E1EB30985008A030D /* SFKcpTun.h */; }; + 69FFC6A11EB30985008A030D /* SFKcpTun.mm in Sources */ = {isa = PBXBuildFile; fileRef = 69FFC69F1EB30985008A030D /* SFKcpTun.mm */; }; + 69FFC6A51EB309E8008A030D /* TunConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC6A31EB309E8008A030D /* TunConfig.h */; }; + 69FFC6A61EB309E8008A030D /* TunConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 69FFC6A41EB309E8008A030D /* TunConfig.m */; }; + 69FFC6A71EB316D5008A030D /* kcp_test.mm in Sources */ = {isa = PBXBuildFile; fileRef = 692AE36B1EB2EF91006A4B9D /* kcp_test.mm */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -98,6 +102,10 @@ 692AE36B1EB2EF91006A4B9D /* kcp_test.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = kcp_test.mm; path = ../../../kcp_test.mm; sourceTree = ""; }; 692AE36E1EB2F07B006A4B9D /* test.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = test.h; sourceTree = ""; }; 692AE3701EB2F191006A4B9D /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; + 69FFC69E1EB30985008A030D /* SFKcpTun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFKcpTun.h; path = libkcp/SFKcpTun.h; sourceTree = SOURCE_ROOT; }; + 69FFC69F1EB30985008A030D /* SFKcpTun.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SFKcpTun.mm; path = libkcp/SFKcpTun.mm; sourceTree = SOURCE_ROOT; }; + 69FFC6A31EB309E8008A030D /* TunConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TunConfig.h; path = libkcp/TunConfig.h; sourceTree = ""; }; + 69FFC6A41EB309E8008A030D /* TunConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TunConfig.m; path = libkcp/TunConfig.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -124,6 +132,7 @@ 692AE3171EB2EE59006A4B9D = { isa = PBXGroup; children = ( + 69FFC6A21EB3098C008A030D /* tun_smux */, 692AE3231EB2EE59006A4B9D /* libkcp */, 692AE3551EB2EF83006A4B9D /* kcptest */, 692AE3221EB2EE59006A4B9D /* Products */, @@ -201,6 +210,17 @@ name = Frameworks; sourceTree = ""; }; + 69FFC6A21EB3098C008A030D /* tun_smux */ = { + isa = PBXGroup; + children = ( + 69FFC69E1EB30985008A030D /* SFKcpTun.h */, + 69FFC69F1EB30985008A030D /* SFKcpTun.mm */, + 69FFC6A31EB309E8008A030D /* TunConfig.h */, + 69FFC6A41EB309E8008A030D /* TunConfig.m */, + ); + name = tun_smux; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -209,6 +229,8 @@ buildActionMask = 2147483647; files = ( 692AE34A1EB2EF1C006A4B9D /* galois_noasm.h in Headers */, + 69FFC6A01EB30985008A030D /* SFKcpTun.h in Headers */, + 69FFC6A51EB309E8008A030D /* TunConfig.h in Headers */, 692AE34F1EB2EF25006A4B9D /* encoding.h in Headers */, 692AE33F1EB2EF0B006A4B9D /* inversion_tree.h in Headers */, 692AE3371EB2EEEF006A4B9D /* reedsolomon.h in Headers */, @@ -329,10 +351,12 @@ 692AE3491EB2EF1C006A4B9D /* galois_noasm.cpp in Sources */, 692AE33A1EB2EEF9006A4B9D /* matrix.cpp in Sources */, 692AE33E1EB2EF0B006A4B9D /* inversion_tree.cpp in Sources */, + 69FFC6A61EB309E8008A030D /* TunConfig.m in Sources */, 692AE32F1EB2EEB0006A4B9D /* ikcp.c in Sources */, 692AE34C1EB2EF1C006A4B9D /* galois.cpp in Sources */, 692AE32D1EB2EE98006A4B9D /* fec.cpp in Sources */, 692AE34B1EB2EF1C006A4B9D /* galois_table.c in Sources */, + 69FFC6A11EB30985008A030D /* SFKcpTun.mm in Sources */, 692AE3311EB2EEBD006A4B9D /* sess.cpp in Sources */, 692AE3361EB2EEEF006A4B9D /* reedsolomon.cpp in Sources */, ); @@ -342,9 +366,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 69FFC6A71EB316D5008A030D /* kcp_test.mm in Sources */, 692AE35E1EB2EF83006A4B9D /* ViewController.mm in Sources */, 692AE35B1EB2EF83006A4B9D /* AppDelegate.mm in Sources */, - 692AE36C1EB2EF91006A4B9D /* kcp_test.mm in Sources */, 692AE3581EB2EF83006A4B9D /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate index 2eadf80f01efdf988fb25213a523eb17431bf7d8..58faeb9618fff45b4135464e5c9b54b1ea4d58a8 100644 GIT binary patch literal 35518 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 +#import "TunConfig.h" +@class SFKcpTun; +@protocol SFKcpTunDelegate +-(void)connected:(SFKcpTun*)tun; +-(void)disConnected:(SFKcpTun*)tun; +-(void)tunError:(SFKcpTun*)tun error:(NSError*)error; +-(void)didRecevied:(NSData*)data; +@end +@interface SFKcpTun : NSObject +@property (strong,nonatomic) TunConfig *config; +@property (strong,nonatomic) NSString *server; +@property (weak,nonatomic) NSObject *delegate; +@property (nonatomic) int port; +@property (nonatomic) BOOL connected; +-(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port; + +-(void)startUDPSession; +-(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port; +-(void)shutdownUDPSession; +-(void)input:(NSData*)data; + +@end diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm new file mode 100644 index 0000000..aaa596d --- /dev/null +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -0,0 +1,97 @@ +// +// SFKcpTun.m +// libkcp +// +// Created by 孔祥波 on 28/04/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// +#include +#include +#include +#include +#include "sess.h" +#import "SFKcpTun.h" +UDPSession *sess; + +void +itimeofday(long *sec, long *usec) { + struct timeval time; + gettimeofday(&time, NULL); + if (sec) *sec = time.tv_sec; + if (usec) *usec = time.tv_usec; +} + +IUINT64 iclock64(void) { + long s, u; + IUINT64 value; + itimeofday(&s, &u); + value = ((IUINT64) s) * 1000 + (u / 1000); + return value; +} + +IUINT32 iclock() { + return (IUINT32) (iclock64() & 0xfffffffful); +} +@interface SFKcpTun () +//@property (weak, nonatomic) UDPSession *sess; +//@property (strong, nonatomic) UITextField *port; + +@end + +@implementation SFKcpTun +-(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port +{ + if (self = [super init]){ + self.config = c; + self.server = ip; + self.port = port; + + } + return self; +} +-(void)startUDPSession +{ + sess = UDPSession::DialWithOptions(self.server.UTF8String, self.port, self.config.dataShards,self.config.parityShards); + sess->NoDelay(self.config.nodelay, self.config.interval, self.config.resend, self.config.nc); + sess->WndSize(self.config.sndwnd, self.config.rcvwnd); + sess->SetMtu(self.config.mtu); + sess->SetStreamMode(true); + sess->SetDSCP(self.config.iptos); + + assert(sess != nullptr); + +} +-(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port +{ + sess = UDPSession::DialWithOptions(ip.UTF8String, port, self.config.dataShards,self.config.parityShards); + sess->NoDelay(self.config.nodelay, self.config.interval, self.config.resend, self.config.nc); + sess->WndSize(self.config.sndwnd, self.config.rcvwnd); + sess->SetMtu(self.config.mtu); + sess->SetStreamMode(true); + sess->SetDSCP(self.config.iptos); + + assert(sess != nullptr); + +} +-(void)shutdownUDPSession +{ + UDPSession::Destroy(sess); + +} +-(void)input:(NSData*)data{ + + assert(sess != nullptr); + + sess->Write((char *)data.bytes, data.length); + sess->Update(iclock()); +} +-(void)run{ + dispatch_queue_t q = dispatch_queue_create("com.abigt.kcp", nil); + dispatch_async(q, ^{ + char *buf = (char *) malloc(128); + memset(buf, 0, 128); + ssize_t n = sess->Read(buf, 128); + sess->Update(iclock()); + }); +} +@end diff --git a/iOSLib/libkcp/libkcp/TunConfig.h b/iOSLib/libkcp/libkcp/TunConfig.h new file mode 100644 index 0000000..db89d87 --- /dev/null +++ b/iOSLib/libkcp/libkcp/TunConfig.h @@ -0,0 +1,28 @@ +// +// TunConfig.h +// libkcp +// +// Created by 孔祥波 on 28/04/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#import + +@interface TunConfig : NSObject +//DialWithOptions +@property (nonatomic) int dataShards; +@property (nonatomic) int parityShards; + +@property (nonatomic) int nodelay; +@property (nonatomic) int interval; +@property (nonatomic) int resend; +@property (nonatomic) int nc; + +@property (nonatomic) int sndwnd; +@property (nonatomic) int rcvwnd; + +@property (nonatomic) int mtu; + +@property (nonatomic) int iptos; + +@end diff --git a/iOSLib/libkcp/libkcp/TunConfig.m b/iOSLib/libkcp/libkcp/TunConfig.m new file mode 100644 index 0000000..dda7672 --- /dev/null +++ b/iOSLib/libkcp/libkcp/TunConfig.m @@ -0,0 +1,31 @@ +// +// TunConfig.m +// libkcp +// +// Created by 孔祥波 on 28/04/2017. +// Copyright © 2017 Kong XiangBo. All rights reserved. +// + +#import "TunConfig.h" + +@implementation TunConfig + +- (instancetype)init{ + if (self = [super init]){ + self.dataShards = 2; + self.parityShards = 2; + + self.nodelay = 1; + self.interval = 20; + self.resend = 2; + self.nc = 1; + + self.resend = 128; + self.rcvwnd = 128; + self.mtu = 1400 ; + self.iptos = 46; + + } + return self; +} +@end diff --git a/kcp_test.mm b/kcp_test.mm index 0a36e69..b2cc192 100644 --- a/kcp_test.mm +++ b/kcp_test.mm @@ -43,24 +43,5 @@ int kcptest(const char *addr,int port) { } -void -itimeofday(long *sec, long *usec) { - struct timeval time; - gettimeofday(&time, NULL); - if (sec) *sec = time.tv_sec; - if (usec) *usec = time.tv_usec; -} - -IUINT64 iclock64(void) { - long s, u; - IUINT64 value; - itimeofday(&s, &u); - value = ((IUINT64) s) * 1000 + (u / 1000); - return value; -} - -IUINT32 iclock() { - return (IUINT32) (iclock64() & 0xfffffffful); -} From d9f93d721dfd983d2a4983fd4874f01baff9812d Mon Sep 17 00:00:00 2001 From: abigt Date: Fri, 28 Apr 2017 14:44:50 +0800 Subject: [PATCH 04/56] oc bridge working , todo change to dispatch timer recv --- .../libkcp/kcptest/Base.lproj/Main.storyboard | 13 ++++++-- iOSLib/libkcp/kcptest/ViewController.h | 4 +-- iOSLib/libkcp/kcptest/ViewController.mm | 25 ++++++++++++--- .../libkcp/libkcp.xcodeproj/project.pbxproj | 6 ++-- .../UserInterfaceState.xcuserstate | Bin 35518 -> 40332 bytes iOSLib/libkcp/libkcp/SFKcpTun.mm | 29 +++++++++++++----- iOSLib/libkcp/libkcp/libkcp.h | 4 ++- 7 files changed, 61 insertions(+), 20 deletions(-) diff --git a/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard b/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard index f0322d6..0a27b66 100644 --- a/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard +++ b/iOSLib/libkcp/kcptest/Base.lproj/Main.storyboard @@ -43,13 +43,22 @@ + diff --git a/iOSLib/libkcp/kcptest/ViewController.h b/iOSLib/libkcp/kcptest/ViewController.h index 91ba784..453a1e5 100644 --- a/iOSLib/libkcp/kcptest/ViewController.h +++ b/iOSLib/libkcp/kcptest/ViewController.h @@ -7,8 +7,8 @@ // #import -#import "test.h" -@interface ViewController : UIViewController +#import "libkcp.h" +@interface ViewController : UIViewController @end diff --git a/iOSLib/libkcp/kcptest/ViewController.mm b/iOSLib/libkcp/kcptest/ViewController.mm index a34a876..3f574b9 100644 --- a/iOSLib/libkcp/kcptest/ViewController.mm +++ b/iOSLib/libkcp/kcptest/ViewController.mm @@ -11,7 +11,7 @@ @interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *addr; @property (weak, nonatomic) IBOutlet UITextField *port; - +@property (strong,nonatomic) SFKcpTun *tun; @end @implementation ViewController @@ -25,10 +25,27 @@ - (IBAction)go:(id)sender { //kcptest(, ); const char *addr = [self.addr.text UTF8String]; int port = [self.port.text integerValue]; - kcptest(addr,port ); + if (self.tun == nil) { + TunConfig *c = [[TunConfig alloc] init]; + self.tun = [[SFKcpTun alloc] initWithConfig:c ipaddr:self.addr.text port:port]; + self.tun.delegate = self; + } + +} +- (IBAction)send:(id)sender { + + if ( self.tun == nil ){ + return; + } + for (int i = 0; i < 10; i++) { + NSString *msg = [NSString stringWithFormat:@"message %d",i]; + NSData *d = [msg dataUsingEncoding:NSUTF8StringEncoding]; + [self.tun input:d]; + } +} +-(void)didRecevied:(NSData*)data{ + NSLog(@"recv %@",data); } - - - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 954992e..8414233 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -36,11 +36,10 @@ 692AE3711EB2F191006A4B9D /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3701EB2F191006A4B9D /* libc++.tbd */; }; 69C757811EB2F96D00139321 /* libkcp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; }; 69C757821EB2F96D00139321 /* libkcp.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 692AE3211EB2EE59006A4B9D /* libkcp.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 69FFC6A01EB30985008A030D /* SFKcpTun.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC69E1EB30985008A030D /* SFKcpTun.h */; }; + 69FFC6A01EB30985008A030D /* SFKcpTun.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC69E1EB30985008A030D /* SFKcpTun.h */; settings = {ATTRIBUTES = (Public, ); }; }; 69FFC6A11EB30985008A030D /* SFKcpTun.mm in Sources */ = {isa = PBXBuildFile; fileRef = 69FFC69F1EB30985008A030D /* SFKcpTun.mm */; }; - 69FFC6A51EB309E8008A030D /* TunConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC6A31EB309E8008A030D /* TunConfig.h */; }; + 69FFC6A51EB309E8008A030D /* TunConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 69FFC6A31EB309E8008A030D /* TunConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; 69FFC6A61EB309E8008A030D /* TunConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 69FFC6A41EB309E8008A030D /* TunConfig.m */; }; - 69FFC6A71EB316D5008A030D /* kcp_test.mm in Sources */ = {isa = PBXBuildFile; fileRef = 692AE36B1EB2EF91006A4B9D /* kcp_test.mm */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -366,7 +365,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 69FFC6A71EB316D5008A030D /* kcp_test.mm in Sources */, 692AE35E1EB2EF83006A4B9D /* ViewController.mm in Sources */, 692AE35B1EB2EF83006A4B9D /* AppDelegate.mm in Sources */, 692AE3581EB2EF83006A4B9D /* main.m in Sources */, diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate index 58faeb9618fff45b4135464e5c9b54b1ea4d58a8..acaee5ecebbedb3f39317ebd20a52861cf5bc5b2 100644 GIT binary patch literal 40332 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 (V3#t{>p6Wn#q`FY= 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.config.iptos); assert(sess != nullptr); - + [self run]; } -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port { + if (sess != nil) { + UDPSession::Destroy(sess); + } sess = UDPSession::DialWithOptions(ip.UTF8String, port, self.config.dataShards,self.config.parityShards); sess->NoDelay(self.config.nodelay, self.config.interval, self.config.resend, self.config.nc); sess->WndSize(self.config.sndwnd, self.config.rcvwnd); @@ -71,7 +74,7 @@ -(void)restartUDPSessionWithIpaddr:(NSString*)ip port:(int)port sess->SetDSCP(self.config.iptos); assert(sess != nullptr); - + [self run]; } -(void)shutdownUDPSession { @@ -86,12 +89,24 @@ -(void)input:(NSData*)data{ sess->Update(iclock()); } -(void)run{ + //不能一直读,需要timer dispatch_queue_t q = dispatch_queue_create("com.abigt.kcp", nil); dispatch_async(q, ^{ - char *buf = (char *) malloc(128); - memset(buf, 0, 128); - ssize_t n = sess->Read(buf, 128); - sess->Update(iclock()); + for(;;){ + if (sess == nil) { + break; + } + char *buf = (char *) malloc(4096); + memset(buf, 0, 4096); + ssize_t n = sess->Read(buf, 4096); + sess->Update(iclock()); + if (n > 0 ){ + NSData *d = [NSData dataWithBytes:buf length:n]; + [self.delegate didRecevied:d]; + } + free(buf); + } + }); } @end diff --git a/iOSLib/libkcp/libkcp/libkcp.h b/iOSLib/libkcp/libkcp/libkcp.h index b4c7a3d..ea51c33 100644 --- a/iOSLib/libkcp/libkcp/libkcp.h +++ b/iOSLib/libkcp/libkcp/libkcp.h @@ -14,6 +14,8 @@ FOUNDATION_EXPORT double libkcpVersionNumber; //! Project version string for libkcp. FOUNDATION_EXPORT const unsigned char libkcpVersionString[]; -// In this header, you should import all the public headers of your framework using statements like #import +// In this header, you should import all the public headers of your framework using statements like +#import +#import From 8e01cfbd41c0b8a02c08f6d2d426b25c9beaf117 Mon Sep 17 00:00:00 2001 From: abigt Date: Fri, 28 Apr 2017 14:50:07 +0800 Subject: [PATCH 05/56] remove CMake cache --- CMakeFiles/3.7.2/CMakeCCompiler.cmake | 68 --- CMakeFiles/3.7.2/CMakeCXXCompiler.cmake | 69 --- .../3.7.2/CMakeDetermineCompilerABI_C.bin | Bin 4304 -> 0 bytes .../3.7.2/CMakeDetermineCompilerABI_CXX.bin | Bin 4288 -> 0 bytes CMakeFiles/3.7.2/CMakeSystem.cmake | 15 - .../3.7.2/CompilerIdC/CMakeCCompilerId.c | 561 ------------------ CMakeFiles/3.7.2/CompilerIdC/a.out | Bin 8616 -> 0 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 533 ----------------- CMakeFiles/3.7.2/CompilerIdCXX/a.out | Bin 8600 -> 0 bytes CMakeFiles/CMakeDirectoryInformation.cmake | 16 - CMakeFiles/CMakeOutput.log | 461 -------------- CMakeFiles/Makefile.cmake | 121 ---- CMakeFiles/Makefile2 | 145 ----- CMakeFiles/TargetDirectories.txt | 4 - CMakeFiles/cmake.check_cache | 1 - CMakeFiles/feature_tests.bin | Bin 8376 -> 0 bytes CMakeFiles/feature_tests.c | 34 -- CMakeFiles/feature_tests.cxx | 405 ------------- CMakeFiles/fec_test.dir/C.includecache | 42 -- CMakeFiles/fec_test.dir/CXX.includecache | 156 ----- CMakeFiles/fec_test.dir/DependInfo.cmake | 37 -- CMakeFiles/fec_test.dir/build.make | 356 ----------- CMakeFiles/fec_test.dir/cmake_clean.cmake | 19 - CMakeFiles/fec_test.dir/depend.internal | 60 -- CMakeFiles/fec_test.dir/depend.make | 60 -- CMakeFiles/fec_test.dir/flags.make | 17 - CMakeFiles/fec_test.dir/link.txt | 1 - CMakeFiles/fec_test.dir/progress.make | 12 - CMakeFiles/kcp_test.dir/C.includecache | 42 -- CMakeFiles/kcp_test.dir/CXX.includecache | 160 ----- CMakeFiles/kcp_test.dir/DependInfo.cmake | 37 -- CMakeFiles/kcp_test.dir/build.make | 356 ----------- CMakeFiles/kcp_test.dir/cmake_clean.cmake | 19 - CMakeFiles/kcp_test.dir/depend.internal | 62 -- CMakeFiles/kcp_test.dir/depend.make | 62 -- CMakeFiles/kcp_test.dir/flags.make | 17 - CMakeFiles/kcp_test.dir/link.txt | 1 - CMakeFiles/kcp_test.dir/progress.make | 12 - CMakeFiles/progress.marks | 1 - Makefile | 519 ---------------- 40 files changed, 4481 deletions(-) delete mode 100644 CMakeFiles/3.7.2/CMakeCCompiler.cmake delete mode 100644 CMakeFiles/3.7.2/CMakeCXXCompiler.cmake delete mode 100755 CMakeFiles/3.7.2/CMakeDetermineCompilerABI_C.bin delete mode 100755 CMakeFiles/3.7.2/CMakeDetermineCompilerABI_CXX.bin delete mode 100644 CMakeFiles/3.7.2/CMakeSystem.cmake delete mode 100644 CMakeFiles/3.7.2/CompilerIdC/CMakeCCompilerId.c delete mode 100755 CMakeFiles/3.7.2/CompilerIdC/a.out delete mode 100644 CMakeFiles/3.7.2/CompilerIdCXX/CMakeCXXCompilerId.cpp delete mode 100755 CMakeFiles/3.7.2/CompilerIdCXX/a.out delete mode 100644 CMakeFiles/CMakeDirectoryInformation.cmake delete mode 100644 CMakeFiles/CMakeOutput.log delete mode 100644 CMakeFiles/Makefile.cmake delete mode 100644 CMakeFiles/Makefile2 delete mode 100644 CMakeFiles/TargetDirectories.txt delete mode 100644 CMakeFiles/cmake.check_cache delete mode 100755 CMakeFiles/feature_tests.bin delete mode 100644 CMakeFiles/feature_tests.c delete mode 100644 CMakeFiles/feature_tests.cxx delete mode 100644 CMakeFiles/fec_test.dir/C.includecache delete mode 100644 CMakeFiles/fec_test.dir/CXX.includecache delete mode 100644 CMakeFiles/fec_test.dir/DependInfo.cmake delete mode 100644 CMakeFiles/fec_test.dir/build.make delete mode 100644 CMakeFiles/fec_test.dir/cmake_clean.cmake delete mode 100644 CMakeFiles/fec_test.dir/depend.internal delete mode 100644 CMakeFiles/fec_test.dir/depend.make delete mode 100644 CMakeFiles/fec_test.dir/flags.make delete mode 100644 CMakeFiles/fec_test.dir/link.txt delete mode 100644 CMakeFiles/fec_test.dir/progress.make delete mode 100644 CMakeFiles/kcp_test.dir/C.includecache delete mode 100644 CMakeFiles/kcp_test.dir/CXX.includecache delete mode 100644 CMakeFiles/kcp_test.dir/DependInfo.cmake delete mode 100644 CMakeFiles/kcp_test.dir/build.make delete mode 100644 CMakeFiles/kcp_test.dir/cmake_clean.cmake delete mode 100644 CMakeFiles/kcp_test.dir/depend.internal delete mode 100644 CMakeFiles/kcp_test.dir/depend.make delete mode 100644 CMakeFiles/kcp_test.dir/flags.make delete mode 100644 CMakeFiles/kcp_test.dir/link.txt delete mode 100644 CMakeFiles/kcp_test.dir/progress.make delete mode 100644 CMakeFiles/progress.marks delete mode 100644 Makefile diff --git a/CMakeFiles/3.7.2/CMakeCCompiler.cmake b/CMakeFiles/3.7.2/CMakeCCompiler.cmake deleted file mode 100644 index 2752e33..0000000 --- a/CMakeFiles/3.7.2/CMakeCCompiler.cmake +++ /dev/null @@ -1,68 +0,0 @@ -set(CMAKE_C_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc") -set(CMAKE_C_COMPILER_ARG1 "") -set(CMAKE_C_COMPILER_ID "AppleClang") -set(CMAKE_C_COMPILER_VERSION "8.1.0.8020042") -set(CMAKE_C_COMPILER_WRAPPER "") -set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") -set(CMAKE_C_COMPILE_FEATURES "c_function_prototypes;c_restrict;c_variadic_macros;c_static_assert") -set(CMAKE_C90_COMPILE_FEATURES "c_function_prototypes") -set(CMAKE_C99_COMPILE_FEATURES "c_restrict;c_variadic_macros") -set(CMAKE_C11_COMPILE_FEATURES "c_static_assert") - -set(CMAKE_C_PLATFORM_ID "Darwin") -set(CMAKE_C_SIMULATE_ID "") -set(CMAKE_C_SIMULATE_VERSION "") - -set(CMAKE_AR "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar") -set(CMAKE_RANLIB "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib") -set(CMAKE_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") -set(CMAKE_COMPILER_IS_GNUCC ) -set(CMAKE_C_COMPILER_LOADED 1) -set(CMAKE_C_COMPILER_WORKS TRUE) -set(CMAKE_C_ABI_COMPILED TRUE) -set(CMAKE_COMPILER_IS_MINGW ) -set(CMAKE_COMPILER_IS_CYGWIN ) -if(CMAKE_COMPILER_IS_CYGWIN) - set(CYGWIN 1) - set(UNIX 1) -endif() - -set(CMAKE_C_COMPILER_ENV_VAR "CC") - -if(CMAKE_COMPILER_IS_MINGW) - set(MINGW 1) -endif() -set(CMAKE_C_COMPILER_ID_RUN 1) -set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_C_LINKER_PREFERENCE 10) - -# Save compiler ABI information. -set(CMAKE_C_SIZEOF_DATA_PTR "8") -set(CMAKE_C_COMPILER_ABI "") -set(CMAKE_C_LIBRARY_ARCHITECTURE "") - -if(CMAKE_C_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_C_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -endif() - -if(CMAKE_C_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "to_library") -set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib;/usr/local/lib") -set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "/Library/Frameworks;/System/Library/Frameworks") diff --git a/CMakeFiles/3.7.2/CMakeCXXCompiler.cmake b/CMakeFiles/3.7.2/CMakeCXXCompiler.cmake deleted file mode 100644 index e43dde9..0000000 --- a/CMakeFiles/3.7.2/CMakeCXXCompiler.cmake +++ /dev/null @@ -1,69 +0,0 @@ -set(CMAKE_CXX_COMPILER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++") -set(CMAKE_CXX_COMPILER_ARG1 "") -set(CMAKE_CXX_COMPILER_ID "AppleClang") -set(CMAKE_CXX_COMPILER_VERSION "8.1.0.8020042") -set(CMAKE_CXX_COMPILER_WRAPPER "") -set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "98") -set(CMAKE_CXX_COMPILE_FEATURES "cxx_template_template_parameters;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") -set(CMAKE_CXX98_COMPILE_FEATURES "cxx_template_template_parameters") -set(CMAKE_CXX11_COMPILE_FEATURES "cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") -set(CMAKE_CXX14_COMPILE_FEATURES "cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") - -set(CMAKE_CXX_PLATFORM_ID "Darwin") -set(CMAKE_CXX_SIMULATE_ID "") -set(CMAKE_CXX_SIMULATE_VERSION "") - -set(CMAKE_AR "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar") -set(CMAKE_RANLIB "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib") -set(CMAKE_LINKER "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld") -set(CMAKE_COMPILER_IS_GNUCXX ) -set(CMAKE_CXX_COMPILER_LOADED 1) -set(CMAKE_CXX_COMPILER_WORKS TRUE) -set(CMAKE_CXX_ABI_COMPILED TRUE) -set(CMAKE_COMPILER_IS_MINGW ) -set(CMAKE_COMPILER_IS_CYGWIN ) -if(CMAKE_COMPILER_IS_CYGWIN) - set(CYGWIN 1) - set(UNIX 1) -endif() - -set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") - -if(CMAKE_COMPILER_IS_MINGW) - set(MINGW 1) -endif() -set(CMAKE_CXX_COMPILER_ID_RUN 1) -set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) -set(CMAKE_CXX_LINKER_PREFERENCE 30) -set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) - -# Save compiler ABI information. -set(CMAKE_CXX_SIZEOF_DATA_PTR "8") -set(CMAKE_CXX_COMPILER_ABI "") -set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") - -if(CMAKE_CXX_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_CXX_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -endif() - -if(CMAKE_CXX_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "to_library;c++") -set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib;/usr/local/lib") -set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "/Library/Frameworks;/System/Library/Frameworks") diff --git a/CMakeFiles/3.7.2/CMakeDetermineCompilerABI_C.bin b/CMakeFiles/3.7.2/CMakeDetermineCompilerABI_C.bin deleted file mode 100755 index 1db4a23d7e5b27d1cfb342ce7a3791f081f3cea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4304 zcmeHK&ubGw6rME}MT@BitKzR9BGp3@h}E?8pyKKVr7c>aC}rAYw{)S|NV1Eq5GbOD zAVLrR0sS*Pc@gPRPoDMQErJ)JsEFS;osijT{R`&7w{N~TGjHB}vzPb&$JgKcgm5xK ztnCp(90Eo_o{JntLL3J?K+5TBx7-Kr-6=-X=A`LA8S|8}P|6v1b|$?2Dtbv|lJBd6}WSzrG~D=#$b->-9k=qHbzl^Rsy0;%Ep z^X2bP^JAmW#t$F;IX3(59AYR58xJU4>~Y3mBe*a3@%>HXIc0!zyrWb4i0e81vvK~t z)m9wT^VjpJBdlT(>^#8pJbd=UU(lTTShEUP1*`&A0jq#jz$#!BunJfOtO8WvzSsHU zy&M?DaMS(8NT!wvEZ%&Q3!Y4svQTmVK z=EGunj{Deao#X&!diFHzc`m^duXO*zF?+N@>>N_NL72vo=&v)fz9fT{pq9jeTnZNa zpeaiAg)kCV*vCqv05QQMGUC%|d^XOgEck#b<7C#^Zi-mrFgb#~J{o-)=C^C)d>(-3 fP+1Ng^xw6pZaP(kRMoLjl&v_a$|`zp6fOP$MvIg) diff --git a/CMakeFiles/3.7.2/CMakeDetermineCompilerABI_CXX.bin b/CMakeFiles/3.7.2/CMakeDetermineCompilerABI_CXX.bin deleted file mode 100755 index 668e09ec93ff64a450ae86cc03b406f9da400167..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4288 zcmeHKO=}ZT6n&E#6fI3RilRsq6}6ZTq7tMV#nA*yTeL!{lxver=|GccGJ|O$P!JbE z1Q-4QH~t1)6+tCScdp&IDG^*25%HXt7c$eTxR$wa=Dzdh-uv!5Z*@O@|N3*UQr3u4 z8!@F+0+**2yDKWX_(S3y0|Z@$jB99KESH zfR?n0cuvbR1a4=&`?vt>>$T>v;Ldt4O}&FAi9A#DXO=;xR{ZBU3f2ufr%f4P5Xa{{lx*5IRnnKh~|2O<3-Zx{`e|4zC zIQDcH$b<8~EqL~P0GI`6tWPkO?-M)^^q*`DQAuDFNc+u3detqZD{HG2aN1FTeM~-% zsSgjc-B+(=ee?a+)+y|vB_!_GI6vUrgPp~FnaB4J8qdi9{HJw~=g_t_JR9eiCni$a z6q;~Ly03g7-pYM~9O3voYfaCormmS3L@RX$V1F5W_Q9VsoO(tUDG(_TDG(_TDG(_T zDG(_TDG({}e=2ad(D_n$7Qcksb?qO#W2e1c==k5dc8{!3_O}z8lbMlruhZ^5wR?;2 zo(HWsePiZI(_MG!%TjsZHST5di_GJ!b&LyG&~v8Y%ySW*cwy!rt~sNPB6D14gRqPx zn6G0}T@k0{lzq>U6=$j9G}MXel3P=!`@`Mm<2qca!Quk=82%0BV}>QH{&2(I4r$)+ pWzZ`;!?YzaDepd0^qCz0r0Mx3DPfXED$ diff --git a/CMakeFiles/3.7.2/CMakeSystem.cmake b/CMakeFiles/3.7.2/CMakeSystem.cmake deleted file mode 100644 index b6273c9..0000000 --- a/CMakeFiles/3.7.2/CMakeSystem.cmake +++ /dev/null @@ -1,15 +0,0 @@ -set(CMAKE_HOST_SYSTEM "Darwin-16.5.0") -set(CMAKE_HOST_SYSTEM_NAME "Darwin") -set(CMAKE_HOST_SYSTEM_VERSION "16.5.0") -set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") - - - -set(CMAKE_SYSTEM "Darwin-16.5.0") -set(CMAKE_SYSTEM_NAME "Darwin") -set(CMAKE_SYSTEM_VERSION "16.5.0") -set(CMAKE_SYSTEM_PROCESSOR "x86_64") - -set(CMAKE_CROSSCOMPILING "FALSE") - -set(CMAKE_SYSTEM_LOADED 1) diff --git a/CMakeFiles/3.7.2/CompilerIdC/CMakeCCompilerId.c b/CMakeFiles/3.7.2/CompilerIdC/CMakeCCompilerId.c deleted file mode 100644 index 512e360..0000000 --- a/CMakeFiles/3.7.2/CompilerIdC/CMakeCCompilerId.c +++ /dev/null @@ -1,561 +0,0 @@ -#ifdef __cplusplus -# error "A C++ compiler has been selected for C." -#endif - -#if defined(__18CXX) -# define ID_VOID_MAIN -#endif -#if defined(__CLASSIC_C__) -/* cv-qualifiers did not exist in K&R C */ -# define const -# define volatile -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif - /* __INTEL_COMPILER = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 - /* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" - /* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" - /* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 -# define COMPILER_ID "XL" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) -# define COMPILER_ID "Fujitsu" - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__BCC__) -# define COMPILER_ID "Bruce" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" - -#elif defined(__ARMCC_VERSION) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(SDCC) -# define COMPILER_ID "SDCC" - /* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) - -#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) -# define COMPILER_ID "MIPSpro" -# if defined(_SGI_COMPILER_VERSION) - /* _SGI_COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) -# else - /* _COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__sgi) -# define COMPILER_ID "MIPSpro" - -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXE) || defined(__CRAYXC) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) -# define PLATFORM_ID "IRIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number components. */ -#ifdef COMPILER_VERSION_MAJOR -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - - -#if !defined(__STDC__) -# if defined(_MSC_VER) && !defined(__clang__) -# define C_DIALECT "90" -# else -# define C_DIALECT -# endif -#elif __STDC_VERSION__ >= 201000L -# define C_DIALECT "11" -#elif __STDC_VERSION__ >= 199901L -# define C_DIALECT "99" -#else -# define C_DIALECT "90" -#endif -const char* info_language_dialect_default = - "INFO" ":" "dialect_default[" C_DIALECT "]"; - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -# if defined(__CLASSIC_C__) -int main(argc, argv) int argc; char *argv[]; -# else -int main(int argc, char* argv[]) -# endif -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXE) || defined(__CRAYXC) - require += info_cray[argc]; -#endif - require += info_language_dialect_default[argc]; - (void)argv; - return require; -} -#endif diff --git a/CMakeFiles/3.7.2/CompilerIdC/a.out b/CMakeFiles/3.7.2/CompilerIdC/a.out deleted file mode 100755 index 8f4b949454a3b7a59ff926504372b9f4158751d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8616 zcmeHNO-vI(6rQyZ8bqiU#rTs#jKQBki!+XJ ze>X9vg&12tz!+CQwaOM!qmW)<&bDNPZeCp%Faq-eY~R} zgyK!gal*AioYe~A<+6opg7xw8GTv3`L^zONZ7}pXFJ|YhY?@oynVi5u{@%!Vv_~X_ z>vQr(yeI9$I+XLlfr){d5%3+@2Y)|m_5o+an<@5DKdQ7_6^SXlOcgfU*m5OLKGeF;qSqa8S>Xb(ci zptVA4)vs4O{rHJ?TX|4NP(zN_lL4cz5~B{p;z~AI)EzR$je5 z4I8L~W3$k6J|-Ka3-3#Qbk1vq*6D}R7`>x*aTCW(tFDdp#}^B(nd!dKjXbPrOoE(& z(t7JrkB_qw6F*861BwB~fMP%~pcqgLCbP5*nrf8mVO|MLS z93HtfdL@<1FyJaWtcVgYK{#b7;*4GPnq{&W*D8ZI~-_!5^ zKD4Cm_y#1QK7Dhwz%wGe$y)6Y@V{^4@;h=!w&Sv;IZ6}*iUGxdVn8vV7*Gr-1{4E| z0mXn~Krx^g_`exA+{wI3tHx1h5An<#Hy6xQ(KY#;X{1eub!7}I%Pvs;nX@?EHH29C zB&zcA@`5@3bq1UF??u=Xx(i`XHM%n?8nY&^yANT{@sES8QwX&j#bcEoWqMHEk%U$t zq4nA{Q2`Yf7e@%=4*?OF=su)FVk%k^j!E1u@u>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_CC) -# define COMPILER_ID "SunPro" -# if __SUNPRO_CC >= 0x5100 - /* __SUNPRO_CC = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# endif - -#elif defined(__HP_aCC) -# define COMPILER_ID "HP" - /* __HP_aCC = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) - -#elif defined(__DECCXX) -# define COMPILER_ID "Compaq" - /* __DECCXX_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) - -#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 -# define COMPILER_ID "XL" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) -# define COMPILER_ID "Fujitsu" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" - -#elif defined(__ARMCC_VERSION) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) -# define COMPILER_ID "MIPSpro" -# if defined(_SGI_COMPILER_VERSION) - /* _SGI_COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) -# else - /* _COMPILER_VERSION = VRP */ -# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) -# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) -# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__sgi) -# define COMPILER_ID "MIPSpro" - -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXE) || defined(__CRAYXC) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) -# define PLATFORM_ID "IRIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number components. */ -#ifdef COMPILER_VERSION_MAJOR -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - - -const char* info_language_dialect_default = "INFO" ":" "dialect_default[" -#if __cplusplus >= 201402L - "14" -#elif __cplusplus >= 201103L - "11" -#else - "98" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXE) || defined(__CRAYXC) - require += info_cray[argc]; -#endif - require += info_language_dialect_default[argc]; - (void)argv; - return require; -} diff --git a/CMakeFiles/3.7.2/CompilerIdCXX/a.out b/CMakeFiles/3.7.2/CompilerIdCXX/a.out deleted file mode 100755 index ef0a248268f3fb0643430b9956610b2f10528912..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8600 zcmeHN&ubG=5S|#TrPj9oL{VWCk!mGPT7~)pw6)O$wJlmf4E3>1w(Y`Z6F0kR4~6s~ zw20ubNB;m1f_E<>o>aW}ABdMK9*c(_W8$V zqC}FYzJZ8(pyxLdJs<-!qP@@@REUY;OW9l5YvXKfmP9lBBjP+ua1>%PdvmhcMaJ`m zj=^WeMgg!F9Wcp?!e!YA~n@cC6R2#9ZxxJ~l%Co`cw@z+0dbP!`V5 zx(V8PJ(&JVunoB+>V)K)QzI$_-b6>BT;Gxr@^@5W=2MGiKr^5j&Gy|Fe&46a$Um3WOTmG1P z)beS2p*v0YF#Y(wqJC;`%u2voEf@8X~QzTcaj_J=-ymDdG^zdP( ztfp6-E2w$NHXW+_k)#U2zNPP=-=!l8GkiRC*{qkWQZ% zKn~PO`&FL!$nW?3{(k}^>kfPavhbY0xjGTqBcs{cm@tUGZ;z|*$PqP;sgZrOXa+O` zngPv#W*$PxW}`C^a`+sC?(lI*V9r{i99^Jwuw_KC7 zVubv0MwS5Dg+q&|PtMotPRI_ZJh<4+7=H-pfr-yU4l2w|NXBV}_b5EBaJ#~{8N)I9 zp8)q?0cDF6Q!>yQ|D6NbeHZfP!s)Mj58=8u94`OjM@TNY?JH`2FfFFh*$2f!+`5t( KkPNF6A^Hh<6cfS# diff --git a/CMakeFiles/CMakeDirectoryInformation.cmake b/CMakeFiles/CMakeDirectoryInformation.cmake deleted file mode 100644 index 8cf784e..0000000 --- a/CMakeFiles/CMakeDirectoryInformation.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -# Relative path conversion top directories. -set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/Users/yarshure/github/libkcp") -set(CMAKE_RELATIVE_PATH_TOP_BINARY "/Users/yarshure/github/libkcp") - -# Force unix paths in dependencies. -set(CMAKE_FORCE_UNIX_PATHS 1) - - -# The C and CXX include file regular expressions for this directory. -set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") -set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") -set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) -set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/CMakeFiles/CMakeOutput.log b/CMakeFiles/CMakeOutput.log deleted file mode 100644 index 96c37ee..0000000 --- a/CMakeFiles/CMakeOutput.log +++ /dev/null @@ -1,461 +0,0 @@ -The system is: Darwin - 16.5.0 - x86_64 -Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. -Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Build flags: -Id flags: - -The output was: -0 - - -Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" - -The C compiler identification is AppleClang, found in "/Users/yarshure/github/libkcp/CMakeFiles/3.7.2/CompilerIdC/a.out" - -Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. -Compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Build flags: -Id flags: - -The output was: -0 - - -Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" - -The CXX compiler identification is AppleClang, found in "/Users/yarshure/github/libkcp/CMakeFiles/3.7.2/CompilerIdCXX/a.out" - -Determining if the C compiler works passed with the following output: -Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp - -Run Build Command:"/usr/bin/make" "cmTC_9cba1/fast" -/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_9cba1.dir/build.make CMakeFiles/cmTC_9cba1.dir/build -Building C object CMakeFiles/cmTC_9cba1.dir/testCCompiler.c.o -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -o CMakeFiles/cmTC_9cba1.dir/testCCompiler.c.o -c /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp/testCCompiler.c -Linking C executable cmTC_9cba1 -/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_9cba1.dir/link.txt --verbose=1 -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_9cba1.dir/testCCompiler.c.o -o cmTC_9cba1 - - -Detecting C compiler ABI info compiled with the following output: -Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp - -Run Build Command:"/usr/bin/make" "cmTC_f90ea/fast" -/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_f90ea.dir/build.make CMakeFiles/cmTC_f90ea.dir/build -Building C object CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -o CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -c /usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCCompilerABI.c -Linking C executable cmTC_f90ea -/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_f90ea.dir/link.txt --verbose=1 -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -o cmTC_f90ea -Apple LLVM version 8.1.0 (clang-802.0.42) -Target: x86_64-apple-darwin16.5.0 -Thread model: posix -InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o cmTC_f90ea -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a -@(#)PROGRAM:ld PROJECT:ld64-278.4 -configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS) -Library search paths: - /usr/lib - /usr/local/lib -Framework search paths: - /Library/Frameworks/ - /System/Library/Frameworks/ - - -Parsed C implicit link information from above output: - link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] - ignore line: [Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp] - ignore line: [] - ignore line: [Run Build Command:"/usr/bin/make" "cmTC_f90ea/fast"] - ignore line: [/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_f90ea.dir/build.make CMakeFiles/cmTC_f90ea.dir/build] - ignore line: [Building C object CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o] - ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -o CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -c /usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCCompilerABI.c] - ignore line: [Linking C executable cmTC_f90ea] - ignore line: [/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_f90ea.dir/link.txt --verbose=1] - ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -o cmTC_f90ea ] - ignore line: [Apple LLVM version 8.1.0 (clang-802.0.42)] - ignore line: [Target: x86_64-apple-darwin16.5.0] - ignore line: [Thread model: posix] - ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] - link line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o cmTC_f90ea -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld] ==> ignore - arg [-demangle] ==> ignore - arg [-lto_library] ==> lib [to_library] - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib] ==> ignore - arg [-dynamic] ==> ignore - arg [-arch] ==> ignore - arg [x86_64] ==> ignore - arg [-macosx_version_min] ==> ignore - arg [10.12.0] ==> ignore - arg [-o] ==> ignore - arg [cmTC_f90ea] ==> ignore - arg [-search_paths_first] ==> ignore - arg [-headerpad_max_install_names] ==> ignore - arg [-v] ==> ignore - arg [CMakeFiles/cmTC_f90ea.dir/CMakeCCompilerABI.c.o] ==> ignore - arg [-lSystem] ==> lib [System] - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] ==> lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] - Library search paths: [;/usr/lib;/usr/local/lib] - Framework search paths: [;/Library/Frameworks/;/System/Library/Frameworks/] - remove lib [System] - remove lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] - collapse library dir [/usr/lib] ==> [/usr/lib] - collapse library dir [/usr/local/lib] ==> [/usr/local/lib] - collapse framework dir [/Library/Frameworks/] ==> [/Library/Frameworks] - collapse framework dir [/System/Library/Frameworks/] ==> [/System/Library/Frameworks] - implicit libs: [to_library] - implicit dirs: [/usr/lib;/usr/local/lib] - implicit fwks: [/Library/Frameworks;/System/Library/Frameworks] - - - - -Detecting C [-std=c11] compiler features compiled with the following output: -Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp - -Run Build Command:"/usr/bin/make" "cmTC_b4dde/fast" -/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_b4dde.dir/build.make CMakeFiles/cmTC_b4dde.dir/build -Building C object CMakeFiles/cmTC_b4dde.dir/feature_tests.c.o -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -std=c11 -o CMakeFiles/cmTC_b4dde.dir/feature_tests.c.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.c -Linking C executable cmTC_b4dde -/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b4dde.dir/link.txt --verbose=1 -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_b4dde.dir/feature_tests.c.o -o cmTC_b4dde - - - Feature record: C_FEATURE:1c_function_prototypes - Feature record: C_FEATURE:1c_restrict - Feature record: C_FEATURE:1c_static_assert - Feature record: C_FEATURE:1c_variadic_macros - - -Detecting C [-std=c99] compiler features compiled with the following output: -Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp - -Run Build Command:"/usr/bin/make" "cmTC_e0b19/fast" -/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_e0b19.dir/build.make CMakeFiles/cmTC_e0b19.dir/build -Building C object CMakeFiles/cmTC_e0b19.dir/feature_tests.c.o -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -std=c99 -o CMakeFiles/cmTC_e0b19.dir/feature_tests.c.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.c -Linking C executable cmTC_e0b19 -/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_e0b19.dir/link.txt --verbose=1 -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_e0b19.dir/feature_tests.c.o -o cmTC_e0b19 - - - Feature record: C_FEATURE:1c_function_prototypes - Feature record: C_FEATURE:1c_restrict - Feature record: C_FEATURE:0c_static_assert - Feature record: C_FEATURE:1c_variadic_macros - - -Detecting C [-std=c90] compiler features compiled with the following output: -Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp - -Run Build Command:"/usr/bin/make" "cmTC_b8bf4/fast" -/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_b8bf4.dir/build.make CMakeFiles/cmTC_b8bf4.dir/build -Building C object CMakeFiles/cmTC_b8bf4.dir/feature_tests.c.o -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -std=c90 -o CMakeFiles/cmTC_b8bf4.dir/feature_tests.c.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.c -Linking C executable cmTC_b8bf4 -/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b8bf4.dir/link.txt --verbose=1 -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_b8bf4.dir/feature_tests.c.o -o cmTC_b8bf4 - - - Feature record: C_FEATURE:1c_function_prototypes - Feature record: C_FEATURE:0c_restrict - Feature record: C_FEATURE:0c_static_assert - Feature record: C_FEATURE:0c_variadic_macros -Determining if the CXX compiler works passed with the following output: -Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp - -Run Build Command:"/usr/bin/make" "cmTC_c9ce8/fast" -/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_c9ce8.dir/build.make CMakeFiles/cmTC_c9ce8.dir/build -Building CXX object CMakeFiles/cmTC_c9ce8.dir/testCXXCompiler.cxx.o -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -o CMakeFiles/cmTC_c9ce8.dir/testCXXCompiler.cxx.o -c /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp/testCXXCompiler.cxx -Linking CXX executable cmTC_c9ce8 -/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_c9ce8.dir/link.txt --verbose=1 -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_c9ce8.dir/testCXXCompiler.cxx.o -o cmTC_c9ce8 - - -Detecting CXX compiler ABI info compiled with the following output: -Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp - -Run Build Command:"/usr/bin/make" "cmTC_1365c/fast" -/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_1365c.dir/build.make CMakeFiles/cmTC_1365c.dir/build -Building CXX object CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -o CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -c /usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCXXCompilerABI.cpp -Linking CXX executable cmTC_1365c -/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_1365c.dir/link.txt --verbose=1 -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_1365c -Apple LLVM version 8.1.0 (clang-802.0.42) -Target: x86_64-apple-darwin16.5.0 -Thread model: posix -InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o cmTC_1365c -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a -@(#)PROGRAM:ld PROJECT:ld64-278.4 -configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS) -Library search paths: - /usr/lib - /usr/local/lib -Framework search paths: - /Library/Frameworks/ - /System/Library/Frameworks/ - - -Parsed CXX implicit link information from above output: - link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] - ignore line: [Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp] - ignore line: [] - ignore line: [Run Build Command:"/usr/bin/make" "cmTC_1365c/fast"] - ignore line: [/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_1365c.dir/build.make CMakeFiles/cmTC_1365c.dir/build] - ignore line: [Building CXX object CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o] - ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -o CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -c /usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCXXCompilerABI.cpp] - ignore line: [Linking CXX executable cmTC_1365c] - ignore line: [/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_1365c.dir/link.txt --verbose=1] - ignore line: [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names -v -Wl,-v CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_1365c ] - ignore line: [Apple LLVM version 8.1.0 (clang-802.0.42)] - ignore line: [Target: x86_64-apple-darwin16.5.0] - ignore line: [Thread model: posix] - ignore line: [InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin] - link line: [ "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o cmTC_1365c -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld] ==> ignore - arg [-demangle] ==> ignore - arg [-lto_library] ==> lib [to_library] - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib] ==> ignore - arg [-dynamic] ==> ignore - arg [-arch] ==> ignore - arg [x86_64] ==> ignore - arg [-macosx_version_min] ==> ignore - arg [10.12.0] ==> ignore - arg [-o] ==> ignore - arg [cmTC_1365c] ==> ignore - arg [-search_paths_first] ==> ignore - arg [-headerpad_max_install_names] ==> ignore - arg [-v] ==> ignore - arg [CMakeFiles/cmTC_1365c.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore - arg [-lc++] ==> lib [c++] - arg [-lSystem] ==> lib [System] - arg [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] ==> lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] - Library search paths: [;/usr/lib;/usr/local/lib] - Framework search paths: [;/Library/Frameworks/;/System/Library/Frameworks/] - remove lib [System] - remove lib [/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a] - collapse library dir [/usr/lib] ==> [/usr/lib] - collapse library dir [/usr/local/lib] ==> [/usr/local/lib] - collapse framework dir [/Library/Frameworks/] ==> [/Library/Frameworks] - collapse framework dir [/System/Library/Frameworks/] ==> [/System/Library/Frameworks] - implicit libs: [to_library;c++] - implicit dirs: [/usr/lib;/usr/local/lib] - implicit fwks: [/Library/Frameworks;/System/Library/Frameworks] - - - - -Detecting CXX [-std=c++14] compiler features compiled with the following output: -Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp - -Run Build Command:"/usr/bin/make" "cmTC_6dabf/fast" -/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_6dabf.dir/build.make CMakeFiles/cmTC_6dabf.dir/build -Building CXX object CMakeFiles/cmTC_6dabf.dir/feature_tests.cxx.o -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -std=c++14 -o CMakeFiles/cmTC_6dabf.dir/feature_tests.cxx.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.cxx -Linking CXX executable cmTC_6dabf -/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_6dabf.dir/link.txt --verbose=1 -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_6dabf.dir/feature_tests.cxx.o -o cmTC_6dabf - - - Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers - Feature record: CXX_FEATURE:1cxx_alias_templates - Feature record: CXX_FEATURE:1cxx_alignas - Feature record: CXX_FEATURE:1cxx_alignof - Feature record: CXX_FEATURE:1cxx_attributes - Feature record: CXX_FEATURE:1cxx_attribute_deprecated - Feature record: CXX_FEATURE:1cxx_auto_type - Feature record: CXX_FEATURE:1cxx_binary_literals - Feature record: CXX_FEATURE:1cxx_constexpr - Feature record: CXX_FEATURE:1cxx_contextual_conversions - Feature record: CXX_FEATURE:1cxx_decltype - Feature record: CXX_FEATURE:1cxx_decltype_auto - Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types - Feature record: CXX_FEATURE:1cxx_default_function_template_args - Feature record: CXX_FEATURE:1cxx_defaulted_functions - Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers - Feature record: CXX_FEATURE:1cxx_delegating_constructors - Feature record: CXX_FEATURE:1cxx_deleted_functions - Feature record: CXX_FEATURE:1cxx_digit_separators - Feature record: CXX_FEATURE:1cxx_enum_forward_declarations - Feature record: CXX_FEATURE:1cxx_explicit_conversions - Feature record: CXX_FEATURE:1cxx_extended_friend_declarations - Feature record: CXX_FEATURE:1cxx_extern_templates - Feature record: CXX_FEATURE:1cxx_final - Feature record: CXX_FEATURE:1cxx_func_identifier - Feature record: CXX_FEATURE:1cxx_generalized_initializers - Feature record: CXX_FEATURE:1cxx_generic_lambdas - Feature record: CXX_FEATURE:1cxx_inheriting_constructors - Feature record: CXX_FEATURE:1cxx_inline_namespaces - Feature record: CXX_FEATURE:1cxx_lambdas - Feature record: CXX_FEATURE:1cxx_lambda_init_captures - Feature record: CXX_FEATURE:1cxx_local_type_template_args - Feature record: CXX_FEATURE:1cxx_long_long_type - Feature record: CXX_FEATURE:1cxx_noexcept - Feature record: CXX_FEATURE:1cxx_nonstatic_member_init - Feature record: CXX_FEATURE:1cxx_nullptr - Feature record: CXX_FEATURE:1cxx_override - Feature record: CXX_FEATURE:1cxx_range_for - Feature record: CXX_FEATURE:1cxx_raw_string_literals - Feature record: CXX_FEATURE:1cxx_reference_qualified_functions - Feature record: CXX_FEATURE:1cxx_relaxed_constexpr - Feature record: CXX_FEATURE:1cxx_return_type_deduction - Feature record: CXX_FEATURE:1cxx_right_angle_brackets - Feature record: CXX_FEATURE:1cxx_rvalue_references - Feature record: CXX_FEATURE:1cxx_sizeof_member - Feature record: CXX_FEATURE:1cxx_static_assert - Feature record: CXX_FEATURE:1cxx_strong_enums - Feature record: CXX_FEATURE:1cxx_template_template_parameters - Feature record: CXX_FEATURE:1cxx_thread_local - Feature record: CXX_FEATURE:1cxx_trailing_return_types - Feature record: CXX_FEATURE:1cxx_unicode_literals - Feature record: CXX_FEATURE:1cxx_uniform_initialization - Feature record: CXX_FEATURE:1cxx_unrestricted_unions - Feature record: CXX_FEATURE:1cxx_user_literals - Feature record: CXX_FEATURE:1cxx_variable_templates - Feature record: CXX_FEATURE:1cxx_variadic_macros - Feature record: CXX_FEATURE:1cxx_variadic_templates - - -Detecting CXX [-std=c++11] compiler features compiled with the following output: -Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp - -Run Build Command:"/usr/bin/make" "cmTC_e392e/fast" -/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_e392e.dir/build.make CMakeFiles/cmTC_e392e.dir/build -Building CXX object CMakeFiles/cmTC_e392e.dir/feature_tests.cxx.o -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -std=c++11 -o CMakeFiles/cmTC_e392e.dir/feature_tests.cxx.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.cxx -Linking CXX executable cmTC_e392e -/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_e392e.dir/link.txt --verbose=1 -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_e392e.dir/feature_tests.cxx.o -o cmTC_e392e - - - Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers - Feature record: CXX_FEATURE:1cxx_alias_templates - Feature record: CXX_FEATURE:1cxx_alignas - Feature record: CXX_FEATURE:1cxx_alignof - Feature record: CXX_FEATURE:1cxx_attributes - Feature record: CXX_FEATURE:0cxx_attribute_deprecated - Feature record: CXX_FEATURE:1cxx_auto_type - Feature record: CXX_FEATURE:0cxx_binary_literals - Feature record: CXX_FEATURE:1cxx_constexpr - Feature record: CXX_FEATURE:0cxx_contextual_conversions - Feature record: CXX_FEATURE:1cxx_decltype - Feature record: CXX_FEATURE:0cxx_decltype_auto - Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types - Feature record: CXX_FEATURE:1cxx_default_function_template_args - Feature record: CXX_FEATURE:1cxx_defaulted_functions - Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers - Feature record: CXX_FEATURE:1cxx_delegating_constructors - Feature record: CXX_FEATURE:1cxx_deleted_functions - Feature record: CXX_FEATURE:0cxx_digit_separators - Feature record: CXX_FEATURE:1cxx_enum_forward_declarations - Feature record: CXX_FEATURE:1cxx_explicit_conversions - Feature record: CXX_FEATURE:1cxx_extended_friend_declarations - Feature record: CXX_FEATURE:1cxx_extern_templates - Feature record: CXX_FEATURE:1cxx_final - Feature record: CXX_FEATURE:1cxx_func_identifier - Feature record: CXX_FEATURE:1cxx_generalized_initializers - Feature record: CXX_FEATURE:0cxx_generic_lambdas - Feature record: CXX_FEATURE:1cxx_inheriting_constructors - Feature record: CXX_FEATURE:1cxx_inline_namespaces - Feature record: CXX_FEATURE:1cxx_lambdas - Feature record: CXX_FEATURE:0cxx_lambda_init_captures - Feature record: CXX_FEATURE:1cxx_local_type_template_args - Feature record: CXX_FEATURE:1cxx_long_long_type - Feature record: CXX_FEATURE:1cxx_noexcept - Feature record: CXX_FEATURE:1cxx_nonstatic_member_init - Feature record: CXX_FEATURE:1cxx_nullptr - Feature record: CXX_FEATURE:1cxx_override - Feature record: CXX_FEATURE:1cxx_range_for - Feature record: CXX_FEATURE:1cxx_raw_string_literals - Feature record: CXX_FEATURE:1cxx_reference_qualified_functions - Feature record: CXX_FEATURE:0cxx_relaxed_constexpr - Feature record: CXX_FEATURE:0cxx_return_type_deduction - Feature record: CXX_FEATURE:1cxx_right_angle_brackets - Feature record: CXX_FEATURE:1cxx_rvalue_references - Feature record: CXX_FEATURE:1cxx_sizeof_member - Feature record: CXX_FEATURE:1cxx_static_assert - Feature record: CXX_FEATURE:1cxx_strong_enums - Feature record: CXX_FEATURE:1cxx_template_template_parameters - Feature record: CXX_FEATURE:1cxx_thread_local - Feature record: CXX_FEATURE:1cxx_trailing_return_types - Feature record: CXX_FEATURE:1cxx_unicode_literals - Feature record: CXX_FEATURE:1cxx_uniform_initialization - Feature record: CXX_FEATURE:1cxx_unrestricted_unions - Feature record: CXX_FEATURE:1cxx_user_literals - Feature record: CXX_FEATURE:0cxx_variable_templates - Feature record: CXX_FEATURE:1cxx_variadic_macros - Feature record: CXX_FEATURE:1cxx_variadic_templates - - -Detecting CXX [-std=c++98] compiler features compiled with the following output: -Change Dir: /Users/yarshure/github/libkcp/CMakeFiles/CMakeTmp - -Run Build Command:"/usr/bin/make" "cmTC_d3a6b/fast" -/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_d3a6b.dir/build.make CMakeFiles/cmTC_d3a6b.dir/build -Building CXX object CMakeFiles/cmTC_d3a6b.dir/feature_tests.cxx.o -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -std=c++98 -o CMakeFiles/cmTC_d3a6b.dir/feature_tests.cxx.o -c /Users/yarshure/github/libkcp/CMakeFiles/feature_tests.cxx -Linking CXX executable cmTC_d3a6b -/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d3a6b.dir/link.txt --verbose=1 -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_d3a6b.dir/feature_tests.cxx.o -o cmTC_d3a6b - - - Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers - Feature record: CXX_FEATURE:0cxx_alias_templates - Feature record: CXX_FEATURE:0cxx_alignas - Feature record: CXX_FEATURE:0cxx_alignof - Feature record: CXX_FEATURE:0cxx_attributes - Feature record: CXX_FEATURE:0cxx_attribute_deprecated - Feature record: CXX_FEATURE:0cxx_auto_type - Feature record: CXX_FEATURE:0cxx_binary_literals - Feature record: CXX_FEATURE:0cxx_constexpr - Feature record: CXX_FEATURE:0cxx_contextual_conversions - Feature record: CXX_FEATURE:0cxx_decltype - Feature record: CXX_FEATURE:0cxx_decltype_auto - Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types - Feature record: CXX_FEATURE:0cxx_default_function_template_args - Feature record: CXX_FEATURE:0cxx_defaulted_functions - Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers - Feature record: CXX_FEATURE:0cxx_delegating_constructors - Feature record: CXX_FEATURE:0cxx_deleted_functions - Feature record: CXX_FEATURE:0cxx_digit_separators - Feature record: CXX_FEATURE:0cxx_enum_forward_declarations - Feature record: CXX_FEATURE:0cxx_explicit_conversions - Feature record: CXX_FEATURE:0cxx_extended_friend_declarations - Feature record: CXX_FEATURE:0cxx_extern_templates - Feature record: CXX_FEATURE:0cxx_final - Feature record: CXX_FEATURE:0cxx_func_identifier - Feature record: CXX_FEATURE:0cxx_generalized_initializers - Feature record: CXX_FEATURE:0cxx_generic_lambdas - Feature record: CXX_FEATURE:0cxx_inheriting_constructors - Feature record: CXX_FEATURE:0cxx_inline_namespaces - Feature record: CXX_FEATURE:0cxx_lambdas - Feature record: CXX_FEATURE:0cxx_lambda_init_captures - Feature record: CXX_FEATURE:0cxx_local_type_template_args - Feature record: CXX_FEATURE:0cxx_long_long_type - Feature record: CXX_FEATURE:0cxx_noexcept - Feature record: CXX_FEATURE:0cxx_nonstatic_member_init - Feature record: CXX_FEATURE:0cxx_nullptr - Feature record: CXX_FEATURE:0cxx_override - Feature record: CXX_FEATURE:0cxx_range_for - Feature record: CXX_FEATURE:0cxx_raw_string_literals - Feature record: CXX_FEATURE:0cxx_reference_qualified_functions - Feature record: CXX_FEATURE:0cxx_relaxed_constexpr - Feature record: CXX_FEATURE:0cxx_return_type_deduction - Feature record: CXX_FEATURE:0cxx_right_angle_brackets - Feature record: CXX_FEATURE:0cxx_rvalue_references - Feature record: CXX_FEATURE:0cxx_sizeof_member - Feature record: CXX_FEATURE:0cxx_static_assert - Feature record: CXX_FEATURE:0cxx_strong_enums - Feature record: CXX_FEATURE:1cxx_template_template_parameters - Feature record: CXX_FEATURE:0cxx_thread_local - Feature record: CXX_FEATURE:0cxx_trailing_return_types - Feature record: CXX_FEATURE:0cxx_unicode_literals - Feature record: CXX_FEATURE:0cxx_uniform_initialization - Feature record: CXX_FEATURE:0cxx_unrestricted_unions - Feature record: CXX_FEATURE:0cxx_user_literals - Feature record: CXX_FEATURE:0cxx_variable_templates - Feature record: CXX_FEATURE:0cxx_variadic_macros - Feature record: CXX_FEATURE:0cxx_variadic_templates diff --git a/CMakeFiles/Makefile.cmake b/CMakeFiles/Makefile.cmake deleted file mode 100644 index 16e2544..0000000 --- a/CMakeFiles/Makefile.cmake +++ /dev/null @@ -1,121 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -# The generator used is: -set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") - -# The top level Makefile was generated from the following files: -set(CMAKE_MAKEFILE_DEPENDS - "CMakeCache.txt" - "CMakeFiles/3.7.2/CMakeCCompiler.cmake" - "CMakeFiles/3.7.2/CMakeCXXCompiler.cmake" - "CMakeFiles/3.7.2/CMakeSystem.cmake" - "CMakeFiles/feature_tests.c" - "CMakeFiles/feature_tests.cxx" - "CMakeLists.txt" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCCompiler.cmake.in" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCCompilerABI.c" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCInformation.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCXXCompiler.cmake.in" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCXXCompilerABI.cpp" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCXXInformation.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCommonLanguageInclude.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeCompilerIdDetection.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCompileFeatures.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCompilerABI.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineCompilerId.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeDetermineSystem.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeFindBinUtils.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeGenericSystem.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeLanguageInformation.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeParseArguments.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeParseImplicitLinkInfo.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeSystem.cmake.in" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeSystemSpecificInformation.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeTestCCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeTestCXXCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeTestCompilerCommon.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/CMakeUnixFindMake.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/ADSP-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/ARMCC-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/AppleClang-C-FeatureTests.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/AppleClang-C.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/AppleClang-CXX-FeatureTests.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/AppleClang-CXX.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/AppleClang-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Borland-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Clang-CXX-TestableFeatures.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Clang-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Clang.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Cray-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/GHS-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/GNU-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/GNU.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/HP-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/IAR-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Intel-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/MIPSpro-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/MSVC-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/PGI-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/PathScale-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/SCO-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/TI-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/Watcom-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/XL-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/zOS-C-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Internal/FeatureTesting.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-AppleClang-C.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-AppleClang-CXX.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-Clang-C.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-Clang-CXX.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-Clang.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-Determine-CXX.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin-Initialize.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/Darwin.cmake" - "/usr/local/Cellar/cmake/3.7.2/share/cmake/Modules/Platform/UnixPaths.cmake" - ) - -# The corresponding makefile is: -set(CMAKE_MAKEFILE_OUTPUTS - "Makefile" - "CMakeFiles/cmake.check_cache" - ) - -# Byproducts of CMake generate step: -set(CMAKE_MAKEFILE_PRODUCTS - "CMakeFiles/3.7.2/CMakeSystem.cmake" - "CMakeFiles/3.7.2/CMakeCCompiler.cmake" - "CMakeFiles/3.7.2/CMakeCXXCompiler.cmake" - "CMakeFiles/3.7.2/CMakeCCompiler.cmake" - "CMakeFiles/3.7.2/CMakeCXXCompiler.cmake" - "CMakeFiles/CMakeDirectoryInformation.cmake" - ) - -# Dependency information for all targets: -set(CMAKE_DEPEND_INFO_FILES - "CMakeFiles/fec_test.dir/DependInfo.cmake" - "CMakeFiles/kcp_test.dir/DependInfo.cmake" - ) diff --git a/CMakeFiles/Makefile2 b/CMakeFiles/Makefile2 deleted file mode 100644 index ad2b48e..0000000 --- a/CMakeFiles/Makefile2 +++ /dev/null @@ -1,145 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -# Default target executed when no arguments are given to make. -default_target: all - -.PHONY : default_target - -# The main recursive all target -all: - -.PHONY : all - -# The main recursive preinstall target -preinstall: - -.PHONY : preinstall - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.7.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.7.2/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/yarshure/github/libkcp - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/yarshure/github/libkcp - -#============================================================================= -# Target rules for target CMakeFiles/fec_test.dir - -# All Build rule for target. -CMakeFiles/fec_test.dir/all: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/depend - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=1,2,3,4,5,6,7,8,9,10,11 "Built target fec_test" -.PHONY : CMakeFiles/fec_test.dir/all - -# Include target in all. -all: CMakeFiles/fec_test.dir/all - -.PHONY : all - -# Build rule for subdir invocation for target. -CMakeFiles/fec_test.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles 11 - $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/fec_test.dir/all - $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles 0 -.PHONY : CMakeFiles/fec_test.dir/rule - -# Convenience name for target. -fec_test: CMakeFiles/fec_test.dir/rule - -.PHONY : fec_test - -# clean rule for target. -CMakeFiles/fec_test.dir/clean: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/clean -.PHONY : CMakeFiles/fec_test.dir/clean - -# clean rule for target. -clean: CMakeFiles/fec_test.dir/clean - -.PHONY : clean - -#============================================================================= -# Target rules for target CMakeFiles/kcp_test.dir - -# All Build rule for target. -CMakeFiles/kcp_test.dir/all: - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/depend - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=12,13,14,15,16,17,18,19,20,21,22 "Built target kcp_test" -.PHONY : CMakeFiles/kcp_test.dir/all - -# Include target in all. -all: CMakeFiles/kcp_test.dir/all - -.PHONY : all - -# Build rule for subdir invocation for target. -CMakeFiles/kcp_test.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles 11 - $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/kcp_test.dir/all - $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles 0 -.PHONY : CMakeFiles/kcp_test.dir/rule - -# Convenience name for target. -kcp_test: CMakeFiles/kcp_test.dir/rule - -.PHONY : kcp_test - -# clean rule for target. -CMakeFiles/kcp_test.dir/clean: - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/clean -.PHONY : CMakeFiles/kcp_test.dir/clean - -# clean rule for target. -clean: CMakeFiles/kcp_test.dir/clean - -.PHONY : clean - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/CMakeFiles/TargetDirectories.txt b/CMakeFiles/TargetDirectories.txt deleted file mode 100644 index 0bd4392..0000000 --- a/CMakeFiles/TargetDirectories.txt +++ /dev/null @@ -1,4 +0,0 @@ -/Users/yarshure/github/libkcp/CMakeFiles/rebuild_cache.dir -/Users/yarshure/github/libkcp/CMakeFiles/edit_cache.dir -/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir -/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir diff --git a/CMakeFiles/cmake.check_cache b/CMakeFiles/cmake.check_cache deleted file mode 100644 index 3dccd73..0000000 --- a/CMakeFiles/cmake.check_cache +++ /dev/null @@ -1 +0,0 @@ -# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/CMakeFiles/feature_tests.bin b/CMakeFiles/feature_tests.bin deleted file mode 100755 index e0fe3cbbcbb26f8e964b338a2ea1b67593c73273..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8376 zcmeHM&5ImG6t9U{lyymR@&g6Oj|4TiyJ0;no{T!W(V!u2U=U)THU-+NUB^M3p1 zuZNEd(RxgX+oyyOXEAobd?VU;65?5mEet8IUH+hRvvd6uemhOAX*SBSolOWzx!u{> zo)!uE?df;5dx6-*5(YvFB&DZ;uNh3o?cIGEAA|QV*CNcH9*Z+`dy7q%Q5JZ|rg z+TH^W1jPK5z2WOezfx9q-`GSN+bi()xV?KX4C7-=nV4tX=g}Ddt5-h$sPo>H5q9mN z9dWMK1kZGDI0f7St~LJ>^1EI?FPz#!upGzq48|sS{@wxRw=qA7aSels?ekz+&d;Pj zu>XtBK&p+gg0WVWZY?w2wd5d6z%xCE!Et=`~Kizrw{VRAEK7C~w z%FE*Q5s#VaReUe&asDTX{qXnk8pkb`HV}4e>>K{|#fz(#RuP2hhPXB-dwBrU(Y zvm@W{T;9HMz4O+(9t@;PQ%9-tBopeXD)acO+IXWf^98vwBA*#m;$Qc?pFt@ukXkiw zq3A_SdhblPid!44A-ujL4WCKGLgfqT5BfB_)HPPQ1DP35PGym>!XN%L=(|~6EOC3G zQW>`e_JD^$cVJd7A)Up&k5;5Yg!2`Fxh{YxAq|dvsjr-h8zEcevRAl$`U@8uk|E3i%|Pa9GaZ;Y6D#n=!}{?0TrLY&NruwloP@Z+eCzwUv_Pg2XQ4 z=Fp-Y7bK0AnaaCKY-1U_OAZ!J%!sj>u_Ud^sq8Bq+r4w03>QMEQmZ~{G^$=`Y!==N zClzK^Al&d1-#NCRfu_Enh1PP14n?44PI;GHh$$jgWm(@xkVlC-ht$lfIAv4fYKtxH z%M!;F2R-*FanvJ6R+Ic3X9g#JVf8!8)Bqw2PN0dy0F|0xtD*KI(V2ADOGKZM>^h}C zBOfVMx2Lj-512a2h)9WgEP6GtvwmvaRaugYWCj3nR(a1(+rGp%&FIb;Kk&BCaYn>W z55Mb3C8!V-)NCN$DT7*0PdF_rYjly&f|Nl5`Oe2%Fq|&44l9d#NB%XRXi$pY0~KId z;A>Agqq<1Z2#INs!gU;E60U8fU9m`DYy`JH_gbIl>mM{Zb5E0do^N92@q69>&V70#fc{(qtgT|EE* diff --git a/CMakeFiles/feature_tests.c b/CMakeFiles/feature_tests.c deleted file mode 100644 index afbc86d..0000000 --- a/CMakeFiles/feature_tests.c +++ /dev/null @@ -1,34 +0,0 @@ - - const char features[] = {"\n" -"C_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 -"1" -#else -"0" -#endif -"c_function_prototypes\n" -"C_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -"1" -#else -"0" -#endif -"c_restrict\n" -"C_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L -"1" -#else -"0" -#endif -"c_static_assert\n" -"C_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -"1" -#else -"0" -#endif -"c_variadic_macros\n" - -}; - -int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/CMakeFiles/feature_tests.cxx b/CMakeFiles/feature_tests.cxx deleted file mode 100644 index 34d2e8c..0000000 --- a/CMakeFiles/feature_tests.cxx +++ /dev/null @@ -1,405 +0,0 @@ - - const char features[] = {"\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_aggregate_nsdmi) -"1" -#else -"0" -#endif -"cxx_aggregate_default_initializers\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_alias_templates) -"1" -#else -"0" -#endif -"cxx_alias_templates\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_alignas) -"1" -#else -"0" -#endif -"cxx_alignas\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_alignas) -"1" -#else -"0" -#endif -"cxx_alignof\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_attributes) -"1" -#else -"0" -#endif -"cxx_attributes\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 501 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_attribute_deprecated\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_auto_type) -"1" -#else -"0" -#endif -"cxx_auto_type\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_binary_literals) -"1" -#else -"0" -#endif -"cxx_binary_literals\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_constexpr) -"1" -#else -"0" -#endif -"cxx_constexpr\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_contextual_conversions) -"1" -#else -"0" -#endif -"cxx_contextual_conversions\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_decltype) -"1" -#else -"0" -#endif -"cxx_decltype\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 501 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_decltype_auto\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_decltype_incomplete_return_types) -"1" -#else -"0" -#endif -"cxx_decltype_incomplete_return_types\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_default_function_template_args) -"1" -#else -"0" -#endif -"cxx_default_function_template_args\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_defaulted_functions) -"1" -#else -"0" -#endif -"cxx_defaulted_functions\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_defaulted_functions) -"1" -#else -"0" -#endif -"cxx_defaulted_move_initializers\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_delegating_constructors) -"1" -#else -"0" -#endif -"cxx_delegating_constructors\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_deleted_functions) -"1" -#else -"0" -#endif -"cxx_deleted_functions\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 501 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_digit_separators\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_enum_forward_declarations\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_explicit_conversions) -"1" -#else -"0" -#endif -"cxx_explicit_conversions\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_extended_friend_declarations\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_extern_templates\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_override_control) -"1" -#else -"0" -#endif -"cxx_final\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_func_identifier\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_generalized_initializers) -"1" -#else -"0" -#endif -"cxx_generalized_initializers\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 501 && __cplusplus > 201103L -"1" -#else -"0" -#endif -"cxx_generic_lambdas\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_inheriting_constructors) -"1" -#else -"0" -#endif -"cxx_inheriting_constructors\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_inline_namespaces\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_lambdas) -"1" -#else -"0" -#endif -"cxx_lambdas\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_init_captures) -"1" -#else -"0" -#endif -"cxx_lambda_init_captures\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_local_type_template_args) -"1" -#else -"0" -#endif -"cxx_local_type_template_args\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_long_long_type\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_noexcept) -"1" -#else -"0" -#endif -"cxx_noexcept\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_nonstatic_member_init) -"1" -#else -"0" -#endif -"cxx_nonstatic_member_init\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_nullptr) -"1" -#else -"0" -#endif -"cxx_nullptr\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_override_control) -"1" -#else -"0" -#endif -"cxx_override\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_range_for) -"1" -#else -"0" -#endif -"cxx_range_for\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_raw_string_literals) -"1" -#else -"0" -#endif -"cxx_raw_string_literals\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_reference_qualified_functions) -"1" -#else -"0" -#endif -"cxx_reference_qualified_functions\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_relaxed_constexpr) -"1" -#else -"0" -#endif -"cxx_relaxed_constexpr\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_return_type_deduction) -"1" -#else -"0" -#endif -"cxx_return_type_deduction\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_right_angle_brackets\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_rvalue_references) -"1" -#else -"0" -#endif -"cxx_rvalue_references\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_sizeof_member\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_static_assert) -"1" -#else -"0" -#endif -"cxx_static_assert\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_strong_enums) -"1" -#else -"0" -#endif -"cxx_strong_enums\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 199711L -"1" -#else -"0" -#endif -"cxx_template_template_parameters\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_thread_local) -"1" -#else -"0" -#endif -"cxx_thread_local\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_trailing_return) -"1" -#else -"0" -#endif -"cxx_trailing_return_types\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_unicode_literals) -"1" -#else -"0" -#endif -"cxx_unicode_literals\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_generalized_initializers) -"1" -#else -"0" -#endif -"cxx_uniform_initialization\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_unrestricted_unions) -"1" -#else -"0" -#endif -"cxx_unrestricted_unions\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_user_literals) -"1" -#else -"0" -#endif -"cxx_user_literals\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_variable_templates) -"1" -#else -"0" -#endif -"cxx_variable_templates\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __cplusplus >= 201103L -"1" -#else -"0" -#endif -"cxx_variadic_macros\n" -"CXX_FEATURE:" -#if ((__clang_major__ * 100) + __clang_minor__) >= 400 && __has_feature(cxx_variadic_templates) -"1" -#else -"0" -#endif -"cxx_variadic_templates\n" - -}; - -int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/CMakeFiles/fec_test.dir/C.includecache b/CMakeFiles/fec_test.dir/C.includecache deleted file mode 100644 index a5dadc2..0000000 --- a/CMakeFiles/fec_test.dir/C.includecache +++ /dev/null @@ -1,42 +0,0 @@ -#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) - -#IncludeRegexScan: ^.*$ - -#IncludeRegexComplain: ^$ - -#IncludeRegexTransform: - -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/galois_table.c -galois.h -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/ikcp.c -ikcp.h -/Users/yarshure/github/libkcp/ikcp.h -stddef.h -- -stdlib.h -- -string.h -- -stdarg.h -- -stdio.h -- - -/Users/yarshure/github/libkcp/ikcp.h -stddef.h -- -stdlib.h -- -assert.h -- -sys/types.h -- -sys/inttypes.h -- -stdint.h -- - diff --git a/CMakeFiles/fec_test.dir/CXX.includecache b/CMakeFiles/fec_test.dir/CXX.includecache deleted file mode 100644 index 87bcc61..0000000 --- a/CMakeFiles/fec_test.dir/CXX.includecache +++ /dev/null @@ -1,156 +0,0 @@ -#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) - -#IncludeRegexScan: ^.*$ - -#IncludeRegexComplain: ^$ - -#IncludeRegexTransform: - -/Users/yarshure/github/libkcp/encoding.h -stdint.h -- - -/Users/yarshure/github/libkcp/fec.cpp -err.h -- -sys/time.h -- -iostream -- -stdexcept -- -fec.h -/Users/yarshure/github/libkcp/fec.h -sess.h -/Users/yarshure/github/libkcp/sess.h -encoding.h -/Users/yarshure/github/libkcp/encoding.h - -/Users/yarshure/github/libkcp/fec.h -vector -- -stdint.h -- -memory -- -reedsolomon.h -/Users/yarshure/github/libkcp/reedsolomon.h - -/Users/yarshure/github/libkcp/fec_test.cpp -iostream -- -sys/time.h -- -fec.h -/Users/yarshure/github/libkcp/fec.h - -/Users/yarshure/github/libkcp/galois.cpp -stdexcept -- -galois.h -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/galois_noasm.cpp -galois_noasm.h -/Users/yarshure/github/libkcp/galois_noasm.h -matrix.h -/Users/yarshure/github/libkcp/matrix.h - -/Users/yarshure/github/libkcp/galois_noasm.h -galois.h -/Users/yarshure/github/libkcp/galois.h -matrix.h -/Users/yarshure/github/libkcp/matrix.h - -/Users/yarshure/github/libkcp/ikcp.h -stddef.h -- -stdlib.h -- -assert.h -- -sys/types.h -- -sys/inttypes.h -- -stdint.h -- - -/Users/yarshure/github/libkcp/inversion_tree.cpp -iostream -- -inversion_tree.h -/Users/yarshure/github/libkcp/inversion_tree.h - -/Users/yarshure/github/libkcp/inversion_tree.h -vector -- -matrix.h -/Users/yarshure/github/libkcp/matrix.h - -/Users/yarshure/github/libkcp/matrix.cpp -galois.h -/Users/yarshure/github/libkcp/galois.h -matrix.h -/Users/yarshure/github/libkcp/matrix.h -stdexcept -- - -/Users/yarshure/github/libkcp/matrix.h -vector -- -memory -- -galois.h -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/reedsolomon.cpp -vector -- -stdexcept -- -iostream -- -reedsolomon.h -/Users/yarshure/github/libkcp/reedsolomon.h -galois_noasm.h -/Users/yarshure/github/libkcp/galois_noasm.h - -/Users/yarshure/github/libkcp/reedsolomon.h -matrix.h -/Users/yarshure/github/libkcp/matrix.h -inversion_tree.h -/Users/yarshure/github/libkcp/inversion_tree.h -galois.h -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/sess.cpp -sess.h -/Users/yarshure/github/libkcp/sess.h -encoding.h -/Users/yarshure/github/libkcp/encoding.h -iostream -- -sys/socket.h -- -sys/fcntl.h -- -arpa/inet.h -- -unistd.h -- -cstring -- - -/Users/yarshure/github/libkcp/sess.h -ikcp.h -/Users/yarshure/github/libkcp/ikcp.h -fec.h -/Users/yarshure/github/libkcp/fec.h -sys/types.h -- -sys/time.h -- - diff --git a/CMakeFiles/fec_test.dir/DependInfo.cmake b/CMakeFiles/fec_test.dir/DependInfo.cmake deleted file mode 100644 index 3eea39c..0000000 --- a/CMakeFiles/fec_test.dir/DependInfo.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# The set of languages for which implicit dependencies are needed: -set(CMAKE_DEPENDS_LANGUAGES - "C" - "CXX" - ) -# The set of files for implicit dependencies of each language: -set(CMAKE_DEPENDS_CHECK_C - "/Users/yarshure/github/libkcp/galois_table.c" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/galois_table.c.o" - "/Users/yarshure/github/libkcp/ikcp.c" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/ikcp.c.o" - ) -set(CMAKE_C_COMPILER_ID "Clang") - -# The include file search paths: -set(CMAKE_C_TARGET_INCLUDE_PATH - ) -set(CMAKE_DEPENDS_CHECK_CXX - "/Users/yarshure/github/libkcp/fec.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/fec.cpp.o" - "/Users/yarshure/github/libkcp/fec_test.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/fec_test.cpp.o" - "/Users/yarshure/github/libkcp/galois.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/galois.cpp.o" - "/Users/yarshure/github/libkcp/galois_noasm.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/galois_noasm.cpp.o" - "/Users/yarshure/github/libkcp/inversion_tree.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/inversion_tree.cpp.o" - "/Users/yarshure/github/libkcp/matrix.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/matrix.cpp.o" - "/Users/yarshure/github/libkcp/reedsolomon.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/reedsolomon.cpp.o" - "/Users/yarshure/github/libkcp/sess.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/sess.cpp.o" - ) -set(CMAKE_CXX_COMPILER_ID "Clang") - -# The include file search paths: -set(CMAKE_CXX_TARGET_INCLUDE_PATH - ) - -# Targets to which this target links. -set(CMAKE_TARGET_LINKED_INFO_FILES - ) - -# Fortran module output directory. -set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/CMakeFiles/fec_test.dir/build.make b/CMakeFiles/fec_test.dir/build.make deleted file mode 100644 index 31539de..0000000 --- a/CMakeFiles/fec_test.dir/build.make +++ /dev/null @@ -1,356 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -# Delete rule output on recipe failure. -.DELETE_ON_ERROR: - - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.7.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.7.2/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/yarshure/github/libkcp - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/yarshure/github/libkcp - -# Include any dependencies generated for this target. -include CMakeFiles/fec_test.dir/depend.make - -# Include the progress variables for this target. -include CMakeFiles/fec_test.dir/progress.make - -# Include the compile flags for this target's objects. -include CMakeFiles/fec_test.dir/flags.make - -CMakeFiles/fec_test.dir/ikcp.c.o: CMakeFiles/fec_test.dir/flags.make -CMakeFiles/fec_test.dir/ikcp.c.o: ikcp.c - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object CMakeFiles/fec_test.dir/ikcp.c.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/fec_test.dir/ikcp.c.o -c /Users/yarshure/github/libkcp/ikcp.c - -CMakeFiles/fec_test.dir/ikcp.c.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/fec_test.dir/ikcp.c.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /Users/yarshure/github/libkcp/ikcp.c > CMakeFiles/fec_test.dir/ikcp.c.i - -CMakeFiles/fec_test.dir/ikcp.c.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/fec_test.dir/ikcp.c.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /Users/yarshure/github/libkcp/ikcp.c -o CMakeFiles/fec_test.dir/ikcp.c.s - -CMakeFiles/fec_test.dir/ikcp.c.o.requires: - -.PHONY : CMakeFiles/fec_test.dir/ikcp.c.o.requires - -CMakeFiles/fec_test.dir/ikcp.c.o.provides: CMakeFiles/fec_test.dir/ikcp.c.o.requires - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/ikcp.c.o.provides.build -.PHONY : CMakeFiles/fec_test.dir/ikcp.c.o.provides - -CMakeFiles/fec_test.dir/ikcp.c.o.provides.build: CMakeFiles/fec_test.dir/ikcp.c.o - - -CMakeFiles/fec_test.dir/sess.cpp.o: CMakeFiles/fec_test.dir/flags.make -CMakeFiles/fec_test.dir/sess.cpp.o: sess.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/fec_test.dir/sess.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/sess.cpp.o -c /Users/yarshure/github/libkcp/sess.cpp - -CMakeFiles/fec_test.dir/sess.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/sess.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/sess.cpp > CMakeFiles/fec_test.dir/sess.cpp.i - -CMakeFiles/fec_test.dir/sess.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/sess.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/sess.cpp -o CMakeFiles/fec_test.dir/sess.cpp.s - -CMakeFiles/fec_test.dir/sess.cpp.o.requires: - -.PHONY : CMakeFiles/fec_test.dir/sess.cpp.o.requires - -CMakeFiles/fec_test.dir/sess.cpp.o.provides: CMakeFiles/fec_test.dir/sess.cpp.o.requires - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/sess.cpp.o.provides.build -.PHONY : CMakeFiles/fec_test.dir/sess.cpp.o.provides - -CMakeFiles/fec_test.dir/sess.cpp.o.provides.build: CMakeFiles/fec_test.dir/sess.cpp.o - - -CMakeFiles/fec_test.dir/galois.cpp.o: CMakeFiles/fec_test.dir/flags.make -CMakeFiles/fec_test.dir/galois.cpp.o: galois.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/fec_test.dir/galois.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/galois.cpp.o -c /Users/yarshure/github/libkcp/galois.cpp - -CMakeFiles/fec_test.dir/galois.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/galois.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/galois.cpp > CMakeFiles/fec_test.dir/galois.cpp.i - -CMakeFiles/fec_test.dir/galois.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/galois.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/galois.cpp -o CMakeFiles/fec_test.dir/galois.cpp.s - -CMakeFiles/fec_test.dir/galois.cpp.o.requires: - -.PHONY : CMakeFiles/fec_test.dir/galois.cpp.o.requires - -CMakeFiles/fec_test.dir/galois.cpp.o.provides: CMakeFiles/fec_test.dir/galois.cpp.o.requires - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois.cpp.o.provides.build -.PHONY : CMakeFiles/fec_test.dir/galois.cpp.o.provides - -CMakeFiles/fec_test.dir/galois.cpp.o.provides.build: CMakeFiles/fec_test.dir/galois.cpp.o - - -CMakeFiles/fec_test.dir/galois_noasm.cpp.o: CMakeFiles/fec_test.dir/flags.make -CMakeFiles/fec_test.dir/galois_noasm.cpp.o: galois_noasm.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/fec_test.dir/galois_noasm.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/galois_noasm.cpp.o -c /Users/yarshure/github/libkcp/galois_noasm.cpp - -CMakeFiles/fec_test.dir/galois_noasm.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/galois_noasm.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/galois_noasm.cpp > CMakeFiles/fec_test.dir/galois_noasm.cpp.i - -CMakeFiles/fec_test.dir/galois_noasm.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/galois_noasm.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/galois_noasm.cpp -o CMakeFiles/fec_test.dir/galois_noasm.cpp.s - -CMakeFiles/fec_test.dir/galois_noasm.cpp.o.requires: - -.PHONY : CMakeFiles/fec_test.dir/galois_noasm.cpp.o.requires - -CMakeFiles/fec_test.dir/galois_noasm.cpp.o.provides: CMakeFiles/fec_test.dir/galois_noasm.cpp.o.requires - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_noasm.cpp.o.provides.build -.PHONY : CMakeFiles/fec_test.dir/galois_noasm.cpp.o.provides - -CMakeFiles/fec_test.dir/galois_noasm.cpp.o.provides.build: CMakeFiles/fec_test.dir/galois_noasm.cpp.o - - -CMakeFiles/fec_test.dir/matrix.cpp.o: CMakeFiles/fec_test.dir/flags.make -CMakeFiles/fec_test.dir/matrix.cpp.o: matrix.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object CMakeFiles/fec_test.dir/matrix.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/matrix.cpp.o -c /Users/yarshure/github/libkcp/matrix.cpp - -CMakeFiles/fec_test.dir/matrix.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/matrix.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/matrix.cpp > CMakeFiles/fec_test.dir/matrix.cpp.i - -CMakeFiles/fec_test.dir/matrix.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/matrix.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/matrix.cpp -o CMakeFiles/fec_test.dir/matrix.cpp.s - -CMakeFiles/fec_test.dir/matrix.cpp.o.requires: - -.PHONY : CMakeFiles/fec_test.dir/matrix.cpp.o.requires - -CMakeFiles/fec_test.dir/matrix.cpp.o.provides: CMakeFiles/fec_test.dir/matrix.cpp.o.requires - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/matrix.cpp.o.provides.build -.PHONY : CMakeFiles/fec_test.dir/matrix.cpp.o.provides - -CMakeFiles/fec_test.dir/matrix.cpp.o.provides.build: CMakeFiles/fec_test.dir/matrix.cpp.o - - -CMakeFiles/fec_test.dir/inversion_tree.cpp.o: CMakeFiles/fec_test.dir/flags.make -CMakeFiles/fec_test.dir/inversion_tree.cpp.o: inversion_tree.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object CMakeFiles/fec_test.dir/inversion_tree.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/inversion_tree.cpp.o -c /Users/yarshure/github/libkcp/inversion_tree.cpp - -CMakeFiles/fec_test.dir/inversion_tree.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/inversion_tree.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/inversion_tree.cpp > CMakeFiles/fec_test.dir/inversion_tree.cpp.i - -CMakeFiles/fec_test.dir/inversion_tree.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/inversion_tree.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/inversion_tree.cpp -o CMakeFiles/fec_test.dir/inversion_tree.cpp.s - -CMakeFiles/fec_test.dir/inversion_tree.cpp.o.requires: - -.PHONY : CMakeFiles/fec_test.dir/inversion_tree.cpp.o.requires - -CMakeFiles/fec_test.dir/inversion_tree.cpp.o.provides: CMakeFiles/fec_test.dir/inversion_tree.cpp.o.requires - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/inversion_tree.cpp.o.provides.build -.PHONY : CMakeFiles/fec_test.dir/inversion_tree.cpp.o.provides - -CMakeFiles/fec_test.dir/inversion_tree.cpp.o.provides.build: CMakeFiles/fec_test.dir/inversion_tree.cpp.o - - -CMakeFiles/fec_test.dir/reedsolomon.cpp.o: CMakeFiles/fec_test.dir/flags.make -CMakeFiles/fec_test.dir/reedsolomon.cpp.o: reedsolomon.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object CMakeFiles/fec_test.dir/reedsolomon.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/reedsolomon.cpp.o -c /Users/yarshure/github/libkcp/reedsolomon.cpp - -CMakeFiles/fec_test.dir/reedsolomon.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/reedsolomon.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/reedsolomon.cpp > CMakeFiles/fec_test.dir/reedsolomon.cpp.i - -CMakeFiles/fec_test.dir/reedsolomon.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/reedsolomon.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/reedsolomon.cpp -o CMakeFiles/fec_test.dir/reedsolomon.cpp.s - -CMakeFiles/fec_test.dir/reedsolomon.cpp.o.requires: - -.PHONY : CMakeFiles/fec_test.dir/reedsolomon.cpp.o.requires - -CMakeFiles/fec_test.dir/reedsolomon.cpp.o.provides: CMakeFiles/fec_test.dir/reedsolomon.cpp.o.requires - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/reedsolomon.cpp.o.provides.build -.PHONY : CMakeFiles/fec_test.dir/reedsolomon.cpp.o.provides - -CMakeFiles/fec_test.dir/reedsolomon.cpp.o.provides.build: CMakeFiles/fec_test.dir/reedsolomon.cpp.o - - -CMakeFiles/fec_test.dir/fec.cpp.o: CMakeFiles/fec_test.dir/flags.make -CMakeFiles/fec_test.dir/fec.cpp.o: fec.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object CMakeFiles/fec_test.dir/fec.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/fec.cpp.o -c /Users/yarshure/github/libkcp/fec.cpp - -CMakeFiles/fec_test.dir/fec.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/fec.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/fec.cpp > CMakeFiles/fec_test.dir/fec.cpp.i - -CMakeFiles/fec_test.dir/fec.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/fec.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/fec.cpp -o CMakeFiles/fec_test.dir/fec.cpp.s - -CMakeFiles/fec_test.dir/fec.cpp.o.requires: - -.PHONY : CMakeFiles/fec_test.dir/fec.cpp.o.requires - -CMakeFiles/fec_test.dir/fec.cpp.o.provides: CMakeFiles/fec_test.dir/fec.cpp.o.requires - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec.cpp.o.provides.build -.PHONY : CMakeFiles/fec_test.dir/fec.cpp.o.provides - -CMakeFiles/fec_test.dir/fec.cpp.o.provides.build: CMakeFiles/fec_test.dir/fec.cpp.o - - -CMakeFiles/fec_test.dir/galois_table.c.o: CMakeFiles/fec_test.dir/flags.make -CMakeFiles/fec_test.dir/galois_table.c.o: galois_table.c - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building C object CMakeFiles/fec_test.dir/galois_table.c.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/fec_test.dir/galois_table.c.o -c /Users/yarshure/github/libkcp/galois_table.c - -CMakeFiles/fec_test.dir/galois_table.c.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/fec_test.dir/galois_table.c.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /Users/yarshure/github/libkcp/galois_table.c > CMakeFiles/fec_test.dir/galois_table.c.i - -CMakeFiles/fec_test.dir/galois_table.c.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/fec_test.dir/galois_table.c.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /Users/yarshure/github/libkcp/galois_table.c -o CMakeFiles/fec_test.dir/galois_table.c.s - -CMakeFiles/fec_test.dir/galois_table.c.o.requires: - -.PHONY : CMakeFiles/fec_test.dir/galois_table.c.o.requires - -CMakeFiles/fec_test.dir/galois_table.c.o.provides: CMakeFiles/fec_test.dir/galois_table.c.o.requires - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_table.c.o.provides.build -.PHONY : CMakeFiles/fec_test.dir/galois_table.c.o.provides - -CMakeFiles/fec_test.dir/galois_table.c.o.provides.build: CMakeFiles/fec_test.dir/galois_table.c.o - - -CMakeFiles/fec_test.dir/fec_test.cpp.o: CMakeFiles/fec_test.dir/flags.make -CMakeFiles/fec_test.dir/fec_test.cpp.o: fec_test.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object CMakeFiles/fec_test.dir/fec_test.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/fec_test.dir/fec_test.cpp.o -c /Users/yarshure/github/libkcp/fec_test.cpp - -CMakeFiles/fec_test.dir/fec_test.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/fec_test.dir/fec_test.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/fec_test.cpp > CMakeFiles/fec_test.dir/fec_test.cpp.i - -CMakeFiles/fec_test.dir/fec_test.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/fec_test.dir/fec_test.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/fec_test.cpp -o CMakeFiles/fec_test.dir/fec_test.cpp.s - -CMakeFiles/fec_test.dir/fec_test.cpp.o.requires: - -.PHONY : CMakeFiles/fec_test.dir/fec_test.cpp.o.requires - -CMakeFiles/fec_test.dir/fec_test.cpp.o.provides: CMakeFiles/fec_test.dir/fec_test.cpp.o.requires - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec_test.cpp.o.provides.build -.PHONY : CMakeFiles/fec_test.dir/fec_test.cpp.o.provides - -CMakeFiles/fec_test.dir/fec_test.cpp.o.provides.build: CMakeFiles/fec_test.dir/fec_test.cpp.o - - -# Object files for target fec_test -fec_test_OBJECTS = \ -"CMakeFiles/fec_test.dir/ikcp.c.o" \ -"CMakeFiles/fec_test.dir/sess.cpp.o" \ -"CMakeFiles/fec_test.dir/galois.cpp.o" \ -"CMakeFiles/fec_test.dir/galois_noasm.cpp.o" \ -"CMakeFiles/fec_test.dir/matrix.cpp.o" \ -"CMakeFiles/fec_test.dir/inversion_tree.cpp.o" \ -"CMakeFiles/fec_test.dir/reedsolomon.cpp.o" \ -"CMakeFiles/fec_test.dir/fec.cpp.o" \ -"CMakeFiles/fec_test.dir/galois_table.c.o" \ -"CMakeFiles/fec_test.dir/fec_test.cpp.o" - -# External object files for target fec_test -fec_test_EXTERNAL_OBJECTS = - -fec_test: CMakeFiles/fec_test.dir/ikcp.c.o -fec_test: CMakeFiles/fec_test.dir/sess.cpp.o -fec_test: CMakeFiles/fec_test.dir/galois.cpp.o -fec_test: CMakeFiles/fec_test.dir/galois_noasm.cpp.o -fec_test: CMakeFiles/fec_test.dir/matrix.cpp.o -fec_test: CMakeFiles/fec_test.dir/inversion_tree.cpp.o -fec_test: CMakeFiles/fec_test.dir/reedsolomon.cpp.o -fec_test: CMakeFiles/fec_test.dir/fec.cpp.o -fec_test: CMakeFiles/fec_test.dir/galois_table.c.o -fec_test: CMakeFiles/fec_test.dir/fec_test.cpp.o -fec_test: CMakeFiles/fec_test.dir/build.make -fec_test: CMakeFiles/fec_test.dir/link.txt - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Linking CXX executable fec_test" - $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/fec_test.dir/link.txt --verbose=$(VERBOSE) - -# Rule to build all files generated by this target. -CMakeFiles/fec_test.dir/build: fec_test - -.PHONY : CMakeFiles/fec_test.dir/build - -CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/ikcp.c.o.requires -CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/sess.cpp.o.requires -CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/galois.cpp.o.requires -CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/galois_noasm.cpp.o.requires -CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/matrix.cpp.o.requires -CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/inversion_tree.cpp.o.requires -CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/reedsolomon.cpp.o.requires -CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/fec.cpp.o.requires -CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/galois_table.c.o.requires -CMakeFiles/fec_test.dir/requires: CMakeFiles/fec_test.dir/fec_test.cpp.o.requires - -.PHONY : CMakeFiles/fec_test.dir/requires - -CMakeFiles/fec_test.dir/clean: - $(CMAKE_COMMAND) -P CMakeFiles/fec_test.dir/cmake_clean.cmake -.PHONY : CMakeFiles/fec_test.dir/clean - -CMakeFiles/fec_test.dir/depend: - cd /Users/yarshure/github/libkcp && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp/CMakeFiles/fec_test.dir/DependInfo.cmake --color=$(COLOR) -.PHONY : CMakeFiles/fec_test.dir/depend - diff --git a/CMakeFiles/fec_test.dir/cmake_clean.cmake b/CMakeFiles/fec_test.dir/cmake_clean.cmake deleted file mode 100644 index a75c27f..0000000 --- a/CMakeFiles/fec_test.dir/cmake_clean.cmake +++ /dev/null @@ -1,19 +0,0 @@ -file(REMOVE_RECURSE - "CMakeFiles/fec_test.dir/ikcp.c.o" - "CMakeFiles/fec_test.dir/sess.cpp.o" - "CMakeFiles/fec_test.dir/galois.cpp.o" - "CMakeFiles/fec_test.dir/galois_noasm.cpp.o" - "CMakeFiles/fec_test.dir/matrix.cpp.o" - "CMakeFiles/fec_test.dir/inversion_tree.cpp.o" - "CMakeFiles/fec_test.dir/reedsolomon.cpp.o" - "CMakeFiles/fec_test.dir/fec.cpp.o" - "CMakeFiles/fec_test.dir/galois_table.c.o" - "CMakeFiles/fec_test.dir/fec_test.cpp.o" - "fec_test.pdb" - "fec_test" -) - -# Per-language clean rules from dependency scanning. -foreach(lang C CXX) - include(CMakeFiles/fec_test.dir/cmake_clean_${lang}.cmake OPTIONAL) -endforeach() diff --git a/CMakeFiles/fec_test.dir/depend.internal b/CMakeFiles/fec_test.dir/depend.internal deleted file mode 100644 index 16788fa..0000000 --- a/CMakeFiles/fec_test.dir/depend.internal +++ /dev/null @@ -1,60 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -CMakeFiles/fec_test.dir/galois_table.c.o - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/galois_table.c -CMakeFiles/fec_test.dir/ikcp.c.o - /Users/yarshure/github/libkcp/ikcp.c - /Users/yarshure/github/libkcp/ikcp.h -CMakeFiles/fec_test.dir/fec.cpp.o - /Users/yarshure/github/libkcp/encoding.h - /Users/yarshure/github/libkcp/fec.cpp - /Users/yarshure/github/libkcp/fec.h - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/ikcp.h - /Users/yarshure/github/libkcp/inversion_tree.h - /Users/yarshure/github/libkcp/matrix.h - /Users/yarshure/github/libkcp/reedsolomon.h - /Users/yarshure/github/libkcp/sess.h -CMakeFiles/fec_test.dir/fec_test.cpp.o - /Users/yarshure/github/libkcp/fec.h - /Users/yarshure/github/libkcp/fec_test.cpp - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/inversion_tree.h - /Users/yarshure/github/libkcp/matrix.h - /Users/yarshure/github/libkcp/reedsolomon.h -CMakeFiles/fec_test.dir/galois.cpp.o - /Users/yarshure/github/libkcp/galois.cpp - /Users/yarshure/github/libkcp/galois.h -CMakeFiles/fec_test.dir/galois_noasm.cpp.o - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/galois_noasm.cpp - /Users/yarshure/github/libkcp/galois_noasm.h - /Users/yarshure/github/libkcp/matrix.h -CMakeFiles/fec_test.dir/inversion_tree.cpp.o - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/inversion_tree.cpp - /Users/yarshure/github/libkcp/inversion_tree.h - /Users/yarshure/github/libkcp/matrix.h -CMakeFiles/fec_test.dir/matrix.cpp.o - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/matrix.cpp - /Users/yarshure/github/libkcp/matrix.h -CMakeFiles/fec_test.dir/reedsolomon.cpp.o - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/galois_noasm.h - /Users/yarshure/github/libkcp/inversion_tree.h - /Users/yarshure/github/libkcp/matrix.h - /Users/yarshure/github/libkcp/reedsolomon.cpp - /Users/yarshure/github/libkcp/reedsolomon.h -CMakeFiles/fec_test.dir/sess.cpp.o - /Users/yarshure/github/libkcp/encoding.h - /Users/yarshure/github/libkcp/fec.h - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/ikcp.h - /Users/yarshure/github/libkcp/inversion_tree.h - /Users/yarshure/github/libkcp/matrix.h - /Users/yarshure/github/libkcp/reedsolomon.h - /Users/yarshure/github/libkcp/sess.cpp - /Users/yarshure/github/libkcp/sess.h diff --git a/CMakeFiles/fec_test.dir/depend.make b/CMakeFiles/fec_test.dir/depend.make deleted file mode 100644 index 0601982..0000000 --- a/CMakeFiles/fec_test.dir/depend.make +++ /dev/null @@ -1,60 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -CMakeFiles/fec_test.dir/galois_table.c.o: galois.h -CMakeFiles/fec_test.dir/galois_table.c.o: galois_table.c - -CMakeFiles/fec_test.dir/ikcp.c.o: ikcp.c -CMakeFiles/fec_test.dir/ikcp.c.o: ikcp.h - -CMakeFiles/fec_test.dir/fec.cpp.o: encoding.h -CMakeFiles/fec_test.dir/fec.cpp.o: fec.cpp -CMakeFiles/fec_test.dir/fec.cpp.o: fec.h -CMakeFiles/fec_test.dir/fec.cpp.o: galois.h -CMakeFiles/fec_test.dir/fec.cpp.o: ikcp.h -CMakeFiles/fec_test.dir/fec.cpp.o: inversion_tree.h -CMakeFiles/fec_test.dir/fec.cpp.o: matrix.h -CMakeFiles/fec_test.dir/fec.cpp.o: reedsolomon.h -CMakeFiles/fec_test.dir/fec.cpp.o: sess.h - -CMakeFiles/fec_test.dir/fec_test.cpp.o: fec.h -CMakeFiles/fec_test.dir/fec_test.cpp.o: fec_test.cpp -CMakeFiles/fec_test.dir/fec_test.cpp.o: galois.h -CMakeFiles/fec_test.dir/fec_test.cpp.o: inversion_tree.h -CMakeFiles/fec_test.dir/fec_test.cpp.o: matrix.h -CMakeFiles/fec_test.dir/fec_test.cpp.o: reedsolomon.h - -CMakeFiles/fec_test.dir/galois.cpp.o: galois.cpp -CMakeFiles/fec_test.dir/galois.cpp.o: galois.h - -CMakeFiles/fec_test.dir/galois_noasm.cpp.o: galois.h -CMakeFiles/fec_test.dir/galois_noasm.cpp.o: galois_noasm.cpp -CMakeFiles/fec_test.dir/galois_noasm.cpp.o: galois_noasm.h -CMakeFiles/fec_test.dir/galois_noasm.cpp.o: matrix.h - -CMakeFiles/fec_test.dir/inversion_tree.cpp.o: galois.h -CMakeFiles/fec_test.dir/inversion_tree.cpp.o: inversion_tree.cpp -CMakeFiles/fec_test.dir/inversion_tree.cpp.o: inversion_tree.h -CMakeFiles/fec_test.dir/inversion_tree.cpp.o: matrix.h - -CMakeFiles/fec_test.dir/matrix.cpp.o: galois.h -CMakeFiles/fec_test.dir/matrix.cpp.o: matrix.cpp -CMakeFiles/fec_test.dir/matrix.cpp.o: matrix.h - -CMakeFiles/fec_test.dir/reedsolomon.cpp.o: galois.h -CMakeFiles/fec_test.dir/reedsolomon.cpp.o: galois_noasm.h -CMakeFiles/fec_test.dir/reedsolomon.cpp.o: inversion_tree.h -CMakeFiles/fec_test.dir/reedsolomon.cpp.o: matrix.h -CMakeFiles/fec_test.dir/reedsolomon.cpp.o: reedsolomon.cpp -CMakeFiles/fec_test.dir/reedsolomon.cpp.o: reedsolomon.h - -CMakeFiles/fec_test.dir/sess.cpp.o: encoding.h -CMakeFiles/fec_test.dir/sess.cpp.o: fec.h -CMakeFiles/fec_test.dir/sess.cpp.o: galois.h -CMakeFiles/fec_test.dir/sess.cpp.o: ikcp.h -CMakeFiles/fec_test.dir/sess.cpp.o: inversion_tree.h -CMakeFiles/fec_test.dir/sess.cpp.o: matrix.h -CMakeFiles/fec_test.dir/sess.cpp.o: reedsolomon.h -CMakeFiles/fec_test.dir/sess.cpp.o: sess.cpp -CMakeFiles/fec_test.dir/sess.cpp.o: sess.h - diff --git a/CMakeFiles/fec_test.dir/flags.make b/CMakeFiles/fec_test.dir/flags.make deleted file mode 100644 index c6af713..0000000 --- a/CMakeFiles/fec_test.dir/flags.make +++ /dev/null @@ -1,17 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -# compile C with /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -# compile CXX with /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -C_FLAGS = - -C_DEFINES = - -C_INCLUDES = - -CXX_FLAGS = -std=c++11 - -CXX_DEFINES = - -CXX_INCLUDES = - diff --git a/CMakeFiles/fec_test.dir/link.txt b/CMakeFiles/fec_test.dir/link.txt deleted file mode 100644 index b035442..0000000 --- a/CMakeFiles/fec_test.dir/link.txt +++ /dev/null @@ -1 +0,0 @@ -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -std=c++11 -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/fec_test.dir/ikcp.c.o CMakeFiles/fec_test.dir/sess.cpp.o CMakeFiles/fec_test.dir/galois.cpp.o CMakeFiles/fec_test.dir/galois_noasm.cpp.o CMakeFiles/fec_test.dir/matrix.cpp.o CMakeFiles/fec_test.dir/inversion_tree.cpp.o CMakeFiles/fec_test.dir/reedsolomon.cpp.o CMakeFiles/fec_test.dir/fec.cpp.o CMakeFiles/fec_test.dir/galois_table.c.o CMakeFiles/fec_test.dir/fec_test.cpp.o -o fec_test diff --git a/CMakeFiles/fec_test.dir/progress.make b/CMakeFiles/fec_test.dir/progress.make deleted file mode 100644 index eeadf29..0000000 --- a/CMakeFiles/fec_test.dir/progress.make +++ /dev/null @@ -1,12 +0,0 @@ -CMAKE_PROGRESS_1 = 1 -CMAKE_PROGRESS_2 = 2 -CMAKE_PROGRESS_3 = 3 -CMAKE_PROGRESS_4 = 4 -CMAKE_PROGRESS_5 = 5 -CMAKE_PROGRESS_6 = 6 -CMAKE_PROGRESS_7 = 7 -CMAKE_PROGRESS_8 = 8 -CMAKE_PROGRESS_9 = 9 -CMAKE_PROGRESS_10 = 10 -CMAKE_PROGRESS_11 = 11 - diff --git a/CMakeFiles/kcp_test.dir/C.includecache b/CMakeFiles/kcp_test.dir/C.includecache deleted file mode 100644 index a5dadc2..0000000 --- a/CMakeFiles/kcp_test.dir/C.includecache +++ /dev/null @@ -1,42 +0,0 @@ -#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) - -#IncludeRegexScan: ^.*$ - -#IncludeRegexComplain: ^$ - -#IncludeRegexTransform: - -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/galois_table.c -galois.h -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/ikcp.c -ikcp.h -/Users/yarshure/github/libkcp/ikcp.h -stddef.h -- -stdlib.h -- -string.h -- -stdarg.h -- -stdio.h -- - -/Users/yarshure/github/libkcp/ikcp.h -stddef.h -- -stdlib.h -- -assert.h -- -sys/types.h -- -sys/inttypes.h -- -stdint.h -- - diff --git a/CMakeFiles/kcp_test.dir/CXX.includecache b/CMakeFiles/kcp_test.dir/CXX.includecache deleted file mode 100644 index 0d956f6..0000000 --- a/CMakeFiles/kcp_test.dir/CXX.includecache +++ /dev/null @@ -1,160 +0,0 @@ -#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) - -#IncludeRegexScan: ^.*$ - -#IncludeRegexComplain: ^$ - -#IncludeRegexTransform: - -/Users/yarshure/github/libkcp/encoding.h -stdint.h -- - -/Users/yarshure/github/libkcp/fec.cpp -err.h -- -sys/time.h -- -iostream -- -stdexcept -- -fec.h -/Users/yarshure/github/libkcp/fec.h -sess.h -/Users/yarshure/github/libkcp/sess.h -encoding.h -/Users/yarshure/github/libkcp/encoding.h - -/Users/yarshure/github/libkcp/fec.h -vector -- -stdint.h -- -memory -- -reedsolomon.h -/Users/yarshure/github/libkcp/reedsolomon.h - -/Users/yarshure/github/libkcp/galois.cpp -stdexcept -- -galois.h -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/galois_noasm.cpp -galois_noasm.h -/Users/yarshure/github/libkcp/galois_noasm.h -matrix.h -/Users/yarshure/github/libkcp/matrix.h - -/Users/yarshure/github/libkcp/galois_noasm.h -galois.h -/Users/yarshure/github/libkcp/galois.h -matrix.h -/Users/yarshure/github/libkcp/matrix.h - -/Users/yarshure/github/libkcp/ikcp.h -stddef.h -- -stdlib.h -- -assert.h -- -sys/types.h -- -sys/inttypes.h -- -stdint.h -- - -/Users/yarshure/github/libkcp/inversion_tree.cpp -iostream -- -inversion_tree.h -/Users/yarshure/github/libkcp/inversion_tree.h - -/Users/yarshure/github/libkcp/inversion_tree.h -vector -- -matrix.h -/Users/yarshure/github/libkcp/matrix.h - -/Users/yarshure/github/libkcp/kcp_test.cpp -unistd.h -- -sys/time.h -- -cstring -- -cstdio -- -sess.h -/Users/yarshure/github/libkcp/sess.h - -/Users/yarshure/github/libkcp/matrix.cpp -galois.h -/Users/yarshure/github/libkcp/galois.h -matrix.h -/Users/yarshure/github/libkcp/matrix.h -stdexcept -- - -/Users/yarshure/github/libkcp/matrix.h -vector -- -memory -- -galois.h -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/reedsolomon.cpp -vector -- -stdexcept -- -iostream -- -reedsolomon.h -/Users/yarshure/github/libkcp/reedsolomon.h -galois_noasm.h -/Users/yarshure/github/libkcp/galois_noasm.h - -/Users/yarshure/github/libkcp/reedsolomon.h -matrix.h -/Users/yarshure/github/libkcp/matrix.h -inversion_tree.h -/Users/yarshure/github/libkcp/inversion_tree.h -galois.h -/Users/yarshure/github/libkcp/galois.h - -/Users/yarshure/github/libkcp/sess.cpp -sess.h -/Users/yarshure/github/libkcp/sess.h -encoding.h -/Users/yarshure/github/libkcp/encoding.h -iostream -- -sys/socket.h -- -sys/fcntl.h -- -arpa/inet.h -- -unistd.h -- -cstring -- - -/Users/yarshure/github/libkcp/sess.h -ikcp.h -/Users/yarshure/github/libkcp/ikcp.h -fec.h -/Users/yarshure/github/libkcp/fec.h -sys/types.h -- -sys/time.h -- - diff --git a/CMakeFiles/kcp_test.dir/DependInfo.cmake b/CMakeFiles/kcp_test.dir/DependInfo.cmake deleted file mode 100644 index 38fff1e..0000000 --- a/CMakeFiles/kcp_test.dir/DependInfo.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# The set of languages for which implicit dependencies are needed: -set(CMAKE_DEPENDS_LANGUAGES - "C" - "CXX" - ) -# The set of files for implicit dependencies of each language: -set(CMAKE_DEPENDS_CHECK_C - "/Users/yarshure/github/libkcp/galois_table.c" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/galois_table.c.o" - "/Users/yarshure/github/libkcp/ikcp.c" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/ikcp.c.o" - ) -set(CMAKE_C_COMPILER_ID "Clang") - -# The include file search paths: -set(CMAKE_C_TARGET_INCLUDE_PATH - ) -set(CMAKE_DEPENDS_CHECK_CXX - "/Users/yarshure/github/libkcp/fec.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/fec.cpp.o" - "/Users/yarshure/github/libkcp/galois.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/galois.cpp.o" - "/Users/yarshure/github/libkcp/galois_noasm.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/galois_noasm.cpp.o" - "/Users/yarshure/github/libkcp/inversion_tree.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/inversion_tree.cpp.o" - "/Users/yarshure/github/libkcp/kcp_test.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/kcp_test.cpp.o" - "/Users/yarshure/github/libkcp/matrix.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/matrix.cpp.o" - "/Users/yarshure/github/libkcp/reedsolomon.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/reedsolomon.cpp.o" - "/Users/yarshure/github/libkcp/sess.cpp" "/Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/sess.cpp.o" - ) -set(CMAKE_CXX_COMPILER_ID "Clang") - -# The include file search paths: -set(CMAKE_CXX_TARGET_INCLUDE_PATH - ) - -# Targets to which this target links. -set(CMAKE_TARGET_LINKED_INFO_FILES - ) - -# Fortran module output directory. -set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/CMakeFiles/kcp_test.dir/build.make b/CMakeFiles/kcp_test.dir/build.make deleted file mode 100644 index 4225cf0..0000000 --- a/CMakeFiles/kcp_test.dir/build.make +++ /dev/null @@ -1,356 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -# Delete rule output on recipe failure. -.DELETE_ON_ERROR: - - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.7.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.7.2/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/yarshure/github/libkcp - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/yarshure/github/libkcp - -# Include any dependencies generated for this target. -include CMakeFiles/kcp_test.dir/depend.make - -# Include the progress variables for this target. -include CMakeFiles/kcp_test.dir/progress.make - -# Include the compile flags for this target's objects. -include CMakeFiles/kcp_test.dir/flags.make - -CMakeFiles/kcp_test.dir/ikcp.c.o: CMakeFiles/kcp_test.dir/flags.make -CMakeFiles/kcp_test.dir/ikcp.c.o: ikcp.c - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object CMakeFiles/kcp_test.dir/ikcp.c.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/kcp_test.dir/ikcp.c.o -c /Users/yarshure/github/libkcp/ikcp.c - -CMakeFiles/kcp_test.dir/ikcp.c.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/kcp_test.dir/ikcp.c.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /Users/yarshure/github/libkcp/ikcp.c > CMakeFiles/kcp_test.dir/ikcp.c.i - -CMakeFiles/kcp_test.dir/ikcp.c.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/kcp_test.dir/ikcp.c.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /Users/yarshure/github/libkcp/ikcp.c -o CMakeFiles/kcp_test.dir/ikcp.c.s - -CMakeFiles/kcp_test.dir/ikcp.c.o.requires: - -.PHONY : CMakeFiles/kcp_test.dir/ikcp.c.o.requires - -CMakeFiles/kcp_test.dir/ikcp.c.o.provides: CMakeFiles/kcp_test.dir/ikcp.c.o.requires - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/ikcp.c.o.provides.build -.PHONY : CMakeFiles/kcp_test.dir/ikcp.c.o.provides - -CMakeFiles/kcp_test.dir/ikcp.c.o.provides.build: CMakeFiles/kcp_test.dir/ikcp.c.o - - -CMakeFiles/kcp_test.dir/sess.cpp.o: CMakeFiles/kcp_test.dir/flags.make -CMakeFiles/kcp_test.dir/sess.cpp.o: sess.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/kcp_test.dir/sess.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/sess.cpp.o -c /Users/yarshure/github/libkcp/sess.cpp - -CMakeFiles/kcp_test.dir/sess.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/sess.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/sess.cpp > CMakeFiles/kcp_test.dir/sess.cpp.i - -CMakeFiles/kcp_test.dir/sess.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/sess.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/sess.cpp -o CMakeFiles/kcp_test.dir/sess.cpp.s - -CMakeFiles/kcp_test.dir/sess.cpp.o.requires: - -.PHONY : CMakeFiles/kcp_test.dir/sess.cpp.o.requires - -CMakeFiles/kcp_test.dir/sess.cpp.o.provides: CMakeFiles/kcp_test.dir/sess.cpp.o.requires - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/sess.cpp.o.provides.build -.PHONY : CMakeFiles/kcp_test.dir/sess.cpp.o.provides - -CMakeFiles/kcp_test.dir/sess.cpp.o.provides.build: CMakeFiles/kcp_test.dir/sess.cpp.o - - -CMakeFiles/kcp_test.dir/galois.cpp.o: CMakeFiles/kcp_test.dir/flags.make -CMakeFiles/kcp_test.dir/galois.cpp.o: galois.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/kcp_test.dir/galois.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/galois.cpp.o -c /Users/yarshure/github/libkcp/galois.cpp - -CMakeFiles/kcp_test.dir/galois.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/galois.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/galois.cpp > CMakeFiles/kcp_test.dir/galois.cpp.i - -CMakeFiles/kcp_test.dir/galois.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/galois.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/galois.cpp -o CMakeFiles/kcp_test.dir/galois.cpp.s - -CMakeFiles/kcp_test.dir/galois.cpp.o.requires: - -.PHONY : CMakeFiles/kcp_test.dir/galois.cpp.o.requires - -CMakeFiles/kcp_test.dir/galois.cpp.o.provides: CMakeFiles/kcp_test.dir/galois.cpp.o.requires - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois.cpp.o.provides.build -.PHONY : CMakeFiles/kcp_test.dir/galois.cpp.o.provides - -CMakeFiles/kcp_test.dir/galois.cpp.o.provides.build: CMakeFiles/kcp_test.dir/galois.cpp.o - - -CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: CMakeFiles/kcp_test.dir/flags.make -CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: galois_noasm.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/kcp_test.dir/galois_noasm.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/galois_noasm.cpp.o -c /Users/yarshure/github/libkcp/galois_noasm.cpp - -CMakeFiles/kcp_test.dir/galois_noasm.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/galois_noasm.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/galois_noasm.cpp > CMakeFiles/kcp_test.dir/galois_noasm.cpp.i - -CMakeFiles/kcp_test.dir/galois_noasm.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/galois_noasm.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/galois_noasm.cpp -o CMakeFiles/kcp_test.dir/galois_noasm.cpp.s - -CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.requires: - -.PHONY : CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.requires - -CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.provides: CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.requires - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.provides.build -.PHONY : CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.provides - -CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.provides.build: CMakeFiles/kcp_test.dir/galois_noasm.cpp.o - - -CMakeFiles/kcp_test.dir/matrix.cpp.o: CMakeFiles/kcp_test.dir/flags.make -CMakeFiles/kcp_test.dir/matrix.cpp.o: matrix.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object CMakeFiles/kcp_test.dir/matrix.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/matrix.cpp.o -c /Users/yarshure/github/libkcp/matrix.cpp - -CMakeFiles/kcp_test.dir/matrix.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/matrix.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/matrix.cpp > CMakeFiles/kcp_test.dir/matrix.cpp.i - -CMakeFiles/kcp_test.dir/matrix.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/matrix.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/matrix.cpp -o CMakeFiles/kcp_test.dir/matrix.cpp.s - -CMakeFiles/kcp_test.dir/matrix.cpp.o.requires: - -.PHONY : CMakeFiles/kcp_test.dir/matrix.cpp.o.requires - -CMakeFiles/kcp_test.dir/matrix.cpp.o.provides: CMakeFiles/kcp_test.dir/matrix.cpp.o.requires - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/matrix.cpp.o.provides.build -.PHONY : CMakeFiles/kcp_test.dir/matrix.cpp.o.provides - -CMakeFiles/kcp_test.dir/matrix.cpp.o.provides.build: CMakeFiles/kcp_test.dir/matrix.cpp.o - - -CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: CMakeFiles/kcp_test.dir/flags.make -CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: inversion_tree.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object CMakeFiles/kcp_test.dir/inversion_tree.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/inversion_tree.cpp.o -c /Users/yarshure/github/libkcp/inversion_tree.cpp - -CMakeFiles/kcp_test.dir/inversion_tree.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/inversion_tree.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/inversion_tree.cpp > CMakeFiles/kcp_test.dir/inversion_tree.cpp.i - -CMakeFiles/kcp_test.dir/inversion_tree.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/inversion_tree.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/inversion_tree.cpp -o CMakeFiles/kcp_test.dir/inversion_tree.cpp.s - -CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.requires: - -.PHONY : CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.requires - -CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.provides: CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.requires - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.provides.build -.PHONY : CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.provides - -CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.provides.build: CMakeFiles/kcp_test.dir/inversion_tree.cpp.o - - -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: CMakeFiles/kcp_test.dir/flags.make -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: reedsolomon.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object CMakeFiles/kcp_test.dir/reedsolomon.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/reedsolomon.cpp.o -c /Users/yarshure/github/libkcp/reedsolomon.cpp - -CMakeFiles/kcp_test.dir/reedsolomon.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/reedsolomon.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/reedsolomon.cpp > CMakeFiles/kcp_test.dir/reedsolomon.cpp.i - -CMakeFiles/kcp_test.dir/reedsolomon.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/reedsolomon.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/reedsolomon.cpp -o CMakeFiles/kcp_test.dir/reedsolomon.cpp.s - -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.requires: - -.PHONY : CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.requires - -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.provides: CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.requires - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.provides.build -.PHONY : CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.provides - -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.provides.build: CMakeFiles/kcp_test.dir/reedsolomon.cpp.o - - -CMakeFiles/kcp_test.dir/fec.cpp.o: CMakeFiles/kcp_test.dir/flags.make -CMakeFiles/kcp_test.dir/fec.cpp.o: fec.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object CMakeFiles/kcp_test.dir/fec.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/fec.cpp.o -c /Users/yarshure/github/libkcp/fec.cpp - -CMakeFiles/kcp_test.dir/fec.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/fec.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/fec.cpp > CMakeFiles/kcp_test.dir/fec.cpp.i - -CMakeFiles/kcp_test.dir/fec.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/fec.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/fec.cpp -o CMakeFiles/kcp_test.dir/fec.cpp.s - -CMakeFiles/kcp_test.dir/fec.cpp.o.requires: - -.PHONY : CMakeFiles/kcp_test.dir/fec.cpp.o.requires - -CMakeFiles/kcp_test.dir/fec.cpp.o.provides: CMakeFiles/kcp_test.dir/fec.cpp.o.requires - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/fec.cpp.o.provides.build -.PHONY : CMakeFiles/kcp_test.dir/fec.cpp.o.provides - -CMakeFiles/kcp_test.dir/fec.cpp.o.provides.build: CMakeFiles/kcp_test.dir/fec.cpp.o - - -CMakeFiles/kcp_test.dir/galois_table.c.o: CMakeFiles/kcp_test.dir/flags.make -CMakeFiles/kcp_test.dir/galois_table.c.o: galois_table.c - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building C object CMakeFiles/kcp_test.dir/galois_table.c.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/kcp_test.dir/galois_table.c.o -c /Users/yarshure/github/libkcp/galois_table.c - -CMakeFiles/kcp_test.dir/galois_table.c.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/kcp_test.dir/galois_table.c.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /Users/yarshure/github/libkcp/galois_table.c > CMakeFiles/kcp_test.dir/galois_table.c.i - -CMakeFiles/kcp_test.dir/galois_table.c.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/kcp_test.dir/galois_table.c.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /Users/yarshure/github/libkcp/galois_table.c -o CMakeFiles/kcp_test.dir/galois_table.c.s - -CMakeFiles/kcp_test.dir/galois_table.c.o.requires: - -.PHONY : CMakeFiles/kcp_test.dir/galois_table.c.o.requires - -CMakeFiles/kcp_test.dir/galois_table.c.o.provides: CMakeFiles/kcp_test.dir/galois_table.c.o.requires - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_table.c.o.provides.build -.PHONY : CMakeFiles/kcp_test.dir/galois_table.c.o.provides - -CMakeFiles/kcp_test.dir/galois_table.c.o.provides.build: CMakeFiles/kcp_test.dir/galois_table.c.o - - -CMakeFiles/kcp_test.dir/kcp_test.cpp.o: CMakeFiles/kcp_test.dir/flags.make -CMakeFiles/kcp_test.dir/kcp_test.cpp.o: kcp_test.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object CMakeFiles/kcp_test.dir/kcp_test.cpp.o" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/kcp_test.dir/kcp_test.cpp.o -c /Users/yarshure/github/libkcp/kcp_test.cpp - -CMakeFiles/kcp_test.dir/kcp_test.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/kcp_test.dir/kcp_test.cpp.i" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /Users/yarshure/github/libkcp/kcp_test.cpp > CMakeFiles/kcp_test.dir/kcp_test.cpp.i - -CMakeFiles/kcp_test.dir/kcp_test.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/kcp_test.dir/kcp_test.cpp.s" - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /Users/yarshure/github/libkcp/kcp_test.cpp -o CMakeFiles/kcp_test.dir/kcp_test.cpp.s - -CMakeFiles/kcp_test.dir/kcp_test.cpp.o.requires: - -.PHONY : CMakeFiles/kcp_test.dir/kcp_test.cpp.o.requires - -CMakeFiles/kcp_test.dir/kcp_test.cpp.o.provides: CMakeFiles/kcp_test.dir/kcp_test.cpp.o.requires - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/kcp_test.cpp.o.provides.build -.PHONY : CMakeFiles/kcp_test.dir/kcp_test.cpp.o.provides - -CMakeFiles/kcp_test.dir/kcp_test.cpp.o.provides.build: CMakeFiles/kcp_test.dir/kcp_test.cpp.o - - -# Object files for target kcp_test -kcp_test_OBJECTS = \ -"CMakeFiles/kcp_test.dir/ikcp.c.o" \ -"CMakeFiles/kcp_test.dir/sess.cpp.o" \ -"CMakeFiles/kcp_test.dir/galois.cpp.o" \ -"CMakeFiles/kcp_test.dir/galois_noasm.cpp.o" \ -"CMakeFiles/kcp_test.dir/matrix.cpp.o" \ -"CMakeFiles/kcp_test.dir/inversion_tree.cpp.o" \ -"CMakeFiles/kcp_test.dir/reedsolomon.cpp.o" \ -"CMakeFiles/kcp_test.dir/fec.cpp.o" \ -"CMakeFiles/kcp_test.dir/galois_table.c.o" \ -"CMakeFiles/kcp_test.dir/kcp_test.cpp.o" - -# External object files for target kcp_test -kcp_test_EXTERNAL_OBJECTS = - -kcp_test: CMakeFiles/kcp_test.dir/ikcp.c.o -kcp_test: CMakeFiles/kcp_test.dir/sess.cpp.o -kcp_test: CMakeFiles/kcp_test.dir/galois.cpp.o -kcp_test: CMakeFiles/kcp_test.dir/galois_noasm.cpp.o -kcp_test: CMakeFiles/kcp_test.dir/matrix.cpp.o -kcp_test: CMakeFiles/kcp_test.dir/inversion_tree.cpp.o -kcp_test: CMakeFiles/kcp_test.dir/reedsolomon.cpp.o -kcp_test: CMakeFiles/kcp_test.dir/fec.cpp.o -kcp_test: CMakeFiles/kcp_test.dir/galois_table.c.o -kcp_test: CMakeFiles/kcp_test.dir/kcp_test.cpp.o -kcp_test: CMakeFiles/kcp_test.dir/build.make -kcp_test: CMakeFiles/kcp_test.dir/link.txt - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/Users/yarshure/github/libkcp/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Linking CXX executable kcp_test" - $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/kcp_test.dir/link.txt --verbose=$(VERBOSE) - -# Rule to build all files generated by this target. -CMakeFiles/kcp_test.dir/build: kcp_test - -.PHONY : CMakeFiles/kcp_test.dir/build - -CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/ikcp.c.o.requires -CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/sess.cpp.o.requires -CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/galois.cpp.o.requires -CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/galois_noasm.cpp.o.requires -CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/matrix.cpp.o.requires -CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/inversion_tree.cpp.o.requires -CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/reedsolomon.cpp.o.requires -CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/fec.cpp.o.requires -CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/galois_table.c.o.requires -CMakeFiles/kcp_test.dir/requires: CMakeFiles/kcp_test.dir/kcp_test.cpp.o.requires - -.PHONY : CMakeFiles/kcp_test.dir/requires - -CMakeFiles/kcp_test.dir/clean: - $(CMAKE_COMMAND) -P CMakeFiles/kcp_test.dir/cmake_clean.cmake -.PHONY : CMakeFiles/kcp_test.dir/clean - -CMakeFiles/kcp_test.dir/depend: - cd /Users/yarshure/github/libkcp && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp /Users/yarshure/github/libkcp/CMakeFiles/kcp_test.dir/DependInfo.cmake --color=$(COLOR) -.PHONY : CMakeFiles/kcp_test.dir/depend - diff --git a/CMakeFiles/kcp_test.dir/cmake_clean.cmake b/CMakeFiles/kcp_test.dir/cmake_clean.cmake deleted file mode 100644 index 11e0e93..0000000 --- a/CMakeFiles/kcp_test.dir/cmake_clean.cmake +++ /dev/null @@ -1,19 +0,0 @@ -file(REMOVE_RECURSE - "CMakeFiles/kcp_test.dir/ikcp.c.o" - "CMakeFiles/kcp_test.dir/sess.cpp.o" - "CMakeFiles/kcp_test.dir/galois.cpp.o" - "CMakeFiles/kcp_test.dir/galois_noasm.cpp.o" - "CMakeFiles/kcp_test.dir/matrix.cpp.o" - "CMakeFiles/kcp_test.dir/inversion_tree.cpp.o" - "CMakeFiles/kcp_test.dir/reedsolomon.cpp.o" - "CMakeFiles/kcp_test.dir/fec.cpp.o" - "CMakeFiles/kcp_test.dir/galois_table.c.o" - "CMakeFiles/kcp_test.dir/kcp_test.cpp.o" - "kcp_test.pdb" - "kcp_test" -) - -# Per-language clean rules from dependency scanning. -foreach(lang C CXX) - include(CMakeFiles/kcp_test.dir/cmake_clean_${lang}.cmake OPTIONAL) -endforeach() diff --git a/CMakeFiles/kcp_test.dir/depend.internal b/CMakeFiles/kcp_test.dir/depend.internal deleted file mode 100644 index 6c00505..0000000 --- a/CMakeFiles/kcp_test.dir/depend.internal +++ /dev/null @@ -1,62 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -CMakeFiles/kcp_test.dir/galois_table.c.o - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/galois_table.c -CMakeFiles/kcp_test.dir/ikcp.c.o - /Users/yarshure/github/libkcp/ikcp.c - /Users/yarshure/github/libkcp/ikcp.h -CMakeFiles/kcp_test.dir/fec.cpp.o - /Users/yarshure/github/libkcp/encoding.h - /Users/yarshure/github/libkcp/fec.cpp - /Users/yarshure/github/libkcp/fec.h - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/ikcp.h - /Users/yarshure/github/libkcp/inversion_tree.h - /Users/yarshure/github/libkcp/matrix.h - /Users/yarshure/github/libkcp/reedsolomon.h - /Users/yarshure/github/libkcp/sess.h -CMakeFiles/kcp_test.dir/galois.cpp.o - /Users/yarshure/github/libkcp/galois.cpp - /Users/yarshure/github/libkcp/galois.h -CMakeFiles/kcp_test.dir/galois_noasm.cpp.o - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/galois_noasm.cpp - /Users/yarshure/github/libkcp/galois_noasm.h - /Users/yarshure/github/libkcp/matrix.h -CMakeFiles/kcp_test.dir/inversion_tree.cpp.o - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/inversion_tree.cpp - /Users/yarshure/github/libkcp/inversion_tree.h - /Users/yarshure/github/libkcp/matrix.h -CMakeFiles/kcp_test.dir/kcp_test.cpp.o - /Users/yarshure/github/libkcp/fec.h - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/ikcp.h - /Users/yarshure/github/libkcp/inversion_tree.h - /Users/yarshure/github/libkcp/kcp_test.cpp - /Users/yarshure/github/libkcp/matrix.h - /Users/yarshure/github/libkcp/reedsolomon.h - /Users/yarshure/github/libkcp/sess.h -CMakeFiles/kcp_test.dir/matrix.cpp.o - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/matrix.cpp - /Users/yarshure/github/libkcp/matrix.h -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/galois_noasm.h - /Users/yarshure/github/libkcp/inversion_tree.h - /Users/yarshure/github/libkcp/matrix.h - /Users/yarshure/github/libkcp/reedsolomon.cpp - /Users/yarshure/github/libkcp/reedsolomon.h -CMakeFiles/kcp_test.dir/sess.cpp.o - /Users/yarshure/github/libkcp/encoding.h - /Users/yarshure/github/libkcp/fec.h - /Users/yarshure/github/libkcp/galois.h - /Users/yarshure/github/libkcp/ikcp.h - /Users/yarshure/github/libkcp/inversion_tree.h - /Users/yarshure/github/libkcp/matrix.h - /Users/yarshure/github/libkcp/reedsolomon.h - /Users/yarshure/github/libkcp/sess.cpp - /Users/yarshure/github/libkcp/sess.h diff --git a/CMakeFiles/kcp_test.dir/depend.make b/CMakeFiles/kcp_test.dir/depend.make deleted file mode 100644 index 8ff065d..0000000 --- a/CMakeFiles/kcp_test.dir/depend.make +++ /dev/null @@ -1,62 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -CMakeFiles/kcp_test.dir/galois_table.c.o: galois.h -CMakeFiles/kcp_test.dir/galois_table.c.o: galois_table.c - -CMakeFiles/kcp_test.dir/ikcp.c.o: ikcp.c -CMakeFiles/kcp_test.dir/ikcp.c.o: ikcp.h - -CMakeFiles/kcp_test.dir/fec.cpp.o: encoding.h -CMakeFiles/kcp_test.dir/fec.cpp.o: fec.cpp -CMakeFiles/kcp_test.dir/fec.cpp.o: fec.h -CMakeFiles/kcp_test.dir/fec.cpp.o: galois.h -CMakeFiles/kcp_test.dir/fec.cpp.o: ikcp.h -CMakeFiles/kcp_test.dir/fec.cpp.o: inversion_tree.h -CMakeFiles/kcp_test.dir/fec.cpp.o: matrix.h -CMakeFiles/kcp_test.dir/fec.cpp.o: reedsolomon.h -CMakeFiles/kcp_test.dir/fec.cpp.o: sess.h - -CMakeFiles/kcp_test.dir/galois.cpp.o: galois.cpp -CMakeFiles/kcp_test.dir/galois.cpp.o: galois.h - -CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: galois.h -CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: galois_noasm.cpp -CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: galois_noasm.h -CMakeFiles/kcp_test.dir/galois_noasm.cpp.o: matrix.h - -CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: galois.h -CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: inversion_tree.cpp -CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: inversion_tree.h -CMakeFiles/kcp_test.dir/inversion_tree.cpp.o: matrix.h - -CMakeFiles/kcp_test.dir/kcp_test.cpp.o: fec.h -CMakeFiles/kcp_test.dir/kcp_test.cpp.o: galois.h -CMakeFiles/kcp_test.dir/kcp_test.cpp.o: ikcp.h -CMakeFiles/kcp_test.dir/kcp_test.cpp.o: inversion_tree.h -CMakeFiles/kcp_test.dir/kcp_test.cpp.o: kcp_test.cpp -CMakeFiles/kcp_test.dir/kcp_test.cpp.o: matrix.h -CMakeFiles/kcp_test.dir/kcp_test.cpp.o: reedsolomon.h -CMakeFiles/kcp_test.dir/kcp_test.cpp.o: sess.h - -CMakeFiles/kcp_test.dir/matrix.cpp.o: galois.h -CMakeFiles/kcp_test.dir/matrix.cpp.o: matrix.cpp -CMakeFiles/kcp_test.dir/matrix.cpp.o: matrix.h - -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: galois.h -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: galois_noasm.h -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: inversion_tree.h -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: matrix.h -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: reedsolomon.cpp -CMakeFiles/kcp_test.dir/reedsolomon.cpp.o: reedsolomon.h - -CMakeFiles/kcp_test.dir/sess.cpp.o: encoding.h -CMakeFiles/kcp_test.dir/sess.cpp.o: fec.h -CMakeFiles/kcp_test.dir/sess.cpp.o: galois.h -CMakeFiles/kcp_test.dir/sess.cpp.o: ikcp.h -CMakeFiles/kcp_test.dir/sess.cpp.o: inversion_tree.h -CMakeFiles/kcp_test.dir/sess.cpp.o: matrix.h -CMakeFiles/kcp_test.dir/sess.cpp.o: reedsolomon.h -CMakeFiles/kcp_test.dir/sess.cpp.o: sess.cpp -CMakeFiles/kcp_test.dir/sess.cpp.o: sess.h - diff --git a/CMakeFiles/kcp_test.dir/flags.make b/CMakeFiles/kcp_test.dir/flags.make deleted file mode 100644 index c6af713..0000000 --- a/CMakeFiles/kcp_test.dir/flags.make +++ /dev/null @@ -1,17 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -# compile C with /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -# compile CXX with /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -C_FLAGS = - -C_DEFINES = - -C_INCLUDES = - -CXX_FLAGS = -std=c++11 - -CXX_DEFINES = - -CXX_INCLUDES = - diff --git a/CMakeFiles/kcp_test.dir/link.txt b/CMakeFiles/kcp_test.dir/link.txt deleted file mode 100644 index 9af9385..0000000 --- a/CMakeFiles/kcp_test.dir/link.txt +++ /dev/null @@ -1 +0,0 @@ -/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -std=c++11 -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/kcp_test.dir/ikcp.c.o CMakeFiles/kcp_test.dir/sess.cpp.o CMakeFiles/kcp_test.dir/galois.cpp.o CMakeFiles/kcp_test.dir/galois_noasm.cpp.o CMakeFiles/kcp_test.dir/matrix.cpp.o CMakeFiles/kcp_test.dir/inversion_tree.cpp.o CMakeFiles/kcp_test.dir/reedsolomon.cpp.o CMakeFiles/kcp_test.dir/fec.cpp.o CMakeFiles/kcp_test.dir/galois_table.c.o CMakeFiles/kcp_test.dir/kcp_test.cpp.o -o kcp_test diff --git a/CMakeFiles/kcp_test.dir/progress.make b/CMakeFiles/kcp_test.dir/progress.make deleted file mode 100644 index 4a1edec..0000000 --- a/CMakeFiles/kcp_test.dir/progress.make +++ /dev/null @@ -1,12 +0,0 @@ -CMAKE_PROGRESS_1 = 12 -CMAKE_PROGRESS_2 = 13 -CMAKE_PROGRESS_3 = 14 -CMAKE_PROGRESS_4 = 15 -CMAKE_PROGRESS_5 = 16 -CMAKE_PROGRESS_6 = 17 -CMAKE_PROGRESS_7 = 18 -CMAKE_PROGRESS_8 = 19 -CMAKE_PROGRESS_9 = 20 -CMAKE_PROGRESS_10 = 21 -CMAKE_PROGRESS_11 = 22 - diff --git a/CMakeFiles/progress.marks b/CMakeFiles/progress.marks deleted file mode 100644 index 2bd5a0a..0000000 --- a/CMakeFiles/progress.marks +++ /dev/null @@ -1 +0,0 @@ -22 diff --git a/Makefile b/Makefile deleted file mode 100644 index 85e7ea2..0000000 --- a/Makefile +++ /dev/null @@ -1,519 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.7 - -# Default target executed when no arguments are given to make. -default_target: all - -.PHONY : default_target - -# Allow only one "make -f Makefile2" at a time, but pass parallelism. -.NOTPARALLEL: - - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/local/Cellar/cmake/3.7.2/bin/cmake - -# The command to remove a file. -RM = /usr/local/Cellar/cmake/3.7.2/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/yarshure/github/libkcp - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/yarshure/github/libkcp - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." - /usr/local/Cellar/cmake/3.7.2/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache - -.PHONY : rebuild_cache/fast - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." - /usr/local/Cellar/cmake/3.7.2/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache/fast: edit_cache - -.PHONY : edit_cache/fast - -# The main all target -all: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles /Users/yarshure/github/libkcp/CMakeFiles/progress.marks - $(MAKE) -f CMakeFiles/Makefile2 all - $(CMAKE_COMMAND) -E cmake_progress_start /Users/yarshure/github/libkcp/CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - $(MAKE) -f CMakeFiles/Makefile2 clean -.PHONY : clean - -# The main clean target -clean/fast: clean - -.PHONY : clean/fast - -# Prepare targets for installation. -preinstall: all - $(MAKE) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall/fast: - $(MAKE) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall/fast - -# clear depends -depend: - $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -.PHONY : depend - -#============================================================================= -# Target rules for targets named fec_test - -# Build rule for target. -fec_test: cmake_check_build_system - $(MAKE) -f CMakeFiles/Makefile2 fec_test -.PHONY : fec_test - -# fast build rule for target. -fec_test/fast: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/build -.PHONY : fec_test/fast - -#============================================================================= -# Target rules for targets named kcp_test - -# Build rule for target. -kcp_test: cmake_check_build_system - $(MAKE) -f CMakeFiles/Makefile2 kcp_test -.PHONY : kcp_test - -# fast build rule for target. -kcp_test/fast: - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/build -.PHONY : kcp_test/fast - -fec.o: fec.cpp.o - -.PHONY : fec.o - -# target to build an object file -fec.cpp.o: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec.cpp.o - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/fec.cpp.o -.PHONY : fec.cpp.o - -fec.i: fec.cpp.i - -.PHONY : fec.i - -# target to preprocess a source file -fec.cpp.i: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec.cpp.i - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/fec.cpp.i -.PHONY : fec.cpp.i - -fec.s: fec.cpp.s - -.PHONY : fec.s - -# target to generate assembly for a file -fec.cpp.s: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec.cpp.s - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/fec.cpp.s -.PHONY : fec.cpp.s - -fec_test.o: fec_test.cpp.o - -.PHONY : fec_test.o - -# target to build an object file -fec_test.cpp.o: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec_test.cpp.o -.PHONY : fec_test.cpp.o - -fec_test.i: fec_test.cpp.i - -.PHONY : fec_test.i - -# target to preprocess a source file -fec_test.cpp.i: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec_test.cpp.i -.PHONY : fec_test.cpp.i - -fec_test.s: fec_test.cpp.s - -.PHONY : fec_test.s - -# target to generate assembly for a file -fec_test.cpp.s: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/fec_test.cpp.s -.PHONY : fec_test.cpp.s - -galois.o: galois.cpp.o - -.PHONY : galois.o - -# target to build an object file -galois.cpp.o: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois.cpp.o - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois.cpp.o -.PHONY : galois.cpp.o - -galois.i: galois.cpp.i - -.PHONY : galois.i - -# target to preprocess a source file -galois.cpp.i: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois.cpp.i - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois.cpp.i -.PHONY : galois.cpp.i - -galois.s: galois.cpp.s - -.PHONY : galois.s - -# target to generate assembly for a file -galois.cpp.s: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois.cpp.s - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois.cpp.s -.PHONY : galois.cpp.s - -galois_noasm.o: galois_noasm.cpp.o - -.PHONY : galois_noasm.o - -# target to build an object file -galois_noasm.cpp.o: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_noasm.cpp.o - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_noasm.cpp.o -.PHONY : galois_noasm.cpp.o - -galois_noasm.i: galois_noasm.cpp.i - -.PHONY : galois_noasm.i - -# target to preprocess a source file -galois_noasm.cpp.i: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_noasm.cpp.i - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_noasm.cpp.i -.PHONY : galois_noasm.cpp.i - -galois_noasm.s: galois_noasm.cpp.s - -.PHONY : galois_noasm.s - -# target to generate assembly for a file -galois_noasm.cpp.s: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_noasm.cpp.s - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_noasm.cpp.s -.PHONY : galois_noasm.cpp.s - -galois_table.o: galois_table.c.o - -.PHONY : galois_table.o - -# target to build an object file -galois_table.c.o: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_table.c.o - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_table.c.o -.PHONY : galois_table.c.o - -galois_table.i: galois_table.c.i - -.PHONY : galois_table.i - -# target to preprocess a source file -galois_table.c.i: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_table.c.i - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_table.c.i -.PHONY : galois_table.c.i - -galois_table.s: galois_table.c.s - -.PHONY : galois_table.s - -# target to generate assembly for a file -galois_table.c.s: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/galois_table.c.s - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/galois_table.c.s -.PHONY : galois_table.c.s - -ikcp.o: ikcp.c.o - -.PHONY : ikcp.o - -# target to build an object file -ikcp.c.o: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/ikcp.c.o - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/ikcp.c.o -.PHONY : ikcp.c.o - -ikcp.i: ikcp.c.i - -.PHONY : ikcp.i - -# target to preprocess a source file -ikcp.c.i: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/ikcp.c.i - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/ikcp.c.i -.PHONY : ikcp.c.i - -ikcp.s: ikcp.c.s - -.PHONY : ikcp.s - -# target to generate assembly for a file -ikcp.c.s: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/ikcp.c.s - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/ikcp.c.s -.PHONY : ikcp.c.s - -inversion_tree.o: inversion_tree.cpp.o - -.PHONY : inversion_tree.o - -# target to build an object file -inversion_tree.cpp.o: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/inversion_tree.cpp.o - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/inversion_tree.cpp.o -.PHONY : inversion_tree.cpp.o - -inversion_tree.i: inversion_tree.cpp.i - -.PHONY : inversion_tree.i - -# target to preprocess a source file -inversion_tree.cpp.i: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/inversion_tree.cpp.i - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/inversion_tree.cpp.i -.PHONY : inversion_tree.cpp.i - -inversion_tree.s: inversion_tree.cpp.s - -.PHONY : inversion_tree.s - -# target to generate assembly for a file -inversion_tree.cpp.s: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/inversion_tree.cpp.s - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/inversion_tree.cpp.s -.PHONY : inversion_tree.cpp.s - -kcp_test.o: kcp_test.cpp.o - -.PHONY : kcp_test.o - -# target to build an object file -kcp_test.cpp.o: - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/kcp_test.cpp.o -.PHONY : kcp_test.cpp.o - -kcp_test.i: kcp_test.cpp.i - -.PHONY : kcp_test.i - -# target to preprocess a source file -kcp_test.cpp.i: - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/kcp_test.cpp.i -.PHONY : kcp_test.cpp.i - -kcp_test.s: kcp_test.cpp.s - -.PHONY : kcp_test.s - -# target to generate assembly for a file -kcp_test.cpp.s: - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/kcp_test.cpp.s -.PHONY : kcp_test.cpp.s - -matrix.o: matrix.cpp.o - -.PHONY : matrix.o - -# target to build an object file -matrix.cpp.o: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/matrix.cpp.o - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/matrix.cpp.o -.PHONY : matrix.cpp.o - -matrix.i: matrix.cpp.i - -.PHONY : matrix.i - -# target to preprocess a source file -matrix.cpp.i: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/matrix.cpp.i - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/matrix.cpp.i -.PHONY : matrix.cpp.i - -matrix.s: matrix.cpp.s - -.PHONY : matrix.s - -# target to generate assembly for a file -matrix.cpp.s: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/matrix.cpp.s - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/matrix.cpp.s -.PHONY : matrix.cpp.s - -reedsolomon.o: reedsolomon.cpp.o - -.PHONY : reedsolomon.o - -# target to build an object file -reedsolomon.cpp.o: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/reedsolomon.cpp.o - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/reedsolomon.cpp.o -.PHONY : reedsolomon.cpp.o - -reedsolomon.i: reedsolomon.cpp.i - -.PHONY : reedsolomon.i - -# target to preprocess a source file -reedsolomon.cpp.i: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/reedsolomon.cpp.i - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/reedsolomon.cpp.i -.PHONY : reedsolomon.cpp.i - -reedsolomon.s: reedsolomon.cpp.s - -.PHONY : reedsolomon.s - -# target to generate assembly for a file -reedsolomon.cpp.s: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/reedsolomon.cpp.s - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/reedsolomon.cpp.s -.PHONY : reedsolomon.cpp.s - -sess.o: sess.cpp.o - -.PHONY : sess.o - -# target to build an object file -sess.cpp.o: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/sess.cpp.o - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/sess.cpp.o -.PHONY : sess.cpp.o - -sess.i: sess.cpp.i - -.PHONY : sess.i - -# target to preprocess a source file -sess.cpp.i: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/sess.cpp.i - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/sess.cpp.i -.PHONY : sess.cpp.i - -sess.s: sess.cpp.s - -.PHONY : sess.s - -# target to generate assembly for a file -sess.cpp.s: - $(MAKE) -f CMakeFiles/fec_test.dir/build.make CMakeFiles/fec_test.dir/sess.cpp.s - $(MAKE) -f CMakeFiles/kcp_test.dir/build.make CMakeFiles/kcp_test.dir/sess.cpp.s -.PHONY : sess.cpp.s - -# Help Target -help: - @echo "The following are some of the valid targets for this Makefile:" - @echo "... all (the default if no target is provided)" - @echo "... clean" - @echo "... depend" - @echo "... rebuild_cache" - @echo "... edit_cache" - @echo "... fec_test" - @echo "... kcp_test" - @echo "... fec.o" - @echo "... fec.i" - @echo "... fec.s" - @echo "... fec_test.o" - @echo "... fec_test.i" - @echo "... fec_test.s" - @echo "... galois.o" - @echo "... galois.i" - @echo "... galois.s" - @echo "... galois_noasm.o" - @echo "... galois_noasm.i" - @echo "... galois_noasm.s" - @echo "... galois_table.o" - @echo "... galois_table.i" - @echo "... galois_table.s" - @echo "... ikcp.o" - @echo "... ikcp.i" - @echo "... ikcp.s" - @echo "... inversion_tree.o" - @echo "... inversion_tree.i" - @echo "... inversion_tree.s" - @echo "... kcp_test.o" - @echo "... kcp_test.i" - @echo "... kcp_test.s" - @echo "... matrix.o" - @echo "... matrix.i" - @echo "... matrix.s" - @echo "... reedsolomon.o" - @echo "... reedsolomon.i" - @echo "... reedsolomon.s" - @echo "... sess.o" - @echo "... sess.i" - @echo "... sess.s" -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - From 04eb4cac6facd88d1d21ce0983c34ce790678cc7 Mon Sep 17 00:00:00 2001 From: abigt Date: Fri, 28 Apr 2017 14:53:23 +0800 Subject: [PATCH 06/56] share shared scheme --- .../UserInterfaceState.xcuserstate | Bin 40332 -> 39936 bytes .../xcschemes/libkcp.xcscheme | 0 .../xcschemes/xcschememanagement.plist | 32 ------------------ 3 files changed, 32 deletions(-) rename iOSLib/libkcp/libkcp.xcodeproj/{xcuserdata/yarshure.xcuserdatad => xcshareddata}/xcschemes/libkcp.xcscheme (100%) delete mode 100644 iOSLib/libkcp/libkcp.xcodeproj/xcuserdata/yarshure.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate index acaee5ecebbedb3f39317ebd20a52861cf5bc5b2..c0f39210d1a62f129ef30c12d9304326640e0e50 100644 GIT binary patch literal 39936 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 (V3#t{>p6Wn#q`FY= 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 - - - - SchemeUserState - - kcptest.xcscheme - - orderHint - 1 - - libkcp.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 692AE3201EB2EE59006A4B9D - - primary - - - 692AE3531EB2EF83006A4B9D - - primary - - - - - From 067fba9a4bff74e9fc3a691813c0d3f76b67e0c4 Mon Sep 17 00:00:00 2001 From: abigt Date: Fri, 28 Apr 2017 15:00:17 +0800 Subject: [PATCH 07/56] clean code --- CMakeCache.txt | 320 ------------------ iOSLib/libkcp/kcptest/test.h | 13 - .../libkcp/libkcp.xcodeproj/project.pbxproj | 6 +- .../UserInterfaceState.xcuserstate | Bin 39936 -> 40824 bytes kcp_test.mm => kcp_test.cpp | 0 5 files changed, 2 insertions(+), 337 deletions(-) delete mode 100644 CMakeCache.txt delete mode 100644 iOSLib/libkcp/kcptest/test.h rename kcp_test.mm => kcp_test.cpp (100%) diff --git a/CMakeCache.txt b/CMakeCache.txt deleted file mode 100644 index e65ed1f..0000000 --- a/CMakeCache.txt +++ /dev/null @@ -1,320 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: /Users/yarshure/github/libkcp -# It was generated by CMake: /usr/local/Cellar/cmake/3.7.2/bin/cmake -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//Path to a program. -CMAKE_AR:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar - -//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or -// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. -CMAKE_BUILD_TYPE:STRING= - -//Enable/Disable color output during build. -CMAKE_COLOR_MAKEFILE:BOOL=ON - -//CXX compiler -CMAKE_CXX_COMPILER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - -//Flags used by the compiler during all build types. -CMAKE_CXX_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_CXX_FLAGS_DEBUG:STRING=-g - -//Flags used by the compiler during release builds for minimum -// size. -CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds. -CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the compiler during release builds with debug info. -CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//C compiler -CMAKE_C_COMPILER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - -//Flags used by the compiler during all build types. -CMAKE_C_FLAGS:STRING= - -//Flags used by the compiler during debug builds. -CMAKE_C_FLAGS_DEBUG:STRING=-g - -//Flags used by the compiler during release builds for minimum -// size. -CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the compiler during release builds. -CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the compiler during release builds with debug info. -CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Flags used by the linker. -CMAKE_EXE_LINKER_FLAGS:STRING= - -//Flags used by the linker during debug builds. -CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during release minsize builds. -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during release builds. -CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during Release with Debug Info builds. -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Enable/Disable output of compile commands during generation. -CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF - -//Path to a program. -CMAKE_INSTALL_NAME_TOOL:FILEPATH=/usr/bin/install_name_tool - -//Install path prefix, prepended onto install directories. -CMAKE_INSTALL_PREFIX:PATH=/usr/local - -//Path to a program. -CMAKE_LINKER:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld - -//Path to a program. -CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make - -//Flags used by the linker during the creation of modules. -CMAKE_MODULE_LINKER_FLAGS:STRING= - -//Flags used by the linker during debug builds. -CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during release minsize builds. -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during release builds. -CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during Release with Debug Info builds. -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_NM:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm - -//Path to a program. -CMAKE_OBJCOPY:FILEPATH=CMAKE_OBJCOPY-NOTFOUND - -//Path to a program. -CMAKE_OBJDUMP:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/objdump - -//Build architectures for OSX -CMAKE_OSX_ARCHITECTURES:STRING= - -//Minimum OS X version to target for deployment (at runtime); newer -// APIs weak linked. Set to empty string for default value. -CMAKE_OSX_DEPLOYMENT_TARGET:STRING= - -//The product will be built against the headers and libraries located -// inside the indicated SDK. -CMAKE_OSX_SYSROOT:STRING= - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=kcp - -//Path to a program. -CMAKE_RANLIB:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib - -//Flags used by the linker during the creation of dll's. -CMAKE_SHARED_LINKER_FLAGS:STRING= - -//Flags used by the linker during debug builds. -CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during release minsize builds. -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during release builds. -CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during Release with Debug Info builds. -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//If set, runtime paths are not added when installing shared libraries, -// but are added when building. -CMAKE_SKIP_INSTALL_RPATH:BOOL=NO - -//If set, runtime paths are not added when using shared libraries. -CMAKE_SKIP_RPATH:BOOL=NO - -//Flags used by the linker during the creation of static libraries. -CMAKE_STATIC_LINKER_FLAGS:STRING= - -//Flags used by the linker during debug builds. -CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during release minsize builds. -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during release builds. -CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during Release with Debug Info builds. -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_STRIP:FILEPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip - -//If this value is on, makefiles will be generated without the -// .SILENT directive, and all commands will be echoed to the console -// during the make. This is useful for debugging only. With Visual -// Studio IDE projects all commands are done without /nologo. -CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE - -//Value Computed by CMake -kcp_BINARY_DIR:STATIC=/Users/yarshure/github/libkcp - -//Value Computed by CMake -kcp_SOURCE_DIR:STATIC=/Users/yarshure/github/libkcp - - -######################## -# INTERNAL cache entries -######################## - -//ADVANCED property for variable: CMAKE_AR -CMAKE_AR-ADVANCED:INTERNAL=1 -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=/Users/yarshure/github/libkcp -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=7 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 -//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE -CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.7.2/bin/cmake -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.7.2/bin/cpack -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.7.2/bin/ctest -//ADVANCED property for variable: CMAKE_CXX_COMPILER -CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS -CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER -CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//Path to cache edit program executable. -CMAKE_EDIT_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.7.2/bin/ccmake -//Executable file format -CMAKE_EXECUTABLE_FORMAT:INTERNAL=Unknown -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -//Name of external makefile project generator. -CMAKE_EXTRA_GENERATOR:INTERNAL= -//Name of generator. -CMAKE_GENERATOR:INTERNAL=Unix Makefiles -//Name of generator platform. -CMAKE_GENERATOR_PLATFORM:INTERNAL= -//Name of generator toolset. -CMAKE_GENERATOR_TOOLSET:INTERNAL= -//Source directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=/Users/yarshure/github/libkcp -//ADVANCED property for variable: CMAKE_INSTALL_NAME_TOOL -CMAKE_INSTALL_NAME_TOOL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_LINKER -CMAKE_LINKER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MAKE_PROGRAM -CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_NM -CMAKE_NM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJCOPY -CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJDUMP -CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_RANLIB -CMAKE_RANLIB-ADVANCED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=/usr/local/Cellar/cmake/3.7.2/share/cmake -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_RPATH -CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STRIP -CMAKE_STRIP-ADVANCED:INTERNAL=1 -//uname command -CMAKE_UNAME:INTERNAL=/usr/bin/uname -//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 - diff --git a/iOSLib/libkcp/kcptest/test.h b/iOSLib/libkcp/kcptest/test.h deleted file mode 100644 index ceb5d00..0000000 --- a/iOSLib/libkcp/kcptest/test.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// test.h -// libkcp -// -// Created by 孔祥波 on 28/04/2017. -// Copyright © 2017 Kong XiangBo. All rights reserved. -// - -#ifndef test_h -#define test_h -int kcptest(const char *addr,int port); - -#endif /* test_h */ diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj index 8414233..9e2f4c8 100644 --- a/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj +++ b/iOSLib/libkcp/libkcp.xcodeproj/project.pbxproj @@ -98,8 +98,7 @@ 692AE3621EB2EF83006A4B9D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 692AE3651EB2EF83006A4B9D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 692AE3671EB2EF83006A4B9D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 692AE36B1EB2EF91006A4B9D /* kcp_test.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = kcp_test.mm; path = ../../../kcp_test.mm; sourceTree = ""; }; - 692AE36E1EB2F07B006A4B9D /* test.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = test.h; sourceTree = ""; }; + 692AE36B1EB2EF91006A4B9D /* kcp_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = kcp_test.cpp; path = ../../../kcp_test.cpp; sourceTree = ""; }; 692AE3701EB2F191006A4B9D /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; 69FFC69E1EB30985008A030D /* SFKcpTun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFKcpTun.h; path = libkcp/SFKcpTun.h; sourceTree = SOURCE_ROOT; }; 69FFC69F1EB30985008A030D /* SFKcpTun.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SFKcpTun.mm; path = libkcp/SFKcpTun.mm; sourceTree = SOURCE_ROOT; }; @@ -178,8 +177,7 @@ 692AE3551EB2EF83006A4B9D /* kcptest */ = { isa = PBXGroup; children = ( - 692AE36B1EB2EF91006A4B9D /* kcp_test.mm */, - 692AE36E1EB2F07B006A4B9D /* test.h */, + 692AE36B1EB2EF91006A4B9D /* kcp_test.cpp */, 692AE3591EB2EF83006A4B9D /* AppDelegate.h */, 692AE35A1EB2EF83006A4B9D /* AppDelegate.mm */, 692AE35C1EB2EF83006A4B9D /* ViewController.h */, diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate index c0f39210d1a62f129ef30c12d9304326640e0e50..7c0d2e0890e32793a3f3c89b4f203c4bf4b4f15d 100644 GIT binary patch literal 40824 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 G|MY+LKfp}@ literal 39936 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 Date: Fri, 28 Apr 2017 21:06:49 +0800 Subject: [PATCH 08/56] kcp read change to dispatch source timer --- .../UserInterfaceState.xcuserstate | Bin 40824 -> 40535 bytes iOSLib/libkcp/libkcp/SFKcpTun.mm | 57 +++++++++++++++--- kcp_test.cpp | 24 +++++++- 3 files changed, 71 insertions(+), 10 deletions(-) diff --git a/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate b/iOSLib/libkcp/libkcp.xcodeproj/project.xcworkspace/xcuserdata/yarshure.xcuserdatad/UserInterfaceState.xcuserstate index 7c0d2e0890e32793a3f3c89b4f203c4bf4b4f15d..814af55c69dd77a93ef0575323fde4aac29f7041 100644 GIT binary patch literal 40535 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 U8f?|3&40JsssHZ(Uwzwu0GzqE6aWAK literal 40824 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 G|MY+LKfp}@ diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 294ba65..6649e60 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -39,6 +39,10 @@ @interface SFKcpTun () @end @implementation SFKcpTun +{ + dispatch_source_t _timer; + dispatch_queue_t queue ; +} -(instancetype)initWithConfig:(TunConfig *)c ipaddr:(NSString*)ip port:(int)port { if (self = [super init]){ @@ -90,12 +94,40 @@ -(void)input:(NSData*)data{ } -(void)run{ //不能一直读,需要timer - dispatch_queue_t q = dispatch_queue_create("com.abigt.kcp", nil); - dispatch_async(q, ^{ - for(;;){ - if (sess == nil) { - break; - } +// dispatch_queue_t q = dispatch_queue_create("com.abigt.kcp", nil); +// dispatch_async(q, ^{ +// for(;;){ +// if (sess == nil) { +// break; +// } +// char *buf = (char *) malloc(4096); +// memset(buf, 0, 4096); +// ssize_t n = sess->Read(buf, 4096); +// sess->Update(iclock()); +// if (n > 0 ){ +// NSData *d = [NSData dataWithBytes:buf length:n]; +// [self.delegate didRecevied:d]; +// } +// free(buf); +// } +// +// }); + // Create a dispatch source that'll act as a timer on the concurrent queue + // You'll need to store this somewhere so you can suspend and remove it later on + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + dispatch_source_t dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, + queue);//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) + + // Setup params for creation of a recurring timer + double interval = 33.0; + dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 0); + uint64_t intervalTime = (int64_t)(interval * NSEC_PER_MSEC); + dispatch_source_set_timer(dispatchSource, startTime, intervalTime, 0); + + // Attach the block you want to run on the timer fire + dispatch_source_set_event_handler(dispatchSource, ^{ + // Your code here + if (sess != nil) { char *buf = (char *) malloc(4096); memset(buf, 0, 4096); ssize_t n = sess->Read(buf, 4096); @@ -106,7 +138,18 @@ -(void)run{ } free(buf); } - + }); + + // Start the timer + dispatch_resume(dispatchSource); + _timer = dispatchSource; + // ---- + + // When you want to stop the timer, you need to suspend the source + //dispatch_suspend(dispatchSource); + + // If on iOS5 and/or using MRC, you'll need to release the source too + //dispatch_release(dispatchSource); } @end diff --git a/kcp_test.cpp b/kcp_test.cpp index b2cc192..c513bd2 100644 --- a/kcp_test.cpp +++ b/kcp_test.cpp @@ -6,12 +6,12 @@ IUINT32 iclock(); -int kcptest(const char *addr,int port) { +int main() { struct timeval time; gettimeofday(&time, NULL); srand((time.tv_sec * 1000) + (time.tv_usec / 1000)); - UDPSession *sess = UDPSession::DialWithOptions(addr, port, 2,2); + UDPSession *sess = UDPSession::DialWithOptions("127.0.0.1", 9999, 2,2); sess->NoDelay(1, 20, 2, 1); sess->WndSize(128, 128); sess->SetMtu(1400); @@ -39,9 +39,27 @@ int kcptest(const char *addr,int port) { } UDPSession::Destroy(sess); - return 0 ; } +void +itimeofday(long *sec, long *usec) { + struct timeval time; + gettimeofday(&time, NULL); + if (sec) *sec = time.tv_sec; + if (usec) *usec = time.tv_usec; +} + +IUINT64 iclock64(void) { + long s, u; + IUINT64 value; + itimeofday(&s, &u); + value = ((IUINT64) s) * 1000 + (u / 1000); + return value; +} + +IUINT32 iclock() { + return (IUINT32) (iclock64() & 0xfffffffful); +} From 03f9467a0a7715b73874cda86037e697b13bc392 Mon Sep 17 00:00:00 2001 From: abigt Date: Fri, 28 Apr 2017 21:10:21 +0800 Subject: [PATCH 09/56] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 97c8070..2f1cb10 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ FEC enhanced KCP client session library for iOS/Android, compatible with [kcp-go 1. Optimized for ***Online Games***. 1. Stream based interface, you can easily switch from your TCP based protocol to libkcp or dualstack. 1. [FEC(Forward Error Correction)](https://en.wikipedia.org/wiki/Forward_error_correction) Support with [Reed-Solomon Codes](https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction) +1. Add iOS Framework and Test target ## ***Usage*** libkcp has been designed as a ***Frame-Driven*** library, the main loop was supposed as: From 9c4e01ce311bd3e324fc5b49fc79f91a1bfa0bfa Mon Sep 17 00:00:00 2001 From: abigt Date: Fri, 28 Apr 2017 21:16:03 +0800 Subject: [PATCH 10/56] clean code --- cmake_install.cmake | 39 ------------------------------- fec_test | Bin 275524 -> 0 bytes iOSLib/libkcp/libkcp/SFKcpTun.mm | 21 ++--------------- kcp_test | Bin 252020 -> 0 bytes 4 files changed, 2 insertions(+), 58 deletions(-) delete mode 100644 cmake_install.cmake delete mode 100755 fec_test delete mode 100755 kcp_test diff --git a/cmake_install.cmake b/cmake_install.cmake deleted file mode 100644 index 25a6f0c..0000000 --- a/cmake_install.cmake +++ /dev/null @@ -1,39 +0,0 @@ -# Install script for directory: /Users/yarshure/github/libkcp - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "/usr/local") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -if(CMAKE_INSTALL_COMPONENT) - set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -else() - set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -endif() - -string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT - "${CMAKE_INSTALL_MANIFEST_FILES}") -file(WRITE "/Users/yarshure/github/libkcp/${CMAKE_INSTALL_MANIFEST}" - "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/fec_test b/fec_test deleted file mode 100755 index e7eb1e7bf0f201fa1df1f6c15413cd0e8fe60b74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275524 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�x-rQE$>SKJI|9zceqNnLGu@~3XH&U16h<8-Z zWv;Ty6=}UTXLG1co^TsmWlNC#5t)y7=I>s&vUJ*qyL##CSDc;MbKfv+jr*w?pBs&K zL@zrz;oD=~y~65(OL^c9!LeVPxxNL+M{ zIH1!qH1WI>Eld09z@#!#_?`t#pJtUTU7fn{Uhj04N6b!x`tB*G$!mA%H*lt&S-v4d z`RX&#qqZTNRLh?W9kvUOpI7m6+(GMrIJK(w@rM=%#>(G%D_CISouG8{9bf(;uWho` zuX&0reUoS3=)@J9`EN&F-@tG4G%gTrWvem+t#c*~KGw;ObiFjAx5;qVx)o>UR=pHE zY7-Q%RQE=((9%E2;LeAsCp}iD5g&e$EOQ9Uaxd8#-JmDa?Q||PyjfGa&+f?Pkn8it zcbFF^Q*J5nzhfM@;yg4#>*v_(W*XgFpK*F+g}QjV{ozfax8?cX zo1IAUy{kXv9!wYvTJG-AgByG?Xu&K!8xJBqj!#jNw_CzdajemYaX*1QhQ0m+L`DZ-B56r&V zF4QKjSj)&fxuSl-#D2?yxDcx&NuEzMrhQ($>x$D`9_0%4Yh428oY$pI=RDBf=5Kds z^4GgY%pmh)^3~7Am5?K|!m>-)vUQ`?(cu!wq;F0dkk2X15DV=<3|F1Bety${WWIT5T;$%9%R7W* zZ`%E&wB8otoQik6Wp3+IrH1b5#RgdvkWXbs)Xf%s;kz~0 z?(?n^$NOxMktpzKPGo6mQTEoOXYxJA-3&IN4{-u8R(x{OVVYi{e)` z7)|IO*IKKzKYVGa&Z7_0k1Y01alDcdT|QUfHFZ<5>6gid_3|}sHXe3>x+UXr(MuJqvD1t&~Gn1m-EX4T4zcDP(fU;Ro@xiT{I>{9;M z6)IVbWv3OZUkaahi{52g6c^N@F{9fv`Jnxfq*47=|HXNe`tIu=Hw)aX{itW^?b+j7 zNte?$yuqnm3(r2aT%`SmLdF{BvN=_q0%zQ#_ShWS?$cl>H4qwGY|NQSe7YsT^4OHm z%{oV{eG?5DzfNS&<9Sa$xu4cHPPT6Cj!RDB&u-yU*E?L9d-W}E$qM>DtD^~iO?s32 zS8XaV|1?eO;l|)ah0{Mi*37ZJ#FOk0G%|i#|=&c_2Mdzc9hy`mo;puM=`@JX2l?s9dLKpImuWjpyCc zGg%Q=NNab>-*_pMzQ*mGcx#3C^4nd*gLdBA4es?%YSEmr^B9|Q3r;U4lYxb@fmonOclI5@Yl&hANW=65qdEeZ|i?uml*d5(2s#Lup^`g_B zNRQLFx8?Irtq9vcr?QLRCn?9iZ}R-c#YeaKHY|`B(tg-GrPw4mZsv!_8k<*H978yR z<6cgl+SMR8?}=7Ljs68|i!;j$4>|;7W>8W#(BlI4?($1o8y0(RvH5B8i9?R{c(up6 zRka4Z-QUKyPnhzmNm2C?vAk{p|EE5o=TfuY2WO{xCa#W(ziek(vh>(t=S#N6ERW+y z-9q;7^w}E2*d);VRrHzU^f&hul$$lK-d=dp#O9)FUcoZ&9S1@;M?@!xeEBT+c7{aj zgE{hzMz^kMK2%Ydr%ihCR9*J2UiEeDvzANBNI69-eAD+( zH-@iIMm`LUZ$TcO=NN2zI-KQ%LAQ{o!ii>FMB$qqS&byqc?sL!r{F?mWSf6o`u z$8%*HjBb|`1U~l*bxfH0Ix>E1bcXM$y+z9%bM3C2G$yidExaqI*3va?V!Lo(uV7Xn zB|Ro#OOy%gvi%{a6@{y}ZD#BV@Y{WmwDQEFl1nys@bjK(T)VkI3j4j(YxF0|0bk^MNqUwXY_zE4v z+nrM-+XO#-6Jss1xtWOHaO7k&0bIHD7sbkLccO8?vc|`i2swp-S zuGY-|BE$NP^>45>n&j0Vd+p3zmAp1;^C8l*W42dHE$+xEKQyYV(w1s{J!Mdw zuXoA05|blt%Zsc%-~7nzqq%=iUJ0k_(Fq+)25j zeH`9a>1my8&H2@;&GmB3@HGj6nW;Y3=UApWPRsHqb-bN9I9}k><9Ukrbgtht$`0|% zh}^t=z3Y*pm6z-+PS1GvVq!1vpWc_R z(pqr)<%H?)#fCof9d%xQ!sg0Zv!DaJed8HxQ6mzR;u%QJV~E$~ErDsyz6B6X~D&>Y3EZMN7_m96RW^dTT5_&3n}z;?-LHhjV7% z{UXfsQSy1$lrk%mQx1oYFAa-JjLD*U?Lc}y@qFgR^>zyieB|SN;QuN<{)<>&|2Uz6 zLE#}$k#DbO&Fq@q`D%vDo3~TmPn-HqqP;`%rL@$Gw#k#8PiTEM@y0@<+6C1$hI(~3 z^>5ENxJ9VAPOQ?@sJy1Db5)C7u8nWJH~YSvY*T}h;$8XrI|`4~=RKU;{6I~)84miw~!7*%%cW$6&@rc&2A~?e_8BwbS2khi_^c zWp8LmR#4`i;DCME)B}O5_8XU;HaTm$=uC;F#VIq^N%IT#c4ao_&f6}&c**LD^^(g4 zkQ-s$I?wl^ebPeAs8RmP{!E-JAwJ9)v*=KSJISC$m4Tz<^G z=!6I9$Wg~!SLcJG-v)&H#)*I7@C$zA?d{=dojCcq^ow@MY46@l>6|gEi>D{VXSVh!f7p(9obUt*%Y4PRr_Ge8jShOv%Q7JL&6LwO((}S|I z1FbKW*_19aFUeoI^n}~NJW{Hk*Y40g`vbx^$1##tuiMr-N%G~aSMOwaKYipI5E=J% z{>|D26&l*tn&-`Vs&uCbzsu7FwUFN;S%eDzO7UBKS-oCKu8|oPzG+QT!iKdaSzBIEl7K77JGR+;xe@ySWBHjPM6GhD%Q=avRy_vw%ui8*)v>|@Ss&mFJMfcSWu1a(c@|#^e=CE;1$gV8! zsFW2)Sc`=}v`@dKBlqawQkzo0{oBGdYM&~78Yk0w-B7t6_vQU$*WwGNY1Flwz6nUb z)-P|I8=S$6KJI9FrNnw=9wTXw7ryzX_RCo!9}{SlZ2Pl^Jf^kvj&G4C*37w6vEbb# z-mhhg+)k|9oEjk2H6(aXO^+QL6O?Xoxxk5h^wg3}&xq}HTC*RBcE6bEyKie)?lQYG zpT(y>CsaRHK>FWLx@Iu<-d=CUcK3s4?Nskp7{5Z_^p0+k zr;3D{FT4}q=(C&Dy)u)d4lT1Sy`yYYCG~ocZ%N6KNV;{QxiBHNam#XJKVRnE!t3Q-@dRmEWKD6*u8+u7}NO&pj!T zuOtM9R2r@?pl{3eJ-K-0(W~>-8hQHOODb!MJ6Fj+zM=7QrqGA< z;5Bh>#pg`Kdt0Z}Y0EuCzPysYt*zLyF=kb&&6y+QY0o|iHO@1v%JdG~=2mpsOsDRt zLO-uW*J=CZd8?T_scQEtjGoJgekgXfyyUevfgZGL^M>4|OIYtG3Jl;M)@Vj;-|u^F zkwZbx_!%$fm)}+P$SJYP2wl77fgGWB(wiZElMDHd$qfJOt9q(;#(i#|*(^)EG5PH` zzGVkbElv+v7k^D(rCzMJW0rB*F{hLWzkTl}2oBDERIL%bd(-+u?$#$iiBErFz;2im znRI}1-jsB_)NaMmHL*JabZEHTT= zJ-1}>&VcBR4a$1gWZJrgobu0^X8MFDG|OpLOLzA1+MPbKa`XC-jO#}8?v4M{G1L5V zu}g9UW&bU0g(v*q-c4kr9Pqtj=6qs^Z^C=6+fU^;Y)TI;wI?6$5ueq*u%c1jd(T$- zF~>#cUrFKmWgpaNPiHDmk8|!`)kg+8rrcN6xK(2BdfYcNcHNrz{oaKn ztJBq5YIkO}eG%vtk$yk>afP1w`JClDLZY^94+}{5$h%@{boG(atBGQq5920uDn7in zaM9(X%QC36q{PV3ohuHWGt?6Ad^4V@H`MA_pDlLW=NYqk;|9Mh=lqklgt~ikUQWY(Lk3??ZJ4K3bHQTy!GMeu zdf=|4uyf|*L-lI9wY=Zjr!=V&>-hVg&k9aWjJj;P^zbEPkE0yIe z8`lEw1Dm5oKEIWCAa8W-p^_n6xaXa;*S;-lPT9NU`)4uNm0CF!x6GbjDgLo@qS%Mm zlb*`zT|c{oROGv7oXPla!)3AamGz})jht-0RQ-ez3x6#u=?&1S1l5gyt5V(Ur(; zX+bmF`uT1WRPM`k4B>9*%)OJl((F8K`|efY$?4Rb6_#by+Uj?wy%^v@zCD}ubhZ&Y zcg3QMYvZzgmK`ZG+q9apw@+ZoOQi>udS@299i#3}h@AMkN2FFu_1;@)v5y*c4Qh6* z6Ao#iwB)dq)R1D5{mHv?HE)jVej}yQctiV>=!CAVQ31PL^UqpU=_@wNyyzG7&Dy-? zg1N`xectOfnqE4zd|~+$eCte}q36?i2Mw>a$eLWqS-IbHL+p7=_dLJM_?W5fU-_@k zmw)Jd{IvD9h*jyIg(r0?H`VBhe|RTRKaY63(9yOeeEW`|ox$`Zn^Q$jgj;vi-%F0? zRO`&SKlxR!P+&$PqjZT&fx@E-gD-s3I<`dn?^$~EoW*+P0k4B(XG(4$w7Vp6Pie{x<)QCjeQ^gL3SD(y&F@^ujV_Bne zf&PxEky|rX6*=0SB;LBK)-_SMH;WRp#pLp#6{|Pz@jJM3(WN`{G;WG~dNt{&yV-@c z8xMGjb-$OmudH?BjkGvNx4Kc)^4#HN`+PPqy|ZK2pSSQhQlq1CPwMT5@pGDLwLgxN zd>6OQYyZ-`GV>nM$(`!;b(-Xyi>8~__-9@*UY_f_H$Hm8>(4^B33D5q3R(6EQGw}w zg45dNTG$I^UVi1fwgCUM#D;VtVD~o0bpyo*GoKCOLejR=PcLyjmK+wm!{zuHD}{%Z z`rmkFJV*Zb^S>JSUk&`P2L4wA|Eq!j)xe)>KvI_EXzCfY$aC5vXA_zPO$K!x5Jb|L zO!ly|c4BCf$wZ<)nH(PAMW^_ZqbOd1WS`K85C#$W_){2UUrG>#L7|&F0%d(h42?pj zhWLdd4)kh~3#r^#oPaJJgrEjf$P_v~lx{{ek3^WQJww^&9IKrFkO%3s-&=F?B z$fWdrBItC`n6}}Opj$Ap^!0ryKB2x8qD}-UfW*Lx3!iCfpwCvpXOxiddc$hiBd!|M zvLg~5DHLC)(4f#@kb5U{dnYm$-j1jVIu$4sH8jKyB=}c;&UDI1KTQjBQ+;ZJ!80J(eRD#d6DZw;G%=e)1=~$t`GcbOJv#jq&@gad~ zrZ7h6j(GfoIvk}skrW?BDBbE0H9IG=zE@CCsE-%=+=)mwH#aAOZs!#e63XymP{<*a zDDz+h_LSk#{)_SG{tyo~2YfH+Kg-aM5rqfPsUd+NPgrIDqlh$#Kjg?K6wEjN5up*` zV73Zjcu_;Z6h*R*bkZSX|9&S0yi8t5JQ=+jw=CH#-u+RlkUwh91g{V?PLz<>ik zc1{{(D<|#$q_KZ7_TO*q-$>w}HTSP2@N4a@Pj=$|`?dD|wUmF_;NBzK)*CeJPs5DS zAI6w~#~kis1^xBr{aNV0Z@V!<|60RnlR-BJ|Hf{ZF{1rx4N^zeIu+FVuh!sLL4Uml z#|Zsz)WI0h{<#j|qVMlsB}8JdS0Dv0%dM7xY5|js8O`3Aj4)-e4mCzBpfZPF?_)Fu zsM?XSk^-D`(OC<$C>Hg<6|tjH&u{R5Bi6spD$xh*fGfcg}WgkQ~j*m!|57e%}Wg@`-Re@z-H`^0M204 zYJ;tG1X!w?YoR+)bEidQ@NZSE=g!B-MaXg+ON^;$K7-FrvORKz-377-0A7MfdUnjYAHnghhbeC^&sU zt8Ub20r8?q5jDNN!l^#wP|(a2uV5=@vNHh`0L-i;YbPx-*nf?fuZL^kC)+pz*vevC zJ9Ia~6#B6n{$dmwWHPs#(Y-?aDduP&1Cty0H=@kH7#A4b+_=EO2h~5s+z}KEExIn4 zSt$N=uOO_OdxbEpyluRRpk{s}5w!XpO{}cQRv|v1Cc`Nv*giItu0tmKhKBsHEyE^& zU(31%2pk^eMI(cQC9)5d?h_FN=0|M&V(mA2lz@tI1pUyQTV=md4s9@*g;UVMOa#L> ziVo67N4gd04(O}^wlcpFDL4QMr_dRH8LJ~0HDgALX5(+iJW%*yOT#U=IdNq78>{pE zUc7(mM>@aLkA5%hG3Ed(61Ti)75w(RYeIH10i*n1tE1l?2ESD)zcD&A!RSEuy8m8@ zb?6lCsmmDel;JV{TZID+?nR@4ckWnktN$$K?{o97HT#<2Uv z#K#zS-%kKX&g7$8`S%mxuChkXzT8fW9nt;vST`d(nf>Be{}1v`;%4#nk@!5ENP>dm@f)IjG=j13j2T$CdW*Zew_F2zCqR`g97| z#-J-)uw?uBhT^a0%wMbKAE)`hScU%H1Tb=*|97MQ$wWWK-d67?LB=?k8GCy&X5ae7 z&{pW-%cwr|D?R9s?W8Ul>|n;8LB`0#?+)0pqWZ_9F~AX=js3+~93z1r`r*j^-*ERH zBg}{{_Uoa3(iO%yEF7yVjPWu<&wu{2_T?V1kKMjwWb3b|e~^>Eocza%=r=ccV@36k zI|}u0I?5Oc{MASf3b#Ths$V+}@IlXNz`FuHFoQR--^~}e_5_&W1-MQmgX`oVFL2l} z>RJ&U#;_xOzvczj1g$vk`}Sv%fzW@`uR$L|@2<2!9>D-&W{$ks{|nOyW zouJLbe^j0XQLH>aiR?cq4`wXE9vsg7C<6(P(MA&pLXSqRB3weEfawF-krEE9R*+PL z&cux{ph3%x-OhvMQ8)!0h6DpM1uO1J2Hz%#X5n9_X2&{au`tAIU@H*kZI))wtDi}RiLhFO` z`>_mHL*H*i5fp9?OjrdBf^n{h2^$Wp3yVHTi7&;1m40`V8 zLCrLQtd0bN+n@Xo3xHI51Z8_VPvV6THA+MbF)-z+4GrhdcbR$TP5LF=$L1;n12Hf1@VlN& ziT0t;7{DG0RjB_%!JFbw4Iu+#9UriO0R8w6A8=<9m~;7gQG-wqrZBe{k>NBjoEd(@`U&V`FYiz~Fv3FUsVMmb zg@$uyyG$;HhJ*kEB-A$tWj~(~1~#h?$*p$~zD4uec% zV70D(-{{iKHMhapa2FN*QXBy zMtG=CU?`0nk|~1v1I8js;Noyhsa#^v!88pb9{%AWBm9UE88M{>`q0RTr$2I7As8vt zv9dNLk&!H2KPn~2*9qKFA$f*izI8^e$&frFN;D1oSZIXcf&)M!QhXwSMOFaC3pJrz z?t$d;;?Ok4eSfnfmv}$~$W@*&Zp$E5JU&Pr51oQM=K;;o%R@u<;iw_VH5_*~LLT5E zXuhCtB2RH4!0s&wRP|?E6f%edwGaA!B$Ca`i?H<&UW9`>Y(oUWfm3x5;4x1C#U~Ky z!0{sW=u_@!MLzI=I@}GOvCP3U1`>+{)p#C<;J~>#m_3mlxL`&E@){`Q*r4&*04)k7 z5IwjvWn@_>*bzTEiJc+uNTke}VWAVd-BpHqywY~UgSc1RPiKJrjh#~;N1MxICn zzilIe7*twNOh5p#L%|tg8h8xbWg^GsBLYMulMglZLlOnBw;aL|7-fxy^om1^J|tf1 zkJ}nxvWFbeLU;)-W+W#HxDEk5x`OXV^F*XW><^nnW)D1dSED1V)%mHj0`e*&3R5z|@cm3?y%B z=pgqr^lZK8fo7mPn3Dn+$Tdw}ltFa^L|$oXTZN$SW5+)#6?w18$Jcreq{276SVb~~ zh{&m_zrEJ3&_Va4Af12vI$~*mfYj zsy{haxT}ree(lT!c`ZC@H-T*%zt1{W*o6<$HUU&UGAK+$GGz3SZBsRnBeT#6B5W}2^I@rvdC1xtdEfz%^%E~KWQSkVN>P#`n$@B(mX6^#dDNga+Q+V&&*pB?CBsBt3U$DJa2@eO`{xKlSruBa1{>+1UG(v17o`WK__ zCi3xd(9-Y`k*(stbYJ;Z^B3+)W3@DpN-*L6=?>$kSI}MJBd;+z;(vK1UZ%yzm-7@f z3t#GUPz3&;jOKocKg|H8lg1k0336i%@C3E72KW!w$IaRZFA=#csR>Tqzgu&ohR%O) z^BgPnqpevPm?eI+heO&V!HoDlI?On{4k&#$7W^vt-GsPO8&t(hZiT!86@pIwNUfAU z@<@S*Y*d8S@U@D1NWG%2NrXT8We%{rAtP~0I##GXJ_D?`vy{GD$oCTw9BQ)<{?9nn z4*s(;A0G>i7l+#ABk!e9(|x2)8sUW_p;DTN3@K?4thl${Sd0{3TdpbopZYAQ;t?I6 zdpPC@U*1&YHAsxv1ri&M{P6^$E?6b~POMa-NpY-`0u%*A|F7u*l4!Ec!`_% z!=WU)M|_~Hhg7L(AU!H$bo`&*ndeU$+3|}fjd2I}FW!Cc0i%cY8tp7O@6bm5wO3C3 zFc8jfU^W;wdsej)r#CQKR9*W=BYoHx(q+6)Gw#} zxzv?F>3gY%rhG3o8xQg^$j!|V+N>k4)4_V6aO&`$7u@F#g6^D}0roU}AOVCu?MIsv zqz(^i?7wXu_(Xfui7e8h0}A$|y&iIU`hVSIupP|Ze|kG4&-~+!GRi&;yt=_#`Y+G@ z|9hr_Z0&z$D#zijI{)@GnQIaEOD22=X8mcB7+o(vH9mX?)_v>)pv&?8<#G6#om?-#I!UJBM&!@TL}^E}QGJPNJWgr68MN&HnebH_AL4DVjaHl16EO zj`Q6te78En`zPDzd$S#pLM8Nt2uh6Ec-N!ZEJFt>Sm(=*)$b6NtOl}4{)bmm01~f- z;C>kG$7O$<3<8iYuv}m^p=JEnZXV<0z^u}*1g6~kXcPZ9tKF0%A`NoCHZgwx%EC7} zu<&m|v-sy3uupEpLTLb$rv3@qZk$#a;AcJLh5SG6gTvRBz35Ww8CpgYUth2V*`nYS z;SGK#DVRso!0-JEVB^pRa)YqBE{E%~+R-PiFVOsPk2{=#s6G^=2JBx@V`^|zPYMl+ z2?-4b2Lwo=A=q_v;&|Lc>Bv10UHvOG7+3+q6&2XH52C4lNAMs)37oRLMzf^_wnkv- z$%q;DMk*Bb{k!>L{&=0Q~MAt^Wq0ZYCdC1NBvnF9x>p}l2y1<82H*LYU!DdCjSX7V@^NnvIbDM{u}Bt<9N~M zT$jBW{hXS_3p(_Oe%`J0r_pdgYlJa=p3a}Yrcet;N6roqC0}Yjh!Up*Dv7($Ll1h; z#VVT724!8#-&;Q-PnE&R*D*ByoI*6?oD-;H0Xi~`jYyunMiHc042POmZAOuT81B|3v_|osq({YvJ!2GB759hxvAVPKuh-!@ak2&wh z`S1Gza5rc~b{d)oW;&XOU#QwN^}l>mg6iQ~3T*r5MyJCU_i1Ra0$Bkg1I-Xl109V; z>O}Nci8>fZdB6|JIflCRT(|WMsz*eM3E)o)_)?rggDFnv;YawNc9Fk*sDgc0k&3(o zDGpj=Uv;sq+e2TkJ}%dk1wn+xXFLmyEjgsi@1@g}SVR zsLRghem=#|t$*T(lkaO9MDUFx$3MQRkJM;@_|Ab4Na_XDWdRof=VfSPfYab${Kwb)#jRf9fhO%VWYPAclA z7NTx_DR2?iIrMXDE%!+s>N4*LfVk14jZ!V{(FPmLWtAs?*Uds*=04PA9YEcj!>C(dgu0v) zf*{x5CxUdH@B70n@PcHWM|Id&P?uGXx~F;(Bz*@bLoZh;)vx3Y6KcXTzeLC)ygyP7*LHa9UtF6x_sUp7{D*2q(-&Zyd)Q=#mGfH6H^eco*PmPlFXA;*lmFxKva~!17 z0F;S)I{g>cKgc!1pYD7{SRrN4AGPa2U#akY{DT2h?tIW4(2Vk>ent!U-#=k6Cu(!Q zuNaR06%}$+DERXzS%zR_|F@46#z;5EkdH5^k6U=u1%K)Vbq@mwfo)1WY@eD)3CBCVKvll%FOFt~Uo)bmNy3y_T20t7rqkc}gy ziV#@*ENKppXAUnL$KmDhobdafDW$R-PQ*R33aiFCNbk zWr;`_6YzMzt-Lf(k}->igJbeDad?t34f|w_hfj?0coH7`7~@$WC<{c4uLsfafX_hK zJa}V{urZUDDTF6T;F%x~^*A<;$;X+9ClGRY2u$8qo_dfp6PJU-OK@WX9>y$O4tQM8 z!x3chc-He0Qh9SghVePP^#Y&_d~9g~6W7Ya!qxLKc?fL59G+AO0?00jzy@XHpo%PU zjxd_61QUm*n99fDVev7+C%gn(93+7z#pETliV;{sOhE!ulx4u-As91psX#Y}KZn0w zz_^tkkLDMxHv+z%FGm1Rpb-c(mW44mYhw$sdGSn9HV*+jg6SG_CbD=rd~99`<5m$o zTE0{sw9HIcY8I%&93B=g8`M2V2(&~!KdA8>ZVD_xwlve81hPM|UbszLdI#M z`2qQbY|mxpcis#A+0efi`VaFG9jrXGjad2~kW(S2KxRR%gY3B((|jhZ;hxN~L89~^)u>4Dcc>x`7!%XKgDBoVpzZ&`vvjUhWP<=u^<{tr> z1o=8-CS-+$SbkZMH*%SY409)B(lIQ)EMqKwCS)5Ej9G=4|9Z$dER1hK=0Kjd2-BB1 ziTMXWCP1!$OoIFlG7Yi}nAgzq(Jo@)RUji(7%za_dKY6q$Px`0rw)g2#yEG_zXRg{ zGc0~%$U7i&ARig_e}U=uLZ(5sG>7GTjroT`CP2=GoQmV&&i4Tpm_A1mN#Ll`$h&Vk$wxgPR(TP%Gf7t@~unFcuqat`Dg$j14YehXyJ^BB(p z?^(1w$Q6uNLdHX8Kqf&>gv^0_U|64xg)fE7D#!TqFjrx$1K#6kdaN3ZeIV2BV7wi2 zDlp37K@j9RWcEXh`ysbNCW3VU8ecsyY(e!YkU0}^TrPktLBM#H16V)sAqajx#wL)N zkbNMxLf#CS1NkUqf(;hF24w*RQMSkU5oBk`Zy~RRj5uQY7a>bS=0H}2EJVWM(}#?Q zYy(*jG8r-nG97XNYV&vOMGz$YziaLH31w z8geS+D#$Fz4 z3dkQJvmv9Egw_Wij1Ro#xhw=(4)PnQPlVhFc_GR`I4807i6i7x$YjW#C76E@WH$7V z;W86xjmO>xz=j>f$3#*=#et7V7Gz@|%pbL4NBt#yF}?)375d-eGJ+6JVd0-Z#>4%h zDChuaemz4le>KRhOECu1I@h1=fpIisrW?jPA+rK8E`ppIjByQQ2@1yGYMC1!3#Nzg zVvNA>Glm)Z>kTu^j~isRGFDzT2o504YZ@{2FW{AD5M!2O8uaXn--G@AZAFt?-W<$#G4oE=+<_#FXg3Qjq*hn1H_q>VahX$E+0`orxnbm^%cR*%8#dx*^7M{k!^dljYiZRZI z%of7*pFt)p#drpIVR6TY2*z~CY(b0%@yRf}DwZA%vP2lBe*!Wdd;S@G|Zp#4f8)X%wI5` zJ00`KgBLp*e;j0H55^B6dmh2!Q=5V5)7E1Cn;;`=Fdl+TT8!zhoC)=Sz-mo4ze(OBF4ud6FM>e2HCR?OHW-6 z)0b$(`~xAk7GV4qaw;58I`Wu42YfvQt*;EoB(RV`xe7A=F2-LWBQUR|4Th!TB3puLeQ(gnR*IKCu3Q>n~nq zj0un(A&V`*;%k5`0oi2^nm;gUfFHEHRFuIS+Ukethoj7gAb6<1o~sWOOELXzkn17u zh5GVP|0MJ`2K^3=zZ^2j3FDi?;X%Jb{U1W6nPL25IJ_IiJ&;+N7$YiZ{=xg+1!Hl@ zG??BL$cQWEuQbd=jP)QBz;85tOUP`PA7{wMpj}XZGGrF$cPIxB>#JfM4H<#?*$f#E z!)HJyIb!;UhW%mrSdi;selMepwg+tQ>S6tNSbw=S>>q%&S2N0>y$G=WI{<@x;y_lp zKc6s0v(Ej|!t(u{8KZdbC_X=m8%FW_Q7k-{oBsFs6-RN{C_Xca-;QEMwUO~rM)AQ> z+%$>>=8X(*Fp5`>;?PkXKZ>(QanmUNIEs1IN2aehiVeBU{9a#fqx@q>@qtl%briR7 z`H%S8NAYV+|9k)F9~EAjFe<;JSa%fLj$)5dOvCtldh17V>L|_~#U-P-Y!sJ|;@VMs zXB6Kb#T}!VGm860F@nt_-^&BOzd2&ONsi*lqj<(B28Pum!h^31j$qwUY&423MsY6a zNgOcJKLGg%q#FoW3LxNhgp30Mj{OlCAYi+PfGr||2cisQ4iFU}szAU}0RhVoWG)aj zAoGBz10euG_xBn=G=XRV(FUReL>Gu25Pcv9K;{Ek0K^c85s-yIjDeT{Sp>ush#8Qh zK)})xIR?ZWhy@U^)j`1W0|7_=$Pyr6>4De)u?1oW1l{8o0kH>C4CDk57Lb!bP5}Y0 zV#EOmde-0s1iX3?usuOafq-Ql;sONy>a!~la4mqi0|Cot!~@7OAYdzpfbAW!5(pWH zClD_n-ax>%5CL07gaX75h(C}3AXFf$fCK^w0ul@)1V|_l8jvs`bRgkC7(gO`L;{Hd z5)C8<$Z8;KfUE_w4hUFMB4t3<1GxYMEP0U%AlHFZ0;vL04WtH0Es#1OH-X#+QV-+~ zkh?${fHVTR2c!uISo$E%Kpp^j2;>nEupI$^rvO3F^ANBVL0W-41M(aQ_%S{Xeir~a z1LQ1_OF%9IVFM`#0)CjNTm_$R0J#O^e|_h42*!}H8;rqU$xx65$zsq3gV~}D2HQp(^hS?16s#R>&>A-` zeu8};Cs>O=OCf7YGIxxjA7SdqLNFYRAu^G)A!k9!csmMN8rmdemPrPSF?0_jMgY*| zo;pAxA0GA@j0@N|FfL#p#vs5k$0(ShjYW!os!tUAu-{q#MuM{oCIWW^fH1J%qLYuR z&7p=!e3?7bkSTHp93n-NZ;w3TGYD3c5T(Gs8lHhjvUwyT z$j;G#p+|Q;UPUaEhgfp}5>C>vb(-X_t28ZR;;3Z&_yqHx^~B(9zNxCVM;t%W~FCI-Bae~1pF~HOLhKdt>(z=hWK}Q&6*XL_~(i{ z=iC|8pXDTr^#s}`5w>%KmDi!up;eE$4jcG`x}v|^B4}WTl{r#vnM*!$qBRoN1l(#&zRZbM zx2R=D$P6QMG`3=zb$WCit!QPQ!Q0z8*)M4PpUw5#StTFO0p3_*HbbKsAV=f!Y_zfp z{78*fR{!NcI8_}>hQBB#=4jPR@fF5mo9c5oY95Vot3ubV?^-h`7blvhMO7IV<{ix& zt!zR?f?=BxjZyEp=bgzG$;q}6pOwL(2$T$|(mbu5uUy<|ov$oabT=~!_N8nqMW|-= z4mlc>yT)da=GGYX9va?xW>Iyyh2#d33|9en18`=t5W=#ossp!jW45Jp$}Z?2 zi%DZ*eu3$A4OG>y%ZJUE$~czY0FM;#b9K-qmh~_G<1Brhu~6D*E`U)vKJL4g)|Dqb-4-h4r`5|YRUmu(RS&#c9}VIvq&HBjAHO{TW%%Xwp?(0yHn36cGUdQw zZNSQ9R_o*1V2!!;#U)-Xw{hL|DPZ;IqV3xIx?TF!@-v`sf3F{2A05Fim-P~;sJ1|x zBZl!0P?AR+e2fq_`f+JGz|r1-;rqG;bT?YvBuW-!Vt{saQT8PQnh1M^`hV}MN&WA8 zvTIyyF(Hr$>l4|v=1Q#1f}t&K#};%R^78i%Fh)f$Vx&JUx1WGc{Pa`@JY*xGomqa% zjWYTh;e~?Rd6nG^2WIiBU?A~|1)@_8yj43}iZH6Fdz8G{fngrBxamrtF){GXMDcAI zD*$_b#H_;>aMP=Rtc466IB-gqeiW;NyT4WyFd4}hA>O50c+IgMYNX#5v&rQy)=S%@-(Q|%*IE$W3 znK!_rbf``S&XMWO)A?N_o7t23Rk-TdZR-u=WO~{cB)-SF9*8FHMwpN>&Nv0$4G2~9fvt_o6_xw zxz}(fls1Vce@Th+&8xDqWZSiq2X4l%!h?p@?s<=o^El1d`{m|9#|Cx~OGi~zFFvCi z@VlSZ@i6UF%4y6p6@t&OPn(C;exD0iZ=Uz%Lcag4n#c306|`lfWQwOPrI*)l{LVTPNtdaC z4dd6RahUy6S{bd9wz4>pZn6_6Ez8t7 SuQNBzE7UiLh#h|kM#82--*|sEJ8lXP> zqk>DEFY95Q%M}En~K2p1x&-3+f^oA9;N4Ucdx+@2FvBHUqe*;z|S)3H~XkP z*d_O=zOC|ES;o&)%JE~};k(X?EQU!;nT<{RdB%>;Dc>mdWf6KV7G>*hnKCNt7DkPm zZbr=a-F=0!GvTy)r7i0_PZ_&Z*w61u2YSj@R7`uuXnQGnLQ|A4bWOwHP|GUNAzHp{ zBQu2w!P8i@jMiTB=k10ex|r3oE`nUZ>6-R?K*)%tC7T*oU8eogV`ruf(09ZU>Y z>-|gpLKipFA9BjIpj4G4-3rp=LXu?0$xNiWyp$x#{(2%(-AG=yGL_^m1-%lyWh+RL zD#@slrBzZ&Ag|`FKD`kn$z5hsgpzH3DS1z2#w%IgOo}cON#>Q5Q)?I5=#^~sD_NZ@ zDf>*82yfYW8%s*j=$ArOQi6$;U?RuDMDn_nZLIXywbEG1RH`nObjoNeX^E*!G?O)& z$r{aWNgsaj)@lvsZ|G3JC~6ln>|20Qo?Yy+T@bjlD;~RB0Uu+mWX-MW&%2#Bfim`K GCj5U4Me2J1 diff --git a/iOSLib/libkcp/libkcp/SFKcpTun.mm b/iOSLib/libkcp/libkcp/SFKcpTun.mm index 6649e60..9fa0207 100644 --- a/iOSLib/libkcp/libkcp/SFKcpTun.mm +++ b/iOSLib/libkcp/libkcp/SFKcpTun.mm @@ -93,25 +93,8 @@ -(void)input:(NSData*)data{ sess->Update(iclock()); } -(void)run{ - //不能一直读,需要timer -// dispatch_queue_t q = dispatch_queue_create("com.abigt.kcp", nil); -// dispatch_async(q, ^{ -// for(;;){ -// if (sess == nil) { -// break; -// } -// char *buf = (char *) malloc(4096); -// memset(buf, 0, 4096); -// ssize_t n = sess->Read(buf, 4096); -// sess->Update(iclock()); -// if (n > 0 ){ -// NSData *d = [NSData dataWithBytes:buf length:n]; -// [self.delegate didRecevied:d]; -// } -// free(buf); -// } -// -// }); + // + // // Create a dispatch source that'll act as a timer on the concurrent queue // You'll need to store this somewhere so you can suspend and remove it later on dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); diff --git a/kcp_test b/kcp_test deleted file mode 100755 index 648e36cd4649a2fcedd7d0399b5de0577f794239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252020 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