// // aegis - project change supervisor // Copyright (C) 2006-2008 Peter Miller // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License, // version 3, as published by the Free Software Foundation. // // 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 #include #include // for assert #include #include #include target_makefile::~target_makefile() { } target_makefile::target_makefile() : seen_c(false), seen_c_plus_plus(false), have_groff(false), have_soelim(false), objext("o"), libext("a"), seen_datadir(false), seen_libdir(false), seen_yacc(false), install_script(false) { } void target_makefile::preprocess(const nstring &filename) { if (filename.starts_with("datadir/")) seen_datadir = true; if (filename.starts_with("libdir/")) seen_libdir = true; if (filename.ends_with(".y")) seen_yacc = true; if (filename.starts_with("script/") || filename.starts_with("scripts/")) install_script = true; if ( memcmp(filename.c_str(), "configure", 9) == 0 || memmem(filename.c_str(), filename.size(), "/configure", 10) ) { process_configure_dot_ac(filename); } if ( filename.downcase().ends_with(".cc") || filename.downcase().ends_with(".cxx") || filename.ends_with(".C") ) { seen_c_plus_plus = true; } else if (filename.ends_with(".c")) { seen_c = true; } } void target_makefile::begin() { printf("#\n"); printf("# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); printf("#\n"); printf("# W W A RRRR N N III N N III N N GGG\n"); printf("# W W A A R R NN N I NN N I NN N G G\n"); printf("# W W A A RRRR N N N I N N N I N N N G\n"); printf("# W W W AAAAA R R N NN I N NN I N NN G GG\n"); printf("# W W W A A R R N N I N N I N N G G\n"); printf("# W W A A R R N N III N N III N N GGG\n"); printf("#\n"); printf("# Warning: DO NOT send patches which fix this file.\n"); printf("# IT IS NOT the original source file. This file is\n"); printf("# GENERATED. If you find a bug in this file, please\n"); printf("# send me a patch for the the problem source file.\n"); printf("#\n"); printf("# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); printf("#\n"); printf("# @configure_input@\n"); printf("#\n"); printf("# The configure script generates 2 files:\n"); printf("#\t1. This Makefile\n"); printf("#\t2. lib/config.h\n"); printf("# If you change this Makefile, you may also need to\n"); printf("# change these files. To see what is configured by the\n"); printf("# configure script, search for @ in the Makefile.in\n"); printf("# file.\n"); printf("#\n"); printf("# If you wish to reconfigure the installation\n"); printf("# directories it is RECOMMENDED that you re-run the\n"); printf("# configure script.\n"); printf("#\n"); printf("# Use ``./configure --help'' for a list of options.\n"); printf("#\n"); printf("\n"); printf("#\n"); printf("# directory containing the source\n"); printf("#\n"); printf("srcdir = @srcdir@\n"); printf("VPATH = @srcdir@\n"); printf("\n"); printf("#\n"); printf("# the name of the install program to use\n"); printf("#\n"); printf("INSTALL = @INSTALL@\n"); printf("INSTALL_PROGRAM = @INSTALL_PROGRAM@\n"); printf("INSTALL_DATA = @INSTALL_DATA@\n"); if (install_script) printf("INSTALL_SCRIPT = @INSTALL_SCRIPT@\n"); printf("\n"); printf("#\n"); printf("# the name of the compiler to use\n"); printf("#\n"); if (seen_c_plus_plus) printf("CXX = @CXX@\n"); if (seen_c) printf("CC = @CC@\n"); printf("\n"); printf("#\n"); printf("# The compiler flags to use\n"); printf("#\n"); if (seen_c_plus_plus) printf("CXXFLAGS = @CXXFLAGS@\n"); if (seen_c) printf("CFLAGS = @CFLAGS@\n"); printf("\n"); printf("#\n"); printf("# The preprocessor flags to use\n"); printf("#\n"); printf("CPPFLAGS = @CPPFLAGS@\n"); printf("\n"); printf("#\n"); printf("# The linker flags to use\n"); printf("#\n"); printf("LDFLAGS = @LDFLAGS@\n"); printf("\n"); printf("#\n"); printf("# prefix for installation path\n"); printf("#\n"); printf("prefix = @prefix@\n"); printf("exec_prefix = @exec_prefix@\n"); printf("\n"); printf("#\n"); printf("# where to put the executables\n"); printf("#\n"); printf("# On a network, this would only be shared between machines\n"); printf("# of identical cpu-hw-os flavour. It can be read-only.\n"); printf("#\n"); printf("# The $(DESTDIR) is for Debian packaging.\n"); printf("# The $(RPM_BUILD_ROOT) is for RPM packaging.\n"); printf("#\n"); printf("bindir = $(DESTDIR)$(RPM_BUILD_ROOT)@bindir@\n"); printf("\n"); printf("#\n"); printf("# where to put the manuals\n"); printf("#\n"); printf("# On a network, this would be shared between all machines\n"); printf("# on the network. It can be read-only.\n"); printf("#\n"); printf("# The $(DESTDIR) is for Debian packaging.\n"); printf("# The $(RPM_BUILD_ROOT) is for RPM packaging.\n"); printf("#\n"); printf("mandir = $(DESTDIR)$(RPM_BUILD_ROOT)@mandir@\n"); if (seen_datadir) { printf("\n"); printf("#\n"); printf("# where to put the non-executable package data\n"); printf("#\n"); printf("# On a network, this would be shared between all\n"); printf("# machines on the network. It can be read-only.\n"); printf("#\n"); printf("# The $(DESTDIR) is for Debian packaging.\n"); printf("# The $(RPM_BUILD_ROOT) is for RPM packaging.\n"); printf("#\n"); printf("DATADIR = $(DESTDIR)$(RPM_BUILD_ROOT)@datadir@\n"); printf("DATAROOTDIR = $(DESTDIR)$(RPM_BUILD_ROOT)@datarootdir@\n"); } if (seen_libdir) { printf("\n"); printf("#\n"); printf("# where to put the supplementary package executables\n"); printf("#\n"); printf("# On a network, this would be shared between all\n"); printf("# machines of identical architecture. It can be\n"); printf("# read-only.\n"); printf("#\n"); printf("# The $(DESTDIR) is for Debian packaging.\n"); printf("# The $(RPM_BUILD_ROOT) is for RPM packaging.\n"); printf("#\n"); printf("LIBDIR = $(DESTDIR)$(RPM_BUILD_ROOT)@libdir@\n"); } if (seen_yacc) { printf("\n"); printf("#\n"); printf("# Which yacc to use\n"); printf("#\n"); printf("YACC = @YACC@\n"); } printf("\n"); printf("#\n"); printf("# extra libraries required for your system\n"); printf("#\n"); printf("LIBS = @LIBS@\n"); printf("\n"); printf("#\n"); printf("# shell to use to run tests and commands\n"); printf("#\n"); printf("SH = @SH@\n"); printf("\n"); printf("#\n"); printf("# program used to place index within libraries\n"); printf("#\n"); printf("RANLIB = @RANLIB@\n"); printf("AR = ar\n"); if (objext != "o") { printf("\n"); printf("#\n"); printf("# object file name extension (typically \"o\" or \"obj\")\n"); printf("#\n"); printf("OBJEXT = @OBJEXT@\n"); } if (libext != "a") { printf("\n"); printf("#\n"); printf("# library file name extension (typically \"a\" or \"lib\")\n"); printf("#\n"); printf("LIBEXT = @LIBEXT@\n"); } if (!exeext.empty()) { printf("\n"); printf("#\n"); printf("# command file name extension (typically \"\" or \".exe\")\n"); printf("#\n"); printf("EXEEXT = @EXEEXT@\n"); } if (have_groff) { printf("\n"); printf("#\n"); printf("# Set GROFF to the name of the roff command on your\n"); printf("# system, usually \"groff\" or \"troff\" or \"nroff\"\n"); printf("#\n"); printf("GROFF = @GROFF@\n"); } if (have_soelim) { printf("\n"); printf("#\n"); printf("# Set SOELIM to the name of the roff proprocessor command\n"); printf("# on your system, usually \"soelim\" or \"gsoelim\"\n"); printf("#\n"); printf("SOELIM = @SOELIM@\n"); } printf("\n"); printf("# -------------------------------------------------------------\n"); printf("# You should not need to change anything below this line.\n"); printf("\n"); printf("#\n"); printf("# The default target\n"); printf("#\n"); printf("the-default-target: all\n"); clean_files.push_back("core"); clean_files.push_back("y.tab.c"); clean_files.push_back("y.tab.h"); clean_files.push_back("y.output"); clean_files.push_back(".bin"); clean_files.push_back(".bindir"); clean_files.push_back("lib/lib." + libext); dist_clean_files.push_back("Makefile"); dist_clean_files.push_back("config.cache"); dist_clean_files.push_back("config.log"); dist_clean_files.push_back("config.status"); dist_clean_files.push_back("lib/config.h"); } void target_makefile::recursive_mkdir(const nstring &a_src_dir, const nstring &a_dst_dir, const nstring &flavor) { nstring src_dir(a_src_dir); nstring dst_dir(a_dst_dir); for (;;) { nstring dotdot1 = os_dirname_relative(src_dir); nstring dotdot2 = os_dirname_relative(dst_dir); nstring key = src_dir + "/." + flavor; int *p = dir_table.query(key); if (!p) { dir_table.assign(key, 1); printf("\n"); if (dotdot1 != "." && dotdot2 != ".") { printf("%s/.%s: %s/.%s\n", src_dir.c_str(), flavor.c_str(), dotdot1.c_str(), flavor.c_str()); } else { printf("%s/.%s:\n", src_dir.c_str(), flavor.c_str()); } printf("\t-$(INSTALL) -m 0755 -d %s\n", dst_dir.c_str()); printf("\t@-test -d %s && touch $@\n", dst_dir.c_str()); printf("\t@sleep 1\n"); clean_files.push_back(key); } src_dir = dotdot1; dst_dir = dotdot2; if (src_dir == "." || dst_dir == ".") break; } } void target_makefile::remember_program(const nstring &name) { programs.push_back_unique(name); } void target_makefile::remember_object_file(const nstring &path) { assert(path.ends_with("." + objext)); nstring objdir = path.first_dirname(); nstring_list *obj_file_list = object_list.query(objdir); if (!obj_file_list) { obj_file_list = new nstring_list(); object_list.assign(objdir, obj_file_list); } obj_file_list->push_back(path); clean_files.push_back(path); } void target_makefile::process_configure_dot_ac(const nstring &fn) { nstring path = resolve(fn); FILE *fp = fopen(path.c_str(), "r"); if (!fp) return; for (;;) { char line[2000]; if (!fgets(line, sizeof(line), fp)) break; if (0 == memcmp(line, "AC_CHECK_PROGS(GROFF,", 21)) have_groff = true; if (0 == memcmp(line, "AC_CHECK_PROGS(SOELIM,", 21)) have_soelim = true; if (0 == memcmp(line, "AC_OBJEXT", 9)) objext = "$(OBJEXT)"; if (0 == memcmp(line, "AC_LIBEXT", 9)) libext = "$(LIBEXT)"; if (0 == memcmp(line, "AC_EXEEXT", 9)) exeext = "$(EXEEXT)"; } } void target_makefile::process(const nstring &a_fn, bool is_a_script) { nstring fn = a_fn; if (fn.ends_with(".in")) { nstring fn2 = nstring(fn.c_str(), fn.size() - 3); printf("\n"); printf("%s: %s ./config.status\n\t", fn2.c_str(), fn.c_str()); if (fn2.ends_with(".h")) { printf("CONFIG_FILES= CONFIG_HEADERS=$@:%s ", fn.c_str()); } else { printf("CONFIG_FILES=$@:%s CONFIG_HEADERS= ", fn.c_str()); } printf("$(SH) ./config.status\n"); fn = fn2; dist_clean_files.push_back_unique(fn); } if (fn.starts_with("datadir/")) { nstring src = fn; nstring stem = src.substring(8, src.size() - 8); nstring dst = "$(DATADIR)/" + stem; nstring src_dir = os_dirname_relative(src); nstring dst_dir = os_dirname_relative(dst); recursive_mkdir(src_dir, dst_dir, "datadir"); printf("\n"); printf("%s: %s %s/.datadir\n", dst.c_str(), src.c_str(), src_dir.c_str()); printf("\t$(INSTALL_DATA) %s $@\n", src.c_str()); install_datadir.push_back(dst); return; } if (fn.starts_with("libdir/")) { nstring src = fn; nstring stem = src.substring(7, src.size() - 7); nstring dst = "$(LIBDIR)/" + stem; nstring src_dir = os_dirname_relative(src); nstring dst_dir = os_dirname_relative(dst); recursive_mkdir(src_dir, dst_dir, "libdir"); printf("\n"); printf("%s: %s %s/.libdir\n", dst.c_str(), src.c_str(), src_dir.c_str()); printf("\t$(INSTALL_DATA) %s $@\n", src.c_str()); install_libdir.push_back(dst); return; } if (fn.gmatch("*/*.y")) { nstring base = os_basename(fn, ".y"); nstring stem = fn.substring(0, fn.size() - 2); clean_files.push_back(stem + ".yacc.c"); clean_files.push_back(stem + ".yacc.cc"); clean_files.push_back(stem + ".yacc.h"); nstring yy = base.identifier(); printf("\n"); if (seen_c_plus_plus) { printf("%s.yacc.cc %s.yacc.h: %s\n", stem.c_str(), stem.c_str(), fn.c_str()); printf("\t$(YACC) -d %s\n", fn.c_str()); printf("\tsed -e 's/[yY][yY]/%s_/g' y.tab.c > %s.yacc.cc\n", yy.c_str(), stem.c_str()); printf("\tsed -e 's/[yY][yY]/%s_/g' y.tab.h > %s.yacc.h\n", yy.c_str(), stem.c_str()); printf("\trm y.tab.c y.tab.h\n"); process(stem + ".yacc.cc", is_a_script); } else { printf("%s.yacc.c %s.yacc.h: %s\n", stem.c_str(), stem.c_str(), fn.c_str()); printf("\t$(YACC) -d %s\n", fn.c_str()); printf("\tsed -e 's/[yY][yY]/%s_/g' y.tab.c > %s.yacc.c\n", yy.c_str(), stem.c_str()); printf("\tsed -e 's/[yY][yY]/%s_/g' y.tab.h > %s.yacc.h\n", yy.c_str(), stem.c_str()); printf("\trm y.tab.c y.tab.h\n"); process(stem + ".yacc.c", is_a_script); } } else if (fn.gmatch("*/*.l")) { nstring stem = fn.substring(0, fn.size() - 2); clean_files.push_back(stem + ".lex.c"); clean_files.push_back(stem + ".lex.cc"); nstring yy = os_basename(stem).identifier(); printf("\n"); if (seen_c_plus_plus) { printf("%s.lex.cc: %s\n", stem.c_str(), fn.c_str()); printf("\t$(LEX) $(LEXFLAGS) %s\n", fn.c_str()); printf("\tsed -e 's|[yY][yY]|%s_|g' lex.yy.c > %s.lex.cc\n", yy.c_str(), stem.c_str()); printf("\trm lex.yy.c\n"); process(stem + ".lex.cc", is_a_script); } else { printf("%s.lex.c: %s\n", stem.c_str(), fn.c_str()); printf("\t$(LEX) $(LEXFLAGS) %s\n", fn.c_str()); printf("\tsed -e 's|[yY][yY]|%s_|g' lex.yy.c > %s.lex.c\n", yy.c_str(), stem.c_str()); printf("\trm lex.yy.c\n"); process(stem + ".lex.c", is_a_script); } } else if ( fn.downcase().ends_with(".cc") || fn.downcase().ends_with(".cxx") || fn.ends_with(".C") ) { nstring stem = fn.trim_extension(); remember_object_file(stem + "." + objext); nstring root = os_basename(stem); if (root == "main") remember_program(fn.first_dirname()); nstring dep = c_include_dependencies(fn); printf("\n"); printf("%s.%s: %s %s\n", stem.c_str(), objext.c_str(), fn.c_str(), dep.c_str()); printf("\t$(CXX) $(CPPFLAGS) $(CXXFLAGS) -I. -c %s\n", fn.c_str()); if (root != stem) { printf("\tmv %s.%s %s.%s\n", root.c_str(), objext.c_str(), stem.c_str(), objext.c_str()); } } else if (fn.ends_with(".c")) { nstring stem = fn.trim_extension(); remember_object_file(stem + "." + objext); if (fn.ends_with("/main.c")) remember_program(fn.first_dirname()); nstring root = os_basename(stem); nstring dep = c_include_dependencies(fn); printf("\n"); printf("%s.%s: %s %s\n", stem.c_str(), objext.c_str(), fn.c_str(), dep.c_str()); printf("\t$(CC) $(CPPFLAGS) $(CFLAGS) -I. -c %s\n", fn.c_str()); if (root != stem) { printf("\tmv %s.%s %s.%s\n", root.c_str(), objext.c_str(), stem.c_str(), objext.c_str()); } } else if (fn.gmatch("test/*/*.sh")) { nstring base = os_basename(fn, ".sh"); test_files.push_back(base); printf("\n"); printf("%s: %s all\n", base.c_str(), fn.c_str()); printf("\tPATH=`pwd`/bin:$$PATH $(SH) %s\n", fn.c_str()); } else if (fn.gmatch("man/man[0-9]/*.[0-9]")) { nstring stem = fn.substring(4, fn.size() - 4); nstring file2 = "$(mandir)/" + stem; man_files.push_back(file2); nstring src = os_dirname_relative(fn); nstring dst = os_dirname_relative(file2); recursive_mkdir(src, dst, "mandir"); nstring dir = os_dirname_relative(fn); #if 0 nstring dep = roff_include_dependencies(fn); #else nstring dep; #endif printf("\n"); printf("%s: %s %s %s/.mandir\n", file2.c_str(), fn.c_str(), dep.c_str(), dir.c_str()); if (have_soelim) { printf("\t$(SOELIM) -I. -I%s %s > tmp\n", dir.c_str(), fn.c_str()); printf("\t$(INSTALL_DATA) tmp $@\n"); printf("\t@rm -f tmp\n"); } else { printf("\t$(INSTALL_DATA) %s $@\n", fn.c_str()); } } else if (fn.gmatch("etc/*.man")) { nstring stem = fn.substring(4, fn.size() - 8); nstring base = os_basename(fn, ".man"); #if 0 nstring dep = roff_include_dependencies(fn); #else nstring dep; #endif if (have_groff) { printf("\n"); nstring tgt = "etc/" + base + ".ps"; printf("%s: %s %s\n", tgt.c_str(), fn.c_str(), dep.c_str()); printf("\t$(GROFF) -s -I. -t -man %s > $@\n", fn.c_str()); all_doc.push_back(tgt); } } else if (fn.starts_with("script/") || fn.starts_with("scripts/")) { nstring name = fn.basename(); nstring ext = name.get_extension(); if (ext == "tcl" || ext == "sh" || ext == "pl" || ext == "py") name = name.trim_extension(); nstring bin_name = "bin/" + name + exeext; printf("\n"); printf("%s: %s .bin\n", bin_name.c_str(), fn.c_str()); printf("\tcp %s $@\n", fn.c_str()); printf("\tchmod a+rx $@\n"); all_bin.push_back_unique(bin_name); clean_files.push_back_unique(bin_name); nstring install_name = "$(RPM_BUILD_ROOT)$(bindir)/$(PROGRAM_PREFIX)" + name + "$(PROGRAM_SUFFIX)" + exeext; printf("\n"); printf("%s: %s .bindir\n", install_name.c_str(), bin_name.c_str()); printf("\t$(INSTALL_SCRIPT) %s $@\n", bin_name.c_str()); if (!name.starts_with("test_")) install_bin.push_back_unique(install_name); } } nstring target_makefile::c_include_dependencies(const nstring &fn) { nstring_list result; result.push_back(fn); for (size_t j = 0; j < result.size(); ++j) c_include_dependencies(result, result[j]); nstring_list temp; for (size_t k = 1; k < result.size(); ++k) { nstring file = result[k]; nstring path = resolve(file); if (exists(path)) temp.push_back(file.quote_shell()); } temp.sort(); return temp.unsplit(); } static inline bool safe_isspace(int c) { return isspace((unsigned char)c); } void target_makefile::c_include_dependencies(nstring_list &results, const nstring &fn) { nstring path = resolve(fn); FILE *fp = fopen(path.c_str(), "r"); if (!fp) return; for (;;) { char line[2000]; if (!fgets(line, sizeof(line), fp)) break; char *cp = line; while (safe_isspace(*cp)) ++cp; if (*cp == '#') c_directive(cp, results); } } void target_makefile::c_directive(const char *s, nstring_list &results) { // // see if it is a #include directive // assert(*s == '#'); ++s; while (safe_isspace(*s)) ++s; if (memcmp(s, "include", 7)) return; s += 7; while (isspace(*s)) ++s; // // figure which type // ignore broken directives // int right = 0; switch (*s++) { default: return; case '"': right = '"'; break; case '<': right = '>'; break; } // // find the end of the filename // ignore broken directives // ignore anything on the end of the line // const char *filename = s; while (*s != right) { if (!*s || *s == '\n') return; ++s; } // // extract the path // ignore broken directives // if (s == filename) return; nstring path(filename, s - filename); // // remember this path for later scanning // results.push_back_unique(path); } void target_makefile::end() { nstring_list *lib_obj_list = object_list.query("lib"); if (lib_obj_list) { printf("\n"); lib_obj_list->sort(); printf("lib_obj = %s\n", lib_obj_list->unsplit().c_str()); printf("\n"); printf("lib/lib.%s: $(lib_obj)\n", libext.c_str()); printf("\trm -f $@\n"); printf("\t$(AR) qc $@ $(lib_obj)\n"); printf("\t$(RANLIB) $@\n"); } programs.sort(); for (size_t j = 0; j < programs.size(); ++j) { nstring prog = programs[j]; nstring_list *obj_file_list = object_list.query(prog); assert(obj_file_list); printf("\n"); printf("%s_obj = %s\n", prog.c_str(), obj_file_list->unsplit().c_str()); printf("\n"); printf("bin/%s: $(%s_obj) .bin", (prog + exeext).c_str(), prog.c_str()); if (lib_obj_list) printf(" lib/lib.%s", libext.c_str()); printf("\n"); if (seen_c_plus_plus) printf("\t$(CXX)"); else printf("\t$(CC)"); printf(" $(LDFLAGS) -o $@ $(%s_obj)", prog.c_str()); if (lib_obj_list) printf(" lib/lib.%s", libext.c_str()); printf(" $(LIBS)\n"); all_bin.push_back("bin/" + prog + exeext); printf("\n"); printf("$(bindir)/%s: bin/%s .bindir\n", (prog + exeext).c_str(), (prog + exeext).c_str()); printf("\t$(INSTALL_PROGRAM) bin/%s $@\n", (prog + exeext).c_str()); if (!prog.starts_with("test_")) install_bin.push_back("$(bindir)/" + prog); } printf("\n"); printf("all:"); if (!all_bin.empty()) printf(" all-bin"); if (!all_doc.empty()) printf(" all-doc"); printf("\n"); if (!all_bin.empty()) { all_bin.sort(); printf("all-bin: %s\n", all_bin.unsplit().c_str()); } if (!all_doc.empty()) { all_doc.sort(); printf("all-doc: %s\n", all_doc.unsplit().c_str()); } printf("\n"); printf(".bin:\n"); printf("\t-mkdir bin\n"); printf("\t-chmod 0755 bin\n"); printf("\t@-test -d bin && touch $@\n"); printf("\t@sleep 1\n"); printf("\n"); printf(".bindir:\n"); printf("\t-$(INSTALL) -m 0755 -d $(bindir)\n"); printf("\t@-test -d $(bindir) && touch $@\n"); printf("\t@sleep 1\n"); printf("\n"); test_files.sort(); printf("sure: %s\n", test_files.unsplit().c_str()); printf("\t@echo Passed All Tests\n"); printf("\n"); printf("clean-obj:\n"); clean_files.sort(); for (size_t k = 0; k < clean_files.size(); ++k) { printf("\trm -f %s\n", clean_files[k].quote_shell().c_str()); } printf("\n"); printf("clean: clean-obj\n"); for (size_t k = 0; k < all_bin.size(); ++k) { printf("\trm -f %s\n", all_bin[k].quote_shell().c_str()); } for (size_t k = 0; k < all_doc.size(); ++k) { printf("\trm -f %s\n", all_doc[k].quote_shell().c_str()); } dist_clean_files.sort(); printf("\n"); printf("distclean: clean\n"); for (size_t k = 0; k < dist_clean_files.size(); ++k) { printf("\trm -f %s\n", dist_clean_files[k].quote_shell().c_str()); } printf("\n"); install_bin.sort(); printf("install-bin: %s\n", install_bin.unsplit().c_str()); if (!man_files.empty()) { printf("\n"); man_files.sort(); printf("install-man: %s\n", man_files.unsplit().c_str()); } if (!install_datadir.empty()) { install_datadir.sort(); printf("install-datadir: %s\n", install_datadir.unsplit().c_str()); } if (!install_libdir.empty()) { install_libdir.sort(); printf("install-libdir: %s\n", install_libdir.unsplit().c_str()); } printf("\n"); printf("install: install-bin"); if (!man_files.empty()) printf(" install-man"); if (!install_datadir.empty()) printf(" install-datadir"); if (!install_libdir.empty()) printf(" install-libdir"); printf("\n"); }