cmake: Fix processing archive files

Libraries were treated like source files and were not properly
handled by cmake.
diff --git a/newt/builder/cmake.go b/newt/builder/cmake.go
index 7eeaeb1..84517a3 100644
--- a/newt/builder/cmake.go
+++ b/newt/builder/cmake.go
@@ -25,6 +25,7 @@
 	"fmt"
 	"io"
 	"os"
+	"path"
 	"path/filepath"
 	"strings"
 
@@ -47,6 +48,13 @@
 	return strings.Replace(name, "/", "_", -1)
 }
 
+func ExtractLibraryName(filepath string) string {
+	_, name := path.Split(filepath)
+	name = strings.TrimPrefix(name, "lib")
+	name = strings.TrimSuffix(name, ".a")
+	return name
+}
+
 func replaceBackslashes(path string) string {
 	return strings.Replace(path, "\\", "/", -1)
 }
@@ -136,7 +144,7 @@
 }
 
 func (b *Builder) CMakeBuildPackageWrite(w io.Writer, bpkg *BuildPackage,
-	linkFlags *[]string) (*BuildPackage, error) {
+	linkFlags *[]string, libraries *[]string) (*BuildPackage, error) {
 	entries, err := b.collectCompileEntriesBpkg(bpkg)
 	if err != nil {
 		return nil, err
@@ -148,6 +156,7 @@
 
 	otherIncludes := []string{}
 	files := []string{}
+	linkDirs := []string{}
 
 	for _, s := range entries {
 		filename := filepath.ToSlash(s.Filename)
@@ -156,9 +165,19 @@
 			continue
 		}
 
-		CmakeSourceObjectWrite(w, s, &otherIncludes, linkFlags)
-		s.Filename = trimProjectPath(s.Filename)
-		files = append(files, s.Filename)
+		if s.CompilerType == toolchain.COMPILER_TYPE_ARCHIVE {
+			arFile := trimProjectPath(s.Filename)
+			linkDirs = append(linkDirs, filepath.Dir(arFile))
+			*libraries = append(*libraries, arFile)
+		} else {
+			CmakeSourceObjectWrite(w, s, &otherIncludes, linkFlags)
+			s.Filename = trimProjectPath(s.Filename)
+			files = append(files, s.Filename)
+		}
+	}
+
+	if len(linkDirs) > 0 {
+		fmt.Fprintf(w, "link_directories(%s)\n", strings.Join(util.SortFields(linkDirs...), " "))
 	}
 
 	if len(files) <= 0 {
@@ -169,10 +188,9 @@
 
 	util.StatusMessage(util.VERBOSITY_DEFAULT, "Generating CMakeLists.txt for %s\n", pkgName)
 	fmt.Fprintf(w, "\n# Generating CMakeLists.txt for %s\n", pkgName)
-	fmt.Fprintf(w, "add_library(%s %s)\n\n",
+	fmt.Fprintf(w, "add_library(%s %s)\n",
 		EscapeName(pkgName),
 		strings.Join(files, " "))
-
 	archivePath := replaceBackslashes(trimProjectPath(filepath.Dir(b.ArchivePath(bpkg))))
 	CmakeCompilerInfoWrite(w, archivePath, bpkg, entries[0], otherIncludes)
 
@@ -183,13 +201,15 @@
 	bpkgs := b.sortedBuildPackages()
 	var compileFlags []string
 	var linkFlags []string
+	var libraries []string
 
 	c := targetCompiler
 	c.AddInfo(b.GetCompilerInfo())
 
 	builtPackages := []*BuildPackage{}
 	for _, bpkg := range bpkgs {
-		builtPackage, err := b.CMakeBuildPackageWrite(w, bpkg, &linkFlags)
+		builtPackage, err := b.CMakeBuildPackageWrite(w, bpkg,
+			&linkFlags, &libraries)
 		if err != nil {
 			return err
 		}
@@ -209,6 +229,11 @@
 			EscapeName(bpkg.rpkg.Lpkg.Name())))
 	}
 
+	for _, filename := range libraries {
+		targetObjectsBuffer.WriteString(fmt.Sprintf("%s ",
+			ExtractLibraryName(filename)))
+	}
+
 	elfOutputDir := replaceBackslashes(trimProjectPath(filepath.Dir(b.AppElfPath())))
 	fmt.Fprintf(w, "file(WRITE %s \"\")\n", replaceBackslashes(filepath.Join(elfOutputDir, "null.c")))
 	fmt.Fprintf(w, "add_executable(%s %s)\n\n", elfName,