//
// aegis - project change supervisor
// Copyright (C) 2004-2006, 2008, 2012 Peter Miller
// Copyright (C) 2007, 2008 Walter Franzini
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, see .
//
#include
#include
process_tail::~process_tail()
{
}
process_tail::process_tail(printer &arg) :
process(arg)
{
dir_st.set_reaper();
clean_files.push_back("core");
clean_files.push_back("bin/fmtgen$(EXEEXT)");
clean_files.push_back("libaegis/libaegis.$(LIBEXT)");
clean_files.push_back("common/common.$(LIBEXT)");
clean_files.push_back(".bin");
clean_files.push_back(".bindir");
clean_files.push_back(".po_files");
clean_files.push_back(".man1dir");
clean_files.push_back(".man3dir");
clean_files.push_back(".man5dir");
clean_files.push_back(".comdir");
common_files = new nstring_list;
dir_st.assign("common", common_files);
libaegis_files = new nstring_list;
dir_st.assign("libaegis", libaegis_files);
datadir_files.push_back(
"$(DESTDIR)$(sysconfdir)/profile.d/aegis.sh");
datadir_files.push_back(
"$(DESTDIR)$(sysconfdir)/profile.d/aegis.csh");
}
static nstring
dirname(const nstring &s)
{
const char *cp = s.c_str();
const char *ep = strrchr(cp, '/');
if (!ep)
return ".";
return nstring(cp, ep - cp);
}
//
// Create directories and any necessary parent directories.
//
void
process_tail::recursive_mkdir(const nstring &src_dir_arg,
const nstring &dst_dir_arg, const nstring &dir_suffix)
{
nstring src_dir(src_dir_arg);
nstring dst_dir(dst_dir_arg);
static int defined;
static symtab dir_exists;
for (;;)
{
nstring dirvar = "mkdir." + src_dir + "." + dir_suffix;
nstring dotdot = dirname(src_dir);
if (!dir_exists.query(dirvar))
{
dir_exists.assign(dirvar, &defined);
print << "\n";
if (dotdot != ".")
{
print << src_dir << "/.mkdir." << dir_suffix << ": "
<< dotdot << "/.mkdir." << dir_suffix << "\n";
}
else
{
print << src_dir << "/.mkdir." << dir_suffix << ":\n";
}
print << "\t-$(INSTALL) -m 0755 -d " << dst_dir << "\n";
print << "\t-@touch $@\n";
print << "\t@sleep 1\n";
clean_files.push_back(src_dir + "/.mkdir." + dir_suffix);
}
src_dir = dotdot;
if (src_dir == ".")
break;
dst_dir = dirname(dst_dir);
}
}
void
process_tail::per_file(const nstring &filename)
{
nstring file(filename);
if (!file.starts_with("script/") && file.ends_with(".in"))
{
file = nstring(file.c_str(), file.size() - 3);
clean_files.push_back_unique(file);
}
else if (file.starts_with("script/"))
{
if (file.ends_with(".in"))
{
nstring name = nstring(file.c_str(), file.size() - 3);
clean_files.push_back_unique(name);
}
nstring name = file.trim_extension().basename();
if (name != "aegis.synpic" && name != "ae-symlinks")
{
commands_bin.push_back("bin/" + name + "$(EXEEXT)");
clean_files.push_back("bin/" + name + "$(EXEEXT)");
if (!name.starts_with("test_"))
{
nstring install_name = "$(DESTDIR)$(bindir)/"
"$(PROGRAM_PREFIX)" + name + "$(PROGRAM_SUFFIX)$(EXEEXT)";
commands_install.push_back(install_name);
}
}
}
else if (file.ends_with("/main.cc"))
{
nstring name(file.field('/', 0));
commands.push_back(name);
commands_bin.push_back("bin/" + name + "$(EXEEXT)");
if
(
name != "aefp"
&&
name != "fmtgen"
&&
name != "aemakefile"
&&
!name.starts_with("test_")
)
{
commands_install.push_back(
"$(DESTDIR)$(bindir)/$(PROGRAM_PREFIX)" + name +
"$(PROGRAM_SUFFIX)$(EXEEXT)");
}
}
if (file.ends_with(".cc"))
{
nstring dir(file.field('/', 0));
nstring_list *dir_p = dir_st.query(dir);
if (!dir_p)
{
dir_p = new nstring_list;
dir_st.assign(dir, dir_p);
}
nstring stem(file.c_str(), file.size() - 3);
nstring obj(stem + ".$(OBJEXT)");
dir_p->push_back(obj);
clean_files.push_back(obj);
}
else if (file.ends_with(".def"))
{
nstring dir(file.field('/', 0));
nstring_list *dir_p = dir_st.query(dir);
if (!dir_p)
{
dir_p = new nstring_list;
dir_st.assign(dir, dir_p);
}
nstring stem(file.c_str(), file.size() - 4);
nstring obj(stem + ".$(OBJEXT)");
dir_p->push_back(obj);
clean_files.push_back(obj);
clean_files.push_back(stem + ".cc");
clean_files.push_back(stem + ".h");
}
else if (file.ends_with(".y"))
{
nstring dir(file.field('/', 0));
nstring_list *dir_p = dir_st.query(dir);
if (!dir_p)
{
dir_p = new nstring_list;
dir_st.assign(dir, dir_p);
}
nstring stem(file.c_str(), file.size() - 2);
nstring obj(stem + ".yacc.$(OBJEXT)");
dir_p->push_back(obj);
clean_files.push_back(stem + ".yacc.cc");
clean_files.push_back(stem + ".yacc.h");
clean_files.push_back(obj);
}
else if (file.starts_with("lib/") && file.ends_with("/libaegis.po"))
{
// obsolete
}
else if (file.starts_with("lib/") && file.ends_with(".po"))
{
nstring stem = nstring(file.c_str() + 4, file.size() - 7);
nstring src("lib/" + stem + ".mo");
po_files.push_back(src);
clean_files.push_back(src);
nstring dst("$(DESTDIR)$(NLSDIR)/" + stem + ".mo");
install_po_files.push_back(dst);
recursive_mkdir(dirname(src), dirname(dst), "libdir");
}
else if (file.gmatch("lib/*.so"))
{
// documentation include file
}
else if (file.gmatch("lib/*.bib"))
{
// documentation include file
}
else if (file.gmatch("lib/icon2/*.uue"))
{
nstring stem(file.c_str() + 10, file.size() - 14);
nstring tmp = "lib/icon/" + stem;
nstring dst = "$(DESTDIR)$(datadir)/icon/" + stem;
datadir_files.push_back(dst);
recursive_mkdir(dirname(tmp), dirname(dst), "datadir");
clean_files.push_back(tmp);
}
else if (file.gmatch("lib/icon/*.uue"))
{
nstring stem(file.c_str() + 9, file.size() - 13);
nstring dst = "$(DESTDIR)$(datadir)/icon/" + stem;
datadir_files.push_back(dst);
recursive_mkdir(dirname(file), dirname(dst), "datadir");
clean_files.push_back("lib/icon/" + stem);
}
else if (file.gmatch("lib/*.uue"))
{
// do nothing
}
else if (file.gmatch("lib/*/man[1-9]/*.[1-9]"))
{
nstring stem = nstring(file.c_str() + 4, file.size() - 4);
install_doc_files.push_back("$(DESTDIR)$(datadir)/" + stem);
nstring src(file);
nstring dst("$(DESTDIR)$(datadir)/" + stem);
recursive_mkdir(dirname(src), dirname(dst), "datadir");
if (file.gmatch("lib/en/*"))
{
nstring part = nstring(file.c_str() + 7, file.size() - 7);
man_files.push_back("$(DESTDIR)$(mandir)/" + part);
}
}
else if (file.gmatch("lib/*/*/main.*"))
{
nstring stem = file.field('/', 1) + "/" + file.field('/', 2);
ps_doc_files.push_back("lib/" + stem + ".ps");
dvi_doc_files.push_back("lib/" + stem + ".dvi");
txt_doc_files.push_back("lib/" + stem + ".txt");
clean_files.push_back("lib/" + stem + ".ps");
clean_files.push_back("lib/" + stem + ".dvi");
clean_files.push_back("lib/" + stem + ".txt");
install_doc_files.push_back("$(DESTDIR)$(datadir)/" + stem
+ ".ps");
install_doc_files.push_back("$(DESTDIR)$(datadir)/" + stem
+ ".txt");
nstring src("lib/" + stem + ".ps");
nstring dst("$(DESTDIR)$(datadir)/" + stem + ".ps");
recursive_mkdir(dirname(src), dirname(dst), "datadir");
}
else if (file.starts_with("lib/"))
{
nstring rest(file.c_str() + 4, file.size() - 4);
nstring dst("$(DESTDIR)$(datadir)/" + rest);
datadir_files.push_back(dst);
recursive_mkdir(dirname(file), dirname(dst), "datadir");
}
else if (file.gmatch("test/*/*.sh"))
{
nstring stem(file.c_str(), file.size() - 3);
test_files.push_back(stem + ".ES");
clean_files.push_back(stem + ".ES");
}
}
void
process_tail::postlude()
{
commands_bin.sort();
print << "\n";
print << "all-bin: " << commands_bin << "\n";
for (size_t j = 0; j < commands.size(); ++j)
{
nstring name(commands[j]);
nstring_list *dir_p = dir_st.query(name);
if (!dir_p)
continue;
print << "\n";
print << name << "_files = " << *dir_p << "\n";
print << "\n";
if
(
name == "aemakefile"
||
name == "aemeasure"
||
name == "fmtgen"
)
{
print << "bin/" << name << "$(EXEEXT): $(" << name
<< "_files) common/common.$(LIBEXT) .bin\n"
<< "\t@sleep 1\n"
<< "\t$(CXX) $(LDFLAGS) -o $@ $(" << name
<< "_files) common/common.$(LIBEXT) $(LIBS)\n"
<< "\t@sleep 1\n";
}
else
{
print << "bin/" << name << "$(EXEEXT): $(" << name
<< "_files) libaegis/libaegis.$(LIBEXT) .bin\n";
print << "\t@sleep 1\n";
print << "\t$(CXX) $(LDFLAGS) -o $@ $(" << name
<< "_files) libaegis/libaegis.$(LIBEXT) $(LIBS)\n";
if (name == "aegis" || name == "aeimport" || name == "aelock")
print << "\t-chown root $@ && chmod 4755 $@\n";
print << "\t@sleep 1\n";
}
print << "\n";
print << "$(DESTDIR)$(bindir)/$(PROGRAM_PREFIX)" << name
<< "$(PROGRAM_SUFFIX)$(EXEEXT): bin/" << name
<< "$(EXEEXT) .bindir\n";
print << "\t$(INSTALL_PROGRAM) bin/" << name << "$(EXEEXT) $@\n";
if (name == "aegis" || name == "aeimport" || name == "aelock")
print << "\t-chown root $@ && chmod 4755 $@\n";
}
print << "\nCommonFiles = " << *common_files << "\n";
print << "\nlibaegis_obj = " << *libaegis_files << " " << *common_files
<< "\n";
print << "\nLibFiles = " << libdir_files << "\n";
print << "\nDataFiles = " << datadir_files << "\n";
print << "\ninstall-man-yes: " << man_files << "\n";
print << "\n"
"uninstall-man:\n"
"\trm -f " << man_files << "\n";
print << "\ninstall-man-no:\n";
print << "\npo_files_yes: " << po_files << "\n";
print << "\npo_files_no:\n";
print << "\ninstall-po-yes: " << install_po_files << "\n";
print << "\n"
"uninstall-po:\n"
"\trm -f " << install_po_files << "\n";
print << "\ninstall-po-no:\n";
print << "\ndvi-doc-files: " << dvi_doc_files << "\n";
print << "\ndoc_files_yes: " << ps_doc_files << " " << txt_doc_files
<< "\n";
print << "\ndoc_files_no:\n";
print << "\ninstall-doc-yes: " << install_doc_files << "\n";
print << "\n"
"uninstall-doc:\n"
"\trm -f " << install_doc_files << "\n";
print << "\ninstall-doc-no:\n";
print << "\nTestFiles = " << test_files << "\n";
//
// clean up the area
// (make sure command lines do not get too long)
//
print << "\nclean-obj:\n";
clean_files.sort();
for (size_t m = 0; m < clean_files.size(); ++m)
print << "\trm -f " << clean_files[m] << "\n";
print << "\nclean: clean-obj\n";
print << "\trm -f " << commands_bin << "\n";
commands_install.sort();
print << "\ninstall-bin: " << commands_install << "\n";
print << "\n"
"uninstall-bin:\n"
"\trm -f " << commands_install << "\n";
print << "\n"
".bindir:\n"
"\t-$(INSTALL) -m 0755 -d $(DESTDIR)$(bindir)\n"
"\t-@touch $@\n"
"\t@sleep 1\n"
"\n"
".man1dir:\n"
"\t-$(INSTALL) -m 0755 -d $(DESTDIR)$(mandir)/man1\n"
"\t-@touch $@\n"
"\t@sleep 1\n"
"\n"
".man3dir:\n"
"\t-$(INSTALL) -m 0755 -d $(DESTDIR)$(mandir)/man3\n"
"\t-@touch $@\n"
"\t@sleep 1\n"
"\n"
".man5dir:\n"
"\t-$(INSTALL) -m 0755 -d $(DESTDIR)$(mandir)/man5\n"
"\t-@touch $@\n"
"\t@sleep 1\n"
"\n"
".comdir:\n"
"\t-$(INSTALL) -m 0755 -d $(DESTDIR)$(comdir)\n"
"\t-chown $(AEGIS_UID) $(DESTDIR)$(comdir) && "
"chgrp $(AEGIS_GID) $(DESTDIR)$(comdir)\n"
"\t$(SH) etc/compat.2.3\n"
"\t-@touch $@\n"
"\t@sleep 1\n"
"\n"
".po_files: po_files_$(HAVE_MSGFMT)\n"
"\t@touch $@\n"
"\n"
".doc_files: doc_files_$(HAVE_GROFF)\n"
"\t@touch $@\n"
"\n"
"distclean: clean\n"
"\trm -f config.status config.log config.cache\n"
"\trm -f Makefile common/config.h etc/howto.conf\n"
"\trm -f lib/cshrc lib/profile etc/libdir.so\n"
"\n"
".bin:\n"
"\t-mkdir bin\n"
"\t-@touch $@\n"
"\n"
"common/common.$(LIBEXT): $(CommonFiles)\n"
"\trm -f $@\n"
"\t$(AR) qc $@ $(CommonFiles)\n"
"\t$(RANLIB) $@\n"
"\n"
"libaegis/libaegis.$(LIBEXT): $(libaegis_obj)\n"
"\trm -f $@\n"
"\t$(AR) qc $@ $(libaegis_obj)\n"
"\t$(RANLIB) $@\n"
"\n"
"sure: $(TestFiles) etc/test.sh\n"
"\t@$(SH) etc/test.sh -summary $(TestFiles)\n"
"\n"
"#\n"
"# This target is used when preparing for the second\n"
"# pass of testing, when aegis is set-uid-root.\n"
"#\n"
"install-libdir: lib/.mkdir.datadir lib/.mkdir.libdir .comdir "
"install-po\n"
"\t-chown root bin/aegis$(EXEEXT) "
"&& chmod 4755 bin/aegis$(EXEEXT)\n"
"\t-chown root bin/aeimport$(EXEEXT) "
"&& chmod 4755 bin/aeimport$(EXEEXT)\n"
"\n"
"install-lib: $(LibFiles) $(DataFiles) .comdir\n"
"\n"
"uninstall-lib:\n"
"\trm -f $(LibFiles) $(DataFiles)\n"
"\n"
"install-po: install-po-$(HAVE_MSGFMT)\n"
"\n"
"install-man: install-man-$(HAVE_GROFF)\n"
"\n"
"install-doc: install-doc-$(HAVE_GROFF)\n"
"\n"
"install: install-bin install-lib install-po install-man install-doc\n"
"\n"
"uninstall: uninstall-bin uninstall-lib uninstall-po uninstall-man "
"uninstall-doc\n";
}
// vim: set ts=8 sw=4 et :