【问题标题】:How autoconf generate the "make install" actionautoconf 如何生成“make install”操作
【发布时间】:2016-02-14 09:58:16
【问题描述】:

我正在尝试更改开源json-cmake install 操作。

我尝试检查configure.acmakefile.am。但我不清楚这些文件如何构建 make install 操作。

configuer.acmakefile.am 之后

configure.ac

AC_PREREQ(2.52)

# Process this file with autoconf to produce a configure script.
AC_INIT([json-c], 0.12.99, [json-c@googlegroups.com])

AM_INIT_AUTOMAKE

AC_PROG_MAKE_SET

AC_ARG_ENABLE(rdrand,
 AS_HELP_STRING([--enable-rdrand],
   [Enable RDRAND Hardware RNG Hash Seed generation on supported x86/x64 platforms.]),
[if test x$enableval = xyes; then
  enable_rdrand=yes
  AC_DEFINE(ENABLE_RDRAND, 1, [Enable RDRANR Hardware RNG Hash Seed])
fi])

if test "x$enable_rdrand" = "xyes"; then
  AC_MSG_RESULT([RDRAND Hardware RNG Hash Seed enabled on supported x86/x64 platforms])
else
  AC_MSG_RESULT([RDRAND Hardware RNG Hash Seed disabled. Use --enable-rdrand to enable])
fi

# enable silent build by default
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])

# Checks for programs.

# Checks for libraries.

# Checks for header files.
AM_PROG_CC_C_O
AC_CONFIG_HEADER(config.h)
AC_CONFIG_HEADER(json_config.h)
AC_HEADER_STDC
AC_CHECK_HEADERS(fcntl.h limits.h strings.h syslog.h unistd.h [sys/cdefs.h] [sys/param.h] stdarg.h locale.h endian.h)
AC_CHECK_HEADER(inttypes.h,[AC_DEFINE([JSON_C_HAVE_INTTYPES_H],[1],[Public define for json_inttypes.h])])

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T

# Checks for library functions.
AC_FUNC_VPRINTF
AC_FUNC_MEMCMP
AC_FUNC_REALLOC
AC_CHECK_FUNCS(strcasecmp strdup strerror snprintf vsnprintf vasprintf open vsyslog strncasecmp setlocale)
AC_CHECK_DECLS([INFINITY], [], [], [[#include <math.h>]])
AC_CHECK_DECLS([nan], [], [], [[#include <math.h>]])
AC_CHECK_DECLS([isnan], [], [], [[#include <math.h>]])
AC_CHECK_DECLS([isinf], [], [], [[#include <math.h>]])
AC_CHECK_DECLS([_isnan], [], [], [[#include <float.h>]])
AC_CHECK_DECLS([_finite], [], [], [[#include <float.h>]])

if test "$ac_cv_have_decl_isnan" = "yes" ; then
   AC_TRY_LINK([#include <math.h>], [float f = 0.0; return isnan(f)], [], [LIBS="$LIBS -lm"])
fi

#check if .section.gnu.warning accepts long strings (for __warn_references)
AC_LANG_PUSH([C])

AC_MSG_CHECKING([if .gnu.warning accepts long strings])
AC_LINK_IFELSE([AC_LANG_SOURCE([[
extern void json_object_get();
__asm__(".section .gnu.json_object_get,\n\t.ascii \"Please link against libjson-c instead of libjson\"\n\t.text");

int main(int c,char* v) {return 0;}
]])], [
    AC_DEFINE(HAS_GNU_WARNING_LONG, 1, [Define if .gnu.warning accepts long strings.])
    AC_MSG_RESULT(yes)
], [
   AC_MSG_RESULT(no)
])

AC_LANG_POP([C])

AM_PROG_LIBTOOL

# Check for the -Bsymbolic-functions linker flag
AC_ARG_ENABLE([Bsymbolic],
              [AS_HELP_STRING([--disable-Bsymbolic], [Avoid linking with -Bsymbolic-function])],
              [],
              [enable_Bsymbolic=check])

AS_IF([test "x$enable_Bsymbolic" = "xcheck"],
      [
        saved_LDFLAGS="${LDFLAGS}"
        AC_MSG_CHECKING([for -Bsymbolic-functions linker flag])
        LDFLAGS=-Wl,-Bsymbolic-functions
        AC_TRY_LINK([], [int main (void) { return 0; }],
                    [
                      AC_MSG_RESULT([yes])
                      enable_Bsymbolic=yes
                    ],
                    [
                      AC_MSG_RESULT([no])
                      enable_Bsymbolic=no
                    ])
        LDFLAGS="${saved_LDFLAGS}"
      ])

AS_IF([test "x$enable_Bsymbolic" = "xyes"], [JSON_BSYMBOLIC_LDFLAGS=-Wl[,]-Bsymbolic-functions])
AC_SUBST(JSON_BSYMBOLIC_LDFLAGS)

AX_APPEND_COMPILE_FLAGS([-Wall -Werror -Wno-error=deprecated-declarations])
AX_APPEND_COMPILE_FLAGS([-Wextra -Wwrite-string -Wno-unused-parameter])
AX_APPEND_COMPILE_FLAGS([-std=gnu99])
AX_APPEND_COMPILE_FLAGS([-D_GNU_SOURCE -D_REENTRANT])

AC_CONFIG_FILES([
Makefile
json-c.pc
tests/Makefile
json-c-uninstalled.pc
])

AC_OUTPUT

ma​​kefile.am

EXTRA_DIST = README.html README-WIN32.html config.h.win32 doc json-c.vcproj
SUBDIRS = . tests

lib_LTLIBRARIES = libjson-c.la 

pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = json-c.pc

libjson_cincludedir = $(includedir)/json-c
libjson_cinclude_HEADERS = \
    arraylist.h \
    bits.h \
    debug.h \
    json.h \
    json_config.h \
    json_c_version.h \
    json_inttypes.h \
    json_object.h \
    json_object_iterator.h \
    json_object_private.h \
    json_tokener.h \
    json_util.h \
    linkhash.h \
    printbuf.h \
    random_seed.h

#libjsonx_includedir = $(libdir)/json-c-@VERSION@
#
#libjsonx_include_HEADERS = \
#   json_config.h

libjson_c_la_LDFLAGS = -version-info 3:0:0 -no-undefined @JSON_BSYMBOLIC_LDFLAGS@

libjson_c_la_SOURCES = \
    arraylist.c \
    debug.c \
    json_c_version.c \
    json_object.c \
    json_object_iterator.c \
    json_tokener.c \
    json_util.c \
    linkhash.c \
    printbuf.c \
    random_seed.c


distclean-local:
    -rm -rf $(testsubdir)
    -rm -rf config.h.in~ Makefile.in aclocal.m4 autom4te.cache/ config.guess config.sub depcomp install-sh ltmain.sh missing
    -rm -f INSTALL test-driver tests/Makefile.in compile

maintainer-clean-local:
    -rm -rf configure

uninstall-local:
    rm -rf "$(DESTDIR)@includedir@/json-c"
    rm -f "$(DESTDIR)@includedir@/json"

ANDROID_CFLAGS = -I$(top_srcdir) -DHAVE_CONFIG_H

Android.mk: Makefile.am
    androgenizer -:PROJECT json-c \
        -:SHARED libjson-c \
        -:TAGS eng debug \
        -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
        -:SOURCES $(libjson_c_la_SOURCES) $(nodist_libjson_c_la_SOURCES) \
        -:CFLAGS $(DEFS) $(ANDROID_CFLAGS) $(libjson_c_la_CFLAGS) \
        -:LDFLAGS $(libjson_c_la_LDFLAGS) $(libjson_c_la_LIBADD) \
        -:HEADER_TARGET json-c \
        -:HEADERS $(libjson_cinclude_HEADERS) \
        -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
    > $@

你能帮我指出构建 make install 的部分吗

【问题讨论】:

  • 对于任何关注 c 或 json 标签的人来说,这里没有什么有趣的,所以他们不应该在这里。 autoconf 与 automake 相结合,这实际上就是生成 Makefile 的原因。我强烈建议阅读它的文档和/或基本教程。
  • 您尝试以什么方式修改安装命令? automake 提供了各种钩子,允许您自定义“make install”的工作方式,并且您尝试完成的任何事情都可能在标准框架内完成。

标签: makefile autoconf automake


【解决方案1】:

Automake 决定如何安装的主要方式是通过“primaries”的前缀。

在你上面的例子中,这些是lib_LTLIBRARIES,意思是“库安装在libdir”;和pkgconfig_DATA,表示“安装在pkgconfigdir 中的数据文件”——而pkgconfigdir 本身在Makefile.am 中定义。 (第二个展示了如何扩展这些前缀列表。)

你也可以通过编写显式规则来安装东西,虽然上面的方法确实是优越的——安装规则有一些微妙之处,比如DESTDIR支持,手写规则经常出错。

值得一提的是,Automake 手册中有一整章介绍了 install 过程。我建议至少浏览整个手册。

【讨论】:

    猜你喜欢
    • 2015-01-31
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多