Add custom, per-module cflags for LTP

testcases/kernel/syscalls/getcwd/getcwd02 passes a purposefully invalid
pointer to getcwd, which our FORTIFY implementation complains about at
compile-time. Since these tests are meant to throw invalid input at
standard functions and see how they react, I think it's reasonable to
just disable FORTIFY for this test.

In order to do this, the Android.mk generator had to be tweaked a bit.
So, we can now apply custom per-module cflags. This seemed preferable to
just disabling the test.

The `module_shared_libraries := cap` lines were generated both with and
without this patch; happy to get rid of them if they aren't supposed to
be there.

Bug: 32073964
Test: Ran ./gen_android_mk.sh -u, built bullhead, ran
vts-serving-staging-ltp, saw no new failures. getcwd02 no longer fails
to compile with clang FORTIFY enabled in Bionic.

Change-Id: I516c21c8240bde284f0c5c736a8c9ed205067415
diff --git a/android/Android.ltp.mk b/android/Android.ltp.mk
index a88ee6b..2a9cf41 100644
--- a/android/Android.ltp.mk
+++ b/android/Android.ltp.mk
@@ -130,7 +130,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include include include/old
 module_static_libraries := ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/numa/support_numa
@@ -474,7 +474,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include testcases/kernel/containers/libclone include include/old
 module_static_libraries := clone ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/syscalls/renameat2/renameat201
@@ -1626,7 +1626,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include testcases/kernel/containers/libclone include include/old
 module_static_libraries := clone ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/mem/ksm/ksm06
@@ -2170,7 +2170,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include include include/old
 module_static_libraries := ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/syscalls/fcntl/fcntl31
@@ -3506,7 +3506,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include testcases/kernel/containers/libclone include include/old
 module_static_libraries := clone ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/syscalls/ioperm/ioperm01
@@ -4010,7 +4010,7 @@
 module_cflags := -D_GNU_SOURCE
 module_c_includes := testcases/kernel/include include include/old
 module_static_libraries := ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/mem/swapping/swapping01
@@ -4042,7 +4042,7 @@
 module_cflags := -D_GNU_SOURCE
 module_c_includes := testcases/kernel/include include include/old
 module_static_libraries := ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/controllers/cpuctl_fj/cpuctl_fj_cpu-hog
@@ -4058,7 +4058,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include testcases/kernel/containers/libclone include include/old
 module_static_libraries := clone ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/syscalls/removexattr/removexattr01
@@ -4322,7 +4322,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include include include/old
 module_static_libraries := ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/syscalls/recv/recv01
@@ -4570,7 +4570,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include include include/old
 module_static_libraries := ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/security/filecaps/print_caps
@@ -4578,7 +4578,7 @@
 module_cflags := -D_GNU_SOURCE
 module_c_includes := testcases/kernel/include include include/old
 module_static_libraries := ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/mem/mem/mem02
@@ -5074,7 +5074,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include testcases/kernel/containers/libclone include include/old
 module_static_libraries := clone ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/syscalls/open/open07
@@ -5106,7 +5106,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include testcases/kernel/containers/libclone include include/old
 module_static_libraries := clone ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/mem/ksm/ksm04
@@ -5487,7 +5487,7 @@
 
 module_testname := testcases/kernel/syscalls/getcwd/getcwd02
 module_src_files := testcases/kernel/syscalls/getcwd/getcwd02.c
-module_cflags := 
+module_cflags := -U_FORTIFY_SOURCE
 module_c_includes := testcases/kernel/include include include/old
 module_static_libraries := ltp
 module_shared_libraries := 
@@ -5594,7 +5594,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include testcases/kernel/containers/libclone include include/old
 module_static_libraries := clone ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/syscalls/pause/pause01
@@ -5802,7 +5802,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include include include/old
 module_static_libraries := ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/syscalls/nice/nice02
@@ -7426,7 +7426,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include include include/old
 module_static_libraries := ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/syscalls/dup3/dup3_02
@@ -7938,7 +7938,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include testcases/kernel/containers/libclone include include/old
 module_static_libraries := clone ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/syscalls/select/select04
@@ -8434,7 +8434,7 @@
 module_cflags := 
 module_c_includes := testcases/kernel/include include include/old
 module_static_libraries := ltp
-module_shared_libraries := 
+module_shared_libraries := cap
 include $(ltp_build_test)
 
 module_testname := testcases/kernel/syscalls/execvp/execvp01
diff --git a/android/tools/android_mk_generator.py b/android/tools/android_mk_generator.py
index 2e10335..709dbd2 100644
--- a/android/tools/android_mk_generator.py
+++ b/android/tools/android_mk_generator.py
@@ -23,6 +23,7 @@
 
 import argparse
 import fileinput
+import json
 import os.path
 import re
 
@@ -41,10 +42,16 @@
 
     Attributes:
         result: list of string, result string buffer
+        _custom_cflags: dict of string (module name) to lists of strings (cflags
+            to add for said module)
+        _unused_custom_cflags: set of strings; tracks the modules with custom
+            cflags that we haven't yet seen
     '''
 
-    def __init__(self):
+    def __init__(self, custom_cflags):
         self.result = []
+        self._custom_cflags = custom_cflags
+        self._unused_custom_cflags = set(custom_cflags)
 
     def UniqueKeepOrder(self, sequence):
         '''Get a copy of list where items are unique and order is preserved.
@@ -104,6 +111,10 @@
             return
         ltp_names_used.add(base_name)
 
+        if cc_target in self._custom_cflags:
+            local_cflags.extend(self._custom_cflags[cc_target])
+            self._unused_custom_cflags.remove(cc_target)
+
         self.result.append('module_testname := %s' % cc_target)
         self.result.append('module_src_files := %s' %
                            ' '.join(local_src_files))
@@ -336,6 +347,10 @@
         parser = make_install_parser.MakeInstallParser(ltp_root)
         self.ParseInput(parser.ParseFile(MAKE_INSTALL_DRY_RUN_FILE_NAME))
 
+    def GetUnusedCustomCFlagsTargets(self):
+        '''Get targets that have custom cflags, but that weren't built.'''
+        return list(self._unused_custom_cflags)
+
 
 def main():
     parser = argparse.ArgumentParser(
@@ -347,12 +362,29 @@
         dest='output_path',
         required=True,
         help='output file path')
+    parser.add_argument(
+        '--custom_cflags_file',
+        dest='custom_cflags_file',
+        required=True,
+        help='file with custom per-module cflags. empty means no file.')
     args = parser.parse_args()
 
-    generator = AndroidMkGenerator()
+    custom_cflags = {}
+    if args.custom_cflags_file:
+        # The file is expected to just be a JSON map of string -> [string], e.g.
+        # {"testcases/kernel/syscalls/getcwd/getcwd02": ["-DFOO", "-O3"]}
+        with open(args.custom_cflags_file) as f:
+            custom_cflags = json.load(f)
+
+    generator = AndroidMkGenerator(custom_cflags)
     generator.ParseAll(args.ltp_root)
     generator.WriteResult(args.output_path)
 
+    unused_cflags_targs = generator.GetUnusedCustomCFlagsTargets()
+    if unused_cflags_targs:
+        print 'NOTE: Tests had custom cflags, but were never seen: {}'.format(
+            ', '.join(unused_cflags_targs))
+
     print 'Finished!'
 
 
diff --git a/android/tools/custom_cflags.json b/android/tools/custom_cflags.json
new file mode 100644
index 0000000..64d085e
--- /dev/null
+++ b/android/tools/custom_cflags.json
@@ -0,0 +1,3 @@
+{
+  "testcases/kernel/syscalls/getcwd/getcwd02": ["-U_FORTIFY_SOURCE"]
+}
diff --git a/android/tools/gen_android_mk.sh b/android/tools/gen_android_mk.sh
index 1dac64b..bf1c880 100755
--- a/android/tools/gen_android_mk.sh
+++ b/android/tools/gen_android_mk.sh
@@ -18,6 +18,7 @@
 TOOLS_DIR=$(realpath $(dirname $0))
 LTP_ANDROID_DIR=$(realpath $TOOLS_DIR/..)
 LTP_ROOT=$(realpath $LTP_ANDROID_DIR/..)
+CUSTOM_CFLAGS_PATH=$TOOLS_DIR/custom_cflags.json
 OUTPUT=$LTP_ANDROID_DIR/Android.ltp.mk
 
 if ! [ -f $LTP_ROOT/include/config.h ]; then
@@ -53,4 +54,5 @@
 echo "# This file is autogenerated by $(basename $0)" >> $OUTPUT
 echo "" >> $OUTPUT
 
-python android_mk_generator.py --ltp_root $LTP_ROOT --output_path $OUTPUT
\ No newline at end of file
+python android_mk_generator.py --ltp_root $LTP_ROOT --output_path $OUTPUT \
+    --custom_cflags_file $CUSTOM_CFLAGS_PATH