Skip to content

Commit 8cd8e3d

Browse files
committed
fix can not redo
1 parent 2e2f9ad commit 8cd8e3d

File tree

20 files changed

+344
-82
lines changed

20 files changed

+344
-82
lines changed

app/src/main/java/com/duy/ccppcompiler/compiler/CompileTask.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import android.os.AsyncTask;
2020
import android.support.annotation.NonNull;
21-
import android.support.annotation.Nullable;
2221

2322
import com.duy.ccppcompiler.compiler.compilers.ICompiler;
2423
import com.duy.ccppcompiler.compiler.manager.ICompileManager;
@@ -36,12 +35,12 @@ public class CompileTask extends AsyncTask<Void, Void, CommandResult> {
3635
private ICompiler mCompiler;
3736
@NonNull
3837
private File[] mFiles;
39-
@Nullable
38+
@NonNull
4039
private ICompileManager mCompileManager;
4140

4241
public CompileTask(@NonNull ICompiler compiler,
4342
@NonNull File[] files,
44-
@Nullable ICompileManager compileManager) {
43+
@NonNull ICompileManager compileManager) {
4544
mCompiler = compiler;
4645
mFiles = files;
4746
mCompileManager = compileManager;
@@ -50,22 +49,17 @@ public CompileTask(@NonNull ICompiler compiler,
5049
@Override
5150
protected void onPreExecute() {
5251
super.onPreExecute();
53-
if (mCompileManager != null) {
54-
mCompileManager.onPrepareCompile();
55-
}
52+
mCompileManager.onPrepareCompile();
5653
}
5754

5855
@Override
5956
protected CommandResult doInBackground(Void... voids) {
60-
return mCompiler.compile(mFiles);
57+
return mCompiler.compile(mFiles, mCompileManager.getLogger());
6158
}
6259

6360
@Override
6461
protected void onPostExecute(CommandResult commandResult) {
6562
super.onPostExecute(commandResult);
66-
if (mCompileManager == null) {
67-
return;
68-
}
6963
if (commandResult.getResultCode() == 0) {
7064
mCompileManager.onCompileSuccess(commandResult);
7165
} else {

app/src/main/java/com/duy/ccppcompiler/compiler/compilers/GCCCompiler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
* Created by Duy on 25-Apr-18.
2727
*/
2828

29-
public class GCCCompiler extends CompilerImpl {
29+
public class GCCCompiler extends NativeCompileImpl {
3030
private static final String GCC_COMPILER_NAME = "gcc";
3131
private ICompileSetting mSetting;
3232

app/src/main/java/com/duy/ccppcompiler/compiler/compilers/GPlusPlusCompiler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
* G++ compiler as GCC compiler but it different name, just override {@link #getCompilerProgram()}
2626
* Created by Duy on 25-Apr-18.
2727
*/
28-
public class GPlusPlusCompiler extends CompilerImpl {
28+
public class GPlusPlusCompiler extends NativeCompileImpl {
2929
private static final String G_PLUS_PLUS_COMPILER_NAME = "g++-4.9";
3030
private ICompileSetting mSetting;
3131

app/src/main/java/com/duy/ccppcompiler/compiler/compilers/ICompiler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import android.support.annotation.WorkerThread;
2020

2121
import com.duy.ccppcompiler.compiler.shell.CommandResult;
22+
import com.duy.ide.logging.ILogger;
2223

2324
import java.io.File;
2425

@@ -28,6 +29,6 @@
2829

2930
public interface ICompiler {
3031
@WorkerThread
31-
CommandResult compile(File[] sourceFiles);
32+
CommandResult compile(File[] sourceFiles, ILogger logger);
3233

3334
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.duy.ccppcompiler.compiler.compilers;
2+
3+
import android.support.v4.util.ArraySet;
4+
import android.support.v4.util.Pair;
5+
6+
import org.apache.commons.io.IOUtils;
7+
8+
import java.io.File;
9+
import java.io.FileInputStream;
10+
import java.io.IOException;
11+
import java.util.ArrayList;
12+
import java.util.Set;
13+
import java.util.regex.Pattern;
14+
15+
public class LinkerFlagsDetector {
16+
public static final LinkerFlagsDetector INSTANCE = new LinkerFlagsDetector();
17+
private static final Pattern FILE_NAME = Pattern.compile("[A-Za-z_.][A-Za-z0-9_.]+");
18+
//-lSDL2
19+
private static final Pattern INCLUDE_SDL = Pattern.compile("#include\\s+[<\"]SDL.h[>\"]");
20+
//-lGLESv1_CM
21+
private static final Pattern INCLUDE_GLESV1_CM
22+
= Pattern.compile("#include\\s+[<\"]GLES/(" + FILE_NAME.pattern() + ")[>\"]");
23+
24+
//-landroid
25+
private static final Pattern INCLUDE_ANDROID
26+
= Pattern.compile("#include\\s+[<\"]android/(" + FILE_NAME.pattern() + ")[>\"]");
27+
//-llog
28+
private static final Pattern INCLUDE_ANDROID_LOG
29+
= Pattern.compile("#include\\s+[<\"]<android/log.h>[>\"]");
30+
//-lEGL
31+
private static final Pattern INCLUDE_EGL
32+
= Pattern.compile("#include\\s+[<\"]EGL/(" + FILE_NAME.pattern() + ")[>\"]");
33+
//-latomic
34+
private static final Pattern INCLUDE_ATOMIC = Pattern.compile("#include\\s+[<\"]atomic.h[>\"]");
35+
//-latomic
36+
private static final Pattern INCLUDE_MATH = Pattern.compile("#include\\s+[<\"]math.h[>\"]");
37+
38+
39+
private static final ArrayList<Pair<Pattern, String>> PATTERNS;
40+
41+
static {
42+
PATTERNS = new ArrayList<>();
43+
PATTERNS.add(new Pair<>(INCLUDE_SDL, "-lSDL2"));
44+
PATTERNS.add(new Pair<>(INCLUDE_ANDROID, "-landroid"));
45+
PATTERNS.add(new Pair<>(INCLUDE_ANDROID_LOG, "-llog"));
46+
PATTERNS.add(new Pair<>(INCLUDE_EGL, "-lEGL"));
47+
PATTERNS.add(new Pair<>(INCLUDE_MATH, "-lm"));
48+
PATTERNS.add(new Pair<>(INCLUDE_GLESV1_CM, "-lGLESv1_CM"));
49+
PATTERNS.add(new Pair<>(INCLUDE_ATOMIC, "-latomic"));
50+
51+
}
52+
53+
private LinkerFlagsDetector() {
54+
55+
}
56+
57+
@SuppressWarnings("ConstantConditions")
58+
public Set<String> detect(File[] srcFiles) throws IOException {
59+
Set<String> ldFlags = new ArraySet<>();
60+
for (File srcFile : srcFiles) {
61+
final FileInputStream input = new FileInputStream(srcFile);
62+
final String content = IOUtils.toString(input);
63+
input.close();
64+
65+
for (Pair<Pattern, String> pattern : PATTERNS) {
66+
if (pattern.first.matcher(content).find()) {
67+
ldFlags.add(pattern.second);
68+
}
69+
}
70+
}
71+
return ldFlags;
72+
}
73+
}

app/src/main/java/com/duy/ccppcompiler/compiler/compilers/CompilerImpl.java renamed to app/src/main/java/com/duy/ccppcompiler/compiler/compilers/NativeCompileImpl.java

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,17 @@
2727
import com.duy.ccppcompiler.compiler.shell.Shell;
2828
import com.duy.ccppcompiler.packagemanager.Environment;
2929
import com.duy.common.DLog;
30+
import com.duy.ide.logging.ILogger;
3031
import com.pdaxrom.utils.Utils;
3132

3233
import java.io.File;
34+
import java.io.IOException;
35+
import java.util.Set;
3336

3437
/**
3538
* Created by Duy on 18-May-18.
3639
*/
37-
public abstract class CompilerImpl implements ICompiler {
40+
public abstract class NativeCompileImpl implements ICompiler {
3841
public static final int BUILD_EXECUTABLE = 0b0001;
3942
public static final int BUILD_NATIVE_ACTIVITY = 0b0010;
4043
public static final int BUILD_SDL_ACTIVITY = 0b0100;
@@ -46,29 +49,34 @@ public abstract class CompilerImpl implements ICompiler {
4649
private int mBuildType;
4750
private OutputScope output;
4851

49-
CompilerImpl(Context context, int buildType) {
52+
NativeCompileImpl(Context context, int buildType) {
5053
mContext = context;
5154
mBuildType = buildType;
5255
}
5356

5457
@NonNull
55-
protected CommandResult exec(@NonNull Context context, @NonNull String workingDir, @NonNull String cmd) {
58+
private CommandResult exec(@NonNull Context context, @NonNull String workingDir, @NonNull String cmd) {
5659
return Shell.exec(context, workingDir, cmd);
5760
}
5861

5962
@Override
60-
public CommandResult compile(File[] sourceFiles) {
63+
public CommandResult compile(File[] sourceFiles, ILogger logger) {
6164
clean();
6265

6366
//current version support single file
6467
File sourceFile = sourceFiles[0];
6568

6669
//gcc or g++
67-
ArgumentBuilder command = new ArgumentBuilder(getCompilerProgram());
70+
ArgumentBuilder argumentBuilder = new ArgumentBuilder(getCompilerProgram());
6871
String args = buildArgs(sourceFiles);
69-
command.addFlags(args);
72+
argumentBuilder.addFlags(args);
7073

71-
CompileResult result = new CompileResult(exec(mContext, sourceFile.getParent(), command.build()));
74+
final String cmd = argumentBuilder.build();
75+
if (logger != null) {
76+
logger.verbose("Compiler argument: " + cmd);
77+
}
78+
79+
CompileResult result = new CompileResult(exec(mContext, sourceFile.getParent(), cmd));
7280
if (result.getResultCode() == RESULT_NO_ERROR) {
7381
result.setOutput(getOutput());
7482
result.setType(mBuildType);
@@ -84,7 +92,7 @@ protected void clean() {
8492
Utils.emptyDirectory(new File(Environment.getSdCardTmpDir()));
8593
}
8694

87-
protected String buildArgs(File[] sourceFiles) {
95+
private String buildArgs(File[] sourceFiles) {
8896
ArgumentBuilder args = new ArgumentBuilder();
8997
for (File sourceFile : sourceFiles) {
9098
args.addFlags(sourceFile.getAbsolutePath());
@@ -98,15 +106,28 @@ protected String buildArgs(File[] sourceFiles) {
98106
buildNativeActivityFlags(args, sourceFiles);
99107
break;
100108
case BUILD_SDL_ACTIVITY:
109+
buildSDLActivity(args, sourceFiles);
101110
break;
102111
case BUILD_MAKE:
103-
break;
112+
//nothing to do
113+
return "";
104114
}
105115
addUserSettingFlags(args);
106116
addDefaultLdFlags(args);
117+
resolveLdFlagsFromSource(args, sourceFiles);
107118
return args.build();
108119
}
109120

121+
private void resolveLdFlagsFromSource(ArgumentBuilder args, File[] sourceFiles) {
122+
LinkerFlagsDetector detector = LinkerFlagsDetector.INSTANCE;
123+
try {
124+
final Set<String> detect = detector.detect(sourceFiles);
125+
args.addFlags(detect);
126+
} catch (IOException e) {
127+
e.printStackTrace();
128+
}
129+
}
130+
110131
protected void addUserSettingFlags(ArgumentBuilder args) {
111132

112133
}
@@ -142,9 +163,28 @@ private void buildNativeActivityFlags(ArgumentBuilder args, File[] sourceFiles)
142163
.addFlags("-shared")
143164
.addFlags("-Wl,--no-undefined")
144165
.addFlags("-Wl,-z,noexecstack")
145-
.addFlags("-llog") //lib log
146-
.addFlags("-landroid") //android
147-
.addFlags("-lm")
166+
// .addFlags("-llog") //lib log
167+
// .addFlags("-landroid") //android
168+
// .addFlags("-lm")
169+
.addFlags("-o", outputScope.getBinaryFile().getAbsolutePath());
170+
}
171+
172+
private void buildSDLActivity(ArgumentBuilder args, File[] sourceFiles) {
173+
File source = sourceFiles[0];
174+
String nameNoExt = source.getName().substring(0, source.getName().lastIndexOf("."));
175+
176+
if (DLog.DEBUG) DLog.d(TAG, "buildArgs: build native activity");
177+
String soName = "lib" + nameNoExt + ".so";
178+
OutputScope outputScope = new OutputScope(new File(source.getParent(), soName));
179+
setOutput(outputScope);
180+
181+
final String sdCardHomeDir = Environment.getSdCardHomeDir();
182+
args.addFlags("-DANDROID")
183+
.addFlags("-I" + sdCardHomeDir + "/SDL/include")
184+
.addFlags("-shared")
185+
.addFlags(sdCardHomeDir + "/SDL/lib/SDL_android_main.o")
186+
.addFlags("-L" + sdCardHomeDir + "SDL/lib")
187+
.addFlags("-lSDL2")
148188
.addFlags("-o", outputScope.getBinaryFile().getAbsolutePath());
149189
}
150190

app/src/main/java/com/duy/ccppcompiler/compiler/manager/CompileManager.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import android.app.NativeActivity;
2121
import android.content.Intent;
2222

23-
import com.duy.ccppcompiler.compiler.compilers.CompilerImpl;
23+
import com.duy.ccppcompiler.compiler.compilers.NativeCompileImpl;
2424
import com.duy.ccppcompiler.compiler.model.CompileResult;
2525
import com.duy.ccppcompiler.compiler.model.OutputScope;
2626
import com.duy.ccppcompiler.compiler.shell.CommandResult;
@@ -61,7 +61,7 @@ public void onCompileSuccess(CommandResult result) {
6161
}
6262

6363
switch (((CompileResult) result).getType()) {
64-
case CompilerImpl.BUILD_SDL_ACTIVITY: {
64+
case NativeCompileImpl.BUILD_SDL_ACTIVITY: {
6565
File binaryFile = output.getBinaryFile();
6666
Intent intent = getActivity().getPackageManager().getLaunchIntentForPackage("com.duy.c.cpp.compiler.sdlplugin");
6767
if (intent != null) {
@@ -72,7 +72,7 @@ public void onCompileSuccess(CommandResult result) {
7272
}
7373
break;
7474
}
75-
case CompilerImpl.BUILD_NATIVE_ACTIVITY: {
75+
case NativeCompileImpl.BUILD_NATIVE_ACTIVITY: {
7676
File internalBinary;
7777
try {
7878
internalBinary = copyToTmpExeDirAndSetExecutable(output.getBinaryFile());
@@ -88,7 +88,7 @@ public void onCompileSuccess(CommandResult result) {
8888
getActivity().startActivity(intent);
8989
break;
9090
}
91-
case CompilerImpl.BUILD_EXECUTABLE:
91+
case NativeCompileImpl.BUILD_EXECUTABLE:
9292
try {
9393
File binaryFile = output.getBinaryFile();
9494
File internalBinary = copyToTmpExeDirAndSetExecutable(binaryFile);

app/src/main/java/com/duy/ccppcompiler/compiler/manager/CompileManagerImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.duy.common.DLog;
3333
import com.duy.ide.core.IdeActivity;
3434
import com.duy.ide.diagnostic.DiagnosticPresenter;
35+
import com.duy.ide.logging.ILogger;
3536
import com.jecelyin.common.utils.UIUtils;
3637
import com.jecelyin.editor.v2.widget.menu.MenuDef;
3738

@@ -95,6 +96,11 @@ public void onCompileFailed(CommandResult compileResult) {
9596
if (DLog.DEBUG) DLog.w(TAG, "onCompileFailed: \n" + compileResult.getMessage());
9697
}
9798

99+
@Override
100+
public ILogger getLogger() {
101+
return mDiagnosticPresenter;
102+
}
103+
98104
@CallSuper
99105
@Override
100106
public void onCompileSuccess(CommandResult commandResult) {

app/src/main/java/com/duy/ccppcompiler/compiler/manager/ICompileManager.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
package com.duy.ccppcompiler.compiler.manager;
1919

2020
import android.support.annotation.MainThread;
21+
import android.support.annotation.Nullable;
2122

2223
import com.duy.ccppcompiler.compiler.shell.CommandResult;
24+
import com.duy.ide.logging.ILogger;
2325

2426
import java.io.File;
2527

@@ -56,4 +58,6 @@ public interface ICompileManager {
5658
@MainThread
5759
void onCompileFailed(CommandResult compileResult);
5860

61+
@Nullable
62+
ILogger getLogger();
5963
}

app/src/main/java/com/duy/ccppcompiler/compiler/shell/ArgumentBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
import java.util.ArrayList;
2222
import java.util.Arrays;
23-
import java.util.List;
23+
import java.util.Collection;
2424

2525
/**
2626
* Created by Duy on 17-May-18.
@@ -43,7 +43,7 @@ public ArgumentBuilder addFlags(String... flags) {
4343
return this;
4444
}
4545

46-
public ArgumentBuilder addFlags(List<String> flags) {
46+
public ArgumentBuilder addFlags(Collection<String> flags) {
4747
this.flags.addAll(flags);
4848
return this;
4949
}

0 commit comments

Comments
 (0)