import glob import sys import os import re if len(sys.argv) > 1: build_folder = sys.argv[1] install_folder = sys.argv[2] # print(f"In relative_paths.py [1]: build folder: {build_folder}") # print(f"In relative_paths.py [2]: install folder: {install_folder}") else: print( f"Args not provided. Please provide arg1-build folder-catch_tests, arg2-install folder" ) exit(1) install_folder = os.path.abspath(install_folder) install_catch_tests = os.path.join(install_folder, "catch_tests") install_script = os.path.join(install_catch_tests, "script") modified_msg = """ # File has been updated by hip-tests/catch folder for portability """ ctest_current_str = """ file(REAL_PATH ${CMAKE_CURRENT_LIST_FILE} FULL_FILE_PATH) get_filename_component(CTEST_CURRENT_DIR ${FULL_FILE_PATH} DIRECTORY) file(REAL_PATH ${CTEST_CURRENT_DIR}/.. EXE_PATH) """ if os.name == "posix": library_path_str = """ set(LIB_PATH ${EXE_PATH}/../../../lib) file(GLOB HIP_LIBS "${LIB_PATH}/libamdhip64*") if(HIP_LIBS) set(LIB_PATH ${LIB_PATH} ${LIB_PATH}/rocm_sysdeps/lib) else() set(LIB_PATH "/opt/rocm/lib") endif() """ ctest_current_str += library_path_str inc_cmake_pattern = "_include.cmake" ctesttest_pattern = "CTestTestfile.cmake" def make_test_files_portable(filenames): """ changes the absolute paths with relative paths filenames - list of files to perform the workaround """ for filename in filenames: try: filename = os.path.abspath(filename) # Read the entire content of the file with open(filename, "r", encoding="utf-8") as file: file_content = file.read() # print(f"**Done reading now parsing", filename) # 1 replace abs path with filename. Make relative old_text = os.path.dirname(os.path.abspath(filename)) abs_dir_path = os.path.join(old_text, "") old_text = abs_dir_path.replace("\\", "/") if modified_msg not in file_content: file_content = modified_msg + file_content # Perform the replacement modified_content = file_content.replace(old_text, "") if inc_cmake_pattern in filename: # 2 get folder path relative to the current *_include.cmake if r"file(REAL_PATH" not in modified_content: modified_content = ctest_current_str + modified_content # 3 CTEST_FILE to have parameterized relative file test_cmake_pattern = r"\[==\[(\w+-[a-f0-9]+_tests.cmake)\]==\]" replace_test_pattern = r"${CTEST_CURRENT_DIR}/\1" modified_content = re.sub( test_cmake_pattern, replace_test_pattern, modified_content ) # 4 script to use CatchAddTests.cmake from build rather than src add_test_pattern = r'include\(".*CatchAddTests\.cmake"\)' replace_add_test_pattern = ( 'include("${CTEST_CURRENT_DIR}/CatchAddTests.cmake")' ) modified_content = re.sub( add_test_pattern, replace_add_test_pattern, modified_content ) # 5 use exe from previous folder exe_pattern = r"TEST_EXECUTABLE\s+\[==\[(.*?)\]==\]" replace_exe_pattern = r"TEST_EXECUTABLE ${EXE_PATH}/\1" modified_content = re.sub( exe_pattern, replace_exe_pattern, modified_content ) # 6 include _ctest.cmake file with path ctest_test_pattern = r'include\("(.*?_tests\.cmake)"\)' replace_ctest_pattern = r'include("${CTEST_CURRENT_DIR}/\1")' modified_content = re.sub( ctest_test_pattern, replace_ctest_pattern, modified_content ) # 7 use script folder as cwd cwd_pattern = r"TEST_WORKING_DIR\s+\[==\[(.*?)\]==\]" replace_cwd_pattern = r"TEST_WORKING_DIR ${EXE_PATH}" modified_content = re.sub( cwd_pattern, replace_cwd_pattern, modified_content ) # 8 modify ld_library_path if os.name == "posix": lib_path_pattern = r"TEST_DL_PATHS\s+\[==\[(.*?)\]==\]" replace_lib_path_pattern = r"TEST_DL_PATHS ${LIB_PATH}" modified_content = re.sub( lib_path_pattern, replace_lib_path_pattern, modified_content ) filename = os.path.basename(filename) install_path = os.path.join(install_script, filename) # Write the modified content back to the file with open(install_path, "w", encoding="utf-8") as file: file.write(modified_content) # print(f"**Done parsing now writing into", install_path) except IOError as e: print(f"Error: '{e}'") sys.exit({e}) except Exception as e: print(f"An error occurred: {e}") sys.exit({e}) inccmake_files = glob.glob(build_folder + "/**/*" + inc_cmake_pattern, recursive=True) make_test_files_portable(inccmake_files)