我用C ++编写了一个程序,但现在我必须用autoconf和automake安装这个程序。
因此,当我运行命令“./configure&& make&& make install”时,它必须执行以下操作:
我写过这个configure.ac脚本:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([my_program], [0.1], [my_mail])
AC_CONFIG_SRCDIR([AbsAlgorithm.hpp])
AM_INIT_AUTOMAKE
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([stdlib.h string.h sys/time.h unistd.h wchar.h wctype.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_SIZE_T
# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_MKTIME
AC_CHECK_FUNCS([gettimeofday memset mkdir])
LIBS="-ldl"
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
和这个Makefile.am脚本:
AUTOMAKE_OPTIONS = foreign
AM_CXXFLAGS=-Wall -std=gnu++11 -DVERSION=\"$(VERSION)\" -DPROG="\"$(PACKAGE)\""
bin_PROGRAMS = algatorc
noinst_LIBRARIES = libalgatorc.a
libalgatorc_a_SOURCES = Timer.cpp
include_HEADERS = Timer.hpp TestSetIterator.hpp TestCase.hpp ETestSet.hpp EParameter.hpp Entity.hpp ParameterSet.hpp AbsAlgorithm.hpp Log.hpp JSON.hpp
algatorc_SOURCES = ParameterSet.cpp TestCase.cpp EParameter.cpp ETestSet.cpp TestSetIterator.cpp Entity.cpp Timer.cpp main.cpp JSON.cpp JSONValue.cpp
现在,当我运行“./configure&& make&& make install”时,我没有在/ opt中获得名为my_program的新文件夹。但是,我现在,我在/ usr / local / include中有头文件。我在/ usr / local / lib中没有lib文件。 python只有一个文件夹。我想有一个名为my_program的文件夹,在该文件夹中我希望有静态库。
我正在使用Ubuntu 12.04 x64
我将不胜感激任何帮助。谢谢
答案 0 :(得分:0)
Autotools并非真正用于将物品放置在特定位置。想法是程序进入程序目录 $(bindir)
, libraries目录 $(libdir)
中的库等,并且安装所有内容的人都可以自行决定那些地方在哪里。
所以你真的应该只关心安装相对于运行安装程序的人想要的东西。
他们通过向configure
脚本添加参数来执行此操作,如:
configure --prefix=/opt/myprog
通常会安装/opt/myprog/bin
中的程序和/opt/myprog/lib
等中的库...
您可以通过设置特殊dir
变量来添加安装内容的位置。例如,要将库放在$(libdir)
(默认/ usr / local / lib)的子目录中,您可以执行以下操作:
myprog_librarydir = $(libdir)/myprog
对于头文件执行相同的操作并不罕见:
myprog_includedir = $(prefix)/include/myprog
它定义了一些您可以引用的目标文件夹,而不是默认值:
myprog_include_HEADERS = \
Timer.hpp \
TestSetIterator.hpp \
TestCase.hpp \
ETestSet.hpp \
EParameter.hpp \
Entity.hpp \
ParameterSet.hpp \
AbsAlgorithm.hpp \
Log.hpp \
JSON.hpp
现在将这些安装到$(prefix)/include/myprog
。
与相应的库类似:
myprog_library_LIBRARIES = libmyprog.a
libmyprog_a_SOURCES = \
ParameterSet.cpp \
TestCase.cpp \
EParameter.cpp \
ETestSet.cpp \
TestSetIterator.cpp \
Entity.cpp \
Timer.cpp \
JSON.cpp \
JSONValue.cpp
所以基本上你使用:
创建目的地(安装)目录mynamedir = $(prefix)/path/... whatever
这允许您设置bin_
,lib_
和include_
等以外的目的地...
所以,不要说lib_LIBRARIES
,而是说myname_LIBRARIES
。
希望有所帮助。