From 022a73b9ad9755230ef876709aff5e21823c4460 Mon Sep 17 00:00:00 2001 From: Ivan Lozano Date: Mon, 9 Sep 2019 20:29:31 -0700 Subject: [PATCH] Move splitFileExt to the android package. Both Rust and cc use this function, so move it over to android package's util.go and export it. Bug: 140734195 Test: m -j Change-Id: Ibe8b7a94592e402468a027ad6027b187f29c8e07 --- Android.bp | 1 - android/util.go | 27 ++++++++++++++ android/util_test.go | 65 ++++++++++++++++++++++++++++++++++ cc/androidmk.go | 14 ++++---- cc/util.go | 26 -------------- cc/util_test.go | 84 -------------------------------------------- rust/androidmk.go | 31 +--------------- 7 files changed, 100 insertions(+), 148 deletions(-) delete mode 100644 cc/util_test.go diff --git a/Android.bp b/Android.bp index 537b58b46..25038c653 100644 --- a/Android.bp +++ b/Android.bp @@ -208,7 +208,6 @@ bootstrap_go_package { "cc/prebuilt_test.go", "cc/proto_test.go", "cc/test_data_test.go", - "cc/util_test.go", ], pluginFor: ["soong_build"], } diff --git a/android/util.go b/android/util.go index e02cca1df..010244209 100644 --- a/android/util.go +++ b/android/util.go @@ -16,6 +16,7 @@ package android import ( "fmt" + "path/filepath" "reflect" "regexp" "runtime" @@ -292,3 +293,29 @@ func matchPattern(pat, str string) bool { } return strings.HasPrefix(str, pat[:i]) && strings.HasSuffix(str, pat[i+1:]) } + +var shlibVersionPattern = regexp.MustCompile("(?:\\.\\d+(?:svn)?)+") + +// splitFileExt splits a file name into root, suffix and ext. root stands for the file name without +// the file extension and the version number (e.g. "libexample"). suffix stands for the +// concatenation of the file extension and the version number (e.g. ".so.1.0"). ext stands for the +// file extension after the version numbers are trimmed (e.g. ".so"). +func SplitFileExt(name string) (string, string, string) { + // Extract and trim the shared lib version number if the file name ends with dot digits. + suffix := "" + matches := shlibVersionPattern.FindAllStringIndex(name, -1) + if len(matches) > 0 { + lastMatch := matches[len(matches)-1] + if lastMatch[1] == len(name) { + suffix = name[lastMatch[0]:lastMatch[1]] + name = name[0:lastMatch[0]] + } + } + + // Extract the file name root and the file extension. + ext := filepath.Ext(name) + root := strings.TrimSuffix(name, ext) + suffix = ext + suffix + + return root, suffix, ext +} diff --git a/android/util_test.go b/android/util_test.go index 2e5eb07ee..1df1c5af5 100644 --- a/android/util_test.go +++ b/android/util_test.go @@ -404,3 +404,68 @@ func ExampleCopyOf_append() { // b = ["foo" "bar"] // c = ["foo" "baz"] } + +func TestSplitFileExt(t *testing.T) { + t.Run("soname with version", func(t *testing.T) { + root, suffix, ext := SplitFileExt("libtest.so.1.0.30") + expected := "libtest" + if root != expected { + t.Errorf("root should be %q but got %q", expected, root) + } + expected = ".so.1.0.30" + if suffix != expected { + t.Errorf("suffix should be %q but got %q", expected, suffix) + } + expected = ".so" + if ext != expected { + t.Errorf("ext should be %q but got %q", expected, ext) + } + }) + + t.Run("soname with svn version", func(t *testing.T) { + root, suffix, ext := SplitFileExt("libtest.so.1svn") + expected := "libtest" + if root != expected { + t.Errorf("root should be %q but got %q", expected, root) + } + expected = ".so.1svn" + if suffix != expected { + t.Errorf("suffix should be %q but got %q", expected, suffix) + } + expected = ".so" + if ext != expected { + t.Errorf("ext should be %q but got %q", expected, ext) + } + }) + + t.Run("version numbers in the middle should be ignored", func(t *testing.T) { + root, suffix, ext := SplitFileExt("libtest.1.0.30.so") + expected := "libtest.1.0.30" + if root != expected { + t.Errorf("root should be %q but got %q", expected, root) + } + expected = ".so" + if suffix != expected { + t.Errorf("suffix should be %q but got %q", expected, suffix) + } + expected = ".so" + if ext != expected { + t.Errorf("ext should be %q but got %q", expected, ext) + } + }) + + t.Run("no known file extension", func(t *testing.T) { + root, suffix, ext := SplitFileExt("test.exe") + expected := "test" + if root != expected { + t.Errorf("root should be %q but got %q", expected, root) + } + expected = ".exe" + if suffix != expected { + t.Errorf("suffix should be %q but got %q", expected, suffix) + } + if ext != expected { + t.Errorf("ext should be %q but got %q", expected, ext) + } + }) +} diff --git a/cc/androidmk.go b/cc/androidmk.go index 4b0cb31dc..66dd83815 100644 --- a/cc/androidmk.go +++ b/cc/androidmk.go @@ -207,7 +207,7 @@ func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.An library.androidMkWriteExportedFlags(w) library.androidMkWriteAdditionalDependenciesForSourceAbiDiff(w) - _, _, ext := splitFileExt(outputFile.Base()) + _, _, ext := android.SplitFileExt(outputFile.Base()) fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+ext) @@ -319,7 +319,7 @@ func (test *testLibrary) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkD func (library *toolchainLibraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) { ret.Class = "STATIC_LIBRARIES" ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { - _, suffix, _ := splitFileExt(outputFile.Base()) + _, suffix, _ := android.SplitFileExt(outputFile.Base()) fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+suffix) }) } @@ -334,7 +334,7 @@ func (installer *baseInstaller) AndroidMk(ctx AndroidMkContext, ret *android.And ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { path := installer.path.RelPathString() dir, file := filepath.Split(path) - stem, suffix, _ := splitFileExt(file) + stem, suffix, _ := android.SplitFileExt(file) fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+suffix) fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(OUT_DIR)/"+filepath.Clean(dir)) fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem) @@ -347,7 +347,7 @@ func (c *stubDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkDa ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { path, file := filepath.Split(c.installPath.String()) - stem, suffix, _ := splitFileExt(file) + stem, suffix, _ := android.SplitFileExt(file) fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+suffix) fmt.Fprintln(w, "LOCAL_MODULE_PATH := "+path) fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem) @@ -361,7 +361,7 @@ func (c *llndkStubDecorator) AndroidMk(ctx AndroidMkContext, ret *android.Androi ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { c.libraryDecorator.androidMkWriteExportedFlags(w) - _, _, ext := splitFileExt(outputFile.Base()) + _, _, ext := android.SplitFileExt(outputFile.Base()) fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+ext) fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true") @@ -380,7 +380,7 @@ func (c *vndkPrebuiltLibraryDecorator) AndroidMk(ctx AndroidMkContext, ret *andr path := c.path.RelPathString() dir, file := filepath.Split(path) - stem, suffix, ext := splitFileExt(file) + stem, suffix, ext := android.SplitFileExt(file) fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+ext) fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+suffix) fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(OUT_DIR)/"+filepath.Clean(dir)) @@ -398,7 +398,7 @@ func (c *vendorPublicLibraryStubDecorator) AndroidMk(ctx AndroidMkContext, ret * ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { c.libraryDecorator.androidMkWriteExportedFlags(w) - _, _, ext := splitFileExt(outputFile.Base()) + _, _, ext := android.SplitFileExt(outputFile.Base()) fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+ext) fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true") diff --git a/cc/util.go b/cc/util.go index 7b8ad1872..2f7bec2bb 100644 --- a/cc/util.go +++ b/cc/util.go @@ -104,32 +104,6 @@ func addSuffix(list []string, suffix string) []string { return list } -var shlibVersionPattern = regexp.MustCompile("(?:\\.\\d+(?:svn)?)+") - -// splitFileExt splits a file name into root, suffix and ext. root stands for the file name without -// the file extension and the version number (e.g. "libexample"). suffix stands for the -// concatenation of the file extension and the version number (e.g. ".so.1.0"). ext stands for the -// file extension after the version numbers are trimmed (e.g. ".so"). -func splitFileExt(name string) (string, string, string) { - // Extract and trim the shared lib version number if the file name ends with dot digits. - suffix := "" - matches := shlibVersionPattern.FindAllStringIndex(name, -1) - if len(matches) > 0 { - lastMatch := matches[len(matches)-1] - if lastMatch[1] == len(name) { - suffix = name[lastMatch[0]:lastMatch[1]] - name = name[0:lastMatch[0]] - } - } - - // Extract the file name root and the file extension. - ext := filepath.Ext(name) - root := strings.TrimSuffix(name, ext) - suffix = ext + suffix - - return root, suffix, ext -} - // linkDirOnDevice/linkName -> target func makeSymlinkCmd(linkDirOnDevice string, linkName string, target string) string { dir := filepath.Join("$(PRODUCT_OUT)", linkDirOnDevice) diff --git a/cc/util_test.go b/cc/util_test.go deleted file mode 100644 index 7c718eae0..000000000 --- a/cc/util_test.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2018 Google Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cc - -import ( - "testing" -) - -func TestSplitFileExt(t *testing.T) { - t.Run("soname with version", func(t *testing.T) { - root, suffix, ext := splitFileExt("libtest.so.1.0.30") - expected := "libtest" - if root != expected { - t.Errorf("root should be %q but got %q", expected, root) - } - expected = ".so.1.0.30" - if suffix != expected { - t.Errorf("suffix should be %q but got %q", expected, suffix) - } - expected = ".so" - if ext != expected { - t.Errorf("ext should be %q but got %q", expected, ext) - } - }) - - t.Run("soname with svn version", func(t *testing.T) { - root, suffix, ext := splitFileExt("libtest.so.1svn") - expected := "libtest" - if root != expected { - t.Errorf("root should be %q but got %q", expected, root) - } - expected = ".so.1svn" - if suffix != expected { - t.Errorf("suffix should be %q but got %q", expected, suffix) - } - expected = ".so" - if ext != expected { - t.Errorf("ext should be %q but got %q", expected, ext) - } - }) - - t.Run("version numbers in the middle should be ignored", func(t *testing.T) { - root, suffix, ext := splitFileExt("libtest.1.0.30.so") - expected := "libtest.1.0.30" - if root != expected { - t.Errorf("root should be %q but got %q", expected, root) - } - expected = ".so" - if suffix != expected { - t.Errorf("suffix should be %q but got %q", expected, suffix) - } - expected = ".so" - if ext != expected { - t.Errorf("ext should be %q but got %q", expected, ext) - } - }) - - t.Run("no known file extension", func(t *testing.T) { - root, suffix, ext := splitFileExt("test.exe") - expected := "test" - if root != expected { - t.Errorf("root should be %q but got %q", expected, root) - } - expected = ".exe" - if suffix != expected { - t.Errorf("suffix should be %q but got %q", expected, suffix) - } - if ext != expected { - t.Errorf("ext should be %q but got %q", expected, ext) - } - }) -} diff --git a/rust/androidmk.go b/rust/androidmk.go index c9056e1b4..107959f84 100644 --- a/rust/androidmk.go +++ b/rust/androidmk.go @@ -18,7 +18,6 @@ import ( "fmt" "io" "path/filepath" - "regexp" "strings" "android/soong/android" @@ -119,37 +118,9 @@ func (compiler *baseCompiler) AndroidMk(ctx AndroidMkContext, ret *android.Andro ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { path := compiler.path.RelPathString() dir, file := filepath.Split(path) - stem, suffix, _ := splitFileExt(file) + stem, suffix, _ := android.SplitFileExt(file) fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+suffix) fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(OUT_DIR)/"+filepath.Clean(dir)) fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem) }) } - -//TODO: splitFileExt copied from cc/util.go; move this to android/util.go and refactor usages. - -// splitFileExt splits a file name into root, suffix and ext. root stands for the file name without -// the file extension and the version number (e.g. "libexample"). suffix stands for the -// concatenation of the file extension and the version number (e.g. ".so.1.0"). ext stands for the -// file extension after the version numbers are trimmed (e.g. ".so"). -var shlibVersionPattern = regexp.MustCompile("(?:\\.\\d+(?:svn)?)+") - -func splitFileExt(name string) (string, string, string) { - // Extract and trim the shared lib version number if the file name ends with dot digits. - suffix := "" - matches := shlibVersionPattern.FindAllStringIndex(name, -1) - if len(matches) > 0 { - lastMatch := matches[len(matches)-1] - if lastMatch[1] == len(name) { - suffix = name[lastMatch[0]:lastMatch[1]] - name = name[0:lastMatch[0]] - } - } - - // Extract the file name root and the file extension. - ext := filepath.Ext(name) - root := strings.TrimSuffix(name, ext) - suffix = ext + suffix - - return root, suffix, ext -}