Merge pull request #1 from gamestabled/setup_fixes

fix a few pain points in setup
This commit is contained in:
gamestabled
2024-09-27 18:37:29 -04:00
committed by GitHub
4 changed files with 26 additions and 50 deletions
+12 -6
View File
@@ -6,12 +6,18 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(NOT DEFINED ENV{ARMCC_PATH})
message(FATAL_ERROR "please set ARMCC_PATH")
endif()
if(NOT DEFINED ENV{RVCT40INC})
message(FATAL_ERROR "please set RVCT40INC. Probably to ARMCC_PATH/include/windows")
endif()
if(NOT DEFINED ENV{RVCT40LIB})
message(FATAL_ERROR "please set RVCT40LIB. Probably to ARMCC_PATH/include/lib")
endif()
find_program(ARM_ASM NAMES armasm.exe PATHS $ENV{ARMCC_PATH}/bin REQUIRED NO_DEFAULT_PATH)
find_program(ARM_AR NAMES armar.exe PATHS $ENV{ARMCC_PATH}/bin REQUIRED NO_DEFAULT_PATH)
find_program(ARM_CC NAMES armcc.exe PATHS $ENV{ARMCC_PATH}/bin REQUIRED NO_DEFAULT_PATH)
find_program(ARM_LINK NAMES armlink.exe PATHS $ENV{ARMCC_PATH}/bin REQUIRED NO_DEFAULT_PATH)
find_program(ARM_FROMELF NAMES fromelf.exe PATHS $ENV{ARMCC_PATH}/bin REQUIRED NO_DEFAULT_PATH)
find_program(ARM_ASM NAMES armasm.exe PATHS "$ENV{ARMCC_PATH}/win_32-pentium" REQUIRED NO_DEFAULT_PATH)
find_program(ARM_AR NAMES armar.exe PATHS "$ENV{ARMCC_PATH}/win_32-pentium" REQUIRED NO_DEFAULT_PATH)
find_program(ARM_CC NAMES armcc.exe PATHS "$ENV{ARMCC_PATH}/win_32-pentium" REQUIRED NO_DEFAULT_PATH)
find_program(ARM_LINK NAMES armlink.exe PATHS "$ENV{ARMCC_PATH}/win_32-pentium" REQUIRED NO_DEFAULT_PATH)
find_program(ARM_FROMELF NAMES fromelf.exe PATHS "$ENV{ARMCC_PATH}/win_32-pentium" REQUIRED NO_DEFAULT_PATH)
macro (set_compilers)
set(CMAKE_CXX_COMPILER_ID ARMCC)
@@ -93,7 +99,7 @@ foreach(CPP_FILE ${cxxsourcefiles})
get_filename_component(FILE_NAME ${CPP_FILE} NAME_WE)
add_custom_command(
OUTPUT ${NON_MATCH_ASM_FILES}/${FILE_NAME}.s
COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/tools/preproc.py ${CPP_FILE} ${NON_MATCH_ASM_FILES}/${FILE_NAME}.s "${DISASSEMBLY_DIR}/"
COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/tools/preproc.py ${CPP_FILE} ${NON_MATCH_ASM_FILES}/${FILE_NAME}.s "${DISASSEMBLY_DIR}/"
DEPENDS ${CPP_FILE}
)
set_source_files_properties(${NON_MATCH_ASM_FILES}/${FILE_NAME}.s PROPERTIES COMPILE_FLAGS "--cpu=MPCore")
+5 -5
View File
@@ -35,7 +35,7 @@ add_custom_target(
add_custom_command(
DEPENDS extract_baserom
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && py ${TOOLS_DIR}/exefs2elf.py
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && python ${TOOLS_DIR}/exefs2elf.py
OUTPUT ${BASEROM_DIR}/baserom.elf
COMMENT "Creating baserom.elf..."
)
@@ -59,7 +59,7 @@ add_custom_target(
add_custom_command(
DEPENDS n3dsdisasm ${BASEROM_DIR}/baserom_before_fixes.s
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && py ./tools/baserom_fixes.py ${BASEROM_DIR}/baserom_before_fixes.s ${BASEROM_DIR}/baserom.s
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && python ./tools/baserom_fixes.py ${BASEROM_DIR}/baserom_before_fixes.s ${BASEROM_DIR}/baserom.s
OUTPUT ${BASEROM_DIR}/baserom.s
COMMENT "Applying specific fixes to baserom_before_fixes.s to create baserom.s..."
)
@@ -70,9 +70,9 @@ add_custom_target(
)
add_custom_command(
DEPENDS n3dsdisasm_post_fixes create_elf
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && py ./tools/gcc_to_arm_asm.py ${BASEROM_DIR}/baserom.s asm
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && py ./tools/split_arm_data_chunks.py
DEPENDS n3dsdisasm_post_fixes
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && python ./tools/gcc_to_arm_asm.py ${BASEROM_DIR}/baserom.s asm
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && python ./tools/split_arm_data_chunks.py
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && touch split_asm.txt
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/split_asm.txt
COMMENT "Splitting baserom.s and data chunks..."
Binary file not shown.
+9 -39
View File
@@ -1,56 +1,28 @@
# convert exefs to elf
import os
import sys
from subprocess import run
# Ugliness in order to keep the script self-contained
try:
import tqdm
except ImportError:
print("Installing tqdm...")
def command():
return run([sys.executable, '-m', 'pip', 'install', 'tqdm'])
# Sigh
if (command().returncode != 0):
# Package managers are cool, I say, as I close my eyes and
# ram through software with reckless abandon.
if (run([sys.executable, '-m', 'ensurepip']).returncode == 0):
# Alright pip is set up, lets give it another shot. If it
# doesn't work, then it's left up to the user.
command().check_returncode()
finally:
import tqdm
BASEROMDIR = 'baserom/'
WORKDIR = BASEROMDIR + 'workdir/'
CODE_BIN = 'baserom/exefs/code.bin'
DATADIR = 'data/'
DATA_CHUNK_FILE = 'data_chunks.txt'
RODATA_CHUNK_FILE = 'rodata_chunks.txt'
SHT__INIT_ARRAY_FILE = 'SHT__INIT_ARRAY.txt'
def prepare_dirs():
os.makedirs(DATADIR, exist_ok=True)
def writefile(path, s) -> None:
with open(path, "wb") as f:
f.write(s)
def total_file_sizes() -> int:
return os.path.getsize(DATA_CHUNK_FILE) + \
os.path.getsize(RODATA_CHUNK_FILE) + \
os.path.getsize(SHT__INIT_ARRAY_FILE)
def split_data_chunks_to_asm(progress: tqdm.tqdm) -> None:
for (bin_file, chunks_file, offset) in [('rw.bin', DATA_CHUNK_FILE, 0x4F9000), ('ro.bin', RODATA_CHUNK_FILE, 0x4CA000), ('text.bin', SHT__INIT_ARRAY_FILE, 0x100000)]:
with open(WORKDIR + bin_file, 'rb') as b:
def split_data_chunks_to_asm() -> None:
with open(CODE_BIN, 'rb') as b:
for chunks_file in [DATA_CHUNK_FILE, RODATA_CHUNK_FILE, SHT__INIT_ARRAY_FILE]:
with open(chunks_file) as data:
for line in data:
splitLine = line.split(',')
chunkName = splitLine[0]
chunkStart = int(splitLine[1].strip(), 16) - offset
chunkEnd = int(splitLine[2].strip(), 16) - offset
chunkStart = int(splitLine[1].strip(), 16) - 0x100000
chunkEnd = int(splitLine[2].strip(), 16) - 0x100000
chunkSize = chunkEnd - chunkStart
b.seek(chunkStart)
chunkBin = b.read(chunkSize)
@@ -64,8 +36,6 @@ def split_data_chunks_to_asm(progress: tqdm.tqdm) -> None:
chunkARM.write(f"\tDCD 0x{dataWordString}\n")
chunkARM.write("\tEND\n")
progress.update(len(line))
with tqdm.tqdm(total=total_file_sizes()) as progress:
prepare_dirs()
split_data_chunks_to_asm(progress)
prepare_dirs()
split_data_chunks_to_asm()