Here is one way of expressing it. The only relevant global constraint that comes to mind is maximum/2.
| ?- makespans([1,2,3,3,1,2,3], [7,7,4,11,12,15,15], [M1,M2,M3]).
M1 = 12,
M2 = 15,
M3 = 15 ?
% makespans(+Machines, +EndTimes, +MakeSpans) :-
% given N tasks assigned to Machines and finishing at EndTimes,
% the ith element of MakeSpans is unified with the max finish time for task i
% MakeSpans should be a list of the right length
makespans(Machines, EndTimes, MakeSpans) :-
( foreach(Make,MakeSpans),
count(I,1,_),
param(Machines,EndTimes)
do ( foreach(E,EndTimes),
foreach(M,Machines),
foreach(T,Terms),
param(I)
do T #= (M#=I)*E
),
maximum(Make, Terms)
).