Das Präteritum ("machte") ist ein synthetisch gebildetes Tempus, das Perfekt ("gemacht habe") ein analytisch gebildetes. Synthetische Tempora (und Modi) haben eigene Verbformen, analytische verwenden Hilfsverben wie "sein", "haben" und "werden". Manche Denkschulen sind der Ansicht, dass analytische Tempora (und Modi) keine "echten" Tempora (und Modi) seien. 🤓
Aber Nerdgeschwafel beiseite:
Von der Bedeutung her gibt es keinen Unterschied: Die Handlung liegt in der Vergangenheit und ist (höchstwahrscheinlich) abgeschlossen.
Im Deutschen sind das Präteritum (1. Vgh.) und das Perfekt (2. Vgh.) von der Bedeutung her absolut gleichwertig. Deshalb(?) wird die 1. Vgh. auch nicht mehr Imperfekt (= nicht abgeschlossen[e Vergangenheitsform]) genannt. (Es fällt schwer, sich das abzugewöhnen ... 😟)
Der bzw. ein Grund für die Gleichwertigkeit der beiden Vergangenheitstempora könnte sein, dass das Präteritum (1. Vgh.) in den oberdeutschen (= süddeutschen) und vielen mitteldeutschen Mundarten längst ausgestorben* ist. Auf diesen Mundarten basiert aber die Standard-(Schrift-)Sprache. Menschen aus Süddeutschland, Österreich, Südtirol und der Schweiz verzichten oft 'instinktiv' auf das Präteritum (1. Vgh.), weil es in ihrer Alltagssprache schlicht nicht vorkommt.
Allerdings basieren die Benennungen der Tempora (hauptsächlich) auf der lateinischen Grammatik und trafen noch nie 100-prozentig auf unsere germanischen Sprachen und Dialekte zu.
___
*) Im geschlossenen oberdeutschen Sprachgebiet kennen als allerletzten Rest die Verben "sei" ('sein') und "woin" ('wollen') im Bairischen Präteritumsformen. Im Schwäbisch-Alemannischen ist das Präteritum komplett ausgestorben. Allerdings bahnt sich das standarddeutsche "war" seit einiger Zeit den Weg zurück ins Schwäbische.