diff --git a/.travis.yml b/.travis.yml index 618dbb0a..608e2bab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,7 @@ before_install: script: - buck test //:yoga - buck test //java:java - - buck test //YogaKit:YogaKit --config cxx.default_platform=iphonesimulator-x86_64 --config cxx.cflags=-DTRAVIS_CI + - buck test //YogaKit:YogaKitTests --config cxx.default_platform=iphonesimulator-x86_64 --config cxx.cflags=-DTRAVIS_CI - sh csharp/tests/Facebook.Yoga/test_macos.sh - buck run //benchmark:benchmark - git checkout HEAD^ diff --git a/BUCK b/BUCK index 09e39b43..aa7ec37e 100644 --- a/BUCK +++ b/BUCK @@ -7,14 +7,6 @@ include_defs('//YOGA_DEFS') -BASE_COMPILER_FLAGS = [ - '-fno-omit-frame-pointer', - '-fexceptions', - '-Wall', - '-Werror', - '-O3', -] - GMOCK_OVERRIDE_FLAGS = [ # gmock does not mark mocked methods as override, ignore the warnings in tests '-Wno-inconsistent-missing-override', @@ -27,7 +19,7 @@ cxx_library( name = 'yoga', soname = 'libyogacore.$(ext)', srcs = glob(['yoga/*.c']), - tests=[':tests'], + tests=[':YogaTests'], exported_headers = subdir_glob([('', 'yoga/*.h')]), header_namespace = '', compiler_flags = COMPILER_FLAGS, @@ -38,7 +30,7 @@ cxx_library( ) cxx_test( - name = 'tests', + name = 'YogaTests', contacts = ['emilsj@fb.com'], srcs = glob(['tests/*.cpp']), compiler_flags = TEST_COMPILER_FLAGS, diff --git a/YOGA_DEFS b/YOGA_DEFS index 137b96fd..288b13be 100644 --- a/YOGA_DEFS +++ b/YOGA_DEFS @@ -17,6 +17,14 @@ CXX_LIBRARY_WHITELIST = [ '//java:jni', ] +BASE_COMPILER_FLAGS = [ + '-fno-omit-frame-pointer', + '-fexceptions', + '-Wall', + '-Werror', + '-O3', +] + def yoga_dep(dep): return '//' + dep diff --git a/YogaKit/BUCK b/YogaKit/BUCK index 4a781038..900ededb 100644 --- a/YogaKit/BUCK +++ b/YogaKit/BUCK @@ -30,7 +30,6 @@ COMPILER_FLAGS = [ apple_library( name = 'YogaKit', compiler_flags = COMPILER_FLAGS, - tests = [':YogaKitTests'], srcs = glob(['*.m']), exported_headers = glob(['*.h']), frameworks = [ diff --git a/YogaKit/Tests/YogaKitTests.m b/YogaKit/Tests/YogaKitTests.m index 21b7f4ba..99927ade 100644 --- a/YogaKit/Tests/YogaKitTests.m +++ b/YogaKit/Tests/YogaKitTests.m @@ -9,7 +9,7 @@ #import -#import "UIView+Yoga.h" +#import @interface YogaKitTests : XCTestCase @end diff --git a/YogaKit/UIView+Yoga.h b/YogaKit/UIView+Yoga.h index 97bb2532..386416b2 100644 --- a/YogaKit/UIView+Yoga.h +++ b/YogaKit/UIView+Yoga.h @@ -55,7 +55,7 @@ - (YGDirection)yg_resolvedDirection; /** - Perform a layout calculation and update the frames of the views in the hierarchy with th results + Perform a layout calculation and update the frames of the views in the hierarchy with the results */ - (void)yg_applyLayout; diff --git a/YogaKit/UIView+Yoga.m b/YogaKit/UIView+Yoga.m index 0ad7bddc..241ad33e 100644 --- a/YogaKit/UIView+Yoga.m +++ b/YogaKit/UIView+Yoga.m @@ -53,7 +53,7 @@ - (NSUInteger)yg_numberOfChildren { - return YGNodeChildCount([self ygNode]); + return YGNodeGetChildCount([self ygNode]); } #pragma mark - Setters @@ -295,7 +295,7 @@ static void YGAttachNodesFromViewHierachy(UIView *view) { } BOOL shouldReconstructChildList = NO; - if (YGNodeChildCount(node) != subviewsToInclude.count) { + if (YGNodeGetChildCount(node) != subviewsToInclude.count) { shouldReconstructChildList = YES; } else { for (int i = 0; i < subviewsToInclude.count; i++) { @@ -324,8 +324,8 @@ static void YGRemoveAllChildren(const YGNodeRef node) return; } - while (YGNodeChildCount(node) > 0) { - YGNodeRemoveChild(node, YGNodeGetChild(node, YGNodeChildCount(node) - 1)); + while (YGNodeGetChildCount(node) > 0) { + YGNodeRemoveChild(node, YGNodeGetChild(node, YGNodeGetChildCount(node) - 1)); } } diff --git a/csharp/BUCK b/csharp/BUCK index 8223450a..8fc408eb 100644 --- a/csharp/BUCK +++ b/csharp/BUCK @@ -5,6 +5,10 @@ # LICENSE file in the root directory of this source tree. An additional grant # of patent rights can be found in the PATENTS file in the same directory. +include_defs('//YOGA_DEFS') + +COMPILER_FLAGS = BASE_COMPILER_FLAGS + ['-std=c++11'] + csharp_library( name = 'yogalibnet46', dll_name = 'Facebook.Yoga.dll', @@ -18,3 +22,42 @@ csharp_library( framework_ver = 'net45', srcs = glob(['**/*.cs']), ) + +cxx_library( + name = 'yoganet', + soname = 'libyoga.$(ext)', + srcs = glob(['Yoga/YGInterop.cpp']), + compiler_flags = COMPILER_FLAGS, + link_style = 'static', + link_whole = True, + deps = [yoga_dep(':yoga')], + visibility = ['PUBLIC'], +) + +with allow_unsafe_import(): + import os + +if os.path.isdir('/Applications/Xcode.app'): + yoganet_ios_srcs = [] + for arch in ['iphonesimulator-x86_64', 'iphoneos-arm64', 'iphoneos-armv7']: + name = 'yoganet-' + arch + yoganet_ios_srcs.append(':' + name) + genrule( + name = name, + srcs = [ + yoga_dep(':yoga#%s,static' % arch), + yoga_dep('YogaKit:YogaKit#%s,static' % arch), + yoga_dep('csharp:yoganet#%s,static' % arch), + ], + out = 'libyoga-%s.a' % arch, + cmd = 'libtool -static -o $OUT $SRCS', + visibility = [yoga_dep('csharp:yoganet-ios')], + ) + + genrule( + name = 'yoganet-ios', + srcs = yoganet_ios_srcs, + out = 'libyoga.a', + cmd = 'lipo $SRCS -create -output $OUT', + visibility = ['PUBLIC'], + ) diff --git a/csharp/Facebook.Yoga/Native.cs b/csharp/Facebook.Yoga/Native.cs index 28fcc55c..ef98d086 100644 --- a/csharp/Facebook.Yoga/Native.cs +++ b/csharp/Facebook.Yoga/Native.cs @@ -14,25 +14,21 @@ namespace Facebook.Yoga { internal static class Native { -#if (UNITY_IOS && !UNITY_EDITOR) || MONOMAC +#if (UNITY_IOS && !UNITY_EDITOR) || __IOS__ private const string DllName = "__Internal"; #else private const string DllName = "yoga"; #endif -#if !MONOMAC [DllImport(DllName)] public static extern void YGInteropSetLogger( [MarshalAs(UnmanagedType.FunctionPtr)] YogaLogger.Func func); -#endif [DllImport(DllName)] public static extern IntPtr YGNodeNew(); -#if !MONOMAC [DllImport(DllName)] public static extern void YGNodeInit(IntPtr node); -#endif [DllImport(DllName)] public static extern void YGNodeFree(IntPtr node); @@ -62,7 +58,7 @@ namespace Facebook.Yoga public static extern IntPtr YGNodeGetChild(IntPtr node, uint index); [DllImport(DllName)] - public static extern uint YGNodeChildCount(IntPtr node); + public static extern uint YGNodeGetChildCount(IntPtr node); [DllImport(DllName)] public static extern void YGNodeCalculateLayout(IntPtr node, diff --git a/csharp/Facebook.Yoga/YogaNode.Create.cs b/csharp/Facebook.Yoga/YogaNode.Create.cs index a7df02d0..d04d0ffa 100644 --- a/csharp/Facebook.Yoga/YogaNode.Create.cs +++ b/csharp/Facebook.Yoga/YogaNode.Create.cs @@ -31,12 +31,12 @@ namespace Facebook.Yoga Spacing margin = null, Spacing padding = null, Spacing border = null, - float? Width = null, - float? Height = null, - float? MaxWidth = null, - float? MaxHeight = null, - float? MinWidth = null, - float? MinHeight = null) + float? width = null, + float? height = null, + float? maxWidth = null, + float? maxHeight = null, + float? minWidth = null, + float? minHeight = null) { YogaNode node = new YogaNode(); @@ -197,34 +197,34 @@ namespace Facebook.Yoga } } - if (Width.HasValue) + if (width.HasValue) { - node.Width = Width.Value; + node.Width = width.Value; } - if (Height.HasValue) + if (height.HasValue) { - node.Height = Height.Value; + node.Height = height.Value; } - if (MinWidth.HasValue) + if (minWidth.HasValue) { - node.MinWidth = MinWidth.Value; + node.MinWidth = minWidth.Value; } - if (MinHeight.HasValue) + if (minHeight.HasValue) { - node.MinHeight = MinHeight.Value; + node.MinHeight = minHeight.Value; } - if (MaxWidth.HasValue) + if (maxWidth.HasValue) { - node.MaxWidth = MaxWidth.Value; + node.MaxWidth = maxWidth.Value; } - if (MaxHeight.HasValue) + if (maxHeight.HasValue) { - node.MaxHeight = MaxHeight.Value; + node.MaxHeight = maxHeight.Value; } return node; diff --git a/csharp/Yoga/Yoga.vcxproj b/csharp/Yoga/Yoga.vcxproj index b3704474..7303d22d 100755 --- a/csharp/Yoga/Yoga.vcxproj +++ b/csharp/Yoga/Yoga.vcxproj @@ -21,6 +21,7 @@ {0446C86B-F47B-4C46-B673-C7AE0CFF35D5} Win32Proj + yoga Yoga 10.0.14393.0 diff --git a/csharp/tests/Facebook.Yoga/YogaNodeCreateTest.cs b/csharp/tests/Facebook.Yoga/YogaNodeCreateTest.cs index d7cd8d8e..0d43cdbc 100644 --- a/csharp/tests/Facebook.Yoga/YogaNodeCreateTest.cs +++ b/csharp/tests/Facebook.Yoga/YogaNodeCreateTest.cs @@ -87,12 +87,12 @@ namespace Facebook.Yoga padding: new Spacing(top: 13, bottom: 14, left: 15, right: 16), border: new Spacing(top: 17, bottom: 18, left: 19, right: 20), - Width: 21, - Height: 22, - MinWidth: 23, - MinHeight: 24, - MaxWidth: 25, - MaxHeight: 26); + width: 21, + height: 22, + minWidth: 23, + minHeight: 24, + maxWidth: 25, + maxHeight: 26); Assert.AreEqual(YogaDirection.RTL, node.StyleDirection); Assert.AreEqual(YogaFlexDirection.RowReverse, node.FlexDirection); diff --git a/csharp/tests/Facebook.Yoga/test_macos.sh b/csharp/tests/Facebook.Yoga/test_macos.sh index 7df36893..1d04177d 100755 --- a/csharp/tests/Facebook.Yoga/test_macos.sh +++ b/csharp/tests/Facebook.Yoga/test_macos.sh @@ -1,16 +1,6 @@ #!/bin/sh -if clang --version >/dev/null 2>&1; then true; else - echo "ERROR: Can't execute clang. You need to install Xcode and command line tools." - exit 1 -fi - -if mcs --version >/dev/null 2>&1; then true; else - echo "ERROR: Can't execute mcs. You need to install Mono from http://www.mono-project.com/download/ and re-login to apply PATH environment." - exit 1 -fi - -if mono --version >/dev/null 2>&1; then true; else - echo "ERROR: Can't execute mono64. You need to install Mono from http://www.mono-project.com/download/ and re-login to apply PATH environment." +if mcs --version >/dev/null 2>&1 && mono --version >/dev/null 2>&1; then true; else + echo "ERROR: Need to install Mono (brew install mono, or http://www.mono-project.com/download/)" exit 1 fi @@ -28,6 +18,11 @@ if [ -d $NUNIT \ rm NUnit-2.6.4.zip fi -clang -g -Wall -Wextra -dynamiclib -o libyoga.dylib -I../../.. ../../../yoga/*.c ../../Yoga/YGInterop.cpp +TARGET=//csharp:yoganet#default,shared +buck build $TARGET +ROOT=`buck root|tail -1` +DYLIB=`buck targets --show-output $TARGET|tail -1|awk '{print $2}'` +cp $ROOT/$DYLIB . + mcs -debug -t:library -r:$NUNIT/nunit.framework.dll -out:YogaTest.dll *.cs ../../../csharp/Facebook.Yoga/*cs MONO_PATH=$NUNIT mono --arch=64 --debug $NUNIT/nunit-console.exe YogaTest.dll diff --git a/java/jni/YGJNI.cpp b/java/jni/YGJNI.cpp index bf17f087..09236b88 100644 --- a/java/jni/YGJNI.cpp +++ b/java/jni/YGJNI.cpp @@ -36,7 +36,7 @@ static void YGTransferLayoutOutputsRecursive(YGNodeRef root) { obj->setFieldValue(topField, YGNodeLayoutGetTop(root)); YGTransferLayoutDirection(root, obj); - for (uint32_t i = 0; i < YGNodeChildCount(root); i++) { + for (uint32_t i = 0; i < YGNodeGetChildCount(root); i++) { YGTransferLayoutOutputsRecursive(YGNodeGetChild(root, i)); } } else { diff --git a/lib/fb/BUCK b/lib/fb/BUCK index da59ceaa..7300608d 100644 --- a/lib/fb/BUCK +++ b/lib/fb/BUCK @@ -11,7 +11,7 @@ prebuilt_cxx_library( name = 'ndklog', header_only = True, exported_platform_linker_flags = [ - ('android.*', ['-llog']), + ('^android.*', ['-llog']), ], visibility = [YOGA_ROOT], ) diff --git a/tests/YGLayoutDefaultValuesTest.cpp b/tests/YGLayoutDefaultValuesTest.cpp index fbc1e1b9..044059b5 100644 --- a/tests/YGLayoutDefaultValuesTest.cpp +++ b/tests/YGLayoutDefaultValuesTest.cpp @@ -13,7 +13,7 @@ TEST(YogaTest, assert_default_values) { const YGNodeRef root = YGNodeNew(); - ASSERT_EQ(0, YGNodeChildCount(root)); + ASSERT_EQ(0, YGNodeGetChildCount(root)); ASSERT_EQ(NULL, YGNodeGetChild(root, 1)); ASSERT_EQ(YGDirectionInherit, YGNodeStyleGetDirection(root)); diff --git a/yoga/Yoga.c b/yoga/Yoga.c index 29acb459..dad81116 100644 --- a/yoga/Yoga.c +++ b/yoga/Yoga.c @@ -256,7 +256,7 @@ void YGNodeFree(const YGNodeRef node) { node->parent = NULL; } - const uint32_t childCount = YGNodeChildCount(node); + const uint32_t childCount = YGNodeGetChildCount(node); for (uint32_t i = 0; i < childCount; i++) { const YGNodeRef child = YGNodeGetChild(node, i); child->parent = NULL; @@ -268,7 +268,7 @@ void YGNodeFree(const YGNodeRef node) { } void YGNodeFreeRecursive(const YGNodeRef root) { - while (YGNodeChildCount(root) > 0) { + while (YGNodeGetChildCount(root) > 0) { const YGNodeRef child = YGNodeGetChild(root, 0); YGNodeRemoveChild(root, child); YGNodeFreeRecursive(child); @@ -277,7 +277,7 @@ void YGNodeFreeRecursive(const YGNodeRef root) { } void YGNodeReset(const YGNodeRef node) { - YG_ASSERT(YGNodeChildCount(node) == 0, "Cannot reset a node which still has children attached"); + YG_ASSERT(YGNodeGetChildCount(node) == 0, "Cannot reset a node which still has children attached"); YG_ASSERT(node->parent == NULL, "Cannot reset a node still attached to a parent"); YGNodeListFree(node->children); @@ -303,7 +303,7 @@ void YGNodeSetMeasureFunc(const YGNodeRef node, YGMeasureFunc measureFunc) { if (measureFunc == NULL) { node->measure = NULL; } else { - YG_ASSERT(YGNodeChildCount(node) == 0, + YG_ASSERT(YGNodeGetChildCount(node) == 0, "Cannot set measure function: Nodes with measure functions cannot have children."); node->measure = measureFunc; } @@ -333,7 +333,11 @@ YGNodeRef YGNodeGetChild(const YGNodeRef node, const uint32_t index) { return YGNodeListGet(node->children, index); } -inline uint32_t YGNodeChildCount(const YGNodeRef node) { +YGNodeRef YGNodeGetParent(const YGNodeRef node) { + return node->parent; +} + +inline uint32_t YGNodeGetChildCount(const YGNodeRef node) { return YGNodeListCount(node->children); } diff --git a/yoga/Yoga.h b/yoga/Yoga.h index c7bc600d..3bb96727 100644 --- a/yoga/Yoga.h +++ b/yoga/Yoga.h @@ -64,7 +64,8 @@ WIN_EXPORT void YGNodeInsertChild(const YGNodeRef node, const uint32_t index); WIN_EXPORT void YGNodeRemoveChild(const YGNodeRef node, const YGNodeRef child); WIN_EXPORT YGNodeRef YGNodeGetChild(const YGNodeRef node, const uint32_t index); -WIN_EXPORT uint32_t YGNodeChildCount(const YGNodeRef node); +WIN_EXPORT YGNodeRef YGNodeGetParent(const YGNodeRef node); +WIN_EXPORT uint32_t YGNodeGetChildCount(const YGNodeRef node); WIN_EXPORT void YGNodeCalculateLayout(const YGNodeRef node, const float availableWidth,