cmake: Organize aom.pc and install target support.

- Move the CMake scripting supporting the install target
  and aom.pc generation into build/cmake/aom_install.cmake.
- Fix the format of aom.pc per comments in linked bug.
- Fix the libdir value: build it using exec_prefix.
- Fix the Libs value: remove private libs.
- Fix dependency issue: aom.pc was not built post clean.

Also fixes an error at configuration time,
f7e0b7f305b1dfdd352bf2c17561b916fcec6212 missed one usage of
pkg_config.cmake, and it was complaining about the missing
GNUInstallDirs related arguments.

BUG=aomedia:2195

Change-Id: Iafdebd2234044f921f34a0c9159d5e81cd5f3f57
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 09aa256..eecfbb4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -38,9 +38,10 @@
 include("${AOM_ROOT}/aom_scale/aom_scale.cmake")
 include("${AOM_ROOT}/aom_util/aom_util.cmake")
 include("${AOM_ROOT}/av1/av1.cmake")
-include("${AOM_ROOT}/test/test.cmake")
+include("${AOM_ROOT}/build/cmake/aom_install.cmake")
 include("${AOM_ROOT}/build/cmake/sanitizers.cmake")
 include("${AOM_ROOT}/build/cmake/util.cmake")
+include("${AOM_ROOT}/test/test.cmake")
 
 list(APPEND AOM_RTCD_SOURCES
             "${AOM_CONFIG_DIR}/config/aom_dsp_rtcd.h"
@@ -154,8 +155,6 @@
             "${AOM_ROOT}/stats/aomstats.h" "${AOM_ROOT}/stats/rate_hist.c"
             "${AOM_ROOT}/stats/rate_hist.h")
 
-list(APPEND AOM_PKG_CONFIG_SOURCES "${AOM_CONFIG_DIR}/aom.pc")
-
 list(APPEND AOM_VERSION_SOURCES "${AOM_CONFIG_DIR}/config/aom_version.h")
 
 list(APPEND AOM_WEBM_DECODER_SOURCES "${AOM_ROOT}/common/webmdec.cc"
@@ -188,26 +187,6 @@
                   COMMENT "Updating version info if necessary." VERBATIM)
 add_dependencies(aom_version aom_version_check)
 
-if(NOT (MSVC OR XCODE))
-  include("GNUInstallDirs")
-  add_library(aom_pc ${AOM_PKG_CONFIG_SOURCES})
-  add_dummy_source_file_to_target(aom_pc c)
-  add_custom_command(OUTPUT "${AOM_CONFIG_DIR}/aom.pc"
-                     COMMAND
-                       ${CMAKE_COMMAND} ARGS -DAOM_CONFIG_DIR=${AOM_CONFIG_DIR}
-                       -DAOM_ROOT=${AOM_ROOT}
-                       -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
-                       -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR}
-                       -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR}
-                       -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR}
-                       -DCMAKE_PROJECT_NAME=${CMAKE_PROJECT_NAME}
-                       -DCONFIG_MULTITHREAD=${CONFIG_MULTITHREAD}
-                       -DHAVE_PTHREAD_H=${HAVE_PTHREAD_H} -P
-                       "${AOM_ROOT}/build/cmake/pkg_config.cmake"
-                     COMMENT "Writing aom.pc" VERBATIM)
-  add_dependencies(aom_pc aom_version)
-endif()
-
 # TODO(tomfinegan): Move rtcd target setup where it belongs for each rtcd
 # source.
 add_rtcd_build_step("${AOM_ROOT}/aom_dsp/aom_dsp_rtcd_defs.pl"
@@ -592,48 +571,6 @@
   endif()
 endif()
 
-if(NOT (MSVC OR XCODE))
-
-  # Aomedia install rule.
-  list(APPEND AOM_INSTALL_INCS "${AOM_ROOT}/aom/aom.h"
-              "${AOM_ROOT}/aom/aom_codec.h"
-              "${AOM_ROOT}/aom/aom_frame_buffer.h"
-              "${AOM_ROOT}/aom/aom_image.h" "${AOM_ROOT}/aom/aom_integer.h"
-              "${AOM_ROOT}/aom/aom.h")
-
-  if(CONFIG_AV1_DECODER)
-    if(ENABLE_EXAMPLES)
-      list(APPEND AOM_INSTALL_BINS aomdec)
-    endif()
-
-    list(APPEND AOM_INSTALL_INCS "${AOM_ROOT}/aom/aom_decoder.h"
-                "${AOM_ROOT}/aom/aomdx.h")
-  endif()
-
-  if(CONFIG_AV1_ENCODER)
-    if(ENABLE_EXAMPLES)
-      list(APPEND AOM_INSTALL_BINS aomenc)
-    endif()
-
-    list(APPEND AOM_INSTALL_INCS "${AOM_ROOT}/aom/aomcx.h"
-                "${AOM_ROOT}/aom/aom_encoder.h")
-  endif()
-
-  set(AOM_INSTALL_LIBS aom)
-
-  install(FILES ${AOM_INSTALL_INCS} DESTINATION
-                "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/aom")
-  install(FILES "${AOM_CONFIG_DIR}/aom.pc" DESTINATION
-                "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig")
-  install(TARGETS ${AOM_INSTALL_LIBS} DESTINATION
-                  "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
-
-  if(ENABLE_EXAMPLES)
-    install(TARGETS ${AOM_INSTALL_BINS} DESTINATION
-                    "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}")
-  endif()
-endif()
-
 # Aomedia dist rule.
 if(CONFIG_AV1_DECODER AND ENABLE_EXAMPLES)
   list(APPEND AOM_DIST_APPS $<TARGET_FILE:aomdec>)
@@ -757,3 +694,6 @@
     file(APPEND "${libaom_srcs_gni_file}" "]\n")
   endif()
 endforeach()
+
+# Generate aom.pc and setup install rule.
+setup_aom_install_targets()
diff --git a/build/cmake/aom_configure.cmake b/build/cmake/aom_configure.cmake
index 707c986..295d57f 100644
--- a/build/cmake/aom_configure.cmake
+++ b/build/cmake/aom_configure.cmake
@@ -369,13 +369,3 @@
                         -DGIT_EXECUTABLE=${GIT_EXECUTABLE}
                         -DPERL_EXECUTABLE=${PERL_EXECUTABLE} -P
                         "${AOM_ROOT}/build/cmake/version.cmake")
-
-if(NOT MSVC) # Generate aom.pc (pkg-config file).
-  execute_process(COMMAND ${CMAKE_COMMAND} -DAOM_CONFIG_DIR=${AOM_CONFIG_DIR}
-                          -DAOM_ROOT=${AOM_ROOT}
-                          -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
-                          -DCMAKE_PROJECT_NAME=${CMAKE_PROJECT_NAME}
-                          -DCONFIG_MULTITHREAD=${CONFIG_MULTITHREAD}
-                          -DHAVE_PTHREAD_H=${HAVE_PTHREAD_H} -P
-                          "${AOM_ROOT}/build/cmake/pkg_config.cmake")
-endif()
diff --git a/build/cmake/aom_install.cmake b/build/cmake/aom_install.cmake
new file mode 100644
index 0000000..ae56753
--- /dev/null
+++ b/build/cmake/aom_install.cmake
@@ -0,0 +1,90 @@
+#
+# Copyright (c) 2018, Alliance for Open Media. All rights reserved
+#
+# This source code is subject to the terms of the BSD 2 Clause License and the
+# Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License was
+# not distributed with this source code in the LICENSE file, you can obtain it
+# at www.aomedia.org/license/software. If the Alliance for Open Media Patent
+# License 1.0 was not distributed with this source code in the PATENTS file, you
+# can obtain it at www.aomedia.org/license/patent.
+#
+list(APPEND AOM_INSTALL_INCS "${AOM_ROOT}/aom/aom.h"
+            "${AOM_ROOT}/aom/aom_codec.h" "${AOM_ROOT}/aom/aom_frame_buffer.h"
+            "${AOM_ROOT}/aom/aom_image.h" "${AOM_ROOT}/aom/aom_integer.h"
+            "${AOM_ROOT}/aom/aom.h")
+
+if(CONFIG_AV1_DECODER)
+  list(APPEND AOM_INSTALL_INCS "${AOM_ROOT}/aom/aom_decoder.h"
+              "${AOM_ROOT}/aom/aomdx.h")
+endif()
+
+if(CONFIG_AV1_ENCODER)
+  list(APPEND AOM_INSTALL_INCS "${AOM_ROOT}/aom/aomcx.h"
+              "${AOM_ROOT}/aom/aom_encoder.h")
+endif()
+
+# Generate aom.pc and setup dependencies to ensure it is created when necessary.
+# Note: aom.pc generation uses GNUInstallDirs:
+# https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html
+macro(setup_aom_install_targets)
+  if(NOT (MSVC OR XCODE))
+    include("GNUInstallDirs")
+    set(AOM_PKG_CONFIG_FILE "${AOM_CONFIG_DIR}/aom.pc")
+
+    # Create a dummy library target for creating aom.pc.
+    add_library(aom_pc ${AOM_PKG_CONFIG_SOURCES})
+    add_dummy_source_file_to_target(aom_pc c)
+
+    # Setup a rule to generate aom.pc.
+    add_custom_command(OUTPUT "${AOM_PKG_CONFIG_FILE}"
+                       COMMAND
+                         ${CMAKE_COMMAND} ARGS
+                         -DAOM_CONFIG_DIR=${AOM_CONFIG_DIR}
+                         -DAOM_ROOT=${AOM_ROOT}
+                         -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
+                         -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR}
+                         -DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR}
+                         -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR}
+                         -DCMAKE_PROJECT_NAME=${CMAKE_PROJECT_NAME}
+                         -DCONFIG_MULTITHREAD=${CONFIG_MULTITHREAD}
+                         -DHAVE_PTHREAD_H=${HAVE_PTHREAD_H} -P
+                         "${AOM_ROOT}/build/cmake/pkg_config.cmake"
+                       COMMENT "Writing aom.pc" VERBATIM)
+
+    # Explicitly add a dependency on the pkg-config file to ensure it's built.
+    get_property(aom_pc_sources TARGET aom_pc PROPERTY SOURCES)
+    set_source_files_properties(${aom_pc_sources} OBJECT_DEPENDS
+                                "${AOM_PKG_CONFIG_FILE}")
+
+    # Our pkg-config file carries version information: add a dependency on the
+    # version rule.
+    add_dependencies(aom_pc aom_version)
+
+    if(CONFIG_AV1_DECODER)
+      if(ENABLE_EXAMPLES)
+        list(APPEND AOM_INSTALL_BINS aomdec)
+      endif()
+    endif()
+
+    if(CONFIG_AV1_ENCODER)
+      if(ENABLE_EXAMPLES)
+        list(APPEND AOM_INSTALL_BINS aomenc)
+      endif()
+    endif()
+
+    set(AOM_INSTALL_LIBS aom)
+
+    # Setup the install rules.
+    install(FILES ${AOM_INSTALL_INCS} DESTINATION
+                  "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/aom")
+    install(FILES "${AOM_PKG_CONFIG_FILE}" DESTINATION
+                  "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+    install(TARGETS ${AOM_INSTALL_LIBS} DESTINATION
+                    "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
+
+    if(ENABLE_EXAMPLES)
+      install(TARGETS ${AOM_INSTALL_BINS} DESTINATION
+                      "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}")
+    endif()
+  endif()
+endmacro()
diff --git a/build/cmake/pkg_config.cmake b/build/cmake/pkg_config.cmake
index f370d85..358c1a2 100644
--- a/build/cmake/pkg_config.cmake
+++ b/build/cmake/pkg_config.cmake
@@ -42,22 +42,21 @@
 string(TOLOWER ${CMAKE_PROJECT_NAME} pkg_name)
 file(WRITE "${pkgconfig_file}" "# libaom pkg-config.\n")
 file(APPEND "${pkgconfig_file}" "prefix=${prefix}\n")
-file(APPEND "${pkgconfig_file}" "exec_prefix=\${prefix}/${bindir}\n")
-file(APPEND "${pkgconfig_file}" "libdir=\${prefix}/${libdir}\n")
-file(APPEND "${pkgconfig_file}" "includedir=\${prefix}/${includedir}\n\n")
+file(APPEND "${pkgconfig_file}" "exec_prefix=\${prefix}\n")
+file(APPEND "${pkgconfig_file}" "includedir=\${prefix}/${includedir}\n")
+file(APPEND "${pkgconfig_file}" "libdir=\${exec_prefix}/${libdir}\n\n")
 file(APPEND "${pkgconfig_file}" "Name: ${pkg_name}\n")
-file(APPEND "${pkgconfig_file}"
-            "Description: AV1 codec library v${aom_version}.\n")
+file(
+  APPEND
+    "${pkgconfig_file}"
+    "Description: Alliance for Open Media AV1 codec library v${aom_version}.\n")
 file(APPEND "${pkgconfig_file}" "Version: ${package_version}\n")
 file(APPEND "${pkgconfig_file}" "Requires:\n")
 file(APPEND "${pkgconfig_file}" "Conflicts:\n")
+file(APPEND "${pkgconfig_file}" "Libs: -L\${libdir} -l${pkg_name}\n")
 if(CONFIG_MULTITHREAD AND HAVE_PTHREAD_H)
-  file(APPEND "${pkgconfig_file}"
-              "Libs: -L\${prefix}/${libdir} -l${pkg_name} -lm -lpthread\n")
   file(APPEND "${pkgconfig_file}" "Libs.private: -lm -lpthread\n")
 else()
-  file(APPEND "${pkgconfig_file}"
-              "Libs: -L\${prefix}/${libdir} -l${pkg_name} -lm\n")
   file(APPEND "${pkgconfig_file}" "Libs.private: -lm\n")
 endif()
-file(APPEND "${pkgconfig_file}" "Cflags: -I\${prefix}/${includedir}\n")
+file(APPEND "${pkgconfig_file}" "Cflags: -I\${includedir}\n")