CRUNCHGEN(1)

명칭
crunchgen - 크런치 바이너리 구축 환경을 작성한다

서식
crunchgen [-foql] [-h makefile-header-name] [-m makefile-name] [-p obj-prefix] [-c c-file-name] [-e exec-file-name] [conf-file]

해설
크런치 바이너리 (crunched binary)는, 많은 다른 프로그램을 하나로 정리해 단일의 실행 형식으로 한 프로그램입니다. 크런치 바이너리의 main() 함수는, argv[0] 의 값을 봐, 어느 컴퍼넌트 프로그램이 실행되어야할 것인가를 결정합니다. 복수 프로그램을 크런치 해 하나에 정리하는 주된 이유는, 인스톨 플로피 혹은 시스템 회복 플로피상에, 가능한 한 많은 프로그램을 수납하기 (위해)때문입니다.

crunchgen 유틸리티는 conf-file 에 기술된 크런치 바이너리를 위한 설정 항목을 읽어들여, Makefile (와)과 거기에 부수 하는 톱 레벨의 C 원시 파일을 생성합니다. 이것들은 빌드시에 각 컴퍼넌트 프로그램으로부터 크런치 한 실행 형식을 작성합니다. 옵션에 의해, crunchgen (은)는, 각 컴퍼넌트 프로그램에 대해서, 그 소스 디렉토리의 Makefile (으)로부터 프로그램을 구성하는 오브젝트 파일 (. o)를 결정하는 일도 시도합니다. 이 정보는 실행마다 캐쉬됩니다. crunchgen 유틸리티는 관련하는 또 하나의 프로그램 crunchide(1) (을)를 이용해 모든 불필요한 심볼을 숨기는 것으로 컴퍼넌트 프로그램간의 링크시의 심볼 경합을 막습니다.

crunchgen 유틸리티는 특수한 요건을 패키지의 Makefile 에 부과하고 있어 이것이 원인으로 Makefile 하지만 비 BSD 소스용으로 사용할 수 없게 되고 있습니다. 특히, Makefile (은)는 타겟 depend (을)를 포함하는 것이 필요하고, 전오브젝트 파일을 변수 OBJS 그리고 정의하는 것이 필요합니다. 경우에 따라서는, 가짜의 Makefile (을)를 사용할 수 있겠지요. crunchgen (은)는, 소스 디렉토리 foo 안의 Makefile (을)를 보기 전에, 현재의 디렉토리안의 Makefile.foo (을)를 봅니다.

crunchgen 실행 후, “make -f <conf-name>.mk” (을)를 실행하는 것으로 크런치 바이너리를 작성할 수 있습니다. 컴퍼넌트 프로그램의 오브젝트 파일은 이미 작성되고 있다 필요가 있습니다. 출력되는 makefile 에 포함된다 objs 타겟은, 각 컴퍼넌트 프로그램의 소스 디렉토리에서 make(1) (을)를 실행해, 유저를 위해서(때문에) 오브젝트 파일을 작성해 줍니다. 그러나 이 타겟은 자동적으로는 실행되지 않습니다. 릴리스 엔지니어링 환경에서는, 오브젝트를 다른 디렉토리에서 수정하는 것은 일반적으로 바람직하지 않기 때문입니다.

옵션은 이하와 같습니다:

-c c-file-name
    출력하는 C 의 파일명을 c-file-name (으)로 합니다. 디폴트의 이름은 <conf-name>. c 입니다.

-e exec-file-name
    크런치 바이너리의 실행 형식 파일의 이름을 exec-file-name (으)로 합니다. 디폴트의 이름은 <conf-name> 입니다.

-f  캐쉬를 소거해, 캐쉬되고 있던 파라미터를 강제적으로 재계산합니다.

-l  이름의 표시. 이 바이너리가 대응하는 이름을 일람표 가리킵니다.

-h makefile-header-name
    crunchgen 하지만 생성한다 Makefile 의 선두에 포함하는 파일의 이름을 설정합니다. make 의 변수를 정의하는데 편리합니다. 이것에는, make(1) 의 동작에 영향을 주어 환경 변수를 개입시켜에서는 귀찮다, RELEASE_CRUNCH 하지만 포함됩니다.

-m makefile-name
    출력한다 Makefile 의 이름을 makefile-name (으)로 합니다. 디폴트의 이름은 <conf-name>.mk 입니다.

-o  각 프로그램의 make 타겟으로 대해, “make obj” 룰을 추가합니다.

-p obj-prefix
    objdir (을)를 계산할 경우에, srcdir 의 전에 붙이는 패스명을 설정합니다. 이 옵션이 존재하지 않는 경우, 사용하는 프레픽스는 MAKEOBJDIRPREFIX 환경 변수의 내용인가, 또는 /usr/obj 입니다.

-q  정숙 처리 모드. 상황 보고 메세지를 억제합니다.

CRUNCHGEN 배치 파일 명령
crunchgen 유틸리티는, 크런치 바이너리의 컴퍼넌트에 대해 기술한 설정 항목을 conf-file (으)로부터 읽어냅니다. 가장 단순한 경우는, 각 컴퍼넌트 프로그램명을, 그 원시 파일이 놓여진 톱 레벨의 디렉토리명과 함께, 단지 열거할 뿐입니다. 다음에 crunchgen 유틸리티는 (소스의 makefile 에 의해) 오브젝트 파일 리스트와 그 위치를 요구해 그것을 캐쉬합니다. 좀 더 특수한 경우에는, crunchgen 하지만 필요로 하는 모든 파라미터를, 유저가 수동으로 지정할 수가 있습니다.

conf-file 의 명령은 이하와 같습니다:

srcdirs dirname ...
    컴퍼넌트 프로그램의 소스 디렉토리가 있는 소스 트리의 리스트. 이러한 디렉토리는 BSD 의 “<source-dir>/<progname>/” 방식을 이용해 검색됩니다. srcdirs 행은 다수 있어도 자주(잘), 디렉토리는 기술된 순서에 검색됩니다.

progs progname ...
    크런치 바이너리를 구성하는 프로그램의 리스트. progs 행은 다수 있어도 상관하지 않습니다.

libs libspec ...
    크런치 바이너리의 링크시에 포함하는 프로그램 라이브러리 지정의 리스트. libs 행은 다수 있어도 상관하지 않습니다.

buildopts buildopts ...
    각 make 타겟으로 추가 추가되는, 빌드 옵션의 리스트.

ln progname linkname
    argv[0] 에 linkname 하지만 나타났을 때는 언제나 progname (을)를 기동하도록, 크런치 바이너리에 요청합니다. 이것에 의해, 기동시의 이름에 의해 행동을 바꾸는 것 같은 프로그램도 올바르게 동작하도록 할 수 있습니다.

특별한 상황, 예를 들면 원시 파일이 없다든가, 종래의 Makefile 에 의하지 않는 빌드를 실시한다고 했을 경우에 대응하기 위해(때문에), 이하에 말한다 special 명령을 이용해 컴퍼넌트 프로그램의 crunchgen 파라미터를 지정할 수 있습니다.

special progname srcdir pathname
    프로그램용 progname 의 오브젝트 파일 일람을 보관 유지하는 make 변수의 이름을 설정합니다. 이것은 통상 OBJS 그렇지만, Makefile 에 따라서는, 다른 약속이 바람직한 경우나, SSHD_OBJS (와)과 같이 프로그램명이 전을 뒤따르는 것이 있습니다.

special progname srcdir pathname
    프로그램 progname 의 소스 디렉토리를 지정합니다. 통상은 지정된 디렉토리 srcdirs 안의 progname 디렉토리를 검색해 결정됩니다.

special progname objdir pathname
    프로그램 progname 의 obj 디렉토리를 지정합니다. 통상, obj 디렉토리는, 소스 디렉토리명의 전에 다음의 몇개의 컴퍼넌트를 붙인 것으로서 계산되어 컴퍼넌트에는 다음의 차례로 우선도가 있습니다: 명령행에 있어서의 -p 의 인수, 환경 변수 MAKEOBJDIRPREFIX 의 값, 또는 /usr/obj 입니다. 만약 디렉토리가 발견되지 않으면, 디렉토리 srcdir 자신이 objdir 됩니다.

special progname buildopts buildopts
    빌드 옵션 집합을 정의합니다. progname 처리시에는, buildopts 그리고 지정된 것에 가세해 이것들이 추가되어 make(1) 의 타겟이 작성됩니다.

special progname objs object-file-name ...
    프로그램 progname 의 오브젝트 파일의 리스트를 지정합니다. 통상은, “srcdir/Makefile” (을)를 인클루드 해 $(OBJS) 의 값을 출력하는 것 같은 일시 makefile 를 구축한다 일로 결정됩니다.

special progname objpaths full-pathname-to-object-file ...
    프로그램 progname 의 오브젝트 파일의 패스명을 지정합니다. 통상은 objs 리스트중의 각 파일의 패스명의 선두에 objdir (을)를 부가하는 것으로 결정됩니다.

special progname objvar variable_name
    프로그램 progname 용무의 오브젝트 파일 리스트를 보관 유지한다 make(1) 변수명을 설정합니다. 이것은 통상 OBJS 그렇지만, Makefile 에 따라서는 다른 규약을 사용하고 싶을지도 모르고, 변수명의 전에 프로그램명을 붙이고 싶을지도 모릅니다. 예를 들면 SSHD_OBJS 등.

special progname lib library-name ...
    progname.lo (을)를 생성하기 위해서 오브젝트 파일과 링크 하는 프로그램 라이브러리를 지정합니다. 표준 프로그램 라이브러리에 포함되는 routine를 재정의하는 프로그램 라이브러리를 사용할 경우에 유용합니다.

special progname keep symbol-name ...
    프로그램 progname 의 보관 유지 리스트에, 지정하는 심볼의 리스트를 추가합니다. 각 심볼의 전에는 언더스코어 (‘_’) 하지만 부가되어 crunchide(1) 국면에서는 -k 옵션의 인수가 됩니다 이 옵션은 심볼이 충돌할 때의 마지막 거소입니다만, 심볼 해결의 유일한 방법인 경우도 있습니다.

special progname ident identifier
    progname 에 대한다 Makefile/C 식별자를 설정합니다. 이것은 통상, progname (을)를 바탕으로, ‘-’ (을)를 ‘_’ 에 MAP 해, 다른 모든 비식별자 캐릭터를 무시하는 것으로써, 생성됩니다. 이 결과, "foo.bar" (와)과 "foobar" (은)는, 동일한 식별자에 MAP 되어 버립니다.

실제로 crunchgen 하지만 필요로 하는 것은 objpaths 뿐입니다만, 이것은 objdir (와)과 objs (으)로부터 요구되어 이것들도 srcdir (으)로부터 요구됩니다. 그러니까, 만약 가능하면, 초기의 파라미터를 지정해, 나머지는 crunchgen 에 요구하게 하는 편이 편리한 경우도 있습니다.

crunchgen 하지만 생성하는 makefile 는 옵션의 타겟 objs (을)를 포함합니다. 이것은, 각 컴퍼넌트 프로그램의 소스 디렉토리내에서 make(1) (을)를 실행해 오브젝트 파일을 작성하는 타겟입니다. 이것이 잘 동작하기 위해서는 srcdir 및 objs 파라미터가 올바른 것으로 않으면 안됩니다. 만약 이러한 값이 있는 프로그램에 대해서 부정한 것이라고, objs 타겟에서는 그 프로그램은 스킵 되어 버립니다.

실행예
crunchgen 의 입력 배치 파일의 예로서 “kcopy.conf” 의 내용을 나타냅니다.

    srcdirs /usr/src/bin /usr/src/sbin
    progs test cp echo sh fsck halt init mount umount myinstall
    progs anotherprog
    ln test [       # test 는 [ 으로서 기동할 수도 있다
    ln sh -sh       # init 는 argv[0] 을 "-sh" 로서 쉘을 기동한다
    special myprog objpaths /homes/leroy/src/myinstall.o # 소스 없음
    special anotherprog -DNO_FOO WITHOUT_BAR=YES
    libs -lutil -lcrypt

이 배치 파일에서는, 몇개의 기본적인 시스템 유틸리티와 자가제의 인스톨 프로그램 “(myinstall)” (으)로부터 완성된다 작은 크런치 바이너리를 기술하고 있습니다. 소스 디렉토리는 전혀 지정되어 있지 않습니다만, 오브젝트 파일은 special 행으로 직접 지정되어 있습니다.

게다가 “anotherprog” 구축시에는, 인수

    -DNO_FOO WITHOUT_BAR=YES

하지만 모든 빌드 타겟으로 대해 추가됩니다.

크런치 바이너리 “kcopy” (은)는 이하와 같이 해 작성할 수 있습니다:

    % crunchgen -m Makefile kcopy.conf    # Makefile 와 kcopy.c 작성
    % make objs             # 컴퍼넌트 프로그램의 *. o 작성
    % make                  # 크런치 바이너리 kcopy 의 작성
    % kcopy sh              # 쉘 sh 를 기동할 수 있는지 어떤지 시험하면(자)..
    $			# 잘되었다!

여기까지 오면, 바이너리 “kcopy” (을)를 인스톨 플로피에 카피해, 각 컴퍼넌트 프로그램의 이름으로 하드 링크를 마련할 수가 있습니다.

관련 항목
crunchide(1) make(1)

경고
crunchgen (은)는 크런치 바이너리중의 각 컴퍼넌트 프로그램간의 링크 경합을 제거하는데 배려하고 있습니다만, 여전히 링크 된 프로그램 라이브러리간에 경합이 발생할 가능성이 남아 있습니다. 프로그램 라이브러리순서의 교체가 필요한 경우도 있고, 두 개의 프로그램 라이브러리간에 아무래도 해소할 수 없는 경합이 발생해, 결국 하나에 정리하지 않는 경우도 드물게 있습니다.

BSD 의 버젼에 따라서는, 디폴트의 빌드 환경에서는 단일 원시 파일의 프로그램에 대해서 중간 오브젝트 파일을 작성하지 않는 것이 있습니다. 그 경우는 “make objs” 타겟을 이용해 오브젝트 파일을 작성하는지, 다른 조정을 베풀 필요가 있습니다.

저자
crunchgen 유틸리티는 James da Silva <jds@cs.umd.edu> 에 의해 작성되었습니다.

Copyright (c) 1994 University of Maryland. All Rights Reserved.