C言語でNESアプリを作成(ライブラリの作成)

cc65にはライブラリアンであるar65も同梱されていますので、別プロジェクトでも使えそうな関数をまとめてライブラリ化することができます。
以前のMakefileを改造して、お手軽に自作ライブラリを作れるようにします。

ライブラリプロジェクトの配置

ファイルの配置は下記の通りです。

nesapp/               ... 作業用のディレクトリ
│setenv.bat(.sh)     ... 環境変数設定用のバッチファイル(スクリプト)
│
└─libbase/           ... プロジェクト用のディレクトリ(ライブラリファイル名と同じ)
    │Makefile        ... ビルド用のメイクファイル
    │
    ├─include/      ... ライブラリのヘッダーファイル用のディレクトリ
    │
    ├─lib/          ... ライブラリ用のディレクトリ
    │
    └─src/          ... ソースプログラム用のディレクトリ

include内には公開用のヘッダファイルを格納します。
lib内にはビルドしてできたライブラリファイルが格納されます。
src内にはこれまで通り、プログラムを格納します。

Makefile

改造方針は、以下の通り。

  1. コンパイルまでは通常通り
  2. 最後にリンカーのld65ではなく、ライブラリアンのar65でライブラリ化

PROJECT  := $(shell basename $(CURDIR))

LIB_DIR  := lib
SRC_DIR  := src
OBJ_DIR  := obj

TARGET   := $(LIB_DIR)/$(PROJECT).lib

CFILES   := $(wildcard $(SRC_DIR)/*.c)
SFILES   := $(wildcard $(SRC_DIR)/*.s) $(wildcard $(SRC_DIR)/*.asm)

OBJS     := \
	$(foreach file, $(CFILES), $(OBJ_DIR)/$(basename $(notdir $(file))).o) \
	$(foreach file, $(SFILES), $(OBJ_DIR)/$(basename $(notdir $(file))).o)

DEPENDS  := $(wildcard $(OBJ_DIR)/*.dep)

AS_INCDIR := $(CC65_HOME)/asminc
CC_INCDIR := $(CC65_HOME)/include

ASFLAGS  := -t none -I $(AS_INCDIR) -I $(CURDIR)/include
CFLAGS   := -t none -Or -Os -I $(CC_INCDIR) -I $(CURDIR)/include
ARFLAGS  :=

CC       := cl65
AS       := cl65
AR       := ar65
RM       := rm -rf
MKDIR    := mkdir

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
	$(CC) $(CFLAGS) --create-dep $@.dep -c -o $@ $<

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.s
	$(AS) $(ASFLAGS) --create-dep $@.dep -c -o $@ $<

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.asm
	$(AS) $(ASFLAGS) --create-dep $@.dep -c -o $@ $<

.PHONY: all
all: init $(TARGET)

.PHONY: clean
clean:
	- $(RM) $(LIB_DIR)
	- $(RM) $(OBJ_DIR)

.PHONY: init
init:
	@$(if $(shell ls | grep $(LIB_DIR)) , , $(MKDIR) $(LIB_DIR))
	@$(if $(shell ls | grep $(OBJ_DIR)) , , $(MKDIR) $(OBJ_DIR))

$(TARGET): $(OBJS)
	@ echo Create $@
	@ $(RM) $@
	$(AR) $(ARFLAGS) a $@ $(OBJS)
	@ echo Done.

-include $(DEPENDS)

ライブラリアンの機能には追加以外にもありますが、今回の使い方では必ず新規作成するだけのお手軽な使い方となっています…

サンプルプロジェクト

上記までのファイルをまとめたものはこちら。

  1. nesapp-libbase.zip「ライブラリ作成」のベースプロジェクト

以下は、ベースプロジェクト上でcc65@wiki様の「kihon.h」をライブラリ化してみたサンプルです。
オリジナルを基にプロトタイプ宣言と関数を分けています。
動作確認用のプロジェクトは、「kihon.h」の一部の関数を使ってスプライトを64個表示しています。

  1. nesapp-libkihon.zip「ライブラリ本体」
  2. nesapp-test_libkihon.zip「ライブラリの動作確認用プロジェクト」


参考:
cc65@wiki kihon.hの作成 <http://www34.atwiki.jp/cc65/pages/28.html>