• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*******************************************************************************
2  * Copyright 2011 See AUTHORS file.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  ******************************************************************************/
16 
17 package com.badlogic.gdx.jnigen;
18 
19 /** Defines the configuration for building a native shared library for a specific platform. Used with {@link AntScriptGenerator} to
20  * create Ant build files that invoke the compiler toolchain to create the shared libraries. */
21 public class BuildTarget {
22 	/** The target operating system of a build target. */
23 	public enum TargetOs {
24 		Windows, Linux, MacOsX, Android, IOS
25 	}
26 
27 	/** the target operating system **/
28 	public BuildTarget.TargetOs os;
29 	/** whether this is a 64-bit build, not used for Android **/
30 	public boolean is64Bit;
31 	/** the C files and directories to be included in the build, accepts Ant path format, must not be null **/
32 	public String[] cIncludes;
33 	/** the C files and directories to be excluded from the build, accepts Ant path format, must not be null **/
34 	public String[] cExcludes;
35 	/** the C++ files and directories to be included in the build, accepts Ant path format, must not be null **/
36 	public String[] cppIncludes;
37 	/** the C++ files and directories to be excluded from the build, accepts Ant path format, must not be null **/
38 	public String[] cppExcludes;
39 	/** the directories containing headers for the build, must not be null **/
40 	public String[] headerDirs;
41 	/** prefix for the compiler (g++, gcc), useful for cross compilation, must not be null **/
42 	public String compilerPrefix;
43 	/** the flags passed to the C compiler, must not be null **/
44 	public String cFlags;
45 	/** the flags passed to the C++ compiler, must not be null **/
46 	public String cppFlags;
47 	/** the flags passed to the linker, must not be null **/
48 	public String linkerFlags;
49 	/** the name of the generated build file for this target, defaults to "build-${target}(64)?.xml", must not be null **/
50 	public String buildFileName;
51 	/** whether to exclude this build target from the master build file, useful for debugging **/
52 	public boolean excludeFromMasterBuildFile = false;
53 	/** Ant XML executed in a target before compilation **/
54 	public String preCompileTask;
55 	/** Ant Xml executed in a target after compilation **/
56 	public String postCompileTask;
57 	/** the libraries to be linked to the output, specify via e.g. -ldinput -ldxguid etc. **/
58 	public String libraries;
59 	/** The name used for folders for this specific target. Defaults to "${target}(64)" **/
60 	public String osFileName;
61 	/** The name used for the library file. This is a full file name, including file extension. Default is platform specific.
62 	 *  E.g. "lib{sharedLibName}64.so" **/
63 	public String libName;
64 
65 	/** Creates a new build target. See members of this class for a description of the parameters. */
BuildTarget(BuildTarget.TargetOs targetType, boolean is64Bit, String[] cIncludes, String[] cExcludes, String[] cppIncludes, String[] cppExcludes, String[] headerDirs, String compilerPrefix, String cFlags, String cppFlags, String linkerFlags)66 	public BuildTarget (BuildTarget.TargetOs targetType, boolean is64Bit, String[] cIncludes, String[] cExcludes,
67 		String[] cppIncludes, String[] cppExcludes, String[] headerDirs, String compilerPrefix, String cFlags, String cppFlags,
68 		String linkerFlags) {
69 		if (targetType == null) throw new IllegalArgumentException("targetType must not be null");
70 		if (cIncludes == null) cIncludes = new String[0];
71 		if (cExcludes == null) cExcludes = new String[0];
72 		if (cppIncludes == null) cppIncludes = new String[0];
73 		if (cppExcludes == null) cppExcludes = new String[0];
74 		if (headerDirs == null) headerDirs = new String[0];
75 		if (compilerPrefix == null) compilerPrefix = "";
76 		if (cFlags == null) cFlags = "";
77 		if (cppFlags == null) cppFlags = "";
78 		if (linkerFlags == null) linkerFlags = "";
79 
80 		this.os = targetType;
81 		this.is64Bit = is64Bit;
82 		this.cIncludes = cIncludes;
83 		this.cExcludes = cExcludes;
84 		this.cppIncludes = cppIncludes;
85 		this.cppExcludes = cppExcludes;
86 		this.headerDirs = headerDirs;
87 		this.compilerPrefix = compilerPrefix;
88 		this.cFlags = cFlags;
89 		this.cppFlags = cppFlags;
90 		this.linkerFlags = linkerFlags;
91 		this.libraries = "";
92 	}
93 
94 	/** Creates a new default BuildTarget for the given OS, using common default values. */
newDefaultTarget(BuildTarget.TargetOs type, boolean is64Bit)95 	public static BuildTarget newDefaultTarget (BuildTarget.TargetOs type, boolean is64Bit) {
96 		if (type == TargetOs.Windows && !is64Bit) {
97 			// Windows 32-Bit
98 			return new BuildTarget(TargetOs.Windows, false, new String[] {"**/*.c"}, new String[0], new String[] {"**/*.cpp"},
99 				new String[0], new String[0], "i686-w64-mingw32-", "-c -Wall -O2 -mfpmath=sse -msse2 -fmessage-length=0 -m32",
100 				"-c -Wall -O2 -mfpmath=sse -msse2 -fmessage-length=0 -m32",
101 				"-Wl,--kill-at -shared -m32 -static -static-libgcc -static-libstdc++");
102 		}
103 
104 		if (type == TargetOs.Windows && is64Bit) {
105 			// Windows 64-Bit
106 			return new BuildTarget(TargetOs.Windows, true, new String[] {"**/*.c"}, new String[0], new String[] {"**/*.cpp"},
107 				new String[0], new String[0], "x86_64-w64-mingw32-", "-c -Wall -O2 -mfpmath=sse -msse2 -fmessage-length=0 -m64",
108 				"-c -Wall -O2 -mfpmath=sse -msse2 -fmessage-length=0 -m64",
109 				"-Wl,--kill-at -shared -static -static-libgcc -static-libstdc++ -m64");
110 		}
111 
112 		if (type == TargetOs.Linux && !is64Bit) {
113 			// Linux 32-Bit
114 			return new BuildTarget(TargetOs.Linux, false, new String[] {"**/*.c"}, new String[0], new String[] {"**/*.cpp"},
115 				new String[0], new String[0], "", "-c -Wall -O2 -mfpmath=sse -msse -fmessage-length=0 -m32 -fPIC",
116 				"-c -Wall -O2 -mfpmath=sse -msse -fmessage-length=0 -m32 -fPIC", "-shared -m32");
117 		}
118 
119 		if (type == TargetOs.Linux && is64Bit) {
120 			// Linux 64-Bit
121 			return new BuildTarget(TargetOs.Linux, true, new String[] {"**/*.c"}, new String[0], new String[] {"**/*.cpp"},
122 				new String[0], new String[0], "", "-c -Wall -O2 -mfpmath=sse -msse -fmessage-length=0 -m64 -fPIC",
123 				"-c -Wall -O2 -mfpmath=sse -msse -fmessage-length=0 -m64 -fPIC", "-shared -m64 -Wl,-wrap,memcpy");
124 		}
125 
126 		if (type == TargetOs.MacOsX && !is64Bit) {
127 			// Mac OS X x86 & x86_64
128 			BuildTarget mac = new BuildTarget(TargetOs.MacOsX, false, new String[] {"**/*.c"}, new String[0],
129 				new String[] {"**/*.cpp"}, new String[0], new String[0], "",
130 				"-c -Wall -O2 -arch i386 -DFIXED_POINT -fmessage-length=0 -fPIC -mmacosx-version-min=10.5",
131 				"-c -Wall -O2 -arch i386 -DFIXED_POINT -fmessage-length=0 -fPIC -mmacosx-version-min=10.5",
132 				"-shared -arch i386 -mmacosx-version-min=10.5");
133 			return mac;
134 		}
135 
136 		if (type == TargetOs.MacOsX && is64Bit) {
137 			// Mac OS X x86 & x86_64
138 			BuildTarget mac = new BuildTarget(TargetOs.MacOsX, true, new String[] {"**/*.c"}, new String[0],
139 				new String[] {"**/*.cpp"}, new String[0], new String[0], "",
140 				"-c -Wall -O2 -arch x86_64 -DFIXED_POINT -fmessage-length=0 -fPIC -mmacosx-version-min=10.5",
141 				"-c -Wall -O2 -arch x86_64 -DFIXED_POINT -fmessage-length=0 -fPIC -mmacosx-version-min=10.5",
142 				"-shared -arch x86_64 -mmacosx-version-min=10.5");
143 			return mac;
144 		}
145 
146 		if (type == TargetOs.Android) {
147 			BuildTarget android = new BuildTarget(TargetOs.Android, false, new String[] {"**/*.c"}, new String[0],
148 				new String[] {"**/*.cpp"}, new String[0], new String[0], "", "-O2 -Wall -D__ANDROID__", "-O2 -Wall -D__ANDROID__",
149 				"-lm");
150 			return android;
151 		}
152 
153 		if(type == TargetOs.IOS) {
154 			// iOS, 386 simulator and armv7a, compiled to fat static lib
155 			BuildTarget ios = new BuildTarget(TargetOs.IOS, false, new String[] {"**/*.c"}, new String[0],
156 				new String[] {"**/*.cpp"}, new String[0], new String[0], "",
157 				"-c -Wall -O2",
158 				"-c -Wall -O2",
159 				"rcs");
160 			return ios;
161 		}
162 
163 		throw new RuntimeException("Unknown target type");
164 	}
165 }
166