Faits : A. Par jugement du 25 mai 2018, le Tribunal criminel de l'arrondissement de Lausanne a libéré X._ du chef d'accusation de contrainte sexuelle; il l'a en revanche reconnu coupable de vol, de dommages à la propriété, de viol, de tentative de viol et d'infraction à la LEtr (RS 142.20) et l'a condamné à 8 ans de peine privative de liberté. Il a par ailleurs ordonné la mise en oeuvre d'une mesure d'internement, au sens de l'art. 64 CP, ainsi que l'expulsion du condamné du territoire suisse pour une durée de 15 ans. B. Par jugement du 22 novembre 2018, la Cour d'appel pénale du Tribunal cantonal vaudois a rejeté l'appel formé par X._ contre le jugement du tribunal criminel, qu'il a confirmé. C. Par l'intermédiaire de son avocat, X._ forme un recours en matière pénale au Tribunal fédéral contre le jugement de la Cour d'appel pénale, qu'il ne conteste que dans la mesure où il ordonne la mise en oeuvre d'une mesure d'internement au sens de l'art. 64 CP. Il conclut, avec suite de frais et dépens, principalement à ce qu'il soit renoncé à ordonner une telle mesure. A titre subsidiaire, il conclut à l'annulation du jugement attaqué et au renvoi de la cause à la cour cantonale pour nouvelle décision. Il sollicite par ailleurs le bénéfice de l'assistance judiciaire. En outre, X._ a adressé personnellement au Tribunal fédéral une lettre datée du 6 janvier 2019 mais reçue le 12 février 2019.