[C++] ”プログラミング入門” : GUIソースコード修正 Makefile, CMakeLists.txt

[M1 Mac, Big Sur 11.6.7, FLTK 1.3.8, clang 13.0.0, no IDE]

プロジェクトのディレクトリ構成は下図の通りです。

Makefile, CMakeLists.txtも載せておきます。

# コンパイラ
COMPILER = clang++
DEBUG = -g

# オプション
CPPFLAGS = $(shell fltk-config --use-gl --use-images --cxxflags ) -std=c++11 
LDFLAGS = $(shell fltk-config --use-gl --use-images --ldflags ) -lc++

# includeパス(-I)
INCLUDE = -I./include -I/opt/homebrew/Cellar/libpng/1.6.37/include -I/opt/homebrew/Cellar/fltk/1.3.8/include \
-I/opt/homebrew/Cellar/opencv/4.5.5_2/include

# ライブラリ直接パス(-l)
LIBRARYD = -lpng16 -lz -lopencv_core -lopencv_imgcodecs -lopencv_highgui -lopencv_imgproc

# ライブラリパス(-L)
LIBRARY = -L/opt/homebrew/Cellar/jpeg/9e/lib -L/opt/homebrew/Cellar/libpng/1.6.37/lib \
-L/usr/local/lib -L/opt/homebrew/Cellar/opencv/4.5.5_2/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(shell find $(SRCDIR) -type f)

# オブジェクトファイル
OBJDIR = ./obj
OBJS   = $(addprefix $(OBJDIR), $(patsubst ./src%,%,$(SRCS:.cpp=.o)))

# 実行ファイル
TARGETDIR = ./bin
TARGET = PPPGui

# プロジェクト
PROJ = PPP02

# コンパイル
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<

# appファイル作成関連
POSTBUILD  = fltk-config --post

# ビルド:oファイルから実行ファイルとappファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARYD) $(LDFLAGS) $(LIBRARY)
	cp $(TARGETDIR)/$(TARGET) ./app/$(TARGET)
	cd ./app && $(POSTBUILD) $(TARGET)
	mkdir ./app/$(TARGET).app/Contents/Resources
	cp ./images/$(TARGET).icns ./app/$(TARGET).app/Contents/Resources
	plutil -insert 'CFBundleIconFile' -string $(TARGET).icns ./app/$(TARGET).app/Contents/Info.plist
	rm -f ./app/$(TARGET)

# ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET) $(TARGET).app $(SRCDIR)/.DS_Store ./app/*

# CMakeからappファイル作成
.PHONY : all
all:
	rm -rf build/* $(SRCDIR)/.DS_Store
	cd /Volumes/DATA_m1/code/cpp/projects/$(PROJ)/build && cmake .. && make
	mkdir ./build/$(TARGET).app/Contents/Resources
	cp ./images/$(TARGET).icns ./build/$(TARGET).app/Contents/Resources
	plutil -replace 'CFBundleIconFile' -string "$(TARGET).icns" ./build/$(TARGET).app/Contents/Info.plist

# 自製Makefileから実行ファイルおよびappファイル作成
.PHONY:all2
all2: clean $(TARGET)

# 実行ファイルからappファイル作成(Info.plistが必要)
.PHONY : exetoapp
exetoapp:
	mkdir $(TARGETDIR)/$(TARGET)
	mkdir $(TARGETDIR)/$(TARGET)/Contents
	mkdir $(TARGETDIR)/$(TARGET)/Contents/MacOS
	mkdir $(TARGETDIR)/$(TARGET)/Contents/Resources
	cp $(TARGETDIR)/$(TARGET).exe $(TARGETDIR)/$(TARGET)/Contents/MacOS
	cp ./Info.plist $(TARGETDIR)/$(TARGET)/Contents
	cp ./images/test.icns $(TARGETDIR)/$(TARGET)/Contents/Resources
	plutil -replace 'CFBundleIconFile' -string "test.icns" $(TARGETDIR)/$(TARGET)/Contents/Info.plist
cmake_minimum_required(VERSION 3.1)

# Project
Project(PPPGui VERSION 1.0.0)
FIND_PACKAGE(FLTK REQUIRED)
FIND_PACKAGE(OpenGL REQUIRED)
find_library(COCOA Cocoa)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_VERBOSE_MAKEFILE ON)

# Info.plist
set(MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION})
set(MACOSX_BUNDLE_COPYRIGHT "")
set(MACOSX_BUNDLE_INFO_STRING "")
set(MACOSX_BUNDLE_GUI_IDENTIFIER "")

# ファイル設定
file(GLOB SOURCE ./src/*.cpp ./include/*.h)

add_executable(${PROJECT_NAME}
    MACOSX_BUNDLE
    ${SOURCE}
    )

set(INCDIR ./include)
set(INCDIR ${INCDIR} /opt/homebrew/Cellar/libpng/1.6.37/include)
set(INCDIR ${INCDIR} /opt/homebrew/Cellar/fltk/1.3.8/include)
set(INCDIR ${INCDIR} /opt/homebrew/Cellar/jpeg/9e/include)
include_directories(${INCDIR})

set(LIBS dl)
set(LIBS ${LIBS} z pthread c++)
set(LIBS ${LIBS} /opt/homebrew/Cellar/fltk/1.3.8/lib/libfltk_forms.dylib)
set(LIBS ${LIBS} /opt/homebrew/Cellar/fltk/1.3.8/lib/libfltk_gl.dylib)
set(LIBS ${LIBS} /opt/homebrew/Cellar/fltk/1.3.8/lib/libfltk_images.dylib)
set(LIBS ${LIBS} /opt/homebrew/Cellar/jpeg/9e/lib/libjpeg.dylib)
set(LIBS ${LIBS} /opt/homebrew/Cellar/libpng/1.6.37/lib/libpng.dylib)
set(LIBS ${LIBS} /opt/homebrew/Cellar/fltk/1.3.8/lib/libfltk.dylib)

set(LIBDIR /opt/homebrew/Cellar/jpeg/9e/lib)
set(LIBDIR ${LIBDIR} /opt/homebrew/Cellar/libpng/1.6.37/lib)
set(LIBDIR ${LIBDIR} /opt/homebrew/Cellar/fltk/1.3.8/lib)
link_directories(${LIBDIR})

target_link_libraries(${PROJECT_NAME}
    ${FLTK}
    ${OpenGL}
    ${LIBS}
    ${COCOA})

[C++] ”プログラミング入門” : GUIソースコード修正 Gui.h, Gui.cpp他

[M1 Mac, Big Sur 11.6.7, FLTK 1.3.8, clang 13.0.0, no IDE]

Guiファイルについてはincludeのところを修正しました。

std_lib_facilities.hはストラウストラップ氏のホームページに公開しています。

#ifndef GUI_GUARD
#define GUI_GUARD

#include "Point.h"
#include <FL/Fl_Widget.H>
#include "Window.h"

namespace Graph_lib {
	
typedef void* Address;
typedef void (*Callback)(Address,Address);

template<class W> W& reference_to(Address pw)
{
	return *static_cast<W*>(pw);
}


class Widget {
public:
	Widget(Point xy, int w, int h, const string& s, Callback cb)
		:loc(xy), width(w), height(h), label(s), do_it(cb)
	{ }

	virtual void move(int dx,int dy) { hide(); pw->position(loc.x+=dx, loc.y+=dy); show(); }
	virtual void hide() { pw->hide(); }
	virtual void show() { pw->show(); }
	virtual void attach(Window&) = 0;

	Point loc;
	int width;
	int height;
	string label;
	Callback do_it;

	virtual ~Widget() { }

Gui.h, Gui.cpp 全ソースコード
Window.h, Window.cpp 全ソースコード
Simple_window.h, Point.h, main.cpp 全ソースコード

[C++] ”プログラミング入門” : GUIソースコード修正 Graph.h, Graph.cpp

[M1 Mac, Big Sur 11.6.7, FLTK 1.3.8, clang 13.0.0, no IDE]

最もボリュームがあるのがGraphファイルです。

FLTK1.1に対応した内容なのでFLTK1.3.8が使えるように書き換えました。コードがコメントアウトになっているところは復活させるかもしれないので残しておきました。

C++では自前で用意すべきerror関数がないのはご愛嬌でしょうか。

あれだけの多作家ですからコードのメンテナンスができていないところに人間味を感じます。ただ絶版にはなっていないので出版社含めちゃんとして欲しいですね。

2022/6/17追記:
ストラウストラップ氏HPのsupport code for PPP2 (tar ball)にfltk.hを含むtarがあります。fltk.hはFLTKの各種ヘッダファイルをグループ化したものです。FLTK1.1でもFLTK1.3.8でも同じように使えるはずです。

#ifndef GRAPH_GUARD
#define GRAPH_GUARD 1

#include "Point.h"
#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <iostream>
#include <stdio.h>
#include <vector>
#include <cmath> // コメントアウトになっていた

using std::string; using std::initializer_list;
using std::vector; using std::cout;

// このエラー関数が存在していなかった
void error (const char* message) ;

namespace Graph_lib {
#undef major
#undef minor

struct Color {
	enum Color_type {
		red=FL_RED, blue=FL_BLUE, green=FL_GREEN,
		yellow=FL_YELLOW, white=FL_WHITE, black=FL_BLACK,
		magenta=FL_MAGENTA, cyan=FL_CYAN, dark_red=FL_DARK_RED,
		dark_green=FL_DARK_GREEN, dark_yellow=FL_DARK_YELLOW, dark_blue=FL_DARK_BLUE,
		dark_magenta=FL_DARK_MAGENTA, dark_cyan=FL_DARK_CYAN
	};
	enum Transparency { invisible = 0, visible=255 };

	Color(Color_type cc) :c(Fl_Color(cc)), v(visible) { }
	Color(Color_type cc, Transparency vv) :c(Fl_Color(cc)), v(vv) { }
	Color(int cc) :c(Fl_Color(cc)), v(visible) { }
	Color(Transparency vv) :c(Fl_Color()), v(vv) { }

	int as_int() const { return c; }
	char visibility() const { return v; }
	void set_visibility(Transparency vv) { v=vv; }
private:
	unsigned char v;
	Fl_Color c;
};

Graph.h, Graph.cpp 全ソースコード

[C++] 名著”プログラミング入門”のGUIを作成

[M1 Mac, Big Sur 11.6.7, FLTK 1.3.8, clang 13.0.0, no IDE]

ストラウストラップ氏の名著”プログラミング入門”(原書初版2008年)のGUIソースコード(日本語版P362)が現在の環境では動かないため関連ファイルを修正しました。

ヘッダファイル等はストラウストラップ氏のホームページから入手できます。こちらの方に手を入れました。

50個ほどのエラーを直していく気の遠くなるような作業でしたが、何とか復元できました。S氏はFLTKのインストールと設定は経験者でも難しいと説明しています。確かに普段使いしている私もライブラリの選択などで手間取りましたから、かなりの方が苦労していると思います。

ソースコードは次回以降アップします。

[Obj-C++] Drag & Drop 実装 01 : mouseDownメソッド

Drag & Dropの実装はApple公式ドキュメントのコードが古くなっていることもあり一筋縄ではいきません。一つ一つ解決していきます。

NSString *filePath1, *filePath2; // Assume these exist
 
- (void)mouseDown:(NSEvent *)theEvent
{
    NSImage *dragImage;
    NSPoint dragPosition;
 
    // Write data to the pasteboard
    NSArray *fileList = [NSArray arrayWithObjects:filePath1, filePath2, nil];
    NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
    [pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType]
            owner:nil];
    [pboard setPropertyList:fileList forType:NSFilenamesPboardType];
 
    // Start the drag operation
    dragImage = [[NSWorkspace sharedWorkspace] iconForFile:filePath1];
    dragPosition = [self convertPoint:[theEvent locationInWindow]
                        fromView:nil];
    dragPosition.x -= 16;
    dragPosition.y -= 16;
    [self dragImage:dragImage
            at:dragPosition
            offset:NSZeroSize
            event:theEvent
            pasteboard:pboard
            source:self
            slideBack:YES];
}
警告1
/XlsxConvertor.mm:292:61: warning: 
'NSDragPboard' is deprecated: first deprecated in macOS 10.13 
[-Wdeprecated-declarations]
    NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
                                                            ^~~~~~~~~~~~
                                                            NSPasteboardNameDrag
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:338:32: note: 'NSDragPboard' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardName NSDragPboard API_DEPRECATED_WITH_REPLACEMENT("NSPasteboardNameDrag", macos(10.0,10.13));
                               ^
警告2
/XlsxConvertor.mm:293:51: warning: 'NSFilenamesPboardType' is deprecated: first deprecated in macOS 10.14 - Create multiple pasteboard items with NSPasteboardTypeFileURL or kUTTypeFileURL instead [-Wdeprecated-declarations]
    [pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType]
                                                  ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:312:32: note:
'NSFilenamesPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSFilenamesPboardType API_DEPRECATED("Create multiple pasteboard items with NSPasteboardTypeFileURL or kUTTypeFileURL instead", macos(10.0,10.14));
                               ^
警告3
/XlsxConvertor.mm:295:46: warning: 
'NSFilenamesPboardType' is deprecated: first deprecated in macOS 10.14 
- Create multiple pasteboard items with NSPasteboardTypeFileURL or kUTTypeFileURL instead [-Wdeprecated-declarations]
    [pboard setPropertyList:fileList forType:NSFilenamesPboardType];
                                             ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:312:32: note: 
'NSFilenamesPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSFilenamesPboardType API_DEPRECATED("Create multiple pasteboard items with NSPasteboardTypeFileURL or kUTTypeFileURL instead", macos(10.0,10.14));
                               ^
警告4
/XlsxConvertor.mm:299:26: warning: instance method '-convertPoint:fromView:' not found (return type defaults to 'id') [-Wobjc-method-access]
    dragPosition = [self convertPoint:[theEvent locationInWindow]
                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
注意1
/XlsxConvertor.mm:7:12: note: receiver is instance of class declared here
@interface Window : NSWindow {
           ^
エラー1
/XlsxConvertor.mm:299:18: error: no viable overloaded '='
    dragPosition = [self convertPoint:[theEvent locationInWindow]
    ~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/CoreGraphics.framework/Headers/CGGeometry.h:20:1: note: 
candidate function (the implicit copy assignment operator) not viable: no known conversion from 'id' to 'const CGPoint' for 1st argument
CGPoint {
^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/CoreGraphics.framework/Headers/CGGeometry.h:20:1: note: 
candidate function (the implicit move assignment operator) not viable: no known conversion from 'id' to 'CGPoint' for 1st argument
4 warnings and 1 error generated.

Drag and Drop Programming Topics
Dragging Files

[Swift] UIKitを通して学習する

JavaのSwingやC++のFLTKなどコードだけでGUIアプリを作ってきた私がSwiftUIのようなフレームワークを最初に使うのはどうやら選択ミスだったようです。自分の経歴に合った学習方法を考える必要があります。

SwiftUIではなくUIKitベースのプロジェクトを作成し、Storyboardを使わずにコードだけでGUIを書いていくことにしました。Swiftに関するネット情報が多岐に渡っていて右往左往しましたが、自分に合った学習方法は自分にしか分からないと悟りました。

構成ファイルは以下の3つです。
AppDelegate.swift
SceneDelegate.swift
ViewController.swift

とりあえず定番のHello Worldです。

import UIKit

class ViewController: UIViewController {

    let label = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.white
        label.text = "Hello World"
        label.textAlignment = .center
        view.addSubview(label)
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        label.frame = view.bounds
    }
}

[C++]『ゲームプログラミングC++』Chapter02 Game::LoadData

引き続きGame.cppの読解です。

// 宇宙船、背景2枚の描画設定
void Game::LoadData(){ // Game::Initialize()内で実行
	// 宇宙船の設定
	mShip = new Ship(this);
	mShip->SetPosition(Vector2(100.0f, 384.0f)); // 位置は左側中央とする SetPositionはActorのメンバ関数
	mShip->SetScale(1.5f); // SetScaleはActorのメンバ関数

	// Actor tempをWindowの中心に設定 bgのowner
	Actor* temp = new Actor(this);
	temp->SetPosition(Vector2(512.0f, 384.0f));

	// BGSpriteComponent bgの設定(ownerはtemp,優先度100) 最背面の宇宙
	BGSpriteComponent* bg = new BGSpriteComponent(temp); // SpriteComponent, Componentを継承
	bg->SetScreenSize(Vector2(1024.0f, 768.0f)); // BGSpriteComponent独自のメンバ関数
	std::vector<SDL_Texture*> bgtexs = { // SDLテクスチャのvector配列を作成
		GetTexture("../Assets/Farback01.png"), // GetTextureはGameのメンバ関数
		GetTexture("../Assets/Farback02.png")
	};
	bg->SetBGTextures(bgtexs); // bgにSDLテクスチャをセット
	bg->SetScrollSpeed(-100.0f); // bgのスクロール速度を-100とする
	
	bg = new BGSpriteComponent(temp, 50); // 優先度50のbgを新たに作成 手前の星
	bg->SetScreenSize(Vector2(1024.0f, 768.0f));
	bgtexs = {
		GetTexture("../Assets/Stars.png"),
		GetTexture("../Assets/Stars.png")
	};
	bg->SetBGTextures(bgtexs);
	bg->SetScrollSpeed(-200.0f); // スクロール速度は倍の-200に設定
}

[C++]『ゲームプログラミングC++』Chapter02 Game::UpdateGame

学習経過のメモ書きです。進度チェック用なので私以外には意味のない記事でしょう。

サンプルコードをつぶさにチェックし意味を把握するという地味な作業です。日本語のコメントに書き換えまたは追加しています。

私にとっては新しい分野かつ英語ユーザーが書いたコード&コメントなのでこういった作業をしないとなかなか頭に定着しません。

まあのんびり取り組みます。

void Game::UpdateGame(){
	// 1コマ16ms経過するまでの処理(特になし)
	while (!SDL_TICKS_PASSED(SDL_GetTicks(), mTicksCount + 16)){
	}

	// 1ループ時間を算出
	float deltaTime = (SDL_GetTicks() - mTicksCount) / 1000.0f;
	if (deltaTime > 0.05f){
		deltaTime = 0.05f;
	}

	// SDL初期化からの経過時間
	mTicksCount = SDL_GetTicks();

	// ActorとComponentsのUpdate
	mUpdatingActors = true;
	for (auto actor : mActors){
		actor->Update(deltaTime); 
	}
	mUpdatingActors = false;

	// 保留ActorのmActorsへの追加
	for (auto pending : mPendingActors){
		mActors.emplace_back(pending);
	}
	mPendingActors.clear();

	// EDead状態ActorのdaadActorsへの追加
	std::vector<Actor*> deadActors;
	for (auto actor : mActors){
		if (actor->GetState() == Actor::EDead){
			deadActors.emplace_back(actor);
		}
	}

	// deadActorsのメモリ解放
	for (auto actor : deadActors){
		delete actor;
	}
}

[C++]『ゲームプログラミングC++』Chapter05 Makefile案

[M1 Mac, Big Sur 11.6.5]

完成作ではありませんが、どうやら詰んでしまったようなので記念に上げておきます。

ビルドまでできたものの、実行時にShaderが読めないとかで起動できません。XCodeでも同様でした。

SOIL(Simple OpenGL Image Library)関連でも3つエラーが出ており、該当部分を無効にして無理やりビルドしましたが結局実行できずです。

そもそもSOILの公式サイトは閉鎖されていて、GitHubに有志?の方がアップされているのみで挙動が怪しくなるのも仕方ないと思います。

今はChapter02のコードを自分で書こうとしていますが、Chapter05に着手したらかなりの修正が必要になるでしょう。

今なりに代替策はあるはずなので何とかしたいものです。

# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# フラグ設定
CPPFLAGS = $(shell pkg-config sdl2 --cflags --libs) -std=c++11
CPPFLAGS2 = $(shell pkg-config sdl2_image --cflags --libs)
CPPFLAGS3 = $(shell pkg-config glew --cflags --libs)
CPPFLAGS4 = $(shell pkg-config sdl2_mixer --cflags --libs)
CPPFLAGS5 = $(shell pkg-config sdl2_ttf --cflags --libs)
CPPFLAGS6 = $(shell pkg-config soil --cflags --libs)

LDFLAGS = -lc++ -framework CoreFoundation -framework OpenGL

# includeパス(-I)
INCLUDE = -I./include -I/opt/homebrew/Cellar/sdl2/2.0.20/include -I/opt/homebrew/Cellar/sdl2_image/2.0.5/include \
-I/opt/homebrew/Cellar/glew/2.2.0_1/include -I/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/include \
-I/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/include -I/usr/local/include

# ライブラリパス(-l)
LIBRARY_l = -lsdl2 -lsdl2_image -lglew  -lsdl2_mixer -lsdl2_ttf -lsoil

# 優先ライブラリパス(-L)
LIBRARY_L = -L/opt/homebrew/Cellar/sdl2/2.0.20/lib -L/opt/homebrew/Cellar/sdl2_image/2.0.5/lib \
-L/opt/homebrew/Cellar/glew/2.2.0_1/lib -L/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/lib \
-L/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/lib -L/usr/local/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(shell find $(SRCDIR) -type f)

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(addprefix $(OBJDIR), $(patsubst ./src/%.cpp,/%.o,$(SRCS)))

# 実行ファイル
TARGETDIR = ./bin
TARGET = Game05_01

list : echo $(SRCS) && echo $(OBJS)
	
# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(CPPFLAGS3) $(CPPFLAGS4) $(CPPFLAGS5) $(CPPFLAGS6) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS)

# 全ソース・コンパイル&ビルド
.PHONY:all
all: clean $(OBJS) $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET) $(TARGET).app