pw_build, pw_unit_test: Artifacts in separate dirs

Some projects may use toolchains that place the objects inside
${target_out_dir}/${target_name}. Pigweed tries to place executables at
this location (except on Windows) which results in an error.

This moves executables into the "bin" or "test" directory, and
libraries into "lib". The latter change is not strictly necessary
since libraries always have a suffix.

Tests could be in "bin", too, this is flexible.

Change-Id: I9f102979c91214a6280d6dc6a9a6d8b138bb1ecc
diff --git a/pw_build/target_types.gni b/pw_build/target_types.gni
index 1022b1c..c7054b6 100644
--- a/pw_build/target_types.gni
+++ b/pw_build/target_types.gni
@@ -86,7 +86,7 @@
 template("pw_static_library") {
   import("$dir_pw_build/defaults.gni")
 
-  _library_output_dir = target_out_dir
+  _library_output_dir = "${target_out_dir}/lib"
   if (defined(invoker.output_dir)) {
     _library_output_dir = invoker.output_dir
   }
@@ -134,7 +134,7 @@
 template("pw_shared_library") {
   import("$dir_pw_build/defaults.gni")
 
-  _library_output_dir = target_out_dir
+  _library_output_dir = "${target_out_dir}/lib"
   if (defined(invoker.output_dir)) {
     _library_output_dir = invoker.output_dir
   }
@@ -184,7 +184,7 @@
 template("pw_executable") {
   import("$dir_pw_build/defaults.gni")
 
-  _executable_output_dir = target_out_dir
+  _executable_output_dir = "${target_out_dir}/bin"
   if (defined(invoker.output_dir)) {
     _executable_output_dir = invoker.output_dir
   }
diff --git a/pw_toolchain/generate_toolchain.gni b/pw_toolchain/generate_toolchain.gni
index 25e930f..a3e4dcd 100644
--- a/pw_toolchain/generate_toolchain.gni
+++ b/pw_toolchain/generate_toolchain.gni
@@ -111,7 +111,7 @@
         command = "rm -f {{output}} && ${invoker.ar} rcs {{output}} {{inputs}}"
         description = "ar {{target_output_name}}{{output_extension}}"
         outputs =
-            [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ]
+            [ "{{target_out_dir}}/lib/{{target_output_name}}{{output_extension}}" ]
         default_output_extension = ".a"
       }
 
@@ -174,7 +174,7 @@
         command = _link_command
         description = "ld $_link_outfile"
         outputs = [ _link_outfile ]
-        default_output_dir = "{{target_out_dir}}"
+        default_output_dir = "{{target_out_dir}}/bin"
 
         if (is_host_toolchain && host_os == "win") {
           default_output_extension = ".exe"
@@ -187,7 +187,7 @@
         command = _link_command + " -shared"
         description = "ld -shared $_link_outfile"
         outputs = [ _link_outfile ]
-        default_output_dir = "{{target_out_dir}}"
+        default_output_dir = "{{target_out_dir}}/lib"
         default_output_extension = ".so"
       }
 
diff --git a/pw_unit_test/test.gni b/pw_unit_test/test.gni
index 33ebdd1..d4d1e31 100644
--- a/pw_unit_test/test.gni
+++ b/pw_unit_test/test.gni
@@ -97,7 +97,7 @@
 
   # Always set the output_dir as pigweed is not compatible with shared
   # bin directories for tests.
-  _test_output_dir = target_out_dir
+  _test_output_dir = "${target_out_dir}/test"
   if (defined(invoker.output_dir)) {
     _test_output_dir = invoker.output_dir
   }