// // aegis - project change supervisor // Copyright (C) 2007, 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 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 #include // for assert #include target_automake::~target_automake() { } target_automake::target_automake() : use_libtool(false), use_dot_man(false) { } void target_automake::begin() { 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("# This file is GENERATED from the Aegis repository file\n"); printf("# manifest. If you find a bug in this file, it could\n"); printf("# well be an Aegis bug.\n"); printf("#\n"); printf("# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); printf("\n"); printf("#\n"); printf("# Tell automake to put the object file for foo/bar.cc in\n"); printf("# directory foo/\n"); printf("#\n"); printf("AUTOMAKE_OPTIONS = subdir-objects\n"); } void target_automake::remember_source_file(const nstring &path) { nstring prog = path.first_dirname(); if (prog != "lib") prog = "bin/" + prog; nstring_list *source_file_list = source_list.query(prog); if (!source_file_list) { source_file_list = new nstring_list(); source_list.assign(prog, source_file_list); } source_file_list->push_back_unique(path); } void target_automake::remember_include_file(const nstring &path) { nstring include_dir = path.first_dirname(); nstring_list *include_file_list = include_list.query(include_dir); if (!include_file_list) { include_file_list = new nstring_list(); include_list.assign(include_dir, include_file_list); } include_file_list->push_back_unique(path); } void target_automake::remember_program(const nstring &name) { if (name.starts_with("test_")) check_programs.push_back_unique("bin/" + name); else bin_programs.push_back_unique("bin/" + name); } void target_automake::process(const nstring &a_fn, bool is_a_script) { nstring fn = a_fn; extra_dist.push_back(fn); if (fn.ends_with(".in")) { fn = fn.substring(0, fn.size() - 3); dist_clean_files.push_back_unique(fn); } nstring fn_lc = fn.downcase(); if (fn.starts_with("datadir/")) { pkgdatadir.push_back(fn); return; } if (fn.starts_with("libdir/")) { pkglibdir.push_back(fn); return; } if (is_a_script) { nstring prog = fn.basename(); if (trim_script_suffix()) prog = prog.trim_extension(); nstring bin_prog = "bin/" + prog; bool copy_and_chmod = (fn != prog); if (prog.starts_with("test_")) check_scripts.push_back(bin_prog); else if (fn_lc.starts_with("script/") || fn_lc.starts_with("scripts/")) bin_scripts.push_back(bin_prog); else if (!fn.starts_with("test/")) noinst_scripts.push_back(bin_prog); else copy_and_chmod = false; if (copy_and_chmod) { printf("\n"); printf("%s: %s\n", bin_prog.c_str(), fn.c_str()); printf("\tcp %s $@\n", fn.c_str()); printf("\tchmod a+rx $@\n"); } return; } if (fn_lc.ends_with(".y")) { remember_source_file(fn); } else if (fn_lc.ends_with(".l")) { remember_source_file(fn); } else if ( fn_lc.ends_with(".c") || fn_lc.ends_with(".cc") || fn_lc.ends_with(".cpp") || fn_lc.ends_with(".cxx") ) { remember_source_file(fn); nstring stem = fn.trim_extension(); nstring base = stem.basename(); if (base == "main") remember_program(fn.first_dirname()); } else if ( fn_lc.ends_with(".h") || fn_lc.ends_with(".hh") || fn_lc.ends_with(".hpp") || fn_lc.ends_with(".hxx") ) { remember_source_file(fn); remember_include_file(fn); noinst_header.push_back_unique(fn); } else if (fn.gmatch("test/*/*.sh")) { test_files.push_back_unique(fn); } else if (fn.gmatch("*.[1-9]") || (use_dot_man && fn.ends_with(".man"))) { man_mans.push_back_unique(fn); } } static void print_file_list(const nstring &name, const nstring_list &value, const nstring &comment = "") { if (value.empty()) return; printf("\n"); if (!comment.empty()) printf("# %s\n", comment.c_str()); printf("%s =", name.identifier().c_str()); for (size_t j = 0; j < value.size(); ++j) printf(" \\\n\t%s", value[j].c_str()); printf("\n"); } void target_automake::end() { print_file_list ( "bin_PROGRAMS", bin_programs, "executables to be installed" ); print_file_list ( "noinst_PROGRAMS", noinst_programs, "executables not to be installed" ); print_file_list ( "check_PROGRAMS", check_programs, "executables needed to run tests" ); print_file_list("man_MANS", man_mans, "manual pages"); print_file_list("EXTRA_DIST", extra_dist); print_file_list ( "bin_SCRIPTS", bin_scripts, "scripts to be installed" ); print_file_list ( "check_SCRIPTS", check_scripts, "scripts needed to run tests" ); print_file_list ( "noinst_SCRIPTS", noinst_scripts, "scripts not to be installed" ); print_file_list ( "dist_pkgdatadir_DATA", pkgdatadir, "Data files to be installed in $(DATADIR)" ); print_file_list ( "dist_pkglibdir_DATA", pkglibdir, "Data files to be installed in $(LIBDIR)" ); nstring_list lib_list; if (source_list.query("lib")) { if (use_libtool) { lib_list.push_back("lib/lib.la"); print_file_list("noinst_LTLIBRARIES", lib_list); } else { lib_list.push_back("lib/lib.a"); print_file_list("noinst_LIBRARIES", lib_list); } } print_file_list("noinst_HEADER", noinst_header, "project header files"); print_file_list("DISTCLEANFILES", dist_clean_files); if (!lib_list.empty()) { nstring_list *file_list = include_list.query("lib"); if (file_list) print_file_list(lib_list[0] + "_includes", *file_list); file_list = source_list.query("lib"); assert(file_list); print_file_list(lib_list[0] + "_SOURCES", *file_list); } for (size_t j = 0; j < bin_programs.size(); ++j) { nstring prog = bin_programs[j]; nstring_list *file_list = include_list.query(prog); if (file_list) print_file_list(prog + "_includes", *file_list); file_list = source_list.query(prog); assert(file_list); if (file_list) print_file_list(prog + "_SOURCES", *file_list); print_file_list(prog + "_LDADD", lib_list); } for (size_t j = 0; j < noinst_programs.size(); ++j) { printf("\n"); nstring prog = noinst_programs[j]; nstring_list *file_list = include_list.query(prog); if (file_list) print_file_list(prog + "_includes", *file_list); file_list = source_list.query(prog); assert(file_list); if (file_list) print_file_list(prog + "_SOURCES", *file_list); print_file_list(prog + "_LDADD", lib_list); } if (!test_files.empty()) { nstring_list dummy; dummy.push_back("PATH=`pwd`/bin:$$PATH"); dummy.push_back("$(SHELL)"); print_file_list("TESTS_ENVIRONMENT", dummy); print_file_list("TESTS", test_files); } }