⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mkmf.c

📁 早期freebsd实现
💻 C
字号:
/* * Copyright (c) 1983, 1985, 1991 Peter J. Nicklin. * Copyright (c) 1991 Version Technology. * All Rights Reserved. * * $License: VT.1.1 $ * Redistribution and use in source and binary forms,  with or without * modification,  are permitted provided that the following conditions * are met:  (1) Redistributions of source code must retain the  above * copyright  notice,  this  list  of  conditions  and  the  following * disclaimer.  (2) Redistributions in binary form must reproduce  the * above  copyright notice,  this list of conditions and the following * disclaimer in the  documentation  and/or other  materials  provided * with  the  distribution.  (3) All advertising materials  mentioning * features or  use  of  this  software  must  display  the  following * acknowledgement:  ``This  product  includes  software  developed by * Version Technology.''  Neither the name of Version  Technology  nor * the  name  of  Peter J. Nicklin  may  be used to endorse or promote * products derived from this software without specific prior  written * permission. * * THIS SOFTWARE IS PROVIDED BY VERSION TECHNOLOGY ``AS IS''  AND  ANY * EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT LIMITED TO, THE * IMPLIED  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL  VERSION  TECHNOLOGY  BE * LIABLE  FOR ANY DIRECT,  INDIRECT,  INCIDENTAL, SPECIAL, EXEMPLARY, * OR  CONSEQUENTIAL DAMAGES   (INCLUDING,   BUT   NOT   LIMITED   TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF  LIABILITY,  WHETHER  IN  CONTRACT,  STRICT LIABILITY,  OR  TORT * (INCLUDING NEGLIGENCE OR OTHERWISE)  ARISING  IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE,  EVEN  IF  ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * Report problems and direct questions to nicklin@netcom.com * * $Header: Mkmf.c,v 4.5 91/11/25 19:44:59 nicklin Exp $ * * mkmf - makefile editor * * Author: Peter J. Nicklin */#include "RELEASE.h"#include "Mkmf.h"#include "config.h"#include "getarg.h"#include "hash.h"#include "null.h"#include "path.h"#include "target.h"#include "slist.h"#include "suffix.h"#include "yesno.h"char *MAKEFILE = "C";			/* default makefile template language */char OBJSFX[SUFFIXSIZE] = ".o";		/* default object suffix */char *PGN = "mkmf";			/* program name */int AFLAG = NO;				/* list .source files? */int CFLAG = YES;			/* makefile creation message flag */int DEPEND = 1;				/* dependency analysis? */int EFLAG = NO;				/* environ. overrides makefile macros? */int FFLAG = NO;				/* user-specified template pathname? */int LIBOBJ = 0;				/* load object file into library? */int MKSYMLINK = 0;			/* make symbolic links to current dir? */int SYSHDRS = NO;			/* search system header files? */SLIST *HEADLIST;			/* header file name list */SLIST *LIBLIST;				/* library pathname list */SLIST *SRCLIST;				/* source file name list */HASH *MDEFTABLE;			/* macro definition table */char *DEFRULE[] =			/* default preprocessor rules */	{#include "defaultrul.h"	NULL	};SUFFIX DEFSFX[] =			/* default suffix list */	{#include "defaultsfx.h"	};MAPINCLUDE INCKEY[] =			/* include style lookup table */	{#include "inckey.h"	};main(argc, argv)	int argc;	char **argv;{	char *mfname = NULL;		/* makefile name */	char mfpath[PATHSIZE];		/* makefile template pathname */	HASHBLK *htb;			/* hash table block */	HASHBLK *htinstall();		/* install hash table entry */	HASHBLK *htlookup();		/* find hash table entry */	int buildliblist();		/* build list of library pathnames */	int buildruletable();		/* build table of preprocessor rules */	int buildsfxtable();		/* build table of suffixes */	int buildsrclist();		/* build list of source file names */	int findmf();			/* find makefile */	int status = 0;			/* exit status */	int storemacro();		/* store macro definition */	short iflag = NO;		/* interactive flag */	TARGET target;			/* type of makefile target */	void answer();			/* install answer in macro def table */	void editmf();			/* edit makefile */	target.type = target.dest = VUNKNOWN;	{	register char *s;		/* option pointer */	while (--argc > 0 && **++argv == '-')		{		for (s = argv[0]+1; *s != '\0'; s++)			switch (*s)				{				case 'F':					MAKEFILE = GETARG(s);					if (MAKEFILE==NULL || *MAKEFILE=='\0')						{						warn("missing template name");						status = 1;						}					FFLAG = YES;					goto endfor;				case 'L':					LIBOBJ = 1;					target.type = VLIBRARY;					break;				case 'M':					MAKEFILE = GETARG(s);					if (MAKEFILE==NULL || *MAKEFILE=='\0')						{						warn("missing template name");						status = 1;						}					goto endfor;				case 'S':					MKSYMLINK++;					break;				case 'a':					AFLAG = YES;					break;				case 'c':					CFLAG = NO;					break;				case 'd':					/* turn OFF dependency analysis */					DEPEND = 0;					break;				case 'e':					EFLAG = YES;					break;				case 'f':					mfname = GETARG(s);					if (mfname == NULL || *mfname == '\0')						{						warn("missing makefile name");						status = 1;						}					goto endfor;				case 'i':					iflag = YES;					break;				case 'l':					target.type = VLIBRARY;					break;				default:					badopt(**argv, *s);					status = 1;					goto endfor;				}		endfor: continue;		}	}		/* initialize macro definition table */	MDEFTABLE = htinit(MDEFTABLESIZE);	/* get command line macro definitions */	for (; argc > 0; argc--, argv++)		if (storemacro(*argv) == NO)			{			warns("%s not a macro definition", *argv);			status = 1;			}	if (status == 1)		{		usage("[-acdeilS] [-f makefile] [-F template] [-M language]\n       [macroname=value...]");		exit(1);		}	/*	 * store macro definition placeholders that will be generated later	 * unless specified on the command line	 */	if (storedynmacro() == NO)		exit(1);	/* environment variables override makefile macro definitions */	if (EFLAG == YES)		{		if (storenvmacro() == NO)			exit(1);		}	/* determine the makefile name */	if (mfname == NULL)		if ((htb = htlookup(MMAKEFILE, MDEFTABLE)) != NULL)			mfname = htb->h_def;		else if (FILEXIST("makefile"))			mfname = "makefile";		else if (FILEXIST("Makefile"))			mfname = "Makefile";		else			mfname = "Makefile";	if (htinstall(MMAKEFILE, mfname, VREADWRITE, MDEFTABLE) == NULL)		exit(1);	/* find the makefile (template) and load useful macro definitions */	if (target.type == VUNKNOWN)		{		if (htlookup(MPROGRAM, MDEFTABLE) != NULL)			target.type = VPROGRAM;		else if (htlookup(MLIBRARY, MDEFTABLE) != NULL)			target.type = VLIBRARY;		}	if (findmf(mfname, mfpath, &target) == NO)		exit(1);		/* search system header files? */	if ((htb = htlookup(MSYSHDRS, MDEFTABLE)) != NULL)		SYSHDRS = YES;	/* interactive option */	if (iflag == YES)		{		if (htlookup(MPROGRAM, MDEFTABLE) == NULL &&		    htlookup(MLIBRARY, MDEFTABLE) == NULL)			if (target.type == VPROGRAM)				{				printf("program name? ");				answer(MPROGRAM, VREADWRITE);				}			else if (target.type == VLIBRARY)				{				printf("library name? ");				answer(MLIBRARY, VREADWRITE);				}		if (htlookup(MDESTDIR, MDEFTABLE) == NULL && target.dest == VDESTDIR)			{			printf("destination directory? ");			answer(MDESTDIR, VREADWRITE);			}		}	/* load environment variables into macro definitions */	if (EFLAG == NO)		{		if (storenvmacro() == NO)			exit(1);		}	/* build the suffix table */	if (buildsfxtable() == NO)		exit(1);	/* build the rule table */	if (buildruletable() == NO)		exit(1);	/* build the source code and header file name lists */	if (buildsrclist() == NO)		exit(1);	/* build the library pathname list */	if (buildliblist() == NO)		exit(1);	/* edit makefile */	editmf(mfname, mfpath);	exit(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -