Update app.py
Browse files
app.py
CHANGED
@@ -30,8 +30,20 @@ def check_dependencies():
|
|
30 |
missing_deps.append("nuitka")
|
31 |
|
32 |
# Check for MinGW-w64 (needed for Windows cross-compilation)
|
33 |
-
|
34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
missing_deps.append("mingw-w64")
|
36 |
|
37 |
# Check for patchelf (usually available in HF Spaces)
|
@@ -138,18 +150,25 @@ def install_nuitka_if_missing():
|
|
138 |
def check_mingw_installation():
|
139 |
"""Check if MinGW-w64 is properly installed"""
|
140 |
mingw_compilers = [
|
141 |
-
"x86_64-w64-mingw32-gcc",
|
142 |
-
"x86_64-w64-mingw32-g++",
|
143 |
-
"x86_64-w64-mingw32-ld"
|
|
|
|
|
|
|
144 |
]
|
145 |
|
|
|
146 |
missing = []
|
147 |
-
|
|
|
148 |
result = subprocess.run(["which", compiler], capture_output=True)
|
149 |
-
if result.returncode
|
150 |
-
|
|
|
|
|
151 |
|
152 |
-
return missing
|
153 |
|
154 |
def find_compiled_binary(output_dir, output_filename):
|
155 |
"""Find the compiled binary, checking different possible paths"""
|
@@ -216,11 +235,19 @@ Add this to your requirements.txt and redeploy the space."""
|
|
216 |
|
217 |
# Check for Windows cross-compilation requirements
|
218 |
if output_extension == ".exe":
|
219 |
-
missing_mingw = check_mingw_installation()
|
220 |
-
if
|
221 |
-
if
|
222 |
-
log_queue.put(f"
|
223 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
224 |
|
225 |
# Check if static libpython is available
|
226 |
has_static_libpython = check_static_libpython()
|
@@ -341,15 +368,52 @@ Add this to your requirements.txt and redeploy the space."""
|
|
341 |
|
342 |
# Add Windows-specific options using MinGW-w64
|
343 |
if output_extension == ".exe":
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
353 |
|
354 |
# Run compilation
|
355 |
if progress_callback:
|
@@ -365,7 +429,8 @@ Add this to your requirements.txt and redeploy the space."""
|
|
365 |
stderr=subprocess.STDOUT,
|
366 |
text=True,
|
367 |
bufsize=1,
|
368 |
-
universal_newlines=True
|
|
|
369 |
)
|
370 |
|
371 |
# Progress tracking
|
@@ -393,7 +458,7 @@ Add this to your requirements.txt and redeploy the space."""
|
|
393 |
status_text = f"Optimizing: {line.strip()[:60]}..."
|
394 |
elif "Creating" in line:
|
395 |
status_text = f"Creating: {line.strip()[:60]}..."
|
396 |
-
elif "MinGW" in line:
|
397 |
status_text = f"MinGW: {line.strip()[:60]}..."
|
398 |
|
399 |
if progress_callback:
|
@@ -436,8 +501,19 @@ Add this to your requirements.txt and redeploy the space."""
|
|
436 |
binary_info = file_process.stdout
|
437 |
if log_queue:
|
438 |
log_queue.put(f"Binary info: {binary_info}\n")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
439 |
except:
|
440 |
binary_info = "Binary file (unable to get detailed info)"
|
|
|
441 |
|
442 |
# Check linking type (only for non-Windows binaries on Linux)
|
443 |
if output_extension != ".exe":
|
@@ -455,10 +531,19 @@ Add this to your requirements.txt and redeploy the space."""
|
|
455 |
except:
|
456 |
linking_info = "βΉοΈ Compiled binary created successfully"
|
457 |
else:
|
458 |
-
# For Windows
|
459 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
460 |
if log_queue:
|
461 |
-
log_queue.put("
|
462 |
|
463 |
# Rename to desired extension
|
464 |
if output_extension in ['.bin', '.sh', '.exe'] and not binary_path.endswith(output_extension):
|
@@ -475,6 +560,17 @@ Add this to your requirements.txt and redeploy the space."""
|
|
475 |
file_size = os.path.getsize(binary_path) / 1024
|
476 |
binary_basename = os.path.basename(binary_path)
|
477 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
478 |
# Create result summary
|
479 |
result_summary = f"""# β
Compilation Successful!
|
480 |
|
@@ -488,6 +584,7 @@ Add this to your requirements.txt and redeploy the space."""
|
|
488 |
- **Static Libpython Available**: {static_status}
|
489 |
- **Linking**: {linking_info}
|
490 |
- **Target Platform**: {'Windows (via MinGW-w64)' if output_extension == '.exe' else 'Linux'}
|
|
|
491 |
|
492 |
## Environment Results:
|
493 |
**System Packages**: {packages_result}
|
@@ -496,27 +593,26 @@ Add this to your requirements.txt and redeploy the space."""
|
|
496 |
## Binary Information:
|
497 |
{binary_info}
|
498 |
|
499 |
-
## π
|
500 |
-
-
|
501 |
-
-
|
502 |
-
- {'
|
503 |
-
|
504 |
-
- {'MinGW-w64 produces 64-bit Windows executables by default' if output_extension == '.exe' else ''}
|
505 |
|
506 |
## π Usage Instructions:
|
507 |
```bash
|
508 |
-
{f'# For Windows:' if output_extension == '.exe' else f'chmod +x {binary_basename}'}
|
509 |
{f'# Download to Windows machine and run:' if output_extension == '.exe' else ''}
|
510 |
{f'{binary_basename}' if output_extension == '.exe' else f'./{binary_basename}'}
|
511 |
```
|
512 |
|
513 |
## β οΈ Cross-Compilation Notes:
|
514 |
-
{f'''-
|
515 |
-
- MinGW-w64
|
|
|
516 |
- Tested with wine if available: `wine {binary_basename}`
|
517 |
-
- Compatible with Windows
|
518 |
-
- Some Windows-specific libraries may need additional setup
|
519 |
-
- GUI frameworks may require special handling''' if output_extension == '.exe' else 'Native Linux compilation with maximum compatibility'}
|
520 |
|
521 |
## π§ͺ Testing:
|
522 |
{f'You can test the Windows executable on Linux using wine:' if output_extension == '.exe' else 'Run directly on compatible Linux systems:'}
|
@@ -525,12 +621,13 @@ Add this to your requirements.txt and redeploy the space."""
|
|
525 |
```"""
|
526 |
|
527 |
if progress_callback:
|
528 |
-
progress_callback(1.0, "Compilation successful! π")
|
529 |
|
530 |
if log_queue:
|
531 |
log_queue.put("β
Compilation completed successfully!\n")
|
532 |
if output_extension == ".exe":
|
533 |
-
log_queue.put("π· You can test the Windows executable with: wine " + binary_basename + "\n")
|
|
|
534 |
|
535 |
return result_summary, binary_path, compile_output, True
|
536 |
else:
|
@@ -551,14 +648,18 @@ Add this to your requirements.txt and redeploy the space."""
|
|
551 |
{compile_output}
|
552 |
```
|
553 |
|
|
|
|
|
|
|
|
|
554 |
## Possible Solutions:
|
555 |
1. Check your code for syntax errors
|
556 |
2. Ensure all imports are available in requirements.txt
|
557 |
3. Try a different compilation mode
|
558 |
4. Review the compilation logs above
|
559 |
-
{f"5.
|
560 |
-
{f"6. Some packages may not support
|
561 |
-
{f"7.
|
562 |
|
563 |
## Missing Dependencies:
|
564 |
{', '.join(missing_deps) if missing_deps else 'None detected'}
|
@@ -567,8 +668,8 @@ Add this to your requirements.txt and redeploy the space."""
|
|
567 |
- **Nuitka Version**: {nuitka_version}
|
568 |
- **Python Version**: {current_python}
|
569 |
- **Platform**: {platform.platform()}
|
570 |
-
{f"- **
|
571 |
-
{f"- **
|
572 |
if progress_callback:
|
573 |
progress_callback(1.0, "Compilation failed β")
|
574 |
|
@@ -600,8 +701,8 @@ Add this to your requirements.txt and redeploy the space."""
|
|
600 |
2. Verify your code syntax
|
601 |
3. Check available disk space
|
602 |
4. Try with simpler code first
|
603 |
-
{f"5.
|
604 |
-
{f"6.
|
605 |
if progress_callback:
|
606 |
progress_callback(1.0, "Error occurred β")
|
607 |
|
@@ -618,18 +719,34 @@ def run_compiled_binary(binary_path):
|
|
618 |
try:
|
619 |
# Check if it's a Windows exe on Linux
|
620 |
if binary_path.endswith('.exe'):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
621 |
# Try to run with wine first
|
622 |
wine_result = subprocess.run(["which", "wine"], capture_output=True)
|
623 |
if wine_result.returncode == 0:
|
624 |
-
return f"""π· **Running Windows executable with Wine**
|
625 |
|
626 |
## Execution:
|
627 |
```bash
|
628 |
wine {os.path.basename(binary_path)}
|
629 |
```
|
630 |
|
631 |
-
##
|
632 |
-
|
|
|
|
|
|
|
633 |
1. Download the .exe file
|
634 |
2. Transfer it to a Windows machine
|
635 |
3. Run it by double-clicking or from command prompt
|
@@ -641,12 +758,16 @@ To run on Windows:
|
|
641 |
|
642 |
## Note:
|
643 |
- Wine is available on this system for basic testing
|
644 |
-
- This executable is compiled for Windows
|
645 |
- Full compatibility requires running on actual Windows
|
646 |
- Some features may not work correctly in wine"""
|
647 |
else:
|
648 |
return f"""β Cannot run Windows .exe file on Linux system (wine not available).
|
649 |
|
|
|
|
|
|
|
|
|
650 |
## To run this binary:
|
651 |
1. Download the .exe file
|
652 |
2. Transfer it to a Windows machine
|
@@ -659,8 +780,8 @@ cd /path/to/downloaded/file
|
|
659 |
```
|
660 |
|
661 |
## Note:
|
662 |
-
- This executable is compiled for Windows
|
663 |
-
- Compatible with
|
664 |
|
665 |
## Alternative:
|
666 |
Install wine to test Windows executables on Linux:
|
@@ -705,12 +826,12 @@ wine {os.path.basename(binary_path)}
|
|
705 |
# Create Gradio interface
|
706 |
with gr.Blocks(title="Nuitka Python Compiler with MinGW-w64", theme=gr.themes.Soft()) as app:
|
707 |
gr.Markdown("# π Nuitka Python Compiler (MinGW-w64 Cross-Compilation)")
|
708 |
-
gr.Markdown("Convert your Python code into portable executables using Nuitka, with MinGW-w64 support for Windows cross-compilation.")
|
709 |
|
710 |
# Check environment status
|
711 |
has_static = check_static_libpython()
|
712 |
missing_deps = check_dependencies()
|
713 |
-
|
714 |
|
715 |
if "nuitka" in missing_deps:
|
716 |
gr.Markdown("β οΈ **Nuitka is not installed!** Add 'nuitka' to your requirements.txt file.")
|
@@ -720,19 +841,29 @@ with gr.Blocks(title="Nuitka Python Compiler with MinGW-w64", theme=gr.themes.So
|
|
720 |
else:
|
721 |
gr.Markdown("π§ **Using alternative portable options.** Static libpython not available.")
|
722 |
|
723 |
-
if
|
724 |
-
gr.Markdown(f"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
725 |
gr.Markdown("π **For Windows .exe generation**, MinGW-w64 should be pre-installed in the environment.")
|
726 |
-
else:
|
727 |
-
gr.Markdown("β
**MinGW-w64 Available!** Windows cross-compilation supported.")
|
728 |
|
729 |
if [dep for dep in missing_deps if dep != "nuitka" and dep != "mingw-w64"]:
|
730 |
gr.Markdown(f"β οΈ **Other missing dependencies:** {', '.join([dep for dep in missing_deps if dep != 'nuitka' and dep != 'mingw-w64'])}")
|
731 |
|
732 |
# MinGW-w64 information
|
733 |
gr.Markdown("""
|
734 |
-
> βΉοΈ **MinGW-w64 Cross-Compilation**:
|
735 |
-
>
|
|
|
|
|
|
|
736 |
""")
|
737 |
|
738 |
with gr.Tabs():
|
@@ -785,8 +916,8 @@ input('Press Enter to exit...')""",
|
|
785 |
placeholder="""# System packages (for reference only)
|
786 |
# These should be pre-installed in HF Spaces
|
787 |
# mingw-w64
|
788 |
-
# gcc-mingw-w64
|
789 |
-
# g++-mingw-w64""",
|
790 |
lines=8,
|
791 |
label="System packages (Reference Only)",
|
792 |
interactive=True
|
@@ -813,18 +944,20 @@ input('Press Enter to exit...')""",
|
|
813 |
gr.Markdown(f"π **Python Version**: {get_current_python_version()}")
|
814 |
gr.Markdown(f"π **Nuitka Version**: {get_nuitka_version()}")
|
815 |
|
816 |
-
if
|
817 |
-
|
|
|
|
|
818 |
else:
|
819 |
-
gr.Markdown("
|
820 |
|
821 |
if check_static_libpython():
|
822 |
gr.Markdown("π **Static libpython will be used for Linux targets!**")
|
823 |
else:
|
824 |
gr.Markdown("π§ **Using portable compilation flags**")
|
825 |
|
826 |
-
# Add
|
827 |
-
gr.Markdown("ποΈ **
|
828 |
|
829 |
compile_btn = gr.Button("π Compile with Nuitka", variant="primary")
|
830 |
|
@@ -912,7 +1045,7 @@ input('Press Enter to exit...')""",
|
|
912 |
# Progress simulation with log updates
|
913 |
progress_steps = [
|
914 |
(0.1, "Checking Nuitka installation..."),
|
915 |
-
(0.15, "Checking MinGW-w64
|
916 |
(0.2, "Setting up environment..."),
|
917 |
(0.3, "Installing requirements..."),
|
918 |
(0.4, f"Starting {'Windows cross-' if extension == '.exe' else ''}compilation..."),
|
@@ -963,7 +1096,13 @@ input('Press Enter to exit...')""",
|
|
963 |
# Final progress update
|
964 |
final_status = "β
Compilation successful!" if success else "β Compilation failed"
|
965 |
if success and extension == ".exe":
|
966 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
967 |
|
968 |
yield (
|
969 |
gr.update(visible=True), # progress_section
|
@@ -1061,22 +1200,22 @@ input('Press Enter to exit...')""",
|
|
1061 |
|
1062 |
with gr.TabItem("π How to Use"):
|
1063 |
gr.Markdown("""
|
1064 |
-
## π― MinGW-w64 Cross-Compilation
|
1065 |
|
1066 |
-
**Proper Windows
|
1067 |
|
1068 |
-
This app uses
|
1069 |
-
- **
|
1070 |
-
-
|
1071 |
-
-
|
1072 |
-
- **
|
|
|
1073 |
|
1074 |
-
**
|
1075 |
-
-
|
1076 |
-
-
|
1077 |
-
-
|
1078 |
-
-
|
1079 |
-
- **64-bit Windows compatibility**
|
1080 |
|
1081 |
## π Usage Instructions
|
1082 |
|
@@ -1088,13 +1227,13 @@ input('Press Enter to exit...')""",
|
|
1088 |
### 2. Choose Target Platform
|
1089 |
- **Linux (.bin)**: Native Linux executable (fastest compilation)
|
1090 |
- **Linux (.sh)**: Shell script format
|
1091 |
-
- **Windows (.exe)**: Cross-compiled using MinGW-w64
|
1092 |
|
1093 |
### 3. Compile
|
1094 |
- Click "Compile with Nuitka"
|
1095 |
-
- Watch
|
1096 |
-
- Monitor
|
1097 |
-
- Download the resulting binary
|
1098 |
|
1099 |
### 4. Run Your Binary
|
1100 |
|
@@ -1123,57 +1262,62 @@ input('Press Enter to exit...')""",
|
|
1123 |
|
1124 |
## π§ MinGW-w64 Requirements
|
1125 |
|
1126 |
-
**
|
1127 |
```bash
|
1128 |
-
#
|
1129 |
-
apt install mingw-w64
|
1130 |
|
1131 |
-
#
|
1132 |
-
|
1133 |
```
|
1134 |
|
1135 |
-
## β οΈ Cross-Compilation
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1136 |
|
1137 |
-
**
|
1138 |
-
-
|
1139 |
-
-
|
1140 |
-
-
|
1141 |
-
- β οΈ Windows-specific APIs may need special handling
|
1142 |
-
- β
Can be tested with wine on Linux
|
1143 |
-
- β
Compatible with most Windows 64-bit systems
|
1144 |
|
1145 |
-
## π
|
1146 |
|
1147 |
-
|
|
1148 |
-
|
1149 |
-
|
|
1150 |
-
|
|
1151 |
-
|
|
|
|
1152 |
""")
|
1153 |
|
1154 |
with gr.TabItem("βΉοΈ About"):
|
1155 |
gr.Markdown(f"""
|
1156 |
-
## π§
|
1157 |
|
1158 |
-
**Implementation:**
|
1159 |
|
1160 |
-
1. **
|
1161 |
-
2. **
|
1162 |
-
3. **
|
1163 |
-
4. **
|
1164 |
-
5. **
|
1165 |
-
6. **Automatic Detection**: Checks for required MinGW-w64 components
|
1166 |
|
1167 |
-
## β
Features
|
1168 |
|
1169 |
-
**Cross-compilation
|
1170 |
|
1171 |
-
- β
|
1172 |
-
- β
|
1173 |
-
- β
|
1174 |
-
- β
|
1175 |
-
- β
|
1176 |
-
- β
**
|
|
|
1177 |
|
1178 |
## βοΈ Environment Status
|
1179 |
|
@@ -1182,71 +1326,87 @@ input('Press Enter to exit...')""",
|
|
1182 |
Architecture: {platform.architecture()[0]}
|
1183 |
Python Version: {get_current_python_version()}
|
1184 |
Nuitka Version: {get_nuitka_version()}
|
1185 |
-
|
|
|
|
|
|
|
|
|
|
|
1186 |
Static Libpython: {'β
Available' if check_static_libpython() else 'β Not Available'}
|
1187 |
Environment: Hugging Face Spaces
|
1188 |
-
Cross-Compilation: MinGW-w64 support
|
1189 |
-
Target Architecture: 64-bit (MinGW-w64 default)
|
1190 |
```
|
1191 |
|
1192 |
## π Best Practices
|
1193 |
|
1194 |
-
**For cross-compilation:**
|
1195 |
|
1196 |
-
1. β
Use "Maximum Compatibility" mode
|
1197 |
-
2. β
|
1198 |
-
3. β
|
1199 |
-
4. β
|
1200 |
-
5. β
|
1201 |
-
6. β
|
1202 |
|
1203 |
-
**
|
1204 |
|
1205 |
-
|
1206 |
-
|
1207 |
-
|
1208 |
-
|
|
|
|
|
|
|
|
|
1209 |
|
1210 |
## π§ Troubleshooting
|
1211 |
|
1212 |
-
**
|
1213 |
|
1214 |
-
- **
|
1215 |
-
|
1216 |
-
|
1217 |
-
|
1218 |
-
- **Wine issues**: Wine testing is optional, real Windows testing preferred
|
1219 |
|
1220 |
-
|
|
|
|
|
|
|
1221 |
|
1222 |
-
|
|
|
|
|
|
|
1223 |
|
1224 |
-
|
1225 |
-
2. MinGW-w64 cross-compiles C to Windows PE format
|
1226 |
-
3. **Default output is 64-bit Windows executable**
|
1227 |
-
4. Static linking reduces Windows dependencies
|
1228 |
-
5. Result is a native Windows executable
|
1229 |
-
6. Optional Wine testing for basic validation
|
1230 |
|
1231 |
-
**
|
1232 |
```bash
|
|
|
|
|
|
|
|
|
|
|
1233 |
python -m nuitka \\
|
1234 |
-
--
|
|
|
1235 |
--onefile \\
|
1236 |
--windows-disable-console \\
|
1237 |
--show-progress \\
|
1238 |
your_script.py
|
1239 |
```
|
1240 |
|
1241 |
-
**
|
1242 |
-
-
|
1243 |
-
|
|
|
|
|
1244 |
|
1245 |
-
|
1246 |
""")
|
1247 |
|
1248 |
gr.Markdown("---")
|
1249 |
-
gr.Markdown("π€ Created by Claude 3.7 Sonnet | π Powered by Nuitka + MinGW-w64 | βοΈ
|
1250 |
|
1251 |
if __name__ == "__main__":
|
1252 |
# Create necessary directories on startup
|
@@ -1258,9 +1418,14 @@ if __name__ == "__main__":
|
|
1258 |
print("WARNING: Nuitka is not installed. Please add 'nuitka' to your requirements.txt file.")
|
1259 |
|
1260 |
# Check MinGW-w64 status
|
1261 |
-
|
1262 |
-
if
|
1263 |
-
print(f"
|
1264 |
-
|
|
|
|
|
|
|
|
|
|
|
1265 |
|
1266 |
app.launch()
|
|
|
30 |
missing_deps.append("nuitka")
|
31 |
|
32 |
# Check for MinGW-w64 (needed for Windows cross-compilation)
|
33 |
+
# Check for both 32-bit and 64-bit compilers
|
34 |
+
mingw_compilers = [
|
35 |
+
"x86_64-w64-mingw32-gcc", # 64-bit
|
36 |
+
"i686-w64-mingw32-gcc" # 32-bit
|
37 |
+
]
|
38 |
+
|
39 |
+
found_mingw = False
|
40 |
+
for compiler in mingw_compilers:
|
41 |
+
result = subprocess.run(["which", compiler], capture_output=True)
|
42 |
+
if result.returncode == 0:
|
43 |
+
found_mingw = True
|
44 |
+
break
|
45 |
+
|
46 |
+
if not found_mingw:
|
47 |
missing_deps.append("mingw-w64")
|
48 |
|
49 |
# Check for patchelf (usually available in HF Spaces)
|
|
|
150 |
def check_mingw_installation():
|
151 |
"""Check if MinGW-w64 is properly installed"""
|
152 |
mingw_compilers = [
|
153 |
+
("x86_64-w64-mingw32-gcc", "64-bit"),
|
154 |
+
("x86_64-w64-mingw32-g++", "64-bit"),
|
155 |
+
("x86_64-w64-mingw32-ld", "64-bit"),
|
156 |
+
("i686-w64-mingw32-gcc", "32-bit"),
|
157 |
+
("i686-w64-mingw32-g++", "32-bit"),
|
158 |
+
("i686-w64-mingw32-ld", "32-bit")
|
159 |
]
|
160 |
|
161 |
+
available = []
|
162 |
missing = []
|
163 |
+
|
164 |
+
for compiler, arch in mingw_compilers:
|
165 |
result = subprocess.run(["which", compiler], capture_output=True)
|
166 |
+
if result.returncode == 0:
|
167 |
+
available.append((compiler, arch))
|
168 |
+
else:
|
169 |
+
missing.append((compiler, arch))
|
170 |
|
171 |
+
return missing, available
|
172 |
|
173 |
def find_compiled_binary(output_dir, output_filename):
|
174 |
"""Find the compiled binary, checking different possible paths"""
|
|
|
235 |
|
236 |
# Check for Windows cross-compilation requirements
|
237 |
if output_extension == ".exe":
|
238 |
+
missing_mingw, available_mingw = check_mingw_installation()
|
239 |
+
if log_queue:
|
240 |
+
if available_mingw:
|
241 |
+
log_queue.put(f"β
Available MinGW-w64 compilers:\n")
|
242 |
+
for compiler, arch in available_mingw:
|
243 |
+
log_queue.put(f" - {compiler} ({arch})\n")
|
244 |
+
else:
|
245 |
+
log_queue.put("β οΈ No MinGW-w64 compilers found!\n")
|
246 |
+
|
247 |
+
if missing_mingw:
|
248 |
+
log_queue.put(f"β οΈ Missing MinGW-w64 components:\n")
|
249 |
+
for compiler, arch in missing_mingw:
|
250 |
+
log_queue.put(f" - {compiler} ({arch})\n")
|
251 |
|
252 |
# Check if static libpython is available
|
253 |
has_static_libpython = check_static_libpython()
|
|
|
368 |
|
369 |
# Add Windows-specific options using MinGW-w64
|
370 |
if output_extension == ".exe":
|
371 |
+
# Check which MinGW-w64 compiler is available
|
372 |
+
x64_gcc = subprocess.run(["which", "x86_64-w64-mingw32-gcc"], capture_output=True)
|
373 |
+
i686_gcc = subprocess.run(["which", "i686-w64-mingw32-gcc"], capture_output=True)
|
374 |
+
|
375 |
+
if x64_gcc.returncode == 0:
|
376 |
+
# Use explicit 64-bit cross-compiler
|
377 |
+
cmd.extend([
|
378 |
+
"--clang", # Use clang as backend (better for cross-compilation)
|
379 |
+
"--windows-disable-console", # Disable console window for GUI apps
|
380 |
+
])
|
381 |
+
|
382 |
+
# Set environment variables to force use of 64-bit MinGW
|
383 |
+
os.environ["CC"] = "x86_64-w64-mingw32-gcc"
|
384 |
+
os.environ["CXX"] = "x86_64-w64-mingw32-g++"
|
385 |
+
|
386 |
+
if log_queue:
|
387 |
+
log_queue.put("Using x86_64-w64-mingw32-gcc for Windows 64-bit cross-compilation\n")
|
388 |
+
log_queue.put("Set CC=x86_64-w64-mingw32-gcc, CXX=x86_64-w64-mingw32-g++\n")
|
389 |
+
log_queue.put("Using Clang backend for better cross-compilation support\n")
|
390 |
+
log_queue.put("Target: Windows 64-bit (x64)\n")
|
391 |
+
|
392 |
+
elif i686_gcc.returncode == 0:
|
393 |
+
# Use 32-bit cross-compiler as fallback
|
394 |
+
cmd.extend([
|
395 |
+
"--clang", # Use clang as backend
|
396 |
+
"--windows-disable-console", # Disable console window for GUI apps
|
397 |
+
])
|
398 |
+
|
399 |
+
# Set environment variables to force use of 32-bit MinGW
|
400 |
+
os.environ["CC"] = "i686-w64-mingw32-gcc"
|
401 |
+
os.environ["CXX"] = "i686-w64-mingw32-g++"
|
402 |
+
|
403 |
+
if log_queue:
|
404 |
+
log_queue.put("Using i686-w64-mingw32-gcc for Windows 32-bit cross-compilation\n")
|
405 |
+
log_queue.put("Set CC=i686-w64-mingw32-gcc, CXX=i686-w64-mingw32-g++\n")
|
406 |
+
log_queue.put("Using Clang backend for better cross-compilation support\n")
|
407 |
+
log_queue.put("Target: Windows 32-bit (x86)\n")
|
408 |
+
else:
|
409 |
+
# Fallback to --mingw64 if no specific compiler found
|
410 |
+
cmd.extend([
|
411 |
+
"--mingw64", # Use MinGW-w64
|
412 |
+
"--windows-disable-console", # Disable console window for GUI apps
|
413 |
+
])
|
414 |
+
if log_queue:
|
415 |
+
log_queue.put("Falling back to --mingw64 flag\n")
|
416 |
+
log_queue.put("Target: Windows (architecture determined by MinGW-w64)\n")
|
417 |
|
418 |
# Run compilation
|
419 |
if progress_callback:
|
|
|
429 |
stderr=subprocess.STDOUT,
|
430 |
text=True,
|
431 |
bufsize=1,
|
432 |
+
universal_newlines=True,
|
433 |
+
env=os.environ # Pass the modified environment
|
434 |
)
|
435 |
|
436 |
# Progress tracking
|
|
|
458 |
status_text = f"Optimizing: {line.strip()[:60]}..."
|
459 |
elif "Creating" in line:
|
460 |
status_text = f"Creating: {line.strip()[:60]}..."
|
461 |
+
elif "MinGW" in line or "gcc" in line:
|
462 |
status_text = f"MinGW: {line.strip()[:60]}..."
|
463 |
|
464 |
if progress_callback:
|
|
|
501 |
binary_info = file_process.stdout
|
502 |
if log_queue:
|
503 |
log_queue.put(f"Binary info: {binary_info}\n")
|
504 |
+
|
505 |
+
# Extract architecture information from file output
|
506 |
+
if "PE32+" in binary_info or "x86-64" in binary_info:
|
507 |
+
arch_info = "64-bit"
|
508 |
+
elif "PE32" in binary_info and "PE32+" not in binary_info:
|
509 |
+
arch_info = "32-bit"
|
510 |
+
else:
|
511 |
+
arch_info = "unknown"
|
512 |
+
|
513 |
+
log_queue.put(f"Detected architecture: {arch_info}\n")
|
514 |
except:
|
515 |
binary_info = "Binary file (unable to get detailed info)"
|
516 |
+
arch_info = "unknown"
|
517 |
|
518 |
# Check linking type (only for non-Windows binaries on Linux)
|
519 |
if output_extension != ".exe":
|
|
|
531 |
except:
|
532 |
linking_info = "βΉοΈ Compiled binary created successfully"
|
533 |
else:
|
534 |
+
# For Windows, show architecture information
|
535 |
+
if "CC" in os.environ and "x86_64" in os.environ["CC"]:
|
536 |
+
linking_info = f"π¦ Windows 64-bit executable (cross-compiled with {os.environ['CC']})"
|
537 |
+
elif "CC" in os.environ and "i686" in os.environ["CC"]:
|
538 |
+
linking_info = f"π¦ Windows 32-bit executable (cross-compiled with {os.environ['CC']})"
|
539 |
+
else:
|
540 |
+
linking_info = f"π¦ Windows executable (cross-compiled with MinGW-w64)"
|
541 |
+
|
542 |
+
if arch_info != "unknown":
|
543 |
+
linking_info += f" - Verified {arch_info}"
|
544 |
+
|
545 |
if log_queue:
|
546 |
+
log_queue.put(f"Final binary architecture: {linking_info}\n")
|
547 |
|
548 |
# Rename to desired extension
|
549 |
if output_extension in ['.bin', '.sh', '.exe'] and not binary_path.endswith(output_extension):
|
|
|
560 |
file_size = os.path.getsize(binary_path) / 1024
|
561 |
binary_basename = os.path.basename(binary_path)
|
562 |
|
563 |
+
# Determine architecture from environment
|
564 |
+
if output_extension == ".exe":
|
565 |
+
if "CC" in os.environ and "x86_64" in os.environ["CC"]:
|
566 |
+
arch_used = "x86_64 (64-bit)"
|
567 |
+
elif "CC" in os.environ and "i686" in os.environ["CC"]:
|
568 |
+
arch_used = "i686 (32-bit)"
|
569 |
+
else:
|
570 |
+
arch_used = "MinGW-w64 default"
|
571 |
+
else:
|
572 |
+
arch_used = "Native Linux"
|
573 |
+
|
574 |
# Create result summary
|
575 |
result_summary = f"""# β
Compilation Successful!
|
576 |
|
|
|
584 |
- **Static Libpython Available**: {static_status}
|
585 |
- **Linking**: {linking_info}
|
586 |
- **Target Platform**: {'Windows (via MinGW-w64)' if output_extension == '.exe' else 'Linux'}
|
587 |
+
- **Architecture**: {arch_used}
|
588 |
|
589 |
## Environment Results:
|
590 |
**System Packages**: {packages_result}
|
|
|
593 |
## Binary Information:
|
594 |
{binary_info}
|
595 |
|
596 |
+
## π Cross-Compilation Details:
|
597 |
+
{f'''- Used cross-compiler: {os.environ.get("CC", "MinGW-w64 default")}
|
598 |
+
- Architecture: {arch_used}
|
599 |
+
- Backend: {'Clang' if '--clang' in cmd else 'GCC'}
|
600 |
+
- Target verification: {arch_info} executable detected''' if output_extension == '.exe' else '- Native Linux compilation'}
|
|
|
601 |
|
602 |
## π Usage Instructions:
|
603 |
```bash
|
604 |
+
{f'# For Windows ({arch_info}):' if output_extension == '.exe' else f'chmod +x {binary_basename}'}
|
605 |
{f'# Download to Windows machine and run:' if output_extension == '.exe' else ''}
|
606 |
{f'{binary_basename}' if output_extension == '.exe' else f'./{binary_basename}'}
|
607 |
```
|
608 |
|
609 |
## β οΈ Cross-Compilation Notes:
|
610 |
+
{f'''- Successfully compiled from Linux to Windows {arch_info}
|
611 |
+
- Used {os.environ.get("CC", "MinGW-w64")} cross-compiler
|
612 |
+
- Binary verified as {arch_info} Windows executable
|
613 |
- Tested with wine if available: `wine {binary_basename}`
|
614 |
+
- Compatible with Windows systems
|
615 |
+
- Some Windows-specific libraries may need additional setup''' if output_extension == '.exe' else 'Native Linux compilation with maximum compatibility'}
|
|
|
616 |
|
617 |
## π§ͺ Testing:
|
618 |
{f'You can test the Windows executable on Linux using wine:' if output_extension == '.exe' else 'Run directly on compatible Linux systems:'}
|
|
|
621 |
```"""
|
622 |
|
623 |
if progress_callback:
|
624 |
+
progress_callback(1.0, f"Compilation successful! Created {arch_info} executable π")
|
625 |
|
626 |
if log_queue:
|
627 |
log_queue.put("β
Compilation completed successfully!\n")
|
628 |
if output_extension == ".exe":
|
629 |
+
log_queue.put(f"π· You can test the Windows {arch_info} executable with: wine " + binary_basename + "\n")
|
630 |
+
log_queue.put(f"β
Verified {arch_info} Windows executable created\n")
|
631 |
|
632 |
return result_summary, binary_path, compile_output, True
|
633 |
else:
|
|
|
648 |
{compile_output}
|
649 |
```
|
650 |
|
651 |
+
## Environment Setup:
|
652 |
+
{f'''- Cross-compiler attempted: {os.environ.get("CC", "Default MinGW")}
|
653 |
+
- Backend: {'Clang' if '--clang' in cmd else 'GCC'}''' if output_extension == '.exe' else '- Native GCC compilation'}
|
654 |
+
|
655 |
## Possible Solutions:
|
656 |
1. Check your code for syntax errors
|
657 |
2. Ensure all imports are available in requirements.txt
|
658 |
3. Try a different compilation mode
|
659 |
4. Review the compilation logs above
|
660 |
+
{f"5. Verify MinGW-w64 installation and cross-compiler availability" if output_extension == '.exe' else ''}
|
661 |
+
{f"6. Some packages may not support cross-compilation" if output_extension == '.exe' else ''}
|
662 |
+
{f"7. Check if the cross-compiler supports the target architecture" if output_extension == '.exe' else ''}
|
663 |
|
664 |
## Missing Dependencies:
|
665 |
{', '.join(missing_deps) if missing_deps else 'None detected'}
|
|
|
668 |
- **Nuitka Version**: {nuitka_version}
|
669 |
- **Python Version**: {current_python}
|
670 |
- **Platform**: {platform.platform()}
|
671 |
+
{f"- **Cross-compiler**: {os.environ.get('CC', 'Not set')}" if output_extension == '.exe' else ''}
|
672 |
+
{f"- **MinGW-w64 Status**: Available" if not missing_mingw else f"- **MinGW-w64 Status**: Missing components" if output_extension == '.exe' else ''}"""
|
673 |
if progress_callback:
|
674 |
progress_callback(1.0, "Compilation failed β")
|
675 |
|
|
|
701 |
2. Verify your code syntax
|
702 |
3. Check available disk space
|
703 |
4. Try with simpler code first
|
704 |
+
{f"5. Verify MinGW-w64 cross-compiler installation" if output_extension == '.exe' else ''}
|
705 |
+
{f"6. Check cross-compiler setup and environment variables" if output_extension == '.exe' else ''}"""
|
706 |
if progress_callback:
|
707 |
progress_callback(1.0, "Error occurred β")
|
708 |
|
|
|
719 |
try:
|
720 |
# Check if it's a Windows exe on Linux
|
721 |
if binary_path.endswith('.exe'):
|
722 |
+
# Verify architecture first
|
723 |
+
file_process = subprocess.run(["file", binary_path], capture_output=True, text=True)
|
724 |
+
if file_process.returncode == 0:
|
725 |
+
file_output = file_process.stdout
|
726 |
+
if "PE32+" in file_output or "x86-64" in file_output:
|
727 |
+
arch_info = "64-bit"
|
728 |
+
elif "PE32" in file_output and "PE32+" not in file_output:
|
729 |
+
arch_info = "32-bit"
|
730 |
+
else:
|
731 |
+
arch_info = "unknown"
|
732 |
+
else:
|
733 |
+
arch_info = "unknown"
|
734 |
+
|
735 |
# Try to run with wine first
|
736 |
wine_result = subprocess.run(["which", "wine"], capture_output=True)
|
737 |
if wine_result.returncode == 0:
|
738 |
+
return f"""π· **Running Windows {arch_info} executable with Wine**
|
739 |
|
740 |
## Execution:
|
741 |
```bash
|
742 |
wine {os.path.basename(binary_path)}
|
743 |
```
|
744 |
|
745 |
+
## Binary Information:
|
746 |
+
- **Architecture**: {arch_info}
|
747 |
+
- **File**: {file_output.strip() if 'file_output' in locals() else 'Windows PE executable'}
|
748 |
+
|
749 |
+
## To run on Windows:
|
750 |
1. Download the .exe file
|
751 |
2. Transfer it to a Windows machine
|
752 |
3. Run it by double-clicking or from command prompt
|
|
|
758 |
|
759 |
## Note:
|
760 |
- Wine is available on this system for basic testing
|
761 |
+
- This executable is compiled for Windows {arch_info}
|
762 |
- Full compatibility requires running on actual Windows
|
763 |
- Some features may not work correctly in wine"""
|
764 |
else:
|
765 |
return f"""β Cannot run Windows .exe file on Linux system (wine not available).
|
766 |
|
767 |
+
## Binary Information:
|
768 |
+
- **Architecture**: {arch_info}
|
769 |
+
- **Type**: Windows PE executable
|
770 |
+
|
771 |
## To run this binary:
|
772 |
1. Download the .exe file
|
773 |
2. Transfer it to a Windows machine
|
|
|
780 |
```
|
781 |
|
782 |
## Note:
|
783 |
+
- This executable is compiled for Windows {arch_info}
|
784 |
+
- Compatible with appropriate Windows systems
|
785 |
|
786 |
## Alternative:
|
787 |
Install wine to test Windows executables on Linux:
|
|
|
826 |
# Create Gradio interface
|
827 |
with gr.Blocks(title="Nuitka Python Compiler with MinGW-w64", theme=gr.themes.Soft()) as app:
|
828 |
gr.Markdown("# π Nuitka Python Compiler (MinGW-w64 Cross-Compilation)")
|
829 |
+
gr.Markdown("Convert your Python code into portable executables using Nuitka, with proper MinGW-w64 support for Windows cross-compilation.")
|
830 |
|
831 |
# Check environment status
|
832 |
has_static = check_static_libpython()
|
833 |
missing_deps = check_dependencies()
|
834 |
+
missing_mingw, available_mingw = check_mingw_installation()
|
835 |
|
836 |
if "nuitka" in missing_deps:
|
837 |
gr.Markdown("β οΈ **Nuitka is not installed!** Add 'nuitka' to your requirements.txt file.")
|
|
|
841 |
else:
|
842 |
gr.Markdown("π§ **Using alternative portable options.** Static libpython not available.")
|
843 |
|
844 |
+
if available_mingw:
|
845 |
+
gr.Markdown(f"β
**MinGW-w64 Available!** Found {len(available_mingw)} compilers.")
|
846 |
+
with gr.Accordion("Available MinGW-w64 Compilers", open=False):
|
847 |
+
for compiler, arch in available_mingw:
|
848 |
+
gr.Markdown(f"- {compiler} ({arch})")
|
849 |
+
|
850 |
+
if missing_mingw:
|
851 |
+
gr.Markdown(f"β οΈ **Some MinGW-w64 Components Missing:** {len(missing_mingw)} compilers not found.")
|
852 |
+
with gr.Accordion("Missing MinGW-w64 Compilers", open=False):
|
853 |
+
for compiler, arch in missing_mingw:
|
854 |
+
gr.Markdown(f"- {compiler} ({arch})")
|
855 |
gr.Markdown("π **For Windows .exe generation**, MinGW-w64 should be pre-installed in the environment.")
|
|
|
|
|
856 |
|
857 |
if [dep for dep in missing_deps if dep != "nuitka" and dep != "mingw-w64"]:
|
858 |
gr.Markdown(f"β οΈ **Other missing dependencies:** {', '.join([dep for dep in missing_deps if dep != 'nuitka' and dep != 'mingw-w64'])}")
|
859 |
|
860 |
# MinGW-w64 information
|
861 |
gr.Markdown("""
|
862 |
+
> βΉοΈ **Enhanced MinGW-w64 Cross-Compilation**:
|
863 |
+
> - Explicit cross-compiler selection (x86_64-w64-mingw32-gcc for 64-bit)
|
864 |
+
> - Environment variable setup for precise cross-compilation
|
865 |
+
> - Clang backend for improved cross-compilation support
|
866 |
+
> - Architecture verification in output
|
867 |
""")
|
868 |
|
869 |
with gr.Tabs():
|
|
|
916 |
placeholder="""# System packages (for reference only)
|
917 |
# These should be pre-installed in HF Spaces
|
918 |
# mingw-w64
|
919 |
+
# gcc-mingw-w64-x86-64
|
920 |
+
# g++-mingw-w64-x86-64""",
|
921 |
lines=8,
|
922 |
label="System packages (Reference Only)",
|
923 |
interactive=True
|
|
|
944 |
gr.Markdown(f"π **Python Version**: {get_current_python_version()}")
|
945 |
gr.Markdown(f"π **Nuitka Version**: {get_nuitka_version()}")
|
946 |
|
947 |
+
if available_mingw:
|
948 |
+
has_64bit = any("x86_64" in comp for comp, arch in available_mingw)
|
949 |
+
has_32bit = any("i686" in comp for comp, arch in available_mingw)
|
950 |
+
gr.Markdown(f"β
**MinGW-w64**: Available ({'64-bit' if has_64bit else ''}{'/' if has_64bit and has_32bit else ''}{'32-bit' if has_32bit else ''})")
|
951 |
else:
|
952 |
+
gr.Markdown("β οΈ **MinGW-w64**: Not available")
|
953 |
|
954 |
if check_static_libpython():
|
955 |
gr.Markdown("π **Static libpython will be used for Linux targets!**")
|
956 |
else:
|
957 |
gr.Markdown("π§ **Using portable compilation flags**")
|
958 |
|
959 |
+
# Add cross-compilation notice
|
960 |
+
gr.Markdown("ποΈ **Cross-Compilation**: Automatic architecture selection based on available MinGW-w64 compilers")
|
961 |
|
962 |
compile_btn = gr.Button("π Compile with Nuitka", variant="primary")
|
963 |
|
|
|
1045 |
# Progress simulation with log updates
|
1046 |
progress_steps = [
|
1047 |
(0.1, "Checking Nuitka installation..."),
|
1048 |
+
(0.15, "Checking MinGW-w64 cross-compilers..." if extension == ".exe" else "Checking environment..."),
|
1049 |
(0.2, "Setting up environment..."),
|
1050 |
(0.3, "Installing requirements..."),
|
1051 |
(0.4, f"Starting {'Windows cross-' if extension == '.exe' else ''}compilation..."),
|
|
|
1096 |
# Final progress update
|
1097 |
final_status = "β
Compilation successful!" if success else "β Compilation failed"
|
1098 |
if success and extension == ".exe":
|
1099 |
+
# Try to determine architecture from logs
|
1100 |
+
if "x86_64" in current_logs:
|
1101 |
+
final_status += " (Windows 64-bit .exe)"
|
1102 |
+
elif "i686" in current_logs:
|
1103 |
+
final_status += " (Windows 32-bit .exe)"
|
1104 |
+
else:
|
1105 |
+
final_status += " (Windows .exe)"
|
1106 |
|
1107 |
yield (
|
1108 |
gr.update(visible=True), # progress_section
|
|
|
1200 |
|
1201 |
with gr.TabItem("π How to Use"):
|
1202 |
gr.Markdown("""
|
1203 |
+
## π― Enhanced MinGW-w64 Cross-Compilation
|
1204 |
|
1205 |
+
**Proper Windows Executable Generation**
|
1206 |
|
1207 |
+
This app now uses an **enhanced method** for generating Windows .exe files from Linux:
|
1208 |
+
- **Explicit cross-compiler selection** (x86_64-w64-mingw32-gcc for 64-bit)
|
1209 |
+
- **Environment variable setup** to force specific cross-compilers
|
1210 |
+
- **Clang backend** for improved cross-compilation support
|
1211 |
+
- **Architecture verification** in compilation logs and output
|
1212 |
+
- **Automatic detection** of available MinGW-w64 compilers
|
1213 |
|
1214 |
+
**Key Improvements:**
|
1215 |
+
- Automatic 64-bit/32-bit compiler selection based on availability
|
1216 |
+
- Explicit environment variable setup (CC, CXX)
|
1217 |
+
- Real-time architecture verification in logs
|
1218 |
+
- Enhanced error reporting for cross-compilation issues
|
|
|
1219 |
|
1220 |
## π Usage Instructions
|
1221 |
|
|
|
1227 |
### 2. Choose Target Platform
|
1228 |
- **Linux (.bin)**: Native Linux executable (fastest compilation)
|
1229 |
- **Linux (.sh)**: Shell script format
|
1230 |
+
- **Windows (.exe)**: Cross-compiled using specific MinGW-w64 compiler
|
1231 |
|
1232 |
### 3. Compile
|
1233 |
- Click "Compile with Nuitka"
|
1234 |
+
- Watch logs for cross-compiler selection (x86_64-w64-mingw32-gcc or i686-w64-mingw32-gcc)
|
1235 |
+
- Monitor architecture verification in real-time
|
1236 |
+
- Download the resulting binary with verified architecture
|
1237 |
|
1238 |
### 4. Run Your Binary
|
1239 |
|
|
|
1262 |
|
1263 |
## π§ MinGW-w64 Requirements
|
1264 |
|
1265 |
+
**The app automatically detects and uses available MinGW-w64 compilers:**
|
1266 |
```bash
|
1267 |
+
# For 64-bit Windows (preferred):
|
1268 |
+
apt install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64
|
1269 |
|
1270 |
+
# For 32-bit Windows (fallback):
|
1271 |
+
apt install gcc-mingw-w64-i686 g++-mingw-w64-i686
|
1272 |
```
|
1273 |
|
1274 |
+
## β οΈ Cross-Compilation Process
|
1275 |
+
|
1276 |
+
**Enhanced compilation process:**
|
1277 |
+
1. β
Detects available MinGW-w64 compilers
|
1278 |
+
2. β
Sets explicit CC and CXX environment variables
|
1279 |
+
3. β
Uses Clang backend for better cross-compilation
|
1280 |
+
4. β
Verifies target architecture in output
|
1281 |
+
5. β
Reports actual compiler used in logs
|
1282 |
|
1283 |
+
**Architecture Selection:**
|
1284 |
+
- **Priority**: x86_64-w64-mingw32-gcc (64-bit) if available
|
1285 |
+
- **Fallback**: i686-w64-mingw32-gcc (32-bit) if available
|
1286 |
+
- **Last resort**: --mingw64 flag (relies on Nuitka's detection)
|
|
|
|
|
|
|
1287 |
|
1288 |
+
## π Verification Process
|
1289 |
|
1290 |
+
| Step | What's Checked | Result |
|
1291 |
+
|------|-------------|--------|
|
1292 |
+
| 1. Compiler Detection | Available MinGW-w64 compilers | x86_64 or i686 |
|
1293 |
+
| 2. Environment Setup | CC/CXX variables | Explicit cross-compiler |
|
1294 |
+
| 3. Compilation | Cross-compilation process | Target architecture |
|
1295 |
+
| 4. Verification | Output file analysis | 32-bit or 64-bit PE |
|
1296 |
""")
|
1297 |
|
1298 |
with gr.TabItem("βΉοΈ About"):
|
1299 |
gr.Markdown(f"""
|
1300 |
+
## π§ Enhanced Cross-Compilation Technology
|
1301 |
|
1302 |
+
**Technical Implementation:**
|
1303 |
|
1304 |
+
1. **Smart Compiler Detection**: Automatically finds available MinGW-w64 cross-compilers
|
1305 |
+
2. **Explicit Environment Setup**: Sets CC and CXX variables for precise control
|
1306 |
+
3. **Clang Integration**: Uses Clang backend for improved cross-compilation support
|
1307 |
+
4. **Architecture Verification**: Multiple verification steps to ensure correct output
|
1308 |
+
5. **Real-time Monitoring**: Live logs showing cross-compiler usage and architecture
|
|
|
1309 |
|
1310 |
+
## β
Key Features
|
1311 |
|
1312 |
+
**Cross-compilation improvements:**
|
1313 |
|
1314 |
+
- β
**Explicit cross-compiler selection** (no guessing)
|
1315 |
+
- β
**Environment variable control** (CC=x86_64-w64-mingw32-gcc)
|
1316 |
+
- β
**Clang backend support** for better Windows compatibility
|
1317 |
+
- β
**Multi-step architecture verification**
|
1318 |
+
- β
**Real-time cross-compilation status**
|
1319 |
+
- β
**Automatic fallback** to available compilers
|
1320 |
+
- β
**Detailed error reporting** for cross-compilation issues
|
1321 |
|
1322 |
## βοΈ Environment Status
|
1323 |
|
|
|
1326 |
Architecture: {platform.architecture()[0]}
|
1327 |
Python Version: {get_current_python_version()}
|
1328 |
Nuitka Version: {get_nuitka_version()}
|
1329 |
+
|
1330 |
+
MinGW-w64 Status:
|
1331 |
+
{('β
Available compilers: ' + str(len(available_mingw))) if available_mingw else 'β No compilers found'}
|
1332 |
+
{('64-bit: ' + ('β
' if any('x86_64' in comp for comp, arch in available_mingw) else 'β')) if available_mingw else ''}
|
1333 |
+
{('32-bit: ' + ('β
' if any('i686' in comp for comp, arch in available_mingw) else 'β')) if available_mingw else ''}
|
1334 |
+
|
1335 |
Static Libpython: {'β
Available' if check_static_libpython() else 'β Not Available'}
|
1336 |
Environment: Hugging Face Spaces
|
1337 |
+
Cross-Compilation: Enhanced MinGW-w64 support with explicit compiler control
|
|
|
1338 |
```
|
1339 |
|
1340 |
## π Best Practices
|
1341 |
|
1342 |
+
**For successful cross-compilation:**
|
1343 |
|
1344 |
+
1. β
Use "Maximum Compatibility" mode for best results
|
1345 |
+
2. β
Check compiler detection logs before starting
|
1346 |
+
3. β
Verify architecture in compilation logs
|
1347 |
+
4. β
Test with wine if available on Linux
|
1348 |
+
5. β
**Confirm binary architecture** in output summary
|
1349 |
+
6. β
Use environment variable logs to debug issues
|
1350 |
|
1351 |
+
**Cross-compilation process:**
|
1352 |
|
1353 |
+
```
|
1354 |
+
1. Detect: x86_64-w64-mingw32-gcc (preferred)
|
1355 |
+
2. Setup: CC=x86_64-w64-mingw32-gcc
|
1356 |
+
3. Setup: CXX=x86_64-w64-mingw32-g++
|
1357 |
+
4. Compile: nuitka --clang ... (using Clang backend)
|
1358 |
+
5. Verify: file output.exe (check PE32/PE32+)
|
1359 |
+
6. Report: Windows 64-bit executable confirmed
|
1360 |
+
```
|
1361 |
|
1362 |
## π§ Troubleshooting
|
1363 |
|
1364 |
+
**Common issues and solutions:**
|
1365 |
|
1366 |
+
- **"Wrong architecture" error**:
|
1367 |
+
- Check compiler detection logs
|
1368 |
+
- Verify CC/CXX environment variables
|
1369 |
+
- Ensure correct MinGW-w64 compiler is used
|
|
|
1370 |
|
1371 |
+
- **Cross-compilation fails**:
|
1372 |
+
- Check available MinGW-w64 compilers in environment
|
1373 |
+
- Verify package compatibility with cross-compilation
|
1374 |
+
- Try different compilation modes
|
1375 |
|
1376 |
+
- **Binary runs but crashes**:
|
1377 |
+
- Some Python packages don't support cross-compilation
|
1378 |
+
- Windows-specific APIs may need special handling
|
1379 |
+
- Test with simpler code first
|
1380 |
|
1381 |
+
## π Technical Details
|
|
|
|
|
|
|
|
|
|
|
1382 |
|
1383 |
+
**Cross-compilation command structure:**
|
1384 |
```bash
|
1385 |
+
# Environment setup
|
1386 |
+
export CC=x86_64-w64-mingw32-gcc
|
1387 |
+
export CXX=x86_64-w64-mingw32-g++
|
1388 |
+
|
1389 |
+
# Nuitka command
|
1390 |
python -m nuitka \\
|
1391 |
+
--clang \\
|
1392 |
+
--standalone \\
|
1393 |
--onefile \\
|
1394 |
--windows-disable-console \\
|
1395 |
--show-progress \\
|
1396 |
your_script.py
|
1397 |
```
|
1398 |
|
1399 |
+
**Verification steps:**
|
1400 |
+
1. Binary created as PE32+ (64-bit) or PE32 (32-bit)
|
1401 |
+
2. file command shows correct architecture
|
1402 |
+
3. Compilation logs confirm cross-compiler used
|
1403 |
+
4. Summary reports verified architecture
|
1404 |
|
1405 |
+
This ensures **guaranteed correct Windows architecture** compilation.
|
1406 |
""")
|
1407 |
|
1408 |
gr.Markdown("---")
|
1409 |
+
gr.Markdown("π€ Created by Claude 3.7 Sonnet | π Powered by Nuitka + Enhanced MinGW-w64 | βοΈ Smart cross-compilation with architecture verification")
|
1410 |
|
1411 |
if __name__ == "__main__":
|
1412 |
# Create necessary directories on startup
|
|
|
1418 |
print("WARNING: Nuitka is not installed. Please add 'nuitka' to your requirements.txt file.")
|
1419 |
|
1420 |
# Check MinGW-w64 status
|
1421 |
+
missing_mingw, available_mingw = check_mingw_installation()
|
1422 |
+
if available_mingw:
|
1423 |
+
print(f"INFO: Found {len(available_mingw)} MinGW-w64 compilers:")
|
1424 |
+
for compiler, arch in available_mingw:
|
1425 |
+
print(f" - {compiler} ({arch})")
|
1426 |
+
if missing_mingw:
|
1427 |
+
print(f"WARNING: Missing {len(missing_mingw)} MinGW-w64 compilers:")
|
1428 |
+
for compiler, arch in missing_mingw:
|
1429 |
+
print(f" - {compiler} ({arch})")
|
1430 |
|
1431 |
app.launch()
|