From cb87c461be45bc0d296339a8d36fc61c2bbb35f4 Mon Sep 17 00:00:00 2001
From: Francesco Bariatti <francesco.bariatti@insa-rennes.fr>
Date: Mon, 16 May 2016 22:07:47 +0200
Subject: [PATCH] Changed makefile to include GUI: a make run command allow to
 run the program. Small changes in GUI to allow compilation and execution

---
 GUI/src/controller/Controller.java |  11 ++-
 GUI/src/main/Main.java             |  13 ++--
 Makefile                           | 118 ++++++++++++++++++++++-------
 3 files changed, 103 insertions(+), 39 deletions(-)

diff --git a/GUI/src/controller/Controller.java b/GUI/src/controller/Controller.java
index 872cead..3e427ff 100644
--- a/GUI/src/controller/Controller.java
+++ b/GUI/src/controller/Controller.java
@@ -18,7 +18,6 @@ import sun.audio.AudioPlayer;
 import sun.audio.AudioStream;
 import view.TileView;
 
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
@@ -30,9 +29,9 @@ import java.util.ResourceBundle;
 
 public class Controller implements Initializable
 {
-	private static final String iaProgramPath = "../bin/penguin";
-	private static final String introMusicFile = "./resource/pingu_theme.wav";
-	private static final String clickSoundFile = "./resource/clic.wav";
+	public static String iaProgramPath = "bin/penguin";
+	public static String introMusicFile = "resource/pingu_theme.wav";
+	public static String clickSoundFile = "resource/clic.wav";
 	private static final int max1Fish = 30, max2Fish = 20, max3Fish = 10;
 
 	private GameState gameState;
@@ -94,7 +93,7 @@ public class Controller implements Initializable
 		new Thread(() -> {
 			try
 			{
-				AudioPlayer.player.start(new AudioStream(new FileInputStream(introMusicFile)));
+				AudioPlayer.player.start(new AudioStream(getClass().getClassLoader().getResourceAsStream(introMusicFile)));
 			} catch (IOException e)
 			{
 				e.printStackTrace();
@@ -286,7 +285,7 @@ public class Controller implements Initializable
 		{
 			try
 			{
-				AudioPlayer.player.start(new AudioStream(new FileInputStream(clickSoundFile)));
+				AudioPlayer.player.start(new AudioStream(getClass().getClassLoader().getResourceAsStream(clickSoundFile)));
 			} catch (IOException e)
 			{
 				e.printStackTrace();
diff --git a/GUI/src/main/Main.java b/GUI/src/main/Main.java
index 0a6f66f..f29a1f9 100644
--- a/GUI/src/main/Main.java
+++ b/GUI/src/main/Main.java
@@ -1,15 +1,11 @@
 package main;
 
+import controller.Controller;
 import javafx.application.Application;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Scene;
 import javafx.scene.layout.BorderPane;
 import javafx.stage.Stage;
-import sun.audio.AudioPlayer;
-import sun.audio.AudioStream;
-
-import java.io.FileInputStream;
-import java.io.InputStream;
 
 
 public class Main extends Application
@@ -17,7 +13,10 @@ public class Main extends Application
 
 	public static void main(String[] args)
 	{
-		launch(args);
+		if(args.length < 1)
+			throw new RuntimeException("You must pass the path to the AI program as argument");
+		Controller.iaProgramPath = args[0];
+		launch();
 	}
 
 	@Override
@@ -26,7 +25,7 @@ public class Main extends Application
 		try
 		{
 			FXMLLoader loader = new FXMLLoader();
-			loader.setLocation(Main.class.getResource("../view/view.fxml"));
+			loader.setLocation(getClass().getClassLoader().getResource("view/view.fxml"));
 			BorderPane root = (BorderPane) loader.load();
 			Scene scene = new Scene(root);
 			primaryStage.setScene(scene);
diff --git a/Makefile b/Makefile
index dd2fa52..60bf18c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,42 +1,108 @@
-# Compiler
-CC=g++
+# Makefile for the Penguin game project.
+# This project is composed of two modules: AI(Artificial Intelligence), that manage the game, and GUI that allows you to play it
+# To compile the AI run 'make ai'; it is written in C++.
+# To compile the GUI run 'make gui'; it is written in java and javafx.
+# To compile everything run 'make all' or 'make'.
+# To run the GUI (that will launch the AI) run 'make run'.
+# Run 'make clean' to delete compiled files and programs. 'make cleanai' and 'make cleangui' also exist
+
+# COMPILERS AND PROGRAMS
+# Compiler for the AI: g++ >= 4.9
+CC = g++
+# JAVA ENVIRONMENT FOR THE GUI
+# Java compiler >= 1.8
+JAVAC = javac
+# Java jar utility
+JAR = jar
+# Java executable used for the run target >= 1.8
+JAVA = java
+
+all: ai gui
+
+clean: aiclean guiclean
+
+# ============================================ AI (C++) =============================================
+#Root directory for the AI module
+AIRoot = AI
 # Output directory
-BIN=bin
+AIOutputDir = $(AIRoot)/bin
 # Name of the executable
-EXECUTABLE=$(BIN)/penguin
+AIExecutable = $(AIOutputDir)/penguin
+# Source files directory
+AISRC = $(AIRoot)/src
 # Directories with .h files
-INCLUDE=-I src/game -I src/util -I src/monte_carlo -I src/mcts -I src/json
+AIInclude=-I $(AISRC)/game -I $(AISRC)/util -I $(AISRC)/monte_carlo -I $(AISRC)/mcts -I $(AISRC)/json
+# Cpp source files
+AISourceFile = omp_util.cpp fast_log.cpp display_node.cpp penguin.cpp test_two_players_game.cpp monte_carlo.cpp \
+	test_fast_log.cpp statistics.cpp node.cpp allocator.cpp test_allocator.cpp openings.cpp mcts_two_players.cpp \
+	test_mcts_two_players.cpp bits.cpp test_bits.cpp main.cpp
 # Directories in which make will search for files
-vpath %.cpp src/game src/main src/util src/monte_carlo src/mcts src/gdl
+vpath %.cpp $(AISRC)/game $(AISRC)/main $(AISRC)/util $(AISRC)/monte_carlo $(AISRC)/mcts $(AISRC)/gdl
 # Flags passed to the compiler
 CFLAGS=-g -O3 -ffast-math -fopenmp -Wall -std=c++11
 # Flags passed to the linker
 LDFLAGS=-fopenmp -std=c++11 #-lprofiler -Wl,-no_pie
-# Cpp source files
-SOURCES=omp_util.cpp fast_log.cpp display_node.cpp penguin.cpp test_two_players_game.cpp monte_carlo.cpp \
-	test_fast_log.cpp statistics.cpp node.cpp allocator.cpp test_allocator.cpp openings.cpp mcts_two_players.cpp \
-	test_mcts_two_players.cpp bits.cpp test_bits.cpp main.cpp
 # Generating .o files' names
-OBJECTS=$(addprefix $(BIN)/, $(SOURCES:.cpp=.o))
+AIOobjects=$(addprefix $(AIOutputDir)/, $(AISourceFile:.cpp=.o))
 
-# ========= RULES ============
+# ==== RULES ====
+# Main rule for creating the executable
+ai: aioutputdir $(AIExecutable)
+aioutputdir:
+	mkdir -p $(AIOutputDir)
 
-# Creates the output directory and the executable
-all: bindir $(EXECUTABLE)
-
-# Creates the output directory if it doesn't exist
-bindir:
-	mkdir -p $(BIN)
-
-$(EXECUTABLE): $(OBJECTS)
-	$(CC) $(LDFLAGS) $(OBJECTS) -o $@
+$(AIExecutable): $(AIOobjects)
+	$(CC) $(LDFLAGS) $(AIOobjects) -o $@
 
 # Creates .o files with automatic generation of dependencies (.d) files
-$(BIN)/%.o: %.cpp
-	$(CC) -c $(CFLAGS) $(INCLUDE) -MD -MP $< -o $@
+$(AIOutputDir)/%.o: %.cpp
+	$(CC) -c $(CFLAGS) $(AIInclude) -MD -MP $< -o $@
 # Include the dependency files into the makefile
--include $(OBJECTS:.o=.d)
+-include $(AIOobjects:.o=.d)
 
 # Deletes .o, .d and the executable
-clean:
-	rm -f $(BIN)/*.o $(BIN)/*.d $(EXECUTABLE)
+aiclean:
+	rm -f $(AIOutputDir)/*.o $(AIOutputDir)/*.d $(AIExecutable)
+
+# ============================================ GUI (Java) =============================================
+#Root directory of the GUI module
+GUIRoot = GUI
+# Output directory
+GUIOutputDir = $(GUIRoot)/bin
+# Name of the output jar
+GUIOutputJar = $(GUIOutputDir)/penguin.jar
+# Directory with all the java sources
+GUISourceDir = $(GUIRoot)/src
+vpath %.java $(GUISourceDir)
+# Path to the JSON lib
+GUIJSONJar = $(GUIRoot)/json-20160212.jar
+# Classes needed in the projet (in the form: package/className)
+GUIClasses = model/GameState model/Move model/Player model/Tile view/TileView controller/Controller controller/UpdateThread main/Main
+# Resources that will be included in the jar (they will be appended to the jar creation command. See man for the -C option that will allow to specify a relative path inside the jar)
+GUIJarResources = -C $(GUISourceDir) view/view.fxml -C $(GUISourceDir) resource/clic.wav -C $(GUISourceDir) resource/pingu_theme.wav
+
+# Output directory of compiled classes
+GUIClassesOutDir = $(GUIOutputDir)/classes
+# Classpath used for compiling
+GUICompileClasspath = $(GUIJSONJar):$(GUIClassesOutDir)
+# Classpath used for running
+GUIRunClasspath = $(GUIOutputJar):$(GUIJSONJar)
+
+# ==== RULES ====
+# Main rule for creating the jar of the GUI: it needs the output folder and all the compiled classes
+gui: guioutputdir $(addsuffix .class, $(GUIClasses))
+	$(JAR) cvfe $(GUIOutputJar) main.Main -C $(GUIClassesOutDir) ./ $(GUIJarResources)
+guioutputdir:
+	mkdir -p $(GUIOutputDir)
+
+# Rule for compiling a java class
+%.class: %.java guiclassesoutdir
+	$(JAVAC) -sourcepath $(GUISourceDir) -classpath $(GUICompileClasspath) -d $(GUIClassesOutDir)  $<
+guiclassesoutdir:
+	mkdir -p $(GUIClassesOutDir)
+
+run:
+	$(JAVA) -classpath $(GUIRunClasspath) main.Main $(AIExecutable)
+
+guiclean:
+	rm -r $(GUIOutputDir)
-- 
GitLab